summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-12-25 23:27:01 +0200
committerPaul Buetow <paul@buetow.org>2024-12-25 23:27:01 +0200
commit35f393acae883eecdac98d2fceb85961f05ca848 (patch)
tree9bd3b554693f35cee6665a3177b139bec74fe94c
parent17b6631a084062f06dcd39da44bedcd6bc26a839 (diff)
use range over functions to get all the entries
-rw-r--r--internal/entry/entry.go20
-rw-r--r--internal/summary/summary.go55
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
}