summaryrefslogtreecommitdiff
path: root/cmd/generate
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2024-04-15 12:07:41 -0600
committerLuke T. Shumaker <lukeshu@lukeshu.com>2024-04-15 12:07:53 -0600
commit5b7727162d461cd36e1c828b06a6c8e04e2fbce7 (patch)
tree3f0a4833ca49659752de3d6dc07f4723419baf61 /cmd/generate
parent8b336e06f15263310eb82345fb2778414ed76879 (diff)
imworkingon: Add updated timestamp
Diffstat (limited to 'cmd/generate')
-rw-r--r--cmd/generate/main.go10
-rw-r--r--cmd/generate/src_contribs.go81
2 files changed, 88 insertions, 3 deletions
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*<I>([^<]+)</I>\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])
}