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
@@ -27,6 +27,8 @@
27
27
  extern "C" {
28
28
  #endif /* #ifdef __cplusplus */
29
29
 
30
+ #include "git-xdiff.h"
31
+
30
32
  /* xpparm_t.flags */
31
33
  #define XDF_NEED_MINIMAL (1 << 0)
32
34
 
@@ -50,16 +52,9 @@ extern "C" {
50
52
 
51
53
  /* xdemitconf_t.flags */
52
54
  #define XDL_EMIT_FUNCNAMES (1 << 0)
55
+ #define XDL_EMIT_NO_HUNK_HDR (1 << 1)
53
56
  #define XDL_EMIT_FUNCCONTEXT (1 << 2)
54
57
 
55
- #define XDL_MMB_READONLY (1 << 0)
56
-
57
- #define XDL_MMF_ATOMIC (1 << 0)
58
-
59
- #define XDL_BDOP_INS 1
60
- #define XDL_BDOP_CPY 2
61
- #define XDL_BDOP_INSB 3
62
-
63
58
  /* merge simplification levels */
64
59
  #define XDL_MERGE_MINIMAL 0
65
60
  #define XDL_MERGE_EAGER 1
@@ -73,20 +68,25 @@ extern "C" {
73
68
 
74
69
  /* merge output styles */
75
70
  #define XDL_MERGE_DIFF3 1
71
+ #define XDL_MERGE_ZEALOUS_DIFF3 2
76
72
 
77
73
  typedef struct s_mmfile {
78
74
  char *ptr;
79
- size_t size;
75
+ long size;
80
76
  } mmfile_t;
81
77
 
82
78
  typedef struct s_mmbuffer {
83
79
  char *ptr;
84
- size_t size;
80
+ long size;
85
81
  } mmbuffer_t;
86
82
 
87
83
  typedef struct s_xpparam {
88
84
  unsigned long flags;
89
85
 
86
+ /* -I<regex> */
87
+ xdl_regex_t **ignore_regex;
88
+ size_t ignore_regex_nr;
89
+
90
90
  /* See Documentation/diff-options.txt. */
91
91
  char **anchors;
92
92
  size_t anchors_nr;
@@ -94,7 +94,11 @@ typedef struct s_xpparam {
94
94
 
95
95
  typedef struct s_xdemitcb {
96
96
  void *priv;
97
- int (*outf)(void *, mmbuffer_t *, int);
97
+ int (*out_hunk)(void *,
98
+ long old_begin, long old_nr,
99
+ long new_begin, long new_nr,
100
+ const char *func, long funclen);
101
+ int (*out_line)(void *, mmbuffer_t *, int);
98
102
  } xdemitcb_t;
99
103
 
100
104
  typedef long (*find_func_t)(const char *line, long line_len, char *buffer, long buffer_size, void *priv);
@@ -117,10 +121,6 @@ typedef struct s_bdiffparam {
117
121
  } bdiffparam_t;
118
122
 
119
123
 
120
- #define xdl_malloc(x) git__malloc(x)
121
- #define xdl_free(ptr) git__free(ptr)
122
- #define xdl_realloc(ptr,x) git__realloc(ptr,x)
123
-
124
124
  void *xdl_mmfile_first(mmfile_t *mmf, long *size);
125
125
  long xdl_mmfile_size(mmfile_t *mmf);
126
126
 
@@ -21,8 +21,6 @@
21
21
  */
22
22
 
23
23
  #include "xinclude.h"
24
- #include "integer.h"
25
-
26
24
 
27
25
  #define XDL_MAX_COST_MIN 256
28
26
  #define XDL_HEUR_MIN_COST 256
@@ -30,41 +28,19 @@
30
28
  #define XDL_SNAKE_CNT 20
31
29
  #define XDL_K_HEUR 4
32
30
 
33
- /** Declare a function as always inlined. */
34
- #if defined(_MSC_VER)
35
- # define XDL_INLINE(type) static __inline type
36
- #elif defined(__GNUC__)
37
- # define XDL_INLINE(type) static __inline__ type
38
- #else
39
- # define XDL_INLINE(type) static type
40
- #endif
41
-
42
31
  typedef struct s_xdpsplit {
43
32
  long i1, i2;
44
33
  int min_lo, min_hi;
45
34
  } xdpsplit_t;
46
35
 
47
-
48
-
49
-
50
- static long xdl_split(unsigned long const *ha1, long off1, long lim1,
51
- unsigned long const *ha2, long off2, long lim2,
52
- long *kvdf, long *kvdb, int need_min, xdpsplit_t *spl,
53
- xdalgoenv_t *xenv);
54
- static xdchange_t *xdl_add_change(xdchange_t *xscr, long i1, long i2, long chg1, long chg2);
55
-
56
-
57
-
58
-
59
-
60
36
  /*
61
37
  * See "An O(ND) Difference Algorithm and its Variations", by Eugene Myers.
62
38
  * Basically considers a "box" (off1, off2, lim1, lim2) and scan from both
63
39
  * the forward diagonal starting from (off1, off2) and the backward diagonal
64
40
  * starting from (lim1, lim2). If the K values on the same diagonal crosses
65
- * returns the furthest point of reach. We might end up having to expensive
66
- * cases using this algorithm is full, so a little bit of heuristic is needed
67
- * to cut the search and to return a suboptimal point.
41
+ * returns the furthest point of reach. We might encounter expensive edge cases
42
+ * using this algorithm, so a little bit of heuristic is needed to cut the
43
+ * search and to return a suboptimal point.
68
44
  */
69
45
  static long xdl_split(unsigned long const *ha1, long off1, long lim1,
70
46
  unsigned long const *ha2, long off2, long lim2,
@@ -87,11 +63,13 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
87
63
  int got_snake = 0;
88
64
 
89
65
  /*
90
- * We need to extent the diagonal "domain" by one. If the next
66
+ * We need to extend the diagonal "domain" by one. If the next
91
67
  * values exits the box boundaries we need to change it in the
92
- * opposite direction because (max - min) must be a power of two.
68
+ * opposite direction because (max - min) must be a power of
69
+ * two.
70
+ *
93
71
  * Also we initialize the external K value to -1 so that we can
94
- * avoid extra conditions check inside the core loop.
72
+ * avoid extra conditions in the check inside the core loop.
95
73
  */
96
74
  if (fmin > dmin)
97
75
  kvdf[--fmin - 1] = -1;
@@ -122,11 +100,13 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
122
100
  }
123
101
 
124
102
  /*
125
- * We need to extent the diagonal "domain" by one. If the next
103
+ * We need to extend the diagonal "domain" by one. If the next
126
104
  * values exits the box boundaries we need to change it in the
127
- * opposite direction because (max - min) must be a power of two.
105
+ * opposite direction because (max - min) must be a power of
106
+ * two.
107
+ *
128
108
  * Also we initialize the external K value to -1 so that we can
129
- * avoid extra conditions check inside the core loop.
109
+ * avoid extra conditions in the check inside the core loop.
130
110
  */
131
111
  if (bmin > dmin)
132
112
  kvdb[--bmin - 1] = XDL_LINE_MAX;
@@ -162,7 +142,7 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
162
142
  /*
163
143
  * If the edit cost is above the heuristic trigger and if
164
144
  * we got a good snake, we sample current diagonals to see
165
- * if some of the, have reached an "interesting" path. Our
145
+ * if some of them have reached an "interesting" path. Our
166
146
  * measure is a function of the distance from the diagonal
167
147
  * corner (i1 + i2) penalized with the distance from the
168
148
  * mid diagonal itself. If this value is above the current
@@ -220,8 +200,9 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
220
200
  }
221
201
 
222
202
  /*
223
- * Enough is enough. We spent too much time here and now we collect
224
- * the furthest reaching path using the (i1 + i2) measure.
203
+ * Enough is enough. We spent too much time here and now we
204
+ * collect the furthest reaching path using the (i1 + i2)
205
+ * measure.
225
206
  */
226
207
  if (ec >= xenv->mxcost) {
227
208
  long fbest, fbest1, bbest, bbest1;
@@ -268,9 +249,9 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
268
249
 
269
250
 
270
251
  /*
271
- * Rule: "Divide et Impera". Recursively split the box in sub-boxes by calling
272
- * the box splitting function. Note that the real job (marking changed lines)
273
- * is done in the two boundary reaching checks.
252
+ * Rule: "Divide et Impera" (divide & conquer). Recursively split the box in
253
+ * sub-boxes by calling the box splitting function. Note that the real job
254
+ * (marking changed lines) is done in the two boundary reaching checks.
274
255
  */
275
256
  int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1,
276
257
  diffdata_t *dd2, long off2, long lim2,
@@ -330,7 +311,7 @@ int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1,
330
311
 
331
312
  int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
332
313
  xdfenv_t *xe) {
333
- size_t ndiags, allocsize;
314
+ long ndiags;
334
315
  long *kvd, *kvdf, *kvdb;
335
316
  xdalgoenv_t xenv;
336
317
  diffdata_t dd1, dd2;
@@ -347,15 +328,14 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
347
328
  }
348
329
 
349
330
  /*
350
- * Allocate and setup K vectors to be used by the differential algorithm.
331
+ * Allocate and setup K vectors to be used by the differential
332
+ * algorithm.
333
+ *
351
334
  * One is to store the forward path and one to store the backward path.
352
335
  */
353
- GIT_ERROR_CHECK_ALLOC_ADD3(&ndiags, xe->xdf1.nreff, xe->xdf2.nreff, 3);
354
- GIT_ERROR_CHECK_ALLOC_MULTIPLY(&allocsize, ndiags, 2);
355
- GIT_ERROR_CHECK_ALLOC_ADD(&allocsize, allocsize, 2);
356
- GIT_ERROR_CHECK_ALLOC_MULTIPLY(&allocsize, allocsize, sizeof(long));
336
+ ndiags = xe->xdf1.nreff + xe->xdf2.nreff + 3;
337
+ if (!(kvd = (long *) xdl_malloc((2 * ndiags + 2) * sizeof(long)))) {
357
338
 
358
- if (!(kvd = (long *) xdl_malloc(allocsize))) {
359
339
  xdl_free_env(xe);
360
340
  return -1;
361
341
  }
@@ -410,19 +390,16 @@ static xdchange_t *xdl_add_change(xdchange_t *xscr, long i1, long i2, long chg1,
410
390
  }
411
391
 
412
392
 
413
- static int recs_match(xrecord_t *rec1, xrecord_t *rec2, long flags)
393
+ static int recs_match(xrecord_t *rec1, xrecord_t *rec2)
414
394
  {
415
- return (rec1->ha == rec2->ha &&
416
- xdl_recmatch(rec1->ptr, rec1->size,
417
- rec2->ptr, rec2->size,
418
- flags));
395
+ return (rec1->ha == rec2->ha);
419
396
  }
420
397
 
421
398
  /*
422
399
  * If a line is indented more than this, get_indent() just returns this value.
423
400
  * This avoids having to do absurd amounts of work for data that are not
424
- * human-readable text, and also ensures that the output of get_indent fits within
425
- * an int.
401
+ * human-readable text, and also ensures that the output of get_indent fits
402
+ * within an int.
426
403
  */
427
404
  #define MAX_INDENT 200
428
405
 
@@ -456,9 +433,9 @@ static int get_indent(xrecord_t *rec)
456
433
  }
457
434
 
458
435
  /*
459
- * If more than this number of consecutive blank rows are found, just return this
460
- * value. This avoids requiring O(N^2) work for pathological cases, and also
461
- * ensures that the output of score_split fits in an int.
436
+ * If more than this number of consecutive blank rows are found, just return
437
+ * this value. This avoids requiring O(N^2) work for pathological cases, and
438
+ * also ensures that the output of score_split fits in an int.
462
439
  */
463
440
  #define MAX_BLANKS 20
464
441
 
@@ -470,8 +447,8 @@ struct split_measurement {
470
447
  int end_of_file;
471
448
 
472
449
  /*
473
- * How much is the line immediately following the split indented (or -1 if
474
- * the line is blank):
450
+ * How much is the line immediately following the split indented (or -1
451
+ * if the line is blank):
475
452
  */
476
453
  int indent;
477
454
 
@@ -481,8 +458,8 @@ struct split_measurement {
481
458
  int pre_blank;
482
459
 
483
460
  /*
484
- * How much is the nearest non-blank line above the split indented (or -1
485
- * if there is no such line)?
461
+ * How much is the nearest non-blank line above the split indented (or
462
+ * -1 if there is no such line)?
486
463
  */
487
464
  int pre_indent;
488
465
 
@@ -601,15 +578,20 @@ static void measure_split(const xdfile_t *xdf, long split,
601
578
  */
602
579
  #define INDENT_WEIGHT 60
603
580
 
581
+ /*
582
+ * How far do we slide a hunk at most?
583
+ */
584
+ #define INDENT_HEURISTIC_MAX_SLIDING 100
585
+
604
586
  /*
605
587
  * Compute a badness score for the hypothetical split whose measurements are
606
- * stored in m. The weight factors were determined empirically using the tools and
607
- * corpus described in
588
+ * stored in m. The weight factors were determined empirically using the tools
589
+ * and corpus described in
608
590
  *
609
591
  * https://github.com/mhagger/diff-slider-tools
610
592
  *
611
- * Also see that project if you want to improve the weights based on, for example,
612
- * a larger or more diverse corpus.
593
+ * Also see that project if you want to improve the weights based on, for
594
+ * example, a larger or more diverse corpus.
613
595
  */
614
596
  static void score_add_split(const struct split_measurement *m, struct split_score *s)
615
597
  {
@@ -741,7 +723,7 @@ static void group_init(xdfile_t *xdf, struct xdlgroup *g)
741
723
  * Move g to describe the next (possibly empty) group in xdf and return 0. If g
742
724
  * is already at the end of the file, do nothing and return -1.
743
725
  */
744
- XDL_INLINE(int) group_next(xdfile_t *xdf, struct xdlgroup *g)
726
+ static inline int group_next(xdfile_t *xdf, struct xdlgroup *g)
745
727
  {
746
728
  if (g->end == xdf->nrec)
747
729
  return -1;
@@ -757,7 +739,7 @@ XDL_INLINE(int) group_next(xdfile_t *xdf, struct xdlgroup *g)
757
739
  * Move g to describe the previous (possibly empty) group in xdf and return 0.
758
740
  * If g is already at the beginning of the file, do nothing and return -1.
759
741
  */
760
- XDL_INLINE(int) group_previous(xdfile_t *xdf, struct xdlgroup *g)
742
+ static inline int group_previous(xdfile_t *xdf, struct xdlgroup *g)
761
743
  {
762
744
  if (g->start == 0)
763
745
  return -1;
@@ -774,10 +756,10 @@ XDL_INLINE(int) group_previous(xdfile_t *xdf, struct xdlgroup *g)
774
756
  * following group, expand this group to include it. Return 0 on success or -1
775
757
  * if g cannot be slid down.
776
758
  */
777
- static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g, long flags)
759
+ static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g)
778
760
  {
779
761
  if (g->end < xdf->nrec &&
780
- recs_match(xdf->recs[g->start], xdf->recs[g->end], flags)) {
762
+ recs_match(xdf->recs[g->start], xdf->recs[g->end])) {
781
763
  xdf->rchg[g->start++] = 0;
782
764
  xdf->rchg[g->end++] = 1;
783
765
 
@@ -795,10 +777,10 @@ static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g, long flags)
795
777
  * into a previous group, expand this group to include it. Return 0 on success
796
778
  * or -1 if g cannot be slid up.
797
779
  */
798
- static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g, long flags)
780
+ static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g)
799
781
  {
800
782
  if (g->start > 0 &&
801
- recs_match(xdf->recs[g->start - 1], xdf->recs[g->end - 1], flags)) {
783
+ recs_match(xdf->recs[g->start - 1], xdf->recs[g->end - 1])) {
802
784
  xdf->rchg[--g->start] = 1;
803
785
  xdf->rchg[--g->end] = 0;
804
786
 
@@ -811,12 +793,6 @@ static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g, long flags)
811
793
  }
812
794
  }
813
795
 
814
- static void xdl_bug(const char *msg)
815
- {
816
- fprintf(stderr, "BUG: %s\n", msg);
817
- exit(1);
818
- }
819
-
820
796
  /*
821
797
  * Move back and forward change groups for a consistent and pretty diff output.
822
798
  * This also helps in finding joinable change groups and reducing the diff
@@ -831,13 +807,16 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
831
807
  group_init(xdfo, &go);
832
808
 
833
809
  while (1) {
834
- /* If the group is empty in the to-be-compacted file, skip it: */
810
+ /*
811
+ * If the group is empty in the to-be-compacted file, skip it:
812
+ */
835
813
  if (g.end == g.start)
836
814
  goto next;
837
815
 
838
816
  /*
839
817
  * Now shift the change up and then down as far as possible in
840
- * each direction. If it bumps into any other changes, merge them.
818
+ * each direction. If it bumps into any other changes, merge
819
+ * them.
841
820
  */
842
821
  do {
843
822
  groupsize = g.end - g.start;
@@ -851,9 +830,9 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
851
830
  end_matching_other = -1;
852
831
 
853
832
  /* Shift the group backward as much as possible: */
854
- while (!group_slide_up(xdf, &g, flags))
833
+ while (!group_slide_up(xdf, &g))
855
834
  if (group_previous(xdfo, &go))
856
- xdl_bug("group sync broken sliding up");
835
+ XDL_BUG("group sync broken sliding up");
857
836
 
858
837
  /*
859
838
  * This is this highest that this group can be shifted.
@@ -866,10 +845,10 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
866
845
 
867
846
  /* Now shift the group forward as far as possible: */
868
847
  while (1) {
869
- if (group_slide_down(xdf, &g, flags))
848
+ if (group_slide_down(xdf, &g))
870
849
  break;
871
850
  if (group_next(xdfo, &go))
872
- xdl_bug("group sync broken sliding down");
851
+ XDL_BUG("group sync broken sliding down");
873
852
 
874
853
  if (go.end > go.start)
875
854
  end_matching_other = g.end;
@@ -880,40 +859,46 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
880
859
  * If the group can be shifted, then we can possibly use this
881
860
  * freedom to produce a more intuitive diff.
882
861
  *
883
- * The group is currently shifted as far down as possible, so the
884
- * heuristics below only have to handle upwards shifts.
862
+ * The group is currently shifted as far down as possible, so
863
+ * the heuristics below only have to handle upwards shifts.
885
864
  */
886
865
 
887
866
  if (g.end == earliest_end) {
888
867
  /* no shifting was possible */
889
868
  } else if (end_matching_other != -1) {
890
869
  /*
891
- * Move the possibly merged group of changes back to line
892
- * up with the last group of changes from the other file
893
- * that it can align with.
870
+ * Move the possibly merged group of changes back to
871
+ * line up with the last group of changes from the
872
+ * other file that it can align with.
894
873
  */
895
874
  while (go.end == go.start) {
896
- if (group_slide_up(xdf, &g, flags))
897
- xdl_bug("match disappeared");
875
+ if (group_slide_up(xdf, &g))
876
+ XDL_BUG("match disappeared");
898
877
  if (group_previous(xdfo, &go))
899
- xdl_bug("group sync broken sliding to match");
878
+ XDL_BUG("group sync broken sliding to match");
900
879
  }
901
880
  } else if (flags & XDF_INDENT_HEURISTIC) {
902
881
  /*
903
882
  * Indent heuristic: a group of pure add/delete lines
904
- * implies two splits, one between the end of the "before"
905
- * context and the start of the group, and another between
906
- * the end of the group and the beginning of the "after"
907
- * context. Some splits are aesthetically better and some
908
- * are worse. We compute a badness "score" for each split,
909
- * and add the scores for the two splits to define a
910
- * "score" for each position that the group can be shifted
911
- * to. Then we pick the shift with the lowest score.
883
+ * implies two splits, one between the end of the
884
+ * "before" context and the start of the group, and
885
+ * another between the end of the group and the
886
+ * beginning of the "after" context. Some splits are
887
+ * aesthetically better and some are worse. We compute
888
+ * a badness "score" for each split, and add the scores
889
+ * for the two splits to define a "score" for each
890
+ * position that the group can be shifted to. Then we
891
+ * pick the shift with the lowest score.
912
892
  */
913
893
  long shift, best_shift = -1;
914
894
  struct split_score best_score;
915
895
 
916
- for (shift = earliest_end; shift <= g.end; shift++) {
896
+ shift = earliest_end;
897
+ if (g.end - groupsize - 1 > shift)
898
+ shift = g.end - groupsize - 1;
899
+ if (g.end - INDENT_HEURISTIC_MAX_SLIDING > shift)
900
+ shift = g.end - INDENT_HEURISTIC_MAX_SLIDING;
901
+ for (; shift <= g.end; shift++) {
917
902
  struct split_measurement m;
918
903
  struct split_score score = {0, 0};
919
904
 
@@ -930,10 +915,10 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
930
915
  }
931
916
 
932
917
  while (g.end > best_shift) {
933
- if (group_slide_up(xdf, &g, flags))
934
- xdl_bug("best shift unreached");
918
+ if (group_slide_up(xdf, &g))
919
+ XDL_BUG("best shift unreached");
935
920
  if (group_previous(xdfo, &go))
936
- xdl_bug("group sync broken sliding to blank line");
921
+ XDL_BUG("group sync broken sliding to blank line");
937
922
  }
938
923
  }
939
924
 
@@ -942,11 +927,11 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
942
927
  if (group_next(xdf, &g))
943
928
  break;
944
929
  if (group_next(xdfo, &go))
945
- xdl_bug("group sync broken moving to next group");
930
+ XDL_BUG("group sync broken moving to next group");
946
931
  }
947
932
 
948
933
  if (!group_next(xdfo, &go))
949
- xdl_bug("group sync broken at end of file");
934
+ XDL_BUG("group sync broken at end of file");
950
935
 
951
936
  return 0;
952
937
  }
@@ -992,8 +977,6 @@ static int xdl_call_hunk_func(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
992
977
  {
993
978
  xdchange_t *xch, *xche;
994
979
 
995
- (void)xe;
996
-
997
980
  for (xch = xscr; xch; xch = xche->next) {
998
981
  xche = xdl_get_hunk(&xch, xecfg);
999
982
  if (!xch)
@@ -1006,7 +989,7 @@ static int xdl_call_hunk_func(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
1006
989
  return 0;
1007
990
  }
1008
991
 
1009
- static void xdl_mark_ignorable(xdchange_t *xscr, xdfenv_t *xe, long flags)
992
+ static void xdl_mark_ignorable_lines(xdchange_t *xscr, xdfenv_t *xe, long flags)
1010
993
  {
1011
994
  xdchange_t *xch;
1012
995
 
@@ -1027,6 +1010,46 @@ static void xdl_mark_ignorable(xdchange_t *xscr, xdfenv_t *xe, long flags)
1027
1010
  }
1028
1011
  }
1029
1012
 
1013
+ static int record_matches_regex(xrecord_t *rec, xpparam_t const *xpp) {
1014
+ xdl_regmatch_t regmatch;
1015
+ int i;
1016
+
1017
+ for (i = 0; i < xpp->ignore_regex_nr; i++)
1018
+ if (!xdl_regexec_buf(xpp->ignore_regex[i], rec->ptr, rec->size, 1,
1019
+ &regmatch, 0))
1020
+ return 1;
1021
+
1022
+ return 0;
1023
+ }
1024
+
1025
+ static void xdl_mark_ignorable_regex(xdchange_t *xscr, const xdfenv_t *xe,
1026
+ xpparam_t const *xpp)
1027
+ {
1028
+ xdchange_t *xch;
1029
+
1030
+ for (xch = xscr; xch; xch = xch->next) {
1031
+ xrecord_t **rec;
1032
+ int ignore = 1;
1033
+ long i;
1034
+
1035
+ /*
1036
+ * Do not override --ignore-blank-lines.
1037
+ */
1038
+ if (xch->ignore)
1039
+ continue;
1040
+
1041
+ rec = &xe->xdf1.recs[xch->i1];
1042
+ for (i = 0; i < xch->chg1 && ignore; i++)
1043
+ ignore = record_matches_regex(rec[i], xpp);
1044
+
1045
+ rec = &xe->xdf2.recs[xch->i2];
1046
+ for (i = 0; i < xch->chg2 && ignore; i++)
1047
+ ignore = record_matches_regex(rec[i], xpp);
1048
+
1049
+ xch->ignore = ignore;
1050
+ }
1051
+ }
1052
+
1030
1053
  int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
1031
1054
  xdemitconf_t const *xecfg, xdemitcb_t *ecb) {
1032
1055
  xdchange_t *xscr;
@@ -1046,7 +1069,10 @@ int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
1046
1069
  }
1047
1070
  if (xscr) {
1048
1071
  if (xpp->flags & XDF_IGNORE_BLANK_LINES)
1049
- xdl_mark_ignorable(xscr, &xe, xpp->flags);
1072
+ xdl_mark_ignorable_lines(xscr, &xe, xpp->flags);
1073
+
1074
+ if (xpp->ignore_regex)
1075
+ xdl_mark_ignorable_regex(xscr, &xe, xpp);
1050
1076
 
1051
1077
  if (ef(&xe, xscr, ecb, xecfg) < 0) {
1052
1078
 
@@ -31,7 +31,7 @@ static long xdl_get_rec(xdfile_t *xdf, long ri, char const **rec) {
31
31
 
32
32
 
33
33
  static int xdl_emit_record(xdfile_t *xdf, long ri, char const *pre, xdemitcb_t *ecb) {
34
- long size, psize = (long)strlen(pre);
34
+ long size, psize = strlen(pre);
35
35
  char const *rec;
36
36
 
37
37
  size = xdl_get_rec(xdf, ri, &rec);
@@ -81,7 +81,7 @@ xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg)
81
81
  } else if (distance < max_ignorable && xch->ignore) {
82
82
  ignored += xch->chg2;
83
83
  } else if (lxch != xchp &&
84
- xch->i1 + ignored - (lxch->i1 + lxch->chg1) > (unsigned long)max_common) {
84
+ xch->i1 + ignored - (lxch->i1 + lxch->chg1) > max_common) {
85
85
  break;
86
86
  } else if (!xch->ignore) {
87
87
  lxch = xch;
@@ -97,8 +97,6 @@ xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg)
97
97
 
98
98
  static long def_ff(const char *rec, long len, char *buf, long sz, void *priv)
99
99
  {
100
- (void)priv;
101
-
102
100
  if (len > 0 &&
103
101
  (isalpha((unsigned char)*rec) || /* identifier? */
104
102
  *rec == '_' || /* also identifier? */
@@ -174,10 +172,12 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
174
172
  struct func_line func_line = { 0 };
175
173
 
176
174
  for (xch = xscr; xch; xch = xche->next) {
175
+ xdchange_t *xchp = xch;
177
176
  xche = xdl_get_hunk(&xch, xecfg);
178
177
  if (!xch)
179
178
  break;
180
179
 
180
+ pre_context_calculation:
181
181
  s1 = XDL_MAX(xch->i1 - xecfg->ctxlen, 0);
182
182
  s2 = XDL_MAX(xch->i2 - xecfg->ctxlen, 0);
183
183
 
@@ -212,8 +212,23 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
212
212
  if (fs1 < 0)
213
213
  fs1 = 0;
214
214
  if (fs1 < s1) {
215
- s2 -= s1 - fs1;
215
+ s2 = XDL_MAX(s2 - (s1 - fs1), 0);
216
216
  s1 = fs1;
217
+
218
+ /*
219
+ * Did we extend context upwards into an
220
+ * ignored change?
221
+ */
222
+ while (xchp != xch &&
223
+ xchp->i1 + xchp->chg1 <= s1 &&
224
+ xchp->i2 + xchp->chg2 <= s2)
225
+ xchp = xchp->next;
226
+
227
+ /* If so, show it after all. */
228
+ if (xchp != xch) {
229
+ xch = xchp;
230
+ goto pre_context_calculation;
231
+ }
217
232
  }
218
233
  }
219
234
 
@@ -234,7 +249,7 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
234
249
  if (fe1 < 0)
235
250
  fe1 = xe->xdf1.nrec;
236
251
  if (fe1 > e1) {
237
- e2 += fe1 - e1;
252
+ e2 = XDL_MIN(e2 + (fe1 - e1), xe->xdf2.nrec);
238
253
  e1 = fe1;
239
254
  }
240
255
 
@@ -263,7 +278,8 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
263
278
  s1 - 1, funclineprev);
264
279
  funclineprev = s1 - 1;
265
280
  }
266
- if (xdl_emit_hunk_hdr(s1 + 1, e1 - s1, s2 + 1, e2 - s2,
281
+ if (!(xecfg->flags & XDL_EMIT_NO_HUNK_HDR) &&
282
+ xdl_emit_hunk_hdr(s1 + 1, e1 - s1, s2 + 1, e2 - s2,
267
283
  func_line.buf, func_line.len, ecb) < 0)
268
284
  return -1;
269
285