rugged 1.7.2 → 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 (361) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rugged/version.rb +1 -1
  3. data/vendor/libgit2/AUTHORS +1 -0
  4. data/vendor/libgit2/CMakeLists.txt +23 -10
  5. data/vendor/libgit2/COPYING +195 -1
  6. data/vendor/libgit2/cmake/{FindIconv.cmake → FindIntlIconv.cmake} +6 -0
  7. data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
  8. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +1 -1
  9. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +23 -8
  10. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +17 -8
  11. data/vendor/libgit2/cmake/SelectHashes.cmake +28 -11
  12. data/vendor/libgit2/cmake/SelectRegex.cmake +6 -1
  13. data/vendor/libgit2/cmake/SelectSSH.cmake +22 -17
  14. data/vendor/libgit2/cmake/SelectZlib.cmake +4 -0
  15. data/vendor/libgit2/deps/llhttp/CMakeLists.txt +8 -0
  16. data/vendor/libgit2/deps/llhttp/LICENSE-MIT +22 -0
  17. data/vendor/libgit2/deps/llhttp/api.c +510 -0
  18. data/vendor/libgit2/deps/llhttp/http.c +170 -0
  19. data/vendor/libgit2/deps/llhttp/llhttp.c +10168 -0
  20. data/vendor/libgit2/deps/llhttp/llhttp.h +897 -0
  21. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +1 -1
  22. data/vendor/libgit2/deps/ntlmclient/crypt_builtin_md4.c +311 -0
  23. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +2 -1
  24. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +0 -20
  25. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +4 -4
  26. data/vendor/libgit2/deps/ntlmclient/ntlm.c +21 -21
  27. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +5 -4
  28. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +2 -1
  29. data/vendor/libgit2/deps/ntlmclient/utf8.h +1176 -721
  30. data/vendor/libgit2/deps/ntlmclient/util.h +11 -0
  31. data/vendor/libgit2/deps/pcre/CMakeLists.txt +1 -0
  32. data/vendor/libgit2/deps/xdiff/xmerge.c +2 -2
  33. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  34. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  35. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  36. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  37. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  38. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  39. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  40. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  41. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  42. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  43. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  44. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  45. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  46. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  47. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  48. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  49. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  50. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  51. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  52. data/vendor/libgit2/include/git2/apply.h +27 -6
  53. data/vendor/libgit2/include/git2/attr.h +17 -4
  54. data/vendor/libgit2/include/git2/blame.h +133 -28
  55. data/vendor/libgit2/include/git2/blob.h +71 -28
  56. data/vendor/libgit2/include/git2/branch.h +22 -15
  57. data/vendor/libgit2/include/git2/buffer.h +6 -4
  58. data/vendor/libgit2/include/git2/cert.h +2 -1
  59. data/vendor/libgit2/include/git2/checkout.h +83 -32
  60. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  61. data/vendor/libgit2/include/git2/clone.h +25 -9
  62. data/vendor/libgit2/include/git2/commit.h +132 -3
  63. data/vendor/libgit2/include/git2/common.h +120 -63
  64. data/vendor/libgit2/include/git2/config.h +93 -23
  65. data/vendor/libgit2/include/git2/credential.h +30 -2
  66. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  67. data/vendor/libgit2/include/git2/deprecated.h +133 -3
  68. data/vendor/libgit2/include/git2/describe.h +13 -1
  69. data/vendor/libgit2/include/git2/diff.h +38 -8
  70. data/vendor/libgit2/include/git2/email.h +9 -29
  71. data/vendor/libgit2/include/git2/errors.h +46 -73
  72. data/vendor/libgit2/include/git2/filter.h +14 -7
  73. data/vendor/libgit2/include/git2/global.h +8 -1
  74. data/vendor/libgit2/include/git2/graph.h +3 -2
  75. data/vendor/libgit2/include/git2/ignore.h +10 -0
  76. data/vendor/libgit2/include/git2/index.h +99 -14
  77. data/vendor/libgit2/include/git2/indexer.h +21 -4
  78. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  79. data/vendor/libgit2/include/git2/merge.h +46 -1
  80. data/vendor/libgit2/include/git2/message.h +2 -2
  81. data/vendor/libgit2/include/git2/net.h +3 -1
  82. data/vendor/libgit2/include/git2/notes.h +9 -6
  83. data/vendor/libgit2/include/git2/object.h +9 -8
  84. data/vendor/libgit2/include/git2/odb.h +91 -49
  85. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  86. data/vendor/libgit2/include/git2/oid.h +23 -24
  87. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  88. data/vendor/libgit2/include/git2/pack.h +13 -1
  89. data/vendor/libgit2/include/git2/patch.h +2 -3
  90. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  91. data/vendor/libgit2/include/git2/proxy.h +10 -0
  92. data/vendor/libgit2/include/git2/rebase.h +9 -6
  93. data/vendor/libgit2/include/git2/refdb.h +2 -2
  94. data/vendor/libgit2/include/git2/reflog.h +3 -2
  95. data/vendor/libgit2/include/git2/refs.h +9 -6
  96. data/vendor/libgit2/include/git2/refspec.h +14 -4
  97. data/vendor/libgit2/include/git2/remote.h +94 -18
  98. data/vendor/libgit2/include/git2/repository.h +57 -21
  99. data/vendor/libgit2/include/git2/reset.h +16 -3
  100. data/vendor/libgit2/include/git2/revert.h +9 -4
  101. data/vendor/libgit2/include/git2/revparse.h +3 -3
  102. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  103. data/vendor/libgit2/include/git2/signature.h +46 -1
  104. data/vendor/libgit2/include/git2/stash.h +17 -3
  105. data/vendor/libgit2/include/git2/status.h +10 -6
  106. data/vendor/libgit2/include/git2/stdint.h +87 -85
  107. data/vendor/libgit2/include/git2/strarray.h +2 -3
  108. data/vendor/libgit2/include/git2/submodule.h +20 -9
  109. data/vendor/libgit2/include/git2/sys/alloc.h +12 -0
  110. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  111. data/vendor/libgit2/include/git2/sys/commit_graph.h +103 -62
  112. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  113. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  114. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  115. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  116. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  117. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  118. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  119. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  120. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  121. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  122. data/vendor/libgit2/include/git2/sys/midx.h +43 -4
  123. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  124. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  125. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  126. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  127. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  128. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  129. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  130. data/vendor/libgit2/include/git2/sys/stream.h +11 -2
  131. data/vendor/libgit2/include/git2/sys/transport.h +24 -3
  132. data/vendor/libgit2/include/git2/tag.h +3 -1
  133. data/vendor/libgit2/include/git2/trace.h +9 -3
  134. data/vendor/libgit2/include/git2/transaction.h +3 -2
  135. data/vendor/libgit2/include/git2/transport.h +11 -3
  136. data/vendor/libgit2/include/git2/tree.h +16 -5
  137. data/vendor/libgit2/include/git2/types.h +19 -3
  138. data/vendor/libgit2/include/git2/version.h +44 -8
  139. data/vendor/libgit2/include/git2/worktree.h +16 -6
  140. data/vendor/libgit2/src/CMakeLists.txt +6 -4
  141. data/vendor/libgit2/src/cli/CMakeLists.txt +2 -2
  142. data/vendor/libgit2/src/cli/cmd.c +1 -1
  143. data/vendor/libgit2/src/cli/cmd.h +4 -0
  144. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  145. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  146. data/vendor/libgit2/src/cli/cmd_clone.c +5 -7
  147. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  148. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  149. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  150. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  151. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  152. data/vendor/libgit2/src/cli/common.c +168 -0
  153. data/vendor/libgit2/src/cli/common.h +63 -0
  154. data/vendor/libgit2/src/cli/error.h +1 -1
  155. data/vendor/libgit2/src/cli/main.c +52 -24
  156. data/vendor/libgit2/src/cli/opt.c +29 -3
  157. data/vendor/libgit2/src/cli/opt.h +21 -3
  158. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  159. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  160. data/vendor/libgit2/src/cli/progress.c +51 -2
  161. data/vendor/libgit2/src/cli/progress.h +12 -0
  162. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  163. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  164. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  165. data/vendor/libgit2/src/libgit2/CMakeLists.txt +26 -8
  166. data/vendor/libgit2/src/libgit2/apply.c +10 -13
  167. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  168. data/vendor/libgit2/src/libgit2/attr_file.c +7 -2
  169. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  170. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  171. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  172. data/vendor/libgit2/src/libgit2/blame.c +130 -44
  173. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  174. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  175. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  176. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  177. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  178. data/vendor/libgit2/src/libgit2/cherrypick.c +1 -2
  179. data/vendor/libgit2/src/libgit2/clone.c +186 -166
  180. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  181. data/vendor/libgit2/src/libgit2/commit.c +92 -0
  182. data/vendor/libgit2/src/libgit2/commit_graph.c +67 -56
  183. data/vendor/libgit2/src/libgit2/commit_graph.h +1 -2
  184. data/vendor/libgit2/src/libgit2/config.c +389 -298
  185. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  186. data/vendor/libgit2/src/libgit2/config.h +9 -4
  187. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  188. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  189. data/vendor/libgit2/src/libgit2/config_file.c +99 -88
  190. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  191. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  192. data/vendor/libgit2/src/libgit2/config_mem.c +194 -40
  193. data/vendor/libgit2/src/libgit2/config_parse.c +10 -9
  194. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  195. data/vendor/libgit2/src/libgit2/describe.c +24 -24
  196. data/vendor/libgit2/src/libgit2/diff.c +1 -1
  197. data/vendor/libgit2/src/libgit2/diff_driver.c +12 -19
  198. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  199. data/vendor/libgit2/src/libgit2/diff_generate.c +3 -3
  200. data/vendor/libgit2/src/libgit2/diff_parse.c +2 -2
  201. data/vendor/libgit2/src/libgit2/diff_print.c +65 -9
  202. data/vendor/libgit2/src/libgit2/diff_tform.c +36 -8
  203. data/vendor/libgit2/src/libgit2/email.c +1 -0
  204. data/vendor/libgit2/src/libgit2/fetch.c +5 -3
  205. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  206. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  207. data/vendor/libgit2/src/libgit2/grafts.c +18 -20
  208. data/vendor/libgit2/src/libgit2/grafts.h +0 -1
  209. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  210. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  211. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  212. data/vendor/libgit2/src/libgit2/index.c +68 -90
  213. data/vendor/libgit2/src/libgit2/index.h +2 -2
  214. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  215. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  216. data/vendor/libgit2/src/libgit2/indexer.c +34 -38
  217. data/vendor/libgit2/src/libgit2/iterator.c +14 -8
  218. data/vendor/libgit2/src/libgit2/libgit2.c +153 -368
  219. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  220. data/vendor/libgit2/src/libgit2/merge.c +42 -37
  221. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  222. data/vendor/libgit2/src/libgit2/midx.c +28 -15
  223. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  224. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  225. data/vendor/libgit2/src/libgit2/object.c +6 -5
  226. data/vendor/libgit2/src/libgit2/odb.c +5 -4
  227. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  228. data/vendor/libgit2/src/libgit2/odb_pack.c +13 -5
  229. data/vendor/libgit2/src/libgit2/oid.c +32 -5
  230. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  231. data/vendor/libgit2/src/libgit2/pack-objects.c +58 -31
  232. data/vendor/libgit2/src/libgit2/pack-objects.h +12 -4
  233. data/vendor/libgit2/src/libgit2/pack.c +30 -24
  234. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  235. data/vendor/libgit2/src/libgit2/patch_parse.c +2 -2
  236. data/vendor/libgit2/src/libgit2/path.c +1 -1
  237. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  238. data/vendor/libgit2/src/libgit2/push.c +79 -28
  239. data/vendor/libgit2/src/libgit2/push.h +1 -0
  240. data/vendor/libgit2/src/libgit2/refdb_fs.c +128 -61
  241. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  242. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  243. data/vendor/libgit2/src/libgit2/refs.c +26 -7
  244. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  245. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  246. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  247. data/vendor/libgit2/src/libgit2/remote.c +121 -61
  248. data/vendor/libgit2/src/libgit2/repository.c +231 -51
  249. data/vendor/libgit2/src/libgit2/repository.h +10 -6
  250. data/vendor/libgit2/src/libgit2/revert.c +1 -2
  251. data/vendor/libgit2/src/libgit2/revparse.c +2 -2
  252. data/vendor/libgit2/src/libgit2/revwalk.c +13 -10
  253. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  254. data/vendor/libgit2/src/libgit2/settings.c +468 -0
  255. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  256. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  257. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  258. data/vendor/libgit2/src/libgit2/status.c +1 -1
  259. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -60
  260. data/vendor/libgit2/src/libgit2/streams/openssl.c +32 -7
  261. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  262. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  263. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  264. data/vendor/libgit2/src/libgit2/streams/stransport.c +39 -7
  265. data/vendor/libgit2/src/libgit2/submodule.c +106 -63
  266. data/vendor/libgit2/src/libgit2/submodule.h +6 -7
  267. data/vendor/libgit2/src/libgit2/tag.c +1 -1
  268. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  269. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  270. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  271. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  272. data/vendor/libgit2/src/libgit2/transports/credential.c +1 -1
  273. data/vendor/libgit2/src/libgit2/transports/http.c +1 -2
  274. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  275. data/vendor/libgit2/src/libgit2/transports/httpclient.c +112 -72
  276. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  277. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  278. data/vendor/libgit2/src/libgit2/transports/local.c +8 -7
  279. data/vendor/libgit2/src/libgit2/transports/smart.c +20 -8
  280. data/vendor/libgit2/src/libgit2/transports/smart.h +4 -2
  281. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +2 -2
  282. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +55 -10
  283. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  284. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +347 -0
  285. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  286. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1126 -0
  287. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  288. data/vendor/libgit2/src/libgit2/transports/winhttp.c +35 -7
  289. data/vendor/libgit2/src/libgit2/tree.c +34 -26
  290. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  291. data/vendor/libgit2/src/libgit2/worktree.c +14 -17
  292. data/vendor/libgit2/src/util/CMakeLists.txt +4 -6
  293. data/vendor/libgit2/src/util/alloc.c +4 -1
  294. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  295. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  296. data/vendor/libgit2/src/util/allocators/stdalloc.c +0 -10
  297. data/vendor/libgit2/src/util/array.h +18 -17
  298. data/vendor/libgit2/src/util/cc-compat.h +2 -0
  299. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  300. data/vendor/libgit2/src/util/date.c +22 -14
  301. data/vendor/libgit2/src/util/date.h +12 -0
  302. data/vendor/libgit2/src/util/errors.c +401 -0
  303. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  304. data/vendor/libgit2/src/util/fs_path.c +15 -4
  305. data/vendor/libgit2/src/util/fs_path.h +23 -0
  306. data/vendor/libgit2/src/util/futils.c +6 -5
  307. data/vendor/libgit2/src/util/futils.h +13 -4
  308. data/vendor/libgit2/src/util/git2_features.h.in +12 -1
  309. data/vendor/libgit2/src/util/git2_util.h +6 -0
  310. data/vendor/libgit2/src/util/hash/openssl.c +152 -0
  311. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  312. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  313. data/vendor/libgit2/src/util/hashmap.h +424 -0
  314. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  315. data/vendor/libgit2/src/util/integer.h +3 -1
  316. data/vendor/libgit2/src/util/net.c +13 -7
  317. data/vendor/libgit2/src/util/net.h +2 -0
  318. data/vendor/libgit2/src/util/pool.c +1 -1
  319. data/vendor/libgit2/src/util/pool.h +5 -0
  320. data/vendor/libgit2/src/util/pqueue.h +1 -1
  321. data/vendor/libgit2/src/util/process.h +222 -0
  322. data/vendor/libgit2/src/util/rand.c +1 -7
  323. data/vendor/libgit2/src/util/regexp.c +1 -1
  324. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  325. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  326. data/vendor/libgit2/src/util/str.c +2 -2
  327. data/vendor/libgit2/src/util/strlist.c +108 -0
  328. data/vendor/libgit2/src/util/strlist.h +36 -0
  329. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  330. data/vendor/libgit2/src/util/unix/process.c +629 -0
  331. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  332. data/vendor/libgit2/src/util/util.c +2 -2
  333. data/vendor/libgit2/src/util/util.h +4 -38
  334. data/vendor/libgit2/src/util/vector.c +3 -3
  335. data/vendor/libgit2/src/util/vector.h +2 -2
  336. data/vendor/libgit2/src/util/win32/posix_w32.c +29 -6
  337. data/vendor/libgit2/src/util/win32/process.c +506 -0
  338. metadata +45 -28
  339. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  340. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  341. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  342. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  343. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  344. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  345. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  346. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  347. data/vendor/libgit2/src/libgit2/errors.c +0 -293
  348. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  349. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  350. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  351. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  352. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  353. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  354. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  355. data/vendor/libgit2/src/libgit2/threadstate.c +0 -97
  356. data/vendor/libgit2/src/libgit2/threadstate.h +0 -22
  357. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  358. data/vendor/libgit2/src/util/khash.h +0 -615
  359. data/vendor/libgit2/src/util/strmap.c +0 -100
  360. data/vendor/libgit2/src/util/strmap.h +0 -131
  361. /data/vendor/libgit2/cmake/{FindHTTPParser.cmake → FindHTTP_Parser.cmake} +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)
@@ -1218,79 +1298,77 @@ int git_config__global_location(git_str *buf)
1218
1298
  int git_config_open_default(git_config **out)
1219
1299
  {
1220
1300
  int error;
1221
- git_config *cfg = NULL;
1301
+ git_config *config = NULL;
1222
1302
  git_str buf = GIT_STR_INIT;
1223
1303
 
1224
- if ((error = git_config_new(&cfg)) < 0)
1304
+ if ((error = git_config_new(&config)) < 0)
1225
1305
  return error;
1226
1306
 
1227
1307
  if (!git_config__find_global(&buf) ||
1228
1308
  !git_config__global_location(&buf)) {
1229
- error = git_config_add_file_ondisk(cfg, buf.ptr,
1309
+ error = git_config_add_file_ondisk(config, buf.ptr,
1230
1310
  GIT_CONFIG_LEVEL_GLOBAL, NULL, 0);
1231
1311
  }
1232
1312
 
1233
1313
  if (!error && !git_config__find_xdg(&buf))
1234
- error = git_config_add_file_ondisk(cfg, buf.ptr,
1314
+ error = git_config_add_file_ondisk(config, buf.ptr,
1235
1315
  GIT_CONFIG_LEVEL_XDG, NULL, 0);
1236
1316
 
1237
1317
  if (!error && !git_config__find_system(&buf))
1238
- error = git_config_add_file_ondisk(cfg, buf.ptr,
1318
+ error = git_config_add_file_ondisk(config, buf.ptr,
1239
1319
  GIT_CONFIG_LEVEL_SYSTEM, NULL, 0);
1240
1320
 
1241
1321
  if (!error && !git_config__find_programdata(&buf))
1242
- error = git_config_add_file_ondisk(cfg, buf.ptr,
1322
+ error = git_config_add_file_ondisk(config, buf.ptr,
1243
1323
  GIT_CONFIG_LEVEL_PROGRAMDATA, NULL, 0);
1244
1324
 
1245
1325
  git_str_dispose(&buf);
1246
1326
 
1247
1327
  if (error) {
1248
- git_config_free(cfg);
1249
- cfg = NULL;
1328
+ git_config_free(config);
1329
+ config = NULL;
1250
1330
  }
1251
1331
 
1252
- *out = cfg;
1332
+ *out = config;
1253
1333
 
1254
1334
  return error;
1255
1335
  }
1256
1336
 
1257
- int git_config_lock(git_transaction **out, git_config *cfg)
1337
+ int git_config_lock(git_transaction **out, git_config *config)
1258
1338
  {
1339
+ backend_instance *instance;
1259
1340
  int error;
1260
- git_config_backend *backend;
1261
- backend_internal *internal;
1262
1341
 
1263
- GIT_ASSERT_ARG(cfg);
1342
+ GIT_ASSERT_ARG(config);
1264
1343
 
1265
- internal = git_vector_get(&cfg->backends, 0);
1266
- if (!internal || !internal->backend) {
1267
- git_error_set(GIT_ERROR_CONFIG, "cannot lock; the config has no backends");
1268
- 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;
1269
1347
  }
1270
- backend = internal->backend;
1271
1348
 
1272
- 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)
1273
1351
  return error;
1274
1352
 
1275
- return git_transaction_config_new(out, cfg);
1353
+ GIT_REFCOUNT_INC(instance);
1354
+ return 0;
1276
1355
  }
1277
1356
 
1278
- int git_config_unlock(git_config *cfg, int commit)
1357
+ int git_config_unlock(
1358
+ git_config *config,
1359
+ void *data,
1360
+ int commit)
1279
1361
  {
1280
- git_config_backend *backend;
1281
- backend_internal *internal;
1282
-
1283
- GIT_ASSERT_ARG(cfg);
1362
+ backend_instance *instance = data;
1363
+ int error;
1284
1364
 
1285
- internal = git_vector_get(&cfg->backends, 0);
1286
- if (!internal || !internal->backend) {
1287
- git_error_set(GIT_ERROR_CONFIG, "cannot lock; the config has no backends");
1288
- return -1;
1289
- }
1365
+ GIT_ASSERT_ARG(config && data);
1366
+ GIT_UNUSED(config);
1290
1367
 
1291
- backend = internal->backend;
1368
+ error = instance->backend->unlock(instance->backend, commit);
1369
+ GIT_REFCOUNT_DEC(instance, backend_instance_free);
1292
1370
 
1293
- return backend->unlock(backend, commit);
1371
+ return error;
1294
1372
  }
1295
1373
 
1296
1374
  /***********
@@ -1447,7 +1525,7 @@ static int normalize_section(char *start, char *end)
1447
1525
  for (scan = start; *scan; ++scan) {
1448
1526
  if (end && scan >= end)
1449
1527
  break;
1450
- if (isalnum(*scan))
1528
+ if (git__isalnum(*scan))
1451
1529
  *scan = (char)git__tolower(*scan);
1452
1530
  else if (*scan != '-' || scan == start)
1453
1531
  return GIT_EINVALIDSPEC;
@@ -1509,19 +1587,32 @@ static int rename_config_entries_cb(
1509
1587
  int error = 0;
1510
1588
  struct rename_data *data = (struct rename_data *)payload;
1511
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
+ }
1512
1600
 
1513
- if (base_len > 0 &&
1514
- !(error = git_str_puts(data->name, entry->name + data->old_len)))
1515
- {
1516
- error = git_config_set_string(
1517
- 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, '$');
1518
1604
 
1519
- git_str_truncate(data->name, base_len);
1605
+ if (git_str_oom(&value)) {
1606
+ error = -1;
1607
+ goto cleanup;
1520
1608
  }
1521
1609
 
1522
- if (!error)
1523
- error = git_config_delete_entry(data->config, entry->name);
1610
+ error = git_config_delete_multivar(
1611
+ data->config, entry->name, git_str_cstr(&value));
1524
1612
 
1613
+ cleanup:
1614
+ git_str_truncate(data->name, base_len);
1615
+ git_str_dispose(&value);
1525
1616
  return error;
1526
1617
  }
1527
1618