示例#1
0
        private bool HasReleaseBranch(string release)
        {
            var project = AzureProjectHelper.FindDefaultProject(AzureContext);
            var repo    = AzureGitHelper.FindRepository(AzureContext, project.Id, Context.Options.RepositoryName);

            return(AzureContext.Connection.GetClient <GitHttpClient>().GetRefsAsync(repo.Id, filter: "heads/release/" + release).Result.FirstOrDefault() != null);
        }
示例#2
0
        private IList <WorkItem> GetWorkItemsInProgress()
        {
            var project = AzureProjectHelper.FindDefaultProject(AzureContext);

            var query = $"SELECT [System.Id], [System.AssignedTo], [System.Title] FROM WorkItems " +
                        $"WHERE [System.TeamProject] = '{project.Name}' " +
                        $"AND [System.AssignedTo] = '{Context.Options.UserName}' " +
                        $"AND [System.State] = 'In Progress' ";

            if (Options.WorkItemId > 0)
            {
                query += "AND [System.Id] = " + Options.WorkItemId.ToString();
            }

            var queryResult = workItemTrackingClient.QueryByWiqlAsync(new Wiql()
            {
                Query = query
            }).Result;

            if (!queryResult.WorkItems.Any())
            {
                throw new FigException("No items in progress");
            }

            var workItems = queryResult.WorkItems.Select(c => workItemTrackingClient.GetWorkItemAsync(c.Id, expand: WorkItemExpand.All).Result).ToList();

            if (WorkItemsFromDifferentParents(workItems))
            {
                throw new FigException("The workitems in progress are of different parents");
            }

            return(workItems);
        }
示例#3
0
        public override CommandResult Execute()
        {
            if (Options.WorkItemId <= 0)
            {
                throw new FigException("Invalid workitem ID.");
            }

            var project                 = AzureProjectHelper.FindDefaultProject(AzureContext);
            var repo                    = AzureGitHelper.FindRepository(AzureContext, project.Id, Context.Options.RepositoryName);
            var defaultBranchName       = AzureGitHelper.WithoutRefsPrefix(repo.DefaultBranch);
            var defaultBranch           = gitClient.GetRefsAsync(repo.Id, filter: defaultBranchName).Result.First();
            var workitem                = GetWorkItem(Options.WorkItemId);
            var relatedWorkitems        = GetAllRelatedWorkdItems(workitem);
            var workItemsReleaseVersion = GetReleaseVersionFromWorkItems(relatedWorkitems);

            if (!string.IsNullOrEmpty(Options.Release) &&
                !string.IsNullOrEmpty(workItemsReleaseVersion) &&
                workItemsReleaseVersion != Options.Release)
            {
                throw new FigException("The reported release is different from the linked release in the workitems");
            }

            var releaseBranchName = workItemsReleaseVersion ?? Options.Release;
            var parentWorkItem    = relatedWorkitems.FirstOrDefault();
            var releaseBranch     = GetReleaseBranch(repo.Id, releaseBranchName);
            var branchName        = GetBranchName(parentWorkItem, releaseBranch);
            var branchPatch       = "heads/dev/" + branchName;
            var fullBranchPatch   = "refs/" + branchPatch;
            var newBranch         = gitClient.GetRefsAsync(repo.Id, filter: branchPatch).Result.FirstOrDefault();

            if (newBranch == null || !newBranch.Name.EndsWith(branchPatch))
            {
                if (!Confirm("Confirm branch creation: {0} [Enter]", branchName))
                {
                    return(Canceled());
                }

                newBranch = CreateBranch(repo, releaseBranch ?? defaultBranch, fullBranchPatch, branchName);
            }

            LinkWorkItems(project, repo, newBranch, branchName, relatedWorkitems);
            StartFirstTask(workitem, relatedWorkitems);
            ConfigureLocalGit(branchName);

            if (!Options.NoPrune)
            {
                ClearLocalBranches();
            }

            var result = Ok();

            if (Options.RunDbScripts)
            {
                result = MigrateDatabase();
            }

            return(result);
        }
示例#4
0
        public override CommandResult Execute()
        {
            if (string.IsNullOrEmpty(Options.TargetBranch))
            {
                Options.TargetBranch = "master";
            }

            var gitHttpClient = AzureContext.Connection.GetClient <GitHttpClient>();

            var project     = AzureProjectHelper.FindDefaultProject(AzureContext);
            var repo        = AzureGitHelper.FindRepository(AzureContext, project.Id, Context.Options.RepositoryName);
            var pullRequest = gitHttpClient.GetPullRequestAsync(repo.Id, Options.PullRequestId).Result;

            if (pullRequest == null)
            {
                return(Fail("Pull request not found."));
            }

            if (pullRequest.Status != PullRequestStatus.Completed)
            {
                return(Fail("Pull request not completed"));
            }

            var topicBranchName         = pullRequest.SourceRefName.Replace("refs/heads/", "") + "-on-" + Options.TargetBranch.Replace("/", "-");
            var pullRequestTargetBranch = pullRequest.TargetRefName.Replace("refs/heads/", "");

            if (pullRequestTargetBranch == Options.TargetBranch)
            {
                return(Fail($"The pull request branch is same target branch [{Options.TargetBranch}]"));
            }

            if (!Confirm($"Confirm merge {pullRequestTargetBranch} to {Options.TargetBranch}? Will be created {topicBranchName}"))
            {
                return(Canceled());
            }

            if (!GitHelper.MergeInProgress())
            {
                AddStep(() => GitHelper.Checkout(pullRequestTargetBranch, true));
                AddStep(() => GitHelper.CreateBranch(Options.TargetBranch, topicBranchName, true));
                AddStep(() => GitHelper.Merge(pullRequestTargetBranch));
            }

            AddStep(() => GitHelper.Commit($"Merge {pullRequestTargetBranch} to {Options.TargetBranch}", checkHasChangesBeforeCommit: true));
            AddStep(() => GitHelper.PushBranch());
            AddStep(() => GitHelper.Sync());
            AddStep(() => CreatePullRequest(gitHttpClient, repo.Id, pullRequest, topicBranchName, Options.TargetBranch, pullRequestTargetBranch));

            return(ExecuteSteps());
        }
示例#5
0
 private void ConfigureRepository(FigOptions figOptions)
 {
     InitializeAzureContext();
     figOptions.RepositoryName = GitHelper.GetRemoteRepositoryName();
     figOptions.RepositoryId   = AzureGitHelper.FindRepositoryId(AzureContext, AzureProjectHelper.FindDefaultProjectId(AzureContext), figOptions.RepositoryName)?.ToString();
 }