public async Task <int> Run(RepositorySettings repository, GitUsernamePasswordCredentials credentials, SettingsContainer settings, User user) { try { var repo = await BuildGitRepositorySpec(repository, credentials.Username); if (repo == null) { return(0); } // should perform the remote check for "is this a .NET repo" // (and also not a github fork) // only when we have multiple remote repos // otherwise it's ok to work locally, and check there if (!(settings.SourceControlServerSettings.Scope == ServerScope.Repository || repository.IsLocalRepo)) { var remoteRepoContainsDotNet = await _repositoryFilter.ContainsDotNetProjects(repository); if (!remoteRepoContainsDotNet) { return(0); } } IFolder folder; if (repository.IsLocalRepo) { folder = new Folder(_logger, new DirectoryInfo(repository.RemoteInfo.LocalRepositoryUri.AbsolutePath)); settings.WorkingFolder = new Folder(_logger, new DirectoryInfo(repository.RemoteInfo.WorkingFolder.AbsolutePath)); repo.DefaultBranch = repository.RemoteInfo.BranchName; repo.Remote = repository.RemoteInfo.RemoteName; } else { folder = _folderFactory.UniqueTemporaryFolder(); settings.WorkingFolder = folder; } var git = new LibGit2SharpDriver(_logger, folder, credentials, user); var updatesDone = await _repositoryUpdater.Run(git, repo, settings); if (!repository.IsLocalRepo) { folder.TryDelete(); } return(updatesDone); } catch (Exception ex) { _logger.Error($"Failed on repo {repository.RepositoryName}", ex); return(1); } }
private Uri CreateCredentialsUri(Uri pullEndpoint, GitUsernamePasswordCredentials gitCredentials) { if (_gitCredentials?.Username == null) { return(pullEndpoint); } return(new UriBuilder(pullEndpoint) { UserName = Uri.EscapeDataString(gitCredentials.Username), Password = gitCredentials.Password }.Uri); }
private Uri CreateCredentialsUri(Uri pullEndpoint, GitUsernamePasswordCredentials gitCredentials) { if (_gitCredentials == null) { return(pullEndpoint); } return(new UriBuilder(pullEndpoint) { UserName = gitCredentials.Username, Password = gitCredentials.Password }.Uri); }
public async Task <int> Run(SettingsContainer settings) { if (settings == null) { throw new ArgumentNullException(nameof(settings)); } _logger.Detailed($"{Now()}: Started"); _folderFactory.DeleteExistingTempDirs(); var user = await _collaborationFactory.CollaborationPlatform.GetCurrentUser(); var credentials = new GitUsernamePasswordCredentials { Username = user.Login, Password = _collaborationFactory.Settings.Token }; var repositories = await _collaborationFactory.RepositoryDiscovery.GetRepositories(settings.SourceControlServerSettings); var reposUpdated = 0; foreach (var repository in repositories) { if (reposUpdated >= settings.UserSettings.MaxRepositoriesChanged) { _logger.Detailed($"Reached max of {reposUpdated} repositories changed"); break; } var updatesInThisRepo = await _repositoryEngine.Run(repository, credentials, settings, user); if (updatesInThisRepo > 0) { reposUpdated++; } } if (reposUpdated > 1) { _logger.Detailed($"{reposUpdated} repositories were updated"); } _logger.Detailed($"Done at {Now()}"); return(reposUpdated); }
public GitCmdDriver(string pathToGit, INuKeeperLogger logger, IFolder workingFolder, GitUsernamePasswordCredentials credentials) { if (string.IsNullOrWhiteSpace(pathToGit)) { throw new ArgumentNullException(nameof(pathToGit)); } if (Path.GetFileNameWithoutExtension(pathToGit) != "git") { throw new InvalidOperationException($"Invalid path '{pathToGit}'. Path must point to 'git' cmd"); } _pathGit = pathToGit; _logger = logger; WorkingFolder = workingFolder ?? throw new ArgumentNullException(nameof(workingFolder)); _gitCredentials = credentials ?? throw new ArgumentNullException(nameof(credentials)); }
public LibGit2SharpDriver(INuKeeperLogger logger, IFolder workingFolder, GitUsernamePasswordCredentials credentials, User user) { if (workingFolder == null) { throw new ArgumentNullException(nameof(workingFolder)); } if (credentials == null) { throw new ArgumentNullException(nameof(credentials)); } _logger = logger; WorkingFolder = workingFolder; _gitCredentials = new UsernamePasswordCredentials { Password = credentials.Password, Username = credentials.Username }; _identity = GetUserIdentity(user); }
public async Task <int> Run(SettingsContainer settings) { if (settings == null) { throw new ArgumentNullException(nameof(settings)); } _logger.Detailed($"{Now()}: Started"); _folderFactory.DeleteExistingTempDirs(); var user = await _collaborationFactory.CollaborationPlatform.GetCurrentUser(); var credentials = new GitUsernamePasswordCredentials { Username = user.Login, Password = _collaborationFactory.Settings.Token }; var repositories = await _collaborationFactory.RepositoryDiscovery.GetRepositories(settings.SourceControlServerSettings); var reposUpdated = 0; (bool Happened, Exception Value)unhandledEx = (false, null); foreach (var repository in repositories) { if (reposUpdated >= settings.UserSettings.MaxRepositoriesChanged) { _logger.Detailed($"Reached max of {reposUpdated} repositories changed"); break; } try { var updatesInThisRepo = await _repositoryEngine.Run(repository, credentials, settings, user); if (updatesInThisRepo > 0) { reposUpdated++; } } #pragma warning disable CA1031 catch (Exception ex) #pragma warning restore CA1031 { _logger.Error($"Failed on repo {repository.RepositoryName}", ex); SetOrUpdateUnhandledException(ref unhandledEx, ex); } } if (reposUpdated > 1) { _logger.Detailed($"{reposUpdated} repositories were updated"); } _logger.Detailed($"Done at {Now()}"); ThrowIfUnhandledException(unhandledEx); return(reposUpdated); }
public async Task <int> Run(RepositorySettings repository, GitUsernamePasswordCredentials credentials, SettingsContainer settings, User user) { try { var repositoryData = await BuildGitRepositorySpec(repository, credentials.Username); if (repositoryData == null) { return(0); } // should perform the remote check for "is this a .NET repo" // (and also not a github fork) // only when we have multiple remote repos // otherwise it's ok to work locally, and check there if (!(settings.SourceControlServerSettings.Scope == ServerScope.Repository || repository.IsLocalRepo)) { var remoteRepoContainsDotNet = await _repositoryFilter.ContainsDotNetProjects(repository); if (!remoteRepoContainsDotNet) { return(0); } } IFolder folder; if (repository.IsLocalRepo) { folder = new Folder(_logger, new DirectoryInfo(repository.RemoteInfo.LocalRepositoryUri.AbsolutePath)); settings.WorkingFolder = new Folder(_logger, new DirectoryInfo(repository.RemoteInfo.WorkingFolder.AbsolutePath)); repositoryData.IsLocalRepo = repository.IsLocalRepo; if (!repositoryData.IsFork) //check if we are on a fork. If not on a fork we set the remote to the locally found remote { repositoryData.Remote = repository.RemoteInfo.RemoteName; } } else { folder = _folderFactory.UniqueTemporaryFolder(); settings.WorkingFolder = folder; } if (!string.IsNullOrEmpty(repository.RemoteInfo?.BranchName)) { repositoryData.DefaultBranch = repository.RemoteInfo.BranchName; } repositoryData.IsLocalRepo = repository.IsLocalRepo; IGitDriver git = string.IsNullOrWhiteSpace(settings?.UserSettings?.GitPath) ? new LibGit2SharpDriver(_logger, folder, credentials, user) as IGitDriver : new GitCmdDriver(settings.UserSettings.GitPath, _logger, folder, credentials) as IGitDriver; var updatesDone = await _repositoryUpdater.Run(git, repositoryData, settings); if (!repository.IsLocalRepo) { folder.TryDelete(); } return(updatesDone); } #pragma warning disable CA1031 catch (Exception ex) #pragma warning restore CA1031 { _logger.Error($"Failed on repo {repository.RepositoryName}", ex); return(1); } }
public async Task <int> Run(RepositorySettings repository, GitUsernamePasswordCredentials credentials, SettingsContainer settings, User user) { if (repository == null) { throw new ArgumentNullException(nameof(repository)); } if (credentials == null) { throw new ArgumentNullException(nameof(credentials)); } if (settings == null) { throw new ArgumentNullException(nameof(settings)); } DefaultCredentialServiceUtility.SetupDefaultCredentialService(_nugetLogger, true); var repositoryData = await BuildGitRepositorySpec(repository, credentials.Username); if (repositoryData == null) { return(0); } // should perform the remote check for "is this a .NET repo" // (and also not a github fork) // only when we have multiple remote repos // otherwise it's ok to work locally, and check there if (!(settings.SourceControlServerSettings.Scope == ServerScope.Repository || repository.IsLocalRepo)) { var remoteRepoContainsDotNet = await _repositoryFilter.ContainsDotNetProjects(repository); if (!remoteRepoContainsDotNet) { return(0); } } IFolder folder; if (repository.IsLocalRepo) { folder = new Folder(_logger, new DirectoryInfo(Uri.UnescapeDataString(repository.RemoteInfo.LocalRepositoryUri.AbsolutePath))); settings.WorkingFolder = new Folder(_logger, new DirectoryInfo(Uri.UnescapeDataString(repository.RemoteInfo.WorkingFolder.AbsolutePath))); repositoryData.IsLocalRepo = repository.IsLocalRepo; if (!repositoryData.IsFork) //check if we are on a fork. If not on a fork we set the remote to the locally found remote { repositoryData.Remote = repository.RemoteInfo.RemoteName; } } else { folder = !string.IsNullOrWhiteSpace(settings?.UserSettings?.Directory) ? _folderFactory.FolderFromPath(settings.UserSettings.Directory) : _folderFactory.UniqueTemporaryFolder(); settings.WorkingFolder = folder; } if (!string.IsNullOrEmpty(repository.RemoteInfo?.BranchName)) { repositoryData.DefaultBranch = repository.RemoteInfo.BranchName; } repositoryData.IsLocalRepo = repository.IsLocalRepo; IGitDriver git = string.IsNullOrWhiteSpace(settings?.UserSettings?.GitPath) ? new LibGit2SharpDriver(_logger, folder, credentials, user) as IGitDriver : new GitCmdDriver(settings.UserSettings.GitPath, _logger, folder, credentials) as IGitDriver; try { return(await _repositoryUpdater.Run(git, repositoryData, settings)); } finally { if (!repository.IsLocalRepo) { folder.TryDelete(); } } }