rugged 1.3.2.3 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/extconf.rb +1 -1
  3. data/ext/rugged/rugged_config.c +7 -2
  4. data/ext/rugged/rugged_remote.c +17 -0
  5. data/lib/rugged/version.rb +1 -1
  6. data/vendor/libgit2/CMakeLists.txt +103 -276
  7. data/vendor/libgit2/COPYING +36 -19
  8. data/vendor/libgit2/cmake/AddCFlagIfSupported.cmake +21 -21
  9. data/vendor/libgit2/cmake/DefaultCFlags.cmake +154 -0
  10. data/vendor/libgit2/cmake/EnableWarnings.cmake +13 -13
  11. data/vendor/libgit2/cmake/FindCoreFoundation.cmake +13 -13
  12. data/vendor/libgit2/cmake/FindGSSAPI.cmake +171 -287
  13. data/vendor/libgit2/cmake/FindGSSFramework.cmake +13 -13
  14. data/vendor/libgit2/cmake/{FindHTTP_Parser.cmake → FindHTTPParser.cmake} +17 -17
  15. data/vendor/libgit2/cmake/FindIconv.cmake +27 -27
  16. data/vendor/libgit2/cmake/FindLibSSH2.cmake +5 -5
  17. data/vendor/libgit2/cmake/FindPCRE.cmake +13 -13
  18. data/vendor/libgit2/cmake/FindPCRE2.cmake +12 -12
  19. data/vendor/libgit2/cmake/FindPkgLibraries.cmake +19 -19
  20. data/vendor/libgit2/cmake/FindSecurity.cmake +14 -14
  21. data/vendor/libgit2/cmake/FindStatNsec.cmake +12 -18
  22. data/vendor/libgit2/cmake/Findfutimens.cmake +8 -8
  23. data/vendor/libgit2/cmake/FindmbedTLS.cmake +63 -70
  24. data/vendor/libgit2/cmake/IdeSplitSources.cmake +18 -18
  25. data/vendor/libgit2/cmake/PkgBuildConfig.cmake +60 -60
  26. data/vendor/libgit2/cmake/SanitizeBool.cmake +20 -20
  27. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +37 -37
  28. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +19 -0
  29. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +100 -100
  30. data/vendor/libgit2/cmake/SelectHashes.cmake +39 -49
  31. data/vendor/libgit2/cmake/SelectRegex.cmake +51 -0
  32. data/vendor/libgit2/cmake/SelectSSH.cmake +41 -0
  33. data/vendor/libgit2/cmake/SelectWinHTTP.cmake +17 -0
  34. data/vendor/libgit2/cmake/SelectZlib.cmake +34 -0
  35. data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +6 -6
  36. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +31 -31
  37. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +1 -1
  38. data/vendor/libgit2/deps/ntlmclient/ntlm.c +4 -4
  39. data/vendor/libgit2/deps/ntlmclient/ntlm.h +4 -4
  40. data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +2 -2
  41. data/vendor/libgit2/deps/pcre/CMakeLists.txt +88 -88
  42. data/vendor/libgit2/deps/winhttp/CMakeLists.txt +14 -16
  43. data/vendor/libgit2/deps/zlib/adler32.c +0 -7
  44. data/vendor/libgit2/deps/zlib/crc32.c +288 -975
  45. data/vendor/libgit2/deps/zlib/crc32.h +436 -9441
  46. data/vendor/libgit2/deps/zlib/deflate.c +31 -83
  47. data/vendor/libgit2/deps/zlib/deflate.h +15 -12
  48. data/vendor/libgit2/deps/zlib/gzguts.h +2 -3
  49. data/vendor/libgit2/deps/zlib/infback.c +1 -2
  50. data/vendor/libgit2/deps/zlib/inffast.c +14 -14
  51. data/vendor/libgit2/deps/zlib/inflate.c +8 -39
  52. data/vendor/libgit2/deps/zlib/inflate.h +2 -3
  53. data/vendor/libgit2/deps/zlib/inftrees.c +3 -3
  54. data/vendor/libgit2/deps/zlib/trees.c +48 -27
  55. data/vendor/libgit2/deps/zlib/zlib.h +100 -126
  56. data/vendor/libgit2/deps/zlib/zutil.c +2 -2
  57. data/vendor/libgit2/deps/zlib/zutil.h +9 -12
  58. data/vendor/libgit2/include/git2/apply.h +16 -2
  59. data/vendor/libgit2/include/git2/attr.h +11 -2
  60. data/vendor/libgit2/include/git2/blame.h +4 -1
  61. data/vendor/libgit2/include/git2/blob.h +14 -1
  62. data/vendor/libgit2/include/git2/branch.h +2 -0
  63. data/vendor/libgit2/include/git2/buffer.h +18 -78
  64. data/vendor/libgit2/include/git2/cert.h +2 -2
  65. data/vendor/libgit2/include/git2/checkout.h +5 -2
  66. data/vendor/libgit2/include/git2/clone.h +3 -3
  67. data/vendor/libgit2/include/git2/commit.h +2 -0
  68. data/vendor/libgit2/include/git2/common.h +5 -12
  69. data/vendor/libgit2/include/git2/config.h +19 -3
  70. data/vendor/libgit2/include/git2/credential.h +2 -1
  71. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  72. data/vendor/libgit2/include/git2/deprecated.h +1 -1
  73. data/vendor/libgit2/include/git2/describe.h +7 -2
  74. data/vendor/libgit2/include/git2/diff.h +17 -9
  75. data/vendor/libgit2/include/git2/email.h +1 -1
  76. data/vendor/libgit2/include/git2/errors.h +1 -2
  77. data/vendor/libgit2/include/git2/filter.h +7 -2
  78. data/vendor/libgit2/include/git2/graph.h +1 -0
  79. data/vendor/libgit2/include/git2/ignore.h +1 -1
  80. data/vendor/libgit2/include/git2/index.h +11 -5
  81. data/vendor/libgit2/include/git2/indexer.h +19 -0
  82. data/vendor/libgit2/include/git2/merge.h +23 -3
  83. data/vendor/libgit2/include/git2/message.h +2 -0
  84. data/vendor/libgit2/include/git2/object.h +23 -0
  85. data/vendor/libgit2/include/git2/odb.h +37 -7
  86. data/vendor/libgit2/include/git2/odb_backend.h +1 -1
  87. data/vendor/libgit2/include/git2/pack.h +24 -8
  88. data/vendor/libgit2/include/git2/patch.h +8 -0
  89. data/vendor/libgit2/include/git2/pathspec.h +1 -1
  90. data/vendor/libgit2/include/git2/proxy.h +1 -1
  91. data/vendor/libgit2/include/git2/rebase.h +9 -1
  92. data/vendor/libgit2/include/git2/refdb.h +3 -0
  93. data/vendor/libgit2/include/git2/reflog.h +1 -1
  94. data/vendor/libgit2/include/git2/refs.h +2 -2
  95. data/vendor/libgit2/include/git2/remote.h +184 -37
  96. data/vendor/libgit2/include/git2/repository.h +14 -9
  97. data/vendor/libgit2/include/git2/reset.h +2 -2
  98. data/vendor/libgit2/include/git2/revparse.h +1 -1
  99. data/vendor/libgit2/include/git2/revwalk.h +4 -1
  100. data/vendor/libgit2/include/git2/signature.h +1 -1
  101. data/vendor/libgit2/include/git2/stash.h +3 -3
  102. data/vendor/libgit2/include/git2/status.h +9 -3
  103. data/vendor/libgit2/include/git2/submodule.h +7 -2
  104. data/vendor/libgit2/include/git2/sys/commit_graph.h +1 -1
  105. data/vendor/libgit2/include/git2/sys/odb_backend.h +2 -5
  106. data/vendor/libgit2/include/git2/sys/remote.h +31 -0
  107. data/vendor/libgit2/include/git2/sys/stream.h +1 -1
  108. data/vendor/libgit2/include/git2/sys/transport.h +25 -34
  109. data/vendor/libgit2/include/git2/tag.h +1 -0
  110. data/vendor/libgit2/include/git2/tree.h +4 -3
  111. data/vendor/libgit2/include/git2/types.h +7 -7
  112. data/vendor/libgit2/include/git2/version.h +3 -3
  113. data/vendor/libgit2/include/git2/worktree.h +12 -2
  114. data/vendor/libgit2/src/CMakeLists.txt +189 -315
  115. data/vendor/libgit2/src/annotated_commit.h +1 -1
  116. data/vendor/libgit2/src/apply.c +18 -18
  117. data/vendor/libgit2/src/apply.h +2 -2
  118. data/vendor/libgit2/src/attr.c +18 -18
  119. data/vendor/libgit2/src/attr_file.c +17 -17
  120. data/vendor/libgit2/src/attr_file.h +4 -4
  121. data/vendor/libgit2/src/attrcache.c +17 -12
  122. data/vendor/libgit2/src/blame_git.c +1 -1
  123. data/vendor/libgit2/src/blob.c +33 -26
  124. data/vendor/libgit2/src/blob.h +1 -1
  125. data/vendor/libgit2/src/branch.c +150 -109
  126. data/vendor/libgit2/src/branch.h +15 -3
  127. data/vendor/libgit2/src/buf.c +126 -0
  128. data/vendor/libgit2/src/buf.h +50 -0
  129. data/vendor/libgit2/src/cc-compat.h +1 -1
  130. data/vendor/libgit2/src/checkout.c +74 -68
  131. data/vendor/libgit2/src/cherrypick.c +10 -10
  132. data/vendor/libgit2/src/clone.c +66 -66
  133. data/vendor/libgit2/src/commit.c +128 -58
  134. data/vendor/libgit2/src/commit.h +24 -1
  135. data/vendor/libgit2/src/commit_graph.c +68 -53
  136. data/vendor/libgit2/src/commit_graph.h +10 -3
  137. data/vendor/libgit2/src/commit_list.c +2 -3
  138. data/vendor/libgit2/src/common.h +10 -3
  139. data/vendor/libgit2/src/config.c +99 -77
  140. data/vendor/libgit2/src/config.h +15 -2
  141. data/vendor/libgit2/src/config_file.c +103 -91
  142. data/vendor/libgit2/src/config_mem.c +9 -9
  143. data/vendor/libgit2/src/config_parse.c +27 -23
  144. data/vendor/libgit2/src/crlf.c +24 -21
  145. data/vendor/libgit2/src/date.c +10 -17
  146. data/vendor/libgit2/src/date.h +33 -0
  147. data/vendor/libgit2/src/describe.c +27 -19
  148. data/vendor/libgit2/src/diff.c +25 -8
  149. data/vendor/libgit2/src/diff.h +2 -4
  150. data/vendor/libgit2/src/diff_driver.c +34 -36
  151. data/vendor/libgit2/src/diff_driver.h +3 -3
  152. data/vendor/libgit2/src/diff_file.c +29 -20
  153. data/vendor/libgit2/src/diff_generate.c +30 -6
  154. data/vendor/libgit2/src/diff_generate.h +5 -3
  155. data/vendor/libgit2/src/diff_print.c +102 -95
  156. data/vendor/libgit2/src/diff_stats.c +40 -29
  157. data/vendor/libgit2/src/{message.h → diff_stats.h} +7 -6
  158. data/vendor/libgit2/src/diff_tform.c +9 -8
  159. data/vendor/libgit2/src/diff_xdiff.c +3 -8
  160. data/vendor/libgit2/src/email.c +54 -38
  161. data/vendor/libgit2/src/email.h +1 -1
  162. data/vendor/libgit2/src/errors.c +18 -18
  163. data/vendor/libgit2/src/features.h.in +6 -1
  164. data/vendor/libgit2/src/fetch.c +69 -24
  165. data/vendor/libgit2/src/fetch.h +1 -1
  166. data/vendor/libgit2/src/fetchhead.c +19 -19
  167. data/vendor/libgit2/src/filebuf.c +28 -28
  168. data/vendor/libgit2/src/filebuf.h +1 -1
  169. data/vendor/libgit2/src/filter.c +96 -52
  170. data/vendor/libgit2/src/filter.h +26 -5
  171. data/vendor/libgit2/src/fs_path.c +1912 -0
  172. data/vendor/libgit2/src/fs_path.h +752 -0
  173. data/vendor/libgit2/src/futils.c +91 -85
  174. data/vendor/libgit2/src/futils.h +26 -14
  175. data/vendor/libgit2/src/hash/sha1/collisiondetect.c +2 -2
  176. data/vendor/libgit2/src/hash/sha1/common_crypto.c +2 -2
  177. data/vendor/libgit2/src/hash/sha1/generic.c +2 -2
  178. data/vendor/libgit2/src/hash/sha1/mbedtls.c +2 -2
  179. data/vendor/libgit2/src/hash/sha1/openssl.c +2 -2
  180. data/vendor/libgit2/src/hash/sha1/sha1dc/sha1.c +1 -1
  181. data/vendor/libgit2/src/hash/sha1/win32.c +6 -6
  182. data/vendor/libgit2/src/hash/sha1.h +3 -1
  183. data/vendor/libgit2/src/hash.c +67 -35
  184. data/vendor/libgit2/src/hash.h +12 -12
  185. data/vendor/libgit2/src/ident.c +18 -18
  186. data/vendor/libgit2/src/ignore.c +35 -34
  187. data/vendor/libgit2/src/ignore.h +2 -2
  188. data/vendor/libgit2/src/index.c +79 -80
  189. data/vendor/libgit2/src/index.h +6 -3
  190. data/vendor/libgit2/src/indexer.c +75 -57
  191. data/vendor/libgit2/src/iterator.c +64 -56
  192. data/vendor/libgit2/src/iterator.h +5 -5
  193. data/vendor/libgit2/src/khash.h +1 -1
  194. data/vendor/libgit2/src/libgit2.c +22 -19
  195. data/vendor/libgit2/src/mailmap.c +38 -36
  196. data/vendor/libgit2/src/merge.c +27 -27
  197. data/vendor/libgit2/src/merge.h +1 -14
  198. data/vendor/libgit2/src/merge_driver.c +2 -2
  199. data/vendor/libgit2/src/merge_file.c +13 -3
  200. data/vendor/libgit2/src/message.c +21 -10
  201. data/vendor/libgit2/src/midx.c +83 -66
  202. data/vendor/libgit2/src/midx.h +3 -3
  203. data/vendor/libgit2/src/mwindow.c +1 -1
  204. data/vendor/libgit2/src/net.c +278 -68
  205. data/vendor/libgit2/src/net.h +10 -3
  206. data/vendor/libgit2/src/netops.c +1 -1
  207. data/vendor/libgit2/src/netops.h +1 -1
  208. data/vendor/libgit2/src/notes.c +20 -29
  209. data/vendor/libgit2/src/object.c +49 -9
  210. data/vendor/libgit2/src/object.h +1 -1
  211. data/vendor/libgit2/src/odb.c +35 -32
  212. data/vendor/libgit2/src/odb.h +1 -1
  213. data/vendor/libgit2/src/odb_loose.c +68 -68
  214. data/vendor/libgit2/src/odb_mempack.c +18 -5
  215. data/vendor/libgit2/src/odb_pack.c +43 -43
  216. data/vendor/libgit2/src/oid.c +11 -4
  217. data/vendor/libgit2/src/oid.h +15 -0
  218. data/vendor/libgit2/src/pack-objects.c +41 -26
  219. data/vendor/libgit2/src/pack-objects.h +11 -6
  220. data/vendor/libgit2/src/pack.c +10 -10
  221. data/vendor/libgit2/src/patch.c +3 -3
  222. data/vendor/libgit2/src/patch.h +1 -0
  223. data/vendor/libgit2/src/patch_generate.c +27 -11
  224. data/vendor/libgit2/src/patch_generate.h +5 -5
  225. data/vendor/libgit2/src/patch_parse.c +24 -24
  226. data/vendor/libgit2/src/path.c +76 -1951
  227. data/vendor/libgit2/src/path.h +34 -741
  228. data/vendor/libgit2/src/pathspec.c +6 -6
  229. data/vendor/libgit2/src/pathspec.h +2 -2
  230. data/vendor/libgit2/src/posix.c +3 -3
  231. data/vendor/libgit2/src/posix.h +1 -0
  232. data/vendor/libgit2/src/pqueue.h +1 -1
  233. data/vendor/libgit2/src/proxy.c +4 -1
  234. data/vendor/libgit2/src/proxy.h +1 -1
  235. data/vendor/libgit2/src/push.c +30 -35
  236. data/vendor/libgit2/src/push.h +4 -16
  237. data/vendor/libgit2/src/rand.c +226 -0
  238. data/vendor/libgit2/src/rand.h +37 -0
  239. data/vendor/libgit2/src/reader.c +8 -8
  240. data/vendor/libgit2/src/reader.h +2 -2
  241. data/vendor/libgit2/src/rebase.c +89 -88
  242. data/vendor/libgit2/src/refdb_fs.c +447 -173
  243. data/vendor/libgit2/src/refs.c +32 -32
  244. data/vendor/libgit2/src/refs.h +2 -2
  245. data/vendor/libgit2/src/refspec.c +32 -37
  246. data/vendor/libgit2/src/refspec.h +5 -2
  247. data/vendor/libgit2/src/regexp.c +1 -1
  248. data/vendor/libgit2/src/remote.c +713 -419
  249. data/vendor/libgit2/src/remote.h +15 -10
  250. data/vendor/libgit2/src/repository.c +350 -467
  251. data/vendor/libgit2/src/repository.h +11 -10
  252. data/vendor/libgit2/src/reset.c +8 -5
  253. data/vendor/libgit2/src/revert.c +10 -10
  254. data/vendor/libgit2/src/revparse.c +48 -35
  255. data/vendor/libgit2/src/revwalk.c +7 -7
  256. data/vendor/libgit2/src/signature.c +12 -6
  257. data/vendor/libgit2/src/signature.h +1 -1
  258. data/vendor/libgit2/src/sortedcache.c +1 -1
  259. data/vendor/libgit2/src/sortedcache.h +1 -1
  260. data/vendor/libgit2/src/stash.c +36 -37
  261. data/vendor/libgit2/src/status.c +4 -1
  262. data/vendor/libgit2/src/{buffer.c → str.c} +157 -151
  263. data/vendor/libgit2/src/str.h +357 -0
  264. data/vendor/libgit2/src/streams/mbedtls.c +8 -6
  265. data/vendor/libgit2/src/streams/openssl_dynamic.h +3 -3
  266. data/vendor/libgit2/src/submodule.c +171 -159
  267. data/vendor/libgit2/src/submodule.h +1 -1
  268. data/vendor/libgit2/src/sysdir.c +68 -52
  269. data/vendor/libgit2/src/sysdir.h +15 -10
  270. data/vendor/libgit2/src/tag.c +29 -27
  271. data/vendor/libgit2/src/thread.h +3 -3
  272. data/vendor/libgit2/src/threadstate.c +3 -3
  273. data/vendor/libgit2/src/threadstate.h +1 -1
  274. data/vendor/libgit2/src/trace.c +1 -14
  275. data/vendor/libgit2/src/trace.h +5 -22
  276. data/vendor/libgit2/src/trailer.c +1 -1
  277. data/vendor/libgit2/src/transaction.c +1 -1
  278. data/vendor/libgit2/src/transport.c +10 -10
  279. data/vendor/libgit2/src/transports/auth.c +7 -9
  280. data/vendor/libgit2/src/transports/auth.h +2 -3
  281. data/vendor/libgit2/src/transports/auth_negotiate.c +12 -13
  282. data/vendor/libgit2/src/transports/auth_ntlm.c +10 -10
  283. data/vendor/libgit2/src/transports/auth_ntlm.h +0 -1
  284. data/vendor/libgit2/src/transports/git.c +9 -11
  285. data/vendor/libgit2/src/transports/http.c +37 -17
  286. data/vendor/libgit2/src/transports/http.h +2 -3
  287. data/vendor/libgit2/src/transports/httpclient.c +65 -65
  288. data/vendor/libgit2/src/transports/local.c +124 -116
  289. data/vendor/libgit2/src/transports/smart.c +51 -139
  290. data/vendor/libgit2/src/transports/smart.h +25 -31
  291. data/vendor/libgit2/src/transports/smart_pkt.c +33 -33
  292. data/vendor/libgit2/src/transports/smart_protocol.c +57 -39
  293. data/vendor/libgit2/src/transports/ssh.c +47 -112
  294. data/vendor/libgit2/src/transports/winhttp.c +50 -56
  295. data/vendor/libgit2/src/tree-cache.c +5 -5
  296. data/vendor/libgit2/src/tree-cache.h +2 -2
  297. data/vendor/libgit2/src/tree.c +59 -48
  298. data/vendor/libgit2/src/tree.h +1 -1
  299. data/vendor/libgit2/src/unix/map.c +0 -2
  300. data/vendor/libgit2/src/unix/posix.h +1 -4
  301. data/vendor/libgit2/src/unix/realpath.c +0 -2
  302. data/vendor/libgit2/src/util.c +14 -14
  303. data/vendor/libgit2/src/util.h +2 -28
  304. data/vendor/libgit2/src/vector.h +1 -1
  305. data/vendor/libgit2/src/win32/findfile.c +172 -116
  306. data/vendor/libgit2/src/win32/findfile.h +7 -4
  307. data/vendor/libgit2/src/win32/path_w32.c +140 -9
  308. data/vendor/libgit2/src/win32/path_w32.h +2 -0
  309. data/vendor/libgit2/src/win32/posix.h +0 -1
  310. data/vendor/libgit2/src/win32/posix_w32.c +11 -27
  311. data/vendor/libgit2/src/win32/w32_buffer.c +2 -3
  312. data/vendor/libgit2/src/win32/w32_buffer.h +2 -3
  313. data/vendor/libgit2/src/win32/w32_leakcheck.c +1 -1
  314. data/vendor/libgit2/src/worktree.c +116 -94
  315. data/vendor/libgit2/src/worktree.h +1 -1
  316. data/vendor/libgit2/src/xdiff/git-xdiff.h +53 -0
  317. data/vendor/libgit2/src/xdiff/xdiff.h +15 -15
  318. data/vendor/libgit2/src/xdiff/xdiffi.c +134 -108
  319. data/vendor/libgit2/src/xdiff/xemit.c +23 -7
  320. data/vendor/libgit2/src/xdiff/xhistogram.c +87 -78
  321. data/vendor/libgit2/src/xdiff/xinclude.h +1 -12
  322. data/vendor/libgit2/src/xdiff/xmerge.c +104 -117
  323. data/vendor/libgit2/src/xdiff/xpatience.c +6 -17
  324. data/vendor/libgit2/src/xdiff/xprepare.c +15 -20
  325. data/vendor/libgit2/src/xdiff/xutils.c +18 -7
  326. data/vendor/libgit2/src/zstream.c +5 -5
  327. data/vendor/libgit2/src/zstream.h +4 -4
  328. metadata +25 -10
  329. data/vendor/libgit2/src/buffer.h +0 -374
@@ -42,8 +42,6 @@
42
42
  */
43
43
 
44
44
  #include "xinclude.h"
45
- #include "xtypes.h"
46
- #include "xdiff.h"
47
45
 
48
46
  #define MAX_PTR UINT_MAX
49
47
  #define MAX_CNT UINT_MAX
@@ -90,27 +88,21 @@ struct region {
90
88
  #define REC(env, s, l) \
91
89
  (env->xdf##s.recs[l - 1])
92
90
 
93
- static int cmp_recs(xpparam_t const *xpp,
94
- xrecord_t *r1, xrecord_t *r2)
91
+ static int cmp_recs(xrecord_t *r1, xrecord_t *r2)
95
92
  {
96
- return r1->ha == r2->ha &&
97
- xdl_recmatch(r1->ptr, r1->size, r2->ptr, r2->size,
98
- xpp->flags);
99
- }
93
+ return r1->ha == r2->ha;
100
94
 
101
- #define CMP_ENV(xpp, env, s1, l1, s2, l2) \
102
- (cmp_recs(xpp, REC(env, s1, l1), REC(env, s2, l2)))
95
+ }
103
96
 
104
97
  #define CMP(i, s1, l1, s2, l2) \
105
- (cmp_recs(i->xpp, REC(i->env, s1, l1), REC(i->env, s2, l2)))
98
+ (cmp_recs(REC(i->env, s1, l1), REC(i->env, s2, l2)))
106
99
 
107
100
  #define TABLE_HASH(index, side, line) \
108
101
  XDL_HASHLONG((REC(index->env, side, line))->ha, index->table_bits)
109
102
 
110
- static int scanA(struct histindex *index, unsigned int line1, unsigned int count1)
103
+ static int scanA(struct histindex *index, int line1, int count1)
111
104
  {
112
- unsigned int ptr;
113
- unsigned int tbl_idx;
105
+ unsigned int ptr, tbl_idx;
114
106
  unsigned int chain_len;
115
107
  struct record **rec_chain, *rec;
116
108
 
@@ -161,10 +153,8 @@ continue_scan:
161
153
  return 0;
162
154
  }
163
155
 
164
- static int try_lcs(
165
- struct histindex *index, struct region *lcs, unsigned int b_ptr,
166
- unsigned int line1, unsigned int count1,
167
- unsigned int line2, unsigned int count2)
156
+ static int try_lcs(struct histindex *index, struct region *lcs, int b_ptr,
157
+ int line1, int count1, int line2, int count2)
168
158
  {
169
159
  unsigned int b_next = b_ptr + 1;
170
160
  struct record *rec = index->records[TABLE_HASH(index, 2, b_ptr)];
@@ -236,59 +226,33 @@ static int try_lcs(
236
226
  return b_next;
237
227
  }
238
228
 
239
- static int find_lcs(
240
- struct histindex *index, struct region *lcs,
241
- unsigned int line1, unsigned int count1,
242
- unsigned int line2, unsigned int count2)
229
+ static int fall_back_to_classic_diff(xpparam_t const *xpp, xdfenv_t *env,
230
+ int line1, int count1, int line2, int count2)
243
231
  {
244
- unsigned int b_ptr;
245
-
246
- if (scanA(index, line1, count1))
247
- return -1;
248
-
249
- index->cnt = index->max_chain_length + 1;
232
+ xpparam_t xpparam;
250
233
 
251
- for (b_ptr = line2; b_ptr <= LINE_END(2); )
252
- b_ptr = try_lcs(index, lcs, b_ptr, line1, count1, line2, count2);
234
+ memset(&xpparam, 0, sizeof(xpparam));
235
+ xpparam.flags = xpp->flags & ~XDF_DIFF_ALGORITHM_MASK;
253
236
 
254
- return index->has_common && index->max_chain_length < index->cnt;
237
+ return xdl_fall_back_diff(env, &xpparam,
238
+ line1, count1, line2, count2);
255
239
  }
256
240
 
257
- static int fall_back_to_classic_diff(struct histindex *index,
258
- int line1, int count1, int line2, int count2)
241
+ static inline void free_index(struct histindex *index)
259
242
  {
260
- xpparam_t xpp;
261
- xpp.flags = index->xpp->flags & ~XDF_DIFF_ALGORITHM_MASK;
262
-
263
- return xdl_fall_back_diff(index->env, &xpp,
264
- line1, count1, line2, count2);
243
+ xdl_free(index->records);
244
+ xdl_free(index->line_map);
245
+ xdl_free(index->next_ptrs);
246
+ xdl_cha_free(&index->rcha);
265
247
  }
266
248
 
267
- static int histogram_diff(
268
- xpparam_t const *xpp, xdfenv_t *env,
269
- unsigned int line1, unsigned int count1,
270
- unsigned int line2, unsigned int count2)
249
+ static int find_lcs(xpparam_t const *xpp, xdfenv_t *env,
250
+ struct region *lcs,
251
+ int line1, int count1, int line2, int count2)
271
252
  {
253
+ int b_ptr;
254
+ int sz, ret = -1;
272
255
  struct histindex index;
273
- struct region lcs;
274
- size_t sz;
275
- int result = -1;
276
-
277
- if (count1 <= 0 && count2 <= 0)
278
- return 0;
279
-
280
- if (LINE_END(1) >= MAX_PTR)
281
- return -1;
282
-
283
- if (!count1) {
284
- while(count2--)
285
- env->xdf2.rchg[line2++ - 1] = 1;
286
- return 0;
287
- } else if (!count2) {
288
- while(count1--)
289
- env->xdf1.rchg[line1++ - 1] = 1;
290
- return 0;
291
- }
292
256
 
293
257
  memset(&index, 0, sizeof(index));
294
258
 
@@ -302,8 +266,7 @@ static int histogram_diff(
302
266
 
303
267
  index.table_bits = xdl_hashbits(count1);
304
268
  sz = index.records_size = 1 << index.table_bits;
305
- GIT_ERROR_CHECK_ALLOC_MULTIPLY(&sz, sz, sizeof(struct record *));
306
-
269
+ sz *= sizeof(struct record *);
307
270
  if (!(index.records = (struct record **) xdl_malloc(sz)))
308
271
  goto cleanup;
309
272
  memset(index.records, 0, sz);
@@ -327,9 +290,55 @@ static int histogram_diff(
327
290
  index.ptr_shift = line1;
328
291
  index.max_chain_length = 64;
329
292
 
293
+ if (scanA(&index, line1, count1))
294
+ goto cleanup;
295
+
296
+ index.cnt = index.max_chain_length + 1;
297
+
298
+ for (b_ptr = line2; b_ptr <= LINE_END(2); )
299
+ b_ptr = try_lcs(&index, lcs, b_ptr, line1, count1, line2, count2);
300
+
301
+ if (index.has_common && index.max_chain_length < index.cnt)
302
+ ret = 1;
303
+ else
304
+ ret = 0;
305
+
306
+ cleanup:
307
+ free_index(&index);
308
+ return ret;
309
+ }
310
+
311
+ static int histogram_diff(xpparam_t const *xpp, xdfenv_t *env,
312
+ int line1, int count1, int line2, int count2)
313
+ {
314
+ struct region lcs;
315
+ int lcs_found;
316
+ int result;
317
+ redo:
318
+ result = -1;
319
+
320
+ if (count1 <= 0 && count2 <= 0)
321
+ return 0;
322
+
323
+ if (LINE_END(1) >= MAX_PTR)
324
+ return -1;
325
+
326
+ if (!count1) {
327
+ while(count2--)
328
+ env->xdf2.rchg[line2++ - 1] = 1;
329
+ return 0;
330
+ } else if (!count2) {
331
+ while(count1--)
332
+ env->xdf1.rchg[line1++ - 1] = 1;
333
+ return 0;
334
+ }
335
+
330
336
  memset(&lcs, 0, sizeof(lcs));
331
- if (find_lcs(&index, &lcs, line1, count1, line2, count2))
332
- result = fall_back_to_classic_diff(&index, line1, count1, line2, count2);
337
+ lcs_found = find_lcs(xpp, env, &lcs, line1, count1, line2, count2);
338
+ if (lcs_found < 0)
339
+ goto out;
340
+ else if (lcs_found)
341
+ result = fall_back_to_classic_diff(xpp, env, line1, count1, line2, count2);
333
342
  else {
334
343
  if (lcs.begin1 == 0 && lcs.begin2 == 0) {
335
344
  while (count1--)
@@ -342,21 +351,21 @@ static int histogram_diff(
342
351
  line1, lcs.begin1 - line1,
343
352
  line2, lcs.begin2 - line2);
344
353
  if (result)
345
- goto cleanup;
346
- result = histogram_diff(xpp, env,
347
- lcs.end1 + 1, LINE_END(1) - lcs.end1,
348
- lcs.end2 + 1, LINE_END(2) - lcs.end2);
349
- if (result)
350
- goto cleanup;
354
+ goto out;
355
+ /*
356
+ * result = histogram_diff(xpp, env,
357
+ * lcs.end1 + 1, LINE_END(1) - lcs.end1,
358
+ * lcs.end2 + 1, LINE_END(2) - lcs.end2);
359
+ * but let's optimize tail recursion ourself:
360
+ */
361
+ count1 = LINE_END(1) - lcs.end1;
362
+ line1 = lcs.end1 + 1;
363
+ count2 = LINE_END(2) - lcs.end2;
364
+ line2 = lcs.end2 + 1;
365
+ goto redo;
351
366
  }
352
367
  }
353
-
354
- cleanup:
355
- xdl_free(index.records);
356
- xdl_free(index.line_map);
357
- xdl_free(index.next_ptrs);
358
- xdl_cha_free(&index.rcha);
359
-
368
+ out:
360
369
  return result;
361
370
  }
362
371
 
@@ -23,17 +23,7 @@
23
23
  #if !defined(XINCLUDE_H)
24
24
  #define XINCLUDE_H
25
25
 
26
- #include <ctype.h>
27
- #include <stdio.h>
28
- #include <stdlib.h>
29
- #include <string.h>
30
- #include <limits.h>
31
-
32
- #ifdef _WIN32
33
- #else
34
- #include <unistd.h>
35
- #endif
36
-
26
+ #include "git-xdiff.h"
37
27
  #include "xmacros.h"
38
28
  #include "xdiff.h"
39
29
  #include "xtypes.h"
@@ -42,6 +32,5 @@
42
32
  #include "xdiffi.h"
43
33
  #include "xemit.h"
44
34
 
45
- #include "common.h"
46
35
 
47
36
  #endif /* #if !defined(XINCLUDE_H) */
@@ -88,7 +88,7 @@ static int xdl_cleanup_merge(xdmerge_t *c)
88
88
  if (c->mode == 0)
89
89
  count++;
90
90
  next_c = c->next;
91
- free(c);
91
+ xdl_free(c);
92
92
  }
93
93
  return count;
94
94
  }
@@ -109,53 +109,44 @@ static int xdl_merge_cmp_lines(xdfenv_t *xe1, int i1, xdfenv_t *xe2, int i2,
109
109
  return 0;
110
110
  }
111
111
 
112
- static int xdl_recs_copy_0(size_t *out, int use_orig, xdfenv_t *xe, int i, int count, int needs_cr, int add_nl, char *dest)
112
+ static int xdl_recs_copy_0(int use_orig, xdfenv_t *xe, int i, int count, int needs_cr, int add_nl, char *dest)
113
113
  {
114
114
  xrecord_t **recs;
115
- size_t size = 0;
116
-
117
- *out = 0;
115
+ int size = 0;
118
116
 
119
117
  recs = (use_orig ? xe->xdf1.recs : xe->xdf2.recs) + i;
120
118
 
121
119
  if (count < 1)
122
120
  return 0;
123
121
 
124
- for (i = 0; i < count; ) {
122
+ for (i = 0; i < count; size += recs[i++]->size)
125
123
  if (dest)
126
124
  memcpy(dest + size, recs[i]->ptr, recs[i]->size);
127
-
128
- GIT_ERROR_CHECK_ALLOC_ADD(&size, size, recs[i++]->size);
129
- }
130
-
131
125
  if (add_nl) {
132
126
  i = recs[count - 1]->size;
133
127
  if (i == 0 || recs[count - 1]->ptr[i - 1] != '\n') {
134
128
  if (needs_cr) {
135
129
  if (dest)
136
130
  dest[size] = '\r';
137
- GIT_ERROR_CHECK_ALLOC_ADD(&size, size, 1);
131
+ size++;
138
132
  }
139
133
 
140
134
  if (dest)
141
135
  dest[size] = '\n';
142
-
143
- GIT_ERROR_CHECK_ALLOC_ADD(&size, size, 1);
136
+ size++;
144
137
  }
145
138
  }
146
-
147
- *out = size;
148
- return 0;
139
+ return size;
149
140
  }
150
141
 
151
- static int xdl_recs_copy(size_t *out, xdfenv_t *xe, int i, int count, int needs_cr, int add_nl, char *dest)
142
+ static int xdl_recs_copy(xdfenv_t *xe, int i, int count, int needs_cr, int add_nl, char *dest)
152
143
  {
153
- return xdl_recs_copy_0(out, 0, xe, i, count, needs_cr, add_nl, dest);
144
+ return xdl_recs_copy_0(0, xe, i, count, needs_cr, add_nl, dest);
154
145
  }
155
146
 
156
- static int xdl_orig_copy(size_t *out, xdfenv_t *xe, int i, int count, int needs_cr, int add_nl, char *dest)
147
+ static int xdl_orig_copy(xdfenv_t *xe, int i, int count, int needs_cr, int add_nl, char *dest)
157
148
  {
158
- return xdl_recs_copy_0(out, 1, xe, i, count, needs_cr, add_nl, dest);
149
+ return xdl_recs_copy_0(1, xe, i, count, needs_cr, add_nl, dest);
159
150
  }
160
151
 
161
152
  /*
@@ -202,32 +193,26 @@ static int is_cr_needed(xdfenv_t *xe1, xdfenv_t *xe2, xdmerge_t *m)
202
193
  return needs_cr < 0 ? 0 : needs_cr;
203
194
  }
204
195
 
205
- static int fill_conflict_hunk(size_t *out, xdfenv_t *xe1, const char *name1,
196
+ static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
206
197
  xdfenv_t *xe2, const char *name2,
207
198
  const char *name3,
208
- size_t size, int i, int style,
199
+ int size, int i, int style,
209
200
  xdmerge_t *m, char *dest, int marker_size)
210
201
  {
211
- int marker1_size = (name1 ? (int)strlen(name1) + 1 : 0);
212
- int marker2_size = (name2 ? (int)strlen(name2) + 1 : 0);
213
- int marker3_size = (name3 ? (int)strlen(name3) + 1 : 0);
202
+ int marker1_size = (name1 ? strlen(name1) + 1 : 0);
203
+ int marker2_size = (name2 ? strlen(name2) + 1 : 0);
204
+ int marker3_size = (name3 ? strlen(name3) + 1 : 0);
214
205
  int needs_cr = is_cr_needed(xe1, xe2, m);
215
- size_t copied;
216
-
217
- *out = 0;
218
206
 
219
207
  if (marker_size <= 0)
220
208
  marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
221
209
 
222
210
  /* Before conflicting part */
223
- if (xdl_recs_copy(&copied, xe1, i, m->i1 - i, 0, 0,
224
- dest ? dest + size : NULL) < 0)
225
- return -1;
226
-
227
- GIT_ERROR_CHECK_ALLOC_ADD(&size, size, copied);
211
+ size += xdl_recs_copy(xe1, i, m->i1 - i, 0, 0,
212
+ dest ? dest + size : NULL);
228
213
 
229
214
  if (!dest) {
230
- GIT_ERROR_CHECK_ALLOC_ADD5(&size, size, marker_size, 1, needs_cr, marker1_size);
215
+ size += marker_size + 1 + needs_cr + marker1_size;
231
216
  } else {
232
217
  memset(dest + size, '<', marker_size);
233
218
  size += marker_size;
@@ -242,16 +227,13 @@ static int fill_conflict_hunk(size_t *out, xdfenv_t *xe1, const char *name1,
242
227
  }
243
228
 
244
229
  /* Postimage from side #1 */
245
- if (xdl_recs_copy(&copied, xe1, m->i1, m->chg1, needs_cr, 1,
246
- dest ? dest + size : NULL) < 0)
247
- return -1;
230
+ size += xdl_recs_copy(xe1, m->i1, m->chg1, needs_cr, 1,
231
+ dest ? dest + size : NULL);
248
232
 
249
- GIT_ERROR_CHECK_ALLOC_ADD(&size, size, copied);
250
-
251
- if (style == XDL_MERGE_DIFF3) {
233
+ if (style == XDL_MERGE_DIFF3 || style == XDL_MERGE_ZEALOUS_DIFF3) {
252
234
  /* Shared preimage */
253
235
  if (!dest) {
254
- GIT_ERROR_CHECK_ALLOC_ADD5(&size, size, marker_size, 1, needs_cr, marker3_size);
236
+ size += marker_size + 1 + needs_cr + marker3_size;
255
237
  } else {
256
238
  memset(dest + size, '|', marker_size);
257
239
  size += marker_size;
@@ -264,15 +246,12 @@ static int fill_conflict_hunk(size_t *out, xdfenv_t *xe1, const char *name1,
264
246
  dest[size++] = '\r';
265
247
  dest[size++] = '\n';
266
248
  }
267
-
268
- if (xdl_orig_copy(&copied, xe1, m->i0, m->chg0, needs_cr, 1,
269
- dest ? dest + size : NULL) < 0)
270
- return -1;
271
- GIT_ERROR_CHECK_ALLOC_ADD(&size, size, copied);
249
+ size += xdl_orig_copy(xe1, m->i0, m->chg0, needs_cr, 1,
250
+ dest ? dest + size : NULL);
272
251
  }
273
252
 
274
253
  if (!dest) {
275
- GIT_ERROR_CHECK_ALLOC_ADD4(&size, size, marker_size, 1, needs_cr);
254
+ size += marker_size + 1 + needs_cr;
276
255
  } else {
277
256
  memset(dest + size, '=', marker_size);
278
257
  size += marker_size;
@@ -282,14 +261,10 @@ static int fill_conflict_hunk(size_t *out, xdfenv_t *xe1, const char *name1,
282
261
  }
283
262
 
284
263
  /* Postimage from side #2 */
285
-
286
- if (xdl_recs_copy(&copied, xe2, m->i2, m->chg2, needs_cr, 1,
287
- dest ? dest + size : NULL) < 0)
288
- return -1;
289
- GIT_ERROR_CHECK_ALLOC_ADD(&size, size, copied);
290
-
264
+ size += xdl_recs_copy(xe2, m->i2, m->chg2, needs_cr, 1,
265
+ dest ? dest + size : NULL);
291
266
  if (!dest) {
292
- GIT_ERROR_CHECK_ALLOC_ADD5(&size, size, marker_size, 1, needs_cr, marker2_size);
267
+ size += marker_size + 1 + needs_cr + marker2_size;
293
268
  } else {
294
269
  memset(dest + size, '>', marker_size);
295
270
  size += marker_size;
@@ -302,71 +277,83 @@ static int fill_conflict_hunk(size_t *out, xdfenv_t *xe1, const char *name1,
302
277
  dest[size++] = '\r';
303
278
  dest[size++] = '\n';
304
279
  }
305
-
306
- *out = size;
307
- return 0;
280
+ return size;
308
281
  }
309
282
 
310
- static int xdl_fill_merge_buffer(size_t *out,
311
- xdfenv_t *xe1, const char *name1,
283
+ static int xdl_fill_merge_buffer(xdfenv_t *xe1, const char *name1,
312
284
  xdfenv_t *xe2, const char *name2,
313
285
  const char *ancestor_name,
314
286
  int favor,
315
287
  xdmerge_t *m, char *dest, int style,
316
288
  int marker_size)
317
289
  {
318
- size_t size, copied;
319
- int i;
320
-
321
- *out = 0;
290
+ int size, i;
322
291
 
323
292
  for (size = i = 0; m; m = m->next) {
324
293
  if (favor && !m->mode)
325
294
  m->mode = favor;
326
295
 
327
- if (m->mode == 0) {
328
- if (fill_conflict_hunk(&size, xe1, name1, xe2, name2,
296
+ if (m->mode == 0)
297
+ size = fill_conflict_hunk(xe1, name1, xe2, name2,
329
298
  ancestor_name,
330
299
  size, i, style, m, dest,
331
- marker_size) < 0)
332
- return -1;
333
- }
300
+ marker_size);
334
301
  else if (m->mode & 3) {
335
302
  /* Before conflicting part */
336
- if (xdl_recs_copy(&copied, xe1, i, m->i1 - i, 0, 0,
337
- dest ? dest + size : NULL) < 0)
338
- return -1;
339
- GIT_ERROR_CHECK_ALLOC_ADD(&size, size, copied);
340
-
303
+ size += xdl_recs_copy(xe1, i, m->i1 - i, 0, 0,
304
+ dest ? dest + size : NULL);
341
305
  /* Postimage from side #1 */
342
306
  if (m->mode & 1) {
343
307
  int needs_cr = is_cr_needed(xe1, xe2, m);
344
308
 
345
- if (xdl_recs_copy(&copied, xe1, m->i1, m->chg1, needs_cr, (m->mode & 2),
346
- dest ? dest + size : NULL) < 0)
347
- return -1;
348
- GIT_ERROR_CHECK_ALLOC_ADD(&size, size, copied);
309
+ size += xdl_recs_copy(xe1, m->i1, m->chg1, needs_cr, (m->mode & 2),
310
+ dest ? dest + size : NULL);
349
311
  }
350
-
351
312
  /* Postimage from side #2 */
352
- if (m->mode & 2) {
353
- if (xdl_recs_copy(&copied, xe2, m->i2, m->chg2, 0, 0,
354
- dest ? dest + size : NULL) < 0)
355
- return -1;
356
- GIT_ERROR_CHECK_ALLOC_ADD(&size, size, copied);
357
- }
313
+ if (m->mode & 2)
314
+ size += xdl_recs_copy(xe2, m->i2, m->chg2, 0, 0,
315
+ dest ? dest + size : NULL);
358
316
  } else
359
317
  continue;
360
318
  i = m->i1 + m->chg1;
361
319
  }
320
+ size += xdl_recs_copy(xe1, i, xe1->xdf2.nrec - i, 0, 0,
321
+ dest ? dest + size : NULL);
322
+ return size;
323
+ }
362
324
 
363
- if (xdl_recs_copy(&copied, xe1, i, xe1->xdf2.nrec - i, 0, 0,
364
- dest ? dest + size : NULL) < 0)
365
- return -1;
366
- GIT_ERROR_CHECK_ALLOC_ADD(&size, size, copied);
325
+ static int recmatch(xrecord_t *rec1, xrecord_t *rec2, unsigned long flags)
326
+ {
327
+ return xdl_recmatch(rec1->ptr, rec1->size,
328
+ rec2->ptr, rec2->size, flags);
329
+ }
367
330
 
368
- *out = size;
369
- return 0;
331
+ /*
332
+ * Remove any common lines from the beginning and end of the conflicted region.
333
+ */
334
+ static void xdl_refine_zdiff3_conflicts(xdfenv_t *xe1, xdfenv_t *xe2, xdmerge_t *m,
335
+ xpparam_t const *xpp)
336
+ {
337
+ xrecord_t **rec1 = xe1->xdf2.recs, **rec2 = xe2->xdf2.recs;
338
+ for (; m; m = m->next) {
339
+ /* let's handle just the conflicts */
340
+ if (m->mode)
341
+ continue;
342
+
343
+ while(m->chg1 && m->chg2 &&
344
+ recmatch(rec1[m->i1], rec2[m->i2], xpp->flags)) {
345
+ m->chg1--;
346
+ m->chg2--;
347
+ m->i1++;
348
+ m->i2++;
349
+ }
350
+ while (m->chg1 && m->chg2 &&
351
+ recmatch(rec1[m->i1 + m->chg1 - 1],
352
+ rec2[m->i2 + m->chg2 - 1], xpp->flags)) {
353
+ m->chg1--;
354
+ m->chg2--;
355
+ }
356
+ }
370
357
  }
371
358
 
372
359
  /*
@@ -469,7 +456,7 @@ static void xdl_merge_two_conflicts(xdmerge_t *m)
469
456
  m->chg1 = next_m->i1 + next_m->chg1 - m->i1;
470
457
  m->chg2 = next_m->i2 + next_m->chg2 - m->i2;
471
458
  m->next = next_m->next;
472
- free(next_m);
459
+ xdl_free(next_m);
473
460
  }
474
461
 
475
462
  /*
@@ -529,7 +516,22 @@ static int xdl_do_merge(xdfenv_t *xe1, xdchange_t *xscr1,
529
516
  int style = xmp->style;
530
517
  int favor = xmp->favor;
531
518
 
532
- if (style == XDL_MERGE_DIFF3) {
519
+ /*
520
+ * XDL_MERGE_DIFF3 does not attempt to refine conflicts by looking
521
+ * at common areas of sides 1 & 2, because the base (side 0) does
522
+ * not match and is being shown. Similarly, simplification of
523
+ * non-conflicts is also skipped due to the skipping of conflict
524
+ * refinement.
525
+ *
526
+ * XDL_MERGE_ZEALOUS_DIFF3, on the other hand, will attempt to
527
+ * refine conflicts looking for common areas of sides 1 & 2.
528
+ * However, since the base is being shown and does not match,
529
+ * it will only look for common areas at the beginning or end
530
+ * of the conflict block. Since XDL_MERGE_ZEALOUS_DIFF3's
531
+ * conflict refinement is much more limited in this fashion, the
532
+ * conflict simplification will be skipped.
533
+ */
534
+ if (style == XDL_MERGE_DIFF3 || style == XDL_MERGE_ZEALOUS_DIFF3) {
533
535
  /*
534
536
  * "diff3 -m" output does not make sense for anything
535
537
  * more aggressive than XDL_MERGE_EAGER.
@@ -650,34 +652,31 @@ static int xdl_do_merge(xdfenv_t *xe1, xdchange_t *xscr1,
650
652
  if (!changes)
651
653
  changes = c;
652
654
  /* refine conflicts */
653
- if (XDL_MERGE_ZEALOUS <= level &&
654
- (xdl_refine_conflicts(xe1, xe2, changes, xpp) < 0 ||
655
- xdl_simplify_non_conflicts(xe1, changes,
656
- XDL_MERGE_ZEALOUS < level) < 0)) {
655
+ if (style == XDL_MERGE_ZEALOUS_DIFF3) {
656
+ xdl_refine_zdiff3_conflicts(xe1, xe2, changes, xpp);
657
+ } else if (XDL_MERGE_ZEALOUS <= level &&
658
+ (xdl_refine_conflicts(xe1, xe2, changes, xpp) < 0 ||
659
+ xdl_simplify_non_conflicts(xe1, changes,
660
+ XDL_MERGE_ZEALOUS < level) < 0)) {
657
661
  xdl_cleanup_merge(changes);
658
662
  return -1;
659
663
  }
660
664
  /* output */
661
665
  if (result) {
662
666
  int marker_size = xmp->marker_size;
663
- size_t size;
664
-
665
- if (xdl_fill_merge_buffer(&size, xe1, name1, xe2, name2,
667
+ int size = xdl_fill_merge_buffer(xe1, name1, xe2, name2,
666
668
  ancestor_name,
667
669
  favor, changes, NULL, style,
668
- marker_size) < 0)
669
- return -1;
670
-
670
+ marker_size);
671
671
  result->ptr = xdl_malloc(size);
672
672
  if (!result->ptr) {
673
673
  xdl_cleanup_merge(changes);
674
674
  return -1;
675
675
  }
676
676
  result->size = size;
677
- if (xdl_fill_merge_buffer(&size, xe1, name1, xe2, name2,
677
+ xdl_fill_merge_buffer(xe1, name1, xe2, name2,
678
678
  ancestor_name, favor, changes,
679
- result->ptr, style, marker_size) < 0)
680
- return -1;
679
+ result->ptr, style, marker_size);
681
680
  }
682
681
  return xdl_cleanup_merge(changes);
683
682
  }
@@ -717,22 +716,10 @@ int xdl_merge(mmfile_t *orig, mmfile_t *mf1, mmfile_t *mf2,
717
716
  status = 0;
718
717
  if (!xscr1) {
719
718
  result->ptr = xdl_malloc(mf2->size);
720
- if (!result->ptr) {
721
- xdl_free_script(xscr2);
722
- xdl_free_env(&xe1);
723
- xdl_free_env(&xe2);
724
- return -1;
725
- }
726
719
  memcpy(result->ptr, mf2->ptr, mf2->size);
727
720
  result->size = mf2->size;
728
721
  } else if (!xscr2) {
729
722
  result->ptr = xdl_malloc(mf1->size);
730
- if (!result->ptr) {
731
- xdl_free_script(xscr1);
732
- xdl_free_env(&xe1);
733
- xdl_free_env(&xe2);
734
- return -1;
735
- }
736
723
  memcpy(result->ptr, mf1->ptr, mf1->size);
737
724
  result->size = mf1->size;
738
725
  } else {