issues

Github, Jira, Gitlab issues from Plan 9's acme
Log | Files | Refs | README | LICENSE

commit d4fac749c280ad83f2c5a2aab41e0c58c7032f98
parent 9c46e85b316f44609756b808223bd95b1c96f2f8
Author: Russ Cox <rsc@golang.org>
Date:   Mon,  9 May 2016 15:28:40 -0400

issue: update for new API

Diffstat:
Missue/edit.go | 4++--
Missue/issue.go | 103+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
2 files changed, 95 insertions(+), 12 deletions(-)

diff --git a/issue/edit.go b/issue/edit.go @@ -462,8 +462,8 @@ func bulkWriteIssue(old *github.Issue, updated []byte, status func(string)) (ids } // Check rate limits here (in contrast to everywhere else in this program) // to avoid needless failure halfway through the loop. - for client.Rate.Limit > 0 && client.Rate.Remaining == 0 { - delta := (client.Rate.Reset.Sub(time.Now())/time.Minute + 2) * time.Minute + for client.Rate().Limit > 0 && client.Rate().Remaining == 0 { + delta := (client.Rate().Reset.Sub(time.Now())/time.Minute + 2) * time.Minute if delta < 0 { delta = 2 * time.Minute } diff --git a/issue/issue.go b/issue/issue.go @@ -255,6 +255,7 @@ var ( editFlag = flag.Bool("e", false, "edit in system editor") jsonFlag = flag.Bool("json", false, "write JSON output") project = flag.String("p", "golang/go", "GitHub owner/repo name") + rawFlag = flag.Bool("raw", false, "do no processing of markdown") tokenFile = flag.String("token", "", "read GitHub token personal access token from `file` (default $HOME/.github-issue-token)") projectOwner = "" projectRepo = "" @@ -371,12 +372,18 @@ func printIssue(w io.Writer, issue *github.Issue) error { fmt.Fprintf(w, "\nReported by %s (%s)\n", getUserLogin(issue.User), getTime(issue.CreatedAt).Format(timeFormat)) if issue.Body != nil { - text := strings.TrimSpace(*issue.Body) - if text != "" { - fmt.Fprintf(w, "\n\t%s\n", wrap(text, "\t")) + if *rawFlag { + fmt.Fprintf(w, "\n%s\n\n", *issue.Body) + } else { + text := strings.TrimSpace(*issue.Body) + if text != "" { + fmt.Fprintf(w, "\n\t%s\n", wrap(text, "\t")) + } } } + var output []string + for page := 1; ; { list, resp, err := client.Issues.ListComments(projectOwner, projectRepo, getInt(issue.Number), &github.IssueListCommentsOptions{ ListOptions: github.ListOptions{ @@ -385,13 +392,21 @@ func printIssue(w io.Writer, issue *github.Issue) error { }, }) for _, com := range list { + var buf bytes.Buffer + w := &buf + fmt.Fprintf(w, "%s\n", getTime(com.CreatedAt).Format(time.RFC3339)) fmt.Fprintf(w, "\nComment by %s (%s)\n", getUserLogin(com.User), getTime(com.CreatedAt).Format(timeFormat)) if com.Body != nil { - text := strings.TrimSpace(*com.Body) - if text != "" { - fmt.Fprintf(w, "\n\t%s\n", wrap(text, "\t")) + if *rawFlag { + fmt.Fprintf(w, "\n%s\n\n", *com.Body) + } else { + text := strings.TrimSpace(*com.Body) + if text != "" { + fmt.Fprintf(w, "\n\t%s\n", wrap(text, "\t")) + } } } + output = append(output, buf.String()) } if err != nil { return err @@ -401,6 +416,70 @@ func printIssue(w io.Writer, issue *github.Issue) error { } page = resp.NextPage } + + for page := 1; ; { + list, resp, err := client.Issues.ListIssueEvents(projectOwner, projectRepo, getInt(issue.Number), &github.ListOptions{ + Page: page, + PerPage: 100, + }) + for _, ev := range list { + var buf bytes.Buffer + w := &buf + fmt.Fprintf(w, "%s\n", getTime(ev.CreatedAt).Format(time.RFC3339)) + switch event := getString(ev.Event); event { + case "mentioned", "subscribed", "unsubscribed": + // ignore + default: + fmt.Fprintf(w, "\n* %s %s (%s)\n", getUserLogin(ev.Actor), event, getTime(ev.CreatedAt).Format(timeFormat)) + case "closed", "referenced", "merged": + id := getString(ev.CommitID) + if id != "" { + if len(id) > 7 { + id = id[:7] + } + id = " in commit " + id + } + fmt.Fprintf(w, "\n* %s %s%s (%s)\n", getUserLogin(ev.Actor), event, id, getTime(ev.CreatedAt).Format(timeFormat)) + if id != "" { + commit, _, err := client.Git.GetCommit(projectOwner, projectRepo, *ev.CommitID) + if err == nil { + fmt.Fprintf(w, "\n\tAuthor: %s <%s> %s\n\tCommitter: %s <%s> %s\n\n\t%s\n", + getString(commit.Author.Name), getString(commit.Author.Email), getTime(commit.Author.Date).Format(timeFormat), + getString(commit.Committer.Name), getString(commit.Committer.Email), getTime(commit.Committer.Date).Format(timeFormat), + wrap(getString(commit.Message), "\t")) + } + } + case "assigned", "unassigned": + fmt.Fprintf(w, "\n* %s %s %s (%s)\n", getUserLogin(ev.Actor), event, getUserLogin(ev.Assignee), getTime(ev.CreatedAt).Format(timeFormat)) + case "labeled", "unlabeled": + fmt.Fprintf(w, "\n* %s %s %s (%s)\n", getUserLogin(ev.Actor), event, getString(ev.Label.Name), getTime(ev.CreatedAt).Format(timeFormat)) + case "milestoned", "demilestoned": + if event == "milestoned" { + event = "added to milestone" + } else { + event = "removed from milestone" + } + fmt.Fprintf(w, "\n* %s %s %s (%s)\n", getUserLogin(ev.Actor), event, getString(ev.Milestone.Title), getTime(ev.CreatedAt).Format(timeFormat)) + case "renamed": + fmt.Fprintf(w, "\n* %s changed title (%s)\n - %s\n + %s\n", getUserLogin(ev.Actor), getTime(ev.CreatedAt).Format(timeFormat), getString(ev.Rename.From), getString(ev.Rename.To)) + } + output = append(output, buf.String()) + } + if err != nil { + return err + } + if resp.NextPage < page { + break + } + page = resp.NextPage + } + + sort.Strings(output) + for _, s := range output { + i := strings.Index(s, "\n") + fmt.Fprintf(w, "%s", s[i+1:]) + } + return nil } @@ -583,16 +662,20 @@ func loadMilestones() ([]github.Milestone, error) { func wrap(t string, prefix string) string { out := "" t = strings.Replace(t, "\r\n", "\n", -1) + max := 70 + if *acmeFlag { + max = 120 + } lines := strings.Split(t, "\n") for i, line := range lines { if i > 0 { out += "\n" + prefix } s := line - for len(s) > 70 { - i := strings.LastIndex(s[:70], " ") + for len(s) > max { + i := strings.LastIndex(s[:max], " ") if i < 0 { - i = 69 + i = max - 1 } i++ out += s[:i] + "\n" + prefix @@ -668,7 +751,7 @@ func getTime(x *time.Time) time.Time { if x == nil { return time.Time{} } - return *x + return (*x).Local() } func getMilestoneTitle(x *github.Milestone) string {