summaryrefslogtreecommitdiff
path: root/cmd/generate/forge_github.go
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2024-06-08 17:51:41 -0600
committerLuke T. Shumaker <lukeshu@lukeshu.com>2024-06-08 17:51:41 -0600
commit5dc2e9533a111d75ff91a56dd50af8e03ebf5f5f (patch)
treee90d2b74612ecb44fb0e41a19e44483f90a071ba /cmd/generate/forge_github.go
parentf6080300406a674419dba5005c76bc424df35502 (diff)
wip pipermail threading
Diffstat (limited to 'cmd/generate/forge_github.go')
-rw-r--r--cmd/generate/forge_github.go68
1 files changed, 67 insertions, 1 deletions
diff --git a/cmd/generate/forge_github.go b/cmd/generate/forge_github.go
index d3618ce..d29e3f7 100644
--- a/cmd/generate/forge_github.go
+++ b/cmd/generate/forge_github.go
@@ -7,7 +7,10 @@ import (
"time"
)
-var reGitHubPR = regexp.MustCompile(`^https://github\.com/([^/?#]+)/([^/?#]+)/pull/([0-9]+)(?:\?[^#]*)?(?:#.*)?$`)
+var (
+ reGitHubPR = regexp.MustCompile(`^https://github\.com/([^/?#]+)/([^/?#]+)/pull/([0-9]+)(?:\?[^#]*)?(?:#.*)?$`)
+ reGitHubCommit = regexp.MustCompile(`^https://github\.com/([^/?#]+)/([^/?#]+)/commit/([0-9a-f]+)(?:\?[^#]*)?(?:#.*)?$`)
+)
func githubPagination(i int) url.Values {
params := make(url.Values)
@@ -20,6 +23,7 @@ type GitHub struct{}
var _ Forge = GitHub{}
func (GitHub) FetchStatus(urls []string) (string, error) {
+ // PR
for _, u := range urls {
m := reGitHubPR.FindStringSubmatch(u)
if m == nil {
@@ -54,6 +58,31 @@ func (GitHub) FetchStatus(urls []string) (string, error) {
return ret, nil
}
+ // Commits from a non-PR
+ var gitURL string
+ var gitCommits []string
+ for _, u := range urls {
+ if m := reGitHubCommit.FindStringSubmatch(u); m != nil {
+ user := m[1]
+ repo := m[2]
+ hash := m[3]
+
+ gitURL = "https://github.com/" + user + "/" + repo
+ gitCommits = append(gitCommits, hash)
+ }
+ }
+ if len(gitCommits) > 0 {
+ ret := statusMerged
+ tag, err := getGitTagThatContainsAll(gitURL, gitCommits...)
+ if err != nil {
+ return "", err
+ }
+ if tag != "" {
+ ret = fmt.Sprintf(statusReleasedFmt, tag)
+ }
+ return ret, nil
+ }
+ // Nope
return "", nil
}
@@ -81,6 +110,7 @@ func (GitHub) FetchSubmittedAt(urls []string) (time.Time, error) {
}
func (GitHub) FetchLastUpdated(urls []string) (time.Time, User, error) {
+ // PR
for _, u := range urls {
m := reGitHubPR.FindStringSubmatch(u)
if m == nil {
@@ -184,5 +214,41 @@ func (GitHub) FetchLastUpdated(urls []string) (time.Time, User, error) {
return retUpdatedAt, retUser, nil
}
+ // Commits from a non-PR
+ {
+ var ret time.Time
+ for _, u := range urls {
+ 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, nil, &obj); err != nil {
+ return time.Time{}, User{}, 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 time.Time{}, User{}, nil
+ }
+ }
+ // Nope
return time.Time{}, User{}, nil
}