Closes #1239 - ArchiveEntry: add updated_at field, content_hash property, touch() - MnemosyneArchive.update_entry(): update title/content/metadata, auto re-link - MnemosyneArchive.find_by_hash(): lookup by SHA-256 of title+content - MnemosyneArchive.find_duplicates(): find groups of identical entries - MnemosyneArchive.add(skip_dups=True): skip duplicate entries on ingest - Backward compat: from_dict backfills updated_at for legacy entries - 18 new tests, all passing
126 KiB
126 KiB