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
@@ -14,13 +14,36 @@
14
14
  #include "win32/w32_buffer.h"
15
15
  #include "win32/w32_util.h"
16
16
  #include "win32/version.h"
17
+ #include <aclapi.h>
17
18
  #else
18
19
  #include <dirent.h>
19
20
  #endif
20
21
  #include <stdio.h>
21
22
  #include <ctype.h>
22
23
 
23
- #define LOOKS_LIKE_DRIVE_PREFIX(S) (git__isalpha((S)[0]) && (S)[1] == ':')
24
+ static int dos_drive_prefix_length(const char *path)
25
+ {
26
+ int i;
27
+
28
+ /*
29
+ * Does it start with an ASCII letter (i.e. highest bit not set),
30
+ * followed by a colon?
31
+ */
32
+ if (!(0x80 & (unsigned char)*path))
33
+ return *path && path[1] == ':' ? 2 : 0;
34
+
35
+ /*
36
+ * While drive letters must be letters of the English alphabet, it is
37
+ * possible to assign virtually _any_ Unicode character via `subst` as
38
+ * a drive letter to "virtual drives". Even `1`, or `ä`. Or fun stuff
39
+ * like this:
40
+ *
41
+ * subst ֍: %USERPROFILE%\Desktop
42
+ */
43
+ for (i = 1; i < 4 && (0x80 & (unsigned char)path[i]); i++)
44
+ ; /* skip first UTF-8 character */
45
+ return path[i] == ':' ? i + 1 : 0;
46
+ }
24
47
 
25
48
  #ifdef GIT_WIN32
26
49
  static bool looks_like_network_computer_name(const char *path, int pos)
@@ -122,11 +145,11 @@ static int win32_prefix_length(const char *path, int len)
122
145
  GIT_UNUSED(len);
123
146
  #else
124
147
  /*
125
- * Mimic unix behavior where '/.git' returns '/': 'C:/.git' will return
126
- * 'C:/' here
148
+ * Mimic unix behavior where '/.git' returns '/': 'C:/.git'
149
+ * will return 'C:/' here
127
150
  */
128
- if (len == 2 && LOOKS_LIKE_DRIVE_PREFIX(path))
129
- return 2;
151
+ if (dos_drive_prefix_length(path) == len)
152
+ return len;
130
153
 
131
154
  /*
132
155
  * Similarly checks if we're dealing with a network computer name
@@ -160,7 +183,13 @@ int git_path_dirname_r(git_buf *buffer, const char *path)
160
183
  while (endp > path && *endp == '/')
161
184
  endp--;
162
185
 
163
- if ((len = win32_prefix_length(path, endp - path + 1)) > 0) {
186
+ if (endp - path + 1 > INT_MAX) {
187
+ git_error_set(GIT_ERROR_INVALID, "path too long");
188
+ len = -1;
189
+ goto Exit;
190
+ }
191
+
192
+ if ((len = win32_prefix_length(path, (int)(endp - path + 1))) > 0) {
164
193
  is_prefix = 1;
165
194
  goto Exit;
166
195
  }
@@ -180,7 +209,13 @@ int git_path_dirname_r(git_buf *buffer, const char *path)
180
209
  endp--;
181
210
  } while (endp > path && *endp == '/');
182
211
 
183
- if ((len = win32_prefix_length(path, endp - path + 1)) > 0) {
212
+ if (endp - path + 1 > INT_MAX) {
213
+ git_error_set(GIT_ERROR_INVALID, "path too long");
214
+ len = -1;
215
+ goto Exit;
216
+ }
217
+
218
+ if ((len = win32_prefix_length(path, (int)(endp - path + 1))) > 0) {
184
219
  is_prefix = 1;
185
220
  goto Exit;
186
221
  }
@@ -259,11 +294,11 @@ const char *git_path_topdir(const char *path)
259
294
 
260
295
  int git_path_root(const char *path)
261
296
  {
262
- int offset = 0;
297
+ int offset = 0, prefix_len;
263
298
 
264
299
  /* Does the root of the path look like a windows drive ? */
265
- if (LOOKS_LIKE_DRIVE_PREFIX(path))
266
- offset += 2;
300
+ if ((prefix_len = dos_drive_prefix_length(path)))
301
+ offset += prefix_len;
267
302
 
268
303
  #ifdef GIT_WIN32
269
304
  /* Are we dealing with a windows network path? */
@@ -276,9 +311,12 @@ int git_path_root(const char *path)
276
311
  while (path[offset] && path[offset] != '/' && path[offset] != '\\')
277
312
  offset++;
278
313
  }
314
+
315
+ if (path[offset] == '\\')
316
+ return offset;
279
317
  #endif
280
318
 
281
- if (path[offset] == '/' || path[offset] == '\\')
319
+ if (path[offset] == '/')
282
320
  return offset;
283
321
 
284
322
  return -1; /* Not a real error - signals that path is not rooted */
@@ -361,9 +399,9 @@ int git_path_prettify(git_buf *path_out, const char *path, const char *base)
361
399
  }
362
400
 
363
401
  if (p_realpath(path, buf) == NULL) {
364
- /* giterr_set resets the errno when dealing with a GITERR_OS kind of error */
402
+ /* git_error_set resets the errno when dealing with a GIT_ERROR_OS kind of error */
365
403
  int error = (errno == ENOENT || errno == ENOTDIR) ? GIT_ENOTFOUND : -1;
366
- giterr_set(GITERR_OS, "failed to resolve path '%s'", path);
404
+ git_error_set(GIT_ERROR_OS, "failed to resolve path '%s'", path);
367
405
 
368
406
  git_buf_clear(path_out);
369
407
 
@@ -436,7 +474,7 @@ append:
436
474
 
437
475
  static int error_invalid_local_file_uri(const char *uri)
438
476
  {
439
- giterr_set(GITERR_CONFIG, "'%s' is not a valid local file URI", uri);
477
+ git_error_set(GIT_ERROR_CONFIG, "'%s' is not a valid local file URI", uri);
440
478
  return -1;
441
479
  }
442
480
 
@@ -502,7 +540,7 @@ int git_path_walk_up(
502
540
  if (!scan) {
503
541
  error = cb(data, "");
504
542
  if (error)
505
- giterr_set_after_callback(error);
543
+ git_error_set_after_callback(error);
506
544
  return error;
507
545
  }
508
546
 
@@ -515,7 +553,7 @@ int git_path_walk_up(
515
553
  iter.ptr[scan] = oldc;
516
554
 
517
555
  if (error) {
518
- giterr_set_after_callback(error);
556
+ git_error_set_after_callback(error);
519
557
  break;
520
558
  }
521
559
 
@@ -535,7 +573,7 @@ int git_path_walk_up(
535
573
  if (!error && stop == 0 && iter.ptr[0] != '/') {
536
574
  error = cb(data, "");
537
575
  if (error)
538
- giterr_set_after_callback(error);
576
+ git_error_set_after_callback(error);
539
577
  }
540
578
 
541
579
  return error;
@@ -638,7 +676,7 @@ bool git_path_is_empty_dir(const char *path)
638
676
  return false;
639
677
 
640
678
  if ((error = git_buf_sets(&dir, path)) != 0)
641
- giterr_clear();
679
+ git_error_clear();
642
680
  else
643
681
  error = git_path_direach(&dir, 0, path_found_entry, NULL);
644
682
 
@@ -654,24 +692,24 @@ int git_path_set_error(int errno_value, const char *path, const char *action)
654
692
  switch (errno_value) {
655
693
  case ENOENT:
656
694
  case ENOTDIR:
657
- giterr_set(GITERR_OS, "could not find '%s' to %s", path, action);
695
+ git_error_set(GIT_ERROR_OS, "could not find '%s' to %s", path, action);
658
696
  return GIT_ENOTFOUND;
659
697
 
660
698
  case EINVAL:
661
699
  case ENAMETOOLONG:
662
- giterr_set(GITERR_OS, "invalid path for filesystem '%s'", path);
700
+ git_error_set(GIT_ERROR_OS, "invalid path for filesystem '%s'", path);
663
701
  return GIT_EINVALIDSPEC;
664
702
 
665
703
  case EEXIST:
666
- giterr_set(GITERR_OS, "failed %s - '%s' already exists", action, path);
704
+ git_error_set(GIT_ERROR_OS, "failed %s - '%s' already exists", action, path);
667
705
  return GIT_EEXISTS;
668
706
 
669
707
  case EACCES:
670
- giterr_set(GITERR_OS, "failed %s - '%s' is locked", action, path);
708
+ git_error_set(GIT_ERROR_OS, "failed %s - '%s' is locked", action, path);
671
709
  return GIT_ELOCKED;
672
710
 
673
711
  default:
674
- giterr_set(GITERR_OS, "could not %s '%s'", action, path);
712
+ git_error_set(GIT_ERROR_OS, "could not %s '%s'", action, path);
675
713
  return -1;
676
714
  }
677
715
  }
@@ -751,7 +789,7 @@ int git_path_resolve_relative(git_buf *path, size_t ceiling)
751
789
  char *base, *to, *from, *next;
752
790
  size_t len;
753
791
 
754
- GITERR_CHECK_ALLOC_BUF(path);
792
+ GIT_ERROR_CHECK_ALLOC_BUF(path);
755
793
 
756
794
  if (ceiling > path->size)
757
795
  ceiling = path->size;
@@ -780,7 +818,7 @@ int git_path_resolve_relative(git_buf *path, size_t ceiling)
780
818
  else if (len == 2 && from[0] == '.' && from[1] == '.') {
781
819
  /* error out if trying to up one from a hard base */
782
820
  if (to == base && ceiling != 0) {
783
- giterr_set(GITERR_INVALID,
821
+ git_error_set(GIT_ERROR_INVALID,
784
822
  "cannot strip root component off url");
785
823
  return -1;
786
824
  }
@@ -887,7 +925,7 @@ int git_path_make_relative(git_buf *path, const char *parent)
887
925
  /* need at least 1 common path segment */
888
926
  if ((p_dirsep == path->ptr || q_dirsep == parent) &&
889
927
  (*p_dirsep != '/' || *q_dirsep != '/')) {
890
- giterr_set(GITERR_INVALID,
928
+ git_error_set(GIT_ERROR_INVALID,
891
929
  "%s is not a parent of %s", parent, path->ptr);
892
930
  return GIT_ENOTFOUND;
893
931
  }
@@ -911,10 +949,10 @@ int git_path_make_relative(git_buf *path, const char *parent)
911
949
  for (; (q = strchr(q, '/')) && *(q + 1); q++)
912
950
  depth++;
913
951
 
914
- GITERR_CHECK_ALLOC_MULTIPLY(&newlen, depth, 3);
915
- GITERR_CHECK_ALLOC_ADD(&newlen, newlen, plen);
952
+ GIT_ERROR_CHECK_ALLOC_MULTIPLY(&newlen, depth, 3);
953
+ GIT_ERROR_CHECK_ALLOC_ADD(&newlen, newlen, plen);
916
954
 
917
- GITERR_CHECK_ALLOC_ADD(&alloclen, newlen, 1);
955
+ GIT_ERROR_CHECK_ALLOC_ADD(&alloclen, newlen, 1);
918
956
 
919
957
  /* save the offset as we might realllocate the pointer */
920
958
  offset = p - path->ptr;
@@ -973,7 +1011,7 @@ int git_path_iconv(git_path_iconv_t *ic, const char **in, size_t *inlen)
973
1011
  git_buf_clear(&ic->buf);
974
1012
 
975
1013
  while (1) {
976
- GITERR_CHECK_ALLOC_ADD(&alloclen, wantlen, 1);
1014
+ GIT_ERROR_CHECK_ALLOC_ADD(&alloclen, wantlen, 1);
977
1015
  if (git_buf_grow(&ic->buf, alloclen) < 0)
978
1016
  return -1;
979
1017
 
@@ -1010,7 +1048,7 @@ int git_path_iconv(git_path_iconv_t *ic, const char **in, size_t *inlen)
1010
1048
  return 0;
1011
1049
 
1012
1050
  fail:
1013
- giterr_set(GITERR_OS, "unable to convert unicode path data");
1051
+ git_error_set(GIT_ERROR_OS, "unable to convert unicode path data");
1014
1052
  return -1;
1015
1053
  }
1016
1054
 
@@ -1103,7 +1141,7 @@ int git_path_direach(
1103
1141
  wd_len = git_buf_len(path);
1104
1142
 
1105
1143
  if ((dir = opendir(path->ptr)) == NULL) {
1106
- giterr_set(GITERR_OS, "failed to open directory '%s'", path->ptr);
1144
+ git_error_set(GIT_ERROR_OS, "failed to open directory '%s'", path->ptr);
1107
1145
  if (errno == ENOENT)
1108
1146
  return GIT_ENOTFOUND;
1109
1147
 
@@ -1130,15 +1168,15 @@ int git_path_direach(
1130
1168
  if ((error = git_buf_put(path, de_path, de_len)) < 0)
1131
1169
  break;
1132
1170
 
1133
- giterr_clear();
1171
+ git_error_clear();
1134
1172
  error = fn(arg, path);
1135
1173
 
1136
1174
  git_buf_truncate(path, wd_len); /* restore path */
1137
1175
 
1138
1176
  /* Only set our own error if the callback did not set one already */
1139
1177
  if (error != 0) {
1140
- if (!giterr_last())
1141
- giterr_set_after_callback(error);
1178
+ if (!git_error_last())
1179
+ git_error_set_after_callback(error);
1142
1180
 
1143
1181
  break;
1144
1182
  }
@@ -1184,13 +1222,13 @@ int git_path_diriter_init(
1184
1222
  git_path_trim_slashes(&diriter->path_utf8);
1185
1223
 
1186
1224
  if (diriter->path_utf8.size == 0) {
1187
- giterr_set(GITERR_FILESYSTEM, "could not open directory '%s'", path);
1225
+ git_error_set(GIT_ERROR_FILESYSTEM, "could not open directory '%s'", path);
1188
1226
  return -1;
1189
1227
  }
1190
1228
 
1191
1229
  if ((diriter->parent_len = git_win32_path_from_utf8(diriter->path, diriter->path_utf8.ptr)) < 0 ||
1192
1230
  !git_win32__findfirstfile_filter(path_filter, diriter->path_utf8.ptr)) {
1193
- giterr_set(GITERR_OS, "could not parse the directory path '%s'", path);
1231
+ git_error_set(GIT_ERROR_OS, "could not parse the directory path '%s'", path);
1194
1232
  return -1;
1195
1233
  }
1196
1234
 
@@ -1203,7 +1241,7 @@ int git_path_diriter_init(
1203
1241
  is_win7_or_later ? FIND_FIRST_EX_LARGE_FETCH : 0);
1204
1242
 
1205
1243
  if (diriter->handle == INVALID_HANDLE_VALUE) {
1206
- giterr_set(GITERR_OS, "could not open directory '%s'", path);
1244
+ git_error_set(GIT_ERROR_OS, "could not open directory '%s'", path);
1207
1245
  return -1;
1208
1246
  }
1209
1247
 
@@ -1223,7 +1261,7 @@ static int diriter_update_paths(git_path_diriter *diriter)
1223
1261
  return -1;
1224
1262
 
1225
1263
  if (path_len > GIT_WIN_PATH_UTF16) {
1226
- giterr_set(GITERR_FILESYSTEM,
1264
+ git_error_set(GIT_ERROR_FILESYSTEM,
1227
1265
  "invalid path '%.*ls\\%ls' (path too long)",
1228
1266
  diriter->parent_len, diriter->path, diriter->current.cFileName);
1229
1267
  return -1;
@@ -1333,14 +1371,14 @@ int git_path_diriter_init(
1333
1371
  git_path_trim_slashes(&diriter->path);
1334
1372
 
1335
1373
  if (diriter->path.size == 0) {
1336
- giterr_set(GITERR_FILESYSTEM, "could not open directory '%s'", path);
1374
+ git_error_set(GIT_ERROR_FILESYSTEM, "could not open directory '%s'", path);
1337
1375
  return -1;
1338
1376
  }
1339
1377
 
1340
1378
  if ((diriter->dir = opendir(diriter->path.ptr)) == NULL) {
1341
1379
  git_buf_dispose(&diriter->path);
1342
1380
 
1343
- giterr_set(GITERR_OS, "failed to open directory '%s'", path);
1381
+ git_error_set(GIT_ERROR_OS, "failed to open directory '%s'", path);
1344
1382
  return -1;
1345
1383
  }
1346
1384
 
@@ -1372,7 +1410,7 @@ int git_path_diriter_next(git_path_diriter *diriter)
1372
1410
  if (!errno)
1373
1411
  return GIT_ITEROVER;
1374
1412
 
1375
- giterr_set(GITERR_OS,
1413
+ git_error_set(GIT_ERROR_OS,
1376
1414
  "could not read directory '%s'", diriter->path.ptr);
1377
1415
  return -1;
1378
1416
  }
@@ -1477,7 +1515,7 @@ int git_path_dirload(
1477
1515
  assert(name_len > prefix_len);
1478
1516
 
1479
1517
  dup = git__strndup(name + prefix_len, name_len - prefix_len);
1480
- GITERR_CHECK_ALLOC(dup);
1518
+ GIT_ERROR_CHECK_ALLOC(dup);
1481
1519
 
1482
1520
  if ((error = git_vector_insert(contents, dup)) < 0)
1483
1521
  break;
@@ -1608,8 +1646,12 @@ GIT_INLINE(bool) verify_dotgit_ntfs(git_repository *repo, const char *path, size
1608
1646
  if (!start)
1609
1647
  return true;
1610
1648
 
1611
- /* Reject paths like ".git\" */
1612
- if (path[start] == '\\')
1649
+ /*
1650
+ * Reject paths that start with Windows-style directory separators
1651
+ * (".git\") or NTFS alternate streams (".git:") and could be used
1652
+ * to write to the ".git" directory on Windows platforms.
1653
+ */
1654
+ if (path[start] == '\\' || path[start] == ':')
1613
1655
  return false;
1614
1656
 
1615
1657
  /* Reject paths like '.git ' or '.git.' */
@@ -1621,12 +1663,21 @@ GIT_INLINE(bool) verify_dotgit_ntfs(git_repository *repo, const char *path, size
1621
1663
  return false;
1622
1664
  }
1623
1665
 
1624
- GIT_INLINE(bool) only_spaces_and_dots(const char *path)
1666
+ /*
1667
+ * Windows paths that end with spaces and/or dots are elided to the
1668
+ * path without them for backward compatibility. That is to say
1669
+ * that opening file "foo ", "foo." or even "foo . . ." will all
1670
+ * map to a filename of "foo". This function identifies spaces and
1671
+ * dots at the end of a filename, whether the proper end of the
1672
+ * filename (end of string) or a colon (which would indicate a
1673
+ * Windows alternate data stream.)
1674
+ */
1675
+ GIT_INLINE(bool) ntfs_end_of_filename(const char *path)
1625
1676
  {
1626
1677
  const char *c = path;
1627
1678
 
1628
1679
  for (;; c++) {
1629
- if (*c == '\0')
1680
+ if (*c == '\0' || *c == ':')
1630
1681
  return true;
1631
1682
  if (*c != ' ' && *c != '.')
1632
1683
  return false;
@@ -1641,13 +1692,13 @@ GIT_INLINE(bool) verify_dotgit_ntfs_generic(const char *name, size_t len, const
1641
1692
 
1642
1693
  if (name[0] == '.' && len >= dotgit_len &&
1643
1694
  !strncasecmp(name + 1, dotgit_name, dotgit_len)) {
1644
- return !only_spaces_and_dots(name + dotgit_len + 1);
1695
+ return !ntfs_end_of_filename(name + dotgit_len + 1);
1645
1696
  }
1646
1697
 
1647
1698
  /* Detect the basic NTFS shortname with the first six chars */
1648
1699
  if (!strncasecmp(name, dotgit_name, 6) && name[6] == '~' &&
1649
1700
  name[7] >= '1' && name[7] <= '4')
1650
- return !only_spaces_and_dots(name + 8);
1701
+ return !ntfs_end_of_filename(name + 8);
1651
1702
 
1652
1703
  /* Catch fallback names */
1653
1704
  for (i = 0, saw_tilde = 0; i < 8; i++) {
@@ -1662,14 +1713,14 @@ GIT_INLINE(bool) verify_dotgit_ntfs_generic(const char *name, size_t len, const
1662
1713
  saw_tilde = 1;
1663
1714
  } else if (i >= 6) {
1664
1715
  return true;
1665
- } else if (name[i] < 0) {
1716
+ } else if ((unsigned char)name[i] > 127) {
1666
1717
  return true;
1667
1718
  } else if (git__tolower(name[i]) != shortname_pfix[i]) {
1668
1719
  return true;
1669
1720
  }
1670
1721
  }
1671
1722
 
1672
- return !only_spaces_and_dots(name + i);
1723
+ return !ntfs_end_of_filename(name + i);
1673
1724
  }
1674
1725
 
1675
1726
  GIT_INLINE(bool) verify_char(unsigned char c, unsigned int flags)
@@ -1803,7 +1854,7 @@ GIT_INLINE(unsigned int) dotgit_flags(
1803
1854
  git_repository *repo,
1804
1855
  unsigned int flags)
1805
1856
  {
1806
- int protectHFS = 0, protectNTFS = 0;
1857
+ int protectHFS = 0, protectNTFS = 1;
1807
1858
  int error = 0;
1808
1859
 
1809
1860
  flags |= GIT_PATH_REJECT_DOT_GIT_LITERAL;
@@ -1812,17 +1863,13 @@ GIT_INLINE(unsigned int) dotgit_flags(
1812
1863
  protectHFS = 1;
1813
1864
  #endif
1814
1865
 
1815
- #ifdef GIT_WIN32
1816
- protectNTFS = 1;
1817
- #endif
1818
-
1819
1866
  if (repo && !protectHFS)
1820
- error = git_repository__cvar(&protectHFS, repo, GIT_CVAR_PROTECTHFS);
1867
+ error = git_repository__configmap_lookup(&protectHFS, repo, GIT_CONFIGMAP_PROTECTHFS);
1821
1868
  if (!error && protectHFS)
1822
1869
  flags |= GIT_PATH_REJECT_DOT_GIT_HFS;
1823
1870
 
1824
- if (repo && !protectNTFS)
1825
- error = git_repository__cvar(&protectNTFS, repo, GIT_CVAR_PROTECTNTFS);
1871
+ if (repo)
1872
+ error = git_repository__configmap_lookup(&protectNTFS, repo, GIT_CONFIGMAP_PROTECTNTFS);
1826
1873
  if (!error && protectNTFS)
1827
1874
  flags |= GIT_PATH_REJECT_DOT_GIT_NTFS;
1828
1875
 
@@ -1887,8 +1934,8 @@ extern int git_path_is_gitfile(const char *path, size_t pathlen, git_path_gitfil
1887
1934
  const char *file, *hash;
1888
1935
  size_t filelen;
1889
1936
 
1890
- if (gitfile < 0 && gitfile >= ARRAY_SIZE(gitfiles)) {
1891
- giterr_set(GITERR_OS, "invalid gitfile for path validation");
1937
+ if (!(gitfile >= GIT_PATH_GITFILE_GITIGNORE && gitfile < ARRAY_SIZE(gitfiles))) {
1938
+ git_error_set(GIT_ERROR_OS, "invalid gitfile for path validation");
1892
1939
  return -1;
1893
1940
  }
1894
1941
 
@@ -1905,7 +1952,105 @@ extern int git_path_is_gitfile(const char *path, size_t pathlen, git_path_gitfil
1905
1952
  case GIT_PATH_FS_HFS:
1906
1953
  return !verify_dotgit_hfs_generic(path, pathlen, file, filelen);
1907
1954
  default:
1908
- giterr_set(GITERR_OS, "invalid filesystem for path validation");
1955
+ git_error_set(GIT_ERROR_OS, "invalid filesystem for path validation");
1956
+ return -1;
1957
+ }
1958
+ }
1959
+
1960
+ bool git_path_supports_symlinks(const char *dir)
1961
+ {
1962
+ git_buf path = GIT_BUF_INIT;
1963
+ bool supported = false;
1964
+ struct stat st;
1965
+ int fd;
1966
+
1967
+ if ((fd = git_futils_mktmp(&path, dir, 0666)) < 0 ||
1968
+ p_close(fd) < 0 ||
1969
+ p_unlink(path.ptr) < 0 ||
1970
+ p_symlink("testing", path.ptr) < 0 ||
1971
+ p_lstat(path.ptr, &st) < 0)
1972
+ goto done;
1973
+
1974
+ supported = (S_ISLNK(st.st_mode) != 0);
1975
+ done:
1976
+ if (path.size)
1977
+ (void)p_unlink(path.ptr);
1978
+ git_buf_dispose(&path);
1979
+ return supported;
1980
+ }
1981
+
1982
+ int git_path_validate_system_file_ownership(const char *path)
1983
+ {
1984
+ #ifndef GIT_WIN32
1985
+ GIT_UNUSED(path);
1986
+ return GIT_OK;
1987
+ #else
1988
+ git_win32_path buf;
1989
+ PSID owner_sid;
1990
+ PSECURITY_DESCRIPTOR descriptor = NULL;
1991
+ HANDLE token;
1992
+ TOKEN_USER *info = NULL;
1993
+ DWORD err, len;
1994
+ int ret;
1995
+
1996
+ if (git_win32_path_from_utf8(buf, path) < 0)
1909
1997
  return -1;
1998
+
1999
+ err = GetNamedSecurityInfoW(buf, SE_FILE_OBJECT,
2000
+ OWNER_SECURITY_INFORMATION |
2001
+ DACL_SECURITY_INFORMATION,
2002
+ &owner_sid, NULL, NULL, NULL, &descriptor);
2003
+
2004
+ if (err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND) {
2005
+ ret = GIT_ENOTFOUND;
2006
+ goto cleanup;
2007
+ }
2008
+
2009
+ if (err != ERROR_SUCCESS) {
2010
+ git_error_set(GIT_ERROR_OS, "failed to get security information");
2011
+ ret = GIT_ERROR;
2012
+ goto cleanup;
2013
+ }
2014
+
2015
+ if (!IsValidSid(owner_sid)) {
2016
+ git_error_set(GIT_ERROR_INVALID, "programdata configuration file owner is unknown");
2017
+ ret = GIT_ERROR;
2018
+ goto cleanup;
2019
+ }
2020
+
2021
+ if (IsWellKnownSid(owner_sid, WinBuiltinAdministratorsSid) ||
2022
+ IsWellKnownSid(owner_sid, WinLocalSystemSid)) {
2023
+ ret = GIT_OK;
2024
+ goto cleanup;
2025
+ }
2026
+
2027
+ /* Obtain current user's SID */
2028
+ if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token) &&
2029
+ !GetTokenInformation(token, TokenUser, NULL, 0, &len)) {
2030
+ info = git__malloc(len);
2031
+ GIT_ERROR_CHECK_ALLOC(info);
2032
+ if (!GetTokenInformation(token, TokenUser, info, len, &len)) {
2033
+ git__free(info);
2034
+ info = NULL;
2035
+ }
1910
2036
  }
2037
+
2038
+ /*
2039
+ * If the file is owned by the same account that is running the current
2040
+ * process, it's okay to read from that file.
2041
+ */
2042
+ if (info && EqualSid(owner_sid, info->User.Sid))
2043
+ ret = GIT_OK;
2044
+ else {
2045
+ git_error_set(GIT_ERROR_INVALID, "programdata configuration file owner is not valid");
2046
+ ret = GIT_ERROR;
2047
+ }
2048
+ free(info);
2049
+
2050
+ cleanup:
2051
+ if (descriptor)
2052
+ LocalFree(descriptor);
2053
+
2054
+ return ret;
2055
+ #endif
1911
2056
  }
@@ -647,4 +647,18 @@ extern bool git_path_isvalid(
647
647
  */
648
648
  int git_path_normalize_slashes(git_buf *out, const char *path);
649
649
 
650
+ bool git_path_supports_symlinks(const char *dir);
651
+
652
+ /**
653
+ * Validate a system file's ownership
654
+ *
655
+ * Verify that the file in question is owned by an administrator or system
656
+ * account, or at least by the current user.
657
+ *
658
+ * This function returns 0 if successful. If the file is not owned by any of
659
+ * these, or any other if there have been problems determining the file
660
+ * ownership, it returns -1.
661
+ */
662
+ int git_path_validate_system_file_ownership(const char *path);
663
+
650
664
  #endif