aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/feed/cache.go6
-rw-r--r--internal/feed/state.go14
-rw-r--r--main.go34
3 files changed, 38 insertions, 16 deletions
diff --git a/internal/feed/cache.go b/internal/feed/cache.go
index df7559b..0b2f905 100644
--- a/internal/feed/cache.go
+++ b/internal/feed/cache.go
@@ -70,12 +70,16 @@ func storeCache(cache Cache, fileName string) error {
return nil
}
+func newCache() (Cache, error) {
+ return cacheForVersion(currentVersion)
+}
+
func loadCache(fileName string) (Cache, error) {
f, err := os.Open(fileName)
if err != nil {
if errors.Is(err, os.ErrNotExist) {
// no cache there yet -- make new
- return cacheForVersion(currentVersion)
+ return newCache()
}
return nil, fmt.Errorf("opening cache at '%s': %w", fileName, err)
}
diff --git a/internal/feed/state.go b/internal/feed/state.go
index 154fafd..a060a77 100644
--- a/internal/feed/state.go
+++ b/internal/feed/state.go
@@ -34,8 +34,18 @@ func (state *State) ForeachGo(goFunc func(*Feed)) {
wg.Wait()
}
-func (state *State) LoadCache(fileName string) error {
- cache, err := loadCache(fileName)
+func (state *State) LoadCache(fileName string, forceNew bool) error {
+ var (
+ cache Cache
+ err error
+ )
+
+ if forceNew {
+ cache, err = newCache()
+ } else {
+ cache, err = loadCache(fileName)
+ }
+
if err != nil {
return err
}
diff --git a/main.go b/main.go
index 08640d1..24cb0a4 100644
--- a/main.go
+++ b/main.go
@@ -16,15 +16,17 @@ var cfgFile = flag.String("f", "config.yml", "configuration file")
var cacheFile = flag.String("c", "feed.cache", "cache file")
var verbose = flag.Bool("v", false, "enable verbose output")
var debug = flag.Bool("d", false, "enable debug output")
+var dryRun = flag.Bool("dry-run", false, "do everything short of uploading and writing the cache")
+var buildCache = flag.Bool("build-cache", false, "only (re)build the cache; useful after migration or when the cache is lost or corrupted")
-func processFeed(feed *feed.Feed, cfg *config.Config, client *imap.Client) {
+func processFeed(feed *feed.Feed, cfg *config.Config, client *imap.Client, dryRun bool) {
mails, err := feed.ToMails(cfg)
if err != nil {
log.Errorf("Processing items of feed %s: %s", feed.Name, err)
return
}
- if len(mails) == 0 {
+ if dryRun || len(mails) == 0 {
feed.MarkSuccess()
return
}
@@ -66,7 +68,7 @@ func run() error {
state := feed.NewState(cfg)
- err = state.LoadCache(*cacheFile)
+ err = state.LoadCache(*cacheFile, *buildCache)
if err != nil {
return err
}
@@ -89,19 +91,25 @@ func run() error {
return fmt.Errorf("parsing 'target': %w", err)
}
- c, err := imap.Connect(imapUrl)
- if err != nil {
- return err
- }
+ var c *imap.Client
+ if !*dryRun && !*buildCache {
+ if c, err = imap.Connect(imapUrl); err != nil {
+ return err
+ }
- defer c.Disconnect()
+ defer c.Disconnect()
+ }
- state.ForeachGo(func(f *feed.Feed) {
- processFeed(f, cfg, c)
- })
+ if !*buildCache {
+ state.ForeachGo(func(f *feed.Feed) {
+ processFeed(f, cfg, c, *dryRun)
+ })
+ }
- if err = state.StoreCache(*cacheFile); err != nil {
- return err
+ if !*dryRun {
+ if err = state.StoreCache(*cacheFile); err != nil {
+ return err
+ }
}
return nil