Пример #1
0
        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);
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        private Uri CreateCredentialsUri(Uri pullEndpoint, GitUsernamePasswordCredentials gitCredentials)
        {
            if (_gitCredentials == null)
            {
                return(pullEndpoint);
            }

            return(new UriBuilder(pullEndpoint)
            {
                UserName = gitCredentials.Username, Password = gitCredentials.Password
            }.Uri);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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));
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }
Пример #8
0
        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);
            }
        }
Пример #9
0
        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();
                }
            }
        }