rugged 1.6.3 → 1.9.0

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 (443) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/rugged_allocator.c +0 -54
  3. data/lib/rugged/version.rb +1 -1
  4. data/vendor/libgit2/AUTHORS +1 -0
  5. data/vendor/libgit2/CMakeLists.txt +25 -17
  6. data/vendor/libgit2/COPYING +195 -1
  7. data/vendor/libgit2/cmake/CheckPrototypeDefinitionSafe.cmake +16 -0
  8. data/vendor/libgit2/cmake/{FindIconv.cmake → FindIntlIconv.cmake} +6 -0
  9. data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
  10. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +4 -4
  11. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +23 -8
  12. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +34 -6
  13. data/vendor/libgit2/cmake/SelectHashes.cmake +32 -11
  14. data/vendor/libgit2/cmake/SelectRegex.cmake +6 -1
  15. data/vendor/libgit2/cmake/SelectSSH.cmake +22 -17
  16. data/vendor/libgit2/cmake/SelectXdiff.cmake +9 -0
  17. data/vendor/libgit2/cmake/SelectZlib.cmake +4 -0
  18. data/vendor/libgit2/deps/llhttp/CMakeLists.txt +8 -0
  19. data/vendor/libgit2/deps/llhttp/LICENSE-MIT +22 -0
  20. data/vendor/libgit2/deps/llhttp/api.c +510 -0
  21. data/vendor/libgit2/deps/llhttp/http.c +170 -0
  22. data/vendor/libgit2/deps/llhttp/llhttp.c +10168 -0
  23. data/vendor/libgit2/deps/llhttp/llhttp.h +897 -0
  24. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +1 -1
  25. data/vendor/libgit2/deps/ntlmclient/crypt_builtin_md4.c +311 -0
  26. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +2 -1
  27. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +0 -20
  28. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +4 -4
  29. data/vendor/libgit2/deps/ntlmclient/ntlm.c +21 -21
  30. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +5 -4
  31. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +2 -1
  32. data/vendor/libgit2/deps/ntlmclient/utf8.h +1176 -721
  33. data/vendor/libgit2/deps/ntlmclient/util.h +11 -0
  34. data/vendor/libgit2/deps/pcre/CMakeLists.txt +1 -0
  35. data/vendor/libgit2/deps/pcre/LICENCE +5 -5
  36. data/vendor/libgit2/deps/pcre/pcre.h +2 -2
  37. data/vendor/libgit2/deps/pcre/pcre_compile.c +6 -3
  38. data/vendor/libgit2/deps/pcre/pcre_exec.c +2 -2
  39. data/vendor/libgit2/deps/xdiff/CMakeLists.txt +28 -0
  40. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/git-xdiff.h +4 -1
  41. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.c +19 -18
  42. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.h +2 -4
  43. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.c +3 -3
  44. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xhistogram.c +7 -18
  45. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmacros.h +18 -1
  46. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmerge.c +22 -20
  47. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xpatience.c +21 -30
  48. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.c +13 -30
  49. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.c +18 -1
  50. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.h +2 -1
  51. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  52. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  53. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  54. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  55. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  56. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  57. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  58. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  59. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  60. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  61. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  62. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  63. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  64. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  65. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  66. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  67. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  68. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  69. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  70. data/vendor/libgit2/include/git2/apply.h +27 -6
  71. data/vendor/libgit2/include/git2/attr.h +17 -4
  72. data/vendor/libgit2/include/git2/blame.h +133 -28
  73. data/vendor/libgit2/include/git2/blob.h +71 -28
  74. data/vendor/libgit2/include/git2/branch.h +22 -15
  75. data/vendor/libgit2/include/git2/buffer.h +6 -4
  76. data/vendor/libgit2/include/git2/cert.h +2 -1
  77. data/vendor/libgit2/include/git2/checkout.h +83 -32
  78. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  79. data/vendor/libgit2/include/git2/clone.h +25 -9
  80. data/vendor/libgit2/include/git2/commit.h +132 -3
  81. data/vendor/libgit2/include/git2/common.h +138 -56
  82. data/vendor/libgit2/include/git2/config.h +93 -23
  83. data/vendor/libgit2/include/git2/credential.h +30 -2
  84. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  85. data/vendor/libgit2/include/git2/deprecated.h +133 -3
  86. data/vendor/libgit2/include/git2/describe.h +13 -1
  87. data/vendor/libgit2/include/git2/diff.h +77 -9
  88. data/vendor/libgit2/include/git2/email.h +9 -29
  89. data/vendor/libgit2/include/git2/errors.h +49 -74
  90. data/vendor/libgit2/include/git2/filter.h +14 -7
  91. data/vendor/libgit2/include/git2/global.h +8 -1
  92. data/vendor/libgit2/include/git2/graph.h +3 -2
  93. data/vendor/libgit2/include/git2/ignore.h +10 -0
  94. data/vendor/libgit2/include/git2/index.h +100 -6
  95. data/vendor/libgit2/include/git2/indexer.h +21 -4
  96. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  97. data/vendor/libgit2/include/git2/merge.h +46 -1
  98. data/vendor/libgit2/include/git2/message.h +2 -2
  99. data/vendor/libgit2/include/git2/net.h +3 -1
  100. data/vendor/libgit2/include/git2/notes.h +9 -6
  101. data/vendor/libgit2/include/git2/object.h +9 -8
  102. data/vendor/libgit2/include/git2/odb.h +91 -49
  103. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  104. data/vendor/libgit2/include/git2/oid.h +24 -25
  105. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  106. data/vendor/libgit2/include/git2/pack.h +13 -1
  107. data/vendor/libgit2/include/git2/patch.h +2 -3
  108. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  109. data/vendor/libgit2/include/git2/proxy.h +10 -0
  110. data/vendor/libgit2/include/git2/rebase.h +9 -6
  111. data/vendor/libgit2/include/git2/refdb.h +2 -2
  112. data/vendor/libgit2/include/git2/reflog.h +3 -2
  113. data/vendor/libgit2/include/git2/refs.h +9 -6
  114. data/vendor/libgit2/include/git2/refspec.h +14 -4
  115. data/vendor/libgit2/include/git2/remote.h +112 -18
  116. data/vendor/libgit2/include/git2/repository.h +61 -15
  117. data/vendor/libgit2/include/git2/reset.h +16 -3
  118. data/vendor/libgit2/include/git2/revert.h +9 -4
  119. data/vendor/libgit2/include/git2/revparse.h +3 -3
  120. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  121. data/vendor/libgit2/include/git2/signature.h +46 -1
  122. data/vendor/libgit2/include/git2/stash.h +17 -3
  123. data/vendor/libgit2/include/git2/status.h +10 -6
  124. data/vendor/libgit2/include/git2/stdint.h +87 -85
  125. data/vendor/libgit2/include/git2/strarray.h +2 -3
  126. data/vendor/libgit2/include/git2/submodule.h +20 -9
  127. data/vendor/libgit2/include/git2/sys/alloc.h +12 -34
  128. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  129. data/vendor/libgit2/include/git2/sys/commit_graph.h +109 -58
  130. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  131. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  132. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  133. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  134. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  135. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  136. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  137. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  138. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  139. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  140. data/vendor/libgit2/include/git2/sys/midx.h +47 -4
  141. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  142. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  143. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  144. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  145. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  146. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  147. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  148. data/vendor/libgit2/include/git2/sys/stream.h +25 -2
  149. data/vendor/libgit2/include/git2/sys/transport.h +44 -5
  150. data/vendor/libgit2/include/git2/tag.h +3 -1
  151. data/vendor/libgit2/include/git2/trace.h +9 -3
  152. data/vendor/libgit2/include/git2/transaction.h +3 -2
  153. data/vendor/libgit2/include/git2/transport.h +11 -3
  154. data/vendor/libgit2/include/git2/tree.h +16 -5
  155. data/vendor/libgit2/include/git2/types.h +19 -3
  156. data/vendor/libgit2/include/git2/version.h +44 -8
  157. data/vendor/libgit2/include/git2/worktree.h +19 -7
  158. data/vendor/libgit2/src/CMakeLists.txt +40 -15
  159. data/vendor/libgit2/src/cli/CMakeLists.txt +2 -2
  160. data/vendor/libgit2/src/cli/cmd.c +1 -1
  161. data/vendor/libgit2/src/cli/cmd.h +4 -0
  162. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  163. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  164. data/vendor/libgit2/src/cli/cmd_clone.c +27 -13
  165. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  166. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  167. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  168. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  169. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  170. data/vendor/libgit2/src/cli/common.c +168 -0
  171. data/vendor/libgit2/src/cli/common.h +63 -0
  172. data/vendor/libgit2/src/cli/error.h +1 -1
  173. data/vendor/libgit2/src/cli/main.c +52 -24
  174. data/vendor/libgit2/src/cli/opt.c +29 -3
  175. data/vendor/libgit2/src/cli/opt.h +21 -3
  176. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  177. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  178. data/vendor/libgit2/src/cli/progress.c +60 -10
  179. data/vendor/libgit2/src/cli/progress.h +16 -4
  180. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  181. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  182. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  183. data/vendor/libgit2/src/libgit2/CMakeLists.txt +27 -27
  184. data/vendor/libgit2/src/libgit2/annotated_commit.c +2 -2
  185. data/vendor/libgit2/src/libgit2/annotated_commit.h +1 -1
  186. data/vendor/libgit2/src/libgit2/apply.c +14 -16
  187. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  188. data/vendor/libgit2/src/libgit2/attr_file.c +7 -2
  189. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  190. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  191. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  192. data/vendor/libgit2/src/libgit2/blame.c +152 -59
  193. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  194. data/vendor/libgit2/src/libgit2/blame_git.c +0 -1
  195. data/vendor/libgit2/src/libgit2/branch.c +2 -2
  196. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  197. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  198. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  199. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  200. data/vendor/libgit2/src/libgit2/cherrypick.c +4 -5
  201. data/vendor/libgit2/src/libgit2/clone.c +186 -164
  202. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  203. data/vendor/libgit2/src/libgit2/commit.c +123 -9
  204. data/vendor/libgit2/src/libgit2/commit_graph.c +166 -88
  205. data/vendor/libgit2/src/libgit2/commit_graph.h +21 -6
  206. data/vendor/libgit2/src/libgit2/commit_list.c +12 -5
  207. data/vendor/libgit2/src/libgit2/commit_list.h +1 -0
  208. data/vendor/libgit2/src/libgit2/config.c +394 -300
  209. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  210. data/vendor/libgit2/src/libgit2/config.h +9 -4
  211. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  212. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  213. data/vendor/libgit2/src/libgit2/config_file.c +113 -96
  214. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  215. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  216. data/vendor/libgit2/src/libgit2/config_mem.c +194 -40
  217. data/vendor/libgit2/src/libgit2/config_parse.c +10 -9
  218. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  219. data/vendor/libgit2/src/libgit2/describe.c +34 -31
  220. data/vendor/libgit2/src/libgit2/diff.c +17 -8
  221. data/vendor/libgit2/src/libgit2/diff.h +6 -6
  222. data/vendor/libgit2/src/libgit2/diff_driver.c +12 -19
  223. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  224. data/vendor/libgit2/src/libgit2/diff_file.c +7 -7
  225. data/vendor/libgit2/src/libgit2/diff_generate.c +39 -18
  226. data/vendor/libgit2/src/libgit2/diff_parse.c +22 -6
  227. data/vendor/libgit2/src/libgit2/diff_print.c +88 -13
  228. data/vendor/libgit2/src/libgit2/diff_tform.c +40 -12
  229. data/vendor/libgit2/src/libgit2/diff_xdiff.h +1 -1
  230. data/vendor/libgit2/src/libgit2/email.c +5 -3
  231. data/vendor/libgit2/src/libgit2/fetch.c +39 -9
  232. data/vendor/libgit2/src/libgit2/fetch.h +0 -2
  233. data/vendor/libgit2/src/libgit2/fetchhead.c +11 -9
  234. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  235. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  236. data/vendor/libgit2/src/libgit2/grafts.c +270 -0
  237. data/vendor/libgit2/src/libgit2/grafts.h +35 -0
  238. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  239. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  240. data/vendor/libgit2/src/libgit2/ident.c +3 -3
  241. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  242. data/vendor/libgit2/src/libgit2/index.c +392 -208
  243. data/vendor/libgit2/src/libgit2/index.h +16 -3
  244. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  245. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  246. data/vendor/libgit2/src/libgit2/indexer.c +44 -41
  247. data/vendor/libgit2/src/libgit2/iterator.c +34 -13
  248. data/vendor/libgit2/src/libgit2/iterator.h +3 -0
  249. data/vendor/libgit2/src/libgit2/libgit2.c +155 -331
  250. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  251. data/vendor/libgit2/src/libgit2/merge.c +56 -46
  252. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  253. data/vendor/libgit2/src/libgit2/merge_file.c +0 -2
  254. data/vendor/libgit2/src/libgit2/midx.c +86 -44
  255. data/vendor/libgit2/src/libgit2/midx.h +13 -3
  256. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  257. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  258. data/vendor/libgit2/src/libgit2/notes.c +9 -8
  259. data/vendor/libgit2/src/libgit2/object.c +42 -16
  260. data/vendor/libgit2/src/libgit2/object.h +6 -0
  261. data/vendor/libgit2/src/libgit2/odb.c +16 -9
  262. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  263. data/vendor/libgit2/src/libgit2/odb_pack.c +28 -7
  264. data/vendor/libgit2/src/libgit2/oid.c +35 -2
  265. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  266. data/vendor/libgit2/src/libgit2/oidarray.c +49 -3
  267. data/vendor/libgit2/src/libgit2/oidarray.h +5 -1
  268. data/vendor/libgit2/src/libgit2/pack-objects.c +77 -43
  269. data/vendor/libgit2/src/libgit2/pack-objects.h +17 -6
  270. data/vendor/libgit2/src/libgit2/pack.c +33 -27
  271. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  272. data/vendor/libgit2/src/libgit2/parse.c +7 -4
  273. data/vendor/libgit2/src/libgit2/parse.h +1 -1
  274. data/vendor/libgit2/src/libgit2/patch.h +7 -1
  275. data/vendor/libgit2/src/libgit2/patch_generate.c +24 -5
  276. data/vendor/libgit2/src/libgit2/patch_parse.c +18 -10
  277. data/vendor/libgit2/src/libgit2/path.c +1 -1
  278. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  279. data/vendor/libgit2/src/libgit2/push.c +81 -30
  280. data/vendor/libgit2/src/libgit2/push.h +1 -0
  281. data/vendor/libgit2/src/libgit2/reader.c +1 -1
  282. data/vendor/libgit2/src/libgit2/rebase.c +72 -84
  283. data/vendor/libgit2/src/libgit2/refdb_fs.c +146 -70
  284. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  285. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  286. data/vendor/libgit2/src/libgit2/refs.c +34 -8
  287. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  288. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  289. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  290. data/vendor/libgit2/src/libgit2/remote.c +136 -67
  291. data/vendor/libgit2/src/libgit2/remote.h +1 -0
  292. data/vendor/libgit2/src/libgit2/repository.c +789 -330
  293. data/vendor/libgit2/src/libgit2/repository.h +22 -3
  294. data/vendor/libgit2/src/libgit2/reset.c +2 -2
  295. data/vendor/libgit2/src/libgit2/revert.c +9 -13
  296. data/vendor/libgit2/src/libgit2/revparse.c +6 -3
  297. data/vendor/libgit2/src/libgit2/revwalk.c +36 -11
  298. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  299. data/vendor/libgit2/src/libgit2/settings.c +468 -0
  300. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  301. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  302. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  303. data/vendor/libgit2/src/libgit2/stash.c +9 -8
  304. data/vendor/libgit2/src/libgit2/status.c +1 -1
  305. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -61
  306. data/vendor/libgit2/src/libgit2/streams/openssl.c +40 -23
  307. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  308. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  309. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  310. data/vendor/libgit2/src/libgit2/streams/schannel.c +715 -0
  311. data/vendor/libgit2/src/libgit2/streams/schannel.h +28 -0
  312. data/vendor/libgit2/src/libgit2/streams/socket.c +237 -51
  313. data/vendor/libgit2/src/libgit2/streams/socket.h +3 -1
  314. data/vendor/libgit2/src/libgit2/streams/stransport.c +79 -19
  315. data/vendor/libgit2/src/libgit2/streams/tls.c +5 -0
  316. data/vendor/libgit2/src/libgit2/submodule.c +106 -63
  317. data/vendor/libgit2/src/libgit2/submodule.h +9 -10
  318. data/vendor/libgit2/src/libgit2/tag.c +1 -1
  319. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  320. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  321. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  322. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  323. data/vendor/libgit2/src/libgit2/transports/auth.h +1 -2
  324. data/vendor/libgit2/src/libgit2/transports/{auth_negotiate.c → auth_gssapi.c} +32 -32
  325. data/vendor/libgit2/src/libgit2/transports/auth_negotiate.h +1 -1
  326. data/vendor/libgit2/src/libgit2/transports/auth_ntlm.h +1 -1
  327. data/vendor/libgit2/src/libgit2/transports/{auth_ntlm.c → auth_ntlmclient.c} +12 -12
  328. data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +341 -0
  329. data/vendor/libgit2/src/libgit2/transports/credential.c +1 -1
  330. data/vendor/libgit2/src/libgit2/transports/git.c +7 -8
  331. data/vendor/libgit2/src/libgit2/transports/http.c +8 -4
  332. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  333. data/vendor/libgit2/src/libgit2/transports/httpclient.c +117 -72
  334. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  335. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  336. data/vendor/libgit2/src/libgit2/transports/local.c +21 -11
  337. data/vendor/libgit2/src/libgit2/transports/smart.c +50 -32
  338. data/vendor/libgit2/src/libgit2/transports/smart.h +26 -9
  339. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +139 -18
  340. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +209 -57
  341. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  342. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +347 -0
  343. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  344. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1126 -0
  345. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  346. data/vendor/libgit2/src/libgit2/transports/winhttp.c +48 -21
  347. data/vendor/libgit2/src/libgit2/tree-cache.c +26 -16
  348. data/vendor/libgit2/src/libgit2/tree-cache.h +5 -3
  349. data/vendor/libgit2/src/libgit2/tree.c +35 -27
  350. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  351. data/vendor/libgit2/src/libgit2/worktree.c +39 -27
  352. data/vendor/libgit2/src/util/CMakeLists.txt +4 -6
  353. data/vendor/libgit2/src/util/alloc.c +69 -7
  354. data/vendor/libgit2/src/util/alloc.h +34 -9
  355. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  356. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  357. data/vendor/libgit2/src/util/allocators/failalloc.c +0 -60
  358. data/vendor/libgit2/src/util/allocators/failalloc.h +0 -6
  359. data/vendor/libgit2/src/util/allocators/stdalloc.c +2 -115
  360. data/vendor/libgit2/src/util/allocators/win32_leakcheck.c +0 -68
  361. data/vendor/libgit2/src/util/array.h +24 -18
  362. data/vendor/libgit2/src/util/cc-compat.h +4 -0
  363. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  364. data/vendor/libgit2/src/util/date.c +22 -14
  365. data/vendor/libgit2/src/util/date.h +12 -0
  366. data/vendor/libgit2/src/util/errors.c +401 -0
  367. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  368. data/vendor/libgit2/src/util/filebuf.c +6 -1
  369. data/vendor/libgit2/src/util/filebuf.h +19 -6
  370. data/vendor/libgit2/src/util/fs_path.c +16 -5
  371. data/vendor/libgit2/src/util/fs_path.h +23 -0
  372. data/vendor/libgit2/src/util/futils.c +14 -10
  373. data/vendor/libgit2/src/util/futils.h +13 -4
  374. data/vendor/libgit2/src/util/git2_features.h.in +21 -4
  375. data/vendor/libgit2/src/util/git2_util.h +6 -0
  376. data/vendor/libgit2/src/util/hash/openssl.c +152 -0
  377. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  378. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  379. data/vendor/libgit2/src/util/hashmap.h +424 -0
  380. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  381. data/vendor/libgit2/src/util/integer.h +3 -1
  382. data/vendor/libgit2/src/util/net.c +318 -161
  383. data/vendor/libgit2/src/util/net.h +27 -0
  384. data/vendor/libgit2/src/util/pool.c +1 -1
  385. data/vendor/libgit2/src/util/pool.h +5 -0
  386. data/vendor/libgit2/src/util/posix.c +54 -0
  387. data/vendor/libgit2/src/util/posix.h +22 -0
  388. data/vendor/libgit2/src/util/pqueue.h +1 -1
  389. data/vendor/libgit2/src/util/process.h +222 -0
  390. data/vendor/libgit2/src/util/rand.c +6 -10
  391. data/vendor/libgit2/src/util/regexp.c +1 -1
  392. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  393. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  394. data/vendor/libgit2/src/util/staticstr.h +66 -0
  395. data/vendor/libgit2/src/util/str.c +2 -2
  396. data/vendor/libgit2/src/util/strlist.c +108 -0
  397. data/vendor/libgit2/src/util/strlist.h +36 -0
  398. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  399. data/vendor/libgit2/src/util/unix/process.c +629 -0
  400. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  401. data/vendor/libgit2/src/util/util.c +17 -12
  402. data/vendor/libgit2/src/util/util.h +28 -54
  403. data/vendor/libgit2/src/util/vector.c +3 -3
  404. data/vendor/libgit2/src/util/vector.h +2 -2
  405. data/vendor/libgit2/src/util/win32/error.c +1 -1
  406. data/vendor/libgit2/src/util/win32/path_w32.c +8 -8
  407. data/vendor/libgit2/src/util/win32/posix_w32.c +30 -7
  408. data/vendor/libgit2/src/util/win32/process.c +506 -0
  409. data/vendor/libgit2/src/util/win32/utf-conv.c +73 -75
  410. data/vendor/libgit2/src/util/win32/utf-conv.h +81 -14
  411. data/vendor/libgit2/src/util/win32/w32_util.c +1 -1
  412. metadata +72 -49
  413. data/vendor/libgit2/cmake/SelectWinHTTP.cmake +0 -17
  414. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  415. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  416. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  417. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  418. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  419. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  420. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  421. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  422. data/vendor/libgit2/src/libgit2/errors.c +0 -238
  423. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  424. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  425. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  426. data/vendor/libgit2/src/libgit2/netops.c +0 -124
  427. data/vendor/libgit2/src/libgit2/netops.h +0 -68
  428. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  429. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  430. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  431. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  432. data/vendor/libgit2/src/libgit2/threadstate.c +0 -84
  433. data/vendor/libgit2/src/libgit2/threadstate.h +0 -24
  434. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  435. data/vendor/libgit2/src/util/khash.h +0 -615
  436. data/vendor/libgit2/src/util/strmap.c +0 -100
  437. data/vendor/libgit2/src/util/strmap.h +0 -131
  438. /data/vendor/libgit2/cmake/{FindHTTPParser.cmake → FindHTTP_Parser.cmake} +0 -0
  439. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiff.h +0 -0
  440. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.h +0 -0
  441. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xinclude.h +0 -0
  442. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.h +0 -0
  443. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xtypes.h +0 -0
@@ -22,83 +22,112 @@
22
22
 
23
23
  #include <ctype.h>
24
24
 
25
+ /*
26
+ * A refcounted instance of a config_backend that can be shared across
27
+ * a configuration instance, any snapshots, and individual configuration
28
+ * levels (from `git_config_open_level`).
29
+ */
30
+ typedef struct {
31
+ git_refcount rc;
32
+ git_config_backend *backend;
33
+ } backend_instance;
34
+
35
+ /*
36
+ * An entry in the readers or writers vector in the configuration.
37
+ * This is kept separate from the refcounted instance so that different
38
+ * views of the configuration can have different notions of levels or
39
+ * write orders.
40
+ *
41
+ * (eg, a standard configuration has a priority ordering of writers, a
42
+ * snapshot has *no* writers, and an individual level has a single
43
+ * writer.)
44
+ */
45
+ typedef struct {
46
+ backend_instance *instance;
47
+ git_config_level_t level;
48
+ int write_order;
49
+ } backend_entry;
50
+
25
51
  void git_config_entry_free(git_config_entry *entry)
26
52
  {
53
+ git_config_backend_entry *be;
54
+
27
55
  if (!entry)
28
56
  return;
29
57
 
30
- entry->free(entry);
58
+ be = (git_config_backend_entry *)entry;
59
+ be->free(be);
31
60
  }
32
61
 
33
- typedef struct {
34
- git_refcount rc;
35
-
36
- git_config_backend *backend;
37
- git_config_level_t level;
38
- } backend_internal;
39
-
40
- static void backend_internal_free(backend_internal *internal)
62
+ static void backend_instance_free(backend_instance *instance)
41
63
  {
42
64
  git_config_backend *backend;
43
65
 
44
- backend = internal->backend;
66
+ backend = instance->backend;
45
67
  backend->free(backend);
46
- git__free(internal);
68
+ git__free(instance);
47
69
  }
48
70
 
49
- static void config_free(git_config *cfg)
71
+ static void config_free(git_config *config)
50
72
  {
51
73
  size_t i;
52
- backend_internal *internal;
74
+ backend_entry *entry;
53
75
 
54
- for (i = 0; i < cfg->backends.length; ++i) {
55
- internal = git_vector_get(&cfg->backends, i);
56
- GIT_REFCOUNT_DEC(internal, backend_internal_free);
76
+ git_vector_foreach(&config->readers, i, entry) {
77
+ GIT_REFCOUNT_DEC(entry->instance, backend_instance_free);
78
+ git__free(entry);
57
79
  }
58
80
 
59
- git_vector_free(&cfg->backends);
60
-
61
- git__memzero(cfg, sizeof(*cfg));
62
- git__free(cfg);
81
+ git_vector_dispose(&config->readers);
82
+ git_vector_dispose(&config->writers);
83
+ git__free(config);
63
84
  }
64
85
 
65
- void git_config_free(git_config *cfg)
86
+ void git_config_free(git_config *config)
66
87
  {
67
- if (cfg == NULL)
88
+ if (config == NULL)
68
89
  return;
69
90
 
70
- GIT_REFCOUNT_DEC(cfg, config_free);
91
+ GIT_REFCOUNT_DEC(config, config_free);
71
92
  }
72
93
 
73
- static int config_backend_cmp(const void *a, const void *b)
94
+ static int reader_cmp(const void *_a, const void *_b)
74
95
  {
75
- const backend_internal *bk_a = (const backend_internal *)(a);
76
- const backend_internal *bk_b = (const backend_internal *)(b);
96
+ const backend_entry *a = _a;
97
+ const backend_entry *b = _b;
77
98
 
78
- return bk_b->level - bk_a->level;
99
+ return b->level - a->level;
79
100
  }
80
101
 
81
- int git_config_new(git_config **out)
102
+ static int writer_cmp(const void *_a, const void *_b)
82
103
  {
83
- git_config *cfg;
104
+ const backend_entry *a = _a;
105
+ const backend_entry *b = _b;
84
106
 
85
- cfg = git__malloc(sizeof(git_config));
86
- GIT_ERROR_CHECK_ALLOC(cfg);
107
+ return b->write_order - a->write_order;
108
+ }
109
+
110
+ int git_config_new(git_config **out)
111
+ {
112
+ git_config *config;
87
113
 
88
- memset(cfg, 0x0, sizeof(git_config));
114
+ config = git__calloc(1, sizeof(git_config));
115
+ GIT_ERROR_CHECK_ALLOC(config);
89
116
 
90
- if (git_vector_init(&cfg->backends, 3, config_backend_cmp) < 0) {
91
- git__free(cfg);
117
+ if (git_vector_init(&config->readers, 8, reader_cmp) < 0 ||
118
+ git_vector_init(&config->writers, 8, writer_cmp) < 0) {
119
+ config_free(config);
92
120
  return -1;
93
121
  }
94
122
 
95
- *out = cfg;
96
- GIT_REFCOUNT_INC(cfg);
123
+ GIT_REFCOUNT_INC(config);
124
+
125
+ *out = config;
97
126
  return 0;
98
127
  }
99
128
 
100
129
  int git_config_add_file_ondisk(
101
- git_config *cfg,
130
+ git_config *config,
102
131
  const char *path,
103
132
  git_config_level_t level,
104
133
  const git_repository *repo,
@@ -108,7 +137,7 @@ int git_config_add_file_ondisk(
108
137
  struct stat st;
109
138
  int res;
110
139
 
111
- GIT_ASSERT_ARG(cfg);
140
+ GIT_ASSERT_ARG(config);
112
141
  GIT_ASSERT_ARG(path);
113
142
 
114
143
  res = p_stat(path, &st);
@@ -120,7 +149,7 @@ int git_config_add_file_ondisk(
120
149
  if (git_config_backend_from_file(&file, path) < 0)
121
150
  return -1;
122
151
 
123
- if ((res = git_config_add_backend(cfg, file, level, repo, force)) < 0) {
152
+ if ((res = git_config_add_backend(config, file, level, repo, force)) < 0) {
124
153
  /*
125
154
  * free manually; the file is not owned by the config
126
155
  * instance yet and will not be freed on cleanup
@@ -154,7 +183,7 @@ int git_config_snapshot(git_config **out, git_config *in)
154
183
  {
155
184
  int error = 0;
156
185
  size_t i;
157
- backend_internal *internal;
186
+ backend_entry *entry;
158
187
  git_config *config;
159
188
 
160
189
  *out = NULL;
@@ -162,18 +191,20 @@ int git_config_snapshot(git_config **out, git_config *in)
162
191
  if (git_config_new(&config) < 0)
163
192
  return -1;
164
193
 
165
- git_vector_foreach(&in->backends, i, internal) {
194
+ git_vector_foreach(&in->readers, i, entry) {
166
195
  git_config_backend *b;
167
196
 
168
- if ((error = internal->backend->snapshot(&b, internal->backend)) < 0)
197
+ if ((error = entry->instance->backend->snapshot(&b, entry->instance->backend)) < 0)
169
198
  break;
170
199
 
171
- if ((error = git_config_add_backend(config, b, internal->level, NULL, 0)) < 0) {
200
+ if ((error = git_config_add_backend(config, b, entry->level, NULL, 0)) < 0) {
172
201
  b->free(b);
173
202
  break;
174
203
  }
175
204
  }
176
205
 
206
+ git_config_set_writeorder(config, NULL, 0);
207
+
177
208
  if (error < 0)
178
209
  git_config_free(config);
179
210
  else
@@ -183,141 +214,162 @@ int git_config_snapshot(git_config **out, git_config *in)
183
214
  }
184
215
 
185
216
  static int find_backend_by_level(
186
- backend_internal **out,
187
- const git_config *cfg,
217
+ backend_instance **out,
218
+ const git_config *config,
188
219
  git_config_level_t level)
189
220
  {
190
- int pos = -1;
191
- backend_internal *internal;
221
+ backend_entry *entry, *found = NULL;
192
222
  size_t i;
193
223
 
194
- /* when passing GIT_CONFIG_HIGHEST_LEVEL, the idea is to get the config backend
195
- * which has the highest level. As config backends are stored in a vector
196
- * sorted by decreasing order of level, getting the backend at position 0
197
- * will do the job.
224
+ /*
225
+ * when passing GIT_CONFIG_HIGHEST_LEVEL, the idea is to get the
226
+ * config backend which has the highest level. As config backends
227
+ * are stored in a vector sorted by decreasing order of level,
228
+ * getting the backend at position 0 will do the job.
198
229
  */
199
230
  if (level == GIT_CONFIG_HIGHEST_LEVEL) {
200
- pos = 0;
231
+ found = git_vector_get(&config->readers, 0);
201
232
  } else {
202
- git_vector_foreach(&cfg->backends, i, internal) {
203
- if (internal->level == level)
204
- pos = (int)i;
233
+ git_vector_foreach(&config->readers, i, entry) {
234
+ if (entry->level == level) {
235
+ found = entry;
236
+ break;
237
+ }
205
238
  }
206
239
  }
207
240
 
208
- if (pos == -1) {
241
+ if (!found) {
209
242
  git_error_set(GIT_ERROR_CONFIG,
210
- "no configuration exists for the given level '%i'", (int)level);
243
+ "no configuration exists for the given level '%d'", level);
211
244
  return GIT_ENOTFOUND;
212
245
  }
213
246
 
214
- *out = git_vector_get(&cfg->backends, pos);
215
-
247
+ *out = found->instance;
216
248
  return 0;
217
249
  }
218
250
 
219
- static int duplicate_level(void **old_raw, void *new_raw)
251
+ static int duplicate_level(void **_old, void *_new)
220
252
  {
221
- backend_internal **old = (backend_internal **)old_raw;
253
+ backend_entry **old = (backend_entry **)_old;
222
254
 
223
- GIT_UNUSED(new_raw);
255
+ GIT_UNUSED(_new);
224
256
 
225
- git_error_set(GIT_ERROR_CONFIG, "there already exists a configuration for the given level (%i)", (int)(*old)->level);
257
+ git_error_set(GIT_ERROR_CONFIG, "configuration at level %d already exists", (*old)->level);
226
258
  return GIT_EEXISTS;
227
259
  }
228
260
 
229
261
  static void try_remove_existing_backend(
230
- git_config *cfg,
262
+ git_config *config,
231
263
  git_config_level_t level)
232
264
  {
233
- int pos = -1;
234
- backend_internal *internal;
265
+ backend_entry *entry, *found = NULL;
235
266
  size_t i;
236
267
 
237
- git_vector_foreach(&cfg->backends, i, internal) {
238
- if (internal->level == level)
239
- pos = (int)i;
268
+ git_vector_foreach(&config->readers, i, entry) {
269
+ if (entry->level == level) {
270
+ git_vector_remove(&config->readers, i);
271
+ found = entry;
272
+ break;
273
+ }
240
274
  }
241
275
 
242
- if (pos == -1)
276
+ if (!found)
243
277
  return;
244
278
 
245
- internal = git_vector_get(&cfg->backends, pos);
246
-
247
- if (git_vector_remove(&cfg->backends, pos) < 0)
248
- return;
279
+ git_vector_foreach(&config->writers, i, entry) {
280
+ if (entry->level == level) {
281
+ git_vector_remove(&config->writers, i);
282
+ break;
283
+ }
284
+ }
249
285
 
250
- GIT_REFCOUNT_DEC(internal, backend_internal_free);
286
+ GIT_REFCOUNT_DEC(found->instance, backend_instance_free);
287
+ git__free(found);
251
288
  }
252
289
 
253
- static int git_config__add_internal(
254
- git_config *cfg,
255
- backend_internal *internal,
290
+ static int git_config__add_instance(
291
+ git_config *config,
292
+ backend_instance *instance,
256
293
  git_config_level_t level,
257
294
  int force)
258
295
  {
296
+ backend_entry *entry;
259
297
  int result;
260
298
 
261
299
  /* delete existing config backend for level if it exists */
262
300
  if (force)
263
- try_remove_existing_backend(cfg, level);
301
+ try_remove_existing_backend(config, level);
264
302
 
265
- if ((result = git_vector_insert_sorted(&cfg->backends,
266
- internal, &duplicate_level)) < 0)
267
- return result;
303
+ entry = git__malloc(sizeof(backend_entry));
304
+ GIT_ERROR_CHECK_ALLOC(entry);
268
305
 
269
- git_vector_sort(&cfg->backends);
270
- internal->backend->cfg = cfg;
306
+ entry->instance = instance;
307
+ entry->level = level;
308
+ entry->write_order = level;
271
309
 
272
- GIT_REFCOUNT_INC(internal);
310
+ if ((result = git_vector_insert_sorted(&config->readers,
311
+ entry, &duplicate_level)) < 0 ||
312
+ (result = git_vector_insert_sorted(&config->writers,
313
+ entry, NULL)) < 0) {
314
+ git__free(entry);
315
+ return result;
316
+ }
317
+
318
+ GIT_REFCOUNT_INC(entry->instance);
273
319
 
274
320
  return 0;
275
321
  }
276
322
 
277
- int git_config_open_global(git_config **cfg_out, git_config *cfg)
323
+ int git_config_open_global(git_config **out, git_config *config)
278
324
  {
279
- if (!git_config_open_level(cfg_out, cfg, GIT_CONFIG_LEVEL_XDG))
325
+ int error;
326
+
327
+ error = git_config_open_level(out, config, GIT_CONFIG_LEVEL_XDG);
328
+
329
+ if (error == 0)
280
330
  return 0;
331
+ else if (error != GIT_ENOTFOUND)
332
+ return error;
281
333
 
282
- return git_config_open_level(cfg_out, cfg, GIT_CONFIG_LEVEL_GLOBAL);
334
+ return git_config_open_level(out, config, GIT_CONFIG_LEVEL_GLOBAL);
283
335
  }
284
336
 
285
337
  int git_config_open_level(
286
- git_config **cfg_out,
287
- const git_config *cfg_parent,
338
+ git_config **out,
339
+ const git_config *parent,
288
340
  git_config_level_t level)
289
341
  {
290
- git_config *cfg;
291
- backend_internal *internal;
342
+ git_config *config;
343
+ backend_instance *instance;
292
344
  int res;
293
345
 
294
- if ((res = find_backend_by_level(&internal, cfg_parent, level)) < 0)
346
+ if ((res = find_backend_by_level(&instance, parent, level)) < 0)
295
347
  return res;
296
348
 
297
- if ((res = git_config_new(&cfg)) < 0)
349
+ if ((res = git_config_new(&config)) < 0)
298
350
  return res;
299
351
 
300
- if ((res = git_config__add_internal(cfg, internal, level, true)) < 0) {
301
- git_config_free(cfg);
352
+ if ((res = git_config__add_instance(config, instance, level, true)) < 0) {
353
+ git_config_free(config);
302
354
  return res;
303
355
  }
304
356
 
305
- *cfg_out = cfg;
357
+ *out = config;
306
358
 
307
359
  return 0;
308
360
  }
309
361
 
310
362
  int git_config_add_backend(
311
- git_config *cfg,
363
+ git_config *config,
312
364
  git_config_backend *backend,
313
365
  git_config_level_t level,
314
366
  const git_repository *repo,
315
367
  int force)
316
368
  {
317
- backend_internal *internal;
369
+ backend_instance *instance;
318
370
  int result;
319
371
 
320
- GIT_ASSERT_ARG(cfg);
372
+ GIT_ASSERT_ARG(config);
321
373
  GIT_ASSERT_ARG(backend);
322
374
 
323
375
  GIT_ERROR_CHECK_VERSION(backend, GIT_CONFIG_BACKEND_VERSION, "git_config_backend");
@@ -325,22 +377,50 @@ int git_config_add_backend(
325
377
  if ((result = backend->open(backend, level, repo)) < 0)
326
378
  return result;
327
379
 
328
- internal = git__malloc(sizeof(backend_internal));
329
- GIT_ERROR_CHECK_ALLOC(internal);
330
-
331
- memset(internal, 0x0, sizeof(backend_internal));
380
+ instance = git__calloc(1, sizeof(backend_instance));
381
+ GIT_ERROR_CHECK_ALLOC(instance);
332
382
 
333
- internal->backend = backend;
334
- internal->level = level;
383
+ instance->backend = backend;
384
+ instance->backend->cfg = config;
335
385
 
336
- if ((result = git_config__add_internal(cfg, internal, level, force)) < 0) {
337
- git__free(internal);
386
+ if ((result = git_config__add_instance(config, instance, level, force)) < 0) {
387
+ git__free(instance);
338
388
  return result;
339
389
  }
340
390
 
341
391
  return 0;
342
392
  }
343
393
 
394
+ int git_config_set_writeorder(
395
+ git_config *config,
396
+ git_config_level_t *levels,
397
+ size_t len)
398
+ {
399
+ backend_entry *entry;
400
+ size_t i, j;
401
+
402
+ GIT_ASSERT(len < INT_MAX);
403
+
404
+ git_vector_foreach(&config->readers, i, entry) {
405
+ bool found = false;
406
+
407
+ for (j = 0; j < len; j++) {
408
+ if (levels[j] == entry->level) {
409
+ entry->write_order = (int)j;
410
+ found = true;
411
+ break;
412
+ }
413
+ }
414
+
415
+ if (!found)
416
+ entry->write_order = -1;
417
+ }
418
+
419
+ git_vector_sort(&config->writers);
420
+
421
+ return 0;
422
+ }
423
+
344
424
  /*
345
425
  * Loop over all the variables
346
426
  */
@@ -348,37 +428,24 @@ int git_config_add_backend(
348
428
  typedef struct {
349
429
  git_config_iterator parent;
350
430
  git_config_iterator *current;
351
- const git_config *cfg;
431
+ const git_config *config;
352
432
  git_regexp regex;
353
433
  size_t i;
354
434
  } all_iter;
355
435
 
356
- static int find_next_backend(size_t *out, const git_config *cfg, size_t i)
357
- {
358
- backend_internal *internal;
359
-
360
- for (; i > 0; --i) {
361
- internal = git_vector_get(&cfg->backends, i - 1);
362
- if (!internal || !internal->backend)
363
- continue;
364
-
365
- *out = i;
366
- return 0;
367
- }
368
-
369
- return -1;
370
- }
371
-
372
- static int all_iter_next(git_config_entry **entry, git_config_iterator *_iter)
436
+ static int all_iter_next(
437
+ git_config_backend_entry **out,
438
+ git_config_iterator *_iter)
373
439
  {
374
440
  all_iter *iter = (all_iter *) _iter;
375
- backend_internal *internal;
441
+ backend_entry *entry;
376
442
  git_config_backend *backend;
377
- size_t i;
443
+ git_config_backend_entry *be;
378
444
  int error = 0;
379
445
 
380
446
  if (iter->current != NULL &&
381
- (error = iter->current->next(entry, iter->current)) == 0) {
447
+ (error = iter->current->next(&be, iter->current)) == 0) {
448
+ *out = be;
382
449
  return 0;
383
450
  }
384
451
 
@@ -386,25 +453,32 @@ static int all_iter_next(git_config_entry **entry, git_config_iterator *_iter)
386
453
  return error;
387
454
 
388
455
  do {
389
- if (find_next_backend(&i, iter->cfg, iter->i) < 0)
456
+ if (iter->i == 0)
390
457
  return GIT_ITEROVER;
391
458
 
392
- internal = git_vector_get(&iter->cfg->backends, i - 1);
393
- backend = internal->backend;
394
- iter->i = i - 1;
459
+ entry = git_vector_get(&iter->config->readers, iter->i - 1);
460
+ GIT_ASSERT(entry && entry->instance && entry->instance->backend);
461
+
462
+ backend = entry->instance->backend;
463
+ iter->i--;
395
464
 
396
465
  if (iter->current)
397
466
  iter->current->free(iter->current);
398
467
 
399
468
  iter->current = NULL;
400
469
  error = backend->iterator(&iter->current, backend);
470
+
401
471
  if (error == GIT_ENOTFOUND)
402
472
  continue;
403
473
 
404
474
  if (error < 0)
405
475
  return error;
406
476
 
407
- error = iter->current->next(entry, iter->current);
477
+ if ((error = iter->current->next(&be, iter->current)) == 0) {
478
+ *out = be;
479
+ return 0;
480
+ }
481
+
408
482
  /* If this backend is empty, then keep going */
409
483
  if (error == GIT_ITEROVER)
410
484
  continue;
@@ -416,18 +490,20 @@ static int all_iter_next(git_config_entry **entry, git_config_iterator *_iter)
416
490
  return GIT_ITEROVER;
417
491
  }
418
492
 
419
- static int all_iter_glob_next(git_config_entry **entry, git_config_iterator *_iter)
493
+ static int all_iter_glob_next(
494
+ git_config_backend_entry **entry,
495
+ git_config_iterator *_iter)
420
496
  {
421
497
  int error;
422
498
  all_iter *iter = (all_iter *) _iter;
423
499
 
424
500
  /*
425
501
  * We use the "normal" function to grab the next one across
426
- * backends and then apply the regex
502
+ * readers and then apply the regex
427
503
  */
428
504
  while ((error = all_iter_next(entry, _iter)) == 0) {
429
505
  /* skip non-matching keys if regexp was provided */
430
- if (git_regexp_match(&iter->regex, (*entry)->name) != 0)
506
+ if (git_regexp_match(&iter->regex, (*entry)->entry.name) != 0)
431
507
  continue;
432
508
 
433
509
  /* and simply return if we like the entry's name */
@@ -455,7 +531,7 @@ static void all_iter_glob_free(git_config_iterator *_iter)
455
531
  all_iter_free(_iter);
456
532
  }
457
533
 
458
- int git_config_iterator_new(git_config_iterator **out, const git_config *cfg)
534
+ int git_config_iterator_new(git_config_iterator **out, const git_config *config)
459
535
  {
460
536
  all_iter *iter;
461
537
 
@@ -465,21 +541,21 @@ int git_config_iterator_new(git_config_iterator **out, const git_config *cfg)
465
541
  iter->parent.free = all_iter_free;
466
542
  iter->parent.next = all_iter_next;
467
543
 
468
- iter->i = cfg->backends.length;
469
- iter->cfg = cfg;
544
+ iter->i = config->readers.length;
545
+ iter->config = config;
470
546
 
471
547
  *out = (git_config_iterator *) iter;
472
548
 
473
549
  return 0;
474
550
  }
475
551
 
476
- int git_config_iterator_glob_new(git_config_iterator **out, const git_config *cfg, const char *regexp)
552
+ int git_config_iterator_glob_new(git_config_iterator **out, const git_config *config, const char *regexp)
477
553
  {
478
554
  all_iter *iter;
479
555
  int result;
480
556
 
481
557
  if (regexp == NULL)
482
- return git_config_iterator_new(out, cfg);
558
+ return git_config_iterator_new(out, config);
483
559
 
484
560
  iter = git__calloc(1, sizeof(all_iter));
485
561
  GIT_ERROR_CHECK_ALLOC(iter);
@@ -491,8 +567,8 @@ int git_config_iterator_glob_new(git_config_iterator **out, const git_config *cf
491
567
 
492
568
  iter->parent.next = all_iter_glob_next;
493
569
  iter->parent.free = all_iter_glob_free;
494
- iter->i = cfg->backends.length;
495
- iter->cfg = cfg;
570
+ iter->i = config->readers.length;
571
+ iter->config = config;
496
572
 
497
573
  *out = (git_config_iterator *) iter;
498
574
 
@@ -500,9 +576,9 @@ int git_config_iterator_glob_new(git_config_iterator **out, const git_config *cf
500
576
  }
501
577
 
502
578
  int git_config_foreach(
503
- const git_config *cfg, git_config_foreach_cb cb, void *payload)
579
+ const git_config *config, git_config_foreach_cb cb, void *payload)
504
580
  {
505
- return git_config_foreach_match(cfg, NULL, cb, payload);
581
+ return git_config_foreach_match(config, NULL, cb, payload);
506
582
  }
507
583
 
508
584
  int git_config_backend_foreach_match(
@@ -511,7 +587,7 @@ int git_config_backend_foreach_match(
511
587
  git_config_foreach_cb cb,
512
588
  void *payload)
513
589
  {
514
- git_config_entry *entry;
590
+ git_config_backend_entry *entry;
515
591
  git_config_iterator *iter;
516
592
  git_regexp regex;
517
593
  int error = 0;
@@ -529,11 +605,11 @@ int git_config_backend_foreach_match(
529
605
 
530
606
  while (!(iter->next(&entry, iter) < 0)) {
531
607
  /* skip non-matching keys if regexp was provided */
532
- if (regexp && git_regexp_match(&regex, entry->name) != 0)
608
+ if (regexp && git_regexp_match(&regex, entry->entry.name) != 0)
533
609
  continue;
534
610
 
535
611
  /* abort iterator on non-zero return value */
536
- if ((error = cb(entry, payload)) != 0) {
612
+ if ((error = cb(&entry->entry, payload)) != 0) {
537
613
  git_error_set_after_callback(error);
538
614
  break;
539
615
  }
@@ -548,7 +624,7 @@ int git_config_backend_foreach_match(
548
624
  }
549
625
 
550
626
  int git_config_foreach_match(
551
- const git_config *cfg,
627
+ const git_config *config,
552
628
  const char *regexp,
553
629
  git_config_foreach_cb cb,
554
630
  void *payload)
@@ -557,7 +633,7 @@ int git_config_foreach_match(
557
633
  git_config_iterator *iter;
558
634
  git_config_entry *entry;
559
635
 
560
- if ((error = git_config_iterator_glob_new(&iter, cfg, regexp)) < 0)
636
+ if ((error = git_config_iterator_glob_new(&iter, config, regexp)) < 0)
561
637
  return error;
562
638
 
563
639
  while (!(error = git_config_next(&entry, iter))) {
@@ -579,72 +655,59 @@ int git_config_foreach_match(
579
655
  * Setters
580
656
  **************/
581
657
 
582
- typedef enum {
583
- BACKEND_USE_SET,
584
- BACKEND_USE_DELETE
585
- } backend_use;
586
-
587
- static const char *uses[] = {
588
- "set",
589
- "delete"
590
- };
591
-
592
- static int get_backend_for_use(git_config_backend **out,
593
- git_config *cfg, const char *name, backend_use use)
594
- {
658
+ static backend_instance *get_writer_instance(git_config *config)
659
+ {
660
+ backend_entry *entry;
595
661
  size_t i;
596
- backend_internal *backend;
597
662
 
598
- *out = NULL;
663
+ git_vector_foreach(&config->writers, i, entry) {
664
+ if (entry->instance->backend->readonly)
665
+ continue;
599
666
 
600
- if (git_vector_length(&cfg->backends) == 0) {
601
- git_error_set(GIT_ERROR_CONFIG,
602
- "cannot %s value for '%s' when no config backends exist",
603
- uses[use], name);
604
- return GIT_ENOTFOUND;
605
- }
667
+ if (entry->write_order < 0)
668
+ continue;
606
669
 
607
- git_vector_foreach(&cfg->backends, i, backend) {
608
- if (!backend->backend->readonly) {
609
- *out = backend->backend;
610
- return 0;
611
- }
670
+ return entry->instance;
612
671
  }
613
672
 
614
- git_error_set(GIT_ERROR_CONFIG,
615
- "cannot %s value for '%s' when all config backends are readonly",
616
- uses[use], name);
617
- return GIT_ENOTFOUND;
673
+ return NULL;
674
+ }
675
+
676
+ static git_config_backend *get_writer(git_config *config)
677
+ {
678
+ backend_instance *instance = get_writer_instance(config);
679
+
680
+ return instance ? instance->backend : NULL;
618
681
  }
619
682
 
620
- int git_config_delete_entry(git_config *cfg, const char *name)
683
+ int git_config_delete_entry(git_config *config, const char *name)
621
684
  {
622
685
  git_config_backend *backend;
623
686
 
624
- if (get_backend_for_use(&backend, cfg, name, BACKEND_USE_DELETE) < 0)
625
- return GIT_ENOTFOUND;
687
+ if ((backend = get_writer(config)) == NULL)
688
+ return GIT_EREADONLY;
626
689
 
627
690
  return backend->del(backend, name);
628
691
  }
629
692
 
630
- int git_config_set_int64(git_config *cfg, const char *name, int64_t value)
693
+ int git_config_set_int64(git_config *config, const char *name, int64_t value)
631
694
  {
632
695
  char str_value[32]; /* All numbers should fit in here */
633
696
  p_snprintf(str_value, sizeof(str_value), "%" PRId64, value);
634
- return git_config_set_string(cfg, name, str_value);
697
+ return git_config_set_string(config, name, str_value);
635
698
  }
636
699
 
637
- int git_config_set_int32(git_config *cfg, const char *name, int32_t value)
700
+ int git_config_set_int32(git_config *config, const char *name, int32_t value)
638
701
  {
639
- return git_config_set_int64(cfg, name, (int64_t)value);
702
+ return git_config_set_int64(config, name, (int64_t)value);
640
703
  }
641
704
 
642
- int git_config_set_bool(git_config *cfg, const char *name, int value)
705
+ int git_config_set_bool(git_config *config, const char *name, int value)
643
706
  {
644
- return git_config_set_string(cfg, name, value ? "true" : "false");
707
+ return git_config_set_string(config, name, value ? "true" : "false");
645
708
  }
646
709
 
647
- int git_config_set_string(git_config *cfg, const char *name, const char *value)
710
+ int git_config_set_string(git_config *config, const char *name, const char *value)
648
711
  {
649
712
  int error;
650
713
  git_config_backend *backend;
@@ -654,13 +717,15 @@ int git_config_set_string(git_config *cfg, const char *name, const char *value)
654
717
  return -1;
655
718
  }
656
719
 
657
- if (get_backend_for_use(&backend, cfg, name, BACKEND_USE_SET) < 0)
658
- return GIT_ENOTFOUND;
720
+ if ((backend = get_writer(config)) == NULL) {
721
+ git_error_set(GIT_ERROR_CONFIG, "cannot set '%s': the configuration is read-only", name);
722
+ return GIT_EREADONLY;
723
+ }
659
724
 
660
725
  error = backend->set(backend, name, value);
661
726
 
662
- if (!error && GIT_REFCOUNT_OWNER(cfg) != NULL)
663
- git_repository__configmap_lookup_cache_clear(GIT_REFCOUNT_OWNER(cfg));
727
+ if (!error && GIT_REFCOUNT_OWNER(config) != NULL)
728
+ git_repository__configmap_lookup_cache_clear(GIT_REFCOUNT_OWNER(config));
664
729
 
665
730
  return error;
666
731
  }
@@ -714,16 +779,18 @@ enum {
714
779
 
715
780
  static int get_entry(
716
781
  git_config_entry **out,
717
- const git_config *cfg,
782
+ const git_config *config,
718
783
  const char *name,
719
784
  bool normalize_name,
720
785
  int want_errors)
721
786
  {
787
+ backend_entry *entry;
788
+ git_config_backend *backend;
789
+ git_config_backend_entry *be;
722
790
  int res = GIT_ENOTFOUND;
723
791
  const char *key = name;
724
792
  char *normalized = NULL;
725
793
  size_t i;
726
- backend_internal *internal;
727
794
 
728
795
  *out = NULL;
729
796
 
@@ -734,21 +801,24 @@ static int get_entry(
734
801
  }
735
802
 
736
803
  res = GIT_ENOTFOUND;
737
- git_vector_foreach(&cfg->backends, i, internal) {
738
- if (!internal || !internal->backend)
739
- continue;
804
+ git_vector_foreach(&config->readers, i, entry) {
805
+ GIT_ASSERT(entry->instance && entry->instance->backend);
806
+
807
+ backend = entry->instance->backend;
808
+ res = backend->get(backend, key, &be);
740
809
 
741
- res = internal->backend->get(internal->backend, key, out);
742
- if (res != GIT_ENOTFOUND)
810
+ if (res != GIT_ENOTFOUND) {
811
+ *out = &be->entry;
743
812
  break;
813
+ }
744
814
  }
745
815
 
746
816
  git__free(normalized);
747
817
 
748
818
  cleanup:
749
- if (res == GIT_ENOTFOUND)
819
+ if (res == GIT_ENOTFOUND) {
750
820
  res = (want_errors > GET_ALL_ERRORS) ? 0 : config_error_notfound(name);
751
- else if (res && (want_errors == GET_NO_ERRORS)) {
821
+ } else if (res && (want_errors == GET_NO_ERRORS)) {
752
822
  git_error_clear();
753
823
  res = 0;
754
824
  }
@@ -757,24 +827,24 @@ cleanup:
757
827
  }
758
828
 
759
829
  int git_config_get_entry(
760
- git_config_entry **out, const git_config *cfg, const char *name)
830
+ git_config_entry **out, const git_config *config, const char *name)
761
831
  {
762
- return get_entry(out, cfg, name, true, GET_ALL_ERRORS);
832
+ return get_entry(out, config, name, true, GET_ALL_ERRORS);
763
833
  }
764
834
 
765
835
  int git_config__lookup_entry(
766
836
  git_config_entry **out,
767
- const git_config *cfg,
837
+ const git_config *config,
768
838
  const char *key,
769
839
  bool no_errors)
770
840
  {
771
841
  return get_entry(
772
- out, cfg, key, false, no_errors ? GET_NO_ERRORS : GET_NO_MISSING);
842
+ out, config, key, false, no_errors ? GET_NO_ERRORS : GET_NO_MISSING);
773
843
  }
774
844
 
775
845
  int git_config_get_mapped(
776
846
  int *out,
777
- const git_config *cfg,
847
+ const git_config *config,
778
848
  const char *name,
779
849
  const git_configmap *maps,
780
850
  size_t map_n)
@@ -782,7 +852,7 @@ int git_config_get_mapped(
782
852
  git_config_entry *entry;
783
853
  int ret;
784
854
 
785
- if ((ret = get_entry(&entry, cfg, name, true, GET_ALL_ERRORS)) < 0)
855
+ if ((ret = get_entry(&entry, config, name, true, GET_ALL_ERRORS)) < 0)
786
856
  return ret;
787
857
 
788
858
  ret = git_config_lookup_map_value(out, maps, map_n, entry->value);
@@ -791,12 +861,12 @@ int git_config_get_mapped(
791
861
  return ret;
792
862
  }
793
863
 
794
- int git_config_get_int64(int64_t *out, const git_config *cfg, const char *name)
864
+ int git_config_get_int64(int64_t *out, const git_config *config, const char *name)
795
865
  {
796
866
  git_config_entry *entry;
797
867
  int ret;
798
868
 
799
- if ((ret = get_entry(&entry, cfg, name, true, GET_ALL_ERRORS)) < 0)
869
+ if ((ret = get_entry(&entry, config, name, true, GET_ALL_ERRORS)) < 0)
800
870
  return ret;
801
871
 
802
872
  ret = git_config_parse_int64(out, entry->value);
@@ -805,12 +875,12 @@ int git_config_get_int64(int64_t *out, const git_config *cfg, const char *name)
805
875
  return ret;
806
876
  }
807
877
 
808
- int git_config_get_int32(int32_t *out, const git_config *cfg, const char *name)
878
+ int git_config_get_int32(int32_t *out, const git_config *config, const char *name)
809
879
  {
810
880
  git_config_entry *entry;
811
881
  int ret;
812
882
 
813
- if ((ret = get_entry(&entry, cfg, name, true, GET_ALL_ERRORS)) < 0)
883
+ if ((ret = get_entry(&entry, config, name, true, GET_ALL_ERRORS)) < 0)
814
884
  return ret;
815
885
 
816
886
  ret = git_config_parse_int32(out, entry->value);
@@ -819,12 +889,12 @@ int git_config_get_int32(int32_t *out, const git_config *cfg, const char *name)
819
889
  return ret;
820
890
  }
821
891
 
822
- int git_config_get_bool(int *out, const git_config *cfg, const char *name)
892
+ int git_config_get_bool(int *out, const git_config *config, const char *name)
823
893
  {
824
894
  git_config_entry *entry;
825
895
  int ret;
826
896
 
827
- if ((ret = get_entry(&entry, cfg, name, true, GET_ALL_ERRORS)) < 0)
897
+ if ((ret = get_entry(&entry, config, name, true, GET_ALL_ERRORS)) < 0)
828
898
  return ret;
829
899
 
830
900
  ret = git_config_parse_bool(out, entry->value);
@@ -833,16 +903,15 @@ int git_config_get_bool(int *out, const git_config *cfg, const char *name)
833
903
  return ret;
834
904
  }
835
905
 
836
- static int is_readonly(const git_config *cfg)
906
+ static int is_readonly(const git_config *config)
837
907
  {
908
+ backend_entry *entry;
838
909
  size_t i;
839
- backend_internal *internal;
840
910
 
841
- git_vector_foreach(&cfg->backends, i, internal) {
842
- if (!internal || !internal->backend)
843
- continue;
911
+ git_vector_foreach(&config->writers, i, entry) {
912
+ GIT_ASSERT(entry->instance && entry->instance->backend);
844
913
 
845
- if (!internal->backend->readonly)
914
+ if (!entry->instance->backend->readonly)
846
915
  return 0;
847
916
  }
848
917
 
@@ -873,21 +942,21 @@ int git_config_parse_path(git_buf *out, const char *value)
873
942
 
874
943
  int git_config_get_path(
875
944
  git_buf *out,
876
- const git_config *cfg,
945
+ const git_config *config,
877
946
  const char *name)
878
947
  {
879
- GIT_BUF_WRAP_PRIVATE(out, git_config__get_path, cfg, name);
948
+ GIT_BUF_WRAP_PRIVATE(out, git_config__get_path, config, name);
880
949
  }
881
950
 
882
951
  int git_config__get_path(
883
952
  git_str *out,
884
- const git_config *cfg,
953
+ const git_config *config,
885
954
  const char *name)
886
955
  {
887
956
  git_config_entry *entry;
888
957
  int error;
889
958
 
890
- if ((error = get_entry(&entry, cfg, name, true, GET_ALL_ERRORS)) < 0)
959
+ if ((error = get_entry(&entry, config, name, true, GET_ALL_ERRORS)) < 0)
891
960
  return error;
892
961
 
893
962
  error = git_config__parse_path(out, entry->value);
@@ -897,17 +966,17 @@ int git_config__get_path(
897
966
  }
898
967
 
899
968
  int git_config_get_string(
900
- const char **out, const git_config *cfg, const char *name)
969
+ const char **out, const git_config *config, const char *name)
901
970
  {
902
971
  git_config_entry *entry;
903
972
  int ret;
904
973
 
905
- if (!is_readonly(cfg)) {
974
+ if (!is_readonly(config)) {
906
975
  git_error_set(GIT_ERROR_CONFIG, "get_string called on a live config object");
907
976
  return -1;
908
977
  }
909
978
 
910
- ret = get_entry(&entry, cfg, name, true, GET_ALL_ERRORS);
979
+ ret = get_entry(&entry, config, name, true, GET_ALL_ERRORS);
911
980
  *out = !ret ? (entry->value ? entry->value : "") : NULL;
912
981
 
913
982
  git_config_entry_free(entry);
@@ -916,22 +985,22 @@ int git_config_get_string(
916
985
  }
917
986
 
918
987
  int git_config_get_string_buf(
919
- git_buf *out, const git_config *cfg, const char *name)
988
+ git_buf *out, const git_config *config, const char *name)
920
989
  {
921
- GIT_BUF_WRAP_PRIVATE(out, git_config__get_string_buf, cfg, name);
990
+ GIT_BUF_WRAP_PRIVATE(out, git_config__get_string_buf, config, name);
922
991
  }
923
992
 
924
993
  int git_config__get_string_buf(
925
- git_str *out, const git_config *cfg, const char *name)
994
+ git_str *out, const git_config *config, const char *name)
926
995
  {
927
996
  git_config_entry *entry;
928
997
  int ret;
929
998
  const char *str;
930
999
 
931
1000
  GIT_ASSERT_ARG(out);
932
- GIT_ASSERT_ARG(cfg);
1001
+ GIT_ASSERT_ARG(config);
933
1002
 
934
- ret = get_entry(&entry, cfg, name, true, GET_ALL_ERRORS);
1003
+ ret = get_entry(&entry, config, name, true, GET_ALL_ERRORS);
935
1004
  str = !ret ? (entry->value ? entry->value : "") : NULL;
936
1005
 
937
1006
  if (str)
@@ -943,12 +1012,12 @@ int git_config__get_string_buf(
943
1012
  }
944
1013
 
945
1014
  char *git_config__get_string_force(
946
- const git_config *cfg, const char *key, const char *fallback_value)
1015
+ const git_config *config, const char *key, const char *fallback_value)
947
1016
  {
948
1017
  git_config_entry *entry;
949
1018
  char *ret;
950
1019
 
951
- get_entry(&entry, cfg, key, false, GET_NO_ERRORS);
1020
+ get_entry(&entry, config, key, false, GET_NO_ERRORS);
952
1021
  ret = (entry && entry->value) ? git__strdup(entry->value) : fallback_value ? git__strdup(fallback_value) : NULL;
953
1022
  git_config_entry_free(entry);
954
1023
 
@@ -956,12 +1025,12 @@ char *git_config__get_string_force(
956
1025
  }
957
1026
 
958
1027
  int git_config__get_bool_force(
959
- const git_config *cfg, const char *key, int fallback_value)
1028
+ const git_config *config, const char *key, int fallback_value)
960
1029
  {
961
1030
  int val = fallback_value;
962
1031
  git_config_entry *entry;
963
1032
 
964
- get_entry(&entry, cfg, key, false, GET_NO_ERRORS);
1033
+ get_entry(&entry, config, key, false, GET_NO_ERRORS);
965
1034
 
966
1035
  if (entry && git_config_parse_bool(&val, entry->value) < 0)
967
1036
  git_error_clear();
@@ -971,12 +1040,12 @@ int git_config__get_bool_force(
971
1040
  }
972
1041
 
973
1042
  int git_config__get_int_force(
974
- const git_config *cfg, const char *key, int fallback_value)
1043
+ const git_config *config, const char *key, int fallback_value)
975
1044
  {
976
1045
  int32_t val = (int32_t)fallback_value;
977
1046
  git_config_entry *entry;
978
1047
 
979
- get_entry(&entry, cfg, key, false, GET_NO_ERRORS);
1048
+ get_entry(&entry, config, key, false, GET_NO_ERRORS);
980
1049
 
981
1050
  if (entry && git_config_parse_int32(&val, entry->value) < 0)
982
1051
  git_error_clear();
@@ -986,21 +1055,21 @@ int git_config__get_int_force(
986
1055
  }
987
1056
 
988
1057
  int git_config_get_multivar_foreach(
989
- const git_config *cfg, const char *name, const char *regexp,
1058
+ const git_config *config, const char *name, const char *regexp,
990
1059
  git_config_foreach_cb cb, void *payload)
991
1060
  {
992
1061
  int err, found;
993
1062
  git_config_iterator *iter;
994
- git_config_entry *entry;
1063
+ git_config_backend_entry *be;
995
1064
 
996
- if ((err = git_config_multivar_iterator_new(&iter, cfg, name, regexp)) < 0)
1065
+ if ((err = git_config_multivar_iterator_new(&iter, config, name, regexp)) < 0)
997
1066
  return err;
998
1067
 
999
1068
  found = 0;
1000
- while ((err = iter->next(&entry, iter)) == 0) {
1069
+ while ((err = iter->next(&be, iter)) == 0) {
1001
1070
  found = 1;
1002
1071
 
1003
- if ((err = cb(entry, payload)) != 0) {
1072
+ if ((err = cb(&be->entry, payload)) != 0) {
1004
1073
  git_error_set_after_callback(err);
1005
1074
  break;
1006
1075
  }
@@ -1024,19 +1093,21 @@ typedef struct {
1024
1093
  int have_regex;
1025
1094
  } multivar_iter;
1026
1095
 
1027
- static int multivar_iter_next(git_config_entry **entry, git_config_iterator *_iter)
1096
+ static int multivar_iter_next(
1097
+ git_config_backend_entry **entry,
1098
+ git_config_iterator *_iter)
1028
1099
  {
1029
1100
  multivar_iter *iter = (multivar_iter *) _iter;
1030
1101
  int error = 0;
1031
1102
 
1032
1103
  while ((error = iter->iter->next(entry, iter->iter)) == 0) {
1033
- if (git__strcmp(iter->name, (*entry)->name))
1104
+ if (git__strcmp(iter->name, (*entry)->entry.name))
1034
1105
  continue;
1035
1106
 
1036
1107
  if (!iter->have_regex)
1037
1108
  return 0;
1038
1109
 
1039
- if (git_regexp_match(&iter->regex, (*entry)->value) == 0)
1110
+ if (git_regexp_match(&iter->regex, (*entry)->entry.value) == 0)
1040
1111
  return 0;
1041
1112
  }
1042
1113
 
@@ -1055,13 +1126,13 @@ static void multivar_iter_free(git_config_iterator *_iter)
1055
1126
  git__free(iter);
1056
1127
  }
1057
1128
 
1058
- int git_config_multivar_iterator_new(git_config_iterator **out, const git_config *cfg, const char *name, const char *regexp)
1129
+ int git_config_multivar_iterator_new(git_config_iterator **out, const git_config *config, const char *name, const char *regexp)
1059
1130
  {
1060
1131
  multivar_iter *iter = NULL;
1061
1132
  git_config_iterator *inner = NULL;
1062
1133
  int error;
1063
1134
 
1064
- if ((error = git_config_iterator_new(&inner, cfg)) < 0)
1135
+ if ((error = git_config_iterator_new(&inner, config)) < 0)
1065
1136
  return error;
1066
1137
 
1067
1138
  iter = git__calloc(1, sizeof(multivar_iter));
@@ -1092,29 +1163,38 @@ on_error:
1092
1163
  return error;
1093
1164
  }
1094
1165
 
1095
- int git_config_set_multivar(git_config *cfg, const char *name, const char *regexp, const char *value)
1166
+ int git_config_set_multivar(git_config *config, const char *name, const char *regexp, const char *value)
1096
1167
  {
1097
1168
  git_config_backend *backend;
1098
1169
 
1099
- if (get_backend_for_use(&backend, cfg, name, BACKEND_USE_DELETE) < 0)
1100
- return GIT_ENOTFOUND;
1170
+ if ((backend = get_writer(config)) == NULL) {
1171
+ git_error_set(GIT_ERROR_CONFIG, "cannot set '%s': the configuration is read-only", name);
1172
+ return GIT_EREADONLY;
1173
+ }
1101
1174
 
1102
1175
  return backend->set_multivar(backend, name, regexp, value);
1103
1176
  }
1104
1177
 
1105
- int git_config_delete_multivar(git_config *cfg, const char *name, const char *regexp)
1178
+ int git_config_delete_multivar(git_config *config, const char *name, const char *regexp)
1106
1179
  {
1107
1180
  git_config_backend *backend;
1108
1181
 
1109
- if (get_backend_for_use(&backend, cfg, name, BACKEND_USE_DELETE) < 0)
1110
- return GIT_ENOTFOUND;
1182
+ if ((backend = get_writer(config)) == NULL)
1183
+ return GIT_EREADONLY;
1111
1184
 
1112
1185
  return backend->del_multivar(backend, name, regexp);
1113
1186
  }
1114
1187
 
1115
1188
  int git_config_next(git_config_entry **entry, git_config_iterator *iter)
1116
1189
  {
1117
- return iter->next(entry, iter);
1190
+ git_config_backend_entry *be;
1191
+ int error;
1192
+
1193
+ if ((error = iter->next(&be, iter)) != 0)
1194
+ return error;
1195
+
1196
+ *entry = &be->entry;
1197
+ return 0;
1118
1198
  }
1119
1199
 
1120
1200
  void git_config_iterator_free(git_config_iterator *iter)
@@ -1174,9 +1254,12 @@ int git_config__find_programdata(git_str *path)
1174
1254
  GIT_FS_PATH_OWNER_CURRENT_USER |
1175
1255
  GIT_FS_PATH_OWNER_ADMINISTRATOR;
1176
1256
  bool is_safe;
1257
+ int error;
1177
1258
 
1178
- if (git_sysdir_find_programdata_file(path, GIT_CONFIG_FILENAME_PROGRAMDATA) < 0 ||
1179
- git_fs_path_owner_is(&is_safe, path->ptr, owner_level) < 0)
1259
+ if ((error = git_sysdir_find_programdata_file(path, GIT_CONFIG_FILENAME_PROGRAMDATA)) < 0)
1260
+ return error;
1261
+
1262
+ if (git_fs_path_owner_is(&is_safe, path->ptr, owner_level) < 0)
1180
1263
  return -1;
1181
1264
 
1182
1265
  if (!is_safe) {
@@ -1215,79 +1298,77 @@ int git_config__global_location(git_str *buf)
1215
1298
  int git_config_open_default(git_config **out)
1216
1299
  {
1217
1300
  int error;
1218
- git_config *cfg = NULL;
1301
+ git_config *config = NULL;
1219
1302
  git_str buf = GIT_STR_INIT;
1220
1303
 
1221
- if ((error = git_config_new(&cfg)) < 0)
1304
+ if ((error = git_config_new(&config)) < 0)
1222
1305
  return error;
1223
1306
 
1224
1307
  if (!git_config__find_global(&buf) ||
1225
1308
  !git_config__global_location(&buf)) {
1226
- error = git_config_add_file_ondisk(cfg, buf.ptr,
1309
+ error = git_config_add_file_ondisk(config, buf.ptr,
1227
1310
  GIT_CONFIG_LEVEL_GLOBAL, NULL, 0);
1228
1311
  }
1229
1312
 
1230
1313
  if (!error && !git_config__find_xdg(&buf))
1231
- error = git_config_add_file_ondisk(cfg, buf.ptr,
1314
+ error = git_config_add_file_ondisk(config, buf.ptr,
1232
1315
  GIT_CONFIG_LEVEL_XDG, NULL, 0);
1233
1316
 
1234
1317
  if (!error && !git_config__find_system(&buf))
1235
- error = git_config_add_file_ondisk(cfg, buf.ptr,
1318
+ error = git_config_add_file_ondisk(config, buf.ptr,
1236
1319
  GIT_CONFIG_LEVEL_SYSTEM, NULL, 0);
1237
1320
 
1238
1321
  if (!error && !git_config__find_programdata(&buf))
1239
- error = git_config_add_file_ondisk(cfg, buf.ptr,
1322
+ error = git_config_add_file_ondisk(config, buf.ptr,
1240
1323
  GIT_CONFIG_LEVEL_PROGRAMDATA, NULL, 0);
1241
1324
 
1242
1325
  git_str_dispose(&buf);
1243
1326
 
1244
1327
  if (error) {
1245
- git_config_free(cfg);
1246
- cfg = NULL;
1328
+ git_config_free(config);
1329
+ config = NULL;
1247
1330
  }
1248
1331
 
1249
- *out = cfg;
1332
+ *out = config;
1250
1333
 
1251
1334
  return error;
1252
1335
  }
1253
1336
 
1254
- int git_config_lock(git_transaction **out, git_config *cfg)
1337
+ int git_config_lock(git_transaction **out, git_config *config)
1255
1338
  {
1339
+ backend_instance *instance;
1256
1340
  int error;
1257
- git_config_backend *backend;
1258
- backend_internal *internal;
1259
1341
 
1260
- GIT_ASSERT_ARG(cfg);
1342
+ GIT_ASSERT_ARG(config);
1261
1343
 
1262
- internal = git_vector_get(&cfg->backends, 0);
1263
- if (!internal || !internal->backend) {
1264
- git_error_set(GIT_ERROR_CONFIG, "cannot lock; the config has no backends");
1265
- return -1;
1344
+ if ((instance = get_writer_instance(config)) == NULL) {
1345
+ git_error_set(GIT_ERROR_CONFIG, "cannot lock: the configuration is read-only");
1346
+ return GIT_EREADONLY;
1266
1347
  }
1267
- backend = internal->backend;
1268
1348
 
1269
- if ((error = backend->lock(backend)) < 0)
1349
+ if ((error = instance->backend->lock(instance->backend)) < 0 ||
1350
+ (error = git_transaction_config_new(out, config, instance)) < 0)
1270
1351
  return error;
1271
1352
 
1272
- return git_transaction_config_new(out, cfg);
1353
+ GIT_REFCOUNT_INC(instance);
1354
+ return 0;
1273
1355
  }
1274
1356
 
1275
- int git_config_unlock(git_config *cfg, int commit)
1357
+ int git_config_unlock(
1358
+ git_config *config,
1359
+ void *data,
1360
+ int commit)
1276
1361
  {
1277
- git_config_backend *backend;
1278
- backend_internal *internal;
1279
-
1280
- GIT_ASSERT_ARG(cfg);
1362
+ backend_instance *instance = data;
1363
+ int error;
1281
1364
 
1282
- internal = git_vector_get(&cfg->backends, 0);
1283
- if (!internal || !internal->backend) {
1284
- git_error_set(GIT_ERROR_CONFIG, "cannot lock; the config has no backends");
1285
- return -1;
1286
- }
1365
+ GIT_ASSERT_ARG(config && data);
1366
+ GIT_UNUSED(config);
1287
1367
 
1288
- backend = internal->backend;
1368
+ error = instance->backend->unlock(instance->backend, commit);
1369
+ GIT_REFCOUNT_DEC(instance, backend_instance_free);
1289
1370
 
1290
- return backend->unlock(backend, commit);
1371
+ return error;
1291
1372
  }
1292
1373
 
1293
1374
  /***********
@@ -1444,7 +1525,7 @@ static int normalize_section(char *start, char *end)
1444
1525
  for (scan = start; *scan; ++scan) {
1445
1526
  if (end && scan >= end)
1446
1527
  break;
1447
- if (isalnum(*scan))
1528
+ if (git__isalnum(*scan))
1448
1529
  *scan = (char)git__tolower(*scan);
1449
1530
  else if (*scan != '-' || scan == start)
1450
1531
  return GIT_EINVALIDSPEC;
@@ -1506,19 +1587,32 @@ static int rename_config_entries_cb(
1506
1587
  int error = 0;
1507
1588
  struct rename_data *data = (struct rename_data *)payload;
1508
1589
  size_t base_len = git_str_len(data->name);
1590
+ git_str value = GIT_STR_INIT;
1591
+
1592
+ if (base_len > 0) {
1593
+ if ((error = git_str_puts(data->name,
1594
+ entry->name + data->old_len)) < 0 ||
1595
+ (error = git_config_set_multivar(
1596
+ data->config, git_str_cstr(data->name), "^$",
1597
+ entry->value)) < 0)
1598
+ goto cleanup;
1599
+ }
1509
1600
 
1510
- if (base_len > 0 &&
1511
- !(error = git_str_puts(data->name, entry->name + data->old_len)))
1512
- {
1513
- error = git_config_set_string(
1514
- data->config, git_str_cstr(data->name), entry->value);
1601
+ git_str_putc(&value, '^');
1602
+ git_str_puts_escape_regex(&value, entry->value);
1603
+ git_str_putc(&value, '$');
1515
1604
 
1516
- git_str_truncate(data->name, base_len);
1605
+ if (git_str_oom(&value)) {
1606
+ error = -1;
1607
+ goto cleanup;
1517
1608
  }
1518
1609
 
1519
- if (!error)
1520
- error = git_config_delete_entry(data->config, entry->name);
1610
+ error = git_config_delete_multivar(
1611
+ data->config, entry->name, git_str_cstr(&value));
1521
1612
 
1613
+ cleanup:
1614
+ git_str_truncate(data->name, base_len);
1615
+ git_str_dispose(&value);
1522
1616
  return error;
1523
1617
  }
1524
1618