diff options
| author | Paul Buetow <paul@buetow.org> | 2024-12-25 23:27:01 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2024-12-25 23:27:01 +0200 |
| commit | 35f393acae883eecdac98d2fceb85961f05ca848 (patch) | |
| tree | 9bd3b554693f35cee6665a3177b139bec74fe94c /internal | |
| parent | 17b6631a084062f06dcd39da44bedcd6bc26a839 (diff) | |
use range over functions to get all the entries
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/entry/entry.go | 20 | ||||
| -rw-r--r-- | internal/summary/summary.go | 55 |
2 files changed, 60 insertions, 15 deletions
diff --git a/internal/entry/entry.go b/internal/entry/entry.go index 7570c0b..cfec5fe 100644 --- a/internal/entry/entry.go +++ b/internal/entry/entry.go @@ -196,6 +196,26 @@ func (en Entry) extractTags(parts []string) { } } +func (en Entry) Timestamp() (time.Time, error) { + fileInfo, err := os.Stat(en.Path) + if err != nil { + return time.Time{}, err + } + return fileInfo.ModTime(), nil +} + +func (en Entry) After(other Entry) (bool, error) { + t1, err := en.Timestamp() + if err != nil { + return false, err + } + t2, err := other.Timestamp() + if err != nil { + return false, err + } + return t1.After(t2), nil +} + func extractURLs(input string) []string { urlPattern := `(http://|https://|ftp://)[^\s]+` re := regexp.MustCompile(urlPattern) diff --git a/internal/summary/summary.go b/internal/summary/summary.go index d76004f..4c94cee 100644 --- a/internal/summary/summary.go +++ b/internal/summary/summary.go @@ -3,6 +3,7 @@ package summary import ( "context" "fmt" + "iter" "path/filepath" "codeberg.org/snonux/gos/internal/colour" @@ -22,29 +23,53 @@ func Run(ctx context.Context, args config.Args) error { return nil } -func deduppedEntries(args config.Args) ([]entry.Entry, error) { - dedup := make(map[string]struct{}) - var entries []entry.Entry - - for _, dateStr := range args.SummaryFor { - glob := filepath.Join(args.GosDir, "db/platforms/*/", fmt.Sprintf("*%s*-??????.posted", dateStr)) - paths, err := filepath.Glob(glob) - if err != nil { - return entries, err +type maybeEntry struct { + en entry.Entry + err error +} + +func matchingEntries(args config.Args) iter.Seq[maybeEntry] { + return func(yield func(maybeEntry) bool) { + for _, dateStr := range args.SummaryFor { + glob := filepath.Join(args.GosDir, "db/platforms/*/", fmt.Sprintf("*%s*-??????.posted", dateStr)) + paths, err := filepath.Glob(glob) + if err != nil && !yield(maybeEntry{err: err}) { + return + } + for _, path := range paths { + en, err := entry.New(path) + if !yield(maybeEntry{en, err}) { + return + } + } } + } +} + +func deduppedEntries(args config.Args) ([]entry.Entry, error) { + dedup := make(map[string]entry.Entry) - for _, path := range paths { - en, err := entry.New(path) + for maybe := range matchingEntries(args) { + if maybe.err != nil { + return []entry.Entry{}, maybe.err + } + if en, ok := dedup[maybe.en.Name()]; ok { + // If two conflicting entries (e.g. same post for mastodon and linkedin) + // select the one which was modified latest. + after, err := en.After(maybe.en) if err != nil { - return entries, err + return []entry.Entry{}, err } - if _, ok := dedup[en.Name()]; ok { + if after { continue } - dedup[en.Name()] = struct{}{} - entries = append(entries, en) } + dedup[maybe.en.Name()] = maybe.en } + entries := make([]entry.Entry, len(dedup)) + for _, val := range dedup { + entries = append(entries, val) + } return entries, nil } |
