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
@@ -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,6 +218,8 @@ int git_attr_file__load(
178
218
 
179
219
  cleanup:
180
220
  git_blob_free(blob);
221
+ git_tree_entry_free(tree_entry);
222
+ git_tree_free(tree);
181
223
  git_buf_dispose(&content);
182
224
 
183
225
  return error;
@@ -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_dispose(&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(
@@ -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;
@@ -14,7 +14,7 @@
14
14
  #include "vector.h"
15
15
  #include "pool.h"
16
16
  #include "buffer.h"
17
- #include "fileops.h"
17
+ #include "futils.h"
18
18
 
19
19
  #define GIT_ATTR_FILE ".gitattributes"
20
20
  #define GIT_ATTR_FILE_INREPO "attributes"
@@ -32,19 +32,17 @@
32
32
  #define GIT_ATTR_FNMATCH_MATCH_ALL (1U << 8)
33
33
  #define GIT_ATTR_FNMATCH_ALLOWNEG (1U << 9)
34
34
  #define GIT_ATTR_FNMATCH_ALLOWMACRO (1U << 10)
35
- #define GIT_ATTR_FNMATCH_LEADINGDIR (1U << 11)
36
- #define GIT_ATTR_FNMATCH_NOLEADINGDIR (1U << 12)
37
35
 
38
36
  #define GIT_ATTR_FNMATCH__INCOMING \
39
- (GIT_ATTR_FNMATCH_ALLOWSPACE | GIT_ATTR_FNMATCH_ALLOWNEG | \
40
- GIT_ATTR_FNMATCH_ALLOWMACRO | GIT_ATTR_FNMATCH_NOLEADINGDIR)
37
+ (GIT_ATTR_FNMATCH_ALLOWSPACE | GIT_ATTR_FNMATCH_ALLOWNEG | GIT_ATTR_FNMATCH_ALLOWMACRO)
41
38
 
42
39
  typedef enum {
43
40
  GIT_ATTR_FILE__IN_MEMORY = 0,
44
41
  GIT_ATTR_FILE__FROM_FILE = 1,
45
42
  GIT_ATTR_FILE__FROM_INDEX = 2,
43
+ GIT_ATTR_FILE__FROM_HEAD = 3,
46
44
 
47
- GIT_ATTR_FILE_NUM_SOURCES = 3
45
+ GIT_ATTR_FILE_NUM_SOURCES = 4
48
46
  } git_attr_file_source;
49
47
 
50
48
  extern const char *git_attr__true;
@@ -134,7 +132,8 @@ extern int git_attr_get_many_with_session(
134
132
  typedef int (*git_attr_file_parser)(
135
133
  git_repository *repo,
136
134
  git_attr_file *file,
137
- const char *data);
135
+ const char *data,
136
+ bool allow_macros);
138
137
 
139
138
  /*
140
139
  * git_attr_file API
@@ -153,7 +152,8 @@ int git_attr_file__load(
153
152
  git_attr_session *attr_session,
154
153
  git_attr_file_entry *ce,
155
154
  git_attr_file_source source,
156
- git_attr_file_parser parser);
155
+ git_attr_file_parser parser,
156
+ bool allow_macros);
157
157
 
158
158
  int git_attr_file__load_standalone(
159
159
  git_attr_file **out, const char *path);
@@ -162,7 +162,7 @@ int git_attr_file__out_of_date(
162
162
  git_repository *repo, git_attr_session *session, git_attr_file *file);
163
163
 
164
164
  int git_attr_file__parse_buffer(
165
- git_repository *repo, git_attr_file *attrs, const char *data);
165
+ git_repository *repo, git_attr_file *attrs, const char *data, bool allow_macros);
166
166
 
167
167
  int git_attr_file__clear_rules(
168
168
  git_attr_file *file, bool need_lock);