Repository navigation
Release v2.17
The largest release in a while: a restructuring of the git-backup/undo machinery, safer and clearer duplicate resolution, several new commands, and many bug fixes.
Behavior changes
- Git-tracking is on by default for fresh installs (when a git binary is available), so
papers undo/redowork in full depth out of the box.--no-gitopts out; backing up the PDF files themselves (--git-lfs) remains opt-in. Existing installs keep their saved setting. - Fresh installs are local by default (a
.papersconfig.jsonin the current directory — one library per project).--globalrequests the account-wide configuration; an existing install keeps its scope when you re-runpapers install. papers installnow updates an existing configuration: options you pass change, everything else is kept. Use--resetto start over from defaults. The interactive "Overwrite or Edit?" and "delete the other config?" dialogs are gone; answeringnoat a prompt no longer unsets a value (useunset).--no-promptis the primary name for non-interactive installs (--forceremains an alias).- Undo/redo never lose history. Undo, redo and
restore-backup --refrecord restore commits instead of resetting branches, so making a new change while undone no longer discards the states that were still redoable. Backup repositories from older versions are adopted automatically on first use. - Backup directories have a unique identity: named after the parent folder, the bibtex file and a path hash (e.g.
myproject-references-3f9a1c2b), with a manifest recording which library each belongs to. Two same-named libraries can no longer share (and corrupt) one backup. The backup repo now tracks the bibtex under its own name; no manual migration needed. - Config/data/cache locations now come from
platformdirs— identical paths on Linux, platform-appropriate ones on macOS/Windows (with automatic migration of the old locations). - Auto-generated fallback keys use the slugified DOI instead of the raw one (#105).
New
papers backup list/papers backup remove NAME— see every backup directory and which library it belongs to; clean up orphans.papers open KEY— open the file(s) attached to an entry (#80).papers extractaccepts several files (papers extract *.pdf) and--recursivedirectory scans (from #92).papers status -vshows how many file links the bibliography references, next to the on-disk count (from #97).papers uninstallreports what it leaves behind;--remove-backupalso removes the backup directory.
Fixes
- Duplicate resolution: "Skip all" no longer deletes the unprocessed duplicate groups; merging no longer crashes on save;
check --duplicates -m mactually merges; editing entries validates the editor round-trip; entries without a DOI no longer break the interactive loop; the dialogs explain what each choice does, deleting a group asks for confirmation, and(q)uitexits safely. - File paths containing colons parse correctly (#95), and empty path entries no longer cause "Is a directory" errors with
--git-lfs(#91). .PDFfiles are no longer skipped (#94);papers add . --recursiveno longer skips the scan root (#100).- The request cache survives corrupt files and is safe under concurrent papers processes (#99).
papers list --first-authorworks;papers add --ignore-errorsworks;papers check --forceno longer prompts;uninstallno longer removes the config's parent directory; local configs support files directories outside the library folder (../paths).
Internal
- Git plumbing extracted to
papers/backup.py(noshell=Trueanywhere); install logic split into testable resolution + apply steps (papers/install.py); import-time side effects removed; test suite grown from 292 to 344 tests.