rugged 1.7.2 → 1.9.4

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 (405) 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 +195 -1
  32. data/vendor/libgit2/cmake/DefaultCFlags.cmake +4 -1
  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 +6 -1
  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/pcre/CMakeLists.txt +3 -3
  59. data/vendor/libgit2/deps/xdiff/CMakeLists.txt +1 -1
  60. data/vendor/libgit2/deps/xdiff/xmerge.c +16 -12
  61. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  62. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  63. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  64. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  65. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  66. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  67. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  68. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  69. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  70. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  71. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  72. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  73. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  74. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  75. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  76. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  77. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  78. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  79. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  80. data/vendor/libgit2/include/git2/apply.h +27 -6
  81. data/vendor/libgit2/include/git2/attr.h +17 -4
  82. data/vendor/libgit2/include/git2/blame.h +133 -28
  83. data/vendor/libgit2/include/git2/blob.h +71 -28
  84. data/vendor/libgit2/include/git2/branch.h +22 -15
  85. data/vendor/libgit2/include/git2/buffer.h +6 -4
  86. data/vendor/libgit2/include/git2/cert.h +2 -1
  87. data/vendor/libgit2/include/git2/checkout.h +83 -32
  88. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  89. data/vendor/libgit2/include/git2/clone.h +25 -9
  90. data/vendor/libgit2/include/git2/commit.h +132 -3
  91. data/vendor/libgit2/include/git2/common.h +120 -63
  92. data/vendor/libgit2/include/git2/config.h +93 -23
  93. data/vendor/libgit2/include/git2/credential.h +30 -2
  94. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  95. data/vendor/libgit2/include/git2/deprecated.h +134 -4
  96. data/vendor/libgit2/include/git2/describe.h +13 -1
  97. data/vendor/libgit2/include/git2/diff.h +38 -8
  98. data/vendor/libgit2/include/git2/email.h +9 -29
  99. data/vendor/libgit2/include/git2/errors.h +46 -73
  100. data/vendor/libgit2/include/git2/filter.h +14 -7
  101. data/vendor/libgit2/include/git2/global.h +8 -1
  102. data/vendor/libgit2/include/git2/graph.h +3 -2
  103. data/vendor/libgit2/include/git2/ignore.h +10 -0
  104. data/vendor/libgit2/include/git2/index.h +100 -15
  105. data/vendor/libgit2/include/git2/indexer.h +21 -4
  106. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  107. data/vendor/libgit2/include/git2/merge.h +50 -3
  108. data/vendor/libgit2/include/git2/message.h +2 -2
  109. data/vendor/libgit2/include/git2/net.h +3 -1
  110. data/vendor/libgit2/include/git2/notes.h +9 -6
  111. data/vendor/libgit2/include/git2/object.h +9 -8
  112. data/vendor/libgit2/include/git2/odb.h +91 -49
  113. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  114. data/vendor/libgit2/include/git2/oid.h +23 -25
  115. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  116. data/vendor/libgit2/include/git2/pack.h +13 -1
  117. data/vendor/libgit2/include/git2/patch.h +2 -3
  118. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  119. data/vendor/libgit2/include/git2/proxy.h +12 -3
  120. data/vendor/libgit2/include/git2/rebase.h +9 -6
  121. data/vendor/libgit2/include/git2/refdb.h +2 -2
  122. data/vendor/libgit2/include/git2/reflog.h +3 -2
  123. data/vendor/libgit2/include/git2/refs.h +9 -6
  124. data/vendor/libgit2/include/git2/refspec.h +14 -4
  125. data/vendor/libgit2/include/git2/remote.h +113 -25
  126. data/vendor/libgit2/include/git2/repository.h +57 -21
  127. data/vendor/libgit2/include/git2/reset.h +16 -3
  128. data/vendor/libgit2/include/git2/revert.h +9 -4
  129. data/vendor/libgit2/include/git2/revparse.h +3 -3
  130. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  131. data/vendor/libgit2/include/git2/signature.h +46 -1
  132. data/vendor/libgit2/include/git2/stash.h +17 -3
  133. data/vendor/libgit2/include/git2/status.h +10 -6
  134. data/vendor/libgit2/include/git2/stdint.h +87 -85
  135. data/vendor/libgit2/include/git2/strarray.h +2 -3
  136. data/vendor/libgit2/include/git2/submodule.h +20 -9
  137. data/vendor/libgit2/include/git2/sys/alloc.h +12 -0
  138. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  139. data/vendor/libgit2/include/git2/sys/commit_graph.h +103 -62
  140. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  141. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  142. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  143. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  144. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  145. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  146. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  147. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  148. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  149. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  150. data/vendor/libgit2/include/git2/sys/midx.h +43 -4
  151. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  152. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  153. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  154. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  155. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  156. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  157. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  158. data/vendor/libgit2/include/git2/sys/stream.h +11 -2
  159. data/vendor/libgit2/include/git2/sys/transport.h +25 -4
  160. data/vendor/libgit2/include/git2/tag.h +3 -1
  161. data/vendor/libgit2/include/git2/trace.h +9 -3
  162. data/vendor/libgit2/include/git2/transaction.h +3 -2
  163. data/vendor/libgit2/include/git2/transport.h +11 -3
  164. data/vendor/libgit2/include/git2/tree.h +16 -5
  165. data/vendor/libgit2/include/git2/types.h +19 -3
  166. data/vendor/libgit2/include/git2/version.h +46 -8
  167. data/vendor/libgit2/include/git2/worktree.h +16 -6
  168. data/vendor/libgit2/src/CMakeLists.txt +6 -4
  169. data/vendor/libgit2/src/cli/CMakeLists.txt +3 -4
  170. data/vendor/libgit2/src/cli/cmd.c +1 -1
  171. data/vendor/libgit2/src/cli/cmd.h +4 -0
  172. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  173. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  174. data/vendor/libgit2/src/cli/cmd_clone.c +5 -7
  175. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  176. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  177. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  178. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  179. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  180. data/vendor/libgit2/src/cli/common.c +168 -0
  181. data/vendor/libgit2/src/cli/common.h +63 -0
  182. data/vendor/libgit2/src/cli/error.h +1 -1
  183. data/vendor/libgit2/src/cli/main.c +52 -24
  184. data/vendor/libgit2/src/cli/opt.c +31 -5
  185. data/vendor/libgit2/src/cli/opt.h +21 -3
  186. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  187. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  188. data/vendor/libgit2/src/cli/progress.c +51 -2
  189. data/vendor/libgit2/src/cli/progress.h +12 -0
  190. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  191. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  192. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  193. data/vendor/libgit2/src/libgit2/CMakeLists.txt +55 -21
  194. data/vendor/libgit2/src/libgit2/apply.c +10 -13
  195. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  196. data/vendor/libgit2/src/libgit2/attr_file.c +17 -5
  197. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  198. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  199. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  200. data/vendor/libgit2/src/libgit2/blame.c +130 -44
  201. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  202. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  203. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  204. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  205. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  206. data/vendor/libgit2/src/libgit2/cherrypick.c +1 -2
  207. data/vendor/libgit2/src/libgit2/clone.c +192 -166
  208. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  209. data/vendor/libgit2/src/libgit2/commit.c +93 -1
  210. data/vendor/libgit2/src/libgit2/commit_graph.c +68 -58
  211. data/vendor/libgit2/src/libgit2/commit_graph.h +1 -2
  212. data/vendor/libgit2/src/libgit2/config.c +390 -299
  213. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  214. data/vendor/libgit2/src/libgit2/config.h +9 -4
  215. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  216. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  217. data/vendor/libgit2/src/libgit2/config_file.c +101 -89
  218. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  219. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  220. data/vendor/libgit2/src/libgit2/config_mem.c +195 -40
  221. data/vendor/libgit2/src/libgit2/config_parse.c +12 -10
  222. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  223. data/vendor/libgit2/src/libgit2/delta.c +5 -1
  224. data/vendor/libgit2/src/libgit2/describe.c +24 -24
  225. data/vendor/libgit2/src/libgit2/diff.c +1 -1
  226. data/vendor/libgit2/src/libgit2/diff_driver.c +13 -20
  227. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  228. data/vendor/libgit2/src/libgit2/diff_generate.c +3 -3
  229. data/vendor/libgit2/src/libgit2/diff_parse.c +2 -2
  230. data/vendor/libgit2/src/libgit2/diff_print.c +65 -9
  231. data/vendor/libgit2/src/libgit2/diff_stats.c +19 -12
  232. data/vendor/libgit2/src/libgit2/diff_tform.c +36 -8
  233. data/vendor/libgit2/src/libgit2/email.c +1 -0
  234. data/vendor/libgit2/src/libgit2/fetch.c +5 -3
  235. data/vendor/libgit2/src/libgit2/fetchhead.c +1 -1
  236. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  237. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  238. data/vendor/libgit2/src/libgit2/grafts.c +18 -20
  239. data/vendor/libgit2/src/libgit2/grafts.h +0 -1
  240. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  241. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  242. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  243. data/vendor/libgit2/src/libgit2/index.c +76 -98
  244. data/vendor/libgit2/src/libgit2/index.h +5 -2
  245. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  246. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  247. data/vendor/libgit2/src/libgit2/indexer.c +36 -40
  248. data/vendor/libgit2/src/libgit2/iterator.c +14 -8
  249. data/vendor/libgit2/src/libgit2/libgit2.c +153 -368
  250. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  251. data/vendor/libgit2/src/libgit2/merge.c +43 -38
  252. data/vendor/libgit2/src/libgit2/merge.h +4 -0
  253. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  254. data/vendor/libgit2/src/libgit2/merge_file.c +43 -30
  255. data/vendor/libgit2/src/libgit2/message.c +1 -1
  256. data/vendor/libgit2/src/libgit2/midx.c +30 -18
  257. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  258. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  259. data/vendor/libgit2/src/libgit2/object.c +6 -5
  260. data/vendor/libgit2/src/libgit2/odb.c +7 -10
  261. data/vendor/libgit2/src/libgit2/odb_loose.c +24 -14
  262. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  263. data/vendor/libgit2/src/libgit2/odb_pack.c +13 -5
  264. data/vendor/libgit2/src/libgit2/oid.c +36 -10
  265. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  266. data/vendor/libgit2/src/libgit2/pack-objects.c +59 -34
  267. data/vendor/libgit2/src/libgit2/pack-objects.h +12 -4
  268. data/vendor/libgit2/src/libgit2/pack.c +33 -24
  269. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  270. data/vendor/libgit2/src/libgit2/patch_parse.c +2 -2
  271. data/vendor/libgit2/src/libgit2/path.c +1 -1
  272. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  273. data/vendor/libgit2/src/libgit2/push.c +79 -28
  274. data/vendor/libgit2/src/libgit2/push.h +1 -0
  275. data/vendor/libgit2/src/libgit2/refdb_fs.c +128 -61
  276. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  277. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  278. data/vendor/libgit2/src/libgit2/refs.c +41 -13
  279. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  280. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  281. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  282. data/vendor/libgit2/src/libgit2/remote.c +125 -62
  283. data/vendor/libgit2/src/libgit2/remote.h +0 -1
  284. data/vendor/libgit2/src/libgit2/repository.c +235 -54
  285. data/vendor/libgit2/src/libgit2/repository.h +10 -6
  286. data/vendor/libgit2/src/libgit2/revert.c +1 -2
  287. data/vendor/libgit2/src/libgit2/revparse.c +2 -2
  288. data/vendor/libgit2/src/libgit2/revwalk.c +13 -10
  289. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  290. data/vendor/libgit2/src/libgit2/settings.c +468 -0
  291. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  292. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  293. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  294. data/vendor/libgit2/src/libgit2/status.c +1 -1
  295. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -60
  296. data/vendor/libgit2/src/libgit2/streams/openssl.c +32 -7
  297. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  298. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  299. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  300. data/vendor/libgit2/src/libgit2/streams/socket.c +30 -0
  301. data/vendor/libgit2/src/libgit2/streams/stransport.c +39 -7
  302. data/vendor/libgit2/src/libgit2/submodule.c +118 -68
  303. data/vendor/libgit2/src/libgit2/submodule.h +6 -7
  304. data/vendor/libgit2/src/libgit2/tag.c +4 -2
  305. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  306. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  307. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  308. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  309. data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +2 -0
  310. data/vendor/libgit2/src/libgit2/transports/credential.c +2 -2
  311. data/vendor/libgit2/src/libgit2/transports/git.c +1 -1
  312. data/vendor/libgit2/src/libgit2/transports/http.c +1 -2
  313. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  314. data/vendor/libgit2/src/libgit2/transports/httpclient.c +124 -81
  315. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  316. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  317. data/vendor/libgit2/src/libgit2/transports/local.c +16 -8
  318. data/vendor/libgit2/src/libgit2/transports/smart.c +25 -13
  319. data/vendor/libgit2/src/libgit2/transports/smart.h +4 -2
  320. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +5 -5
  321. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +55 -10
  322. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  323. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +386 -0
  324. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  325. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1126 -0
  326. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  327. data/vendor/libgit2/src/libgit2/transports/winhttp.c +35 -7
  328. data/vendor/libgit2/src/libgit2/tree.c +34 -26
  329. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  330. data/vendor/libgit2/src/libgit2/worktree.c +14 -17
  331. data/vendor/libgit2/src/util/CMakeLists.txt +7 -10
  332. data/vendor/libgit2/src/util/alloc.c +4 -1
  333. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  334. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  335. data/vendor/libgit2/src/util/allocators/stdalloc.c +0 -10
  336. data/vendor/libgit2/src/util/array.h +18 -17
  337. data/vendor/libgit2/src/util/cc-compat.h +2 -0
  338. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  339. data/vendor/libgit2/src/util/date.c +22 -14
  340. data/vendor/libgit2/src/util/date.h +12 -0
  341. data/vendor/libgit2/src/util/errors.c +401 -0
  342. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  343. data/vendor/libgit2/src/util/fs_path.c +81 -10
  344. data/vendor/libgit2/src/util/fs_path.h +29 -0
  345. data/vendor/libgit2/src/util/futils.c +6 -5
  346. data/vendor/libgit2/src/util/futils.h +24 -7
  347. data/vendor/libgit2/src/util/git2_features.h.in +12 -1
  348. data/vendor/libgit2/src/util/git2_util.h +6 -0
  349. data/vendor/libgit2/src/util/hash/builtin.c +14 -4
  350. data/vendor/libgit2/src/util/hash/openssl.c +148 -0
  351. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  352. data/vendor/libgit2/src/util/hash/rfc6234/sha224-256.c +8 -6
  353. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  354. data/vendor/libgit2/src/util/hashmap.h +425 -0
  355. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  356. data/vendor/libgit2/src/util/integer.h +3 -1
  357. data/vendor/libgit2/src/util/net.c +17 -11
  358. data/vendor/libgit2/src/util/net.h +2 -0
  359. data/vendor/libgit2/src/util/pool.c +1 -1
  360. data/vendor/libgit2/src/util/pool.h +5 -0
  361. data/vendor/libgit2/src/util/pqueue.h +1 -1
  362. data/vendor/libgit2/src/util/process.h +223 -0
  363. data/vendor/libgit2/src/util/rand.c +1 -7
  364. data/vendor/libgit2/src/util/regexp.c +1 -1
  365. data/vendor/libgit2/src/util/runtime.c +2 -2
  366. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  367. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  368. data/vendor/libgit2/src/util/str.c +20 -8
  369. data/vendor/libgit2/src/util/str.h +5 -3
  370. data/vendor/libgit2/src/util/strlist.c +108 -0
  371. data/vendor/libgit2/src/util/strlist.h +36 -0
  372. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  373. data/vendor/libgit2/src/util/unix/process.c +706 -0
  374. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  375. data/vendor/libgit2/src/util/util.c +18 -5
  376. data/vendor/libgit2/src/util/util.h +5 -38
  377. data/vendor/libgit2/src/util/vector.c +3 -3
  378. data/vendor/libgit2/src/util/vector.h +2 -2
  379. data/vendor/libgit2/src/util/win32/path_w32.c +81 -5
  380. data/vendor/libgit2/src/util/win32/posix_w32.c +29 -6
  381. data/vendor/libgit2/src/util/win32/process.c +522 -0
  382. metadata +60 -32
  383. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  384. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  385. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  386. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  387. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  388. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  389. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  390. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  391. data/vendor/libgit2/src/libgit2/errors.c +0 -293
  392. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  393. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  394. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  395. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  396. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  397. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  398. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  399. data/vendor/libgit2/src/libgit2/threadstate.c +0 -97
  400. data/vendor/libgit2/src/libgit2/threadstate.h +0 -22
  401. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  402. data/vendor/libgit2/src/util/khash.h +0 -615
  403. data/vendor/libgit2/src/util/strmap.c +0 -100
  404. data/vendor/libgit2/src/util/strmap.h +0 -131
  405. /data/vendor/libgit2/cmake/{FindHTTPParser.cmake → FindHTTP_Parser.cmake} +0 -0
@@ -9,7 +9,7 @@
9
9
 
10
10
  #include "git2/oid.h"
11
11
  #include "repository.h"
12
- #include "threadstate.h"
12
+ #include "runtime.h"
13
13
  #include <string.h>
14
14
  #include <limits.h>
15
15
 
@@ -22,6 +22,8 @@ const git_oid git_oid__empty_tree_sha1 =
22
22
  { 0x4b, 0x82, 0x5d, 0xc6, 0x42, 0xcb, 0x6e, 0xb9, 0xa0, 0x60,
23
23
  0xe5, 0x4b, 0xf8, 0xd6, 0x92, 0x88, 0xfb, 0xee, 0x49, 0x04 });
24
24
 
25
+ static const unsigned char git_oid_zero[GIT_OID_MAX_SIZE] = {0};
26
+
25
27
  static int oid_error_invalid(const char *msg)
26
28
  {
27
29
  git_error_set(GIT_ERROR_INVALID, "unable to parse OID - %s", msg);
@@ -153,15 +155,42 @@ int git_oid_pathfmt(char *str, const git_oid *oid)
153
155
  return 0;
154
156
  }
155
157
 
158
+ static git_tlsdata_key thread_str_key;
159
+
160
+ static void GIT_SYSTEM_CALL thread_str_free(void *s)
161
+ {
162
+ char *str = (char *)s;
163
+ git__free(str);
164
+ }
165
+
166
+ static void thread_str_global_shutdown(void)
167
+ {
168
+ char *str = git_tlsdata_get(thread_str_key);
169
+ git_tlsdata_set(thread_str_key, NULL);
170
+
171
+ git__free(str);
172
+ git_tlsdata_dispose(thread_str_key);
173
+ }
174
+
175
+ int git_oid_global_init(void)
176
+ {
177
+ if (git_tlsdata_init(&thread_str_key, thread_str_free) != 0)
178
+ return -1;
179
+
180
+ return git_runtime_shutdown_register(thread_str_global_shutdown);
181
+ }
182
+
156
183
  char *git_oid_tostr_s(const git_oid *oid)
157
184
  {
158
- git_threadstate *threadstate = git_threadstate_get();
159
185
  char *str;
160
186
 
161
- if (!threadstate)
162
- return NULL;
187
+ if ((str = git_tlsdata_get(thread_str_key)) == NULL) {
188
+ if ((str = git__malloc(GIT_OID_MAX_HEXSIZE + 1)) == NULL)
189
+ return NULL;
190
+
191
+ git_tlsdata_set(thread_str_key, str);
192
+ }
163
193
 
164
- str = threadstate->oid_fmt;
165
194
  git_oid_nfmt(str, git_oid_hexsize(git_oid_type(oid)) + 1, oid);
166
195
  return str;
167
196
  }
@@ -291,7 +320,7 @@ int git_oid_streq(const git_oid *oid_a, const char *str)
291
320
  int git_oid_is_zero(const git_oid *oid_a)
292
321
  {
293
322
  const unsigned char *a = oid_a->id;
294
- size_t size = git_oid_size(git_oid_type(oid_a)), i;
323
+ size_t size = git_oid_size(git_oid_type(oid_a));
295
324
 
296
325
  #ifdef GIT_EXPERIMENTAL_SHA256
297
326
  if (!oid_a->type)
@@ -300,10 +329,7 @@ int git_oid_is_zero(const git_oid *oid_a)
300
329
  return 0;
301
330
  #endif
302
331
 
303
- for (i = 0; i < size; ++i, ++a)
304
- if (*a != 0)
305
- return 0;
306
- return 1;
332
+ return git_oid_raw_cmp(a, git_oid_zero, size) == 0 ? 1 : 0;
307
333
  }
308
334
 
309
335
  #ifndef GIT_DEPRECATE_HARD
@@ -66,6 +66,15 @@ GIT_INLINE(size_t) git_oid_hexsize(git_oid_t type)
66
66
  return 0;
67
67
  }
68
68
 
69
+ GIT_INLINE(bool) git_oid_type_is_valid(git_oid_t type)
70
+ {
71
+ return (type == GIT_OID_SHA1
72
+ #ifdef GIT_EXPERIMENTAL_SHA256
73
+ || type == GIT_OID_SHA256
74
+ #endif
75
+ );
76
+ }
77
+
69
78
  GIT_INLINE(const char *) git_oid_type_name(git_oid_t type)
70
79
  {
71
80
  switch (type) {
@@ -270,4 +279,6 @@ int git_oid__fromstrn(
270
279
 
271
280
  int git_oid__fromraw(git_oid *out, const unsigned char *raw, git_oid_t type);
272
281
 
282
+ int git_oid_global_init(void);
283
+
273
284
  #endif
@@ -64,6 +64,9 @@ struct walk_object {
64
64
  /* Size of the buffer to feed to zlib */
65
65
  #define COMPRESS_BUFLEN (1024 * 1024)
66
66
 
67
+ GIT_HASHMAP_OID_FUNCTIONS(git_packbuilder_pobjectmap, GIT_HASHMAP_INLINE, git_pobject *);
68
+ GIT_HASHMAP_OID_FUNCTIONS(git_packbuilder_walk_objectmap, GIT_HASHMAP_INLINE, struct walk_object *);
69
+
67
70
  static unsigned name_hash(const char *name)
68
71
  {
69
72
  unsigned c, hash = 0;
@@ -139,9 +142,7 @@ int git_packbuilder_new(git_packbuilder **out, git_repository *repo)
139
142
  hash_algorithm = git_oid_algorithm(pb->oid_type);
140
143
  GIT_ASSERT(hash_algorithm);
141
144
 
142
- if (git_oidmap_new(&pb->object_ix) < 0 ||
143
- git_oidmap_new(&pb->walk_objects) < 0 ||
144
- git_pool_init(&pb->object_pool, sizeof(struct walk_object)) < 0)
145
+ if (git_pool_init(&pb->object_pool, sizeof(struct walk_object)) < 0)
145
146
  goto on_error;
146
147
 
147
148
  pb->repo = repo;
@@ -192,10 +193,10 @@ static int rehash(git_packbuilder *pb)
192
193
  git_pobject *po;
193
194
  size_t i;
194
195
 
195
- git_oidmap_clear(pb->object_ix);
196
+ git_packbuilder_pobjectmap_clear(&pb->object_ix);
196
197
 
197
198
  for (i = 0, po = pb->object_list; i < pb->nr_objects; i++, po++) {
198
- if (git_oidmap_set(pb->object_ix, &po->id, po) < 0)
199
+ if (git_packbuilder_pobjectmap_put(&pb->object_ix, &po->id, po) < 0)
199
200
  return -1;
200
201
  }
201
202
 
@@ -214,7 +215,7 @@ int git_packbuilder_insert(git_packbuilder *pb, const git_oid *oid,
214
215
 
215
216
  /* If the object already exists in the hash table, then we don't
216
217
  * have any work to do */
217
- if (git_oidmap_exists(pb->object_ix, oid))
218
+ if (git_packbuilder_pobjectmap_contains(&pb->object_ix, oid))
218
219
  return 0;
219
220
 
220
221
  if (pb->nr_objects >= pb->nr_alloc) {
@@ -246,7 +247,7 @@ int git_packbuilder_insert(git_packbuilder *pb, const git_oid *oid,
246
247
  git_oid_cpy(&po->id, oid);
247
248
  po->hash = name_hash(name);
248
249
 
249
- if (git_oidmap_set(pb->object_ix, &po->id, po) < 0) {
250
+ if (git_packbuilder_pobjectmap_put(&pb->object_ix, &po->id, po) < 0) {
250
251
  git_error_set_oom();
251
252
  return -1;
252
253
  }
@@ -515,7 +516,7 @@ static int cb_tag_foreach(const char *name, git_oid *oid, void *data)
515
516
 
516
517
  GIT_UNUSED(name);
517
518
 
518
- if ((po = git_oidmap_get(pb->object_ix, oid)) == NULL)
519
+ if (git_packbuilder_pobjectmap_get(&po, &pb->object_ix, oid) != 0)
519
520
  return 0;
520
521
 
521
522
  po->tagged = 1;
@@ -932,6 +933,9 @@ static int report_delta_progress(
932
933
  {
933
934
  int ret;
934
935
 
936
+ if (pb->failure)
937
+ return pb->failure;
938
+
935
939
  if (pb->progress_cb) {
936
940
  uint64_t current_time = git_time_monotonic();
937
941
  uint64_t elapsed = current_time - pb->last_progress_report_time;
@@ -943,8 +947,10 @@ static int report_delta_progress(
943
947
  GIT_PACKBUILDER_DELTAFICATION,
944
948
  count, pb->nr_objects, pb->progress_cb_payload);
945
949
 
946
- if (ret)
950
+ if (ret) {
951
+ pb->failure = ret;
947
952
  return git_error_set_after_callback(ret);
953
+ }
948
954
  }
949
955
  }
950
956
 
@@ -976,7 +982,10 @@ static int find_deltas(git_packbuilder *pb, git_pobject **list,
976
982
  }
977
983
 
978
984
  pb->nr_deltified += 1;
979
- report_delta_progress(pb, pb->nr_deltified, false);
985
+ if ((error = report_delta_progress(pb, pb->nr_deltified, false)) < 0) {
986
+ GIT_ASSERT(git_packbuilder__progress_unlock(pb) == 0);
987
+ goto on_error;
988
+ }
980
989
 
981
990
  po = *list++;
982
991
  (*list_size)--;
@@ -1124,6 +1133,10 @@ struct thread_params {
1124
1133
  size_t depth;
1125
1134
  size_t working;
1126
1135
  size_t data_ready;
1136
+
1137
+ /* A pb->progress_cb can stop the packing process by returning an error.
1138
+ When that happens, all threads observe the error and stop voluntarily. */
1139
+ bool stopped;
1127
1140
  };
1128
1141
 
1129
1142
  static void *threaded_find_deltas(void *arg)
@@ -1133,7 +1146,12 @@ static void *threaded_find_deltas(void *arg)
1133
1146
  while (me->remaining) {
1134
1147
  if (find_deltas(me->pb, me->list, &me->remaining,
1135
1148
  me->window, me->depth) < 0) {
1136
- ; /* TODO */
1149
+ me->stopped = true;
1150
+ GIT_ASSERT_WITH_RETVAL(git_packbuilder__progress_lock(me->pb) == 0, NULL);
1151
+ me->working = false;
1152
+ git_cond_signal(&me->pb->progress_cond);
1153
+ GIT_ASSERT_WITH_RETVAL(git_packbuilder__progress_unlock(me->pb) == 0, NULL);
1154
+ return NULL;
1137
1155
  }
1138
1156
 
1139
1157
  GIT_ASSERT_WITH_RETVAL(git_packbuilder__progress_lock(me->pb) == 0, NULL);
@@ -1175,8 +1193,7 @@ static int ll_find_deltas(git_packbuilder *pb, git_pobject **list,
1175
1193
  pb->nr_threads = git__online_cpus();
1176
1194
 
1177
1195
  if (pb->nr_threads <= 1) {
1178
- find_deltas(pb, list, &list_size, window, depth);
1179
- return 0;
1196
+ return find_deltas(pb, list, &list_size, window, depth);
1180
1197
  }
1181
1198
 
1182
1199
  p = git__mallocarray(pb->nr_threads, sizeof(*p));
@@ -1195,6 +1212,7 @@ static int ll_find_deltas(git_packbuilder *pb, git_pobject **list,
1195
1212
  p[i].depth = depth;
1196
1213
  p[i].working = 1;
1197
1214
  p[i].data_ready = 0;
1215
+ p[i].stopped = 0;
1198
1216
 
1199
1217
  /* try to split chunks on "path" boundaries */
1200
1218
  while (sub_size && sub_size < list_size &&
@@ -1262,7 +1280,7 @@ static int ll_find_deltas(git_packbuilder *pb, git_pobject **list,
1262
1280
  (!victim || victim->remaining < p[i].remaining))
1263
1281
  victim = &p[i];
1264
1282
 
1265
- if (victim) {
1283
+ if (victim && !target->stopped) {
1266
1284
  sub_size = victim->remaining / 2;
1267
1285
  list = victim->list + victim->list_size - sub_size;
1268
1286
  while (sub_size && list[0]->hash &&
@@ -1286,7 +1304,7 @@ static int ll_find_deltas(git_packbuilder *pb, git_pobject **list,
1286
1304
  }
1287
1305
  target->list_size = sub_size;
1288
1306
  target->remaining = sub_size;
1289
- target->working = 1;
1307
+ target->working = 1; /* even when target->stopped, so that we don't process this thread again */
1290
1308
  GIT_ASSERT(git_packbuilder__progress_unlock(pb) == 0);
1291
1309
 
1292
1310
  if (git_mutex_lock(&target->mutex)) {
@@ -1299,7 +1317,7 @@ static int ll_find_deltas(git_packbuilder *pb, git_pobject **list,
1299
1317
  git_cond_signal(&target->cond);
1300
1318
  git_mutex_unlock(&target->mutex);
1301
1319
 
1302
- if (!sub_size) {
1320
+ if (target->stopped || !sub_size) {
1303
1321
  git_thread_join(&target->thread, NULL);
1304
1322
  git_cond_free(&target->cond);
1305
1323
  git_mutex_free(&target->mutex);
@@ -1308,7 +1326,7 @@ static int ll_find_deltas(git_packbuilder *pb, git_pobject **list,
1308
1326
  }
1309
1327
 
1310
1328
  git__free(p);
1311
- return 0;
1329
+ return pb->failure;
1312
1330
  }
1313
1331
 
1314
1332
  #else
@@ -1319,6 +1337,7 @@ int git_packbuilder__prepare(git_packbuilder *pb)
1319
1337
  {
1320
1338
  git_pobject **delta_list;
1321
1339
  size_t i, n = 0;
1340
+ int error;
1322
1341
 
1323
1342
  if (pb->nr_objects == 0 || pb->done)
1324
1343
  return 0; /* nothing to do */
@@ -1327,8 +1346,10 @@ int git_packbuilder__prepare(git_packbuilder *pb)
1327
1346
  * Although we do not report progress during deltafication, we
1328
1347
  * at least report that we are in the deltafication stage
1329
1348
  */
1330
- if (pb->progress_cb)
1331
- pb->progress_cb(GIT_PACKBUILDER_DELTAFICATION, 0, pb->nr_objects, pb->progress_cb_payload);
1349
+ if (pb->progress_cb) {
1350
+ if ((error = pb->progress_cb(GIT_PACKBUILDER_DELTAFICATION, 0, pb->nr_objects, pb->progress_cb_payload)) < 0)
1351
+ return git_error_set_after_callback(error);
1352
+ }
1332
1353
 
1333
1354
  delta_list = git__mallocarray(pb->nr_objects, sizeof(*delta_list));
1334
1355
  GIT_ERROR_CHECK_ALLOC(delta_list);
@@ -1345,31 +1366,33 @@ int git_packbuilder__prepare(git_packbuilder *pb)
1345
1366
 
1346
1367
  if (n > 1) {
1347
1368
  git__tsort((void **)delta_list, n, type_size_sort);
1348
- if (ll_find_deltas(pb, delta_list, n,
1369
+ if ((error = ll_find_deltas(pb, delta_list, n,
1349
1370
  GIT_PACK_WINDOW + 1,
1350
- GIT_PACK_DEPTH) < 0) {
1371
+ GIT_PACK_DEPTH)) < 0) {
1351
1372
  git__free(delta_list);
1352
- return -1;
1373
+ return error;
1353
1374
  }
1354
1375
  }
1355
1376
 
1356
- report_delta_progress(pb, pb->nr_objects, true);
1377
+ error = report_delta_progress(pb, pb->nr_objects, true);
1357
1378
 
1358
1379
  pb->done = true;
1359
1380
  git__free(delta_list);
1360
- return 0;
1381
+ return error;
1361
1382
  }
1362
1383
 
1363
- #define PREPARE_PACK if (git_packbuilder__prepare(pb) < 0) { return -1; }
1384
+ #define PREPARE_PACK error = git_packbuilder__prepare(pb); if (error < 0) { return error; }
1364
1385
 
1365
1386
  int git_packbuilder_foreach(git_packbuilder *pb, int (*cb)(void *buf, size_t size, void *payload), void *payload)
1366
1387
  {
1388
+ int error;
1367
1389
  PREPARE_PACK;
1368
1390
  return write_pack(pb, cb, payload);
1369
1391
  }
1370
1392
 
1371
1393
  int git_packbuilder__write_buf(git_str *buf, git_packbuilder *pb)
1372
1394
  {
1395
+ int error;
1373
1396
  PREPARE_PACK;
1374
1397
 
1375
1398
  return write_pack(pb, &write_pack_buf, buf);
@@ -1397,7 +1420,7 @@ int git_packbuilder_write(
1397
1420
  git_str object_path = GIT_STR_INIT;
1398
1421
  git_indexer_options opts = GIT_INDEXER_OPTIONS_INIT;
1399
1422
  git_indexer *indexer = NULL;
1400
- git_indexer_progress stats;
1423
+ git_indexer_progress stats = { 0 };
1401
1424
  struct pack_write_context ctx;
1402
1425
  int t;
1403
1426
 
@@ -1414,13 +1437,12 @@ int git_packbuilder_write(
1414
1437
  opts.progress_cb = progress_cb;
1415
1438
  opts.progress_cb_payload = progress_cb_payload;
1416
1439
 
1417
- /* TODO: SHA256 */
1418
-
1419
1440
  #ifdef GIT_EXPERIMENTAL_SHA256
1420
1441
  opts.mode = mode;
1421
1442
  opts.odb = pb->odb;
1443
+ opts.oid_type = pb->oid_type;
1422
1444
 
1423
- error = git_indexer_new(&indexer, path, GIT_OID_SHA1, &opts);
1445
+ error = git_indexer_new(&indexer, path, &opts);
1424
1446
  #else
1425
1447
  error = git_indexer_new(&indexer, path, mode, pb->odb, &opts);
1426
1448
  #endif
@@ -1584,12 +1606,16 @@ static int retrieve_object(struct walk_object **out, git_packbuilder *pb, const
1584
1606
  struct walk_object *obj;
1585
1607
  int error;
1586
1608
 
1587
- if ((obj = git_oidmap_get(pb->walk_objects, id)) == NULL) {
1609
+ error = git_packbuilder_walk_objectmap_get(&obj, &pb->walk_objects, id);
1610
+
1611
+ if (error == GIT_ENOTFOUND) {
1588
1612
  if ((error = lookup_walk_object(&obj, pb, id)) < 0)
1589
1613
  return error;
1590
1614
 
1591
- if ((error = git_oidmap_set(pb->walk_objects, &obj->id, obj)) < 0)
1615
+ if ((error = git_packbuilder_walk_objectmap_put(&pb->walk_objects, &obj->id, obj)) < 0)
1592
1616
  return error;
1617
+ } else if (error != 0) {
1618
+ return error;
1593
1619
  }
1594
1620
 
1595
1621
  *out = obj;
@@ -1821,13 +1847,12 @@ void git_packbuilder_free(git_packbuilder *pb)
1821
1847
  if (pb->odb)
1822
1848
  git_odb_free(pb->odb);
1823
1849
 
1824
- if (pb->object_ix)
1825
- git_oidmap_free(pb->object_ix);
1850
+ git_packbuilder_pobjectmap_dispose(&pb->object_ix);
1826
1851
 
1827
1852
  if (pb->object_list)
1828
1853
  git__free(pb->object_list);
1829
1854
 
1830
- git_oidmap_free(pb->walk_objects);
1855
+ git_packbuilder_walk_objectmap_dispose(&pb->walk_objects);
1831
1856
  git_pool_clear(&pb->object_pool);
1832
1857
 
1833
1858
  git_hash_ctx_cleanup(&pb->ctx);
@@ -12,10 +12,10 @@
12
12
 
13
13
  #include "str.h"
14
14
  #include "hash.h"
15
- #include "oidmap.h"
16
15
  #include "zstream.h"
17
16
  #include "pool.h"
18
17
  #include "indexer.h"
18
+ #include "hashmap_oid.h"
19
19
 
20
20
  #include "git2/oid.h"
21
21
  #include "git2/pack.h"
@@ -51,6 +51,11 @@ typedef struct git_pobject {
51
51
  filled:1;
52
52
  } git_pobject;
53
53
 
54
+ typedef struct walk_object walk_object;
55
+
56
+ GIT_HASHMAP_OID_STRUCT(git_packbuilder_pobjectmap, git_pobject *);
57
+ GIT_HASHMAP_OID_STRUCT(git_packbuilder_walk_objectmap, walk_object *);
58
+
54
59
  struct git_packbuilder {
55
60
  git_repository *repo; /* associated repository */
56
61
  git_odb *odb; /* associated object database */
@@ -69,9 +74,8 @@ struct git_packbuilder {
69
74
 
70
75
  git_pobject *object_list;
71
76
 
72
- git_oidmap *object_ix;
73
-
74
- git_oidmap *walk_objects;
77
+ git_packbuilder_pobjectmap object_ix;
78
+ git_packbuilder_walk_objectmap walk_objects;
75
79
  git_pool object_pool;
76
80
 
77
81
  #ifndef GIT_DEPRECATE_HARD
@@ -100,6 +104,10 @@ struct git_packbuilder {
100
104
  uint64_t last_progress_report_time;
101
105
 
102
106
  bool done;
107
+
108
+ /* A non-zero error code in failure causes all threads to shut themselves
109
+ down. Some functions will return this error code. */
110
+ volatile int failure;
103
111
  };
104
112
 
105
113
  int git_packbuilder__write_buf(git_str *buf, git_packbuilder *pb);
@@ -13,6 +13,7 @@
13
13
  #include "odb.h"
14
14
  #include "oid.h"
15
15
  #include "oidarray.h"
16
+ #include "hashmap_oid.h"
16
17
 
17
18
  /* Option to bypass checking existence of '.keep' files */
18
19
  bool git_disable_pack_keep_file_checks = false;
@@ -41,6 +42,12 @@ static int pack_entry_find_offset(
41
42
  const git_oid *short_oid,
42
43
  size_t len);
43
44
 
45
+ #define off64_hash(key) (uint32_t)((key)>>33^(key)^(key)<<11)
46
+ #define off64_equal(a, b) ((a) == (b))
47
+
48
+ GIT_HASHMAP_FUNCTIONS(git_pack_offsetmap, GIT_HASHMAP_INLINE, off64_t, git_pack_cache_entry *, off64_hash, off64_equal);
49
+ GIT_HASHMAP_OID_FUNCTIONS(git_pack_oidmap, , struct git_pack_entry *);
50
+
44
51
  static int packfile_error(const char *message)
45
52
  {
46
53
  git_error_set(GIT_ERROR_ODB, "invalid pack file - %s", message);
@@ -75,31 +82,21 @@ static void free_cache_object(void *o)
75
82
 
76
83
  static void cache_free(git_pack_cache *cache)
77
84
  {
85
+ git_hashmap_iter_t iter = GIT_HASHMAP_ITER_INIT;
78
86
  git_pack_cache_entry *entry;
79
87
 
80
- if (cache->entries) {
81
- git_offmap_foreach_value(cache->entries, entry, {
82
- free_cache_object(entry);
83
- });
88
+ while (git_pack_offsetmap_iterate(&iter, NULL, &entry, &cache->entries) == 0)
89
+ free_cache_object(entry);
84
90
 
85
- git_offmap_free(cache->entries);
86
- cache->entries = NULL;
87
- }
91
+ git_pack_offsetmap_dispose(&cache->entries);
88
92
  }
89
93
 
90
94
  static int cache_init(git_pack_cache *cache)
91
95
  {
92
- if (git_offmap_new(&cache->entries) < 0)
93
- return -1;
94
-
95
96
  cache->memory_limit = GIT_PACK_CACHE_MEMORY_LIMIT;
96
97
 
97
98
  if (git_mutex_init(&cache->lock)) {
98
99
  git_error_set(GIT_ERROR_OS, "failed to initialize pack cache mutex");
99
-
100
- git__free(cache->entries);
101
- cache->entries = NULL;
102
-
103
100
  return -1;
104
101
  }
105
102
 
@@ -108,15 +105,16 @@ static int cache_init(git_pack_cache *cache)
108
105
 
109
106
  static git_pack_cache_entry *cache_get(git_pack_cache *cache, off64_t offset)
110
107
  {
111
- git_pack_cache_entry *entry;
108
+ git_pack_cache_entry *entry = NULL;
112
109
 
113
110
  if (git_mutex_lock(&cache->lock) < 0)
114
111
  return NULL;
115
112
 
116
- if ((entry = git_offmap_get(cache->entries, offset)) != NULL) {
113
+ if (git_pack_offsetmap_get(&entry, &cache->entries, offset) == 0) {
117
114
  git_atomic32_inc(&entry->refcount);
118
115
  entry->last_usage = cache->use_ctr++;
119
116
  }
117
+
120
118
  git_mutex_unlock(&cache->lock);
121
119
 
122
120
  return entry;
@@ -125,16 +123,17 @@ static git_pack_cache_entry *cache_get(git_pack_cache *cache, off64_t offset)
125
123
  /* Run with the cache lock held */
126
124
  static void free_lowest_entry(git_pack_cache *cache)
127
125
  {
128
- off64_t offset;
126
+ git_hashmap_iter_t iter = GIT_HASHMAP_ITER_INIT;
129
127
  git_pack_cache_entry *entry;
128
+ off64_t offset;
130
129
 
131
- git_offmap_foreach(cache->entries, offset, entry, {
130
+ while (git_pack_offsetmap_iterate(&iter, &offset, &entry, &cache->entries) == 0) {
132
131
  if (entry && git_atomic32_get(&entry->refcount) == 0) {
133
132
  cache->memory_used -= entry->raw.len;
134
- git_offmap_delete(cache->entries, offset);
133
+ git_pack_offsetmap_remove(&cache->entries, offset);
135
134
  free_cache_object(entry);
136
135
  }
137
- });
136
+ }
138
137
  }
139
138
 
140
139
  static int cache_add(
@@ -157,12 +156,12 @@ static int cache_add(
157
156
  return -1;
158
157
  }
159
158
  /* Add it to the cache if nobody else has */
160
- exists = git_offmap_exists(cache->entries, offset);
159
+ exists = git_pack_offsetmap_contains(&cache->entries, offset);
161
160
  if (!exists) {
162
161
  while (cache->memory_used + base->len > cache->memory_limit)
163
162
  free_lowest_entry(cache);
164
163
 
165
- git_offmap_set(cache->entries, offset, entry);
164
+ git_pack_offsetmap_put(&cache->entries, offset, entry);
166
165
  cache->memory_used += entry->raw.len;
167
166
 
168
167
  *cached_out = entry;
@@ -942,6 +941,9 @@ static int packfile_unpack_compressed(
942
941
  goto out;
943
942
  }
944
943
 
944
+ /* zlib may have garbled the trailing buffer */
945
+ data[size] = '\0';
946
+
945
947
  obj->type = type;
946
948
  obj->len = size;
947
949
  obj->data = data;
@@ -1009,7 +1011,7 @@ int get_delta_base(
1009
1011
  if (p->has_cache) {
1010
1012
  struct git_pack_entry *entry;
1011
1013
 
1012
- if ((entry = git_oidmap_get(p->idx_cache, &base_oid)) != NULL) {
1014
+ if (git_pack_oidmap_get(&entry, &p->idx_cache, &base_oid) == 0) {
1013
1015
  if (entry->offset == 0)
1014
1016
  return packfile_error("delta offset is zero");
1015
1017
 
@@ -1351,7 +1353,7 @@ int git_pack_foreach_entry(
1351
1353
  git_vector_insert(&oids, (void*)&current[4]);
1352
1354
  }
1353
1355
 
1354
- git_vector_free(&offsets);
1356
+ git_vector_dispose(&offsets);
1355
1357
  p->ids = (unsigned char **)git_vector_detach(NULL, NULL, &oids);
1356
1358
  }
1357
1359
 
@@ -1499,6 +1501,7 @@ static int pack_entry_find_offset(
1499
1501
  size_t len)
1500
1502
  {
1501
1503
  const uint32_t *level1_ofs;
1504
+ size_t ofs_delta = 0;
1502
1505
  const unsigned char *index;
1503
1506
  unsigned hi, lo, stride;
1504
1507
  int pos, found = 0;
@@ -1524,9 +1527,15 @@ static int pack_entry_find_offset(
1524
1527
 
1525
1528
  if (p->index_version > 1) {
1526
1529
  level1_ofs += 2;
1530
+ ofs_delta = 2;
1527
1531
  index += 8;
1528
1532
  }
1529
1533
 
1534
+ if ((size_t)short_oid->id[0] + ofs_delta >= p->index_map.len) {
1535
+ git_error_set(GIT_ERROR_INTERNAL, "internal error: p->short_oid->[0] out of bounds");
1536
+ goto cleanup;
1537
+ }
1538
+
1530
1539
  index += 4 * 256;
1531
1540
  hi = ntohl(level1_ofs[(int)short_oid->id[0]]);
1532
1541
  lo = ((short_oid->id[0] == 0x0) ? 0 : ntohl(level1_ofs[(int)short_oid->id[0] - 1]));
@@ -16,10 +16,9 @@
16
16
  #include "map.h"
17
17
  #include "mwindow.h"
18
18
  #include "odb.h"
19
- #include "offmap.h"
20
- #include "oidmap.h"
21
19
  #include "zstream.h"
22
20
  #include "oid.h"
21
+ #include "hashmap_oid.h"
23
22
 
24
23
  /**
25
24
  * Function type for callbacks from git_pack_foreach_entry_offset.
@@ -83,12 +82,23 @@ typedef git_array_t(struct pack_chain_elem) git_dependency_chain;
83
82
  #define GIT_PACK_CACHE_MEMORY_LIMIT 16 * 1024 * 1024
84
83
  #define GIT_PACK_CACHE_SIZE_LIMIT 1024 * 1024 /* don't bother caching anything over 1MB */
85
84
 
85
+ struct git_pack_entry {
86
+ off64_t offset;
87
+ git_oid id;
88
+ struct git_pack_file *p;
89
+ };
90
+
91
+ GIT_HASHMAP_STRUCT(git_pack_offsetmap, off64_t, git_pack_cache_entry *);
92
+
93
+ GIT_HASHMAP_OID_STRUCT(git_pack_oidmap, struct git_pack_entry *);
94
+ GIT_HASHMAP_OID_PROTOTYPES(git_pack_oidmap, struct git_pack_entry *);
95
+
86
96
  typedef struct {
87
97
  size_t memory_used;
88
98
  size_t memory_limit;
89
99
  size_t use_ctr;
90
100
  git_mutex lock;
91
- git_offmap *entries;
101
+ git_pack_offsetmap entries;
92
102
  } git_pack_cache;
93
103
 
94
104
  struct git_pack_file {
@@ -110,7 +120,8 @@ struct git_pack_file {
110
120
 
111
121
  int index_version;
112
122
  git_time_t mtime;
113
- git_oidmap *idx_cache;
123
+
124
+ git_pack_oidmap idx_cache;
114
125
  unsigned char **ids;
115
126
 
116
127
  git_pack_cache bases; /* delta base cache */
@@ -139,12 +150,6 @@ int git_pack__lookup_id(
139
150
  const unsigned char *id_prefix,
140
151
  const git_oid_t oid_type);
141
152
 
142
- struct git_pack_entry {
143
- off64_t offset;
144
- git_oid id;
145
- struct git_pack_file *p;
146
- };
147
-
148
153
  typedef struct git_packfile_stream {
149
154
  off64_t curpos;
150
155
  int done;
@@ -562,9 +562,9 @@ fail:
562
562
 
563
563
  static int eof_for_origin(int origin) {
564
564
  if (origin == GIT_DIFF_LINE_ADDITION)
565
- return GIT_DIFF_LINE_ADD_EOFNL;
566
- if (origin == GIT_DIFF_LINE_DELETION)
567
565
  return GIT_DIFF_LINE_DEL_EOFNL;
566
+ if (origin == GIT_DIFF_LINE_DELETION)
567
+ return GIT_DIFF_LINE_ADD_EOFNL;
568
568
  return GIT_DIFF_LINE_CONTEXT_EOFNL;
569
569
  }
570
570
 
@@ -202,7 +202,7 @@ GIT_INLINE(size_t) common_prefix_icase(const char *str, size_t len, const char *
202
202
  {
203
203
  size_t count = 0;
204
204
 
205
- while (len > 0 && tolower(*str) == tolower(*prefix)) {
205
+ while (len > 0 && git__tolower(*str) == git__tolower(*prefix)) {
206
206
  count++;
207
207
  str++;
208
208
  prefix++;
@@ -105,7 +105,7 @@ int git_pathspec__vinit(
105
105
  /* free data from the pathspec vector */
106
106
  void git_pathspec__vfree(git_vector *vspec)
107
107
  {
108
- git_vector_free_deep(vspec);
108
+ git_vector_dispose_deep(vspec);
109
109
  }
110
110
 
111
111
  struct pathspec_match_context {