From f22f584e8d35fc6bb4b472ac64a7be3370bf2cf0 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Tue, 28 Apr 2020 11:53:25 -0700 Subject: [PATCH] Handle closed issues --- api/queries_issue.go | 16 +++++++++++----- command/issue.go | 8 ++++++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/api/queries_issue.go b/api/queries_issue.go index 9443ab8bf..153336ea4 100644 --- a/api/queries_issue.go +++ b/api/queries_issue.go @@ -28,6 +28,7 @@ type Issue struct { Title string URL string State string + Closed bool Body string CreatedAt time.Time UpdatedAt time.Time @@ -307,6 +308,7 @@ func IssueByNumber(client *Client, repo ghrepo.Interface, number int) (*Issue, e id title state + closed body author { login @@ -367,13 +369,17 @@ func IssueByNumber(client *Client, repo ghrepo.Interface, number int) (*Issue, e return &resp.Repository.Issue, nil } -func IssueClose(client *Client, repo ghrepo.Interface, issueNumber int) error { +func IssueClose(client *Client, repo ghrepo.Interface, issueNumber int) (alreadyClosed bool, _ error) { issue, err := IssueByNumber(client, repo, issueNumber) var idErr *IssuesDisabledError if errors.As(err, &idErr) { - return fmt.Errorf("issues disabled for %s", ghrepo.FullName(repo)) + return false, fmt.Errorf("issues disabled for %s", ghrepo.FullName(repo)) } else if err != nil { - return fmt.Errorf("failed to find issue #%d: %w", issueNumber, err) + return false, fmt.Errorf("failed to find issue #%d: %w", issueNumber, err) + } + + if issue.Closed { + return true, nil } var mutation struct { @@ -392,8 +398,8 @@ func IssueClose(client *Client, repo ghrepo.Interface, issueNumber int) error { err = v4.Mutate(context.Background(), &mutation, input, nil) if err != nil { - return err + return false, err } - return nil + return false, nil } diff --git a/command/issue.go b/command/issue.go index b919cc843..d7562e875 100644 --- a/command/issue.go +++ b/command/issue.go @@ -539,12 +539,16 @@ func issueClose(cmd *cobra.Command, args []string) error { return fmt.Errorf("expected a number but: %w", err) } - err = api.IssueClose(apiClient, baseRepo, issueNumber) + alreadyClosed, err := api.IssueClose(apiClient, baseRepo, issueNumber) if err != nil { return fmt.Errorf("API call failed:%w", err) } - fmt.Fprintf(colorableErr(cmd), "%s closed issue #%d\n", utils.Green("✔"), issueNumber) + if alreadyClosed { + fmt.Fprintf(colorableErr(cmd), "%s issue #%d is already closed\n", utils.Yellow("!"), issueNumber) + } else { + fmt.Fprintf(colorableErr(cmd), "%s closed issue #%d\n", utils.Green("✔"), issueNumber) + } return nil }