From 249ceea9b77a9eda26fb696c50b673d6f295d7f4 Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Tue, 17 Dec 2024 15:38:19 +0100 Subject: pkg/email/lore: extract patch series Refactor the code to make it more reusable. Add a method to extract specifically the list of new patch series. --- pkg/email/lore/read.go | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) (limited to 'pkg/email/lore/read.go') diff --git a/pkg/email/lore/read.go b/pkg/email/lore/read.go index 7489f750f..ef0a0faa0 100644 --- a/pkg/email/lore/read.go +++ b/pkg/email/lore/read.go @@ -4,30 +4,49 @@ package lore import ( + "bytes" "fmt" "time" + "github.com/google/syzkaller/pkg/email" "github.com/google/syzkaller/pkg/vcs" ) type EmailReader struct { - Extract func() ([]byte, error) + Read func() ([]byte, error) } // ReadArchive queries the parsed messages from a single LKML message archive. -func ReadArchive(dir string, messages chan<- *EmailReader) error { - repo := vcs.NewLKMLRepo(dir) - commits, err := repo.ListCommitHashes("HEAD", time.Time{}) +func ReadArchive(repo vcs.Repo, fromTime time.Time) ([]EmailReader, error) { + commits, err := repo.ListCommitHashes("HEAD", fromTime) if err != nil { - return fmt.Errorf("failed to get recent commits: %w", err) + return nil, fmt.Errorf("failed to get recent commits: %w", err) } + var ret []EmailReader for _, iterCommit := range commits { commit := iterCommit - messages <- &EmailReader{ - Extract: func() ([]byte, error) { + ret = append(ret, EmailReader{ + Read: func() ([]byte, error) { return repo.Object("m", commit) }, - } + }) } - return nil + return ret, nil +} + +func (er *EmailReader) Parse(emails, domains []string) (*email.Email, error) { + body, err := er.Read() + if err != nil { + return nil, err + } + msg, err := email.Parse(bytes.NewReader(body), emails, nil, domains) + if err != nil { + return nil, err + } + // Keep memory consumption low. + msg.Body = "" + msg.Patch = "" + // TODO: We definitely don't care about the patch here. Add an option to avoid extracting it? + // TODO: If emails/domains are nil, we also don't need to parse the body at all. + return msg, nil } -- cgit mrf-deployment