From 5b7727162d461cd36e1c828b06a6c8e04e2fbce7 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Mon, 15 Apr 2024 12:07:41 -0600 Subject: imworkingon: Add updated timestamp --- cmd/generate/main.go | 10 +++++- cmd/generate/src_contribs.go | 81 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 88 insertions(+), 3 deletions(-) (limited to 'cmd/generate') diff --git a/cmd/generate/main.go b/cmd/generate/main.go index d6279ba..cee752f 100644 --- a/cmd/generate/main.go +++ b/cmd/generate/main.go @@ -50,7 +50,15 @@ func mainWithError() error { } sort.Slice(contribs, func(i, j int) bool { - return contribs[i].SubmittedAt.After(contribs[j].SubmittedAt) + iDate := contribs[i].LastUpdatedAt + if iDate.IsZero() { + iDate = contribs[i].SubmittedAt + } + jDate := contribs[j].LastUpdatedAt + if jDate.IsZero() { + jDate = contribs[j].SubmittedAt + } + return iDate.After(jDate) }) tmpl := template.Must(template.New("imworkingon.html.tmpl"). diff --git a/cmd/generate/src_contribs.go b/cmd/generate/src_contribs.go index 291d47b..47133b2 100644 --- a/cmd/generate/src_contribs.go +++ b/cmd/generate/src_contribs.go @@ -50,6 +50,12 @@ func (c *Contribution) Fill() error { return err } } + if c.LastUpdatedAt.IsZero() { + c.LastUpdatedAt, err = c.fetchLastUpdatedAt() + if err != nil { + return err + } + } if c.Status == "" { c.Status, err = c.fetchStatus() if err != nil { @@ -73,6 +79,7 @@ func (c *Contribution) Fill() error { var ( reGitHubPR = regexp.MustCompile(`^https://github.com/([^/?#]+)/([^/?#]+)/pull/([0-9]+)(?:\?[^#]*)?(?:#.*)?$`) + reGitHubCommit = regexp.MustCompile(`^https://github.com/([^/?#]+)/([^/?#]+)/commit/([0-9a-f]+)(?:\?[^#]*)?(?:#.*)?$`) reGitLabMR = regexp.MustCompile(`^https://([^/]+)/([^?#]+)/-/merge_requests/([0-9]+)(?:\?[^#]*)?(?:#.*)?$`) rePiperMailDate = regexp.MustCompile(`^\s*([^<]+)\s*$`) ) @@ -122,7 +129,7 @@ func (c Contribution) fetchStatus() (string, error) { } if len(c.URLs) > 1 { for _, u := range c.URLs[1:] { - if strings.Contains(u, "/commit/") { + if reGitHubCommit.MatchString(u) { return "merged", nil } } @@ -172,5 +179,75 @@ func (c Contribution) fetchSubmittedAt() (time.Time, error) { } } } - return time.Time{}, fmt.Errorf("idk how to get timestamps for %q", c.URLs[0]) + return time.Time{}, fmt.Errorf("idk how to get created timestamp for %q", c.URLs[0]) +} + +func (c Contribution) fetchLastUpdatedAt() (time.Time, error) { + if m := reGitHubPR.FindStringSubmatch(c.URLs[0]); m != nil { + user := m[1] + repo := m[2] + prnum := m[3] + + urlStr := "https://api.github.com/repos/" + user + "/" + repo + "/pulls/" + prnum + + var obj struct { + UpdatedAt time.Time `json:"updated_at"` + } + if err := httpGetJSON(urlStr, &obj); err != nil { + return time.Time{}, err + } + return obj.UpdatedAt, nil + } + if m := reGitLabMR.FindStringSubmatch(c.URLs[0]); m != nil { + authority := m[1] + projectID := m[2] + mrnum := m[3] + + urlStr := "https://" + authority + "/api/v4/projects/" + url.QueryEscape(projectID) + "/merge_requests/" + mrnum + + var obj struct { + UpdatedAt time.Time `json:"updated_at"` + } + if err := httpGetJSON(urlStr, &obj); err != nil { + return time.Time{}, err + } + return obj.UpdatedAt, nil + } + + var ret time.Time + if len(c.URLs) > 1 { + for _, u := range c.URLs[1:] { + if m := reGitHubCommit.FindStringSubmatch(u); m != nil { + user := m[1] + repo := m[2] + hash := m[3] + + urlStr := "https://api.github.com/repos/" + user + "/" + repo + "/commits/" + hash + var obj struct { + Commit struct { + Author struct { + Date time.Time `json:"date"` + } `json:"author"` + Committer struct { + Date time.Time `json:"date"` + } `json:"committer"` + } `json:"commit"` + } + if err := httpGetJSON(urlStr, &obj); err != nil { + return time.Time{}, err + } + if obj.Commit.Author.Date.After(ret) { + ret = obj.Commit.Author.Date + } + if obj.Commit.Committer.Date.After(ret) { + ret = obj.Commit.Committer.Date + } + } + } + } + if !ret.IsZero() { + return ret, nil + } + + return time.Time{}, nil //fmt.Errorf("idk how to get updated timestamp for %q", c.URLs[0]) } -- cgit v1.2.3-2-g168b