]> source.dussan.org Git - jgit.git/commit
RevolveMerger: honor ignoreConflicts also for binary files 97/1201697/5
authorKamil Musin <kamilm@google.com>
Tue, 8 Oct 2024 11:36:00 +0000 (13:36 +0200)
committerIvan Frade <ifrade@google.com>
Tue, 8 Oct 2024 18:47:19 +0000 (18:47 +0000)
commit0155f8bf6e569b487251767be985332a438ccc39
tree9e80390da724b22ee6d0ef6f4ab1a0f324faa666
parentdd8c3dab8af85a4c367949c06c648d1e6c9a9f4a
RevolveMerger: honor ignoreConflicts also for binary files

Currently difference in binary files during merge will cause them to be
added to unmergedPaths regardless of whether ignoreConflicts is true.

This creates an issue during merging with strategy "RECURSIVE", as it
makes it impossible to create a virtual commit if there is a difference
in a binary file. Resulting in the
CONFLICTS_DURING_MERGE_BASE_CALCULATION error being thrown.

This is especially problematic, since JGit has a
rather simplistic rules for considering file binary, which easily leads
to false positives.

What we should do instead is keep OURS. This will not lead to silently
ignoring difference in the final result. It will allow creation of
virtual merge-base commit, and then the difference would be presented
again in the final merge results. In essense it only affects what's
shown as BASE in 3-way merge.

Additionally, this is correct because
- It's consistent with treatment of other unmergeable entities, for
  example Gitlinks
- It's consistent with behaviour of CGit:
  - https://git-scm.com/docs/gitattributes#Documentation/gitattributes.txt-binary
    states on diffs in binary OURS is picked by default.
  - In code: https://git.kernel.org/pub/scm/git/git.git/tree/merge-ll.c#n81
- ignoreConflicts in CGit afterwards ignores all issues with content
  merging https://git.kernel.org/pub/scm/git/git.git/tree/merge-ort.c#n5201

We also adjust the behaviour when .gitattributes tell us to treat the
file as binary for the purpose of the merge.

We only change the behaviour when ignoreConlicts = true, as otherwise
the current behaviour works as intended.

Change-Id: I2b69f80a13d250aad3fe12dd438b2763f3022270
org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergerTest.java
org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java