rugged 0.27.7 → 0.27.10

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 (409) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rugged/version.rb +1 -1
  3. data/vendor/libgit2/AUTHORS +1 -0
  4. data/vendor/libgit2/CMakeLists.txt +99 -51
  5. data/vendor/libgit2/COPYING +28 -0
  6. data/vendor/libgit2/cmake/Modules/AddCFlagIfSupported.cmake +15 -1
  7. data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.c.in +29 -0
  8. data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.cmake +96 -0
  9. data/vendor/libgit2/cmake/Modules/EnableWarnings.cmake +9 -8
  10. data/vendor/libgit2/cmake/Modules/FindCoreFoundation.cmake +2 -2
  11. data/vendor/libgit2/cmake/Modules/FindGSSAPI.cmake +1 -1
  12. data/vendor/libgit2/cmake/Modules/FindGSSFramework.cmake +28 -0
  13. data/vendor/libgit2/cmake/Modules/FindIconv.cmake +11 -6
  14. data/vendor/libgit2/cmake/Modules/FindPCRE.cmake +38 -0
  15. data/vendor/libgit2/cmake/Modules/FindPCRE2.cmake +37 -0
  16. data/vendor/libgit2/cmake/Modules/FindSecurity.cmake +2 -2
  17. data/vendor/libgit2/cmake/Modules/FindStatNsec.cmake +6 -0
  18. data/vendor/libgit2/cmake/Modules/PkgBuildConfig.cmake +110 -0
  19. data/vendor/libgit2/cmake/Modules/SelectGSSAPI.cmake +53 -0
  20. data/vendor/libgit2/cmake/Modules/SelectHTTPSBackend.cmake +124 -0
  21. data/vendor/libgit2/cmake/Modules/SelectHashes.cmake +66 -0
  22. data/vendor/libgit2/deps/http-parser/http_parser.c +11 -6
  23. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +21 -0
  24. data/vendor/libgit2/deps/ntlmclient/compat.h +33 -0
  25. data/vendor/libgit2/deps/ntlmclient/crypt.h +64 -0
  26. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +120 -0
  27. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.h +18 -0
  28. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +145 -0
  29. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.h +18 -0
  30. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +130 -0
  31. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.h +21 -0
  32. data/vendor/libgit2/deps/ntlmclient/ntlm.c +1420 -0
  33. data/vendor/libgit2/deps/ntlmclient/ntlm.h +174 -0
  34. data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +320 -0
  35. data/vendor/libgit2/deps/ntlmclient/unicode.h +36 -0
  36. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +445 -0
  37. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +201 -0
  38. data/vendor/libgit2/deps/ntlmclient/utf8.h +1257 -0
  39. data/vendor/libgit2/deps/ntlmclient/util.c +21 -0
  40. data/vendor/libgit2/deps/ntlmclient/util.h +14 -0
  41. data/vendor/libgit2/deps/pcre/CMakeLists.txt +140 -0
  42. data/vendor/libgit2/deps/pcre/COPYING +5 -0
  43. data/vendor/libgit2/deps/pcre/cmake/COPYING-CMAKE-SCRIPTS +22 -0
  44. data/vendor/libgit2/deps/pcre/cmake/FindEditline.cmake +17 -0
  45. data/vendor/libgit2/deps/pcre/cmake/FindPackageHandleStandardArgs.cmake +58 -0
  46. data/vendor/libgit2/deps/pcre/cmake/FindReadline.cmake +29 -0
  47. data/vendor/libgit2/deps/pcre/config.h.in +57 -0
  48. data/vendor/libgit2/deps/pcre/pcre.h +641 -0
  49. data/vendor/libgit2/deps/pcre/pcre_byte_order.c +319 -0
  50. data/vendor/libgit2/deps/pcre/pcre_chartables.c +198 -0
  51. data/vendor/libgit2/deps/pcre/pcre_compile.c +9800 -0
  52. data/vendor/libgit2/deps/pcre/pcre_config.c +190 -0
  53. data/vendor/libgit2/deps/pcre/pcre_dfa_exec.c +3676 -0
  54. data/vendor/libgit2/deps/pcre/pcre_exec.c +7173 -0
  55. data/vendor/libgit2/deps/pcre/pcre_fullinfo.c +245 -0
  56. data/vendor/libgit2/deps/pcre/pcre_get.c +669 -0
  57. data/vendor/libgit2/deps/pcre/pcre_globals.c +86 -0
  58. data/vendor/libgit2/deps/pcre/pcre_internal.h +2787 -0
  59. data/vendor/libgit2/deps/pcre/pcre_jit_compile.c +11913 -0
  60. data/vendor/libgit2/deps/pcre/pcre_maketables.c +156 -0
  61. data/vendor/libgit2/deps/pcre/pcre_newline.c +210 -0
  62. data/vendor/libgit2/deps/pcre/pcre_ord2utf8.c +94 -0
  63. data/vendor/libgit2/deps/pcre/pcre_printint.c +834 -0
  64. data/vendor/libgit2/deps/pcre/pcre_refcount.c +92 -0
  65. data/vendor/libgit2/deps/pcre/pcre_string_utils.c +211 -0
  66. data/vendor/libgit2/deps/pcre/pcre_study.c +1686 -0
  67. data/vendor/libgit2/deps/pcre/pcre_tables.c +727 -0
  68. data/vendor/libgit2/deps/pcre/pcre_ucd.c +3644 -0
  69. data/vendor/libgit2/deps/pcre/pcre_valid_utf8.c +301 -0
  70. data/vendor/libgit2/deps/pcre/pcre_version.c +98 -0
  71. data/vendor/libgit2/deps/pcre/pcre_xclass.c +268 -0
  72. data/vendor/libgit2/deps/pcre/pcreposix.c +421 -0
  73. data/vendor/libgit2/deps/pcre/pcreposix.h +117 -0
  74. data/vendor/libgit2/deps/pcre/ucp.h +224 -0
  75. data/vendor/libgit2/deps/winhttp/COPYING.GPL +993 -0
  76. data/vendor/libgit2/deps/winhttp/COPYING.LGPL +502 -0
  77. data/vendor/libgit2/deps/zlib/CMakeLists.txt +1 -0
  78. data/vendor/libgit2/deps/zlib/COPYING +27 -0
  79. data/vendor/libgit2/deps/zlib/adler32.c +0 -7
  80. data/vendor/libgit2/deps/zlib/crc32.c +0 -7
  81. data/vendor/libgit2/include/git2/annotated_commit.h +9 -0
  82. data/vendor/libgit2/include/git2/apply.h +149 -0
  83. data/vendor/libgit2/include/git2/attr.h +20 -13
  84. data/vendor/libgit2/include/git2/blame.h +4 -4
  85. data/vendor/libgit2/include/git2/blob.h +44 -12
  86. data/vendor/libgit2/include/git2/buffer.h +20 -26
  87. data/vendor/libgit2/include/git2/cert.h +135 -0
  88. data/vendor/libgit2/include/git2/checkout.h +53 -21
  89. data/vendor/libgit2/include/git2/cherrypick.h +3 -3
  90. data/vendor/libgit2/include/git2/clone.h +5 -5
  91. data/vendor/libgit2/include/git2/commit.h +25 -3
  92. data/vendor/libgit2/include/git2/common.h +35 -10
  93. data/vendor/libgit2/include/git2/config.h +29 -19
  94. data/vendor/libgit2/include/git2/cred.h +308 -0
  95. data/vendor/libgit2/include/git2/deprecated.h +493 -0
  96. data/vendor/libgit2/include/git2/describe.h +4 -4
  97. data/vendor/libgit2/include/git2/diff.h +177 -135
  98. data/vendor/libgit2/include/git2/errors.h +53 -46
  99. data/vendor/libgit2/include/git2/filter.h +8 -0
  100. data/vendor/libgit2/include/git2/index.h +74 -52
  101. data/vendor/libgit2/include/git2/indexer.h +76 -6
  102. data/vendor/libgit2/include/git2/merge.h +25 -10
  103. data/vendor/libgit2/include/git2/net.h +0 -5
  104. data/vendor/libgit2/include/git2/notes.h +1 -1
  105. data/vendor/libgit2/include/git2/object.h +17 -29
  106. data/vendor/libgit2/include/git2/odb.h +12 -11
  107. data/vendor/libgit2/include/git2/odb_backend.h +10 -9
  108. data/vendor/libgit2/include/git2/oid.h +2 -2
  109. data/vendor/libgit2/include/git2/pack.h +14 -3
  110. data/vendor/libgit2/include/git2/proxy.h +5 -3
  111. data/vendor/libgit2/include/git2/rebase.h +46 -2
  112. data/vendor/libgit2/include/git2/refs.h +34 -16
  113. data/vendor/libgit2/include/git2/remote.h +111 -14
  114. data/vendor/libgit2/include/git2/repository.h +69 -34
  115. data/vendor/libgit2/include/git2/revert.h +1 -1
  116. data/vendor/libgit2/include/git2/revwalk.h +7 -7
  117. data/vendor/libgit2/include/git2/signature.h +2 -2
  118. data/vendor/libgit2/include/git2/stash.h +5 -5
  119. data/vendor/libgit2/include/git2/status.h +26 -17
  120. data/vendor/libgit2/include/git2/submodule.h +23 -6
  121. data/vendor/libgit2/include/git2/sys/alloc.h +18 -18
  122. data/vendor/libgit2/include/git2/sys/commit.h +1 -1
  123. data/vendor/libgit2/include/git2/sys/config.h +13 -13
  124. data/vendor/libgit2/include/git2/sys/cred.h +90 -0
  125. data/vendor/libgit2/include/git2/sys/filter.h +6 -6
  126. data/vendor/libgit2/include/git2/sys/merge.h +3 -3
  127. data/vendor/libgit2/include/git2/sys/odb_backend.h +66 -22
  128. data/vendor/libgit2/include/git2/sys/path.h +14 -5
  129. data/vendor/libgit2/include/git2/sys/refdb_backend.h +76 -40
  130. data/vendor/libgit2/include/git2/sys/repository.h +5 -1
  131. data/vendor/libgit2/include/git2/sys/stream.h +92 -12
  132. data/vendor/libgit2/include/git2/sys/transport.h +129 -83
  133. data/vendor/libgit2/include/git2/tag.h +13 -4
  134. data/vendor/libgit2/include/git2/trace.h +2 -2
  135. data/vendor/libgit2/include/git2/transport.h +11 -311
  136. data/vendor/libgit2/include/git2/tree.h +4 -4
  137. data/vendor/libgit2/include/git2/types.h +25 -106
  138. data/vendor/libgit2/include/git2/version.h +3 -3
  139. data/vendor/libgit2/include/git2/worktree.h +5 -5
  140. data/vendor/libgit2/include/git2.h +4 -0
  141. data/vendor/libgit2/src/CMakeLists.txt +104 -235
  142. data/vendor/libgit2/src/alloc.c +14 -18
  143. data/vendor/libgit2/src/{stdalloc.c → allocators/stdalloc.c} +7 -8
  144. data/vendor/libgit2/src/{stdalloc.h → allocators/stdalloc.h} +4 -4
  145. data/vendor/libgit2/src/allocators/win32_crtdbg.c +118 -0
  146. data/vendor/libgit2/src/{transports/cred.h → allocators/win32_crtdbg.h} +5 -4
  147. data/vendor/libgit2/src/annotated_commit.c +18 -11
  148. data/vendor/libgit2/src/apply.c +535 -28
  149. data/vendor/libgit2/src/apply.h +3 -1
  150. data/vendor/libgit2/src/array.h +2 -2
  151. data/vendor/libgit2/src/attr.c +77 -71
  152. data/vendor/libgit2/src/attr_file.c +203 -117
  153. data/vendor/libgit2/src/attr_file.h +9 -9
  154. data/vendor/libgit2/src/attrcache.c +49 -51
  155. data/vendor/libgit2/src/attrcache.h +2 -1
  156. data/vendor/libgit2/src/blame.c +38 -18
  157. data/vendor/libgit2/src/blame.h +1 -1
  158. data/vendor/libgit2/src/blame_git.c +29 -15
  159. data/vendor/libgit2/src/blob.c +123 -37
  160. data/vendor/libgit2/src/blob.h +19 -2
  161. data/vendor/libgit2/src/branch.c +47 -23
  162. data/vendor/libgit2/src/buf_text.c +7 -6
  163. data/vendor/libgit2/src/buffer.c +60 -53
  164. data/vendor/libgit2/src/cache.c +38 -45
  165. data/vendor/libgit2/src/cache.h +3 -3
  166. data/vendor/libgit2/src/cc-compat.h +20 -3
  167. data/vendor/libgit2/src/checkout.c +77 -67
  168. data/vendor/libgit2/src/cherrypick.c +12 -6
  169. data/vendor/libgit2/src/clone.c +36 -14
  170. data/vendor/libgit2/src/clone.h +4 -0
  171. data/vendor/libgit2/src/commit.c +103 -48
  172. data/vendor/libgit2/src/commit.h +7 -0
  173. data/vendor/libgit2/src/commit_list.c +36 -78
  174. data/vendor/libgit2/src/commit_list.h +2 -2
  175. data/vendor/libgit2/src/common.h +24 -90
  176. data/vendor/libgit2/src/config.c +203 -176
  177. data/vendor/libgit2/src/config.h +8 -20
  178. data/vendor/libgit2/src/config_backend.h +96 -0
  179. data/vendor/libgit2/src/config_cache.c +41 -35
  180. data/vendor/libgit2/src/config_entries.c +229 -0
  181. data/vendor/libgit2/src/config_entries.h +24 -0
  182. data/vendor/libgit2/src/config_file.c +422 -680
  183. data/vendor/libgit2/src/config_mem.c +220 -0
  184. data/vendor/libgit2/src/config_parse.c +96 -68
  185. data/vendor/libgit2/src/config_parse.h +15 -14
  186. data/vendor/libgit2/src/config_snapshot.c +206 -0
  187. data/vendor/libgit2/src/crlf.c +219 -196
  188. data/vendor/libgit2/src/delta.c +25 -18
  189. data/vendor/libgit2/src/describe.c +42 -41
  190. data/vendor/libgit2/src/diff.c +52 -67
  191. data/vendor/libgit2/src/diff.h +2 -1
  192. data/vendor/libgit2/src/diff_driver.c +44 -46
  193. data/vendor/libgit2/src/diff_file.c +16 -14
  194. data/vendor/libgit2/src/diff_file.h +1 -1
  195. data/vendor/libgit2/src/diff_generate.c +158 -103
  196. data/vendor/libgit2/src/diff_generate.h +3 -3
  197. data/vendor/libgit2/src/diff_parse.c +4 -4
  198. data/vendor/libgit2/src/diff_print.c +34 -22
  199. data/vendor/libgit2/src/diff_stats.c +22 -7
  200. data/vendor/libgit2/src/diff_tform.c +18 -16
  201. data/vendor/libgit2/src/diff_xdiff.c +3 -3
  202. data/vendor/libgit2/src/errors.c +51 -39
  203. data/vendor/libgit2/src/errors.h +81 -0
  204. data/vendor/libgit2/src/features.h.in +9 -3
  205. data/vendor/libgit2/src/fetch.c +8 -3
  206. data/vendor/libgit2/src/fetchhead.c +12 -12
  207. data/vendor/libgit2/src/filebuf.c +28 -32
  208. data/vendor/libgit2/src/filebuf.h +2 -2
  209. data/vendor/libgit2/src/filter.c +47 -33
  210. data/vendor/libgit2/src/filter.h +0 -10
  211. data/vendor/libgit2/src/{fileops.c → futils.c} +70 -63
  212. data/vendor/libgit2/src/{fileops.h → futils.h} +6 -6
  213. data/vendor/libgit2/src/global.c +35 -55
  214. data/vendor/libgit2/src/global.h +0 -2
  215. data/vendor/libgit2/src/hash/sha1/collisiondetect.c +48 -0
  216. data/vendor/libgit2/src/hash/sha1/collisiondetect.h +19 -0
  217. data/vendor/libgit2/src/hash/{hash_common_crypto.h → sha1/common_crypto.c} +17 -17
  218. data/vendor/libgit2/src/hash/sha1/common_crypto.h +19 -0
  219. data/vendor/libgit2/src/hash/{hash_generic.c → sha1/generic.c} +22 -10
  220. data/vendor/libgit2/src/hash/{hash_generic.h → sha1/generic.h} +4 -10
  221. data/vendor/libgit2/src/hash/{hash_mbedtls.c → sha1/mbedtls.c} +15 -7
  222. data/vendor/libgit2/src/hash/{hash_mbedtls.h → sha1/mbedtls.h} +6 -7
  223. data/vendor/libgit2/src/hash/sha1/openssl.c +59 -0
  224. data/vendor/libgit2/src/hash/sha1/openssl.h +19 -0
  225. data/vendor/libgit2/src/hash/{sha1dc → sha1/sha1dc}/sha1.c +14 -3
  226. data/vendor/libgit2/src/hash/{hash_win32.c → sha1/win32.c} +47 -37
  227. data/vendor/libgit2/src/hash/{hash_win32.h → sha1/win32.h} +6 -19
  228. data/vendor/libgit2/src/hash/sha1.h +38 -0
  229. data/vendor/libgit2/src/hash.c +61 -0
  230. data/vendor/libgit2/src/hash.h +20 -21
  231. data/vendor/libgit2/src/hashsig.c +5 -5
  232. data/vendor/libgit2/src/idxmap.c +107 -61
  233. data/vendor/libgit2/src/idxmap.h +153 -31
  234. data/vendor/libgit2/src/ignore.c +38 -42
  235. data/vendor/libgit2/src/index.c +264 -199
  236. data/vendor/libgit2/src/index.h +7 -1
  237. data/vendor/libgit2/src/indexer.c +338 -167
  238. data/vendor/libgit2/src/integer.h +71 -26
  239. data/vendor/libgit2/src/iterator.c +134 -62
  240. data/vendor/libgit2/src/iterator.h +15 -0
  241. data/vendor/libgit2/src/mailmap.c +8 -8
  242. data/vendor/libgit2/src/map.h +1 -1
  243. data/vendor/libgit2/src/merge.c +137 -93
  244. data/vendor/libgit2/src/merge_driver.c +11 -11
  245. data/vendor/libgit2/src/merge_file.c +2 -2
  246. data/vendor/libgit2/src/mwindow.c +24 -29
  247. data/vendor/libgit2/src/mwindow.h +4 -4
  248. data/vendor/libgit2/src/net.c +184 -0
  249. data/vendor/libgit2/src/net.h +36 -0
  250. data/vendor/libgit2/src/netops.c +55 -156
  251. data/vendor/libgit2/src/netops.h +3 -23
  252. data/vendor/libgit2/src/notes.c +14 -9
  253. data/vendor/libgit2/src/object.c +120 -69
  254. data/vendor/libgit2/src/object.h +22 -9
  255. data/vendor/libgit2/src/object_api.c +8 -8
  256. data/vendor/libgit2/src/odb.c +111 -88
  257. data/vendor/libgit2/src/odb.h +8 -7
  258. data/vendor/libgit2/src/odb_loose.c +58 -47
  259. data/vendor/libgit2/src/odb_mempack.c +21 -34
  260. data/vendor/libgit2/src/odb_pack.c +17 -13
  261. data/vendor/libgit2/src/offmap.c +53 -35
  262. data/vendor/libgit2/src/offmap.h +108 -21
  263. data/vendor/libgit2/src/oid.c +12 -7
  264. data/vendor/libgit2/src/oidmap.c +49 -47
  265. data/vendor/libgit2/src/oidmap.h +101 -24
  266. data/vendor/libgit2/src/pack-objects.c +87 -86
  267. data/vendor/libgit2/src/pack-objects.h +2 -8
  268. data/vendor/libgit2/src/pack.c +94 -96
  269. data/vendor/libgit2/src/pack.h +16 -18
  270. data/vendor/libgit2/src/parse.c +17 -4
  271. data/vendor/libgit2/src/parse.h +3 -3
  272. data/vendor/libgit2/src/patch.c +3 -3
  273. data/vendor/libgit2/src/patch_generate.c +18 -18
  274. data/vendor/libgit2/src/patch_parse.c +147 -79
  275. data/vendor/libgit2/src/path.c +207 -62
  276. data/vendor/libgit2/src/path.h +14 -0
  277. data/vendor/libgit2/src/pathspec.c +18 -18
  278. data/vendor/libgit2/src/pool.c +26 -22
  279. data/vendor/libgit2/src/pool.h +7 -7
  280. data/vendor/libgit2/src/posix.c +10 -10
  281. data/vendor/libgit2/src/posix.h +12 -1
  282. data/vendor/libgit2/src/proxy.c +8 -3
  283. data/vendor/libgit2/src/push.c +35 -29
  284. data/vendor/libgit2/src/push.h +2 -1
  285. data/vendor/libgit2/src/reader.c +265 -0
  286. data/vendor/libgit2/src/reader.h +107 -0
  287. data/vendor/libgit2/src/rebase.c +97 -38
  288. data/vendor/libgit2/src/refdb.c +15 -3
  289. data/vendor/libgit2/src/refdb_fs.c +318 -222
  290. data/vendor/libgit2/src/reflog.c +13 -15
  291. data/vendor/libgit2/src/refs.c +122 -89
  292. data/vendor/libgit2/src/refs.h +5 -3
  293. data/vendor/libgit2/src/refspec.c +27 -33
  294. data/vendor/libgit2/src/regexp.c +221 -0
  295. data/vendor/libgit2/src/regexp.h +97 -0
  296. data/vendor/libgit2/src/remote.c +229 -178
  297. data/vendor/libgit2/src/remote.h +11 -2
  298. data/vendor/libgit2/src/repository.c +227 -172
  299. data/vendor/libgit2/src/repository.h +52 -40
  300. data/vendor/libgit2/src/reset.c +7 -7
  301. data/vendor/libgit2/src/revert.c +11 -6
  302. data/vendor/libgit2/src/revparse.c +46 -46
  303. data/vendor/libgit2/src/revwalk.c +89 -54
  304. data/vendor/libgit2/src/revwalk.h +20 -0
  305. data/vendor/libgit2/src/settings.c +22 -9
  306. data/vendor/libgit2/src/signature.c +15 -13
  307. data/vendor/libgit2/src/sortedcache.c +22 -36
  308. data/vendor/libgit2/src/sortedcache.h +1 -1
  309. data/vendor/libgit2/src/stash.c +56 -76
  310. data/vendor/libgit2/src/status.c +27 -21
  311. data/vendor/libgit2/src/stream.h +17 -2
  312. data/vendor/libgit2/src/streams/mbedtls.c +100 -80
  313. data/vendor/libgit2/src/streams/mbedtls.h +5 -2
  314. data/vendor/libgit2/src/streams/openssl.c +93 -81
  315. data/vendor/libgit2/src/streams/openssl.h +5 -2
  316. data/vendor/libgit2/src/streams/registry.c +118 -0
  317. data/vendor/libgit2/src/streams/registry.h +19 -0
  318. data/vendor/libgit2/src/streams/socket.c +55 -30
  319. data/vendor/libgit2/src/streams/stransport.c +57 -32
  320. data/vendor/libgit2/src/streams/stransport.h +5 -0
  321. data/vendor/libgit2/src/streams/tls.c +48 -20
  322. data/vendor/libgit2/src/streams/tls.h +12 -4
  323. data/vendor/libgit2/src/strmap.c +47 -74
  324. data/vendor/libgit2/src/strmap.h +108 -33
  325. data/vendor/libgit2/src/submodule.c +190 -169
  326. data/vendor/libgit2/src/submodule.h +1 -1
  327. data/vendor/libgit2/src/sysdir.c +25 -15
  328. data/vendor/libgit2/src/tag.c +39 -26
  329. data/vendor/libgit2/src/tag.h +2 -1
  330. data/vendor/libgit2/src/trace.c +2 -2
  331. data/vendor/libgit2/src/trace.h +2 -2
  332. data/vendor/libgit2/src/trailer.c +46 -32
  333. data/vendor/libgit2/src/transaction.c +30 -29
  334. data/vendor/libgit2/src/transport.c +3 -3
  335. data/vendor/libgit2/src/transports/auth.c +14 -10
  336. data/vendor/libgit2/src/transports/auth.h +10 -3
  337. data/vendor/libgit2/src/transports/auth_negotiate.c +31 -16
  338. data/vendor/libgit2/src/transports/auth_negotiate.h +2 -2
  339. data/vendor/libgit2/src/transports/auth_ntlm.c +223 -0
  340. data/vendor/libgit2/src/transports/auth_ntlm.h +35 -0
  341. data/vendor/libgit2/src/transports/cred.c +24 -24
  342. data/vendor/libgit2/src/transports/git.c +25 -30
  343. data/vendor/libgit2/src/transports/http.c +871 -335
  344. data/vendor/libgit2/src/transports/http.h +2 -0
  345. data/vendor/libgit2/src/transports/local.c +28 -28
  346. data/vendor/libgit2/src/transports/smart.c +64 -46
  347. data/vendor/libgit2/src/transports/smart.h +5 -6
  348. data/vendor/libgit2/src/transports/smart_pkt.c +162 -151
  349. data/vendor/libgit2/src/transports/smart_protocol.c +64 -94
  350. data/vendor/libgit2/src/transports/ssh.c +76 -65
  351. data/vendor/libgit2/src/transports/winhttp.c +328 -319
  352. data/vendor/libgit2/src/tree-cache.c +21 -14
  353. data/vendor/libgit2/src/tree.c +119 -112
  354. data/vendor/libgit2/src/tree.h +1 -0
  355. data/vendor/libgit2/src/unix/map.c +3 -3
  356. data/vendor/libgit2/src/unix/posix.h +1 -11
  357. data/vendor/libgit2/src/userdiff.h +3 -1
  358. data/vendor/libgit2/src/util.c +154 -93
  359. data/vendor/libgit2/src/util.h +19 -23
  360. data/vendor/libgit2/src/vector.c +15 -10
  361. data/vendor/libgit2/src/wildmatch.c +320 -0
  362. data/vendor/libgit2/src/wildmatch.h +23 -0
  363. data/vendor/libgit2/src/win32/dir.c +3 -3
  364. data/vendor/libgit2/src/win32/findfile.c +1 -1
  365. data/vendor/libgit2/src/win32/map.c +9 -11
  366. data/vendor/libgit2/src/win32/msvc-compat.h +6 -0
  367. data/vendor/libgit2/src/win32/path_w32.c +113 -9
  368. data/vendor/libgit2/src/win32/path_w32.h +18 -29
  369. data/vendor/libgit2/src/win32/posix.h +1 -4
  370. data/vendor/libgit2/src/win32/posix_w32.c +69 -44
  371. data/vendor/libgit2/src/win32/precompiled.h +0 -2
  372. data/vendor/libgit2/src/win32/thread.c +5 -10
  373. data/vendor/libgit2/src/win32/w32_buffer.c +9 -5
  374. data/vendor/libgit2/src/win32/w32_common.h +39 -0
  375. data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.c +2 -95
  376. data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.h +0 -2
  377. data/vendor/libgit2/src/win32/w32_stack.c +6 -11
  378. data/vendor/libgit2/src/win32/w32_stack.h +3 -3
  379. data/vendor/libgit2/src/win32/w32_util.c +27 -64
  380. data/vendor/libgit2/src/win32/w32_util.h +5 -49
  381. data/vendor/libgit2/src/worktree.c +44 -30
  382. data/vendor/libgit2/src/xdiff/xdiffi.c +5 -5
  383. data/vendor/libgit2/src/xdiff/xhistogram.c +1 -1
  384. data/vendor/libgit2/src/xdiff/xmerge.c +27 -15
  385. data/vendor/libgit2/src/xdiff/xpatience.c +3 -0
  386. data/vendor/libgit2/src/zstream.c +4 -4
  387. metadata +115 -38
  388. data/vendor/libgit2/deps/regex/CMakeLists.txt +0 -2
  389. data/vendor/libgit2/deps/regex/config.h +0 -7
  390. data/vendor/libgit2/deps/regex/regcomp.c +0 -3857
  391. data/vendor/libgit2/deps/regex/regex.c +0 -92
  392. data/vendor/libgit2/deps/regex/regex.h +0 -582
  393. data/vendor/libgit2/deps/regex/regex_internal.c +0 -1744
  394. data/vendor/libgit2/deps/regex/regex_internal.h +0 -819
  395. data/vendor/libgit2/deps/regex/regexec.c +0 -4369
  396. data/vendor/libgit2/include/git2/inttypes.h +0 -309
  397. data/vendor/libgit2/include/git2/sys/time.h +0 -31
  398. data/vendor/libgit2/libgit2.pc.in +0 -13
  399. data/vendor/libgit2/src/config_file.h +0 -73
  400. data/vendor/libgit2/src/fnmatch.c +0 -248
  401. data/vendor/libgit2/src/fnmatch.h +0 -48
  402. data/vendor/libgit2/src/hash/hash_collisiondetect.h +0 -47
  403. data/vendor/libgit2/src/hash/hash_openssl.h +0 -59
  404. data/vendor/libgit2/src/streams/curl.c +0 -385
  405. data/vendor/libgit2/src/streams/curl.h +0 -17
  406. /data/vendor/libgit2/deps/http-parser/{LICENSE-MIT → COPYING} +0 -0
  407. /data/vendor/libgit2/src/hash/{sha1dc → sha1/sha1dc}/sha1.h +0 -0
  408. /data/vendor/libgit2/src/hash/{sha1dc → sha1/sha1dc}/ubc_check.c +0 -0
  409. /data/vendor/libgit2/src/hash/{sha1dc → sha1/sha1dc}/ubc_check.h +0 -0
@@ -7,18 +7,20 @@
7
7
 
8
8
  #include "apply.h"
9
9
 
10
- #include <assert.h>
11
-
10
+ #include "git2/apply.h"
12
11
  #include "git2/patch.h"
13
12
  #include "git2/filter.h"
13
+ #include "git2/blob.h"
14
+ #include "git2/index.h"
15
+ #include "git2/checkout.h"
16
+ #include "git2/repository.h"
14
17
  #include "array.h"
15
18
  #include "patch.h"
16
- #include "fileops.h"
19
+ #include "futils.h"
17
20
  #include "delta.h"
18
21
  #include "zstream.h"
19
-
20
- #define apply_err(...) \
21
- ( giterr_set(GITERR_PATCH, __VA_ARGS__), -1 )
22
+ #include "reader.h"
23
+ #include "index.h"
22
24
 
23
25
  typedef struct {
24
26
  /* The lines that we allocate ourself are allocated out of the pool.
@@ -28,6 +30,18 @@ typedef struct {
28
30
  git_vector lines;
29
31
  } patch_image;
30
32
 
33
+ static int apply_err(const char *fmt, ...) GIT_FORMAT_PRINTF(1, 2);
34
+ static int apply_err(const char *fmt, ...)
35
+ {
36
+ va_list ap;
37
+
38
+ va_start(ap, fmt);
39
+ git_error_vset(GIT_ERROR_PATCH, fmt, ap);
40
+ va_end(ap);
41
+
42
+ return GIT_EAPPLYFAIL;
43
+ }
44
+
31
45
  static void patch_line_init(
32
46
  git_diff_line *out,
33
47
  const char *in,
@@ -52,7 +66,7 @@ static int patch_image_init_fromstr(
52
66
  git_pool_init(&out->pool, sizeof(git_diff_line));
53
67
 
54
68
  for (start = in; start < in + in_len; start = end) {
55
- end = memchr(start, '\n', in_len);
69
+ end = memchr(start, '\n', in_len - (start - in));
56
70
 
57
71
  if (end == NULL)
58
72
  end = in + in_len;
@@ -61,7 +75,7 @@ static int patch_image_init_fromstr(
61
75
  end++;
62
76
 
63
77
  line = git_pool_mallocz(&out->pool, 1);
64
- GITERR_CHECK_ALLOC(line);
78
+ GIT_ERROR_CHECK_ALLOC(line);
65
79
 
66
80
  if (git_vector_insert(&out->lines, line) < 0)
67
81
  return -1;
@@ -131,7 +145,7 @@ static bool find_hunk_linenum(
131
145
 
132
146
  static int update_hunk(
133
147
  patch_image *image,
134
- unsigned int linenum,
148
+ size_t linenum,
135
149
  patch_image *preimage,
136
150
  patch_image *postimage)
137
151
  {
@@ -148,7 +162,7 @@ static int update_hunk(
148
162
  &image->lines, linenum, (prelen - postlen));
149
163
 
150
164
  if (error) {
151
- giterr_set_oom();
165
+ git_error_set_oom();
152
166
  return -1;
153
167
  }
154
168
 
@@ -160,38 +174,77 @@ static int update_hunk(
160
174
  return 0;
161
175
  }
162
176
 
177
+ typedef struct {
178
+ git_apply_options opts;
179
+ size_t skipped_new_lines;
180
+ size_t skipped_old_lines;
181
+ } apply_hunks_ctx;
182
+
163
183
  static int apply_hunk(
164
184
  patch_image *image,
165
185
  git_patch *patch,
166
- git_patch_hunk *hunk)
186
+ git_patch_hunk *hunk,
187
+ apply_hunks_ctx *ctx)
167
188
  {
168
189
  patch_image preimage = PATCH_IMAGE_INIT, postimage = PATCH_IMAGE_INIT;
169
190
  size_t line_num, i;
170
191
  int error = 0;
171
192
 
193
+ if (ctx->opts.hunk_cb) {
194
+ error = ctx->opts.hunk_cb(&hunk->hunk, ctx->opts.payload);
195
+
196
+ if (error) {
197
+ if (error > 0) {
198
+ ctx->skipped_new_lines += hunk->hunk.new_lines;
199
+ ctx->skipped_old_lines += hunk->hunk.old_lines;
200
+ error = 0;
201
+ }
202
+
203
+ goto done;
204
+ }
205
+ }
206
+
172
207
  for (i = 0; i < hunk->line_count; i++) {
173
208
  size_t linenum = hunk->line_start + i;
174
- git_diff_line *line = git_array_get(patch->lines, linenum);
209
+ git_diff_line *line = git_array_get(patch->lines, linenum), *prev;
175
210
 
176
211
  if (!line) {
177
212
  error = apply_err("preimage does not contain line %"PRIuZ, linenum);
178
213
  goto done;
179
214
  }
180
215
 
181
- if (line->origin == GIT_DIFF_LINE_CONTEXT ||
182
- line->origin == GIT_DIFF_LINE_DELETION) {
183
- if ((error = git_vector_insert(&preimage.lines, line)) < 0)
184
- goto done;
185
- }
186
-
187
- if (line->origin == GIT_DIFF_LINE_CONTEXT ||
188
- line->origin == GIT_DIFF_LINE_ADDITION) {
189
- if ((error = git_vector_insert(&postimage.lines, line)) < 0)
190
- goto done;
216
+ switch (line->origin) {
217
+ case GIT_DIFF_LINE_CONTEXT_EOFNL:
218
+ case GIT_DIFF_LINE_DEL_EOFNL:
219
+ case GIT_DIFF_LINE_ADD_EOFNL:
220
+ prev = i ? git_array_get(patch->lines, linenum - 1) : NULL;
221
+ if (prev && prev->content[prev->content_len - 1] == '\n')
222
+ prev->content_len -= 1;
223
+ break;
224
+ case GIT_DIFF_LINE_CONTEXT:
225
+ if ((error = git_vector_insert(&preimage.lines, line)) < 0 ||
226
+ (error = git_vector_insert(&postimage.lines, line)) < 0)
227
+ goto done;
228
+ break;
229
+ case GIT_DIFF_LINE_DELETION:
230
+ if ((error = git_vector_insert(&preimage.lines, line)) < 0)
231
+ goto done;
232
+ break;
233
+ case GIT_DIFF_LINE_ADDITION:
234
+ if ((error = git_vector_insert(&postimage.lines, line)) < 0)
235
+ goto done;
236
+ break;
191
237
  }
192
238
  }
193
239
 
194
- line_num = hunk->hunk.new_start ? hunk->hunk.new_start - 1 : 0;
240
+ if (hunk->hunk.new_start) {
241
+ line_num = hunk->hunk.new_start -
242
+ ctx->skipped_new_lines +
243
+ ctx->skipped_old_lines -
244
+ 1;
245
+ } else {
246
+ line_num = 0;
247
+ }
195
248
 
196
249
  if (!find_hunk_linenum(&line_num, image, &preimage, line_num)) {
197
250
  error = apply_err("hunk at line %d did not apply",
@@ -212,7 +265,8 @@ static int apply_hunks(
212
265
  git_buf *out,
213
266
  const char *source,
214
267
  size_t source_len,
215
- git_patch *patch)
268
+ git_patch *patch,
269
+ apply_hunks_ctx *ctx)
216
270
  {
217
271
  git_patch_hunk *hunk;
218
272
  git_diff_line *line;
@@ -224,7 +278,7 @@ static int apply_hunks(
224
278
  goto done;
225
279
 
226
280
  git_array_foreach(patch->hunks, i, hunk) {
227
- if ((error = apply_hunk(&image, patch, hunk)) < 0)
281
+ if ((error = apply_hunk(&image, patch, hunk, ctx)) < 0)
228
282
  goto done;
229
283
  }
230
284
 
@@ -312,8 +366,9 @@ static int apply_binary(
312
366
  &patch->binary.old_file)) < 0)
313
367
  goto done;
314
368
 
369
+ /* Verify that the resulting file with the reverse patch applied matches the source file */
315
370
  if (source_len != reverse.size ||
316
- memcmp(source, reverse.ptr, source_len) != 0) {
371
+ (source_len && memcmp(source, reverse.ptr, source_len) != 0)) {
317
372
  error = apply_err("binary patch did not apply cleanly");
318
373
  goto done;
319
374
  }
@@ -332,14 +387,19 @@ int git_apply__patch(
332
387
  unsigned int *mode_out,
333
388
  const char *source,
334
389
  size_t source_len,
335
- git_patch *patch)
390
+ git_patch *patch,
391
+ const git_apply_options *given_opts)
336
392
  {
393
+ apply_hunks_ctx ctx = { GIT_APPLY_OPTIONS_INIT };
337
394
  char *filename = NULL;
338
395
  unsigned int mode = 0;
339
396
  int error = 0;
340
397
 
341
398
  assert(contents_out && filename_out && mode_out && (source || !source_len) && patch);
342
399
 
400
+ if (given_opts)
401
+ memcpy(&ctx.opts, given_opts, sizeof(git_apply_options));
402
+
343
403
  *filename_out = NULL;
344
404
  *mode_out = 0;
345
405
 
@@ -354,7 +414,7 @@ int git_apply__patch(
354
414
  if (patch->delta->flags & GIT_DIFF_FLAG_BINARY)
355
415
  error = apply_binary(contents_out, source, source_len, patch);
356
416
  else if (patch->hunks.size)
357
- error = apply_hunks(contents_out, source, source_len, patch);
417
+ error = apply_hunks(contents_out, source, source_len, patch, &ctx);
358
418
  else
359
419
  error = git_buf_put(contents_out, source, source_len);
360
420
 
@@ -376,3 +436,450 @@ done:
376
436
 
377
437
  return error;
378
438
  }
439
+
440
+ static int apply_one(
441
+ git_repository *repo,
442
+ git_reader *preimage_reader,
443
+ git_index *preimage,
444
+ git_reader *postimage_reader,
445
+ git_index *postimage,
446
+ git_diff *diff,
447
+ git_strmap *removed_paths,
448
+ size_t i,
449
+ const git_apply_options *opts)
450
+ {
451
+ git_patch *patch = NULL;
452
+ git_buf pre_contents = GIT_BUF_INIT, post_contents = GIT_BUF_INIT;
453
+ const git_diff_delta *delta;
454
+ char *filename = NULL;
455
+ unsigned int mode;
456
+ git_oid pre_id, post_id;
457
+ git_filemode_t pre_filemode;
458
+ git_index_entry pre_entry, post_entry;
459
+ bool skip_preimage = false;
460
+ int error;
461
+
462
+ if ((error = git_patch_from_diff(&patch, diff, i)) < 0)
463
+ goto done;
464
+
465
+ delta = git_patch_get_delta(patch);
466
+
467
+ if (opts->delta_cb) {
468
+ error = opts->delta_cb(delta, opts->payload);
469
+
470
+ if (error) {
471
+ if (error > 0)
472
+ error = 0;
473
+
474
+ goto done;
475
+ }
476
+ }
477
+
478
+ /*
479
+ * Ensure that the file has not been deleted or renamed if we're
480
+ * applying a modification delta.
481
+ */
482
+ if (delta->status != GIT_DELTA_RENAMED &&
483
+ delta->status != GIT_DELTA_ADDED) {
484
+ if (git_strmap_exists(removed_paths, delta->old_file.path)) {
485
+ error = apply_err("path '%s' has been renamed or deleted", delta->old_file.path);
486
+ goto done;
487
+ }
488
+ }
489
+
490
+ /*
491
+ * We may be applying a second delta to an already seen file. If so,
492
+ * use the already modified data in the postimage instead of the
493
+ * content from the index or working directory. (Don't do this in
494
+ * the case of a rename, which must be specified before additional
495
+ * deltas since we apply deltas to the target filename.)
496
+ */
497
+ if (delta->status != GIT_DELTA_RENAMED) {
498
+ if ((error = git_reader_read(&pre_contents, &pre_id, &pre_filemode,
499
+ postimage_reader, delta->old_file.path)) == 0) {
500
+ skip_preimage = true;
501
+ } else if (error == GIT_ENOTFOUND) {
502
+ git_error_clear();
503
+ error = 0;
504
+ } else {
505
+ goto done;
506
+ }
507
+ }
508
+
509
+ if (!skip_preimage && delta->status != GIT_DELTA_ADDED) {
510
+ error = git_reader_read(&pre_contents, &pre_id, &pre_filemode,
511
+ preimage_reader, delta->old_file.path);
512
+
513
+ /* ENOTFOUND means the preimage was not found; apply failed. */
514
+ if (error == GIT_ENOTFOUND)
515
+ error = GIT_EAPPLYFAIL;
516
+
517
+ /* When applying to BOTH, the index did not match the workdir. */
518
+ if (error == GIT_READER_MISMATCH)
519
+ error = apply_err("%s: does not match index", delta->old_file.path);
520
+
521
+ if (error < 0)
522
+ goto done;
523
+
524
+ /*
525
+ * We need to populate the preimage data structure with the
526
+ * contents that we are using as the preimage for this file.
527
+ * This allows us to apply patches to files that have been
528
+ * modified in the working directory. During checkout,
529
+ * we will use this expected preimage as the baseline, and
530
+ * limit checkout to only the paths affected by patch
531
+ * application. (Without this, we would fail to write the
532
+ * postimage contents to any file that had been modified
533
+ * from HEAD on-disk, even if the patch application succeeded.)
534
+ * Use the contents from the delta where available - some
535
+ * fields may not be available, like the old file mode (eg in
536
+ * an exact rename situation) so trust the patch parsing to
537
+ * validate and use the preimage data in that case.
538
+ */
539
+ if (preimage) {
540
+ memset(&pre_entry, 0, sizeof(git_index_entry));
541
+ pre_entry.path = delta->old_file.path;
542
+ pre_entry.mode = delta->old_file.mode ? delta->old_file.mode : pre_filemode;
543
+ git_oid_cpy(&pre_entry.id, &pre_id);
544
+
545
+ if ((error = git_index_add(preimage, &pre_entry)) < 0)
546
+ goto done;
547
+ }
548
+ }
549
+
550
+ if (delta->status != GIT_DELTA_DELETED) {
551
+ if ((error = git_apply__patch(&post_contents, &filename, &mode,
552
+ pre_contents.ptr, pre_contents.size, patch, opts)) < 0 ||
553
+ (error = git_blob_create_from_buffer(&post_id, repo,
554
+ post_contents.ptr, post_contents.size)) < 0)
555
+ goto done;
556
+
557
+ memset(&post_entry, 0, sizeof(git_index_entry));
558
+ post_entry.path = filename;
559
+ post_entry.mode = mode;
560
+ git_oid_cpy(&post_entry.id, &post_id);
561
+
562
+ if ((error = git_index_add(postimage, &post_entry)) < 0)
563
+ goto done;
564
+ }
565
+
566
+ if (delta->status == GIT_DELTA_RENAMED ||
567
+ delta->status == GIT_DELTA_DELETED)
568
+ error = git_strmap_set(removed_paths, delta->old_file.path, (char *) delta->old_file.path);
569
+
570
+ if (delta->status == GIT_DELTA_RENAMED ||
571
+ delta->status == GIT_DELTA_ADDED)
572
+ git_strmap_delete(removed_paths, delta->new_file.path);
573
+
574
+ done:
575
+ git_buf_dispose(&pre_contents);
576
+ git_buf_dispose(&post_contents);
577
+ git__free(filename);
578
+ git_patch_free(patch);
579
+
580
+ return error;
581
+ }
582
+
583
+ static int apply_deltas(
584
+ git_repository *repo,
585
+ git_reader *pre_reader,
586
+ git_index *preimage,
587
+ git_reader *post_reader,
588
+ git_index *postimage,
589
+ git_diff *diff,
590
+ const git_apply_options *opts)
591
+ {
592
+ git_strmap *removed_paths;
593
+ size_t i;
594
+ int error = 0;
595
+
596
+ if (git_strmap_new(&removed_paths) < 0)
597
+ return -1;
598
+
599
+ for (i = 0; i < git_diff_num_deltas(diff); i++) {
600
+ if ((error = apply_one(repo, pre_reader, preimage, post_reader, postimage, diff, removed_paths, i, opts)) < 0)
601
+ goto done;
602
+ }
603
+
604
+ done:
605
+ git_strmap_free(removed_paths);
606
+ return error;
607
+ }
608
+
609
+ int git_apply_to_tree(
610
+ git_index **out,
611
+ git_repository *repo,
612
+ git_tree *preimage,
613
+ git_diff *diff,
614
+ const git_apply_options *given_opts)
615
+ {
616
+ git_index *postimage = NULL;
617
+ git_reader *pre_reader = NULL, *post_reader = NULL;
618
+ git_apply_options opts = GIT_APPLY_OPTIONS_INIT;
619
+ const git_diff_delta *delta;
620
+ size_t i;
621
+ int error = 0;
622
+
623
+ assert(out && repo && preimage && diff);
624
+
625
+ *out = NULL;
626
+
627
+ if (given_opts)
628
+ memcpy(&opts, given_opts, sizeof(git_apply_options));
629
+
630
+ if ((error = git_reader_for_tree(&pre_reader, preimage)) < 0)
631
+ goto done;
632
+
633
+ /*
634
+ * put the current tree into the postimage as-is - the diff will
635
+ * replace any entries contained therein
636
+ */
637
+ if ((error = git_index_new(&postimage)) < 0 ||
638
+ (error = git_index_read_tree(postimage, preimage)) < 0 ||
639
+ (error = git_reader_for_index(&post_reader, repo, postimage)) < 0)
640
+ goto done;
641
+
642
+ /*
643
+ * Remove the old paths from the index before applying diffs -
644
+ * we need to do a full pass to remove them before adding deltas,
645
+ * in order to handle rename situations.
646
+ */
647
+ for (i = 0; i < git_diff_num_deltas(diff); i++) {
648
+ delta = git_diff_get_delta(diff, i);
649
+
650
+ if (delta->status == GIT_DELTA_DELETED ||
651
+ delta->status == GIT_DELTA_RENAMED) {
652
+ if ((error = git_index_remove(postimage,
653
+ delta->old_file.path, 0)) < 0)
654
+ goto done;
655
+ }
656
+ }
657
+
658
+ if ((error = apply_deltas(repo, pre_reader, NULL, post_reader, postimage, diff, &opts)) < 0)
659
+ goto done;
660
+
661
+ *out = postimage;
662
+
663
+ done:
664
+ if (error < 0)
665
+ git_index_free(postimage);
666
+
667
+ git_reader_free(pre_reader);
668
+ git_reader_free(post_reader);
669
+
670
+ return error;
671
+ }
672
+
673
+ static int git_apply__to_workdir(
674
+ git_repository *repo,
675
+ git_diff *diff,
676
+ git_index *preimage,
677
+ git_index *postimage,
678
+ git_apply_location_t location,
679
+ git_apply_options *opts)
680
+ {
681
+ git_vector paths = GIT_VECTOR_INIT;
682
+ git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT;
683
+ const git_diff_delta *delta;
684
+ size_t i;
685
+ int error;
686
+
687
+ GIT_UNUSED(opts);
688
+
689
+ /*
690
+ * Limit checkout to the paths affected by the diff; this ensures
691
+ * that other modifications in the working directory are unaffected.
692
+ */
693
+ if ((error = git_vector_init(&paths, git_diff_num_deltas(diff), NULL)) < 0)
694
+ goto done;
695
+
696
+ for (i = 0; i < git_diff_num_deltas(diff); i++) {
697
+ delta = git_diff_get_delta(diff, i);
698
+
699
+ if ((error = git_vector_insert(&paths, (void *)delta->old_file.path)) < 0)
700
+ goto done;
701
+
702
+ if (strcmp(delta->old_file.path, delta->new_file.path) &&
703
+ (error = git_vector_insert(&paths, (void *)delta->new_file.path)) < 0)
704
+ goto done;
705
+ }
706
+
707
+ checkout_opts.checkout_strategy |= GIT_CHECKOUT_SAFE;
708
+ checkout_opts.checkout_strategy |= GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH;
709
+ checkout_opts.checkout_strategy |= GIT_CHECKOUT_DONT_WRITE_INDEX;
710
+
711
+ if (location == GIT_APPLY_LOCATION_WORKDIR)
712
+ checkout_opts.checkout_strategy |= GIT_CHECKOUT_DONT_UPDATE_INDEX;
713
+
714
+ checkout_opts.paths.strings = (char **)paths.contents;
715
+ checkout_opts.paths.count = paths.length;
716
+
717
+ checkout_opts.baseline_index = preimage;
718
+
719
+ error = git_checkout_index(repo, postimage, &checkout_opts);
720
+
721
+ done:
722
+ git_vector_free(&paths);
723
+ return error;
724
+ }
725
+
726
+ static int git_apply__to_index(
727
+ git_repository *repo,
728
+ git_diff *diff,
729
+ git_index *preimage,
730
+ git_index *postimage,
731
+ git_apply_options *opts)
732
+ {
733
+ git_index *index = NULL;
734
+ const git_diff_delta *delta;
735
+ const git_index_entry *entry;
736
+ size_t i;
737
+ int error;
738
+
739
+ GIT_UNUSED(preimage);
740
+ GIT_UNUSED(opts);
741
+
742
+ if ((error = git_repository_index(&index, repo)) < 0)
743
+ goto done;
744
+
745
+ /* Remove deleted (or renamed) paths from the index. */
746
+ for (i = 0; i < git_diff_num_deltas(diff); i++) {
747
+ delta = git_diff_get_delta(diff, i);
748
+
749
+ if (delta->status == GIT_DELTA_DELETED ||
750
+ delta->status == GIT_DELTA_RENAMED) {
751
+ if ((error = git_index_remove(index, delta->old_file.path, 0)) < 0)
752
+ goto done;
753
+ }
754
+ }
755
+
756
+ /* Then add the changes back to the index. */
757
+ for (i = 0; i < git_index_entrycount(postimage); i++) {
758
+ entry = git_index_get_byindex(postimage, i);
759
+
760
+ if ((error = git_index_add(index, entry)) < 0)
761
+ goto done;
762
+ }
763
+
764
+ done:
765
+ git_index_free(index);
766
+ return error;
767
+ }
768
+
769
+ int git_apply_options_init(git_apply_options *opts, unsigned int version)
770
+ {
771
+ GIT_INIT_STRUCTURE_FROM_TEMPLATE(
772
+ opts, version, git_apply_options, GIT_APPLY_OPTIONS_INIT);
773
+ return 0;
774
+ }
775
+
776
+ /*
777
+ * Handle the three application options ("locations"):
778
+ *
779
+ * GIT_APPLY_LOCATION_WORKDIR: the default, emulates `git apply`.
780
+ * Applies the diff only to the workdir items and ignores the index
781
+ * entirely.
782
+ *
783
+ * GIT_APPLY_LOCATION_INDEX: emulates `git apply --cached`.
784
+ * Applies the diff only to the index items and ignores the workdir
785
+ * completely.
786
+ *
787
+ * GIT_APPLY_LOCATION_BOTH: emulates `git apply --index`.
788
+ * Applies the diff to both the index items and the working directory
789
+ * items.
790
+ */
791
+
792
+ int git_apply(
793
+ git_repository *repo,
794
+ git_diff *diff,
795
+ git_apply_location_t location,
796
+ const git_apply_options *given_opts)
797
+ {
798
+ git_indexwriter indexwriter = GIT_INDEXWRITER_INIT;
799
+ git_index *index = NULL, *preimage = NULL, *postimage = NULL;
800
+ git_reader *pre_reader = NULL, *post_reader = NULL;
801
+ git_apply_options opts = GIT_APPLY_OPTIONS_INIT;
802
+ int error = GIT_EINVALID;
803
+
804
+ assert(repo && diff);
805
+
806
+ GIT_ERROR_CHECK_VERSION(
807
+ given_opts, GIT_APPLY_OPTIONS_VERSION, "git_apply_options");
808
+
809
+ if (given_opts)
810
+ memcpy(&opts, given_opts, sizeof(git_apply_options));
811
+
812
+ /*
813
+ * by default, we apply a patch directly to the working directory;
814
+ * in `--cached` or `--index` mode, we apply to the contents already
815
+ * in the index.
816
+ */
817
+ switch (location) {
818
+ case GIT_APPLY_LOCATION_BOTH:
819
+ error = git_reader_for_workdir(&pre_reader, repo, true);
820
+ break;
821
+ case GIT_APPLY_LOCATION_INDEX:
822
+ error = git_reader_for_index(&pre_reader, repo, NULL);
823
+ break;
824
+ case GIT_APPLY_LOCATION_WORKDIR:
825
+ error = git_reader_for_workdir(&pre_reader, repo, false);
826
+ break;
827
+ default:
828
+ assert(false);
829
+ }
830
+
831
+ if (error < 0)
832
+ goto done;
833
+
834
+ /*
835
+ * Build the preimage and postimage (differences). Note that
836
+ * this is not the complete preimage or postimage, it only
837
+ * contains the files affected by the patch. We want to avoid
838
+ * having the full repo index, so we will limit our checkout
839
+ * to only write these files that were affected by the diff.
840
+ */
841
+ if ((error = git_index_new(&preimage)) < 0 ||
842
+ (error = git_index_new(&postimage)) < 0 ||
843
+ (error = git_reader_for_index(&post_reader, repo, postimage)) < 0)
844
+ goto done;
845
+
846
+ if (!(opts.flags & GIT_APPLY_CHECK))
847
+ if ((error = git_repository_index(&index, repo)) < 0 ||
848
+ (error = git_indexwriter_init(&indexwriter, index)) < 0)
849
+ goto done;
850
+
851
+ if ((error = apply_deltas(repo, pre_reader, preimage, post_reader, postimage, diff, &opts)) < 0)
852
+ goto done;
853
+
854
+ if ((opts.flags & GIT_APPLY_CHECK))
855
+ goto done;
856
+
857
+ switch (location) {
858
+ case GIT_APPLY_LOCATION_BOTH:
859
+ error = git_apply__to_workdir(repo, diff, preimage, postimage, location, &opts);
860
+ break;
861
+ case GIT_APPLY_LOCATION_INDEX:
862
+ error = git_apply__to_index(repo, diff, preimage, postimage, &opts);
863
+ break;
864
+ case GIT_APPLY_LOCATION_WORKDIR:
865
+ error = git_apply__to_workdir(repo, diff, preimage, postimage, location, &opts);
866
+ break;
867
+ default:
868
+ assert(false);
869
+ }
870
+
871
+ if (error < 0)
872
+ goto done;
873
+
874
+ error = git_indexwriter_commit(&indexwriter);
875
+
876
+ done:
877
+ git_indexwriter_cleanup(&indexwriter);
878
+ git_index_free(postimage);
879
+ git_index_free(preimage);
880
+ git_index_free(index);
881
+ git_reader_free(pre_reader);
882
+ git_reader_free(post_reader);
883
+
884
+ return error;
885
+ }
@@ -10,6 +10,7 @@
10
10
  #include "common.h"
11
11
 
12
12
  #include "git2/patch.h"
13
+ #include "git2/apply.h"
13
14
  #include "buffer.h"
14
15
 
15
16
  extern int git_apply__patch(
@@ -18,6 +19,7 @@ extern int git_apply__patch(
18
19
  unsigned int *mode,
19
20
  const char *source,
20
21
  size_t source_len,
21
- git_patch *patch);
22
+ git_patch *patch,
23
+ const git_apply_options *opts);
22
24
 
23
25
  #endif
@@ -15,7 +15,7 @@
15
15
  * git_array_t(int) my_ints = GIT_ARRAY_INIT;
16
16
  * ...
17
17
  * int *i = git_array_alloc(my_ints);
18
- * GITERR_CHECK_ALLOC(i);
18
+ * GIT_ERROR_CHECK_ALLOC(i);
19
19
  * ...
20
20
  * git_array_clear(my_ints);
21
21
  *
@@ -36,7 +36,7 @@
36
36
  #define git_array_clear(a) \
37
37
  do { git__free((a).ptr); git_array_init(a); } while (0)
38
38
 
39
- #define GITERR_CHECK_ARRAY(a) GITERR_CHECK_ALLOC((a).ptr)
39
+ #define GIT_ERROR_CHECK_ARRAY(a) GIT_ERROR_CHECK_ALLOC((a).ptr)
40
40
 
41
41
 
42
42
  typedef git_array_t(char) git_array_generic_t;