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
@@ -0,0 +1,285 @@
1
+ /*
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
+ *
4
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
5
+ * a Linking Exception. For full terms see the included COPYING file.
6
+ */
7
+
8
+ #include "config_list.h"
9
+ #include "hashmap_str.h"
10
+
11
+ typedef struct config_entry_list {
12
+ struct config_entry_list *next;
13
+ struct config_entry_list *last;
14
+ git_config_list_entry *entry;
15
+ } config_entry_list;
16
+
17
+ typedef struct {
18
+ git_config_list_entry *entry;
19
+ bool multivar;
20
+ } config_entry_map_head;
21
+
22
+ typedef struct config_list_iterator {
23
+ git_config_iterator parent;
24
+ git_config_list *list;
25
+ config_entry_list *head;
26
+ } config_list_iterator;
27
+
28
+ GIT_HASHMAP_STR_SETUP(git_config_list_pathmap, char *);
29
+ GIT_HASHMAP_STR_SETUP(git_config_list_headmap, config_entry_map_head *);
30
+
31
+ struct git_config_list {
32
+ git_refcount rc;
33
+
34
+ /* Interned strings - paths to config files or backend types */
35
+ git_config_list_pathmap strings;
36
+
37
+ /* Config entries */
38
+ git_config_list_headmap map;
39
+ config_entry_list *entries;
40
+ };
41
+
42
+ int git_config_list_new(git_config_list **out)
43
+ {
44
+ git_config_list *config_list;
45
+
46
+ config_list = git__calloc(1, sizeof(git_config_list));
47
+ GIT_ERROR_CHECK_ALLOC(config_list);
48
+ GIT_REFCOUNT_INC(config_list);
49
+
50
+ *out = config_list;
51
+ return 0;
52
+ }
53
+
54
+ int git_config_list_dup_entry(git_config_list *config_list, const git_config_entry *entry)
55
+ {
56
+ git_config_list_entry *duplicated;
57
+ int error;
58
+
59
+ duplicated = git__calloc(1, sizeof(git_config_list_entry));
60
+ GIT_ERROR_CHECK_ALLOC(duplicated);
61
+
62
+ duplicated->base.entry.name = git__strdup(entry->name);
63
+ GIT_ERROR_CHECK_ALLOC(duplicated->base.entry.name);
64
+
65
+ if (entry->value) {
66
+ duplicated->base.entry.value = git__strdup(entry->value);
67
+ GIT_ERROR_CHECK_ALLOC(duplicated->base.entry.value);
68
+ }
69
+
70
+ duplicated->base.entry.backend_type = git_config_list_add_string(config_list, entry->backend_type);
71
+ GIT_ERROR_CHECK_ALLOC(duplicated->base.entry.backend_type);
72
+
73
+ if (entry->origin_path) {
74
+ duplicated->base.entry.origin_path = git_config_list_add_string(config_list, entry->origin_path);
75
+ GIT_ERROR_CHECK_ALLOC(duplicated->base.entry.origin_path);
76
+ }
77
+
78
+ duplicated->base.entry.level = entry->level;
79
+ duplicated->base.entry.include_depth = entry->include_depth;
80
+ duplicated->base.free = git_config_list_entry_free;
81
+ duplicated->config_list = config_list;
82
+
83
+ if ((error = git_config_list_append(config_list, duplicated)) < 0)
84
+ goto out;
85
+
86
+ out:
87
+ if (error && duplicated) {
88
+ git__free((char *) duplicated->base.entry.name);
89
+ git__free((char *) duplicated->base.entry.value);
90
+ git__free(duplicated);
91
+ }
92
+ return error;
93
+ }
94
+
95
+ int git_config_list_dup(git_config_list **out, git_config_list *config_list)
96
+ {
97
+ git_config_list *result = NULL;
98
+ config_entry_list *head;
99
+ int error;
100
+
101
+ if ((error = git_config_list_new(&result)) < 0)
102
+ goto out;
103
+
104
+ for (head = config_list->entries; head; head = head->next)
105
+ if ((git_config_list_dup_entry(result, &head->entry->base.entry)) < 0)
106
+ goto out;
107
+
108
+ *out = result;
109
+ result = NULL;
110
+
111
+ out:
112
+ git_config_list_free(result);
113
+ return error;
114
+ }
115
+
116
+ void git_config_list_incref(git_config_list *config_list)
117
+ {
118
+ GIT_REFCOUNT_INC(config_list);
119
+ }
120
+
121
+ static void config_list_free(git_config_list *config_list)
122
+ {
123
+ config_entry_list *entry_list = NULL, *next;
124
+ config_entry_map_head *head;
125
+ char *str;
126
+ git_hashmap_iter_t iter = GIT_HASHMAP_ITER_INIT;
127
+
128
+ while (git_config_list_pathmap_iterate(&iter, NULL, &str, &config_list->strings) == 0)
129
+ git__free(str);
130
+
131
+ git_config_list_pathmap_dispose(&config_list->strings);
132
+
133
+ iter = GIT_HASHMAP_ITER_INIT;
134
+ while (git_config_list_headmap_iterate(&iter, NULL, &head, &config_list->map) == 0) {
135
+ git__free((char *) head->entry->base.entry.name);
136
+ git__free(head);
137
+ }
138
+ git_config_list_headmap_dispose(&config_list->map);
139
+
140
+ entry_list = config_list->entries;
141
+ while (entry_list != NULL) {
142
+ next = entry_list->next;
143
+ git__free((char *) entry_list->entry->base.entry.value);
144
+ git__free(entry_list->entry);
145
+ git__free(entry_list);
146
+ entry_list = next;
147
+ }
148
+
149
+ git__free(config_list);
150
+ }
151
+
152
+ void git_config_list_free(git_config_list *config_list)
153
+ {
154
+ if (config_list)
155
+ GIT_REFCOUNT_DEC(config_list, config_list_free);
156
+ }
157
+
158
+ int git_config_list_append(git_config_list *config_list, git_config_list_entry *entry)
159
+ {
160
+ config_entry_list *list_head;
161
+ config_entry_map_head *map_head;
162
+
163
+ if (git_config_list_headmap_get(&map_head, &config_list->map, entry->base.entry.name) == 0) {
164
+ map_head->multivar = true;
165
+ /*
166
+ * This is a micro-optimization for configuration files
167
+ * with a lot of same keys. As for multivars the entry's
168
+ * key will be the same for all list, we can just free
169
+ * all except the first entry's name and just re-use it.
170
+ */
171
+ git__free((char *) entry->base.entry.name);
172
+ entry->base.entry.name = map_head->entry->base.entry.name;
173
+ } else {
174
+ map_head = git__calloc(1, sizeof(*map_head));
175
+ if ((git_config_list_headmap_put(&config_list->map, entry->base.entry.name, map_head)) < 0)
176
+ return -1;
177
+ }
178
+ map_head->entry = entry;
179
+
180
+ list_head = git__calloc(1, sizeof(config_entry_list));
181
+ GIT_ERROR_CHECK_ALLOC(list_head);
182
+ list_head->entry = entry;
183
+
184
+ if (config_list->entries)
185
+ config_list->entries->last->next = list_head;
186
+ else
187
+ config_list->entries = list_head;
188
+ config_list->entries->last = list_head;
189
+
190
+ return 0;
191
+ }
192
+
193
+ int git_config_list_get(git_config_list_entry **out, git_config_list *config_list, const char *key)
194
+ {
195
+ config_entry_map_head *entry;
196
+
197
+ if (git_config_list_headmap_get(&entry, &config_list->map, key) != 0)
198
+ return GIT_ENOTFOUND;
199
+
200
+ *out = entry->entry;
201
+ return 0;
202
+ }
203
+
204
+ int git_config_list_get_unique(git_config_list_entry **out, git_config_list *config_list, const char *key)
205
+ {
206
+ config_entry_map_head *entry;
207
+
208
+ if (git_config_list_headmap_get(&entry, &config_list->map, key) != 0)
209
+ return GIT_ENOTFOUND;
210
+
211
+ if (entry->multivar) {
212
+ git_error_set(GIT_ERROR_CONFIG, "entry is not unique due to being a multivar");
213
+ return -1;
214
+ }
215
+
216
+ if (entry->entry->base.entry.include_depth) {
217
+ git_error_set(GIT_ERROR_CONFIG, "entry is not unique due to being included");
218
+ return -1;
219
+ }
220
+
221
+ *out = entry->entry;
222
+ return 0;
223
+ }
224
+
225
+ static void config_iterator_free(git_config_iterator *iter)
226
+ {
227
+ config_list_iterator *it = (config_list_iterator *) iter;
228
+ git_config_list_free(it->list);
229
+ git__free(it);
230
+ }
231
+
232
+ static int config_iterator_next(
233
+ git_config_backend_entry **entry,
234
+ git_config_iterator *iter)
235
+ {
236
+ config_list_iterator *it = (config_list_iterator *) iter;
237
+
238
+ if (!it->head)
239
+ return GIT_ITEROVER;
240
+
241
+ *entry = &it->head->entry->base;
242
+ it->head = it->head->next;
243
+
244
+ return 0;
245
+ }
246
+
247
+ int git_config_list_iterator_new(git_config_iterator **out, git_config_list *config_list)
248
+ {
249
+ config_list_iterator *it;
250
+
251
+ it = git__calloc(1, sizeof(config_list_iterator));
252
+ GIT_ERROR_CHECK_ALLOC(it);
253
+ it->parent.next = config_iterator_next;
254
+ it->parent.free = config_iterator_free;
255
+ it->head = config_list->entries;
256
+ it->list = config_list;
257
+
258
+ git_config_list_incref(config_list);
259
+ *out = &it->parent;
260
+
261
+ return 0;
262
+ }
263
+
264
+ /* release the map containing the entry as an equivalent to freeing it */
265
+ void git_config_list_entry_free(git_config_backend_entry *e)
266
+ {
267
+ git_config_list_entry *entry = (git_config_list_entry *)e;
268
+ git_config_list_free(entry->config_list);
269
+ }
270
+
271
+ const char *git_config_list_add_string(
272
+ git_config_list *config_list,
273
+ const char *str)
274
+ {
275
+ char *s;
276
+
277
+ if (git_config_list_pathmap_get(&s, &config_list->strings, str) == 0)
278
+ return s;
279
+
280
+ if ((s = git__strdup(str)) == NULL ||
281
+ git_config_list_pathmap_put(&config_list->strings, s, s) < 0)
282
+ return NULL;
283
+
284
+ return s;
285
+ }
@@ -0,0 +1,32 @@
1
+ /*
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
+ *
4
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
5
+ * a Linking Exception. For full terms see the included COPYING file.
6
+ */
7
+
8
+ #include "common.h"
9
+
10
+ #include "git2/sys/config.h"
11
+ #include "config.h"
12
+
13
+ typedef struct git_config_list git_config_list;
14
+
15
+ typedef struct {
16
+ git_config_backend_entry base;
17
+ git_config_list *config_list;
18
+ } git_config_list_entry;
19
+
20
+ int git_config_list_new(git_config_list **out);
21
+ int git_config_list_dup(git_config_list **out, git_config_list *list);
22
+ int git_config_list_dup_entry(git_config_list *list, const git_config_entry *entry);
23
+ void git_config_list_incref(git_config_list *list);
24
+ void git_config_list_free(git_config_list *list);
25
+ /* Add or append the new config option */
26
+ int git_config_list_append(git_config_list *list, git_config_list_entry *entry);
27
+ int git_config_list_get(git_config_list_entry **out, git_config_list *list, const char *key);
28
+ int git_config_list_get_unique(git_config_list_entry **out, git_config_list *list, const char *key);
29
+ int git_config_list_iterator_new(git_config_iterator **out, git_config_list *list);
30
+ const char *git_config_list_add_string(git_config_list *list, const char *str);
31
+
32
+ void git_config_list_entry_free(git_config_backend_entry *entry);
@@ -9,16 +9,29 @@
9
9
 
10
10
  #include "config_backend.h"
11
11
  #include "config_parse.h"
12
- #include "config_entries.h"
12
+ #include "config_list.h"
13
+ #include "strlist.h"
13
14
 
14
15
  typedef struct {
15
16
  git_config_backend parent;
16
- git_config_entries *entries;
17
+
18
+ char *backend_type;
19
+ char *origin_path;
20
+
21
+ git_config_list *config_list;
22
+
23
+ /* Configuration data in the config file format */
17
24
  git_str cfg;
25
+
26
+ /* Array of key=value pairs */
27
+ char **values;
28
+ size_t values_len;
18
29
  } config_memory_backend;
19
30
 
20
31
  typedef struct {
21
- git_config_entries *entries;
32
+ const char *backend_type;
33
+ const char *origin_path;
34
+ git_config_list *config_list;
22
35
  git_config_level_t level;
23
36
  } config_memory_parse_data;
24
37
 
@@ -39,7 +52,7 @@ static int read_variable_cb(
39
52
  {
40
53
  config_memory_parse_data *parse_data = (config_memory_parse_data *) payload;
41
54
  git_str buf = GIT_STR_INIT;
42
- git_config_entry *entry;
55
+ git_config_list_entry *entry;
43
56
  const char *c;
44
57
  int result;
45
58
 
@@ -62,35 +75,46 @@ static int read_variable_cb(
62
75
  if (git_str_oom(&buf))
63
76
  return -1;
64
77
 
65
- entry = git__calloc(1, sizeof(git_config_entry));
78
+ entry = git__calloc(1, sizeof(git_config_list_entry));
66
79
  GIT_ERROR_CHECK_ALLOC(entry);
67
- entry->name = git_str_detach(&buf);
68
- entry->value = var_value ? git__strdup(var_value) : NULL;
69
- entry->level = parse_data->level;
70
- entry->include_depth = 0;
71
-
72
- if ((result = git_config_entries_append(parse_data->entries, entry)) < 0)
80
+ entry->base.entry.name = git_str_detach(&buf);
81
+ entry->base.entry.value = var_value ? git__strdup(var_value) : NULL;
82
+ entry->base.entry.level = parse_data->level;
83
+ entry->base.entry.include_depth = 0;
84
+ entry->base.entry.backend_type = parse_data->backend_type;
85
+ entry->base.entry.origin_path = parse_data->origin_path;
86
+ entry->base.free = git_config_list_entry_free;
87
+ entry->config_list = parse_data->config_list;
88
+
89
+ if ((result = git_config_list_append(parse_data->config_list, entry)) < 0)
73
90
  return result;
74
91
 
75
92
  return result;
76
93
  }
77
94
 
78
- static int config_memory_open(git_config_backend *backend, git_config_level_t level, const git_repository *repo)
95
+ static int parse_config(
96
+ config_memory_backend *memory_backend,
97
+ git_config_level_t level)
79
98
  {
80
- config_memory_backend *memory_backend = (config_memory_backend *) backend;
81
99
  git_config_parser parser = GIT_PARSE_CTX_INIT;
82
100
  config_memory_parse_data parse_data;
83
101
  int error;
84
102
 
85
- GIT_UNUSED(repo);
86
-
87
- if ((error = git_config_parser_init(&parser, "in-memory", memory_backend->cfg.ptr,
88
- memory_backend->cfg.size)) < 0)
103
+ if ((error = git_config_parser_init(&parser, "in-memory",
104
+ memory_backend->cfg.ptr, memory_backend->cfg.size)) < 0)
89
105
  goto out;
90
- parse_data.entries = memory_backend->entries;
106
+
107
+ parse_data.backend_type = git_config_list_add_string(
108
+ memory_backend->config_list, memory_backend->backend_type);
109
+ parse_data.origin_path = memory_backend->origin_path ?
110
+ git_config_list_add_string(memory_backend->config_list,
111
+ memory_backend->origin_path) :
112
+ NULL;
113
+ parse_data.config_list = memory_backend->config_list;
91
114
  parse_data.level = level;
92
115
 
93
- if ((error = git_config_parse(&parser, NULL, read_variable_cb, NULL, NULL, &parse_data)) < 0)
116
+ if ((error = git_config_parse(&parser, NULL, read_variable_cb,
117
+ NULL, NULL, &parse_data)) < 0)
94
118
  goto out;
95
119
 
96
120
  out:
@@ -98,10 +122,86 @@ out:
98
122
  return error;
99
123
  }
100
124
 
101
- static int config_memory_get(git_config_backend *backend, const char *key, git_config_entry **out)
125
+ static int parse_values(
126
+ config_memory_backend *memory_backend,
127
+ git_config_level_t level)
128
+ {
129
+ git_config_list_entry *entry;
130
+ const char *eql, *backend_type, *origin_path;
131
+ size_t name_len, i;
132
+
133
+ backend_type = git_config_list_add_string(
134
+ memory_backend->config_list, memory_backend->backend_type);
135
+ GIT_ERROR_CHECK_ALLOC(backend_type);
136
+
137
+ origin_path = memory_backend->origin_path ?
138
+ git_config_list_add_string(memory_backend->config_list,
139
+ memory_backend->origin_path) :
140
+ NULL;
141
+
142
+ for (i = 0; i < memory_backend->values_len; i++) {
143
+ eql = strchr(memory_backend->values[i], '=');
144
+ name_len = eql - memory_backend->values[i];
145
+
146
+ if (name_len == 0) {
147
+ git_error_set(GIT_ERROR_CONFIG, "empty config key");
148
+ return -1;
149
+ }
150
+
151
+ entry = git__calloc(1, sizeof(git_config_list_entry));
152
+ GIT_ERROR_CHECK_ALLOC(entry);
153
+
154
+ entry->base.entry.name = git__strndup(memory_backend->values[i], name_len);
155
+ GIT_ERROR_CHECK_ALLOC(entry->base.entry.name);
156
+
157
+ if (eql) {
158
+ entry->base.entry.value = git__strdup(eql + 1);
159
+ GIT_ERROR_CHECK_ALLOC(entry->base.entry.value);
160
+ }
161
+
162
+ entry->base.entry.level = level;
163
+ entry->base.entry.include_depth = 0;
164
+ entry->base.entry.backend_type = backend_type;
165
+ entry->base.entry.origin_path = origin_path;
166
+ entry->base.free = git_config_list_entry_free;
167
+ entry->config_list = memory_backend->config_list;
168
+
169
+ if (git_config_list_append(memory_backend->config_list, entry) < 0)
170
+ return -1;
171
+ }
172
+
173
+ return 0;
174
+ }
175
+
176
+ static int config_memory_open(git_config_backend *backend, git_config_level_t level, const git_repository *repo)
177
+ {
178
+ config_memory_backend *memory_backend = (config_memory_backend *) backend;
179
+
180
+ GIT_UNUSED(repo);
181
+
182
+ if (memory_backend->cfg.size > 0 &&
183
+ parse_config(memory_backend, level) < 0)
184
+ return -1;
185
+
186
+ if (memory_backend->values_len > 0 &&
187
+ parse_values(memory_backend, level) < 0)
188
+ return -1;
189
+
190
+ return 0;
191
+ }
192
+
193
+ static int config_memory_get(git_config_backend *backend, const char *key, git_config_backend_entry **out)
102
194
  {
103
195
  config_memory_backend *memory_backend = (config_memory_backend *) backend;
104
- return git_config_entries_get(out, memory_backend->entries, key);
196
+ git_config_list_entry *entry;
197
+ int error;
198
+
199
+ if ((error = git_config_list_get(&entry, memory_backend->config_list, key)) != 0)
200
+ return error;
201
+
202
+ git_config_list_incref(memory_backend->config_list);
203
+ *out = &entry->base;
204
+ return 0;
105
205
  }
106
206
 
107
207
  static int config_memory_iterator(
@@ -109,18 +209,18 @@ static int config_memory_iterator(
109
209
  git_config_backend *backend)
110
210
  {
111
211
  config_memory_backend *memory_backend = (config_memory_backend *) backend;
112
- git_config_entries *entries;
212
+ git_config_list *config_list;
113
213
  int error;
114
214
 
115
- if ((error = git_config_entries_dup(&entries, memory_backend->entries)) < 0)
215
+ if ((error = git_config_list_dup(&config_list, memory_backend->config_list)) < 0)
116
216
  goto out;
117
217
 
118
- if ((error = git_config_entries_iterator_new(iter, entries)) < 0)
218
+ if ((error = git_config_list_iterator_new(iter, config_list)) < 0)
119
219
  goto out;
120
220
 
121
221
  out:
122
- /* Let iterator delete duplicated entries when it's done */
123
- git_config_entries_free(entries);
222
+ /* Let iterator delete duplicated config_list when it's done */
223
+ git_config_list_free(config_list);
124
224
  return error;
125
225
  }
126
226
 
@@ -177,28 +277,24 @@ static void config_memory_free(git_config_backend *_backend)
177
277
  if (backend == NULL)
178
278
  return;
179
279
 
180
- git_config_entries_free(backend->entries);
280
+ git__free(backend->origin_path);
281
+ git__free(backend->backend_type);
282
+ git_config_list_free(backend->config_list);
283
+ git_strlist_free(backend->values, backend->values_len);
181
284
  git_str_dispose(&backend->cfg);
182
285
  git__free(backend);
183
286
  }
184
287
 
185
- int git_config_backend_from_string(git_config_backend **out, const char *cfg, size_t len)
288
+ static config_memory_backend *config_backend_new(
289
+ git_config_backend_memory_options *opts)
186
290
  {
187
291
  config_memory_backend *backend;
188
292
 
189
- backend = git__calloc(1, sizeof(config_memory_backend));
190
- GIT_ERROR_CHECK_ALLOC(backend);
293
+ if ((backend = git__calloc(1, sizeof(config_memory_backend))) == NULL)
294
+ return NULL;
191
295
 
192
- if (git_config_entries_new(&backend->entries) < 0) {
193
- git__free(backend);
194
- return -1;
195
- }
196
-
197
- if (git_str_set(&backend->cfg, cfg, len) < 0) {
198
- git_config_entries_free(backend->entries);
199
- git__free(backend);
200
- return -1;
201
- }
296
+ if (git_config_list_new(&backend->config_list) < 0)
297
+ goto on_error;
202
298
 
203
299
  backend->parent.version = GIT_CONFIG_BACKEND_VERSION;
204
300
  backend->parent.readonly = 1;
@@ -214,7 +310,66 @@ int git_config_backend_from_string(git_config_backend **out, const char *cfg, si
214
310
  backend->parent.snapshot = git_config_backend_snapshot;
215
311
  backend->parent.free = config_memory_free;
216
312
 
313
+ backend->backend_type = git__strdup(opts && opts->backend_type ?
314
+ opts->backend_type : "in-memory");
315
+
316
+ if (backend->backend_type == NULL)
317
+ goto on_error;
318
+
319
+ if (opts && opts->origin_path &&
320
+ (backend->origin_path = git__strdup(opts->origin_path)) == NULL)
321
+ goto on_error;
322
+
323
+ return backend;
324
+
325
+ on_error:
326
+ git_config_list_free(backend->config_list);
327
+ git__free(backend->origin_path);
328
+ git__free(backend->backend_type);
329
+ git__free(backend);
330
+ return NULL;
331
+ }
332
+
333
+ int git_config_backend_from_string(
334
+ git_config_backend **out,
335
+ const char *cfg,
336
+ size_t len,
337
+ git_config_backend_memory_options *opts)
338
+ {
339
+ config_memory_backend *backend;
340
+
341
+ if ((backend = config_backend_new(opts)) == NULL)
342
+ return -1;
343
+
344
+ if (git_str_set(&backend->cfg, cfg, len) < 0) {
345
+ git_config_list_free(backend->config_list);
346
+ git__free(backend);
347
+ return -1;
348
+ }
349
+
217
350
  *out = (git_config_backend *)backend;
351
+ return 0;
352
+ }
353
+
354
+ int git_config_backend_from_values(
355
+ git_config_backend **out,
356
+ const char **values,
357
+ size_t len,
358
+ git_config_backend_memory_options *opts)
359
+ {
360
+ config_memory_backend *backend;
218
361
 
362
+ if ((backend = config_backend_new(opts)) == NULL)
363
+ return -1;
364
+
365
+ if (git_strlist_copy(&backend->values, values, len) < 0) {
366
+ git_config_list_free(backend->config_list);
367
+ git__free(backend);
368
+ return -1;
369
+ }
370
+
371
+ backend->values_len = len;
372
+
373
+ *out = (git_config_backend *)backend;
219
374
  return 0;
220
375
  }
@@ -25,9 +25,9 @@ static void set_parse_error(git_config_parser *reader, int col, const char *erro
25
25
  }
26
26
 
27
27
 
28
- GIT_INLINE(int) config_keychar(int c)
28
+ GIT_INLINE(int) config_keychar(char c)
29
29
  {
30
- return isalnum(c) || c == '-';
30
+ return git__isalnum(c) || c == '-';
31
31
  }
32
32
 
33
33
  static int strip_comments(char *line, int in_quotes)
@@ -158,9 +158,10 @@ end_error:
158
158
  static int parse_section_header(git_config_parser *reader, char **section_out)
159
159
  {
160
160
  char *name, *name_end;
161
- int name_length, c, pos;
161
+ int name_length, pos;
162
162
  int result;
163
163
  char *line;
164
+ char c;
164
165
  size_t line_len;
165
166
 
166
167
  git_parse_advance_ws(&reader->ctx);
@@ -279,10 +280,10 @@ static int skip_bom(git_parse_ctx *parser)
279
280
  */
280
281
 
281
282
  /* '\"' -> '"' etc */
282
- static int unescape_line(
283
- char **out, bool *is_multi, const char *ptr, int quote_count)
283
+ static int unescape_line(char **out, bool *is_multi, const char *ptr, int *quote_count)
284
284
  {
285
- char *str, *fixed, *esc;
285
+ char *str, *fixed;
286
+ const char *esc;
286
287
  size_t ptr_len = strlen(ptr), alloc_len;
287
288
 
288
289
  *is_multi = false;
@@ -296,7 +297,8 @@ static int unescape_line(
296
297
 
297
298
  while (*ptr != '\0') {
298
299
  if (*ptr == '"') {
299
- quote_count++;
300
+ if (quote_count)
301
+ (*quote_count)++;
300
302
  } else if (*ptr != '\\') {
301
303
  *fixed++ = *ptr;
302
304
  } else {
@@ -358,7 +360,7 @@ static int parse_multiline_variable(git_config_parser *reader, git_str *value, i
358
360
  goto next;
359
361
 
360
362
  if ((error = unescape_line(&proc_line, &multiline,
361
- line, in_quotes)) < 0)
363
+ line, &in_quotes)) < 0)
362
364
  goto out;
363
365
 
364
366
  /* Add this line to the multiline var */
@@ -382,7 +384,7 @@ out:
382
384
 
383
385
  GIT_INLINE(bool) is_namechar(char c)
384
386
  {
385
- return isalnum(c) || c == '-';
387
+ return git__isalnum(c) || c == '-';
386
388
  }
387
389
 
388
390
  static int parse_name(
@@ -445,7 +447,7 @@ static int parse_variable(git_config_parser *reader, char **var_name, char **var
445
447
  while (git__isspace(value_start[0]))
446
448
  value_start++;
447
449
 
448
- if ((error = unescape_line(&value, &multiline, value_start, 0)) < 0)
450
+ if ((error = unescape_line(&value, &multiline, value_start, NULL)) < 0)
449
451
  goto out;
450
452
 
451
453
  if (multiline) {