4 years agoThread limit fetching
Jack Miller [Tue, 16 Jun 2015 23:21:07 +0000 (18:21 -0500)]
Thread limit fetching

- Defaults to number of cpus (as reported by multiprocessing.cpu_count)

4 years agoGive feed objects better string representation
Jack Miller [Tue, 16 Jun 2015 23:19:27 +0000 (18:19 -0500)]
Give feed objects better string representation

4 years agoRemove unused constant
Jack Miller [Tue, 16 Jun 2015 21:39:08 +0000 (16:39 -0500)]
Remove unused constant

4 years agoStop using shelve
Jack Miller [Tue, 16 Jun 2015 20:53:25 +0000 (15:53 -0500)]
Stop using shelve

NOTE: This will automatically migrate old shelves.

- Copying shelve dbs is a fucking pain and has caused breakage when
  moving from one distro / OS to another when the available lightweight
DBs change.

- We use basically no database features, except the "cache" which is
  really just the DB holding the entire database in memory which we can
also do with greater control (there has been 0 change in memory usage
with this patch).

- We have to workaround the database constantly expanding in size with
  some databases (GDBM requires reorganize())

- Shelves don't (as far as I can see) play well with transparent
  compression and it doesn't look like it does any compression itself,
so by just gzipping raw JSON, we can shrink the feeds file by 80%.

- Internally, shelves use pickle, which is a Python only serialization.
  This isn't important at the moment, but gzipped JSON is platform

- Replace my feed dump script with zcat =P.

4 years agoRemove extraneous debug
Jack Miller [Tue, 16 Jun 2015 07:25:51 +0000 (02:25 -0500)]
Remove extraneous debug

4 years agoRefactor tag handling on feed index and setattributes
Jack Miller [Tue, 16 Jun 2015 07:21:11 +0000 (02:21 -0500)]
Refactor tag handling on feed index and setattributes

- Simplified set_attribute tag logic, and should re-apply filters on
  changing attributes.

4 years agoStop paginating items
Jack Miller [Mon, 15 Jun 2015 22:14:35 +0000 (17:14 -0500)]
Stop paginating items

ITEMSDONE is still present, but obsolete.

4 years agoChange how protocol messages are sent.
Jack Miller [Mon, 15 Jun 2015 22:12:47 +0000 (17:12 -0500)]
Change how protocol messages are sent.

It's better to just know the size right off the bat than do this
fragment management and add the possibility of a small message getting
held up in a buffer waiting for it to fill.

4 years agoDo transforms on tag changes instead of on ITEMS
Jack Miller [Mon, 15 Jun 2015 21:08:10 +0000 (16:08 -0500)]
Do transforms on tag changes instead of on ITEMS

4 years agoFeed index: convert items to IDs later
Jack Miller [Mon, 15 Jun 2015 15:59:48 +0000 (10:59 -0500)]
Feed index: convert items to IDs later

- Less confusing for sync plugins
- Easier to work with for the next stuff

4 years agoUpdate manpage plugins sections
Jack Miller [Sat, 13 Jun 2015 00:09:48 +0000 (19:09 -0500)]
Update manpage plugins sections

- Remove sync/sync-rsync differentiation
- Add sync-inoreader

4 years agoInoreader sync: better auth/error handling
Jack Miller [Thu, 11 Jun 2015 20:45:58 +0000 (15:45 -0500)]
Inoreader sync: better auth/error handling

- Should be able to reauthorize on 401
- Deals with being disconnected from the internet better (will keep
  trying, but also won't spam log with exceptions)
- Should be able to stop itself when the API rate limit has kicked in

Still need a better way to get these errors into the client.

4 years agoAdd canto-remote status command to print item counts
Jack Miller [Mon, 8 Jun 2015 18:05:54 +0000 (13:05 -0500)]
Add canto-remote status command to print item counts

4 years agoUpdate remote user agent
Jack Miller [Mon, 8 Jun 2015 17:08:42 +0000 (12:08 -0500)]
Update remote user agent

4 years agoMinor help text fix in remote
Jack Miller [Mon, 8 Jun 2015 16:57:11 +0000 (11:57 -0500)]
Minor help text fix in remote

4 years agoFix breaking URL limit in Inoreader sync
Jack Miller [Mon, 8 Jun 2015 07:06:20 +0000 (02:06 -0500)]
Fix breaking URL limit in Inoreader sync

Grouping tag add / remove calls is good, but when you start pushing the
URL size too high, then the Inoreader server doesn't like it.

NOTE: I couldn't find actual documentation on Inoreader's server/API
limit, so I took a guess at 2048 bytes as a reasonable limit. Further
tweaking may be required.

4 years agoInoreader sync v0.3
Jack Miller [Sun, 7 Jun 2015 02:08:36 +0000 (21:08 -0500)]
Inoreader sync v0.3

- Put all the code into an API class. Once I'm done with this plugin,
  parts of it will probably be abstracted out into a generic API class
that this will inherit from, but one thing at a time.

- As discussed in the blog, merge Inoreader data into our data, so that
  we get all items across sources.

- Group large tag changes together to go easier on the API call count,
  and avoid some trouble when, for example, trying to mark 200 items
read at a time.

4 years agoUse new additems plugin hook for Inoreader
Jack Miller [Sat, 6 Jun 2015 23:28:35 +0000 (18:28 -0500)]
Use new additems plugin hook for Inoreader

This should integrate Inoreader data into Canto when Canto hasn't found
the item.

4 years agoAdd an additems plugin hook in feeds
Jack Miller [Sat, 6 Jun 2015 23:15:09 +0000 (18:15 -0500)]
Add an additems plugin hook in feeds

Allow plugins to add items before they're potentially edited.

4 years agoFix sync-rsync with global config
Jack Miller [Sat, 6 Jun 2015 00:13:53 +0000 (19:13 -0500)]
Fix sync-rsync with global config

4 years agoAdd program checks to sync-inoreader and reddit plugins
Jack Miller [Fri, 5 Jun 2015 23:53:26 +0000 (18:53 -0500)]
Add program checks to sync-inoreader and reddit plugins

4 years agoMerge and
Jack Miller [Fri, 5 Jun 2015 23:52:53 +0000 (18:52 -0500)]
Merge and

To avoid confusion, since inoreader doesn't require

4 years agoAdd check_program for plugins
Jack Miller [Fri, 5 Jun 2015 23:51:24 +0000 (18:51 -0500)]
Add check_program for plugins

Stop execution with a silent exception if this plugin will have no
effect on the currently running program.

4 years agoPrefix Inoreader attributes with canto-
Jack Miller [Fri, 5 Jun 2015 03:25:00 +0000 (22:25 -0500)]
Prefix Inoreader attributes with canto-

This causes the feed logic to automatically keep them, so older items
don't lose their ids because they're no longer in the Inoreader data.

4 years agoFix some log.debug breakage
Jack Miller [Fri, 5 Jun 2015 03:22:24 +0000 (22:22 -0500)]
Fix some log.debug breakage

4 years agoMass conversion to better log.debug use
Jack Miller [Fri, 5 Jun 2015 00:50:35 +0000 (19:50 -0500)]
Mass conversion to better log.debug use

Pass the format arguments to log.debug so we avoid the CPU hit
formatting strings we won't use.

4 years agoInoreader sync better item matching
Jack Miller [Wed, 3 Jun 2015 17:31:53 +0000 (12:31 -0500)]
Inoreader sync better item matching

- Cover the case where canto fetches an item first, it leaves the source
  feed (expires, whatever), and then later we get Inoreader data on it.
Canto should now properly synchronize all items it has, instead of just
the items that are present in the feed and Inoreader at the same time.

4 years agoFix some stuck Inoreader synchronized items
Jack Miller [Wed, 3 Jun 2015 00:43:47 +0000 (19:43 -0500)]
Fix some stuck Inoreader synchronized items

It appears that sometimes, an item will be given a ""
tag, and it will resist being set as "read" on Inoreader's side, so
don't let fresh items override our local "read" state. If you mark it in
canto, it should stay read in canto.

4 years agoInoreader sync fixes
Jack Miller [Tue, 2 Jun 2015 22:15:39 +0000 (17:15 -0500)]
Inoreader sync fixes

- Introduce canto-inoreader-sync in the feed data
- Fix initial sync to Inoreader happening too often
- Get proper ids to tags_to_add/remove

4 years agoInoreader sync v0.2
Jack Miller [Tue, 2 Jun 2015 18:17:32 +0000 (13:17 -0500)]
Inoreader sync v0.2

- Stop using Inoreader as the source for feed data. Instead, use the
  standard canto-daemon fetch, and integrate Inoreader information into
  it. I made this decision for these reasons:

    - Fuck Inoreader ads coming through Canto
    - Inoreader seems to have trouble keeping up with quick feeds, not
      to mention the daemon concept of "rate" conflicts with InoReader
    - Inoreader content is sterile, so you don't have access to any
      interesting feed content, which breaks some reader extras.
    - Can use standard canto item IDs, so no dupes when you first turn
      on the plugin.

- Better initial merging, when we first see an item in Inoreader, if the
  canto item has important state, it's sent. This means that we don't
need to have Inoreader information to do the right thing when it does
show up (i.e. items won't be set as unread when they show up in
Inoreader, but have already been touched in canto)

- Fix removing tags via Inoreader not showing up in canto

4 years agoAllow feed edit_* plugins to declare add / remove tags
Jack Miller [Tue, 2 Jun 2015 18:16:51 +0000 (13:16 -0500)]
Allow feed edit_* plugins to declare add / remove tags

4 years agoRevert "Give canto-* attributes priority if it came from fetch thread"
Jack Miller [Tue, 2 Jun 2015 17:43:56 +0000 (12:43 -0500)]
Revert "Give canto-* attributes priority if it came from fetch thread"

This is better integrated later.

This reverts commit 3de10432bd86efd844724f303541705ef957ed0c.

4 years agoTrim Inoreader sync to 200 items
Jack Miller [Mon, 1 Jun 2015 06:28:56 +0000 (01:28 -0500)]
Trim Inoreader sync to 200 items

Yeah... probably don't need to be grabbing Inoreader's entire backlog
for the feeds. This might be sufficient, but it might be better to use
some of the time based API options, this is just a quickfix.

4 years agoRemove experimental TT-RSS server
Jack Miller [Mon, 1 Jun 2015 04:12:21 +0000 (23:12 -0500)]
Remove experimental TT-RSS server

Not interested in messing with this anymore.

4 years agoInoreader synchronization plugin v0.1
Jack Miller [Mon, 1 Jun 2015 04:06:56 +0000 (23:06 -0500)]
Inoreader synchronization plugin v0.1

Read the file for some caveats, but it seems to work pretty well.

4 years agoFix internal delconfig
Jack Miller [Mon, 1 Jun 2015 03:56:06 +0000 (22:56 -0500)]
Fix internal delconfig

4 years agoMake config globally available
Jack Miller [Mon, 1 Jun 2015 03:11:00 +0000 (22:11 -0500)]
Make config globally available

Similar to allfeeds and alltags, this is something that should be easy
to get to from anywhere.

4 years agoTypo fix populating tags from old items
Jack Miller [Mon, 1 Jun 2015 01:12:38 +0000 (20:12 -0500)]
Typo fix populating tags from old items

4 years agoGive canto-* attributes priority if it came from fetch thread
Jack Miller [Mon, 1 Jun 2015 01:12:02 +0000 (20:12 -0500)]
Give canto-* attributes priority if it came from fetch thread

Lets plugins sub in internal content on fetch.

4 years ago0.9.1 v0.9.1
Jack Miller [Fri, 9 Jan 2015 21:08:41 +0000 (15:08 -0600)]

4 years agoAdd hook test
Jack Miller [Fri, 9 Jan 2015 02:51:49 +0000 (20:51 -0600)]
Add hook test

4 years agoTrim empty hooks on removals
Jack Miller [Fri, 9 Jan 2015 02:50:13 +0000 (20:50 -0600)]
Trim empty hooks on removals

Don't think this has caused any memory trouble yet (since our usecase is
a handful of long lived hooks), but these should be disposed of.

4 years agoWorkaround feedparser issue 283 (fix basic auth feeds)
Jack Miller [Thu, 8 Jan 2015 22:37:10 +0000 (16:37 -0600)]
Workaround feedparser issue 283 (fix basic auth feeds)

Apparently auth handlers are processed too late, so they need to get
bumped up to work.

With test =)

4 years agoKeep all items on empty new content
Jack Miller [Wed, 3 Dec 2014 18:19:29 +0000 (12:19 -0600)]
Keep all items on empty new content

Fixes daemon running with items over keep_time that will later appear
in the non-empty feed when we get it.

4 years agoAdd experimental TT-RSS server compatibility plugin
Jack Miller [Thu, 27 Nov 2014 06:03:53 +0000 (00:03 -0600)]
Add experimental TT-RSS server compatibility plugin

- Read-only in this version, but WIP
- Auth is non-functional

4 years agoAdd feed.index test
Jack Miller [Mon, 24 Nov 2014 23:45:16 +0000 (17:45 -0600)]
Add feed.index test

4 years agoJust remove all items and re-add them on index
Jack Miller [Mon, 24 Nov 2014 21:46:23 +0000 (15:46 -0600)]
Just remove all items and re-add them on index

- Less code, and keeps items on life support (i.e. not in the feed but
  kept around via keep_time or keep_unread ) toward the end instead of
the beginning so tag[0] is always the most recent top item.

4 years agoProperly queue up tags for old items
Jack Miller [Mon, 24 Nov 2014 16:43:41 +0000 (10:43 -0600)]
Properly queue up tags for old items

4 years agoKey hooks for mass removal
Jack Miller [Sun, 23 Nov 2014 04:55:52 +0000 (22:55 -0600)]
Key hooks for mass removal

4 years ago0.9.0 v0.9.0
Jack Miller [Wed, 19 Nov 2014 17:53:58 +0000 (11:53 -0600)]

4 years agoFix populating user tags on index()
Jack Miller [Mon, 17 Nov 2014 22:02:22 +0000 (16:02 -0600)]
Fix populating user tags on index()

4 years agoKeep needs_update() from hitting the shelf
Jack Miller [Mon, 17 Nov 2014 07:47:36 +0000 (01:47 -0600)]
Keep needs_update() from hitting the shelf

Keep a timestamp in memory instead of just in the shelf itself.

Also fixes the high CPU usage introduced in the previous commit.

4 years agoRemove pointless fetch timer
Jack Miller [Sat, 15 Nov 2014 23:16:43 +0000 (17:16 -0600)]
Remove pointless fetch timer

We already have a good mechanism in place for fetch thread timing, the
second layer of timing was just a way to waste time. At the cost of
taking feed_lock (a low contention lock) briefly once a second (instead
of once a minute) fetch work is done faster.

This is especially important on a fresh startup where there is no disk
presence already.

In addition, scale back some logging that is made annoying by the
increased frequency of some fetch calls.

4 years agoPass client verbosity onto daemon if forked
Jack Miller [Sat, 15 Nov 2014 21:10:58 +0000 (15:10 -0600)]
Pass client verbosity onto daemon if forked

(i.e. starting canto-curses -v will start canto-daemon -v if there isn't
already a daemon running)

5 years agoUpdate copyright date
Jack Miller [Fri, 7 Nov 2014 16:23:49 +0000 (10:23 -0600)]
Update copyright date

5 years agoAdd non-blocking support to RWLock
Jack Miller [Wed, 29 Oct 2014 19:43:40 +0000 (14:43 -0500)]
Add non-blocking support to RWLock

5 years agotry_plugins may now return error string
Jack Miller [Wed, 29 Oct 2014 19:15:13 +0000 (14:15 -0500)]
try_plugins may now return error string

If there were plugin-fatal errors on import, that information is
probably interesting.

5 years agoMinor logging / buffer sizing tweak
Jack Miller [Wed, 29 Oct 2014 05:08:44 +0000 (00:08 -0500)]
Minor logging / buffer sizing tweak

Drastically improves the readability of logs

5 years agoUse timestamps instead of ticking for sync
Jack Miller [Sat, 27 Sep 2014 23:58:20 +0000 (18:58 -0500)]
Use timestamps instead of ticking for sync

This should make sync work a little bit better when dealing with
suspending machines or any other reason ticks might spread out.

5 years agoDatabase mod times should be UTC
Jack Miller [Sat, 27 Sep 2014 23:44:12 +0000 (18:44 -0500)]
Database mod times should be UTC

If they're going to be used for comparison (like sync), it should be
consistent regardless of timezone.

5 years agov0.9.0-alpha5 v0.9.0-alpha5
Jack Miller [Fri, 26 Sep 2014 16:22:05 +0000 (11:22 -0500)]

5 years agoBrush up manpages
Jack Miller [Thu, 25 Sep 2014 21:33:32 +0000 (16:33 -0500)]
Brush up manpages

- Update daemon/remote command line usage
- Add plugin information to daemon manpage
- Remove .canto-ng/conf from "FILES" in an attempt to discourage hand use,
  although it's still just sitting where you'd expect =P
- Add remote command details

5 years agoFailure to parse global_transform is now fatal
Jack Miller [Thu, 25 Sep 2014 02:13:06 +0000 (21:13 -0500)]
Failure to parse global_transform is now fatal

5 years agoDon't propagate config changes that errored
Jack Miller [Thu, 25 Sep 2014 02:12:36 +0000 (21:12 -0500)]
Don't propagate config changes that errored

5 years agoAdd config notification to sync plugin
Jack Miller [Wed, 17 Sep 2014 20:42:19 +0000 (15:42 -0500)]
Add config notification to sync plugin

I'm pretty sure this is working okay (I can see the changes propagate)
but there are some changes that need to be made to c-c to automatically
refresh on some of the changes (i.e. global_transform).

5 years agoFix canto-remote export
Jack Miller [Mon, 15 Sep 2014 23:03:02 +0000 (18:03 -0500)]
Fix canto-remote export

Don't care about type detection.

5 years agov0.9.0-alpha4 v0.9.0-alpha4
Jack Miller [Mon, 15 Sep 2014 17:24:21 +0000 (12:24 -0500)]

5 years agoFix config timestamp
Jack Miller [Mon, 15 Sep 2014 06:39:04 +0000 (01:39 -0500)]
Fix config timestamp

5 years agoFix confused sync
Jack Miller [Mon, 15 Sep 2014 06:28:48 +0000 (01:28 -0500)]
Fix confused sync

syncto in loop should've been eliminated when syncfrom became sync.

5 years agoFix shelf timestamping
Jack Miller [Mon, 15 Sep 2014 06:02:33 +0000 (01:02 -0500)]
Fix shelf timestamping

- Cache is only one key deep, so we have to read-modify-write just to
  change a single key in 'control'

5 years agoMore lock tweaks
Jack Miller [Sun, 14 Sep 2014 22:49:16 +0000 (17:49 -0500)]
More lock tweaks

- Now that feed.locks are no longer serial, we can afford to properly
  lock then on apply_transforms, using a new function to take selective
feed.locks in the same order as the allfeed variants.

- Only hold most cmd_items lock during apply_transforms

- cmd_listtags holds tag_lock which is now held independently from
  feed.lock, so we don't need to get feed.locks anymore, just feed_lock
since we're using get_feeds()

- cmd_attributes holds feed_lock for the same reason, but can still
  throw exception since attributes can be requested for items that don't
match up to real feeds.

- feed_lock is no longer taken first, but in the same alphabetical order
  we use conventionally.

5 years agoBetter exception handling in locks
Jack Miller [Sun, 14 Sep 2014 22:48:11 +0000 (17:48 -0500)]
Better exception handling in locks

5 years agoAdd canto-modified information to 'control'
Jack Miller [Sun, 14 Sep 2014 22:46:53 +0000 (17:46 -0500)]
Add canto-modified information to 'control'

5 years agoget_attributes loop should break
Jack Miller [Sun, 14 Sep 2014 21:15:35 +0000 (16:15 -0500)]
get_attributes loop should break

5 years agoget_config remote feed_lock
Jack Miller [Sun, 14 Sep 2014 20:52:16 +0000 (15:52 -0500)]
get_config remote feed_lock

5 years agoFix -a and -p --help output for remote
Jack Miller [Sun, 14 Sep 2014 20:03:31 +0000 (15:03 -0500)]
Fix -a and -p --help output for remote

5 years agoRoll up locks required to parse the config
Jack Miller [Sun, 14 Sep 2014 19:33:11 +0000 (14:33 -0500)]
Roll up locks required to parse the config

- Also corrects the parse usage in sync plugin

Config users shouldn't have to know what locks the config wants, and
they could change at some point.

5 years agoSelective config reparse
Jack Miller [Sun, 14 Sep 2014 03:57:55 +0000 (22:57 -0500)]
Selective config reparse

Since we host client configuration, we should only reparse the config
when a value that actually affects the daemon is set.

The daemon-irrelevant config changes will still be written and
reflected to clients.

5 years agoAllow return all attributes
Jack Miller [Sat, 13 Sep 2014 19:37:07 +0000 (14:37 -0500)]
Allow return all attributes

When ATTRIBUTES's arg has an id with an empty list of attributes
requested, then return all of the item data.

Good for discovery of items.

5 years agoStart installing plugins to [prefix]/lib/canto/plugins
Jack Miller [Sat, 13 Sep 2014 18:13:13 +0000 (13:13 -0500)]
Start installing plugins to [prefix]/lib/canto/plugins


5 years agoStop sending TAGCHANGE on reset()
Jack Miller [Sat, 13 Sep 2014 08:03:26 +0000 (03:03 -0500)]
Stop sending TAGCHANGE on reset()

reset() will likely just be repopulating anyway, and add / remove will
handle it otherwise.

5 years agoFix sending ITEMs for empty tags
Jack Miller [Sat, 13 Sep 2014 00:45:35 +0000 (19:45 -0500)]
Fix sending ITEMs for empty tags

5 years ago0.9.0-alpha3 v0.9.0-alpha3
Jack Miller [Fri, 12 Sep 2014 20:06:45 +0000 (15:06 -0500)]

5 years agoFix expanding feed file
Jack Miller [Fri, 12 Sep 2014 07:16:14 +0000 (02:16 -0500)]
Fix expanding feed file

5 years agoExcept for maintag: leave categorization to clients
Jack Miller [Fri, 12 Sep 2014 06:04:22 +0000 (01:04 -0500)]
Except for maintag: leave categorization to clients

5 years agov0.9.0-alpha2
Jack Miller [Thu, 11 Sep 2014 02:35:56 +0000 (21:35 -0500)]

5 years agoLog version / hash
Jack Miller [Thu, 11 Sep 2014 02:35:00 +0000 (21:35 -0500)]
Log version / hash

5 years agoRemove h and help options from common args
Jack Miller [Wed, 10 Sep 2014 05:30:36 +0000 (00:30 -0500)]
Remove h and help options from common args

5 years agoImplement caching options
Jack Miller [Wed, 10 Sep 2014 04:36:16 +0000 (23:36 -0500)]
Implement caching options

So, it's come to my attention that not everyone runs the daemon on a
quick disk, and some people don't care enough about 100M of RAM to put
up with items taking seconds longer to load.

I also would like more information about memory costs of various

To accomodate, I've added a -c/--cache option that will take an

    - 'on' turns the cache on all the time (similar to before the
      minimization patches). Obviously this is the fastest, most memory

    - 'conn' heats up the cache while connections are live

    - 'off' relies on the disk for almost everything.

Off is still the default, but I'll run some fresh metrics on memory
usage over time now that the usage pattern has changed a bit.

5 years agoFixed plugin control arg parsing
Jack Miller [Wed, 10 Sep 2014 03:50:44 +0000 (22:50 -0500)]
Fixed plugin control arg parsing

This is what I get for waffling between two terms.

5 years agoAdd first connect and last connect hooks
Jack Miller [Wed, 10 Sep 2014 02:46:06 +0000 (21:46 -0500)]
Add first connect and last connect hooks

"server_first_connection" is called with no arguments when a connection
is made and there were no previously active connections. So to be clear
"first_connection" can be called multiple times as long as at some time
in between calls there were no connections.

"server_no_connections" is the inverse. It's called with no arguments
when a disconnect occurs and there are no more connections.

5 years agoProtection is eliminated.
Jack Miller [Tue, 9 Sep 2014 22:09:31 +0000 (17:09 -0500)]
Protection is eliminated.

The idea behind the protection system was that items that were sitting
in the client, but protected, would never have requests for information
fail. A noble goal. However, I've decided that it's just not worth the
effort. Here's why:

- 99.99% of the time items are protected without need. Items are already
  kept for 24 hours *after* they disappear from the source feed. So,
assuming that a client gets the item immediately before it disappears,
it still has to sit there for a full day before protection makes one bit
of difference.

- Keeping in mind that's it's extremely rare that protection would
  matter, I can't justify all of this:

    - Having logic to keep dead feeds around when they have protected

    - Having to hold a lock in feed.index to check protections

    - Having to automatically protect every item sent to a client to
      keep the whole thing from being racy.

    - Forcing the sync plugin to try and reconcile protected old items
      that no longer exist in new content.

- In addition, protection doesn't mean that attribute requests will
  never fail because attribute requests can always fail. Items might not
even have a "title" entry for Chrissakes, so it's not really saving any
complexity on the client side

- Most importantly for this argument, if you really want to make sure
  you never lose an item there's keep_unread which will keep every
single item that you haven't explicitly marked read (and works naturally
without any of the bullshit from point 2).

Filter-immune protection was eliminated as well, which caused an API
change to transforms. This system was inherently racy with
multi-threading anyway (i.e. items received before filter-immunity set)

I came up with a few solutions that kept this system alive, like keeping
protected items in memory instead of on disk (which would avoid the
technical shortcomings) but when every item in a client has to be
protected by default to keep the system from being racy the memory cost
was too great just for the 00.01% case.

5 years agoDELTAGs are now only issued for feeds that have been removed
Jack Miller [Tue, 9 Sep 2014 19:25:10 +0000 (14:25 -0500)]
DELTAGs are now only issued for feeds that have been removed

Tags aren't always mentioned in the config, so we have no idea if
they're really dead.

So, when a feed is dead, send a DELTAG for its maintag: and that's it.
Everything else will just get an empty TAGCHANGE.

5 years agoGiving --port without --address now assumes address is loopback
Jack Miller [Tue, 9 Sep 2014 17:12:09 +0000 (12:12 -0500)]
Giving --port without --address now assumes address is loopback

Thanks to ewancoder for pointing out this incompatibility

5 years agoProperly cache umod time
Jack Miller [Tue, 9 Sep 2014 16:41:40 +0000 (11:41 -0500)]
Properly cache umod time

Should fix sync timing issues.

5 years agoAdd git hashes to -V output
Jack Miller [Tue, 9 Sep 2014 05:29:33 +0000 (00:29 -0500)]
Add git hashes to -V output

This tries its best. If there's no git in PATH, it will be blank, and
it's using os.utime to touch source files to force them to be
reinstalled every time.

5 years agoQuiet sync plugin
Jack Miller [Tue, 9 Sep 2014 03:48:04 +0000 (22:48 -0500)]
Quiet sync plugin

5 years agoStandardize arg parsing
Jack Miller [Tue, 9 Sep 2014 03:38:05 +0000 (22:38 -0500)]
Standardize arg parsing

daemon, remote and curses (with a companion patch) will share a bunch of
arguments, particularly useful because the plugin switches are now
universal, as well as --help, --version etc.

5 years agoMissing -V in help text
Jack Miller [Tue, 9 Sep 2014 02:40:07 +0000 (21:40 -0500)]
Missing -V in help text

5 years agoMove remote logging init to instantiation
Jack Miller [Tue, 9 Sep 2014 02:31:02 +0000 (21:31 -0500)]
Move remote logging init to instantiation

canto_next.remote gets imported (i.e. by plugins) so don't fuck with
logging configuration unless we're actually running.