diff --git a/commands/issue/issue.go b/commands/issue/issue.go index 74f413833a6a2a92849b53582e13d527ddb132db..760ad126feaa1c3ab254abc32d1ae30597732986 100644 --- a/commands/issue/issue.go +++ b/commands/issue/issue.go @@ -7,6 +7,7 @@ import ( issueCloseCmd "gitlab.com/gitlab-org/cli/commands/issue/close" issueCreateCmd "gitlab.com/gitlab-org/cli/commands/issue/create" issueDeleteCmd "gitlab.com/gitlab-org/cli/commands/issue/delete" + issueLinkCmd "gitlab.com/gitlab-org/cli/commands/issue/link" issueListCmd "gitlab.com/gitlab-org/cli/commands/issue/list" issueNoteCmd "gitlab.com/gitlab-org/cli/commands/issue/note" issueReopenCmd "gitlab.com/gitlab-org/cli/commands/issue/reopen" @@ -44,6 +45,7 @@ func NewCmdIssue(f *cmdutils.Factory) *cobra.Command { issueCmd.AddCommand(issueBoardCmd.NewCmdBoard(f)) issueCmd.AddCommand(issueCreateCmd.NewCmdCreate(f)) issueCmd.AddCommand(issueDeleteCmd.NewCmdDelete(f)) + issueCmd.AddCommand(issueLinkCmd.NewCmdLink(f)) issueCmd.AddCommand(issueListCmd.NewCmdList(f, nil)) issueCmd.AddCommand(issueNoteCmd.NewCmdNote(f)) issueCmd.AddCommand(issueReopenCmd.NewCmdReopen(f)) diff --git a/commands/issue/link/issue_link.go b/commands/issue/link/issue_link.go new file mode 100644 index 0000000000000000000000000000000000000000..4611ec6c7a1f7731763c56121c9063152ef07489 --- /dev/null +++ b/commands/issue/link/issue_link.go @@ -0,0 +1,62 @@ +package link + +import ( + "fmt" + + "gitlab.com/gitlab-org/cli/api" + "gitlab.com/gitlab-org/cli/commands/cmdutils" + "gitlab.com/gitlab-org/cli/commands/issue/issueutils" + + "github.com/MakeNowJust/heredoc/v2" + "github.com/spf13/cobra" + "github.com/xanzy/go-gitlab" +) + +func NewCmdLink(f *cmdutils.Factory) *cobra.Command { + issueLinkCmd := &cobra.Command{ + Use: "link [flags]", + Short: `Link an issue to another issue`, + Long: ``, + Example: heredoc.Doc(` + glab issue link 42 43 + glab issue link 42 43 --target-project 1234 + `), + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + var err error + out := f.IO.StdOut + c := f.IO.Color() + + apiClient, err := f.HttpClient() + if err != nil { + return err + } + issueLink, repo, err := issueutils.IssueFromArg(apiClient, f.BaseRepo, args[0]) + if err != nil { + return err + } + l := &gitlab.CreateIssueLinkOptions{} + + // If the user didn't specify a target project, use the current project + if !cmd.Flags().Changed("target-project") { + l.TargetProjectID = gitlab.Ptr(repo.FullName()) + } + + l.TargetIssueIID = gitlab.Ptr(args[1]) + + fmt.Fprintf(out, "Linking issue %d to issue %s in project %s\n", issueLink.IID, args[1], repo.FullName()) + + issueLink, _, err = api.LinkIssues(apiClient, repo.FullName(), issueLink.IID, l) + if err != nil { + return err + } + + fmt.Fprintln(out, issueutils.DisplayIssue(c, issueLink, f.IO.IsaTTY)) + return nil + }, + } + + issueLinkCmd.Flags().StringP("target-project", "p", "", "The target project") + + return issueLinkCmd +}