rugged 0.27.9 → 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 (420) 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 +98 -54
  5. data/vendor/libgit2/COPYING +28 -0
  6. data/vendor/libgit2/cmake/Modules/AddCFlagIfSupported.cmake +15 -1
  7. data/vendor/libgit2/cmake/Modules/EnableWarnings.cmake +9 -8
  8. data/vendor/libgit2/cmake/Modules/FindCoreFoundation.cmake +2 -2
  9. data/vendor/libgit2/cmake/Modules/FindGSSAPI.cmake +1 -1
  10. data/vendor/libgit2/cmake/Modules/FindGSSFramework.cmake +28 -0
  11. data/vendor/libgit2/cmake/Modules/FindPCRE.cmake +38 -0
  12. data/vendor/libgit2/cmake/Modules/FindPCRE2.cmake +37 -0
  13. data/vendor/libgit2/cmake/Modules/FindSecurity.cmake +2 -2
  14. data/vendor/libgit2/cmake/Modules/FindStatNsec.cmake +6 -0
  15. data/vendor/libgit2/cmake/Modules/FindmbedTLS.cmake +93 -0
  16. data/vendor/libgit2/cmake/Modules/PkgBuildConfig.cmake +110 -0
  17. data/vendor/libgit2/cmake/Modules/SelectGSSAPI.cmake +53 -0
  18. data/vendor/libgit2/cmake/Modules/SelectHTTPSBackend.cmake +124 -0
  19. data/vendor/libgit2/cmake/Modules/SelectHashes.cmake +66 -0
  20. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +2 -0
  21. data/vendor/libgit2/deps/http-parser/{LICENSE-MIT → COPYING} +0 -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.h +5 -0
  82. data/vendor/libgit2/include/git2/annotated_commit.h +9 -0
  83. data/vendor/libgit2/include/git2/apply.h +149 -0
  84. data/vendor/libgit2/include/git2/attr.h +38 -20
  85. data/vendor/libgit2/include/git2/blame.h +42 -25
  86. data/vendor/libgit2/include/git2/blob.h +45 -13
  87. data/vendor/libgit2/include/git2/branch.h +1 -1
  88. data/vendor/libgit2/include/git2/buffer.h +22 -16
  89. data/vendor/libgit2/include/git2/cert.h +135 -0
  90. data/vendor/libgit2/include/git2/checkout.h +65 -32
  91. data/vendor/libgit2/include/git2/cherrypick.h +9 -7
  92. data/vendor/libgit2/include/git2/clone.h +12 -10
  93. data/vendor/libgit2/include/git2/commit.h +53 -3
  94. data/vendor/libgit2/include/git2/common.h +60 -8
  95. data/vendor/libgit2/include/git2/config.h +30 -19
  96. data/vendor/libgit2/include/git2/cred.h +308 -0
  97. data/vendor/libgit2/include/git2/deprecated.h +493 -0
  98. data/vendor/libgit2/include/git2/describe.h +32 -9
  99. data/vendor/libgit2/include/git2/diff.h +208 -156
  100. data/vendor/libgit2/include/git2/errors.h +54 -46
  101. data/vendor/libgit2/include/git2/filter.h +8 -0
  102. data/vendor/libgit2/include/git2/ignore.h +2 -2
  103. data/vendor/libgit2/include/git2/index.h +74 -52
  104. data/vendor/libgit2/include/git2/indexer.h +76 -6
  105. data/vendor/libgit2/include/git2/mailmap.h +115 -0
  106. data/vendor/libgit2/include/git2/merge.h +35 -18
  107. data/vendor/libgit2/include/git2/net.h +0 -5
  108. data/vendor/libgit2/include/git2/notes.h +1 -1
  109. data/vendor/libgit2/include/git2/object.h +17 -29
  110. data/vendor/libgit2/include/git2/odb.h +12 -11
  111. data/vendor/libgit2/include/git2/odb_backend.h +10 -9
  112. data/vendor/libgit2/include/git2/oid.h +2 -2
  113. data/vendor/libgit2/include/git2/pack.h +14 -3
  114. data/vendor/libgit2/include/git2/proxy.h +14 -8
  115. data/vendor/libgit2/include/git2/rebase.h +53 -6
  116. data/vendor/libgit2/include/git2/refs.h +33 -15
  117. data/vendor/libgit2/include/git2/refspec.h +17 -0
  118. data/vendor/libgit2/include/git2/remote.h +123 -24
  119. data/vendor/libgit2/include/git2/repository.h +76 -39
  120. data/vendor/libgit2/include/git2/revert.h +6 -4
  121. data/vendor/libgit2/include/git2/revwalk.h +7 -7
  122. data/vendor/libgit2/include/git2/signature.h +2 -2
  123. data/vendor/libgit2/include/git2/stash.h +15 -12
  124. data/vendor/libgit2/include/git2/status.h +33 -20
  125. data/vendor/libgit2/include/git2/submodule.h +30 -12
  126. data/vendor/libgit2/include/git2/sys/alloc.h +101 -0
  127. data/vendor/libgit2/include/git2/sys/commit.h +1 -1
  128. data/vendor/libgit2/include/git2/sys/config.h +13 -13
  129. data/vendor/libgit2/include/git2/sys/cred.h +90 -0
  130. data/vendor/libgit2/include/git2/sys/filter.h +6 -6
  131. data/vendor/libgit2/include/git2/sys/index.h +3 -0
  132. data/vendor/libgit2/include/git2/sys/mempack.h +35 -35
  133. data/vendor/libgit2/include/git2/sys/merge.h +9 -4
  134. data/vendor/libgit2/include/git2/sys/odb_backend.h +66 -22
  135. data/vendor/libgit2/include/git2/sys/path.h +64 -0
  136. data/vendor/libgit2/include/git2/sys/refdb_backend.h +76 -40
  137. data/vendor/libgit2/include/git2/sys/repository.h +5 -1
  138. data/vendor/libgit2/include/git2/sys/stream.h +92 -12
  139. data/vendor/libgit2/include/git2/sys/transport.h +129 -83
  140. data/vendor/libgit2/include/git2/tag.h +13 -4
  141. data/vendor/libgit2/include/git2/trace.h +2 -2
  142. data/vendor/libgit2/include/git2/transaction.h +1 -0
  143. data/vendor/libgit2/include/git2/transport.h +11 -311
  144. data/vendor/libgit2/include/git2/tree.h +4 -4
  145. data/vendor/libgit2/include/git2/types.h +33 -111
  146. data/vendor/libgit2/include/git2/version.h +4 -4
  147. data/vendor/libgit2/include/git2/worktree.h +48 -13
  148. data/vendor/libgit2/src/CMakeLists.txt +96 -164
  149. data/vendor/libgit2/src/alloc.c +43 -0
  150. data/vendor/libgit2/src/alloc.h +40 -0
  151. data/vendor/libgit2/src/allocators/stdalloc.c +119 -0
  152. data/vendor/libgit2/src/{streams/curl.h → allocators/stdalloc.h} +5 -5
  153. data/vendor/libgit2/src/allocators/win32_crtdbg.c +118 -0
  154. data/vendor/libgit2/src/{transports/cred.h → allocators/win32_crtdbg.h} +5 -4
  155. data/vendor/libgit2/src/annotated_commit.c +15 -8
  156. data/vendor/libgit2/src/apply.c +537 -31
  157. data/vendor/libgit2/src/apply.h +3 -1
  158. data/vendor/libgit2/src/array.h +2 -2
  159. data/vendor/libgit2/src/attr.c +81 -75
  160. data/vendor/libgit2/src/attr_file.c +207 -121
  161. data/vendor/libgit2/src/attr_file.h +9 -9
  162. data/vendor/libgit2/src/attrcache.c +51 -53
  163. data/vendor/libgit2/src/attrcache.h +2 -1
  164. data/vendor/libgit2/src/blame.c +47 -20
  165. data/vendor/libgit2/src/blame.h +2 -1
  166. data/vendor/libgit2/src/blame_git.c +37 -20
  167. data/vendor/libgit2/src/blob.c +128 -42
  168. data/vendor/libgit2/src/blob.h +19 -2
  169. data/vendor/libgit2/src/branch.c +67 -43
  170. data/vendor/libgit2/src/buf_text.c +7 -6
  171. data/vendor/libgit2/src/buffer.c +69 -57
  172. data/vendor/libgit2/src/buffer.h +1 -1
  173. data/vendor/libgit2/src/cache.c +38 -45
  174. data/vendor/libgit2/src/cache.h +3 -3
  175. data/vendor/libgit2/src/cc-compat.h +20 -3
  176. data/vendor/libgit2/src/checkout.c +109 -90
  177. data/vendor/libgit2/src/cherrypick.c +15 -9
  178. data/vendor/libgit2/src/clone.c +49 -27
  179. data/vendor/libgit2/src/clone.h +4 -0
  180. data/vendor/libgit2/src/commit.c +117 -49
  181. data/vendor/libgit2/src/commit.h +7 -0
  182. data/vendor/libgit2/src/commit_list.c +30 -78
  183. data/vendor/libgit2/src/commit_list.h +2 -2
  184. data/vendor/libgit2/src/common.h +27 -91
  185. data/vendor/libgit2/src/config.c +194 -176
  186. data/vendor/libgit2/src/config.h +8 -20
  187. data/vendor/libgit2/src/config_backend.h +96 -0
  188. data/vendor/libgit2/src/config_cache.c +41 -35
  189. data/vendor/libgit2/src/config_entries.c +229 -0
  190. data/vendor/libgit2/src/config_entries.h +24 -0
  191. data/vendor/libgit2/src/config_file.c +439 -753
  192. data/vendor/libgit2/src/config_mem.c +220 -0
  193. data/vendor/libgit2/src/config_parse.c +114 -63
  194. data/vendor/libgit2/src/config_parse.h +17 -16
  195. data/vendor/libgit2/src/config_snapshot.c +206 -0
  196. data/vendor/libgit2/src/crlf.c +219 -190
  197. data/vendor/libgit2/src/delta.c +25 -18
  198. data/vendor/libgit2/src/describe.c +42 -41
  199. data/vendor/libgit2/src/diff.c +53 -68
  200. data/vendor/libgit2/src/diff.h +2 -1
  201. data/vendor/libgit2/src/diff_driver.c +47 -49
  202. data/vendor/libgit2/src/diff_file.c +19 -17
  203. data/vendor/libgit2/src/diff_file.h +1 -1
  204. data/vendor/libgit2/src/diff_generate.c +162 -106
  205. data/vendor/libgit2/src/diff_generate.h +3 -3
  206. data/vendor/libgit2/src/diff_parse.c +4 -4
  207. data/vendor/libgit2/src/diff_print.c +42 -30
  208. data/vendor/libgit2/src/diff_stats.c +22 -7
  209. data/vendor/libgit2/src/diff_tform.c +16 -16
  210. data/vendor/libgit2/src/diff_xdiff.c +15 -3
  211. data/vendor/libgit2/src/errors.c +51 -39
  212. data/vendor/libgit2/src/errors.h +81 -0
  213. data/vendor/libgit2/src/features.h.in +11 -3
  214. data/vendor/libgit2/src/fetch.c +10 -5
  215. data/vendor/libgit2/src/fetchhead.c +17 -17
  216. data/vendor/libgit2/src/filebuf.c +32 -36
  217. data/vendor/libgit2/src/filebuf.h +2 -2
  218. data/vendor/libgit2/src/filter.c +46 -38
  219. data/vendor/libgit2/src/filter.h +0 -10
  220. data/vendor/libgit2/src/{fileops.c → futils.c} +80 -73
  221. data/vendor/libgit2/src/{fileops.h → futils.h} +6 -6
  222. data/vendor/libgit2/src/global.c +48 -63
  223. data/vendor/libgit2/src/global.h +0 -2
  224. data/vendor/libgit2/src/hash.c +61 -0
  225. data/vendor/libgit2/src/hash.h +20 -19
  226. data/vendor/libgit2/src/hash/sha1.h +38 -0
  227. data/vendor/libgit2/src/hash/sha1/collisiondetect.c +48 -0
  228. data/vendor/libgit2/src/hash/sha1/collisiondetect.h +19 -0
  229. data/vendor/libgit2/src/hash/{hash_common_crypto.h → sha1/common_crypto.c} +17 -17
  230. data/vendor/libgit2/src/hash/sha1/common_crypto.h +19 -0
  231. data/vendor/libgit2/src/hash/{hash_generic.c → sha1/generic.c} +22 -10
  232. data/vendor/libgit2/src/hash/{hash_generic.h → sha1/generic.h} +4 -10
  233. data/vendor/libgit2/src/hash/sha1/mbedtls.c +46 -0
  234. data/vendor/libgit2/src/hash/sha1/mbedtls.h +19 -0
  235. data/vendor/libgit2/src/hash/sha1/openssl.c +59 -0
  236. data/vendor/libgit2/src/hash/sha1/openssl.h +19 -0
  237. data/vendor/libgit2/src/hash/{sha1dc → sha1/sha1dc}/sha1.c +14 -3
  238. data/vendor/libgit2/src/hash/{sha1dc → sha1/sha1dc}/sha1.h +0 -0
  239. data/vendor/libgit2/src/hash/{sha1dc → sha1/sha1dc}/ubc_check.c +0 -0
  240. data/vendor/libgit2/src/hash/{sha1dc → sha1/sha1dc}/ubc_check.h +0 -0
  241. data/vendor/libgit2/src/hash/{hash_win32.c → sha1/win32.c} +47 -37
  242. data/vendor/libgit2/src/hash/{hash_win32.h → sha1/win32.h} +6 -19
  243. data/vendor/libgit2/src/hashsig.c +5 -5
  244. data/vendor/libgit2/src/idxmap.c +107 -61
  245. data/vendor/libgit2/src/idxmap.h +153 -31
  246. data/vendor/libgit2/src/ignore.c +43 -47
  247. data/vendor/libgit2/src/index.c +337 -232
  248. data/vendor/libgit2/src/index.h +17 -1
  249. data/vendor/libgit2/src/indexer.c +346 -175
  250. data/vendor/libgit2/src/integer.h +71 -26
  251. data/vendor/libgit2/src/iterator.c +142 -70
  252. data/vendor/libgit2/src/iterator.h +15 -0
  253. data/vendor/libgit2/src/khash.h +3 -1
  254. data/vendor/libgit2/src/mailmap.c +485 -0
  255. data/vendor/libgit2/src/mailmap.h +35 -0
  256. data/vendor/libgit2/src/map.h +1 -1
  257. data/vendor/libgit2/src/merge.c +144 -100
  258. data/vendor/libgit2/src/merge_driver.c +11 -11
  259. data/vendor/libgit2/src/merge_file.c +2 -2
  260. data/vendor/libgit2/src/mwindow.c +24 -29
  261. data/vendor/libgit2/src/mwindow.h +4 -4
  262. data/vendor/libgit2/src/net.c +184 -0
  263. data/vendor/libgit2/src/net.h +36 -0
  264. data/vendor/libgit2/src/netops.c +55 -156
  265. data/vendor/libgit2/src/netops.h +3 -23
  266. data/vendor/libgit2/src/notes.c +16 -11
  267. data/vendor/libgit2/src/object.c +120 -69
  268. data/vendor/libgit2/src/object.h +22 -9
  269. data/vendor/libgit2/src/object_api.c +8 -8
  270. data/vendor/libgit2/src/odb.c +116 -93
  271. data/vendor/libgit2/src/odb.h +8 -7
  272. data/vendor/libgit2/src/odb_loose.c +62 -55
  273. data/vendor/libgit2/src/odb_mempack.c +21 -34
  274. data/vendor/libgit2/src/odb_pack.c +18 -14
  275. data/vendor/libgit2/src/offmap.c +53 -35
  276. data/vendor/libgit2/src/offmap.h +108 -21
  277. data/vendor/libgit2/src/oid.c +12 -7
  278. data/vendor/libgit2/src/oidmap.c +49 -47
  279. data/vendor/libgit2/src/oidmap.h +101 -24
  280. data/vendor/libgit2/src/pack-objects.c +88 -87
  281. data/vendor/libgit2/src/pack-objects.h +2 -8
  282. data/vendor/libgit2/src/pack.c +99 -101
  283. data/vendor/libgit2/src/pack.h +17 -19
  284. data/vendor/libgit2/src/parse.c +10 -0
  285. data/vendor/libgit2/src/parse.h +3 -3
  286. data/vendor/libgit2/src/patch.c +4 -4
  287. data/vendor/libgit2/src/patch_generate.c +20 -20
  288. data/vendor/libgit2/src/patch_parse.c +151 -63
  289. data/vendor/libgit2/src/path.c +169 -125
  290. data/vendor/libgit2/src/path.h +3 -71
  291. data/vendor/libgit2/src/pathspec.c +19 -19
  292. data/vendor/libgit2/src/pool.c +26 -22
  293. data/vendor/libgit2/src/pool.h +7 -7
  294. data/vendor/libgit2/src/posix.c +10 -10
  295. data/vendor/libgit2/src/posix.h +12 -1
  296. data/vendor/libgit2/src/proxy.c +8 -3
  297. data/vendor/libgit2/src/push.c +37 -31
  298. data/vendor/libgit2/src/push.h +2 -1
  299. data/vendor/libgit2/src/reader.c +265 -0
  300. data/vendor/libgit2/src/reader.h +107 -0
  301. data/vendor/libgit2/src/rebase.c +115 -59
  302. data/vendor/libgit2/src/refdb.c +15 -3
  303. data/vendor/libgit2/src/refdb_fs.c +381 -254
  304. data/vendor/libgit2/src/reflog.c +13 -15
  305. data/vendor/libgit2/src/refs.c +118 -88
  306. data/vendor/libgit2/src/refs.h +5 -3
  307. data/vendor/libgit2/src/refspec.c +56 -37
  308. data/vendor/libgit2/src/refspec.h +1 -1
  309. data/vendor/libgit2/src/regexp.c +221 -0
  310. data/vendor/libgit2/src/regexp.h +97 -0
  311. data/vendor/libgit2/src/remote.c +266 -215
  312. data/vendor/libgit2/src/remote.h +11 -2
  313. data/vendor/libgit2/src/repository.c +280 -225
  314. data/vendor/libgit2/src/repository.h +52 -40
  315. data/vendor/libgit2/src/reset.c +8 -8
  316. data/vendor/libgit2/src/revert.c +14 -9
  317. data/vendor/libgit2/src/revparse.c +47 -48
  318. data/vendor/libgit2/src/revwalk.c +120 -57
  319. data/vendor/libgit2/src/revwalk.h +22 -1
  320. data/vendor/libgit2/src/settings.c +47 -10
  321. data/vendor/libgit2/src/signature.c +11 -11
  322. data/vendor/libgit2/src/sortedcache.c +22 -36
  323. data/vendor/libgit2/src/sortedcache.h +1 -1
  324. data/vendor/libgit2/src/stash.c +125 -99
  325. data/vendor/libgit2/src/status.c +28 -22
  326. data/vendor/libgit2/src/stream.h +17 -2
  327. data/vendor/libgit2/src/streams/mbedtls.c +483 -0
  328. data/vendor/libgit2/src/streams/mbedtls.h +23 -0
  329. data/vendor/libgit2/src/streams/openssl.c +224 -114
  330. data/vendor/libgit2/src/streams/openssl.h +4 -108
  331. data/vendor/libgit2/src/streams/registry.c +118 -0
  332. data/vendor/libgit2/src/streams/registry.h +19 -0
  333. data/vendor/libgit2/src/streams/socket.c +55 -30
  334. data/vendor/libgit2/src/streams/stransport.c +57 -32
  335. data/vendor/libgit2/src/streams/stransport.h +5 -0
  336. data/vendor/libgit2/src/streams/tls.c +50 -19
  337. data/vendor/libgit2/src/streams/tls.h +12 -4
  338. data/vendor/libgit2/src/strmap.c +47 -74
  339. data/vendor/libgit2/src/strmap.h +108 -33
  340. data/vendor/libgit2/src/submodule.c +272 -216
  341. data/vendor/libgit2/src/submodule.h +1 -1
  342. data/vendor/libgit2/src/sysdir.c +29 -19
  343. data/vendor/libgit2/src/tag.c +41 -28
  344. data/vendor/libgit2/src/tag.h +2 -1
  345. data/vendor/libgit2/src/trace.c +2 -2
  346. data/vendor/libgit2/src/trace.h +3 -3
  347. data/vendor/libgit2/src/trailer.c +52 -38
  348. data/vendor/libgit2/src/transaction.c +30 -29
  349. data/vendor/libgit2/src/transport.c +5 -5
  350. data/vendor/libgit2/src/transports/auth.c +15 -11
  351. data/vendor/libgit2/src/transports/auth.h +10 -3
  352. data/vendor/libgit2/src/transports/auth_negotiate.c +33 -18
  353. data/vendor/libgit2/src/transports/auth_negotiate.h +2 -2
  354. data/vendor/libgit2/src/transports/auth_ntlm.c +223 -0
  355. data/vendor/libgit2/src/transports/auth_ntlm.h +35 -0
  356. data/vendor/libgit2/src/transports/cred.c +24 -24
  357. data/vendor/libgit2/src/transports/git.c +26 -31
  358. data/vendor/libgit2/src/transports/http.c +881 -348
  359. data/vendor/libgit2/src/transports/http.h +2 -0
  360. data/vendor/libgit2/src/transports/local.c +35 -35
  361. data/vendor/libgit2/src/transports/smart.c +70 -47
  362. data/vendor/libgit2/src/transports/smart.h +3 -4
  363. data/vendor/libgit2/src/transports/smart_pkt.c +43 -40
  364. data/vendor/libgit2/src/transports/smart_protocol.c +96 -116
  365. data/vendor/libgit2/src/transports/ssh.c +77 -66
  366. data/vendor/libgit2/src/transports/winhttp.c +318 -314
  367. data/vendor/libgit2/src/tree-cache.c +19 -12
  368. data/vendor/libgit2/src/tree.c +103 -142
  369. data/vendor/libgit2/src/tree.h +1 -12
  370. data/vendor/libgit2/src/unix/map.c +3 -3
  371. data/vendor/libgit2/src/unix/posix.h +1 -11
  372. data/vendor/libgit2/src/userdiff.h +3 -1
  373. data/vendor/libgit2/src/util.c +70 -56
  374. data/vendor/libgit2/src/util.h +28 -156
  375. data/vendor/libgit2/src/vector.c +4 -4
  376. data/vendor/libgit2/src/wildmatch.c +320 -0
  377. data/vendor/libgit2/src/wildmatch.h +23 -0
  378. data/vendor/libgit2/src/win32/dir.c +3 -3
  379. data/vendor/libgit2/src/win32/findfile.c +3 -3
  380. data/vendor/libgit2/src/win32/map.c +9 -11
  381. data/vendor/libgit2/src/win32/msvc-compat.h +6 -0
  382. data/vendor/libgit2/src/win32/path_w32.c +113 -9
  383. data/vendor/libgit2/src/win32/path_w32.h +18 -29
  384. data/vendor/libgit2/src/win32/posix.h +1 -4
  385. data/vendor/libgit2/src/win32/posix_w32.c +70 -45
  386. data/vendor/libgit2/src/win32/precompiled.h +0 -2
  387. data/vendor/libgit2/src/win32/thread.c +5 -10
  388. data/vendor/libgit2/src/win32/w32_buffer.c +9 -5
  389. data/vendor/libgit2/src/win32/w32_common.h +39 -0
  390. data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.c +3 -2
  391. data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.h +26 -75
  392. data/vendor/libgit2/src/win32/w32_stack.c +6 -11
  393. data/vendor/libgit2/src/win32/w32_stack.h +3 -3
  394. data/vendor/libgit2/src/win32/w32_util.c +27 -64
  395. data/vendor/libgit2/src/win32/w32_util.h +5 -49
  396. data/vendor/libgit2/src/worktree.c +95 -60
  397. data/vendor/libgit2/src/worktree.h +2 -0
  398. data/vendor/libgit2/src/xdiff/xdiffi.c +7 -5
  399. data/vendor/libgit2/src/xdiff/xhistogram.c +1 -1
  400. data/vendor/libgit2/src/xdiff/xmerge.c +27 -15
  401. data/vendor/libgit2/src/xdiff/xpatience.c +3 -0
  402. data/vendor/libgit2/src/zstream.c +4 -4
  403. metadata +122 -33
  404. data/vendor/libgit2/deps/regex/CMakeLists.txt +0 -2
  405. data/vendor/libgit2/deps/regex/config.h +0 -7
  406. data/vendor/libgit2/deps/regex/regcomp.c +0 -3857
  407. data/vendor/libgit2/deps/regex/regex.c +0 -92
  408. data/vendor/libgit2/deps/regex/regex.h +0 -582
  409. data/vendor/libgit2/deps/regex/regex_internal.c +0 -1744
  410. data/vendor/libgit2/deps/regex/regex_internal.h +0 -819
  411. data/vendor/libgit2/deps/regex/regexec.c +0 -4369
  412. data/vendor/libgit2/include/git2/inttypes.h +0 -309
  413. data/vendor/libgit2/include/git2/sys/time.h +0 -31
  414. data/vendor/libgit2/libgit2.pc.in +0 -13
  415. data/vendor/libgit2/src/config_file.h +0 -73
  416. data/vendor/libgit2/src/fnmatch.c +0 -248
  417. data/vendor/libgit2/src/fnmatch.h +0 -48
  418. data/vendor/libgit2/src/hash/hash_collisiondetect.h +0 -47
  419. data/vendor/libgit2/src/hash/hash_openssl.h +0 -59
  420. data/vendor/libgit2/src/streams/curl.c +0 -385
@@ -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;
@@ -19,18 +19,18 @@ const char *git_attr__true = "[internal]__TRUE__";
19
19
  const char *git_attr__false = "[internal]__FALSE__";
20
20
  const char *git_attr__unset = "[internal]__UNSET__";
21
21
 
22
- git_attr_t git_attr_value(const char *attr)
22
+ git_attr_value_t git_attr_value(const char *attr)
23
23
  {
24
24
  if (attr == NULL || attr == git_attr__unset)
25
- return GIT_ATTR_UNSPECIFIED_T;
25
+ return GIT_ATTR_VALUE_UNSPECIFIED;
26
26
 
27
27
  if (attr == git_attr__true)
28
- return GIT_ATTR_TRUE_T;
28
+ return GIT_ATTR_VALUE_TRUE;
29
29
 
30
30
  if (attr == git_attr__false)
31
- return GIT_ATTR_FALSE_T;
31
+ return GIT_ATTR_VALUE_FALSE;
32
32
 
33
- return GIT_ATTR_VALUE_T;
33
+ return GIT_ATTR_VALUE_STRING;
34
34
  }
35
35
 
36
36
  static int collect_attr_files(
@@ -135,7 +135,7 @@ int git_attr_get_many_with_session(
135
135
  goto cleanup;
136
136
 
137
137
  info = git__calloc(num_attr, sizeof(attr_get_many_info));
138
- GITERR_CHECK_ALLOC(info);
138
+ GIT_ERROR_CHECK_ALLOC(info);
139
139
 
140
140
  git_vector_foreach(&files, i, file) {
141
141
 
@@ -215,7 +215,7 @@ int git_attr_foreach(
215
215
  return -1;
216
216
 
217
217
  if ((error = collect_attr_files(repo, NULL, flags, pathname, &files)) < 0 ||
218
- (error = git_strmap_alloc(&seen)) < 0)
218
+ (error = git_strmap_new(&seen)) < 0)
219
219
  goto cleanup;
220
220
 
221
221
  git_vector_foreach(&files, i, file) {
@@ -227,13 +227,12 @@ int git_attr_foreach(
227
227
  if (git_strmap_exists(seen, assign->name))
228
228
  continue;
229
229
 
230
- git_strmap_insert(seen, assign->name, assign, &error);
231
- if (error < 0)
230
+ if ((error = git_strmap_set(seen, assign->name, assign)) < 0)
232
231
  goto cleanup;
233
232
 
234
233
  error = callback(assign->name, assign->value, payload);
235
234
  if (error) {
236
- giterr_set_after_callback(error);
235
+ git_error_set_after_callback(error);
237
236
  goto cleanup;
238
237
  }
239
238
  }
@@ -253,15 +252,16 @@ static int preload_attr_file(
253
252
  git_attr_session *attr_session,
254
253
  git_attr_file_source source,
255
254
  const char *base,
256
- const char *file)
255
+ const char *file,
256
+ bool allow_macros)
257
257
  {
258
258
  int error;
259
259
  git_attr_file *preload = NULL;
260
260
 
261
261
  if (!file)
262
262
  return 0;
263
- if (!(error = git_attr_cache__get(
264
- &preload, repo, attr_session, source, base, file, git_attr_file__parse_buffer)))
263
+ if (!(error = git_attr_cache__get(&preload, repo, attr_session, source, base, file,
264
+ git_attr_file__parse_buffer, allow_macros)))
265
265
  git_attr_file__free(preload);
266
266
 
267
267
  return error;
@@ -277,7 +277,7 @@ static int system_attr_file(
277
277
  error = git_sysdir_find_system_file(out, GIT_ATTR_FILE_SYSTEM);
278
278
 
279
279
  if (error == GIT_ENOTFOUND)
280
- giterr_clear();
280
+ git_error_clear();
281
281
 
282
282
  return error;
283
283
  }
@@ -286,7 +286,7 @@ static int system_attr_file(
286
286
  error = git_sysdir_find_system_file(&attr_session->sysdir, GIT_ATTR_FILE_SYSTEM);
287
287
 
288
288
  if (error == GIT_ENOTFOUND)
289
- giterr_clear();
289
+ git_error_clear();
290
290
  else if (error)
291
291
  return error;
292
292
 
@@ -298,19 +298,22 @@ static int system_attr_file(
298
298
 
299
299
  /* We can safely provide a git_buf with no allocation (asize == 0) to
300
300
  * a consumer. This allows them to treat this as a regular `git_buf`,
301
- * but their call to `git_buf_free` will not attempt to free it.
301
+ * but their call to `git_buf_dispose` will not attempt to free it.
302
302
  */
303
303
  git_buf_attach_notowned(
304
304
  out, attr_session->sysdir.ptr, attr_session->sysdir.size);
305
305
  return 0;
306
306
  }
307
307
 
308
- static int attr_setup(git_repository *repo, git_attr_session *attr_session)
308
+ static int attr_setup(
309
+ git_repository *repo,
310
+ git_attr_session *attr_session,
311
+ uint32_t flags)
309
312
  {
310
- int error = 0;
311
- const char *workdir = git_repository_workdir(repo);
312
- git_index *idx = NULL;
313
313
  git_buf path = GIT_BUF_INIT;
314
+ git_index *idx = NULL;
315
+ const char *workdir;
316
+ int error = 0;
314
317
 
315
318
  if (attr_session && attr_session->init_setup)
316
319
  return 0;
@@ -318,48 +321,50 @@ static int attr_setup(git_repository *repo, git_attr_session *attr_session)
318
321
  if ((error = git_attr_cache__init(repo)) < 0)
319
322
  return error;
320
323
 
321
- /* preload attribute files that could contain macros so the
322
- * definitions will be available for later file parsing
324
+ /*
325
+ * Preload attribute files that could contain macros so the
326
+ * definitions will be available for later file parsing.
323
327
  */
324
328
 
325
- error = system_attr_file(&path, attr_session);
326
-
327
- if (error == 0)
328
- error = preload_attr_file(
329
- repo, attr_session, GIT_ATTR_FILE__FROM_FILE, NULL, path.ptr);
330
-
331
- if (error != GIT_ENOTFOUND)
332
- goto out;
333
-
334
- if ((error = preload_attr_file(
335
- repo, attr_session, GIT_ATTR_FILE__FROM_FILE,
336
- NULL, git_repository_attr_cache(repo)->cfg_attr_file)) < 0)
337
- goto out;
329
+ if ((error = system_attr_file(&path, attr_session)) < 0 ||
330
+ (error = preload_attr_file(repo, attr_session, GIT_ATTR_FILE__FROM_FILE,
331
+ NULL, path.ptr, true)) < 0) {
332
+ if (error != GIT_ENOTFOUND)
333
+ goto out;
334
+ }
338
335
 
339
- if ((error = git_repository_item_path(&path,
340
- repo, GIT_REPOSITORY_ITEM_INFO)) < 0)
336
+ if ((error = preload_attr_file(repo, attr_session, GIT_ATTR_FILE__FROM_FILE,
337
+ NULL, git_repository_attr_cache(repo)->cfg_attr_file, true)) < 0)
341
338
  goto out;
342
339
 
343
- if ((error = preload_attr_file(
344
- repo, attr_session, GIT_ATTR_FILE__FROM_FILE,
345
- path.ptr, GIT_ATTR_FILE_INREPO)) < 0)
346
- goto out;
340
+ git_buf_clear(&path); /* git_repository_item_path expects an empty buffer, because it uses git_buf_set */
341
+ if ((error = git_repository_item_path(&path, repo, GIT_REPOSITORY_ITEM_INFO)) < 0 ||
342
+ (error = preload_attr_file(repo, attr_session, GIT_ATTR_FILE__FROM_FILE,
343
+ path.ptr, GIT_ATTR_FILE_INREPO, true)) < 0) {
344
+ if (error != GIT_ENOTFOUND)
345
+ goto out;
346
+ }
347
347
 
348
- if (workdir != NULL &&
349
- (error = preload_attr_file(
350
- repo, attr_session, GIT_ATTR_FILE__FROM_FILE, workdir, GIT_ATTR_FILE)) < 0)
351
- goto out;
348
+ if ((workdir = git_repository_workdir(repo)) != NULL &&
349
+ (error = preload_attr_file(repo, attr_session, GIT_ATTR_FILE__FROM_FILE,
350
+ workdir, GIT_ATTR_FILE, true)) < 0)
351
+ goto out;
352
352
 
353
353
  if ((error = git_repository_index__weakptr(&idx, repo)) < 0 ||
354
- (error = preload_attr_file(
355
- repo, attr_session, GIT_ATTR_FILE__FROM_INDEX, NULL, GIT_ATTR_FILE)) < 0)
354
+ (error = preload_attr_file(repo, attr_session, GIT_ATTR_FILE__FROM_INDEX,
355
+ NULL, GIT_ATTR_FILE, true)) < 0)
356
+ goto out;
357
+
358
+ if ((flags & GIT_ATTR_CHECK_INCLUDE_HEAD) != 0 &&
359
+ (error = preload_attr_file(repo, attr_session, GIT_ATTR_FILE__FROM_HEAD,
360
+ NULL, GIT_ATTR_FILE, true)) < 0)
356
361
  goto out;
357
362
 
358
363
  if (attr_session)
359
364
  attr_session->init_setup = 1;
360
365
 
361
366
  out:
362
- git_buf_free(&path);
367
+ git_buf_dispose(&path);
363
368
 
364
369
  return error;
365
370
  }
@@ -377,12 +382,12 @@ int git_attr_add_macro(
377
382
  return error;
378
383
 
379
384
  macro = git__calloc(1, sizeof(git_attr_rule));
380
- GITERR_CHECK_ALLOC(macro);
385
+ GIT_ERROR_CHECK_ALLOC(macro);
381
386
 
382
387
  pool = &git_repository_attr_cache(repo)->pool;
383
388
 
384
389
  macro->match.pattern = git_pool_strdup(pool, name);
385
- GITERR_CHECK_ALLOC(macro->match.pattern);
390
+ GIT_ERROR_CHECK_ALLOC(macro->match.pattern);
386
391
 
387
392
  macro->match.length = strlen(macro->match.pattern);
388
393
  macro->match.flags = GIT_ATTR_FNMATCH_MACRO;
@@ -431,6 +436,9 @@ static int attr_decide_sources(
431
436
  break;
432
437
  }
433
438
 
439
+ if ((flags & GIT_ATTR_CHECK_INCLUDE_HEAD) != 0)
440
+ srcs[count++] = GIT_ATTR_FILE__FROM_HEAD;
441
+
434
442
  return count;
435
443
  }
436
444
 
@@ -440,13 +448,14 @@ static int push_attr_file(
440
448
  git_vector *list,
441
449
  git_attr_file_source source,
442
450
  const char *base,
443
- const char *filename)
451
+ const char *filename,
452
+ bool allow_macros)
444
453
  {
445
454
  int error = 0;
446
455
  git_attr_file *file = NULL;
447
456
 
448
457
  error = git_attr_cache__get(&file, repo, attr_session,
449
- source, base, filename, git_attr_file__parse_buffer);
458
+ source, base, filename, git_attr_file__parse_buffer, allow_macros);
450
459
 
451
460
  if (error < 0)
452
461
  return error;
@@ -461,16 +470,18 @@ static int push_attr_file(
461
470
 
462
471
  static int push_one_attr(void *ref, const char *path)
463
472
  {
464
- int error = 0, n_src, i;
465
473
  attr_walk_up_info *info = (attr_walk_up_info *)ref;
466
- git_attr_file_source src[2];
474
+ git_attr_file_source src[GIT_ATTR_FILE_NUM_SOURCES];
475
+ int error = 0, n_src, i;
476
+ bool allow_macros;
467
477
 
468
478
  n_src = attr_decide_sources(
469
479
  info->flags, info->workdir != NULL, info->index != NULL, src);
480
+ allow_macros = info->workdir ? !strcmp(info->workdir, path) : false;
470
481
 
471
482
  for (i = 0; !error && i < n_src; ++i)
472
- error = push_attr_file(info->repo, info->attr_session,
473
- info->files, src[i], path, GIT_ATTR_FILE);
483
+ error = push_attr_file(info->repo, info->attr_session, info->files,
484
+ src[i], path, GIT_ATTR_FILE, allow_macros);
474
485
 
475
486
  return error;
476
487
  }
@@ -499,7 +510,7 @@ static int collect_attr_files(
499
510
  const char *workdir = git_repository_workdir(repo);
500
511
  attr_walk_up_info info = { NULL };
501
512
 
502
- if ((error = attr_setup(repo, attr_session)) < 0)
513
+ if ((error = attr_setup(repo, attr_session, flags)) < 0)
503
514
  return error;
504
515
 
505
516
  /* Resolve path in a non-bare repo */
@@ -517,22 +528,19 @@ static int collect_attr_files(
517
528
  * - $GIT_PREFIX/etc/gitattributes
518
529
  */
519
530
 
520
- error = git_repository_item_path(&attrfile, repo, GIT_REPOSITORY_ITEM_INFO);
521
- if (error < 0)
522
- goto cleanup;
523
-
524
- error = push_attr_file(
525
- repo, attr_session, files, GIT_ATTR_FILE__FROM_FILE,
526
- attrfile.ptr, GIT_ATTR_FILE_INREPO);
527
- if (error < 0)
528
- goto cleanup;
531
+ if ((error = git_repository_item_path(&attrfile, repo, GIT_REPOSITORY_ITEM_INFO)) < 0 ||
532
+ (error = push_attr_file(repo, attr_session, files, GIT_ATTR_FILE__FROM_FILE,
533
+ attrfile.ptr, GIT_ATTR_FILE_INREPO, true)) < 0) {
534
+ if (error != GIT_ENOTFOUND)
535
+ goto cleanup;
536
+ }
529
537
 
530
538
  info.repo = repo;
531
539
  info.attr_session = attr_session;
532
540
  info.flags = flags;
533
541
  info.workdir = workdir;
534
542
  if (git_repository_index__weakptr(&info.index, repo) < 0)
535
- giterr_clear(); /* no error even if there is no index */
543
+ git_error_clear(); /* no error even if there is no index */
536
544
  info.files = files;
537
545
 
538
546
  if (!strcmp(dir.ptr, "."))
@@ -544,9 +552,8 @@ static int collect_attr_files(
544
552
  goto cleanup;
545
553
 
546
554
  if (git_repository_attr_cache(repo)->cfg_attr_file != NULL) {
547
- error = push_attr_file(
548
- repo, attr_session, files, GIT_ATTR_FILE__FROM_FILE,
549
- NULL, git_repository_attr_cache(repo)->cfg_attr_file);
555
+ error = push_attr_file(repo, attr_session, files, GIT_ATTR_FILE__FROM_FILE,
556
+ NULL, git_repository_attr_cache(repo)->cfg_attr_file, true);
550
557
  if (error < 0)
551
558
  goto cleanup;
552
559
  }
@@ -555,9 +562,8 @@ static int collect_attr_files(
555
562
  error = system_attr_file(&dir, attr_session);
556
563
 
557
564
  if (!error)
558
- error = push_attr_file(
559
- repo, attr_session, files, GIT_ATTR_FILE__FROM_FILE,
560
- NULL, dir.ptr);
565
+ error = push_attr_file(repo, attr_session, files, GIT_ATTR_FILE__FROM_FILE,
566
+ NULL, dir.ptr, true);
561
567
  else if (error == GIT_ENOTFOUND)
562
568
  error = 0;
563
569
  }
@@ -565,8 +571,8 @@ static int collect_attr_files(
565
571
  cleanup:
566
572
  if (error < 0)
567
573
  release_attr_files(files);
568
- git_buf_free(&attrfile);
569
- git_buf_free(&dir);
574
+ git_buf_dispose(&attrfile);
575
+ git_buf_dispose(&dir);
570
576
 
571
577
  return error;
572
578
  }
@@ -10,9 +10,12 @@
10
10
  #include "repository.h"
11
11
  #include "filebuf.h"
12
12
  #include "attrcache.h"
13
+ #include "buf_text.h"
13
14
  #include "git2/blob.h"
14
15
  #include "git2/tree.h"
16
+ #include "blob.h"
15
17
  #include "index.h"
18
+ #include "wildmatch.h"
16
19
  #include <ctype.h>
17
20
 
18
21
  static void attr_file_free(git_attr_file *file)
@@ -34,10 +37,10 @@ int git_attr_file__new(
34
37
  git_attr_file_source source)
35
38
  {
36
39
  git_attr_file *attrs = git__calloc(1, sizeof(git_attr_file));
37
- GITERR_CHECK_ALLOC(attrs);
40
+ GIT_ERROR_CHECK_ALLOC(attrs);
38
41
 
39
42
  if (git_mutex_init(&attrs->lock) < 0) {
40
- giterr_set(GITERR_OS, "failed to initialize lock");
43
+ git_error_set(GIT_ERROR_OS, "failed to initialize lock");
41
44
  git__free(attrs);
42
45
  return -1;
43
46
  }
@@ -56,7 +59,7 @@ int git_attr_file__clear_rules(git_attr_file *file, bool need_lock)
56
59
  git_attr_rule *rule;
57
60
 
58
61
  if (need_lock && git_mutex_lock(&file->lock) < 0) {
59
- giterr_set(GITERR_OS, "failed to lock attribute file");
62
+ git_error_set(GIT_ERROR_OS, "failed to lock attribute file");
60
63
  return -1;
61
64
  }
62
65
 
@@ -102,14 +105,22 @@ int git_attr_file__load(
102
105
  git_attr_session *attr_session,
103
106
  git_attr_file_entry *entry,
104
107
  git_attr_file_source source,
105
- git_attr_file_parser parser)
108
+ git_attr_file_parser parser,
109
+ bool allow_macros)
106
110
  {
107
111
  int error = 0;
112
+ git_tree *tree = NULL;
113
+ git_tree_entry *tree_entry = NULL;
108
114
  git_blob *blob = NULL;
109
115
  git_buf content = GIT_BUF_INIT;
116
+ const char *content_str;
110
117
  git_attr_file *file;
111
118
  struct stat st;
112
119
  bool nonexistent = false;
120
+ int bom_offset;
121
+ git_bom_t bom;
122
+ git_oid id;
123
+ git_object_size_t blobsize;
113
124
 
114
125
  *out = NULL;
115
126
 
@@ -118,15 +129,16 @@ int git_attr_file__load(
118
129
  /* in-memory attribute file doesn't need data */
119
130
  break;
120
131
  case GIT_ATTR_FILE__FROM_INDEX: {
121
- git_oid id;
122
-
123
132
  if ((error = attr_file_oid_from_index(&id, repo, entry->path)) < 0 ||
124
133
  (error = git_blob_lookup(&blob, repo, &id)) < 0)
125
134
  return error;
126
135
 
127
136
  /* Do not assume that data straight from the ODB is NULL-terminated;
128
137
  * copy the contents of a file to a buffer to work on */
129
- git_buf_put(&content, git_blob_rawcontent(blob), git_blob_rawsize(blob));
138
+ blobsize = git_blob_rawsize(blob);
139
+
140
+ GIT_ERROR_CHECK_BLOBSIZE(blobsize);
141
+ git_buf_put(&content, git_blob_rawcontent(blob), (size_t)blobsize);
130
142
  break;
131
143
  }
132
144
  case GIT_ATTR_FILE__FROM_FILE: {
@@ -146,21 +158,47 @@ int git_attr_file__load(
146
158
 
147
159
  break;
148
160
  }
161
+ case GIT_ATTR_FILE__FROM_HEAD: {
162
+ if ((error = git_repository_head_tree(&tree, repo)) < 0 ||
163
+ (error = git_tree_entry_bypath(&tree_entry, tree, entry->path)) < 0 ||
164
+ (error = git_blob_lookup(&blob, repo, git_tree_entry_id(tree_entry))) < 0)
165
+ goto cleanup;
166
+
167
+ /*
168
+ * Do not assume that data straight from the ODB is NULL-terminated;
169
+ * copy the contents of a file to a buffer to work on.
170
+ */
171
+ blobsize = git_blob_rawsize(blob);
172
+
173
+ GIT_ERROR_CHECK_BLOBSIZE(blobsize);
174
+ if ((error = git_buf_put(&content,
175
+ git_blob_rawcontent(blob), (size_t)blobsize)) < 0)
176
+ goto cleanup;
177
+
178
+ break;
179
+ }
149
180
  default:
150
- giterr_set(GITERR_INVALID, "unknown file source %d", source);
181
+ git_error_set(GIT_ERROR_INVALID, "unknown file source %d", source);
151
182
  return -1;
152
183
  }
153
184
 
154
185
  if ((error = git_attr_file__new(&file, entry, source)) < 0)
155
186
  goto cleanup;
156
187
 
188
+ /* advance over a UTF8 BOM */
189
+ content_str = git_buf_cstr(&content);
190
+ bom_offset = git_buf_text_detect_bom(&bom, &content);
191
+
192
+ if (bom == GIT_BOM_UTF8)
193
+ content_str += bom_offset;
194
+
157
195
  /* store the key of the attr_reader; don't bother with cache
158
196
  * invalidation during the same attr reader session.
159
197
  */
160
198
  if (attr_session)
161
199
  file->session_key = attr_session->key;
162
200
 
163
- if (parser && (error = parser(repo, file, git_buf_cstr(&content))) < 0) {
201
+ if (parser && (error = parser(repo, file, content_str, allow_macros)) < 0) {
164
202
  git_attr_file__free(file);
165
203
  goto cleanup;
166
204
  }
@@ -170,6 +208,8 @@ int git_attr_file__load(
170
208
  file->nonexistent = 1;
171
209
  else if (source == GIT_ATTR_FILE__FROM_INDEX)
172
210
  git_oid_cpy(&file->cache_data.oid, git_blob_id(blob));
211
+ else if (source == GIT_ATTR_FILE__FROM_HEAD)
212
+ git_oid_cpy(&file->cache_data.oid, git_tree_id(tree));
173
213
  else if (source == GIT_ATTR_FILE__FROM_FILE)
174
214
  git_futils_filestamp_set_from_stat(&file->cache_data.stamp, &st);
175
215
  /* else always cacheable */
@@ -178,7 +218,9 @@ int git_attr_file__load(
178
218
 
179
219
  cleanup:
180
220
  git_blob_free(blob);
181
- git_buf_free(&content);
221
+ git_tree_entry_free(tree_entry);
222
+ git_tree_free(tree);
223
+ git_buf_dispose(&content);
182
224
 
183
225
  return error;
184
226
  }
@@ -218,8 +260,21 @@ int git_attr_file__out_of_date(
218
260
  return (git_oid__cmp(&file->cache_data.oid, &id) != 0);
219
261
  }
220
262
 
263
+ case GIT_ATTR_FILE__FROM_HEAD: {
264
+ git_tree *tree;
265
+ int error;
266
+
267
+ if ((error = git_repository_head_tree(&tree, repo)) < 0)
268
+ return error;
269
+
270
+ error = git_oid__cmp(&file->cache_data.oid, git_tree_id(tree));
271
+
272
+ git_tree_free(tree);
273
+ return error;
274
+ }
275
+
221
276
  default:
222
- giterr_set(GITERR_INVALID, "invalid file type %d", file->source);
277
+ git_error_set(GIT_ERROR_INVALID, "invalid file type %d", file->source);
223
278
  return -1;
224
279
  }
225
280
  }
@@ -232,56 +287,55 @@ static bool parse_optimized_patterns(
232
287
  const char *pattern);
233
288
 
234
289
  int git_attr_file__parse_buffer(
235
- git_repository *repo, git_attr_file *attrs, const char *data)
290
+ git_repository *repo, git_attr_file *attrs, const char *data, bool allow_macros)
236
291
  {
237
- int error = 0;
238
292
  const char *scan = data, *context = NULL;
239
293
  git_attr_rule *rule = NULL;
294
+ int error = 0;
240
295
 
241
- /* if subdir file path, convert context for file paths */
242
- if (attrs->entry &&
243
- git_path_root(attrs->entry->path) < 0 &&
244
- !git__suffixcmp(attrs->entry->path, "/" GIT_ATTR_FILE))
296
+ /* If subdir file path, convert context for file paths */
297
+ if (attrs->entry && git_path_root(attrs->entry->path) < 0 &&
298
+ !git__suffixcmp(attrs->entry->path, "/" GIT_ATTR_FILE))
245
299
  context = attrs->entry->path;
246
300
 
247
301
  if (git_mutex_lock(&attrs->lock) < 0) {
248
- giterr_set(GITERR_OS, "failed to lock attribute file");
302
+ git_error_set(GIT_ERROR_OS, "failed to lock attribute file");
249
303
  return -1;
250
304
  }
251
305
 
252
306
  while (!error && *scan) {
253
- /* allocate rule if needed */
254
- if (!rule && !(rule = git__calloc(1, sizeof(*rule)))) {
255
- error = -1;
256
- break;
257
- }
258
-
259
- rule->match.flags =
260
- GIT_ATTR_FNMATCH_ALLOWNEG | GIT_ATTR_FNMATCH_ALLOWMACRO;
261
-
262
- /* parse the next "pattern attr attr attr" line */
263
- if (!(error = git_attr_fnmatch__parse(
264
- &rule->match, &attrs->pool, context, &scan)) &&
265
- !(error = git_attr_assignment__parse(
266
- repo, &attrs->pool, &rule->assigns, &scan)))
307
+ /* Allocate rule if needed, otherwise re-use previous rule */
308
+ if (!rule) {
309
+ rule = git__calloc(1, sizeof(*rule));
310
+ GIT_ERROR_CHECK_ALLOC(rule);
311
+ } else
312
+ git_attr_rule__clear(rule);
313
+
314
+ rule->match.flags = GIT_ATTR_FNMATCH_ALLOWNEG | GIT_ATTR_FNMATCH_ALLOWMACRO;
315
+
316
+ /* Parse the next "pattern attr attr attr" line */
317
+ if ((error = git_attr_fnmatch__parse(&rule->match, &attrs->pool, context, &scan)) < 0 ||
318
+ (error = git_attr_assignment__parse(repo, &attrs->pool, &rule->assigns, &scan)) < 0)
267
319
  {
268
- if (rule->match.flags & GIT_ATTR_FNMATCH_MACRO)
269
- /* TODO: warning if macro found in file below repo root */
270
- error = git_attr_cache__insert_macro(repo, rule);
271
- else
272
- error = git_vector_insert(&attrs->rules, rule);
320
+ if (error != GIT_ENOTFOUND)
321
+ goto out;
322
+ error = 0;
323
+ continue;
273
324
  }
274
325
 
275
- /* if the rule wasn't a pattern, on to the next */
276
- if (error < 0) {
277
- git_attr_rule__clear(rule); /* reset rule contents */
278
- if (error == GIT_ENOTFOUND)
279
- error = 0;
280
- } else {
281
- rule = NULL; /* vector now "owns" the rule */
282
- }
326
+ if (rule->match.flags & GIT_ATTR_FNMATCH_MACRO) {
327
+ /* TODO: warning if macro found in file below repo root */
328
+ if (!allow_macros)
329
+ continue;
330
+ if ((error = git_attr_cache__insert_macro(repo, rule)) < 0)
331
+ goto out;
332
+ } else if ((error = git_vector_insert(&attrs->rules, rule)) < 0)
333
+ goto out;
334
+
335
+ rule = NULL;
283
336
  }
284
337
 
338
+ out:
285
339
  git_mutex_unlock(&attrs->lock);
286
340
  git_attr_rule__free(rule);
287
341
 
@@ -328,33 +382,28 @@ int git_attr_file__lookup_one(
328
382
 
329
383
  int git_attr_file__load_standalone(git_attr_file **out, const char *path)
330
384
  {
331
- int error;
332
- git_attr_file *file;
333
385
  git_buf content = GIT_BUF_INIT;
386
+ git_attr_file *file = NULL;
387
+ int error;
334
388
 
335
- error = git_attr_file__new(&file, NULL, GIT_ATTR_FILE__FROM_FILE);
336
- if (error < 0)
337
- return error;
389
+ if ((error = git_futils_readbuffer(&content, path)) < 0)
390
+ goto out;
338
391
 
339
- error = git_attr_cache__alloc_file_entry(
340
- &file->entry, NULL, path, &file->pool);
341
- if (error < 0) {
342
- git_attr_file__free(file);
343
- return error;
344
- }
345
- /* because the cache entry is allocated from the file's own pool, we
392
+ /*
393
+ * Because the cache entry is allocated from the file's own pool, we
346
394
  * don't have to free it - freeing file+pool will free cache entry, too.
347
395
  */
348
396
 
349
- if (!(error = git_futils_readbuffer(&content, path))) {
350
- error = git_attr_file__parse_buffer(NULL, file, content.ptr);
351
- git_buf_free(&content);
352
- }
397
+ if ((error = git_attr_file__new(&file, NULL, GIT_ATTR_FILE__FROM_FILE)) < 0 ||
398
+ (error = git_attr_file__parse_buffer(NULL, file, content.ptr, true)) < 0 ||
399
+ (error = git_attr_cache__alloc_file_entry(&file->entry, NULL, path, &file->pool)) < 0)
400
+ goto out;
353
401
 
402
+ *out = file;
403
+ out:
354
404
  if (error < 0)
355
405
  git_attr_file__free(file);
356
- else
357
- *out = file;
406
+ git_buf_dispose(&content);
358
407
 
359
408
  return error;
360
409
  }
@@ -385,18 +434,13 @@ bool git_attr_fnmatch__match(
385
434
  }
386
435
 
387
436
  if (match->flags & GIT_ATTR_FNMATCH_ICASE)
388
- flags |= FNM_CASEFOLD;
389
- if (match->flags & GIT_ATTR_FNMATCH_LEADINGDIR)
390
- flags |= FNM_LEADING_DIR;
437
+ flags |= WM_CASEFOLD;
391
438
 
392
439
  if (match->flags & GIT_ATTR_FNMATCH_FULLPATH) {
393
440
  filename = relpath;
394
- flags |= FNM_PATHNAME;
441
+ flags |= WM_PATHNAME;
395
442
  } else {
396
443
  filename = path->basename;
397
-
398
- if (path->is_dir)
399
- flags |= FNM_LEADING_DIR;
400
444
  }
401
445
 
402
446
  if ((match->flags & GIT_ATTR_FNMATCH_DIRECTORY) && !path->is_dir) {
@@ -411,8 +455,6 @@ bool git_attr_fnmatch__match(
411
455
  path->basename == relpath)
412
456
  return false;
413
457
 
414
- flags |= FNM_LEADING_DIR;
415
-
416
458
  /* fail match if this is a file with same name as ignored folder */
417
459
  samename = (match->flags & GIT_ATTR_FNMATCH_ICASE) ?
418
460
  !strcasecmp(match->pattern, relpath) :
@@ -421,22 +463,10 @@ bool git_attr_fnmatch__match(
421
463
  if (samename)
422
464
  return false;
423
465
 
424
- return (p_fnmatch(match->pattern, relpath, flags) != FNM_NOMATCH);
425
- }
426
-
427
- /* if path is a directory prefix of a negated pattern, then match */
428
- if ((match->flags & GIT_ATTR_FNMATCH_NEGATIVE) && path->is_dir) {
429
- size_t pathlen = strlen(relpath);
430
- bool prefixed = (pathlen <= match->length) &&
431
- ((match->flags & GIT_ATTR_FNMATCH_ICASE) ?
432
- !strncasecmp(match->pattern, relpath, pathlen) :
433
- !strncmp(match->pattern, relpath, pathlen));
434
-
435
- if (prefixed && git_path_at_end_of_segment(&match->pattern[pathlen]))
436
- return true;
466
+ return (wildmatch(match->pattern, relpath, flags) == WM_MATCH);
437
467
  }
438
468
 
439
- return (p_fnmatch(match->pattern, filename, flags) != FNM_NOMATCH);
469
+ return (wildmatch(match->pattern, filename, flags) == WM_MATCH);
440
470
  }
441
471
 
442
472
  bool git_attr_rule__match(
@@ -518,7 +548,7 @@ int git_attr_path__init(
518
548
 
519
549
  void git_attr_path__free(git_attr_path *info)
520
550
  {
521
- git_buf_free(&info->full);
551
+ git_buf_dispose(&info->full);
522
552
  info->path = NULL;
523
553
  info->basename = NULL;
524
554
  }
@@ -555,6 +585,61 @@ void git_attr_path__free(git_attr_path *info)
555
585
  * "cat-file.c" but not "mozilla-sha1/sha1.c".
556
586
  */
557
587
 
588
+ /*
589
+ * Determine the length of trailing spaces. Escaped spaces do not count as
590
+ * trailing whitespace.
591
+ */
592
+ static size_t trailing_space_length(const char *p, size_t len)
593
+ {
594
+ size_t n, i;
595
+ for (n = len; n; n--) {
596
+ if (p[n-1] != ' ' && p[n-1] != '\t')
597
+ break;
598
+
599
+ /*
600
+ * Count escape-characters before space. In case where it's an
601
+ * even number of escape characters, then the escape char itself
602
+ * is escaped and the whitespace is an unescaped whitespace.
603
+ * Otherwise, the last escape char is not escaped and the
604
+ * whitespace in an escaped whitespace.
605
+ */
606
+ i = n;
607
+ while (i > 1 && p[i-2] == '\\')
608
+ i--;
609
+ if ((n - i) % 2)
610
+ break;
611
+ }
612
+ return len - n;
613
+ }
614
+
615
+ static size_t unescape_spaces(char *str)
616
+ {
617
+ char *scan, *pos = str;
618
+ bool escaped = false;
619
+
620
+ if (!str)
621
+ return 0;
622
+
623
+ for (scan = str; *scan; scan++) {
624
+ if (!escaped && *scan == '\\') {
625
+ escaped = true;
626
+ continue;
627
+ }
628
+
629
+ /* Only insert the escape character for escaped non-spaces */
630
+ if (escaped && !git__isspace(*scan))
631
+ *pos++ = '\\';
632
+
633
+ *pos++ = *scan;
634
+ escaped = false;
635
+ }
636
+
637
+ if (pos != scan)
638
+ *pos = '\0';
639
+
640
+ return (pos - str);
641
+ }
642
+
558
643
  /*
559
644
  * This will return 0 if the spec was filled out,
560
645
  * GIT_ENOTFOUND if the fnmatch does not require matching, or
@@ -568,6 +653,7 @@ int git_attr_fnmatch__parse(
568
653
  {
569
654
  const char *pattern, *scan;
570
655
  int slash_count, allow_space;
656
+ bool escaped;
571
657
 
572
658
  assert(spec && base && *base);
573
659
 
@@ -579,8 +665,11 @@ int git_attr_fnmatch__parse(
579
665
 
580
666
  pattern = *base;
581
667
 
582
- while (git__isspace(*pattern)) pattern++;
583
- if (!*pattern || *pattern == '#') {
668
+ while (!allow_space && git__isspace(*pattern))
669
+ pattern++;
670
+
671
+ if (!*pattern || *pattern == '#' || *pattern == '\n' ||
672
+ (*pattern == '\r' && *(pattern + 1) == '\n')) {
584
673
  *base = git__next_line(pattern);
585
674
  return GIT_ENOTFOUND;
586
675
  }
@@ -595,29 +684,33 @@ int git_attr_fnmatch__parse(
595
684
 
596
685
  if (*pattern == '!' && (spec->flags & GIT_ATTR_FNMATCH_ALLOWNEG) != 0) {
597
686
  spec->flags = spec->flags | GIT_ATTR_FNMATCH_NEGATIVE;
598
- if ((spec->flags & GIT_ATTR_FNMATCH_NOLEADINGDIR) == 0)
599
- spec->flags |= GIT_ATTR_FNMATCH_LEADINGDIR;
600
687
  pattern++;
601
688
  }
602
689
 
603
690
  slash_count = 0;
691
+ escaped = false;
692
+ /* Scan until a non-escaped whitespace. */
604
693
  for (scan = pattern; *scan != '\0'; ++scan) {
605
- /* scan until (non-escaped) white space */
606
- if (git__isspace(*scan) && *(scan - 1) != '\\') {
607
- if (!allow_space || (*scan != ' ' && *scan != '\t' && *scan != '\r'))
608
- break;
609
- }
694
+ char c = *scan;
610
695
 
611
- if (*scan == '/') {
696
+ if (c == '\\' && !escaped) {
697
+ escaped = true;
698
+ continue;
699
+ } else if (git__isspace(c) && !escaped) {
700
+ if (!allow_space || (c != ' ' && c != '\t' && c != '\r'))
701
+ break;
702
+ } else if (c == '/') {
612
703
  spec->flags = spec->flags | GIT_ATTR_FNMATCH_FULLPATH;
613
704
  slash_count++;
614
- if (pattern == scan)
705
+
706
+ if (slash_count == 1 && pattern == scan)
615
707
  pattern++;
616
- }
617
- /* remember if we see an unescaped wildcard in pattern */
618
- else if (git__iswildcard(*scan) &&
619
- (scan == pattern || (*(scan - 1) != '\\')))
708
+ } else if (git__iswildcard(c) && !escaped) {
709
+ /* remember if we see an unescaped wildcard in pattern */
620
710
  spec->flags = spec->flags | GIT_ATTR_FNMATCH_HASWILD;
711
+ }
712
+
713
+ escaped = false;
621
714
  }
622
715
 
623
716
  *base = scan;
@@ -635,9 +728,10 @@ int git_attr_fnmatch__parse(
635
728
  return GIT_ENOTFOUND;
636
729
 
637
730
  /* Remove trailing spaces. */
638
- while (pattern[spec->length - 1] == ' ' || pattern[spec->length - 1] == '\t')
639
- if (--spec->length == 0)
640
- return GIT_ENOTFOUND;
731
+ spec->length -= trailing_space_length(pattern, spec->length);
732
+
733
+ if (spec->length == 0)
734
+ return GIT_ENOTFOUND;
641
735
 
642
736
  if (pattern[spec->length - 1] == '/') {
643
737
  spec->length--;
@@ -645,14 +739,6 @@ int git_attr_fnmatch__parse(
645
739
  if (--slash_count <= 0)
646
740
  spec->flags = spec->flags & ~GIT_ATTR_FNMATCH_FULLPATH;
647
741
  }
648
- if ((spec->flags & GIT_ATTR_FNMATCH_NOLEADINGDIR) == 0 &&
649
- spec->length >= 2 &&
650
- pattern[spec->length - 1] == '*' &&
651
- pattern[spec->length - 2] == '/') {
652
- spec->length -= 2;
653
- spec->flags = spec->flags | GIT_ATTR_FNMATCH_LEADINGDIR;
654
- /* leave FULLPATH match on, however */
655
- }
656
742
 
657
743
  if (context) {
658
744
  char *slash = strrchr(context, '/');
@@ -671,9 +757,8 @@ int git_attr_fnmatch__parse(
671
757
  *base = git__next_line(pattern);
672
758
  return -1;
673
759
  } else {
674
- /* strip '\' that might have be used for internal whitespace */
675
- spec->length = git__unescape(spec->pattern);
676
- /* TODO: convert remaining '\' into '/' for POSIX ??? */
760
+ /* strip '\' that might have been used for internal whitespace */
761
+ spec->length = unescape_spaces(spec->pattern);
677
762
  }
678
763
 
679
764
  return 0;
@@ -751,7 +836,7 @@ int git_attr_assignment__parse(
751
836
  /* allocate assign if needed */
752
837
  if (!assign) {
753
838
  assign = git__calloc(1, sizeof(git_attr_assignment));
754
- GITERR_CHECK_ALLOC(assign);
839
+ GIT_ERROR_CHECK_ALLOC(assign);
755
840
  GIT_REFCOUNT_INC(assign);
756
841
  }
757
842
 
@@ -785,7 +870,7 @@ int git_attr_assignment__parse(
785
870
 
786
871
  /* allocate permanent storage for name */
787
872
  assign->name = git_pool_strndup(pool, name_start, scan - name_start);
788
- GITERR_CHECK_ALLOC(assign->name);
873
+ GIT_ERROR_CHECK_ALLOC(assign->name);
789
874
 
790
875
  /* if there is an equals sign, find the value */
791
876
  if (*scan == '=') {
@@ -794,7 +879,7 @@ int git_attr_assignment__parse(
794
879
  /* if we found a value, allocate permanent storage for it */
795
880
  if (scan > value_start) {
796
881
  assign->value = git_pool_strndup(pool, value_start, scan - value_start);
797
- GITERR_CHECK_ALLOC(assign->value);
882
+ GIT_ERROR_CHECK_ALLOC(assign->value);
798
883
  }
799
884
  }
800
885
 
@@ -866,6 +951,7 @@ int git_attr_session__init(git_attr_session *session, git_repository *repo)
866
951
  {
867
952
  assert(repo);
868
953
 
954
+ memset(session, 0, sizeof(*session));
869
955
  session->key = git_atomic_inc(&repo->attr_session_key);
870
956
 
871
957
  return 0;
@@ -876,8 +962,8 @@ void git_attr_session__free(git_attr_session *session)
876
962
  if (!session)
877
963
  return;
878
964
 
879
- git_buf_free(&session->sysdir);
880
- git_buf_free(&session->tmp);
965
+ git_buf_dispose(&session->sysdir);
966
+ git_buf_dispose(&session->tmp);
881
967
 
882
968
  memset(session, 0, sizeof(git_attr_session));
883
969
  }