Пример #1
0
        private static string FixupPRReference(RepositoryInfo sourceRepository, string line)
        {
            var match = Regex.Match(line, @"Subject: \[PATCH\].*\(#[0-9]+\)$");

            if (match.Success)
            {
                return(Regex.Replace(line, @"\(#([0-9]+)\)$", $"({sourceRepository.Configuration.UpstreamOwner}/{sourceRepository.Name}#$1)"));
            }
            match = Regex.Match(line, @"Subject: \[PATCH\] Merge pull request #[0-9]+ from");
            if (match.Success)
            {
                return(Regex.Replace(line, "#([0-9]+)", $"{sourceRepository.Configuration.UpstreamOwner}/{sourceRepository.Name}#$1"));
            }
            return(line);
        }
Пример #2
0
        private static void ApplyPatch(RepositoryInfo sourceRepository, RepositoryInfo targetRepository, string patch, Commit commit)
        {
            var sourceSlashIgnore = 1 + sourceRepository.SharedPath.Count(c => c == '\\') + 1;
            var result            = Runner.RunCommand("git",
                                                      $"-c \"user.name={s_mirrorSignatureUserName}\" -C \"{targetRepository.Path}\" am --signoff --reject --3way -p{sourceSlashIgnore} --directory=\"{targetRepository.SharedPath.Replace('\\', '/')}\"",
                                                      s_logger, patch);

            s_logger.Debug(result.Output);
            if (result.ExitCode != 0)
            {
                s_logger.Error($"The commit being applied is ${commit.Sha} ${commit.MessageShort} {commit.Author}");
                s_logger.Error(
                    $"patching failed, please open '{targetRepository.Path}' and resolve the conflicts then press any key");
                s_emailManager.Email("Merge Conflicts", $"Merge Conflicts in {targetRepository.Name} while applying commit {commit} from repo {sourceRepository.Name}");
                Console.ReadKey();
            }
        }
Пример #3
0
        private void SanityCheck(RepositoryInfo repository, string branch)
        {
            using (var repo = new Repository(repository.Path))
            {
                s_logger.Info($"Running sanity check for {repository.Name}/{branch}");
                var lastLookedAtCommit = repo.Lookup <Commit>(repository.LastSynchronizedCommits[branch]);
                var remoteBranch       = repo.Refs[$"refs/heads/{branch}"];

                var commitFilter = new CommitFilter
                {
                    IncludeReachableFrom = remoteBranch,
                    ExcludeReachableFrom = lastLookedAtCommit,
                    SortBy = CommitSortStrategies.Topological | CommitSortStrategies.Time | CommitSortStrategies.Reverse,
                };
                var commitList = repo.Commits.QueryBy(commitFilter).ToList();

                if (commitList.Count == 0)
                {
                    return;
                }
                foreach (var commit in commitList)
                {
                    if (IsMirrorCommit(commit.Message, repository.Configuration.MirrorSignatureUser))
                    {
                        continue;
                    }

                    var changedFiles    = GetChangedFiles(repo, commit);
                    var sharedDirectory = repository.SharedPath;
                    foreach (var changedFile in changedFiles)
                    {
                        if (changedFile.Contains(sharedDirectory))
                        {
                            foreach (string targetRepo in s_repos[repository.Name])
                            {
                                RetrieveOrInsert(repository.Name, branch, commit.Sha, targetRepo);
                            }
                            break;
                        }
                    }
                }
                UpdateLastSynchronizedCommit(repository, commitList.Last().Sha, branch);
                s_logger.Info($"sanity check Completed for {repository.Name}/{branch}");
            }
        }
Пример #4
0
        private static async Task <string> GetAuthorAsync(RepositoryInfo repoInfo, string commitSha)
        {
            var commit = await Client.Repository.Commit.Get(repoInfo.Owner, repoInfo.Name, commitSha);

            if (commit.Author != null)
            {
                return(commit.Author.Login);
            }

            var userSearchRequest = new SearchUsersRequest(commit.Commit.Author.Email)
            {
                In = new[] { UserInQualifier.Email }
            };

            var result = await Client.Search.SearchUsers(userSearchRequest);

            return(result.Items.Count != 0 ? result.Items[0].Login : null);
        }
Пример #5
0
 public NewChanges(RepositoryInfo targetRepository)
 {
     TargetRepository = targetRepository;
 }