Fix yet another subtle xdl_merge() bug

In very obscure cases, a merge can hit an unexpected code path (where the
original code went as far as saying that this was a bug). This failing
merge was noticed by Alexandre Juillard.

The problem is that the original file contains something like this:

-- snip --
two non-empty lines
before two empty lines

after two empty lines
-- snap --

and this snippet is reduced to _one_ empty line in _both_ new files.
However, it is ambiguous as to which hunk takes the empty line: the first
or the second one?

Indeed in Alexandre's example files, the xdiff algorithm attributes the
empty line to the first hunk in one case, and to the second hunk in the
other case.

(Trimming down the example files _changes_ that behaviour!)

Thus, the call to xdl_merge_cmp_lines() has no chance to realize that the
change is actually identical in both new files. Therefore,
xdl_refine_conflicts() finds an empty diff script, which was not expected
there, because (the original author of xdl_merge() thought)
xdl_merge_cmp_lines() would catch that case earlier.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
1 file changed
tree: 67db67e23722908f41b9816a094bc660c36adefe
  1. arm/
  2. compat/
  3. contrib/
  4. Documentation/
  5. gitweb/
  6. mozilla-sha1/
  7. perl/
  8. ppc/
  9. t/
  10. templates/
  11. xdiff/
  12. .gitignore
  13. .mailmap
  14. alloc.c
  15. archive-tar.c
  16. archive-zip.c
  17. archive.h
  18. base85.c
  19. blob.c
  20. blob.h
  21. builtin-add.c
  22. builtin-annotate.c
  23. builtin-apply.c
  24. builtin-archive.c
  25. builtin-blame.c
  26. builtin-branch.c
  27. builtin-cat-file.c
  28. builtin-check-ref-format.c
  29. builtin-checkout-index.c
  30. builtin-commit-tree.c
  31. builtin-count-objects.c
  32. builtin-diff-files.c
  33. builtin-diff-index.c
  34. builtin-diff-stages.c
  35. builtin-diff-tree.c
  36. builtin-diff.c
  37. builtin-fmt-merge-msg.c
  38. builtin-for-each-ref.c
  39. builtin-grep.c
  40. builtin-init-db.c
  41. builtin-log.c
  42. builtin-ls-files.c
  43. builtin-ls-tree.c
  44. builtin-mailinfo.c
  45. builtin-mailsplit.c
  46. builtin-merge-file.c
  47. builtin-mv.c
  48. builtin-name-rev.c
  49. builtin-pack-objects.c
  50. builtin-pack-refs.c
  51. builtin-prune-packed.c
  52. builtin-prune.c
  53. builtin-push.c
  54. builtin-read-tree.c
  55. builtin-reflog.c
  56. builtin-repo-config.c
  57. builtin-rerere.c
  58. builtin-rev-list.c
  59. builtin-rev-parse.c
  60. builtin-rm.c
  61. builtin-runstatus.c
  62. builtin-shortlog.c
  63. builtin-show-branch.c
  64. builtin-show-ref.c
  65. builtin-stripspace.c
  66. builtin-symbolic-ref.c
  67. builtin-tar-tree.c
  68. builtin-unpack-objects.c
  69. builtin-update-index.c
  70. builtin-update-ref.c
  71. builtin-upload-archive.c
  72. builtin-verify-pack.c
  73. builtin-write-tree.c
  74. builtin.h
  75. cache-tree.c
  76. cache-tree.h
  77. cache.h
  78. check-builtins.sh
  79. check-racy.c
  80. color.c
  81. color.h
  82. combine-diff.c
  83. commit.c
  84. commit.h
  85. config.c
  86. config.mak.in
  87. configure.ac
  88. connect.c
  89. convert-objects.c
  90. copy.c
  91. COPYING
  92. csum-file.c
  93. csum-file.h
  94. ctype.c
  95. daemon.c
  96. date.c
  97. delta.h
  98. describe.c
  99. diff-delta.c
  100. diff-lib.c
  101. diff.c
  102. diff.h
  103. diffcore-break.c
  104. diffcore-delta.c
  105. diffcore-order.c
  106. diffcore-pickaxe.c
  107. diffcore-rename.c
  108. diffcore.h
  109. dir.c
  110. dir.h
  111. dump-cache-tree.c
  112. entry.c
  113. environment.c
  114. exec_cmd.c
  115. exec_cmd.h
  116. fetch-pack.c
  117. fetch.c
  118. fetch.h
  119. fsck-objects.c
  120. generate-cmdlist.sh
  121. git-add--interactive.perl
  122. git-am.sh
  123. git-applymbox.sh
  124. git-applypatch.sh
  125. git-archimport.perl
  126. git-bisect.sh
  127. git-checkout.sh
  128. git-clean.sh
  129. git-clone.sh
  130. git-commit.sh
  131. git-compat-util.h
  132. git-cvsexportcommit.perl
  133. git-cvsimport.perl
  134. git-cvsserver.perl
  135. git-fetch.sh
  136. git-gc.sh
  137. git-instaweb.sh
  138. git-lost-found.sh
  139. git-ls-remote.sh
  140. git-merge-octopus.sh
  141. git-merge-one-file.sh
  142. git-merge-ours.sh
  143. git-merge-resolve.sh
  144. git-merge-stupid.sh
  145. git-merge.sh
  146. git-p4import.py
  147. git-parse-remote.sh
  148. git-pull.sh
  149. git-quiltimport.sh
  150. git-rebase.sh
  151. git-relink.perl
  152. git-repack.sh
  153. git-request-pull.sh
  154. git-rerere.perl
  155. git-reset.sh
  156. git-resolve.sh
  157. git-revert.sh
  158. git-send-email.perl
  159. git-sh-setup.sh
  160. git-svn.perl
  161. git-svnimport.perl
  162. git-tag.sh
  163. git-verify-tag.sh
  164. GIT-VERSION-GEN
  165. git.c
  166. git.spec.in
  167. gitk
  168. grep.c
  169. grep.h
  170. hash-object.c
  171. help.c
  172. http-fetch.c
  173. http-push.c
  174. http.c
  175. http.h
  176. ident.c
  177. imap-send.c
  178. index-pack.c
  179. INSTALL
  180. interpolate.c
  181. interpolate.h
  182. list-objects.c
  183. list-objects.h
  184. local-fetch.c
  185. lockfile.c
  186. log-tree.c
  187. log-tree.h
  188. Makefile
  189. merge-base.c
  190. merge-file.c
  191. merge-index.c
  192. merge-recursive.c
  193. merge-tree.c
  194. mktag.c
  195. mktree.c
  196. object-refs.c
  197. object.c
  198. object.h
  199. pack-check.c
  200. pack-redundant.c
  201. pack.h
  202. pager.c
  203. patch-delta.c
  204. patch-id.c
  205. path-list.c
  206. path-list.h
  207. path.c
  208. peek-remote.c
  209. pkt-line.c
  210. pkt-line.h
  211. quote.c
  212. quote.h
  213. read-cache.c
  214. README
  215. receive-pack.c
  216. refs.c
  217. refs.h
  218. revision.c
  219. revision.h
  220. rsh.c
  221. rsh.h
  222. run-command.c
  223. run-command.h
  224. send-pack.c
  225. server-info.c
  226. setup.c
  227. sha1_file.c
  228. sha1_name.c
  229. shallow.c
  230. shell.c
  231. show-index.c
  232. sideband.c
  233. sideband.h
  234. ssh-fetch.c
  235. ssh-pull.c
  236. ssh-push.c
  237. ssh-upload.c
  238. strbuf.c
  239. strbuf.h
  240. tag.c
  241. tag.h
  242. tar.h
  243. test-date.c
  244. test-delta.c
  245. test-sha1.c
  246. test-sha1.sh
  247. trace.c
  248. tree-diff.c
  249. tree-walk.c
  250. tree-walk.h
  251. tree.c
  252. tree.h
  253. unpack-file.c
  254. unpack-trees.c
  255. unpack-trees.h
  256. update-server-info.c
  257. upload-pack.c
  258. usage.c
  259. utf8.c
  260. utf8.h
  261. var.c
  262. write_or_die.c
  263. wt-status.c
  264. wt-status.h
  265. xdiff-interface.c
  266. xdiff-interface.h