Skip to content

Offer to initialize a Git repository on commit - #16722

Merged
koppor merged 23 commits into
mainfrom
git-commit-add-file
Aug 30, 2026
Merged

Offer to initialize a Git repository on commit#16722
koppor merged 23 commits into
mainfrom
git-commit-add-file

Conversation

@koppor

@koppor koppor commented Aug 28, 2026

Copy link
Copy Markdown
Member

Summary

🤖 Committing a library that is not yet under version control did nothing visible. File > Git > Commit now asks whether to initialize a Git repository in the library's directory and commit the library file there; other files in that folder stay untracked, and cancelling leaves the directory untouched so a repository can be cloned into it instead.

Analogies: like honey, this change is a thin sweet layer over something that was already there; like chocolate, it melts a hard first step into an easy one; and like the moon, the repository is now reliably in orbit around your library instead of nowhere to be seen.

jabref-contrib-policy:4.2:reviewed​:ok

Steps to test

  1. Copy a .bib file and some unrelated file into a folder that is not a Git repository, then open the library in JabRef.
  2. Choose File > Git > Commit, then press "Initialize".
  3. Run git log --stat in that folder: the library file and the generated .gitignore are committed, and git status still lists the unrelated file as untracked.
  4. Press "Cancel" instead: nothing happens.

Initialize dialog

Related issues and pull requests

Closes _____

AI usage

Claude Code (model claude-opus-5), AIL4.

AI CHECKLIST.md walkthrough

1. Code self-review

Nullability and control flow

  • No == null / != null checks — JSpecify annotations (@NullMarked, @Nullable, @NonNull) used instead.
  • No Objects.requireNonNull(...) — nullability expressed via JSpecify annotations.
  • [/] New classes annotated with @NullMarked (org.jspecify.annotations.NullMarked) — only a test class was added.
  • Optional consumed with ifPresent / ifPresentOrElse / map / orElseThrow — never orElse(unusedValue) nor an isPresent() + get() block.
  • StringUtil.isBlank(...) used instead of s == null || s.isBlank().

Exceptions

  • No catch (Exception e) — only specific exceptions are caught.
  • No throw new RuntimeException(...) / IllegalStateException(...) — these tear down the whole application.
  • Logged exceptions are passed as the last logger argument (LOGGER.info("...", e)), not concatenated into the message string.

Style and idioms

  • [/] New BibEntry objects built with withers (withField, not setField) — no BibEntry created.
  • Modern Java used: List.of() / Map.of() / Set.of(), Path.of(), SequencedCollection / SequencedSet, text blocks.
  • [/] Regexes use a precompiled Pattern.compile(...) constant, not String.matches(...) — no regex.
  • [/] Background work uses org.jabref.logic.util.BackgroundTask, not new Thread() — no background work.
  • No commented-out code, no trivial comments restating the code, no AI-disclosure comments in source.
  • Markdown Javadoc (///) uses Markdown syntax, not JavaDoc inline tags.

User-facing text

  • All user-facing text localized (Localization.lang in Java, % prefix in FXML).
  • Sentence case (not Title Case); no trailing !; labels do not end with :.
  • Variance expressed with placeholders ("...: %0"), not string concatenation.

Security

  • [/] User-controlled data HTML-escaped before being written into any text/html response — no HTTP response involved.

Tests

  • [/] Behavior changes in org.jabref.model / org.jabref.logic have added or updated tests — the change is in org.jabref.gui; it is covered by a new GitCommitActionTest.
  • Tests assert object contents (assertEquals), use plain JUnit asserts, have no @DisplayName, do not catch exceptions, and use @TempDir.
  • [/] Fetcher tests hit the live endpoints — no fetcher involved.

2. Verification commands

  • ./gradlew :jablib:check — ran the affected tests (org.jabref.logic.git.*, org.jabref.logic.l10n.*) plus :jabgui:test --tests "org.jabref.gui.git.*".
  • ./gradlew checkstyleMain checkstyleTest checkstyleJmh.
  • ./gradlew modernizer.
  • ./gradlew --no-configuration-cache :rewriteDryRun reports no changes.
  • ./gradlew javadoc.
  • npx markdownlint-cli2 "docs/**/*.md" "*.md".
  • Only if formatting is still off after rewriteRun: IntelliJ formatter run over the changed files.

3. Documentation

  • CHANGELOG.md entry added if the change is visible to the user.
  • Searched jabref/issues and jabref-koppor/issues for a related issue; none matched confidently.
  • Requirement added to docs/requirements/<area>.md (req~ux.git-commit.initialize-repository~1).
  • [/] Developer documentation under docs/ updated — architecture unchanged.

4. Pull request

  • PR body built from .github/PULL_REQUEST_TEMPLATE.md, every section filled.
  • All checklist items kept and marked [x], [ ], or [/].
  • All HTML comments removed from the PR body.
  • PR created with gh pr create --body-file <file>.
  • The TODO placeholder in CHANGELOG.md is replaced with the real PR-number link after PR creation.

Checklist

  • I own the copyright of the code submitted and I license it under the MIT license
  • If AI tools were used, I disclosed them in the "AI usage" section and reviewed, understood, and take full ownership of all AI-generated code
  • I manually tested my changes in running JabRef (always required)
  • I added JUnit tests for changes (if applicable)
  • I added screenshots in the PR description (if change is visible to the user)
  • I added one sentence (max 20 words) to CHANGELOG.md describing the change from the user's point of view (if the change is visible to the user)
  • [/] I checked the user documentation for up to dateness and submitted a pull request to our user documentation repository — the Git integration is not documented there yet

🤖 Generated with Claude Code

koppor and others added 2 commits August 28, 2026 06:40
File > Git > Commit silently did nothing for a library that is not under
version control. It now asks whether to initialize a repository in the
library's directory, which puts the library file under version control.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B68mvL83LJqiLNaUaEYWyx
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B68mvL83LJqiLNaUaEYWyx
@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

PR Summary by Qodo

Offer Git repository initialization when committing a library

✨ Enhancement 🐞 Bug fix 🧪 Tests 📝 Documentation 🕐 40+ Minutes

Grey Divider

AI Description

• Prompt users to initialize Git when committing an unversioned library.
• Commit only the library and generated .gitignore, leaving unrelated files untracked.
• Run initialization asynchronously with rollback, symlink handling, localization, and tests.
Diagram

graph TD
    A["Commit action"] --> B["Resolve real path"] --> C{"Repository found?"}
    C -->|Yes| D["Commit dialog"]
    C -->|No| E{"Initialize?"}
    E -->|No| F["Leave unchanged"]
    E -->|Yes| G["Background task"] --> H["Git init commit"]
Loading
High-Level Assessment

The chosen approach is appropriate: retain the established commit dialog for existing repositories, require explicit consent before initialization, and use a dedicated transactional Git operation that selectively stages files and rolls back failures. Automatic initialization was correctly avoided because cancellation must preserve cloning options, while reusing the broader initializer would risk unintended repository contents.

Files changed (10) +366 / -21

Enhancement (3) +159 / -15
MainMenu.javaInject Git initialization dependencies into commit action +1/-1

Inject Git initialization dependencies into commit action

• Passes the shared task executor and Git handler registry into 'GitCommitAction' so initialization can run asynchronously through managed handlers.

jabgui/src/main/java/org/jabref/gui/frame/MainMenu.java

GitCommitAction.javaPrompt and initialize Git for unversioned libraries +68/-10

Prompt and initialize Git for unversioned libraries

• Resolves the library's real path, detects missing repositories, and offers initialization before opening the normal commit dialog. Confirmed initialization runs in a background task with localized success and failure feedback; cancellation performs no filesystem changes.

jabgui/src/main/java/org/jabref/gui/git/GitCommitAction.java

GitHandler.javaAdd selective transactional repository initialization +90/-4

Add selective transactional repository initialization

• Adds real-path resolution and a synchronized 'initAndCommit' operation that initializes 'main', stages only the requested library plus a generated '.gitignore', and validates index entries. It preserves pre-existing ignore files and Git entries, rejects out-of-root files, and rolls back artifacts after failures.

jablib/src/main/java/org/jabref/logic/git/GitHandler.java

Bug fix (1) +2 / -2
GitCommitDialogViewModel.javaResolve symlinked libraries before committing +2/-2

Resolve symlinked libraries before committing

• Uses the real library path for repository lookup and tracked-file selection, preventing commits from targeting only a symlink. Also normalizes the failure dialog title to sentence case.

jabgui/src/main/java/org/jabref/gui/git/GitCommitDialogViewModel.java

Refactor (1) +1 / -1
GitCommitDialogView.javaNormalize Git commit dialog capitalization +1/-1

Normalize Git commit dialog capitalization

• Changes the dialog title to sentence case for user-interface consistency.

jabgui/src/main/java/org/jabref/gui/git/GitCommitDialogView.java

Tests (2) +185 / -1
GitCommitActionTest.javaTest initialization confirmation and cancellation flows +73/-1

Test initialization confirmation and cancellation flows

• Adds integration-style action tests proving confirmation creates a repository while leaving unrelated files untracked. Verifies cancellation leaves the library directory untouched and updates construction for the new dependencies.

jabgui/src/test/java/org/jabref/gui/git/GitCommitActionTest.java

GitHandlerTest.javaCover selective initialization and rollback edge cases +112/-0

Cover selective initialization and rollback edge cases

• Tests exact committed paths, unrelated and nested files, outside-root rejection, dangling '.git' symlinks, preservation of existing '.gitignore', and cleanup when ignore rules prevent staging.

jablib/src/test/java/org/jabref/logic/git/GitHandlerTest.java

Documentation (2) +10 / -0
CHANGELOG.mdDocument repository initialization prompt +1/-0

Document repository initialization prompt

• Adds a user-facing changelog entry for offering Git initialization when committing an unversioned library.

CHANGELOG.md

ux.mdSpecify unversioned-library commit behavior +9/-0

Specify unversioned-library commit behavior

• Defines the initialization prompt, selective commit scope, and cancellation requirement. Links the requirement to implementation and unit-test coverage.

docs/requirements/ux.md

Other (1) +9 / -2
JabRef_en.propertiesLocalize Git initialization messages +9/-2

Localize Git initialization messages

• Adds confirmation, action, success, conflict, staging-error, and initialization-error strings. Existing Git commit titles are converted to sentence case.

jablib/src/main/resources/l10n/JabRef_en.properties

@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (2) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Action required

1. Git Commit uses title case ✓ Resolved 📘 Rule violation ⚙ Maintainability
Description
The newly added confirmation and error dialogs use Git Commit, capitalizing the common noun
Commit instead of following sentence case. This violates the required JabRef UI text style for
changed user-facing text.
Code

jabgui/src/main/java/org/jabref/gui/git/GitCommitAction.java[73]

+                Localization.lang("Git Commit"),
Evidence
PR Compliance ID 18 explicitly rejects changed UI text in title case, while the new confirmation
dialog at line 73 supplies Git Commit as its visible title; the same new flow repeats it for the
error dialog at line 89.

AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style: AGENTS.md: Follow JabRef User Interface Text Style
jabgui/src/main/java/org/jabref/gui/git/GitCommitAction.java[72-76]
jabgui/src/main/java/org/jabref/gui/git/GitCommitAction.java[88-91]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new Git initialization dialogs use the title-cased user-facing text `Git Commit` rather than sentence case.
## Issue Context
JabRef UI text must use sentence case. Update both new dialog title call sites and use an appropriately localized sentence-case string.
## Fix Focus Areas
- jabgui/src/main/java/org/jabref/gui/git/GitCommitAction.java[73-90]
- jablib/src/main/resources/l10n/JabRef_en.properties[3600-3609]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Rollback deletes existing .git link ✓ Resolved 📘 Rule violation ☼ Reliability
Description
initAndCommit checks for .git separately from initialization, follows links when checking
existence, and then unconditionally deletes .git on failure, so rollback can remove a pre-existing
dangling symlink or a repository created by another actor in the intervening race. The same race can
also cause staging and committing into a newly created repository that this invocation does not own.
Code

jablib/src/main/java/org/jabref/logic/git/GitHandler.java[158]

+                FileUtils.delete(repositoryRoot.resolve(Constants.DOT_GIT).toFile(), FileUtils.RECURSIVE | FileUtils.SKIP_MISSING);
Evidence
Rule 1 requires compatibility-preserving, maintainable changes, but isGitRepository() uses
link-following Files.exists, while pre-existing .gitignore entries are tracked with
NOFOLLOW_LINKS and .git has no equivalent ownership check before rollback deletes it. The
existence check and Git.init() are separate operations without an ownership token or atomic
exclusion, and registry locking is limited to a handler cached under a lexical normalized path
rather than the filesystem directory across all actors, so neither a dangling user-owned .git link
nor a concurrently created repository is protected from recursive cleanup.

AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Scope
jablib/src/main/java/org/jabref/logic/git/GitHandler.java[122-133]
jablib/src/main/java/org/jabref/logic/git/GitHandler.java[155-160]
jablib/src/main/java/org/jabref/logic/git/GitHandler.java[227-232]
jablib/src/main/java/org/jabref/logic/git/GitHandler.java[107-110]
jablib/src/main/java/org/jabref/logic/git/GitHandler.java[122-139]
jablib/src/main/java/org/jabref/logic/git/GitHandler.java[155-166]
jablib/src/main/java/org/jabref/logic/git/util/GitHandlerRegistry.java[22-32]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Fix `initAndCommit` so initialization rollback cannot delete a pre-existing dangling `.git` symlink or a Git repository created by another actor between the initial existence check and `Git.init()`. Rollback must remove only repository state that this invocation can prove it exclusively created, and the operation must not stage or commit into a concurrently created repository it does not own.
## Issue Context
`isGitRepository()` follows links when checking whether `.git` exists, so a pre-existing dangling symlink is reported as absent. Although the code protects pre-existing `.gitignore` entries using `NOFOLLOW_LINKS`, it does not perform equivalent ownership tracking for `.git`, and cleanup unconditionally deletes `.git` after caught initialization, staging, or commit failures.
The existence check and `Git.init()` are separate operations with no ownership token or atomic exclusion. The method-level `synchronized` lock protects only the current `GitHandler` instance, while registry locking is scoped to a handler cached under a lexical normalized path and cannot exclude external Git processes or handlers reached through another path alias.
## Fix Focus Areas
- jablib/src/main/java/org/jabref/logic/git/GitHandler.java[122-166]
- jablib/src/main/java/org/jabref/logic/git/util/GitHandlerRegistry.java[29-32]
- jablib/src/test/java/org/jabref/logic/git/GitHandlerTest.java[171-184]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. resolveToRealPath return nullness ambiguous 📘 Rule violation ≡ Correctness
Description
The new public resolveToRealPath API annotates its parameter but leaves its Path return type
unannotated in a class that is not @NullMarked. Callers therefore do not receive the explicit
non-null contract guaranteed by both return branches.
Code

jablib/src/main/java/org/jabref/logic/git/GitHandler.java[113]

+    public static Path resolveToRealPath(@NonNull Path path) {
Evidence
Rule 36 rejects ambiguous nullability on new public APIs. GitHandler has no @NullMarked
annotation, and the new signature applies @NonNull only to path, leaving the returned Path
unspecified.

jablib/src/main/java/org/jabref/logic/git/GitHandler.java[47-49]
jablib/src/main/java/org/jabref/logic/git/GitHandler.java[113-119]
Best Practice: Learned patterns

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new public `resolveToRealPath` method has an ambiguous return nullness contract even though it always returns a non-null `Path`.
## Issue Context
`GitHandler` is not `@NullMarked`; annotating only the parameter does not establish nullness for the return type. Add a precise JSpecify return annotation or safely place the class under `@NullMarked` after validating existing members.
## Fix Focus Areas
- jablib/src/main/java/org/jabref/logic/git/GitHandler.java[47-49]
- jablib/src/main/java/org/jabref/logic/git/GitHandler.java[113-119]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


View high (1)
4. Cleanup failure is not logged 📘 Rule violation ◔ Observability
Description
The rollback catch attaches cleanupException as suppressed but never logs that caught throwable.
If a caller does not log the rethrown primary exception, diagnostics for an incomplete rollback are
lost.
Code

jablib/src/main/java/org/jabref/logic/git/GitHandler.java[R151-152]

+            } catch (IOException cleanupException) {
+                e.addSuppressed(cleanupException);
Evidence
PR Compliance ID 13 requires every caught exception to be logged at DEBUG or higher with the
throwable as the final argument. The new catch only invokes e.addSuppressed(cleanupException) and
contains no logger call for the caught cleanup failure.

AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the Throwable as the Final Argument: AGENTS.md: Log Caught Exceptions with the...

Comment thread CHANGELOG.md Outdated
Comment thread jabgui/src/test/java/org/jabref/gui/git/GitCommitActionTest.java
Comment thread jabgui/src/test/java/org/jabref/gui/git/GitCommitActionTest.java Outdated
Comment thread jabgui/src/test/java/org/jabref/gui/git/GitCommitActionTest.java Outdated
Comment thread jabgui/src/main/java/org/jabref/gui/git/GitCommitAction.java
Comment thread jabgui/src/main/java/org/jabref/gui/git/GitCommitAction.java Outdated
Comment thread jabgui/src/main/java/org/jabref/gui/git/GitCommitAction.java Outdated
Comment thread jabgui/src/main/java/org/jabref/gui/git/GitCommitAction.java Outdated
The initial commit staged the whole directory, so unrelated files next to
the library (PDFs, notes, other libraries) were committed without the user
knowing. It now contains the library file and the generated .gitignore only,
and the confirmation dialog says so.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B68mvL83LJqiLNaUaEYWyx
@koppor
koppor marked this pull request as draft August 28, 2026 04:54
koppor and others added 3 commits August 28, 2026 06:58
Initializing the repository and creating the first commit touch the file
system, so they no longer block the JavaFX thread; the success notification
and the error dialog stay on it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B68mvL83LJqiLNaUaEYWyx
An ignore rule can silently exclude the library from `git add` while the
repository and its first commit are still created. The initial commit is now
checked for the library file and reports an error instead of success.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B68mvL83LJqiLNaUaEYWyx
@github-actions github-actions Bot added the status: changes-required Pull requests that are not yet complete label Aug 28, 2026
@koppor
koppor marked this pull request as ready for review August 28, 2026 06:49
Comment thread jablib/src/main/resources/l10n/JabRef_en.properties Outdated
Comment thread jabgui/src/main/java/org/jabref/gui/git/GitCommitAction.java Outdated
Comment thread jablib/src/test/java/org/jabref/logic/git/GitHandlerTest.java
Comment thread jabgui/src/main/java/org/jabref/gui/git/GitCommitAction.java Outdated
Comment thread jablib/src/main/java/org/jabref/logic/git/GitHandler.java
@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit ac53f15

@koppor
koppor marked this pull request as draft August 28, 2026 11:05
Validate that the library is staged before the initial commit is created and remove the repository (and a generated .gitignore) again on failure, so the user can retry or clone instead. Log initialization failures, name the decline action, and assert the initial commit's contents in the test.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QAbJaFZxuFYgKVe71sFvMg
@koppor
koppor marked this pull request as ready for review August 28, 2026 11:09
Comment thread jablib/src/main/java/org/jabref/logic/git/GitHandler.java Outdated
Comment thread jablib/src/main/java/org/jabref/logic/git/GitHandler.java Outdated
Comment thread jabgui/src/test/java/org/jabref/gui/git/GitCommitActionTest.java Outdated
@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit d278073

koppor and others added 2 commits August 28, 2026 14:00
@koppor
koppor marked this pull request as draft August 28, 2026 12:02
@koppor
koppor marked this pull request as ready for review August 28, 2026 12:04
@github-actions github-actions Bot added status: ready-for-review Pull Requests that are ready to be reviewed by the maintainers and removed status: changes-required Pull requests that are not yet complete labels Aug 28, 2026
Comment thread jablib/src/main/java/org/jabref/logic/git/GitHandler.java Outdated
Comment thread jablib/src/main/java/org/jabref/logic/git/GitHandler.java
Comment thread jabgui/src/main/java/org/jabref/gui/git/GitCommitAction.java Outdated
Comment thread jablib/src/main/java/org/jabref/logic/git/GitHandler.java Outdated
@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit d4b2ada

@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit 2085dcb

@koppor
koppor marked this pull request as draft August 30, 2026 21:30
…s, annotate return

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QAbJaFZxuFYgKVe71sFvMg
@koppor
koppor marked this pull request as ready for review August 30, 2026 21:32
@github-actions github-actions Bot added status: changes-required Pull requests that are not yet complete and removed status: ready-for-review Pull Requests that are ready to be reviewed by the maintainers labels Aug 30, 2026
Comment thread jabgui/src/main/java/org/jabref/gui/git/GitCommitAction.java Outdated
@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit cb89182

# Conflicts:
#	jabgui/src/main/java/org/jabref/gui/frame/MainMenu.java
#	jabgui/src/main/java/org/jabref/gui/git/GitCommitAction.java
#	jabgui/src/test/java/org/jabref/gui/git/GitCommitActionTest.java
@koppor
koppor marked this pull request as draft August 30, 2026 21:38
@koppor
koppor marked this pull request as ready for review August 30, 2026 21:39
Comment thread jablib/src/main/resources/l10n/JabRef_en.properties
@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit 7840193

@koppor
koppor enabled auto-merge August 30, 2026 21:42
calixtus
calixtus previously approved these changes Aug 30, 2026
…ate fields

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QAbJaFZxuFYgKVe71sFvMg
@koppor koppor added the automerge PR is tagged with that label will be merged if workflows are green label Aug 30, 2026
@koppor koppor removed the automerge PR is tagged with that label will be merged if workflows are green label Aug 30, 2026
@koppor
koppor added this pull request to the merge queue Aug 30, 2026
@github-actions github-actions Bot added the status: to-be-merged PRs which are accepted and should go into the merge-queue. label Aug 30, 2026
Merged via the queue into main with commit f142605 Aug 30, 2026
81 of 91 checks passed
@koppor
koppor deleted the git-commit-add-file branch August 30, 2026 22:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

component: git status: changes-required Pull requests that are not yet complete status: to-be-merged PRs which are accepted and should go into the merge-queue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants