rugged 1.7.2 → 1.9.6

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 (477) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/extconf.rb +4 -4
  3. data/ext/rugged/rugged.c +12 -1
  4. data/ext/rugged/rugged_blame.c +22 -6
  5. data/ext/rugged/rugged_blob.c +24 -9
  6. data/ext/rugged/rugged_branch.c +10 -7
  7. data/ext/rugged/rugged_branch_collection.c +8 -6
  8. data/ext/rugged/rugged_commit.c +7 -6
  9. data/ext/rugged/rugged_config.c +20 -11
  10. data/ext/rugged/rugged_diff.c +26 -12
  11. data/ext/rugged/rugged_diff_hunk.c +2 -1
  12. data/ext/rugged/rugged_index.c +39 -29
  13. data/ext/rugged/rugged_note.c +7 -6
  14. data/ext/rugged/rugged_object.c +3 -2
  15. data/ext/rugged/rugged_patch.c +23 -9
  16. data/ext/rugged/rugged_rebase.c +22 -10
  17. data/ext/rugged/rugged_reference.c +22 -13
  18. data/ext/rugged/rugged_reference_collection.c +9 -7
  19. data/ext/rugged/rugged_remote.c +23 -12
  20. data/ext/rugged/rugged_remote_collection.c +11 -9
  21. data/ext/rugged/rugged_repo.c +60 -45
  22. data/ext/rugged/rugged_revwalk.c +22 -12
  23. data/ext/rugged/rugged_submodule.c +23 -20
  24. data/ext/rugged/rugged_submodule_collection.c +20 -9
  25. data/ext/rugged/rugged_tag.c +6 -4
  26. data/ext/rugged/rugged_tag_collection.c +7 -5
  27. data/ext/rugged/rugged_tree.c +27 -15
  28. data/lib/rugged/version.rb +1 -1
  29. data/vendor/libgit2/AUTHORS +3 -0
  30. data/vendor/libgit2/CMakeLists.txt +23 -10
  31. data/vendor/libgit2/COPYING +278 -12
  32. data/vendor/libgit2/cmake/DefaultCFlags.cmake +8 -3
  33. data/vendor/libgit2/cmake/{FindIconv.cmake → FindIntlIconv.cmake} +6 -0
  34. data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
  35. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +1 -1
  36. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +23 -8
  37. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +17 -8
  38. data/vendor/libgit2/cmake/SelectHashes.cmake +28 -11
  39. data/vendor/libgit2/cmake/SelectRegex.cmake +14 -4
  40. data/vendor/libgit2/cmake/SelectSSH.cmake +30 -19
  41. data/vendor/libgit2/cmake/SelectZlib.cmake +4 -0
  42. data/vendor/libgit2/deps/llhttp/CMakeLists.txt +8 -0
  43. data/vendor/libgit2/deps/llhttp/LICENSE-MIT +22 -0
  44. data/vendor/libgit2/deps/llhttp/api.c +510 -0
  45. data/vendor/libgit2/deps/llhttp/http.c +170 -0
  46. data/vendor/libgit2/deps/llhttp/llhttp.c +10168 -0
  47. data/vendor/libgit2/deps/llhttp/llhttp.h +897 -0
  48. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +1 -1
  49. data/vendor/libgit2/deps/ntlmclient/crypt_builtin_md4.c +311 -0
  50. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +2 -1
  51. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +0 -20
  52. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +4 -4
  53. data/vendor/libgit2/deps/ntlmclient/ntlm.c +21 -21
  54. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +5 -4
  55. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +2 -1
  56. data/vendor/libgit2/deps/ntlmclient/utf8.h +1176 -721
  57. data/vendor/libgit2/deps/ntlmclient/util.h +11 -0
  58. data/vendor/libgit2/deps/pcre2/CMakeLists.txt +110 -0
  59. data/vendor/libgit2/deps/pcre2/LICENCE.md +104 -0
  60. data/vendor/libgit2/deps/pcre2/config.h.in +54 -0
  61. data/vendor/libgit2/deps/pcre2/pcre2.h +1079 -0
  62. data/vendor/libgit2/deps/pcre2/pcre2_auto_possess.c +1416 -0
  63. data/vendor/libgit2/deps/{pcre/pcre_chartables.c → pcre2/pcre2_chartables.c} +41 -47
  64. data/vendor/libgit2/deps/{pcre/pcre_ord2utf8.c → pcre2/pcre2_chkdint.c} +36 -36
  65. data/vendor/libgit2/deps/pcre2/pcre2_compile.c +11345 -0
  66. data/vendor/libgit2/deps/pcre2/pcre2_compile.h +356 -0
  67. data/vendor/libgit2/deps/pcre2/pcre2_compile_cgroup.c +632 -0
  68. data/vendor/libgit2/deps/pcre2/pcre2_compile_class.c +2777 -0
  69. data/vendor/libgit2/deps/pcre2/pcre2_config.c +250 -0
  70. data/vendor/libgit2/deps/pcre2/pcre2_context.c +557 -0
  71. data/vendor/libgit2/deps/pcre2/pcre2_convert.c +1263 -0
  72. data/vendor/libgit2/deps/{pcre/pcre_dfa_exec.c → pcre2/pcre2_dfa_match.c} +1402 -943
  73. data/vendor/libgit2/deps/pcre2/pcre2_error.c +384 -0
  74. data/vendor/libgit2/deps/pcre2/pcre2_extuni.c +159 -0
  75. data/vendor/libgit2/deps/pcre2/pcre2_find_bracket.c +217 -0
  76. data/vendor/libgit2/deps/pcre2/pcre2_fuzzsupport.c +844 -0
  77. data/vendor/libgit2/deps/pcre2/pcre2_internal.h +2353 -0
  78. data/vendor/libgit2/deps/pcre2/pcre2_intmodedep.h +1044 -0
  79. data/vendor/libgit2/deps/pcre2/pcre2_maketables.c +177 -0
  80. data/vendor/libgit2/deps/pcre2/pcre2_match.c +8244 -0
  81. data/vendor/libgit2/deps/pcre2/pcre2_match_data.c +184 -0
  82. data/vendor/libgit2/deps/pcre2/pcre2_match_next.c +171 -0
  83. data/vendor/libgit2/deps/{pcre/pcre_newline.c → pcre2/pcre2_newline.c} +92 -63
  84. data/vendor/libgit2/deps/{pcre/pcre_refcount.c → pcre2/pcre2_ord2utf.c} +64 -38
  85. data/vendor/libgit2/deps/pcre2/pcre2_pattern_info.c +430 -0
  86. data/vendor/libgit2/deps/pcre2/pcre2_printint_inc.h +1098 -0
  87. data/vendor/libgit2/deps/pcre2/pcre2_script_run.c +344 -0
  88. data/vendor/libgit2/deps/pcre2/pcre2_serialize.c +284 -0
  89. data/vendor/libgit2/deps/pcre2/pcre2_string_utils.c +199 -0
  90. data/vendor/libgit2/deps/pcre2/pcre2_study.c +2087 -0
  91. data/vendor/libgit2/deps/pcre2/pcre2_substitute.c +1761 -0
  92. data/vendor/libgit2/deps/pcre2/pcre2_substring.c +553 -0
  93. data/vendor/libgit2/deps/pcre2/pcre2_tables.c +310 -0
  94. data/vendor/libgit2/deps/pcre2/pcre2_ucd.c +5805 -0
  95. data/vendor/libgit2/deps/pcre2/pcre2_ucp.h +408 -0
  96. data/vendor/libgit2/deps/pcre2/pcre2_ucptables_inc.h +1596 -0
  97. data/vendor/libgit2/deps/pcre2/pcre2_util.h +179 -0
  98. data/vendor/libgit2/deps/pcre2/pcre2_valid_utf.c +397 -0
  99. data/vendor/libgit2/deps/pcre2/pcre2_xclass.c +547 -0
  100. data/vendor/libgit2/deps/xdiff/CMakeLists.txt +1 -1
  101. data/vendor/libgit2/deps/xdiff/xmerge.c +16 -12
  102. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  103. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  104. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  105. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  106. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  107. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  108. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  109. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  110. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  111. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  112. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  113. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  114. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  115. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  116. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  117. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  118. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  119. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  120. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  121. data/vendor/libgit2/include/git2/apply.h +27 -6
  122. data/vendor/libgit2/include/git2/attr.h +17 -4
  123. data/vendor/libgit2/include/git2/blame.h +133 -28
  124. data/vendor/libgit2/include/git2/blob.h +71 -28
  125. data/vendor/libgit2/include/git2/branch.h +22 -15
  126. data/vendor/libgit2/include/git2/buffer.h +6 -4
  127. data/vendor/libgit2/include/git2/cert.h +2 -1
  128. data/vendor/libgit2/include/git2/checkout.h +83 -32
  129. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  130. data/vendor/libgit2/include/git2/clone.h +25 -9
  131. data/vendor/libgit2/include/git2/commit.h +132 -3
  132. data/vendor/libgit2/include/git2/common.h +132 -63
  133. data/vendor/libgit2/include/git2/config.h +93 -23
  134. data/vendor/libgit2/include/git2/credential.h +30 -2
  135. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  136. data/vendor/libgit2/include/git2/deprecated.h +134 -4
  137. data/vendor/libgit2/include/git2/describe.h +13 -1
  138. data/vendor/libgit2/include/git2/diff.h +38 -8
  139. data/vendor/libgit2/include/git2/email.h +9 -29
  140. data/vendor/libgit2/include/git2/errors.h +46 -73
  141. data/vendor/libgit2/include/git2/filter.h +14 -7
  142. data/vendor/libgit2/include/git2/global.h +8 -1
  143. data/vendor/libgit2/include/git2/graph.h +3 -2
  144. data/vendor/libgit2/include/git2/ignore.h +10 -0
  145. data/vendor/libgit2/include/git2/index.h +100 -15
  146. data/vendor/libgit2/include/git2/indexer.h +21 -4
  147. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  148. data/vendor/libgit2/include/git2/merge.h +50 -3
  149. data/vendor/libgit2/include/git2/message.h +2 -2
  150. data/vendor/libgit2/include/git2/net.h +3 -1
  151. data/vendor/libgit2/include/git2/notes.h +9 -6
  152. data/vendor/libgit2/include/git2/object.h +9 -8
  153. data/vendor/libgit2/include/git2/odb.h +91 -49
  154. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  155. data/vendor/libgit2/include/git2/oid.h +23 -25
  156. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  157. data/vendor/libgit2/include/git2/pack.h +13 -1
  158. data/vendor/libgit2/include/git2/patch.h +2 -3
  159. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  160. data/vendor/libgit2/include/git2/proxy.h +12 -3
  161. data/vendor/libgit2/include/git2/rebase.h +9 -6
  162. data/vendor/libgit2/include/git2/refdb.h +2 -2
  163. data/vendor/libgit2/include/git2/reflog.h +3 -2
  164. data/vendor/libgit2/include/git2/refs.h +9 -6
  165. data/vendor/libgit2/include/git2/refspec.h +14 -4
  166. data/vendor/libgit2/include/git2/remote.h +113 -25
  167. data/vendor/libgit2/include/git2/repository.h +57 -21
  168. data/vendor/libgit2/include/git2/reset.h +16 -3
  169. data/vendor/libgit2/include/git2/revert.h +9 -4
  170. data/vendor/libgit2/include/git2/revparse.h +3 -3
  171. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  172. data/vendor/libgit2/include/git2/signature.h +46 -1
  173. data/vendor/libgit2/include/git2/stash.h +17 -3
  174. data/vendor/libgit2/include/git2/status.h +10 -6
  175. data/vendor/libgit2/include/git2/stdint.h +87 -85
  176. data/vendor/libgit2/include/git2/strarray.h +2 -3
  177. data/vendor/libgit2/include/git2/submodule.h +20 -9
  178. data/vendor/libgit2/include/git2/sys/alloc.h +12 -0
  179. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  180. data/vendor/libgit2/include/git2/sys/commit_graph.h +103 -62
  181. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  182. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  183. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  184. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  185. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  186. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  187. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  188. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  189. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  190. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  191. data/vendor/libgit2/include/git2/sys/midx.h +43 -4
  192. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  193. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  194. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  195. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  196. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  197. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  198. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  199. data/vendor/libgit2/include/git2/sys/stream.h +11 -2
  200. data/vendor/libgit2/include/git2/sys/transport.h +25 -4
  201. data/vendor/libgit2/include/git2/tag.h +3 -1
  202. data/vendor/libgit2/include/git2/trace.h +9 -3
  203. data/vendor/libgit2/include/git2/transaction.h +3 -2
  204. data/vendor/libgit2/include/git2/transport.h +11 -3
  205. data/vendor/libgit2/include/git2/tree.h +16 -5
  206. data/vendor/libgit2/include/git2/types.h +19 -3
  207. data/vendor/libgit2/include/git2/version.h +46 -8
  208. data/vendor/libgit2/include/git2/worktree.h +16 -6
  209. data/vendor/libgit2/src/CMakeLists.txt +6 -4
  210. data/vendor/libgit2/src/cli/CMakeLists.txt +3 -4
  211. data/vendor/libgit2/src/cli/cmd.c +1 -1
  212. data/vendor/libgit2/src/cli/cmd.h +4 -0
  213. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  214. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  215. data/vendor/libgit2/src/cli/cmd_clone.c +5 -7
  216. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  217. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  218. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  219. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  220. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  221. data/vendor/libgit2/src/cli/common.c +168 -0
  222. data/vendor/libgit2/src/cli/common.h +63 -0
  223. data/vendor/libgit2/src/cli/error.h +1 -1
  224. data/vendor/libgit2/src/cli/main.c +52 -24
  225. data/vendor/libgit2/src/cli/opt.c +31 -5
  226. data/vendor/libgit2/src/cli/opt.h +21 -3
  227. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  228. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  229. data/vendor/libgit2/src/cli/progress.c +51 -2
  230. data/vendor/libgit2/src/cli/progress.h +12 -0
  231. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  232. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  233. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  234. data/vendor/libgit2/src/libgit2/CMakeLists.txt +55 -21
  235. data/vendor/libgit2/src/libgit2/apply.c +10 -13
  236. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  237. data/vendor/libgit2/src/libgit2/attr_file.c +17 -5
  238. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  239. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  240. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  241. data/vendor/libgit2/src/libgit2/blame.c +135 -43
  242. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  243. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  244. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  245. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  246. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  247. data/vendor/libgit2/src/libgit2/cherrypick.c +1 -2
  248. data/vendor/libgit2/src/libgit2/clone.c +192 -166
  249. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  250. data/vendor/libgit2/src/libgit2/commit.c +93 -1
  251. data/vendor/libgit2/src/libgit2/commit_graph.c +68 -58
  252. data/vendor/libgit2/src/libgit2/commit_graph.h +1 -2
  253. data/vendor/libgit2/src/libgit2/config.c +390 -299
  254. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  255. data/vendor/libgit2/src/libgit2/config.h +9 -4
  256. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  257. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  258. data/vendor/libgit2/src/libgit2/config_file.c +101 -89
  259. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  260. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  261. data/vendor/libgit2/src/libgit2/config_mem.c +195 -40
  262. data/vendor/libgit2/src/libgit2/config_parse.c +12 -10
  263. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  264. data/vendor/libgit2/src/libgit2/delta.c +13 -1
  265. data/vendor/libgit2/src/libgit2/describe.c +24 -24
  266. data/vendor/libgit2/src/libgit2/diff.c +1 -1
  267. data/vendor/libgit2/src/libgit2/diff_driver.c +13 -20
  268. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  269. data/vendor/libgit2/src/libgit2/diff_generate.c +3 -3
  270. data/vendor/libgit2/src/libgit2/diff_parse.c +2 -2
  271. data/vendor/libgit2/src/libgit2/diff_print.c +65 -9
  272. data/vendor/libgit2/src/libgit2/diff_stats.c +19 -12
  273. data/vendor/libgit2/src/libgit2/diff_tform.c +36 -8
  274. data/vendor/libgit2/src/libgit2/email.c +1 -0
  275. data/vendor/libgit2/src/libgit2/fetch.c +5 -3
  276. data/vendor/libgit2/src/libgit2/fetchhead.c +1 -1
  277. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  278. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  279. data/vendor/libgit2/src/libgit2/grafts.c +18 -20
  280. data/vendor/libgit2/src/libgit2/grafts.h +0 -1
  281. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  282. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  283. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  284. data/vendor/libgit2/src/libgit2/index.c +76 -98
  285. data/vendor/libgit2/src/libgit2/index.h +5 -2
  286. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  287. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  288. data/vendor/libgit2/src/libgit2/indexer.c +38 -41
  289. data/vendor/libgit2/src/libgit2/iterator.c +14 -8
  290. data/vendor/libgit2/src/libgit2/libgit2.c +153 -368
  291. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  292. data/vendor/libgit2/src/libgit2/merge.c +43 -38
  293. data/vendor/libgit2/src/libgit2/merge.h +4 -0
  294. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  295. data/vendor/libgit2/src/libgit2/merge_file.c +43 -30
  296. data/vendor/libgit2/src/libgit2/message.c +1 -1
  297. data/vendor/libgit2/src/libgit2/midx.c +30 -18
  298. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  299. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  300. data/vendor/libgit2/src/libgit2/object.c +6 -5
  301. data/vendor/libgit2/src/libgit2/odb.c +7 -10
  302. data/vendor/libgit2/src/libgit2/odb_loose.c +24 -14
  303. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  304. data/vendor/libgit2/src/libgit2/odb_pack.c +13 -5
  305. data/vendor/libgit2/src/libgit2/oid.c +36 -10
  306. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  307. data/vendor/libgit2/src/libgit2/pack-objects.c +59 -34
  308. data/vendor/libgit2/src/libgit2/pack-objects.h +12 -4
  309. data/vendor/libgit2/src/libgit2/pack.c +33 -24
  310. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  311. data/vendor/libgit2/src/libgit2/patch_parse.c +2 -2
  312. data/vendor/libgit2/src/libgit2/path.c +1 -1
  313. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  314. data/vendor/libgit2/src/libgit2/push.c +79 -28
  315. data/vendor/libgit2/src/libgit2/push.h +1 -0
  316. data/vendor/libgit2/src/libgit2/refdb_fs.c +128 -61
  317. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  318. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  319. data/vendor/libgit2/src/libgit2/refs.c +41 -13
  320. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  321. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  322. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  323. data/vendor/libgit2/src/libgit2/remote.c +125 -62
  324. data/vendor/libgit2/src/libgit2/remote.h +0 -1
  325. data/vendor/libgit2/src/libgit2/repository.c +235 -54
  326. data/vendor/libgit2/src/libgit2/repository.h +10 -6
  327. data/vendor/libgit2/src/libgit2/revert.c +1 -2
  328. data/vendor/libgit2/src/libgit2/revparse.c +2 -2
  329. data/vendor/libgit2/src/libgit2/revwalk.c +13 -10
  330. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  331. data/vendor/libgit2/src/libgit2/settings.c +477 -0
  332. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  333. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  334. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  335. data/vendor/libgit2/src/libgit2/status.c +1 -1
  336. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -60
  337. data/vendor/libgit2/src/libgit2/streams/openssl.c +36 -8
  338. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  339. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  340. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  341. data/vendor/libgit2/src/libgit2/streams/socket.c +30 -0
  342. data/vendor/libgit2/src/libgit2/streams/stransport.c +39 -7
  343. data/vendor/libgit2/src/libgit2/submodule.c +195 -80
  344. data/vendor/libgit2/src/libgit2/submodule.h +6 -7
  345. data/vendor/libgit2/src/libgit2/tag.c +4 -2
  346. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  347. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  348. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  349. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  350. data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +2 -0
  351. data/vendor/libgit2/src/libgit2/transports/credential.c +2 -2
  352. data/vendor/libgit2/src/libgit2/transports/git.c +1 -1
  353. data/vendor/libgit2/src/libgit2/transports/http.c +5 -6
  354. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  355. data/vendor/libgit2/src/libgit2/transports/httpclient.c +124 -81
  356. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  357. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  358. data/vendor/libgit2/src/libgit2/transports/local.c +16 -8
  359. data/vendor/libgit2/src/libgit2/transports/smart.c +25 -13
  360. data/vendor/libgit2/src/libgit2/transports/smart.h +4 -2
  361. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +7 -6
  362. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +55 -10
  363. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  364. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +386 -0
  365. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  366. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1132 -0
  367. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  368. data/vendor/libgit2/src/libgit2/transports/winhttp.c +35 -7
  369. data/vendor/libgit2/src/libgit2/tree.c +34 -26
  370. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  371. data/vendor/libgit2/src/libgit2/worktree.c +14 -17
  372. data/vendor/libgit2/src/util/CMakeLists.txt +7 -10
  373. data/vendor/libgit2/src/util/alloc.c +4 -1
  374. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  375. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  376. data/vendor/libgit2/src/util/allocators/stdalloc.c +0 -10
  377. data/vendor/libgit2/src/util/array.h +18 -17
  378. data/vendor/libgit2/src/util/cc-compat.h +2 -0
  379. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  380. data/vendor/libgit2/src/util/date.c +22 -14
  381. data/vendor/libgit2/src/util/date.h +12 -0
  382. data/vendor/libgit2/src/util/errors.c +401 -0
  383. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  384. data/vendor/libgit2/src/util/fs_path.c +81 -10
  385. data/vendor/libgit2/src/util/fs_path.h +39 -10
  386. data/vendor/libgit2/src/util/futils.c +6 -5
  387. data/vendor/libgit2/src/util/futils.h +24 -7
  388. data/vendor/libgit2/src/util/git2_features.h.in +12 -1
  389. data/vendor/libgit2/src/util/git2_util.h +6 -0
  390. data/vendor/libgit2/src/util/hash/builtin.c +14 -4
  391. data/vendor/libgit2/src/util/hash/openssl.c +148 -0
  392. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  393. data/vendor/libgit2/src/util/hash/rfc6234/sha224-256.c +8 -6
  394. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  395. data/vendor/libgit2/src/util/hashmap.h +425 -0
  396. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  397. data/vendor/libgit2/src/util/integer.h +3 -1
  398. data/vendor/libgit2/src/util/net.c +17 -11
  399. data/vendor/libgit2/src/util/net.h +2 -0
  400. data/vendor/libgit2/src/util/pool.c +1 -1
  401. data/vendor/libgit2/src/util/pool.h +5 -0
  402. data/vendor/libgit2/src/util/pqueue.h +1 -1
  403. data/vendor/libgit2/src/util/process.h +223 -0
  404. data/vendor/libgit2/src/util/rand.c +1 -7
  405. data/vendor/libgit2/src/util/regexp.c +28 -13
  406. data/vendor/libgit2/src/util/regexp.h +7 -2
  407. data/vendor/libgit2/src/util/runtime.c +2 -2
  408. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  409. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  410. data/vendor/libgit2/src/util/str.c +20 -8
  411. data/vendor/libgit2/src/util/str.h +5 -3
  412. data/vendor/libgit2/src/util/strlist.c +108 -0
  413. data/vendor/libgit2/src/util/strlist.h +36 -0
  414. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  415. data/vendor/libgit2/src/util/unix/process.c +706 -0
  416. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  417. data/vendor/libgit2/src/util/util.c +18 -5
  418. data/vendor/libgit2/src/util/util.h +5 -38
  419. data/vendor/libgit2/src/util/vector.c +3 -3
  420. data/vendor/libgit2/src/util/vector.h +2 -2
  421. data/vendor/libgit2/src/util/win32/path_w32.c +81 -5
  422. data/vendor/libgit2/src/util/win32/posix_w32.c +29 -6
  423. data/vendor/libgit2/src/util/win32/process.c +522 -0
  424. metadata +102 -67
  425. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  426. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  427. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  428. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  429. data/vendor/libgit2/deps/pcre/CMakeLists.txt +0 -140
  430. data/vendor/libgit2/deps/pcre/COPYING +0 -5
  431. data/vendor/libgit2/deps/pcre/LICENCE +0 -93
  432. data/vendor/libgit2/deps/pcre/cmake/COPYING-CMAKE-SCRIPTS +0 -22
  433. data/vendor/libgit2/deps/pcre/cmake/FindEditline.cmake +0 -17
  434. data/vendor/libgit2/deps/pcre/cmake/FindPackageHandleStandardArgs.cmake +0 -58
  435. data/vendor/libgit2/deps/pcre/cmake/FindReadline.cmake +0 -29
  436. data/vendor/libgit2/deps/pcre/config.h.in +0 -57
  437. data/vendor/libgit2/deps/pcre/pcre.h +0 -641
  438. data/vendor/libgit2/deps/pcre/pcre_byte_order.c +0 -319
  439. data/vendor/libgit2/deps/pcre/pcre_compile.c +0 -9815
  440. data/vendor/libgit2/deps/pcre/pcre_config.c +0 -190
  441. data/vendor/libgit2/deps/pcre/pcre_exec.c +0 -7173
  442. data/vendor/libgit2/deps/pcre/pcre_fullinfo.c +0 -245
  443. data/vendor/libgit2/deps/pcre/pcre_get.c +0 -669
  444. data/vendor/libgit2/deps/pcre/pcre_globals.c +0 -86
  445. data/vendor/libgit2/deps/pcre/pcre_internal.h +0 -2787
  446. data/vendor/libgit2/deps/pcre/pcre_jit_compile.c +0 -11913
  447. data/vendor/libgit2/deps/pcre/pcre_maketables.c +0 -156
  448. data/vendor/libgit2/deps/pcre/pcre_printint.c +0 -834
  449. data/vendor/libgit2/deps/pcre/pcre_string_utils.c +0 -211
  450. data/vendor/libgit2/deps/pcre/pcre_study.c +0 -1686
  451. data/vendor/libgit2/deps/pcre/pcre_tables.c +0 -727
  452. data/vendor/libgit2/deps/pcre/pcre_ucd.c +0 -3644
  453. data/vendor/libgit2/deps/pcre/pcre_valid_utf8.c +0 -301
  454. data/vendor/libgit2/deps/pcre/pcre_version.c +0 -98
  455. data/vendor/libgit2/deps/pcre/pcre_xclass.c +0 -268
  456. data/vendor/libgit2/deps/pcre/pcreposix.c +0 -420
  457. data/vendor/libgit2/deps/pcre/pcreposix.h +0 -117
  458. data/vendor/libgit2/deps/pcre/ucp.h +0 -224
  459. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  460. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  461. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  462. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  463. data/vendor/libgit2/src/libgit2/errors.c +0 -293
  464. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  465. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  466. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  467. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  468. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  469. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  470. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  471. data/vendor/libgit2/src/libgit2/threadstate.c +0 -97
  472. data/vendor/libgit2/src/libgit2/threadstate.h +0 -22
  473. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  474. data/vendor/libgit2/src/util/khash.h +0 -615
  475. data/vendor/libgit2/src/util/strmap.c +0 -100
  476. data/vendor/libgit2/src/util/strmap.h +0 -131
  477. /data/vendor/libgit2/cmake/{FindHTTPParser.cmake → FindHTTP_Parser.cmake} +0 -0
@@ -77,6 +77,7 @@ static void submodule_get_index_status(unsigned int *, git_submodule *);
77
77
  static void submodule_get_wd_status(unsigned int *, git_submodule *, git_repository *, git_submodule_ignore_t);
78
78
  static void submodule_update_from_index_entry(git_submodule *sm, const git_index_entry *ie);
79
79
  static void submodule_update_from_head_data(git_submodule *sm, mode_t mode, const git_oid *id);
80
+ static int path_is_valid(git_repository *repo, const char *path);
80
81
 
81
82
  static int submodule_cmp(const void *a, const void *b)
82
83
  {
@@ -169,22 +170,27 @@ out:
169
170
  return error;
170
171
  }
171
172
 
173
+ GIT_HASHMAP_STR_SETUP(git_submodule_namemap, char *);
174
+
172
175
  /**
173
176
  * Release the name map returned by 'load_submodule_names'.
174
177
  */
175
- static void free_submodule_names(git_strmap *names)
178
+ static void free_submodule_names(git_submodule_namemap *names)
176
179
  {
180
+ git_hashmap_iter_t iter = GIT_HASHMAP_ITER_INIT;
177
181
  const char *key;
178
182
  char *value;
179
183
 
180
184
  if (names == NULL)
181
185
  return;
182
186
 
183
- git_strmap_foreach(names, key, value, {
184
- git__free((char *) key);
187
+ while (git_submodule_namemap_iterate(&iter, &key, &value, names) == 0) {
188
+ git__free((char *)key);
185
189
  git__free(value);
186
- });
187
- git_strmap_free(names);
190
+ }
191
+
192
+ git_submodule_namemap_dispose(names);
193
+ git__free(names);
188
194
 
189
195
  return;
190
196
  }
@@ -194,29 +200,33 @@ static void free_submodule_names(git_strmap *names)
194
200
  * TODO: for some use-cases, this might need case-folding on a
195
201
  * case-insensitive filesystem
196
202
  */
197
- static int load_submodule_names(git_strmap **out, git_repository *repo, git_config *cfg)
203
+ static int load_submodule_names(git_submodule_namemap **out, git_repository *repo, git_config *cfg)
198
204
  {
199
- const char *key = "submodule\\..*\\.path";
205
+ const char *key = "^submodule\\..*\\.path$";
206
+ char *value;
200
207
  git_config_iterator *iter = NULL;
201
208
  git_config_entry *entry;
202
209
  git_str buf = GIT_STR_INIT;
203
- git_strmap *names;
210
+ git_submodule_namemap *names;
204
211
  int isvalid, error;
205
212
 
206
213
  *out = NULL;
207
214
 
208
- if ((error = git_strmap_new(&names)) < 0)
215
+ if ((names = git__calloc(1, sizeof(git_submodule_namemap))) == NULL) {
216
+ error = -1;
209
217
  goto out;
218
+ }
210
219
 
211
220
  if ((error = git_config_iterator_glob_new(&iter, cfg, key)) < 0)
212
221
  goto out;
213
222
 
214
223
  while ((error = git_config_next(&entry, iter)) == 0) {
215
224
  const char *fdot, *ldot;
225
+
216
226
  fdot = strchr(entry->name, '.');
217
227
  ldot = strrchr(entry->name, '.');
218
228
 
219
- if (git_strmap_exists(names, entry->value)) {
229
+ if (git_submodule_namemap_contains(names, entry->value)) {
220
230
  git_error_set(GIT_ERROR_SUBMODULE,
221
231
  "duplicated submodule path '%s'", entry->value);
222
232
  error = -1;
@@ -225,6 +235,7 @@ static int load_submodule_names(git_strmap **out, git_repository *repo, git_conf
225
235
 
226
236
  git_str_clear(&buf);
227
237
  git_str_put(&buf, fdot + 1, ldot - fdot - 1);
238
+
228
239
  isvalid = git_submodule_name_is_valid(repo, buf.ptr, 0);
229
240
  if (isvalid < 0) {
230
241
  error = isvalid;
@@ -233,7 +244,20 @@ static int load_submodule_names(git_strmap **out, git_repository *repo, git_conf
233
244
  if (!isvalid)
234
245
  continue;
235
246
 
236
- if ((error = git_strmap_set(names, git__strdup(entry->value), git_str_detach(&buf))) < 0) {
247
+ isvalid = path_is_valid(repo, entry->value);
248
+ if (isvalid < 0) {
249
+ error = isvalid;
250
+ goto out;
251
+ }
252
+ if (!isvalid)
253
+ continue;
254
+
255
+ if ((value = git__strdup(entry->value)) == NULL) {
256
+ error = -1;
257
+ goto out;
258
+ }
259
+
260
+ if ((error = git_submodule_namemap_put(names, value, git_str_detach(&buf))) < 0) {
237
261
  git_error_set(GIT_ERROR_NOMEMORY, "error inserting submodule into hash table");
238
262
  error = -1;
239
263
  goto out;
@@ -252,31 +276,43 @@ out:
252
276
  return error;
253
277
  }
254
278
 
255
- int git_submodule_cache_init(git_strmap **out, git_repository *repo)
279
+ GIT_HASHMAP_STR_FUNCTIONS(git_submodule_cache, GIT_HASHMAP_INLINE, git_submodule *);
280
+
281
+ int git_submodule__map(git_submodule_cache *cache, git_repository *repo);
282
+
283
+ int git_submodule_cache_init(git_submodule_cache **out, git_repository *repo)
256
284
  {
285
+ git_submodule_cache *cache = NULL;
257
286
  int error = 0;
258
- git_strmap *cache = NULL;
287
+
259
288
  GIT_ASSERT_ARG(out);
260
289
  GIT_ASSERT_ARG(repo);
261
- if ((error = git_strmap_new(&cache)) < 0)
262
- return error;
263
- if ((error = git_submodule__map(repo, cache)) < 0) {
290
+
291
+ if ((cache = git__calloc(1, sizeof(git_submodule_cache))) == NULL)
292
+ return -1;
293
+
294
+ if ((error = git_submodule__map(cache, repo)) < 0) {
264
295
  git_submodule_cache_free(cache);
265
296
  return error;
266
297
  }
298
+
267
299
  *out = cache;
268
300
  return error;
269
301
  }
270
302
 
271
- int git_submodule_cache_free(git_strmap *cache)
303
+ int git_submodule_cache_free(git_submodule_cache *cache)
272
304
  {
273
305
  git_submodule *sm = NULL;
306
+ git_hashmap_iter_t iter = GIT_HASHMAP_ITER_INIT;
307
+
274
308
  if (cache == NULL)
275
309
  return 0;
276
- git_strmap_foreach_value(cache, sm, {
310
+
311
+ while (git_submodule_cache_iterate(&iter, NULL, &sm, cache) == 0)
277
312
  git_submodule_free(sm);
278
- });
279
- git_strmap_free(cache);
313
+
314
+ git_submodule_cache_dispose(cache);
315
+ git__free(cache);
280
316
  return 0;
281
317
  }
282
318
 
@@ -292,11 +328,11 @@ int git_submodule__lookup_with_cache(
292
328
  git_submodule **out, /* NULL if user only wants to test existence */
293
329
  git_repository *repo,
294
330
  const char *name, /* trailing slash is allowed */
295
- git_strmap *cache)
331
+ git_submodule_cache *cache)
296
332
  {
297
- int error;
298
- unsigned int location;
299
333
  git_submodule *sm;
334
+ unsigned int location;
335
+ int error;
300
336
 
301
337
  GIT_ASSERT_ARG(repo);
302
338
  GIT_ASSERT_ARG(name);
@@ -307,7 +343,7 @@ int git_submodule__lookup_with_cache(
307
343
  }
308
344
 
309
345
  if (cache != NULL) {
310
- if ((sm = git_strmap_get(cache, name)) != NULL) {
346
+ if (git_submodule_cache_get(&sm, cache, name) == 0) {
311
347
  if (out) {
312
348
  *out = sm;
313
349
  GIT_REFCOUNT_INC(*out);
@@ -319,7 +355,17 @@ int git_submodule__lookup_with_cache(
319
355
  if ((error = submodule_alloc(&sm, repo, name)) < 0)
320
356
  return error;
321
357
 
322
- if ((error = git_submodule_reload(sm, false)) < 0) {
358
+ /*
359
+ * Only try to reload if they gave us a valid _name_; if this is a
360
+ * path, we'll do some lookups then try to reload to populate.
361
+ */
362
+ if (git_submodule_name_is_valid(sm->repo, name, 0) <= 0) {
363
+ error = GIT_ENOTFOUND;
364
+ } else {
365
+ error = git_submodule_reload(sm, false);
366
+ }
367
+
368
+ if (error < 0 && error != GIT_ENOTFOUND) {
323
369
  git_submodule_free(sm);
324
370
  return error;
325
371
  }
@@ -332,7 +378,7 @@ int git_submodule__lookup_with_cache(
332
378
  /* If it's not configured or we're looking by path */
333
379
  if (location == 0 || location == GIT_SUBMODULE_STATUS_IN_WD) {
334
380
  git_config_backend *mods;
335
- const char *pattern = "submodule\\..*\\.path";
381
+ const char *pattern = "^submodule\\..*\\.path$";
336
382
  git_str path = GIT_STR_INIT;
337
383
  fbp_data data = { NULL, NULL };
338
384
 
@@ -378,6 +424,7 @@ int git_submodule__lookup_with_cache(
378
424
  /* If we still haven't found it, do the WD check */
379
425
  if (location == 0 || location == GIT_SUBMODULE_STATUS_IN_WD) {
380
426
  git_submodule_free(sm);
427
+ git_error_set(GIT_ERROR_SUBMODULE, "invalid submodule name: '%s'", name);
381
428
  error = GIT_ENOTFOUND;
382
429
 
383
430
  /* If it's not configured, we still check if there's a repo at the path */
@@ -429,24 +476,49 @@ int git_submodule_name_is_valid(git_repository *repo, const char *name, int flag
429
476
  return isvalid;
430
477
  }
431
478
 
479
+ static int path_is_valid(git_repository *repo, const char *path)
480
+ {
481
+ git_str buf = GIT_STR_INIT;
482
+ int flags = GIT_FS_PATH_REJECT_FILESYSTEM_DEFAULTS &
483
+ ~GIT_FS_PATH_REJECT_EMPTY_COMPONENT;
484
+ int error, isvalid;
485
+
486
+ /* Avoid allocating a new string if we can avoid it */
487
+ if (strchr(path, '\\') != NULL) {
488
+ if ((error = git_fs_path_normalize_slashes(&buf, path)) < 0)
489
+ return error;
490
+ } else {
491
+ git_str_attach_notowned(&buf, path, strlen(path));
492
+ }
493
+
494
+ isvalid = git_path_is_valid(repo, buf.ptr, 0, flags);
495
+ git_str_dispose(&buf);
496
+
497
+ return isvalid;
498
+ }
499
+
432
500
  static void submodule_free_dup(void *sm)
433
501
  {
434
502
  git_submodule_free(sm);
435
503
  }
436
504
 
437
- static int submodule_get_or_create(git_submodule **out, git_repository *repo, git_strmap *map, const char *name)
505
+ static int submodule_get_or_create(
506
+ git_submodule **out,
507
+ git_repository *repo,
508
+ git_submodule_cache *cache,
509
+ const char *name)
438
510
  {
439
511
  git_submodule *sm = NULL;
440
512
  int error;
441
513
 
442
- if ((sm = git_strmap_get(map, name)) != NULL)
514
+ if (git_submodule_cache_get(&sm, cache, name) == 0)
443
515
  goto done;
444
516
 
445
517
  /* if the submodule doesn't exist yet in the map, create it */
446
518
  if ((error = submodule_alloc(&sm, repo, name)) < 0)
447
519
  return error;
448
520
 
449
- if ((error = git_strmap_set(map, sm->name, sm)) < 0) {
521
+ if ((error = git_submodule_cache_put(cache, sm->name, sm)) < 0) {
450
522
  git_submodule_free(sm);
451
523
  return error;
452
524
  }
@@ -457,12 +529,15 @@ done:
457
529
  return 0;
458
530
  }
459
531
 
460
- static int submodules_from_index(git_strmap *map, git_index *idx, git_config *cfg)
532
+ static int submodules_from_index(
533
+ git_submodule_cache *cache,
534
+ git_index *idx,
535
+ git_config *cfg)
461
536
  {
462
537
  int error;
463
538
  git_iterator *i = NULL;
464
539
  const git_index_entry *entry;
465
- git_strmap *names;
540
+ git_submodule_namemap *names;
466
541
 
467
542
  if ((error = load_submodule_names(&names, git_index_owner(idx), cfg)))
468
543
  goto done;
@@ -473,7 +548,7 @@ static int submodules_from_index(git_strmap *map, git_index *idx, git_config *cf
473
548
  while (!(error = git_iterator_advance(&entry, i))) {
474
549
  git_submodule *sm;
475
550
 
476
- if ((sm = git_strmap_get(map, entry->path)) != NULL) {
551
+ if (git_submodule_cache_get(&sm, cache, entry->path) == 0) {
477
552
  if (S_ISGITLINK(entry->mode))
478
553
  submodule_update_from_index_entry(sm, entry);
479
554
  else
@@ -481,10 +556,10 @@ static int submodules_from_index(git_strmap *map, git_index *idx, git_config *cf
481
556
  } else if (S_ISGITLINK(entry->mode)) {
482
557
  const char *name;
483
558
 
484
- if ((name = git_strmap_get(names, entry->path)) == NULL)
559
+ if (git_submodule_namemap_get((char **)&name, names, entry->path) != 0)
485
560
  name = entry->path;
486
561
 
487
- if (!submodule_get_or_create(&sm, git_index_owner(idx), map, name)) {
562
+ if (!submodule_get_or_create(&sm, git_index_owner(idx), cache, name)) {
488
563
  submodule_update_from_index_entry(sm, entry);
489
564
  git_submodule_free(sm);
490
565
  }
@@ -501,12 +576,15 @@ done:
501
576
  return error;
502
577
  }
503
578
 
504
- static int submodules_from_head(git_strmap *map, git_tree *head, git_config *cfg)
579
+ static int submodules_from_head(
580
+ git_submodule_cache *cache,
581
+ git_tree *head,
582
+ git_config *cfg)
505
583
  {
506
584
  int error;
507
585
  git_iterator *i = NULL;
508
586
  const git_index_entry *entry;
509
- git_strmap *names;
587
+ git_submodule_namemap *names;
510
588
 
511
589
  if ((error = load_submodule_names(&names, git_tree_owner(head), cfg)))
512
590
  goto done;
@@ -517,7 +595,7 @@ static int submodules_from_head(git_strmap *map, git_tree *head, git_config *cfg
517
595
  while (!(error = git_iterator_advance(&entry, i))) {
518
596
  git_submodule *sm;
519
597
 
520
- if ((sm = git_strmap_get(map, entry->path)) != NULL) {
598
+ if (git_submodule_cache_get(&sm, cache, entry->path) == 0) {
521
599
  if (S_ISGITLINK(entry->mode))
522
600
  submodule_update_from_head_data(sm, entry->mode, &entry->id);
523
601
  else
@@ -525,10 +603,10 @@ static int submodules_from_head(git_strmap *map, git_tree *head, git_config *cfg
525
603
  } else if (S_ISGITLINK(entry->mode)) {
526
604
  const char *name;
527
605
 
528
- if ((name = git_strmap_get(names, entry->path)) == NULL)
606
+ if (git_submodule_namemap_get((char **)&name, names, entry->path) != 0)
529
607
  name = entry->path;
530
608
 
531
- if (!submodule_get_or_create(&sm, git_tree_owner(head), map, name)) {
609
+ if (!submodule_get_or_create(&sm, git_tree_owner(head), cache, name)) {
532
610
  submodule_update_from_head_data(
533
611
  sm, entry->mode, &entry->id);
534
612
  git_submodule_free(sm);
@@ -549,11 +627,11 @@ done:
549
627
  /* If have_sm is true, sm is populated, otherwise map an repo are. */
550
628
  typedef struct {
551
629
  git_config *mods;
552
- git_strmap *map;
630
+ git_submodule_cache *cache;
553
631
  git_repository *repo;
554
632
  } lfc_data;
555
633
 
556
- int git_submodule__map(git_repository *repo, git_strmap *map)
634
+ int git_submodule__map(git_submodule_cache *cache, git_repository *repo)
557
635
  {
558
636
  int error = 0;
559
637
  git_index *idx = NULL;
@@ -563,8 +641,8 @@ int git_submodule__map(git_repository *repo, git_strmap *map)
563
641
  git_config *mods = NULL;
564
642
  bool has_workdir;
565
643
 
644
+ GIT_ASSERT_ARG(cache);
566
645
  GIT_ASSERT_ARG(repo);
567
- GIT_ASSERT_ARG(map);
568
646
 
569
647
  /* get sources that we will need to check */
570
648
  if (git_repository_index(&idx, repo) < 0)
@@ -581,7 +659,7 @@ int git_submodule__map(git_repository *repo, git_strmap *map)
581
659
  /* add submodule information from .gitmodules */
582
660
  if (has_workdir) {
583
661
  lfc_data data = { 0 };
584
- data.map = map;
662
+ data.cache = cache;
585
663
  data.repo = repo;
586
664
 
587
665
  if ((error = gitmodules_snapshot(&mods, repo)) < 0) {
@@ -597,19 +675,22 @@ int git_submodule__map(git_repository *repo, git_strmap *map)
597
675
  }
598
676
  /* add back submodule information from index */
599
677
  if (mods && idx) {
600
- if ((error = submodules_from_index(map, idx, mods)) < 0)
678
+ if ((error = submodules_from_index(cache, idx, mods)) < 0)
601
679
  goto cleanup;
602
680
  }
603
681
  /* add submodule information from HEAD */
604
682
  if (mods && head) {
605
- if ((error = submodules_from_head(map, head, mods)) < 0)
683
+ if ((error = submodules_from_head(cache, head, mods)) < 0)
606
684
  goto cleanup;
607
685
  }
608
686
  /* shallow scan submodules in work tree as needed */
609
687
  if (has_workdir) {
610
- git_strmap_foreach_value(map, sm, {
611
- submodule_load_from_wd_lite(sm);
612
- });
688
+ git_hashmap_iter_t iter = GIT_HASHMAP_ITER_INIT;
689
+
690
+ while (git_submodule_cache_iterate(&iter, NULL, &sm, cache) == 0) {
691
+ if ((error = submodule_load_from_wd_lite(sm)) < 0)
692
+ goto cleanup;
693
+ }
613
694
  }
614
695
 
615
696
  cleanup:
@@ -627,8 +708,9 @@ int git_submodule_foreach(
627
708
  void *payload)
628
709
  {
629
710
  git_vector snapshot = GIT_VECTOR_INIT;
630
- git_strmap *submodules;
711
+ git_submodule_cache *submodules;
631
712
  git_submodule *sm;
713
+ git_hashmap_iter_t iter;
632
714
  int error;
633
715
  size_t i;
634
716
 
@@ -637,20 +719,22 @@ int git_submodule_foreach(
637
719
  return -1;
638
720
  }
639
721
 
640
- if ((error = git_strmap_new(&submodules)) < 0)
641
- return error;
722
+ if ((submodules = git__calloc(1, sizeof(git_submodule_cache))) == NULL)
723
+ return -1;
642
724
 
643
- if ((error = git_submodule__map(repo, submodules)) < 0)
725
+ if ((error = git_submodule__map(submodules, repo)) < 0)
644
726
  goto done;
645
727
 
646
- if (!(error = git_vector_init(
647
- &snapshot, git_strmap_size(submodules), submodule_cmp))) {
648
-
649
- git_strmap_foreach_value(submodules, sm, {
728
+ if (!(error = git_vector_init(&snapshot,
729
+ git_submodule_cache_size(submodules),
730
+ submodule_cmp))) {
731
+ for (iter = GIT_HASHMAP_ITER_INIT;
732
+ git_submodule_cache_iterate(&iter, NULL, &sm, submodules) == 0; ) {
650
733
  if ((error = git_vector_insert(&snapshot, sm)) < 0)
651
734
  break;
735
+
652
736
  GIT_REFCOUNT_INC(sm);
653
- });
737
+ }
654
738
  }
655
739
 
656
740
  if (error < 0)
@@ -668,12 +752,14 @@ int git_submodule_foreach(
668
752
  done:
669
753
  git_vector_foreach(&snapshot, i, sm)
670
754
  git_submodule_free(sm);
671
- git_vector_free(&snapshot);
755
+ git_vector_dispose(&snapshot);
672
756
 
673
- git_strmap_foreach_value(submodules, sm, {
757
+ for (iter = GIT_HASHMAP_ITER_INIT;
758
+ git_submodule_cache_iterate(&iter, NULL, &sm, submodules) == 0; )
674
759
  git_submodule_free(sm);
675
- });
676
- git_strmap_free(submodules);
760
+
761
+ git_submodule_cache_dispose(submodules);
762
+ git__free(submodules);
677
763
 
678
764
  return error;
679
765
  }
@@ -1032,16 +1118,23 @@ int git_submodule_add_to_index(git_submodule *sm, int write_index)
1032
1118
  git_commit_free(head);
1033
1119
 
1034
1120
  /* add it */
1035
- error = git_index_add(index, &entry);
1121
+ if ((error = git_index_add(index, &entry)) < 0)
1122
+ goto cleanup;
1123
+
1124
+ /* Adding implies conflict was resolved, move conflict entries to REUC */
1125
+ if ((error = git_index__conflict_to_reuc(index, entry.path)) < 0 && error != GIT_ENOTFOUND)
1126
+ goto cleanup;
1036
1127
 
1037
1128
  /* write it, if requested */
1038
- if (!error && write_index) {
1039
- error = git_index_write(index);
1129
+ if (write_index) {
1130
+ if ((error = git_index_write(index)) < 0)
1131
+ goto cleanup;
1040
1132
 
1041
- if (!error)
1042
- git_oid_cpy(&sm->index_oid, &sm->wd_oid);
1133
+ git_oid_cpy(&sm->index_oid, &sm->wd_oid);
1043
1134
  }
1044
1135
 
1136
+ error = 0;
1137
+
1045
1138
  cleanup:
1046
1139
  git_repository_free(sm_repo);
1047
1140
  git_str_dispose(&path);
@@ -1338,11 +1431,11 @@ int git_submodule_update(git_submodule *sm, int init, git_submodule_update_optio
1338
1431
  /* Get the status of the submodule to determine if it is already initialized */
1339
1432
  if ((error = git_submodule_status(&submodule_status, sm->repo, sm->name, GIT_SUBMODULE_IGNORE_UNSPECIFIED)) < 0)
1340
1433
  goto done;
1341
-
1434
+
1342
1435
  /* If the submodule is configured but hasn't been added, skip it */
1343
1436
  if (submodule_status == GIT_SUBMODULE_STATUS_IN_CONFIG)
1344
1437
  goto done;
1345
-
1438
+
1346
1439
  /*
1347
1440
  * If submodule work dir is not already initialized, check to see
1348
1441
  * what we need to do (initialize, clone, return error...)
@@ -1671,18 +1764,34 @@ static int submodule_update_head(git_submodule *submodule)
1671
1764
  return 0;
1672
1765
  }
1673
1766
 
1767
+ static int submodule_name_error(const char *name)
1768
+ {
1769
+ git_error_set(GIT_ERROR_SUBMODULE,
1770
+ "invalid value for submodule name: '%s'", name);
1771
+ return GIT_EINVALID;
1772
+ }
1773
+
1774
+ static int submodule_config_error(const char *property, const char *value)
1775
+ {
1776
+ git_error_set(GIT_ERROR_SUBMODULE,
1777
+ "invalid value for submodule '%s' property: '%s'", property, value);
1778
+ return GIT_EINVALID;
1779
+ }
1780
+
1674
1781
  int git_submodule_reload(git_submodule *sm, int force)
1675
1782
  {
1676
1783
  git_config *mods = NULL;
1677
- int error;
1784
+ int valid, error = 0;
1678
1785
 
1679
1786
  GIT_UNUSED(force);
1680
1787
 
1681
1788
  GIT_ASSERT_ARG(sm);
1682
1789
 
1683
- if ((error = git_submodule_name_is_valid(sm->repo, sm->name, 0)) <= 0)
1790
+ if ((valid = git_submodule_name_is_valid(sm->repo, sm->name, 0)) <= 0) {
1684
1791
  /* This should come with a warning, but we've no API for that */
1792
+ error = valid ? valid : submodule_name_error(sm->name);
1685
1793
  goto out;
1794
+ }
1686
1795
 
1687
1796
  if (git_repository_is_bare(sm->repo))
1688
1797
  goto out;
@@ -1705,6 +1814,12 @@ int git_submodule_reload(git_submodule *sm, int force)
1705
1814
  (error = submodule_update_head(sm)) < 0)
1706
1815
  goto out;
1707
1816
 
1817
+ if ((valid = path_is_valid(sm->repo, sm->path)) <= 0) {
1818
+ /* This should come with a warning, but we've no API for that */
1819
+ error = valid ? valid : submodule_config_error("path", sm->path);
1820
+ goto out;
1821
+ }
1822
+
1708
1823
  out:
1709
1824
  git_config_free(mods);
1710
1825
  return error;
@@ -1888,13 +2003,6 @@ void git_submodule_free(git_submodule *sm)
1888
2003
  GIT_REFCOUNT_DEC(sm, submodule_release);
1889
2004
  }
1890
2005
 
1891
- static int submodule_config_error(const char *property, const char *value)
1892
- {
1893
- git_error_set(GIT_ERROR_INVALID,
1894
- "invalid value for submodule '%s' property: '%s'", property, value);
1895
- return -1;
1896
- }
1897
-
1898
2006
  int git_submodule_parse_ignore(git_submodule_ignore_t *out, const char *value)
1899
2007
  {
1900
2008
  int val;
@@ -2049,7 +2157,7 @@ static int submodule_load_each(const git_config_entry *entry, void *payload)
2049
2157
  {
2050
2158
  lfc_data *data = payload;
2051
2159
  const char *namestart, *property;
2052
- git_strmap *map = data->map;
2160
+ git_submodule_cache *cache = data->cache;
2053
2161
  git_str name = GIT_STR_INIT;
2054
2162
  git_submodule *sm;
2055
2163
  int error, isvalid;
@@ -2080,7 +2188,7 @@ static int submodule_load_each(const git_config_entry *entry, void *payload)
2080
2188
  * a new submodule, load the config and insert it. If it's
2081
2189
  * already inserted, we've already loaded it, so we skip.
2082
2190
  */
2083
- if (git_strmap_exists(map, name.ptr)) {
2191
+ if (git_submodule_cache_contains(cache, name.ptr)) {
2084
2192
  error = 0;
2085
2193
  goto done;
2086
2194
  }
@@ -2093,7 +2201,14 @@ static int submodule_load_each(const git_config_entry *entry, void *payload)
2093
2201
  goto done;
2094
2202
  }
2095
2203
 
2096
- if ((error = git_strmap_set(map, sm->name, sm)) < 0)
2204
+ isvalid = path_is_valid(data->repo, sm->path);
2205
+ if (isvalid <= 0) {
2206
+ git_submodule_free(sm);
2207
+ error = isvalid;
2208
+ goto done;
2209
+ }
2210
+
2211
+ if ((error = git_submodule_cache_put(cache, sm->name, sm)) < 0)
2097
2212
  goto done;
2098
2213
 
2099
2214
  error = 0;
@@ -12,6 +12,7 @@
12
12
  #include "git2/submodule.h"
13
13
  #include "git2/repository.h"
14
14
  #include "futils.h"
15
+ #include "hashmap.h"
15
16
 
16
17
  /* Notes:
17
18
  *
@@ -116,15 +117,17 @@ enum {
116
117
  #define GIT_SUBMODULE_STATUS__CLEAR_INTERNAL(S) \
117
118
  ((S) & ~(0xFFFFFFFFu << 20))
118
119
 
120
+ GIT_HASHMAP_STR_STRUCT(git_submodule_cache, git_submodule *);
121
+
119
122
  /* Initialize an external submodule cache for the provided repo. */
120
- extern int git_submodule_cache_init(git_strmap **out, git_repository *repo);
123
+ extern int git_submodule_cache_init(git_submodule_cache **out, git_repository *repo);
121
124
 
122
125
  /* Release the resources of the submodule cache. */
123
- extern int git_submodule_cache_free(git_strmap *cache);
126
+ extern int git_submodule_cache_free(git_submodule_cache *cache);
124
127
 
125
128
  /* Submodule lookup with an explicit cache */
126
129
  extern int git_submodule__lookup_with_cache(
127
- git_submodule **out, git_repository *repo, const char *path, git_strmap *cache);
130
+ git_submodule **out, git_repository *repo, const char *path, git_submodule_cache *cache);
128
131
 
129
132
  /* Internal status fn returns status and optionally the various OIDs */
130
133
  extern int git_submodule__status(
@@ -145,10 +148,6 @@ extern int git_submodule_parse_ignore(
145
148
  extern int git_submodule_parse_update(
146
149
  git_submodule_update_t *out, const char *value);
147
150
 
148
- extern int git_submodule__map(
149
- git_repository *repo,
150
- git_strmap *map);
151
-
152
151
  /**
153
152
  * Check whether a submodule's name is valid.
154
153
  *
@@ -263,8 +263,10 @@ static bool tag_name_is_valid(const char *tag_name)
263
263
  /*
264
264
  * Discourage tag name starting with dash,
265
265
  * https://github.com/git/git/commit/4f0accd638b8d2
266
+ * and refuse to use HEAD as a tagname,
267
+ * https://github.com/git/git/commit/bbd445d5efd415
266
268
  */
267
- return tag_name[0] != '-';
269
+ return tag_name[0] != '-' && git__strcmp(tag_name, "HEAD");
268
270
  }
269
271
 
270
272
  static int git_tag_create__internal(
@@ -548,7 +550,7 @@ int git_tag_list_match(git_strarray *tag_names, const char *pattern, git_reposit
548
550
  error = git_tag_foreach(repo, &tag_list_cb, (void *)&filter);
549
551
 
550
552
  if (error < 0)
551
- git_vector_free(&taglist);
553
+ git_vector_dispose(&taglist);
552
554
 
553
555
  tag_names->strings =
554
556
  (char **)git_vector_detach(&tag_names->count, NULL, &taglist);