summaryrefslogtreecommitdiff
path: root/cmd/generate/forge_gerrit.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/generate/forge_gerrit.go')
-rw-r--r--cmd/generate/forge_gerrit.go72
1 files changed, 65 insertions, 7 deletions
diff --git a/cmd/generate/forge_gerrit.go b/cmd/generate/forge_gerrit.go
index 6bdeece..1e6e073 100644
--- a/cmd/generate/forge_gerrit.go
+++ b/cmd/generate/forge_gerrit.go
@@ -4,6 +4,7 @@ import (
"encoding"
"encoding/json"
"fmt"
+ "net/url"
"regexp"
"strings"
"time"
@@ -58,26 +59,83 @@ type Gerrit struct{}
var _ Forge = Gerrit{}
+var reGoogleGerritCL = regexp.MustCompile(`https://([a-z]+-review\.googlesource\.com)/c/([^?#]+)/\+/([0-9]+)(?:\?[^#]*)?(?:#.*)?$`)
+
func (Gerrit) FetchStatus(urls []string) (string, error) {
+ for _, u := range urls {
+ if reGitHubPR.MatchString(u) {
+ return "", nil
+ }
+ }
+ for _, u := range urls {
+ m := reGoogleGerritCL.FindStringSubmatch(u)
+ if m == nil {
+ continue
+ }
+ authority := m[1]
+ projectID := m[2]
+ changeID := m[3]
+
+ urlStr := "https://" + authority + "/changes/" + url.PathEscape(projectID) + "~" + changeID + "?o=MESSAGES&o=DETAILED_ACCOUNTS"
+
+ var obj struct {
+ Status string `json:"status"`
+ }
+ if err := httpGetGerritJSON(urlStr, nil, &obj); err != nil {
+ return "", err
+ }
+ // https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#change-info
+ switch obj.Status {
+ case "NEW":
+ return "open", nil
+ case "MERGED":
+ return "merged", nil
+ case "ABANDONED":
+ return "closed", nil
+ }
+ }
return "", nil
}
func (Gerrit) FetchSubmittedAt(urls []string) (time.Time, error) {
+ for _, u := range urls {
+ if reGitHubPR.MatchString(u) {
+ return time.Time{}, nil
+ }
+ }
+ for _, u := range urls {
+ m := reGoogleGerritCL.FindStringSubmatch(u)
+ if m == nil {
+ continue
+ }
+ authority := m[1]
+ projectID := m[2]
+ changeID := m[3]
+
+ urlStr := "https://" + authority + "/changes/" + url.PathEscape(projectID) + "~" + changeID + "?o=MESSAGES&o=DETAILED_ACCOUNTS"
+
+ var obj struct {
+ Created GerritTime `json:"created"`
+ }
+ if err := httpGetGerritJSON(urlStr, nil, &obj); err != nil {
+ return time.Time{}, err
+ }
+ return obj.Created.Val, nil
+ }
return time.Time{}, nil
}
-var reGoLangGerritCL = regexp.MustCompile(`https://go-review\.googlesource\.com/c/([^/?#]+)/\+/([0-9]+)(?:\?[^#]*)?(?:#.*)?$`)
-
func (Gerrit) FetchLastUpdated(urls []string) (time.Time, User, error) {
for _, u := range urls {
- m := reGoLangGerritCL.FindStringSubmatch(u)
+ m := reGoogleGerritCL.FindStringSubmatch(u)
if m == nil {
continue
}
- projectID := m[1]
- changeID := m[2]
+ authority := m[1]
+ projectID := m[2]
+ changeID := m[3]
- urlStr := "https://go-review.googlesource.com/changes/" + projectID + "~" + changeID + "?o=MESSAGES&o=DETAILED_ACCOUNTS"
+ urlStr := "https://" + authority + "/changes/" + url.PathEscape(projectID) + "~" + changeID + "?o=MESSAGES&o=DETAILED_ACCOUNTS"
var obj struct {
Updated GerritTime `json:"updated"`
@@ -102,7 +160,7 @@ func (Gerrit) FetchLastUpdated(urls []string) (time.Time, User, error) {
} else {
retUser.Name = message.Author.Name
}
- retUser.URL = fmt.Sprintf("https://go-review.googlesource.com/dashboard/%d", message.Author.AccountID)
+ retUser.URL = fmt.Sprintf("https://%s/dashboard/%d", authority, message.Author.AccountID)
break
}
}