| 89 | } |
| 90 | |
| 91 | func closeRun(opts *CloseOptions) error { |
| 92 | cs := opts.IO.ColorScheme() |
| 93 | closeReason := opts.Reason |
| 94 | if opts.DuplicateOf != "" { |
| 95 | if closeReason == "" { |
| 96 | closeReason = "duplicate" |
| 97 | } else if closeReason != "duplicate" { |
| 98 | return cmdutil.FlagErrorf("`--duplicate-of` can only be used with `--reason duplicate`") |
| 99 | } |
| 100 | } |
| 101 | |
| 102 | httpClient, err := opts.HttpClient() |
| 103 | if err != nil { |
| 104 | return err |
| 105 | } |
| 106 | |
| 107 | baseRepo, err := opts.BaseRepo() |
| 108 | if err != nil { |
| 109 | return err |
| 110 | } |
| 111 | |
| 112 | issue, err := shared.FindIssueOrPR(httpClient, baseRepo, opts.IssueNumber, []string{"id", "number", "title", "state"}) |
| 113 | if err != nil { |
| 114 | return err |
| 115 | } |
| 116 | |
| 117 | if issue.State == "CLOSED" { |
| 118 | fmt.Fprintf(opts.IO.ErrOut, "%s Issue %s#%d (%s) is already closed\n", cs.Yellow("!"), ghrepo.FullName(baseRepo), issue.Number, issue.Title) |
| 119 | return nil |
| 120 | } |
| 121 | |
| 122 | var duplicateIssueID string |
| 123 | if opts.DuplicateOf != "" { |
| 124 | if issue.IsPullRequest() { |
| 125 | return cmdutil.FlagErrorf("`--duplicate-of` is only supported for issues") |
| 126 | } |
| 127 | duplicateIssueNumber, duplicateRepo, err := shared.ParseIssueFromArg(opts.DuplicateOf) |
| 128 | if err != nil { |
| 129 | return cmdutil.FlagErrorf("invalid value for `--duplicate-of`: %v", err) |
| 130 | } |
| 131 | duplicateIssueRepo := baseRepo |
| 132 | if parsedRepo, present := duplicateRepo.Value(); present { |
| 133 | duplicateIssueRepo = parsedRepo |
| 134 | } |
| 135 | if ghrepo.IsSame(baseRepo, duplicateIssueRepo) && issue.Number == duplicateIssueNumber { |
| 136 | return cmdutil.FlagErrorf("`--duplicate-of` cannot reference the current issue") |
| 137 | } |
| 138 | duplicateIssue, err := shared.FindIssueOrPR(httpClient, duplicateIssueRepo, duplicateIssueNumber, []string{"id"}) |
| 139 | if err != nil { |
| 140 | return err |
| 141 | } |
| 142 | if duplicateIssue.IsPullRequest() { |
| 143 | return cmdutil.FlagErrorf("`--duplicate-of` must reference an issue") |
| 144 | } |
| 145 | duplicateIssueID = duplicateIssue.ID |
| 146 | } |
| 147 | |
| 148 | if opts.Comment != "" { |