Repository navigation
Conversation
Copies that Dropbox, Nextcloud, OneDrive, or Syncthing leave next to a synchronized library are merged with the same rules as the library file itself, and offered for deletion once nothing of them is left to review. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GWmXyN3GUNhfF9fSo1UNrt
PR Summary by QodoMerge sync-client conflicted copies into synchronized libraries
AI Description
Diagram
High-Level Assessment
Files changed (21)
|
Code Review by Qodo
1.
|
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GWmXyN3GUNhfF9fSo1UNrt
Every copy is a complete snapshot taken from the same baseline, so they are merged against it one after the other instead of each against the state the previous one left. A copy scan no longer cancels a running library scan, an unreadable copy is reported instead of passing as merged, a copy is retried after a failed or discarded merge, its contents are awaited like the library file's, copies are also looked for when synchronization is switched on, and a copy needing review keeps the library's own review notification and offers deletion after the review. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GWmXyN3GUNhfF9fSo1UNrt
|
Code review by qodo was updated up to the latest commit 73fbd87 |
|
The requested changes were not addressed for 3 days. Please follow-up in the next 7 days or your PR will be automatically closed. You can check the contributing guidelines for hints on the pull request process. |
…copies # Conflicts: # jabgui/src/main/java/org/jabref/gui/collab/DatabaseChangeMonitor.java
…, delete only the merged state Also null-marks the scanner and makes the OneDrive name test independent of the host environment. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GWmXyN3GUNhfF9fSo1UNrt
…copies # Conflicts: # jabgui/src/main/java/org/jabref/gui/collab/ChangeScanner.java # jabgui/src/main/java/org/jabref/gui/collab/DatabaseChangeMonitor.java
…copies # Conflicts: # jabgui/src/main/java/org/jabref/gui/collab/DatabaseChangeMonitor.java
…copies # Conflicts: # jabgui/src/main/java/org/jabref/gui/collab/DatabaseChangeMonitor.java
…copies A conflicted copy neither moves the baseline nor marks the library clean: relative to the library file, what was taken over from a copy is an unsaved edit. Wording follows the renamed option, and the changelog entry moves back to the unreleased section. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…copies # Conflicts: # docs/requirements/ux.md
|
🤖 Generated with Claude Code Merged the base branch Conflicting file:
Generated by Claude Code |
JabRef:main-table-multi-sort-req (#773) JabRef:add-oauth2 (JabRef#14493) JabRef:add-import-via-browser (JabRef#16124) JabRef:conflicted-copies (JabRef#16827) JabRef:backup-timing (JabRef#16890) JabRef:dblclick-new-entry (JabRef#16929) JabRef:warn-legacy-library (JabRef#17132) JabRef:entry-editor-resize-scroll (JabRef#17167) JabRef:fix-ai-summary-regenerate-custom (JabRef#17236) JabRef:bibframe (JabRef#17292) JabRef:fix/keep-unsynced-groups (JabRef#17324) JabRef:ai-context-window-default (JabRef#17326) JabRef:fix-typo-requirements-docs (JabRef#17327)

Summary
🤖 Stacked on #16813. When two machines change a library set to automatically merge external changes between two syncs, Dropbox, Nextcloud, OneDrive, and Syncthing keep the other version as a "conflicted copy" next to the library. JabRef now merges such copies into the open library with the same rules as the library file itself (silently unless the same item was changed differently in both) and offers to delete the copy once nothing of it is left to review.
Analogies: like honey, the second jar gets poured into the first instead of sitting on the shelf; like chocolate, two halves make one bar again; like the moon, the conflicted copy was the dark side of the sync, now it comes into view and disappears.
jabref-contrib-policy:4.2:reviewed:okSteps to test
.bibfile and set both "Automatically merge external changes" and "Merge conflicted copies left by sync clients" to On in Library → Library properties → Saving (or enable the global defaults in Preferences → General → Saving; all off by default).<name> (conflicted copy 2026-09-03).bibwith the same entries plus a changed field and a new entry.Before: no such option; a conflicted copy was left where the sync client put it.
After (Preferences → General → Saving, global defaults):
After (Library properties → Saving, per library):
Related issues and pull requests
Stacked on #16813. Relies on #16826 for the merged state to be written back automatically.
AI usage
Claude Code (model claude-fable-5-1), AIL4: implementation, tests, and the Xvfb check driven by the AI, directed and reviewed by the author.
AI CHECKLIST.md walkthrough
1. Code self-review
@NullMarkedon the new class,@Nullablewhere a copy may be absent.IOExceptioncaught, logged as last argument.List.of, precompiledPattern,BackgroundTask, Markdown Javadoc.ConflictedCopiesTestwith plain JUnit asserts and@TempDir.2. Verification commands
ConflictedCopiesTest, the collab tests, andLocalizationConsistencyTestpass.checkstyleMain checkstyleTestfor jablib and jabgui.modernizer,javadoc.rewriteRunreports no changes.markdownlint-cli2on the changed Markdown.3. Documentation
CHANGELOG.mdentry added.docs/requirements/ux.md.4. Pull request
--body-file.TODOplaceholder replaced with the PR link after creation.Checklist
CHANGELOG.mddescribing the change from the user's point of view (if the change is visible to the user)🤖 Generated with Claude Code