diff options
author | Luke T. Shumaker <lukeshu@lukeshu.com> | 2024-06-08 17:51:41 -0600 |
---|---|---|
committer | Luke T. Shumaker <lukeshu@lukeshu.com> | 2024-06-08 17:51:41 -0600 |
commit | 5dc2e9533a111d75ff91a56dd50af8e03ebf5f5f (patch) | |
tree | e90d2b74612ecb44fb0e41a19e44483f90a071ba /cmd/generate/forge_pipermail.go | |
parent | f6080300406a674419dba5005c76bc424df35502 (diff) |
wip pipermail threading
Diffstat (limited to 'cmd/generate/forge_pipermail.go')
-rw-r--r-- | cmd/generate/forge_pipermail.go | 133 |
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 } |