AddRemoteUseCase.cs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536
  1. namespace RackPeek.Domain.Git.UseCases;
  2. public class AddRemoteUseCase(IGitRepository repo) : IUseCase {
  3. public Task<string?> ExecuteAsync(string url) {
  4. if (!repo.IsAvailable)
  5. return Task.FromResult<string?>("Git is not available.");
  6. if (string.IsNullOrWhiteSpace(url))
  7. return Task.FromResult<string?>("URL is required.");
  8. url = url.Trim();
  9. if (!url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
  10. return Task.FromResult<string?>("Only HTTPS URLs are supported.");
  11. if (repo.HasRemote())
  12. return Task.FromResult<string?>("Remote already configured.");
  13. try {
  14. repo.AddRemote("origin", url);
  15. // fetch remote state
  16. GitSyncStatus sync = repo.FetchAndGetSyncStatus();
  17. // if remote already has commits, bring them locally
  18. if (sync.Behind > 0) {
  19. repo.Pull();
  20. }
  21. return Task.FromResult<string?>(null);
  22. }
  23. catch (Exception ex) {
  24. return Task.FromResult<string?>($"Add remote failed: {ex.Message}");
  25. }
  26. }
  27. }