Example #1
0
        /// <summary>
        /// Конструктор по умолчанию
        /// </summary>
        /// <param name="gitlabProject">Проект в GitLab</param>
        /// <param name="remoteBranchProvider">Провайдер удаленных ветвей</param>
        /// <param name="branchInfoProvider">Провайдер информации о ветвях</param>
        public GitlabDefaultBranchProvider(
            Holder <Project> gitlabProject,
            IRemoteBranchProvider remoteBranchProvider,
            IBranchInfoProvider branchInfoProvider)
        {
            ValueGetter = () =>
            {
                var project = gitlabProject.Value;

                var defaultBranchInfo = project == null
                    ? BranchInfo.Develop
                    : branchInfoProvider.GetBranchInfo(project.DefaultBranch);

                return(new DefaultBranchInfo(defaultBranchInfo, remoteBranchProvider));
            };
        }
        public MergeJob(RepositoryHolder repository,
                        ConfigurationHolder configuration,
                        IRemoteBranchProvider remoteBranches,
                        ILocalBranchProvider localBranches,
                        IMergeApprovalService userApproval)
        {
            Prepare = data =>
            {
                BranchesToMerge = data.BranchesToMerge.Select(remoteBranches.GetBranch);
                TargetBranch    = localBranches.GetBranch(data.TargetBranch);

                Commands.Checkout(repository.Value, TargetBranch);
            };

            Process = () =>
            {
                var mergeSignature = new Signature("parovoz", "*****@*****.**", DateTimeOffset.Now);
                var mergeOptions   = new MergeOptions
                {
                    MergeFileFavor = Enum.TryParse(configuration["Merge", "FileFavor"], out MergeFileFavor favor)
                        ? favor
                        : MergeFileFavor.Normal,
                    SkipReuc = true
                };

                foreach (var sourceBranch in BranchesToMerge)
                {
                    var tip    = repository.Head.Tip;
                    var result = repository.Value.Merge(sourceBranch, mergeSignature, mergeOptions);

                    if (result.Status == MergeStatus.Conflicts)
                    {
                        Log.Warn($"Unable to merge {sourceBranch.FriendlyName} into {TargetBranch.FriendlyName} automatically");
                        Log.Error($"{repository.Index.Conflicts.Count()} conflict(s) found:");

                        foreach (var conflict in repository.Value.Index.Conflicts)
                        {
                            Log.Info(conflict.Ancestor.Path);
                        }

                        Log.Info("Resolve all the conflicts and press any key to continue...");

                        if (userApproval.RequstApprove("perform union merge").IsSuccess)
                        {
                            repository.Value.Reset(ResetMode.Hard, tip);
                            result = repository.Value.Merge(sourceBranch, mergeSignature, new MergeOptions
                            {
                                MergeFileFavor = MergeFileFavor.Union
                            });
                        }
                    }
                    else
                    {
                        Log.Info($"Merged successfully {sourceBranch.FriendlyName} into {TargetBranch.FriendlyName}");
                    }
                }

                return("OK");
            };
        }
    }