summaryrefslogtreecommitdiff
path: root/cmd/generate/forge_pipermail.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_pipermail.go
parentf6080300406a674419dba5005c76bc424df35502 (diff)
wip pipermail threading
Diffstat (limited to 'cmd/generate/forge_pipermail.go')
-rw-r--r--cmd/generate/forge_pipermail.go133
1 files changed, 77 insertions, 56 deletions
diff --git a/cmd/generate/forge_pipermail.go b/cmd/generate/forge_pipermail.go
index 2c5cf01..e015bb5 100644
--- a/cmd/generate/forge_pipermail.go
+++ b/cmd/generate/forge_pipermail.go
@@ -2,14 +2,17 @@ package main
import (
"fmt"
+ "net/url"
"regexp"
+ "strconv"
"strings"
"time"
)
var (
- rePiperMailDate = regexp.MustCompile(`^\s*<I>([^<]+)</I>\s*$`)
- reGitHubCommit = regexp.MustCompile(`^https://github\.com/([^/?#]+)/([^/?#]+)/commit/([0-9a-f]+)(?:\?[^#]*)?(?:#.*)?$`)
+ rePiperMailMessage = regexp.MustCompile(`^(https?://.*/pipermail/.*/)([0-4]{4}-(?:January|February|March|April|May|June|July|August|September|October|November|December))/([0-9]+)\.html$`)
+ rePiperMailDate = regexp.MustCompile(`^\s*<I>([^<]+)</I>\s*$`)
+ rePiperMailReply = regexp.MustCompile(`^\s*<LINK REL="made" HREF="(.*)">\s$`)
)
type PiperMail struct{}
@@ -17,35 +20,12 @@ type PiperMail struct{}
var _ Forge = PiperMail{}
func (PiperMail) FetchStatus(urls []string) (string, error) {
- 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 {
- return "", nil
- }
- ret := statusMerged
- tag, err := getGitTagThatContainsAll(gitURL, gitCommits...)
- if err != nil {
- return "", err
- }
- if tag != "" {
- ret = fmt.Sprintf(statusReleasedFmt, tag)
- }
- return ret, nil
+ return "", nil
}
func (PiperMail) FetchSubmittedAt(urls []string) (time.Time, error) {
for _, u := range urls {
- if !strings.Contains(u, "/pipermail/") {
+ if !rePiperMailMessage.MatchString(u) {
continue
}
htmlStr, err := httpGet(u, nil)
@@ -61,38 +41,79 @@ func (PiperMail) FetchSubmittedAt(urls []string) (time.Time, error) {
return time.Time{}, nil
}
-func (PiperMail) FetchLastUpdated(urls []string) (time.Time, User, error) {
- var ret time.Time
+func (PiperMail) nextMonth(ym string) string {
+ yStr, mStr, ok := strings.Cut(ym, "-")
+ if !ok {
+ panic(fmt.Errorf("invalid year-month: %q", ym))
+ }
+ switch mStr {
+ case "January":
+ return yStr + "-February"
+ case "February":
+ return yStr + "-March"
+ case "March":
+ return yStr + "-April"
+ case "April":
+ return yStr + "-May"
+ case "May":
+ return yStr + "-June"
+ case "June":
+ return yStr + "-July"
+ case "July":
+ return yStr + "-August"
+ case "August":
+ return yStr + "-September"
+ case "September":
+ return yStr + "-October"
+ case "October":
+ return yStr + "-November"
+ case "November":
+ return yStr + "-December"
+ case "December":
+ y, _ := strconv.Atoi(yStr)
+ return fmt.Sprintf("%d-January", y+1)
+ default:
+ panic(fmt.Errorf("invalid year-month: %q", ym))
+ }
+}
+
+func (PiperMail) messageID(u string) (string, error) {
+}
+
+
+func (p PiperMail) FetchLastUpdated(urls []string) (time.Time, User, error) {
for _, u := range urls {
- if m := reGitHubCommit.FindStringSubmatch(u); m != nil {
- user := m[1]
- repo := m[2]
- hash := m[3]
+ m := rePiperMailMessage.FindStringSubmatch(u)
+ if m == nil {
+ continue
+ }
+ uBase := m[1]
+ uYM := m[2]
+ //uInt := 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
+ htmlStr, err := httpGet(u, nil)
+ if err != nil {
+ return time.Time{}, User{}, err
+ }
+ var msgid string
+ for _, line := range strings.Split(htmlStr, "\n") {
+ if m := rePiperMailReply.FindStringSubmatch(line); m != nil {
+ ru, err := url.Parse(m[1])
+ if err != nil {
+ continue
+ }
+ if msgid = ru.Query().Get("In-Reply-To"); msgid != "" {
+ break
+ }
}
}
+ if msgid == "" {
+ continue
+ }
+ mboxStr, err := httpGet(uBase+uYM+".txt.gz", nil)
+ if err != nil {
+ return time.Time{}, User{}, err
+ }
}
- if ret.IsZero() {
- return time.Time{}, User{}, nil
- }
- return ret, User{}, nil
+ return time.Time{}, User{}, nil
}