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.
- checksums.yaml +4 -4
- data/ext/rugged/rugged_allocator.c +0 -54
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/AUTHORS +1 -0
- data/vendor/libgit2/CMakeLists.txt +25 -17
- data/vendor/libgit2/COPYING +195 -1
- data/vendor/libgit2/cmake/CheckPrototypeDefinitionSafe.cmake +16 -0
- data/vendor/libgit2/cmake/{FindIconv.cmake → FindIntlIconv.cmake} +6 -0
- data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
- data/vendor/libgit2/cmake/SelectGSSAPI.cmake +4 -4
- data/vendor/libgit2/cmake/SelectHTTPParser.cmake +23 -8
- data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +34 -6
- data/vendor/libgit2/cmake/SelectHashes.cmake +32 -11
- data/vendor/libgit2/cmake/SelectRegex.cmake +6 -1
- data/vendor/libgit2/cmake/SelectSSH.cmake +22 -17
- data/vendor/libgit2/cmake/SelectXdiff.cmake +9 -0
- data/vendor/libgit2/cmake/SelectZlib.cmake +4 -0
- data/vendor/libgit2/deps/llhttp/CMakeLists.txt +8 -0
- data/vendor/libgit2/deps/llhttp/LICENSE-MIT +22 -0
- data/vendor/libgit2/deps/llhttp/api.c +510 -0
- data/vendor/libgit2/deps/llhttp/http.c +170 -0
- data/vendor/libgit2/deps/llhttp/llhttp.c +10168 -0
- data/vendor/libgit2/deps/llhttp/llhttp.h +897 -0
- data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +1 -1
- data/vendor/libgit2/deps/ntlmclient/crypt_builtin_md4.c +311 -0
- data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +2 -1
- data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +0 -20
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +4 -4
- data/vendor/libgit2/deps/ntlmclient/ntlm.c +21 -21
- data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +5 -4
- data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +2 -1
- data/vendor/libgit2/deps/ntlmclient/utf8.h +1176 -721
- data/vendor/libgit2/deps/ntlmclient/util.h +11 -0
- data/vendor/libgit2/deps/pcre/CMakeLists.txt +1 -0
- data/vendor/libgit2/deps/pcre/LICENCE +5 -5
- data/vendor/libgit2/deps/pcre/pcre.h +2 -2
- data/vendor/libgit2/deps/pcre/pcre_compile.c +6 -3
- data/vendor/libgit2/deps/pcre/pcre_exec.c +2 -2
- data/vendor/libgit2/deps/xdiff/CMakeLists.txt +28 -0
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/git-xdiff.h +4 -1
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.c +19 -18
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.h +2 -4
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.c +3 -3
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xhistogram.c +7 -18
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmacros.h +18 -1
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmerge.c +22 -20
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xpatience.c +21 -30
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.c +13 -30
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.c +18 -1
- data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.h +2 -1
- data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
- data/vendor/libgit2/deps/zlib/LICENSE +22 -0
- data/vendor/libgit2/deps/zlib/adler32.c +5 -27
- data/vendor/libgit2/deps/zlib/crc32.c +94 -167
- data/vendor/libgit2/deps/zlib/deflate.c +358 -435
- data/vendor/libgit2/deps/zlib/deflate.h +41 -10
- data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
- data/vendor/libgit2/deps/zlib/infback.c +17 -30
- data/vendor/libgit2/deps/zlib/inffast.c +1 -4
- data/vendor/libgit2/deps/zlib/inffast.h +1 -1
- data/vendor/libgit2/deps/zlib/inflate.c +36 -102
- data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
- data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
- data/vendor/libgit2/deps/zlib/trees.c +287 -352
- data/vendor/libgit2/deps/zlib/zconf.h +23 -14
- data/vendor/libgit2/deps/zlib/zlib.h +202 -202
- data/vendor/libgit2/deps/zlib/zutil.c +18 -44
- data/vendor/libgit2/deps/zlib/zutil.h +13 -33
- data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
- data/vendor/libgit2/include/git2/apply.h +27 -6
- data/vendor/libgit2/include/git2/attr.h +17 -4
- data/vendor/libgit2/include/git2/blame.h +133 -28
- data/vendor/libgit2/include/git2/blob.h +71 -28
- data/vendor/libgit2/include/git2/branch.h +22 -15
- data/vendor/libgit2/include/git2/buffer.h +6 -4
- data/vendor/libgit2/include/git2/cert.h +2 -1
- data/vendor/libgit2/include/git2/checkout.h +83 -32
- data/vendor/libgit2/include/git2/cherrypick.h +10 -3
- data/vendor/libgit2/include/git2/clone.h +25 -9
- data/vendor/libgit2/include/git2/commit.h +132 -3
- data/vendor/libgit2/include/git2/common.h +138 -56
- data/vendor/libgit2/include/git2/config.h +93 -23
- data/vendor/libgit2/include/git2/credential.h +30 -2
- data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
- data/vendor/libgit2/include/git2/deprecated.h +133 -3
- data/vendor/libgit2/include/git2/describe.h +13 -1
- data/vendor/libgit2/include/git2/diff.h +77 -9
- data/vendor/libgit2/include/git2/email.h +9 -29
- data/vendor/libgit2/include/git2/errors.h +49 -74
- data/vendor/libgit2/include/git2/filter.h +14 -7
- data/vendor/libgit2/include/git2/global.h +8 -1
- data/vendor/libgit2/include/git2/graph.h +3 -2
- data/vendor/libgit2/include/git2/ignore.h +10 -0
- data/vendor/libgit2/include/git2/index.h +100 -6
- data/vendor/libgit2/include/git2/indexer.h +21 -4
- data/vendor/libgit2/include/git2/mailmap.h +7 -1
- data/vendor/libgit2/include/git2/merge.h +46 -1
- data/vendor/libgit2/include/git2/message.h +2 -2
- data/vendor/libgit2/include/git2/net.h +3 -1
- data/vendor/libgit2/include/git2/notes.h +9 -6
- data/vendor/libgit2/include/git2/object.h +9 -8
- data/vendor/libgit2/include/git2/odb.h +91 -49
- data/vendor/libgit2/include/git2/odb_backend.h +80 -52
- data/vendor/libgit2/include/git2/oid.h +24 -25
- data/vendor/libgit2/include/git2/oidarray.h +7 -1
- data/vendor/libgit2/include/git2/pack.h +13 -1
- data/vendor/libgit2/include/git2/patch.h +2 -3
- data/vendor/libgit2/include/git2/pathspec.h +9 -0
- data/vendor/libgit2/include/git2/proxy.h +10 -0
- data/vendor/libgit2/include/git2/rebase.h +9 -6
- data/vendor/libgit2/include/git2/refdb.h +2 -2
- data/vendor/libgit2/include/git2/reflog.h +3 -2
- data/vendor/libgit2/include/git2/refs.h +9 -6
- data/vendor/libgit2/include/git2/refspec.h +14 -4
- data/vendor/libgit2/include/git2/remote.h +112 -18
- data/vendor/libgit2/include/git2/repository.h +61 -15
- data/vendor/libgit2/include/git2/reset.h +16 -3
- data/vendor/libgit2/include/git2/revert.h +9 -4
- data/vendor/libgit2/include/git2/revparse.h +3 -3
- data/vendor/libgit2/include/git2/revwalk.h +3 -2
- data/vendor/libgit2/include/git2/signature.h +46 -1
- data/vendor/libgit2/include/git2/stash.h +17 -3
- data/vendor/libgit2/include/git2/status.h +10 -6
- data/vendor/libgit2/include/git2/stdint.h +87 -85
- data/vendor/libgit2/include/git2/strarray.h +2 -3
- data/vendor/libgit2/include/git2/submodule.h +20 -9
- data/vendor/libgit2/include/git2/sys/alloc.h +12 -34
- data/vendor/libgit2/include/git2/sys/commit.h +77 -3
- data/vendor/libgit2/include/git2/sys/commit_graph.h +109 -58
- data/vendor/libgit2/include/git2/sys/config.h +80 -4
- data/vendor/libgit2/include/git2/sys/credential.h +4 -3
- data/vendor/libgit2/include/git2/sys/diff.h +21 -1
- data/vendor/libgit2/include/git2/sys/email.h +7 -0
- data/vendor/libgit2/include/git2/sys/errors.h +76 -0
- data/vendor/libgit2/include/git2/sys/filter.h +66 -3
- data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
- data/vendor/libgit2/include/git2/sys/index.h +3 -2
- data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
- data/vendor/libgit2/include/git2/sys/merge.h +55 -7
- data/vendor/libgit2/include/git2/sys/midx.h +47 -4
- data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
- data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
- data/vendor/libgit2/include/git2/sys/path.h +12 -1
- data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
- data/vendor/libgit2/include/git2/sys/refs.h +3 -2
- data/vendor/libgit2/include/git2/sys/remote.h +8 -1
- data/vendor/libgit2/include/git2/sys/repository.h +63 -3
- data/vendor/libgit2/include/git2/sys/stream.h +25 -2
- data/vendor/libgit2/include/git2/sys/transport.h +44 -5
- data/vendor/libgit2/include/git2/tag.h +3 -1
- data/vendor/libgit2/include/git2/trace.h +9 -3
- data/vendor/libgit2/include/git2/transaction.h +3 -2
- data/vendor/libgit2/include/git2/transport.h +11 -3
- data/vendor/libgit2/include/git2/tree.h +16 -5
- data/vendor/libgit2/include/git2/types.h +19 -3
- data/vendor/libgit2/include/git2/version.h +44 -8
- data/vendor/libgit2/include/git2/worktree.h +19 -7
- data/vendor/libgit2/src/CMakeLists.txt +40 -15
- data/vendor/libgit2/src/cli/CMakeLists.txt +2 -2
- data/vendor/libgit2/src/cli/cmd.c +1 -1
- data/vendor/libgit2/src/cli/cmd.h +4 -0
- data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
- data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
- data/vendor/libgit2/src/cli/cmd_clone.c +27 -13
- data/vendor/libgit2/src/cli/cmd_config.c +241 -0
- data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
- data/vendor/libgit2/src/cli/cmd_help.c +6 -7
- data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
- data/vendor/libgit2/src/cli/cmd_init.c +102 -0
- data/vendor/libgit2/src/cli/common.c +168 -0
- data/vendor/libgit2/src/cli/common.h +63 -0
- data/vendor/libgit2/src/cli/error.h +1 -1
- data/vendor/libgit2/src/cli/main.c +52 -24
- data/vendor/libgit2/src/cli/opt.c +29 -3
- data/vendor/libgit2/src/cli/opt.h +21 -3
- data/vendor/libgit2/src/cli/opt_usage.c +102 -33
- data/vendor/libgit2/src/cli/opt_usage.h +6 -1
- data/vendor/libgit2/src/cli/progress.c +60 -10
- data/vendor/libgit2/src/cli/progress.h +16 -4
- data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
- data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
- data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
- data/vendor/libgit2/src/libgit2/CMakeLists.txt +27 -27
- data/vendor/libgit2/src/libgit2/annotated_commit.c +2 -2
- data/vendor/libgit2/src/libgit2/annotated_commit.h +1 -1
- data/vendor/libgit2/src/libgit2/apply.c +14 -16
- data/vendor/libgit2/src/libgit2/attr.c +30 -13
- data/vendor/libgit2/src/libgit2/attr_file.c +7 -2
- data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
- data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
- data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
- data/vendor/libgit2/src/libgit2/blame.c +152 -59
- data/vendor/libgit2/src/libgit2/blame.h +1 -0
- data/vendor/libgit2/src/libgit2/blame_git.c +0 -1
- data/vendor/libgit2/src/libgit2/branch.c +2 -2
- data/vendor/libgit2/src/libgit2/cache.c +22 -17
- data/vendor/libgit2/src/libgit2/cache.h +7 -9
- data/vendor/libgit2/src/libgit2/checkout.c +34 -24
- data/vendor/libgit2/src/libgit2/checkout.h +0 -2
- data/vendor/libgit2/src/libgit2/cherrypick.c +4 -5
- data/vendor/libgit2/src/libgit2/clone.c +186 -164
- data/vendor/libgit2/src/libgit2/clone.h +4 -1
- data/vendor/libgit2/src/libgit2/commit.c +123 -9
- data/vendor/libgit2/src/libgit2/commit_graph.c +166 -88
- data/vendor/libgit2/src/libgit2/commit_graph.h +21 -6
- data/vendor/libgit2/src/libgit2/commit_list.c +12 -5
- data/vendor/libgit2/src/libgit2/commit_list.h +1 -0
- data/vendor/libgit2/src/libgit2/config.c +394 -300
- data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
- data/vendor/libgit2/src/libgit2/config.h +9 -4
- data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
- data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
- data/vendor/libgit2/src/libgit2/config_file.c +113 -96
- data/vendor/libgit2/src/libgit2/config_list.c +285 -0
- data/vendor/libgit2/src/libgit2/config_list.h +32 -0
- data/vendor/libgit2/src/libgit2/config_mem.c +194 -40
- data/vendor/libgit2/src/libgit2/config_parse.c +10 -9
- data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
- data/vendor/libgit2/src/libgit2/describe.c +34 -31
- data/vendor/libgit2/src/libgit2/diff.c +17 -8
- data/vendor/libgit2/src/libgit2/diff.h +6 -6
- data/vendor/libgit2/src/libgit2/diff_driver.c +12 -19
- data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
- data/vendor/libgit2/src/libgit2/diff_file.c +7 -7
- data/vendor/libgit2/src/libgit2/diff_generate.c +39 -18
- data/vendor/libgit2/src/libgit2/diff_parse.c +22 -6
- data/vendor/libgit2/src/libgit2/diff_print.c +88 -13
- data/vendor/libgit2/src/libgit2/diff_tform.c +40 -12
- data/vendor/libgit2/src/libgit2/diff_xdiff.h +1 -1
- data/vendor/libgit2/src/libgit2/email.c +5 -3
- data/vendor/libgit2/src/libgit2/fetch.c +39 -9
- data/vendor/libgit2/src/libgit2/fetch.h +0 -2
- data/vendor/libgit2/src/libgit2/fetchhead.c +11 -9
- data/vendor/libgit2/src/libgit2/filter.c +5 -5
- data/vendor/libgit2/src/libgit2/git2.rc +3 -3
- data/vendor/libgit2/src/libgit2/grafts.c +270 -0
- data/vendor/libgit2/src/libgit2/grafts.h +35 -0
- data/vendor/libgit2/src/libgit2/graph.c +1 -1
- data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
- data/vendor/libgit2/src/libgit2/ident.c +3 -3
- data/vendor/libgit2/src/libgit2/ignore.c +9 -5
- data/vendor/libgit2/src/libgit2/index.c +392 -208
- data/vendor/libgit2/src/libgit2/index.h +16 -3
- data/vendor/libgit2/src/libgit2/index_map.c +95 -0
- data/vendor/libgit2/src/libgit2/index_map.h +28 -0
- data/vendor/libgit2/src/libgit2/indexer.c +44 -41
- data/vendor/libgit2/src/libgit2/iterator.c +34 -13
- data/vendor/libgit2/src/libgit2/iterator.h +3 -0
- data/vendor/libgit2/src/libgit2/libgit2.c +155 -331
- data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
- data/vendor/libgit2/src/libgit2/merge.c +56 -46
- data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
- data/vendor/libgit2/src/libgit2/merge_file.c +0 -2
- data/vendor/libgit2/src/libgit2/midx.c +86 -44
- data/vendor/libgit2/src/libgit2/midx.h +13 -3
- data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
- data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
- data/vendor/libgit2/src/libgit2/notes.c +9 -8
- data/vendor/libgit2/src/libgit2/object.c +42 -16
- data/vendor/libgit2/src/libgit2/object.h +6 -0
- data/vendor/libgit2/src/libgit2/odb.c +16 -9
- data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
- data/vendor/libgit2/src/libgit2/odb_pack.c +28 -7
- data/vendor/libgit2/src/libgit2/oid.c +35 -2
- data/vendor/libgit2/src/libgit2/oid.h +11 -0
- data/vendor/libgit2/src/libgit2/oidarray.c +49 -3
- data/vendor/libgit2/src/libgit2/oidarray.h +5 -1
- data/vendor/libgit2/src/libgit2/pack-objects.c +77 -43
- data/vendor/libgit2/src/libgit2/pack-objects.h +17 -6
- data/vendor/libgit2/src/libgit2/pack.c +33 -27
- data/vendor/libgit2/src/libgit2/pack.h +15 -10
- data/vendor/libgit2/src/libgit2/parse.c +7 -4
- data/vendor/libgit2/src/libgit2/parse.h +1 -1
- data/vendor/libgit2/src/libgit2/patch.h +7 -1
- data/vendor/libgit2/src/libgit2/patch_generate.c +24 -5
- data/vendor/libgit2/src/libgit2/patch_parse.c +18 -10
- data/vendor/libgit2/src/libgit2/path.c +1 -1
- data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
- data/vendor/libgit2/src/libgit2/push.c +81 -30
- data/vendor/libgit2/src/libgit2/push.h +1 -0
- data/vendor/libgit2/src/libgit2/reader.c +1 -1
- data/vendor/libgit2/src/libgit2/rebase.c +72 -84
- data/vendor/libgit2/src/libgit2/refdb_fs.c +146 -70
- data/vendor/libgit2/src/libgit2/reflog.c +1 -2
- data/vendor/libgit2/src/libgit2/reflog.h +2 -0
- data/vendor/libgit2/src/libgit2/refs.c +34 -8
- data/vendor/libgit2/src/libgit2/refs.h +6 -1
- data/vendor/libgit2/src/libgit2/refspec.c +28 -1
- data/vendor/libgit2/src/libgit2/refspec.h +8 -0
- data/vendor/libgit2/src/libgit2/remote.c +136 -67
- data/vendor/libgit2/src/libgit2/remote.h +1 -0
- data/vendor/libgit2/src/libgit2/repository.c +789 -330
- data/vendor/libgit2/src/libgit2/repository.h +22 -3
- data/vendor/libgit2/src/libgit2/reset.c +2 -2
- data/vendor/libgit2/src/libgit2/revert.c +9 -13
- data/vendor/libgit2/src/libgit2/revparse.c +6 -3
- data/vendor/libgit2/src/libgit2/revwalk.c +36 -11
- data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
- data/vendor/libgit2/src/libgit2/settings.c +468 -0
- data/vendor/libgit2/src/libgit2/settings.h +6 -2
- data/vendor/libgit2/src/libgit2/signature.c +132 -15
- data/vendor/libgit2/src/libgit2/signature.h +0 -1
- data/vendor/libgit2/src/libgit2/stash.c +9 -8
- data/vendor/libgit2/src/libgit2/status.c +1 -1
- data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -61
- data/vendor/libgit2/src/libgit2/streams/openssl.c +40 -23
- data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
- data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
- data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
- data/vendor/libgit2/src/libgit2/streams/schannel.c +715 -0
- data/vendor/libgit2/src/libgit2/streams/schannel.h +28 -0
- data/vendor/libgit2/src/libgit2/streams/socket.c +237 -51
- data/vendor/libgit2/src/libgit2/streams/socket.h +3 -1
- data/vendor/libgit2/src/libgit2/streams/stransport.c +79 -19
- data/vendor/libgit2/src/libgit2/streams/tls.c +5 -0
- data/vendor/libgit2/src/libgit2/submodule.c +106 -63
- data/vendor/libgit2/src/libgit2/submodule.h +9 -10
- data/vendor/libgit2/src/libgit2/tag.c +1 -1
- data/vendor/libgit2/src/libgit2/trailer.c +6 -6
- data/vendor/libgit2/src/libgit2/transaction.c +26 -20
- data/vendor/libgit2/src/libgit2/transaction.h +4 -1
- data/vendor/libgit2/src/libgit2/transport.c +4 -1
- data/vendor/libgit2/src/libgit2/transports/auth.h +1 -2
- data/vendor/libgit2/src/libgit2/transports/{auth_negotiate.c → auth_gssapi.c} +32 -32
- data/vendor/libgit2/src/libgit2/transports/auth_negotiate.h +1 -1
- data/vendor/libgit2/src/libgit2/transports/auth_ntlm.h +1 -1
- data/vendor/libgit2/src/libgit2/transports/{auth_ntlm.c → auth_ntlmclient.c} +12 -12
- data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +341 -0
- data/vendor/libgit2/src/libgit2/transports/credential.c +1 -1
- data/vendor/libgit2/src/libgit2/transports/git.c +7 -8
- data/vendor/libgit2/src/libgit2/transports/http.c +8 -4
- data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
- data/vendor/libgit2/src/libgit2/transports/httpclient.c +117 -72
- data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
- data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
- data/vendor/libgit2/src/libgit2/transports/local.c +21 -11
- data/vendor/libgit2/src/libgit2/transports/smart.c +50 -32
- data/vendor/libgit2/src/libgit2/transports/smart.h +26 -9
- data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +139 -18
- data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +209 -57
- data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
- data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +347 -0
- data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
- data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1126 -0
- data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
- data/vendor/libgit2/src/libgit2/transports/winhttp.c +48 -21
- data/vendor/libgit2/src/libgit2/tree-cache.c +26 -16
- data/vendor/libgit2/src/libgit2/tree-cache.h +5 -3
- data/vendor/libgit2/src/libgit2/tree.c +35 -27
- data/vendor/libgit2/src/libgit2/tree.h +3 -2
- data/vendor/libgit2/src/libgit2/worktree.c +39 -27
- data/vendor/libgit2/src/util/CMakeLists.txt +4 -6
- data/vendor/libgit2/src/util/alloc.c +69 -7
- data/vendor/libgit2/src/util/alloc.h +34 -9
- data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
- data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
- data/vendor/libgit2/src/util/allocators/failalloc.c +0 -60
- data/vendor/libgit2/src/util/allocators/failalloc.h +0 -6
- data/vendor/libgit2/src/util/allocators/stdalloc.c +2 -115
- data/vendor/libgit2/src/util/allocators/win32_leakcheck.c +0 -68
- data/vendor/libgit2/src/util/array.h +24 -18
- data/vendor/libgit2/src/util/cc-compat.h +4 -0
- data/vendor/libgit2/src/util/ctype_compat.h +70 -0
- data/vendor/libgit2/src/util/date.c +22 -14
- data/vendor/libgit2/src/util/date.h +12 -0
- data/vendor/libgit2/src/util/errors.c +401 -0
- data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
- data/vendor/libgit2/src/util/filebuf.c +6 -1
- data/vendor/libgit2/src/util/filebuf.h +19 -6
- data/vendor/libgit2/src/util/fs_path.c +16 -5
- data/vendor/libgit2/src/util/fs_path.h +23 -0
- data/vendor/libgit2/src/util/futils.c +14 -10
- data/vendor/libgit2/src/util/futils.h +13 -4
- data/vendor/libgit2/src/util/git2_features.h.in +21 -4
- data/vendor/libgit2/src/util/git2_util.h +6 -0
- data/vendor/libgit2/src/util/hash/openssl.c +152 -0
- data/vendor/libgit2/src/util/hash/openssl.h +17 -1
- data/vendor/libgit2/src/util/hash/sha.h +4 -1
- data/vendor/libgit2/src/util/hashmap.h +424 -0
- data/vendor/libgit2/src/util/hashmap_str.h +43 -0
- data/vendor/libgit2/src/util/integer.h +3 -1
- data/vendor/libgit2/src/util/net.c +318 -161
- data/vendor/libgit2/src/util/net.h +27 -0
- data/vendor/libgit2/src/util/pool.c +1 -1
- data/vendor/libgit2/src/util/pool.h +5 -0
- data/vendor/libgit2/src/util/posix.c +54 -0
- data/vendor/libgit2/src/util/posix.h +22 -0
- data/vendor/libgit2/src/util/pqueue.h +1 -1
- data/vendor/libgit2/src/util/process.h +222 -0
- data/vendor/libgit2/src/util/rand.c +6 -10
- data/vendor/libgit2/src/util/regexp.c +1 -1
- data/vendor/libgit2/src/util/sortedcache.c +14 -13
- data/vendor/libgit2/src/util/sortedcache.h +3 -3
- data/vendor/libgit2/src/util/staticstr.h +66 -0
- data/vendor/libgit2/src/util/str.c +2 -2
- data/vendor/libgit2/src/util/strlist.c +108 -0
- data/vendor/libgit2/src/util/strlist.h +36 -0
- data/vendor/libgit2/src/util/unix/posix.h +0 -2
- data/vendor/libgit2/src/util/unix/process.c +629 -0
- data/vendor/libgit2/src/util/unix/realpath.c +23 -5
- data/vendor/libgit2/src/util/util.c +17 -12
- data/vendor/libgit2/src/util/util.h +28 -54
- data/vendor/libgit2/src/util/vector.c +3 -3
- data/vendor/libgit2/src/util/vector.h +2 -2
- data/vendor/libgit2/src/util/win32/error.c +1 -1
- data/vendor/libgit2/src/util/win32/path_w32.c +8 -8
- data/vendor/libgit2/src/util/win32/posix_w32.c +30 -7
- data/vendor/libgit2/src/util/win32/process.c +506 -0
- data/vendor/libgit2/src/util/win32/utf-conv.c +73 -75
- data/vendor/libgit2/src/util/win32/utf-conv.h +81 -14
- data/vendor/libgit2/src/util/win32/w32_util.c +1 -1
- metadata +72 -49
- data/vendor/libgit2/cmake/SelectWinHTTP.cmake +0 -17
- data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
- data/vendor/libgit2/deps/http-parser/COPYING +0 -23
- data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
- data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
- data/vendor/libgit2/deps/zlib/COPYING +0 -27
- data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
- data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
- data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
- data/vendor/libgit2/src/libgit2/errors.c +0 -238
- data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
- data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
- data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
- data/vendor/libgit2/src/libgit2/netops.c +0 -124
- data/vendor/libgit2/src/libgit2/netops.h +0 -68
- data/vendor/libgit2/src/libgit2/offmap.c +0 -101
- data/vendor/libgit2/src/libgit2/offmap.h +0 -133
- data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
- data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
- data/vendor/libgit2/src/libgit2/threadstate.c +0 -84
- data/vendor/libgit2/src/libgit2/threadstate.h +0 -24
- data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
- data/vendor/libgit2/src/util/khash.h +0 -615
- data/vendor/libgit2/src/util/strmap.c +0 -100
- data/vendor/libgit2/src/util/strmap.h +0 -131
- /data/vendor/libgit2/cmake/{FindHTTPParser.cmake → FindHTTP_Parser.cmake} +0 -0
- /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiff.h +0 -0
- /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.h +0 -0
- /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xinclude.h +0 -0
- /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.h +0 -0
- /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
|
-
|
58
|
+
be = (git_config_backend_entry *)entry;
|
59
|
+
be->free(be);
|
31
60
|
}
|
32
61
|
|
33
|
-
|
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 =
|
66
|
+
backend = instance->backend;
|
45
67
|
backend->free(backend);
|
46
|
-
git__free(
|
68
|
+
git__free(instance);
|
47
69
|
}
|
48
70
|
|
49
|
-
static void config_free(git_config *
|
71
|
+
static void config_free(git_config *config)
|
50
72
|
{
|
51
73
|
size_t i;
|
52
|
-
|
74
|
+
backend_entry *entry;
|
53
75
|
|
54
|
-
|
55
|
-
|
56
|
-
|
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
|
-
|
60
|
-
|
61
|
-
|
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 *
|
86
|
+
void git_config_free(git_config *config)
|
66
87
|
{
|
67
|
-
if (
|
88
|
+
if (config == NULL)
|
68
89
|
return;
|
69
90
|
|
70
|
-
GIT_REFCOUNT_DEC(
|
91
|
+
GIT_REFCOUNT_DEC(config, config_free);
|
71
92
|
}
|
72
93
|
|
73
|
-
static int
|
94
|
+
static int reader_cmp(const void *_a, const void *_b)
|
74
95
|
{
|
75
|
-
const
|
76
|
-
const
|
96
|
+
const backend_entry *a = _a;
|
97
|
+
const backend_entry *b = _b;
|
77
98
|
|
78
|
-
return
|
99
|
+
return b->level - a->level;
|
79
100
|
}
|
80
101
|
|
81
|
-
int
|
102
|
+
static int writer_cmp(const void *_a, const void *_b)
|
82
103
|
{
|
83
|
-
|
104
|
+
const backend_entry *a = _a;
|
105
|
+
const backend_entry *b = _b;
|
84
106
|
|
85
|
-
|
86
|
-
|
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
|
-
|
114
|
+
config = git__calloc(1, sizeof(git_config));
|
115
|
+
GIT_ERROR_CHECK_ALLOC(config);
|
89
116
|
|
90
|
-
if (git_vector_init(&
|
91
|
-
|
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
|
-
|
96
|
-
|
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 *
|
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(
|
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(
|
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
|
-
|
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->
|
194
|
+
git_vector_foreach(&in->readers, i, entry) {
|
166
195
|
git_config_backend *b;
|
167
196
|
|
168
|
-
if ((error =
|
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,
|
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
|
-
|
187
|
-
const git_config *
|
217
|
+
backend_instance **out,
|
218
|
+
const git_config *config,
|
188
219
|
git_config_level_t level)
|
189
220
|
{
|
190
|
-
|
191
|
-
backend_internal *internal;
|
221
|
+
backend_entry *entry, *found = NULL;
|
192
222
|
size_t i;
|
193
223
|
|
194
|
-
/*
|
195
|
-
*
|
196
|
-
*
|
197
|
-
*
|
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
|
-
|
231
|
+
found = git_vector_get(&config->readers, 0);
|
201
232
|
} else {
|
202
|
-
git_vector_foreach(&
|
203
|
-
if (
|
204
|
-
|
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 (
|
241
|
+
if (!found) {
|
209
242
|
git_error_set(GIT_ERROR_CONFIG,
|
210
|
-
"no configuration exists for the given level '%
|
243
|
+
"no configuration exists for the given level '%d'", level);
|
211
244
|
return GIT_ENOTFOUND;
|
212
245
|
}
|
213
246
|
|
214
|
-
*out =
|
215
|
-
|
247
|
+
*out = found->instance;
|
216
248
|
return 0;
|
217
249
|
}
|
218
250
|
|
219
|
-
static int duplicate_level(void **
|
251
|
+
static int duplicate_level(void **_old, void *_new)
|
220
252
|
{
|
221
|
-
|
253
|
+
backend_entry **old = (backend_entry **)_old;
|
222
254
|
|
223
|
-
GIT_UNUSED(
|
255
|
+
GIT_UNUSED(_new);
|
224
256
|
|
225
|
-
git_error_set(GIT_ERROR_CONFIG, "
|
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 *
|
262
|
+
git_config *config,
|
231
263
|
git_config_level_t level)
|
232
264
|
{
|
233
|
-
|
234
|
-
backend_internal *internal;
|
265
|
+
backend_entry *entry, *found = NULL;
|
235
266
|
size_t i;
|
236
267
|
|
237
|
-
git_vector_foreach(&
|
238
|
-
if (
|
239
|
-
|
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 (
|
276
|
+
if (!found)
|
243
277
|
return;
|
244
278
|
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
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(
|
286
|
+
GIT_REFCOUNT_DEC(found->instance, backend_instance_free);
|
287
|
+
git__free(found);
|
251
288
|
}
|
252
289
|
|
253
|
-
static int
|
254
|
-
git_config *
|
255
|
-
|
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(
|
301
|
+
try_remove_existing_backend(config, level);
|
264
302
|
|
265
|
-
|
266
|
-
|
267
|
-
return result;
|
303
|
+
entry = git__malloc(sizeof(backend_entry));
|
304
|
+
GIT_ERROR_CHECK_ALLOC(entry);
|
268
305
|
|
269
|
-
|
270
|
-
|
306
|
+
entry->instance = instance;
|
307
|
+
entry->level = level;
|
308
|
+
entry->write_order = level;
|
271
309
|
|
272
|
-
|
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 **
|
323
|
+
int git_config_open_global(git_config **out, git_config *config)
|
278
324
|
{
|
279
|
-
|
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(
|
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 **
|
287
|
-
const git_config *
|
338
|
+
git_config **out,
|
339
|
+
const git_config *parent,
|
288
340
|
git_config_level_t level)
|
289
341
|
{
|
290
|
-
git_config *
|
291
|
-
|
342
|
+
git_config *config;
|
343
|
+
backend_instance *instance;
|
292
344
|
int res;
|
293
345
|
|
294
|
-
if ((res = find_backend_by_level(&
|
346
|
+
if ((res = find_backend_by_level(&instance, parent, level)) < 0)
|
295
347
|
return res;
|
296
348
|
|
297
|
-
if ((res = git_config_new(&
|
349
|
+
if ((res = git_config_new(&config)) < 0)
|
298
350
|
return res;
|
299
351
|
|
300
|
-
if ((res =
|
301
|
-
git_config_free(
|
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
|
-
*
|
357
|
+
*out = config;
|
306
358
|
|
307
359
|
return 0;
|
308
360
|
}
|
309
361
|
|
310
362
|
int git_config_add_backend(
|
311
|
-
git_config *
|
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
|
-
|
369
|
+
backend_instance *instance;
|
318
370
|
int result;
|
319
371
|
|
320
|
-
GIT_ASSERT_ARG(
|
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
|
-
|
329
|
-
GIT_ERROR_CHECK_ALLOC(
|
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
|
-
|
334
|
-
|
383
|
+
instance->backend = backend;
|
384
|
+
instance->backend->cfg = config;
|
335
385
|
|
336
|
-
if ((result =
|
337
|
-
git__free(
|
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 *
|
431
|
+
const git_config *config;
|
352
432
|
git_regexp regex;
|
353
433
|
size_t i;
|
354
434
|
} all_iter;
|
355
435
|
|
356
|
-
static int
|
357
|
-
|
358
|
-
|
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
|
-
|
441
|
+
backend_entry *entry;
|
376
442
|
git_config_backend *backend;
|
377
|
-
|
443
|
+
git_config_backend_entry *be;
|
378
444
|
int error = 0;
|
379
445
|
|
380
446
|
if (iter->current != NULL &&
|
381
|
-
(error = iter->current->next(
|
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 (
|
456
|
+
if (iter->i == 0)
|
390
457
|
return GIT_ITEROVER;
|
391
458
|
|
392
|
-
|
393
|
-
|
394
|
-
|
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(
|
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(
|
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
|
-
*
|
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 *
|
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 =
|
469
|
-
iter->
|
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 *
|
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,
|
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 =
|
495
|
-
iter->
|
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 *
|
579
|
+
const git_config *config, git_config_foreach_cb cb, void *payload)
|
504
580
|
{
|
505
|
-
return git_config_foreach_match(
|
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
|
-
|
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(®ex, entry->name) != 0)
|
608
|
+
if (regexp && git_regexp_match(®ex, 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 *
|
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,
|
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
|
-
|
583
|
-
|
584
|
-
|
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
|
-
|
663
|
+
git_vector_foreach(&config->writers, i, entry) {
|
664
|
+
if (entry->instance->backend->readonly)
|
665
|
+
continue;
|
599
666
|
|
600
|
-
|
601
|
-
|
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
|
-
|
608
|
-
if (!backend->backend->readonly) {
|
609
|
-
*out = backend->backend;
|
610
|
-
return 0;
|
611
|
-
}
|
670
|
+
return entry->instance;
|
612
671
|
}
|
613
672
|
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
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 *
|
683
|
+
int git_config_delete_entry(git_config *config, const char *name)
|
621
684
|
{
|
622
685
|
git_config_backend *backend;
|
623
686
|
|
624
|
-
if (
|
625
|
-
return
|
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 *
|
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(
|
697
|
+
return git_config_set_string(config, name, str_value);
|
635
698
|
}
|
636
699
|
|
637
|
-
int git_config_set_int32(git_config *
|
700
|
+
int git_config_set_int32(git_config *config, const char *name, int32_t value)
|
638
701
|
{
|
639
|
-
return git_config_set_int64(
|
702
|
+
return git_config_set_int64(config, name, (int64_t)value);
|
640
703
|
}
|
641
704
|
|
642
|
-
int git_config_set_bool(git_config *
|
705
|
+
int git_config_set_bool(git_config *config, const char *name, int value)
|
643
706
|
{
|
644
|
-
return git_config_set_string(
|
707
|
+
return git_config_set_string(config, name, value ? "true" : "false");
|
645
708
|
}
|
646
709
|
|
647
|
-
int git_config_set_string(git_config *
|
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 (
|
658
|
-
|
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(
|
663
|
-
git_repository__configmap_lookup_cache_clear(GIT_REFCOUNT_OWNER(
|
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 *
|
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(&
|
738
|
-
|
739
|
-
|
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
|
-
|
742
|
-
|
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 *
|
830
|
+
git_config_entry **out, const git_config *config, const char *name)
|
761
831
|
{
|
762
|
-
return get_entry(out,
|
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 *
|
837
|
+
const git_config *config,
|
768
838
|
const char *key,
|
769
839
|
bool no_errors)
|
770
840
|
{
|
771
841
|
return get_entry(
|
772
|
-
out,
|
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 *
|
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,
|
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 *
|
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,
|
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 *
|
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,
|
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 *
|
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,
|
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 *
|
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(&
|
842
|
-
|
843
|
-
continue;
|
911
|
+
git_vector_foreach(&config->writers, i, entry) {
|
912
|
+
GIT_ASSERT(entry->instance && entry->instance->backend);
|
844
913
|
|
845
|
-
if (!
|
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 *
|
945
|
+
const git_config *config,
|
877
946
|
const char *name)
|
878
947
|
{
|
879
|
-
GIT_BUF_WRAP_PRIVATE(out, git_config__get_path,
|
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 *
|
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,
|
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 *
|
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(
|
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,
|
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 *
|
988
|
+
git_buf *out, const git_config *config, const char *name)
|
920
989
|
{
|
921
|
-
GIT_BUF_WRAP_PRIVATE(out, git_config__get_string_buf,
|
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 *
|
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(
|
1001
|
+
GIT_ASSERT_ARG(config);
|
933
1002
|
|
934
|
-
ret = get_entry(&entry,
|
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 *
|
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,
|
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 *
|
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,
|
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 *
|
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,
|
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 *
|
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
|
-
|
1063
|
+
git_config_backend_entry *be;
|
995
1064
|
|
996
|
-
if ((err = git_config_multivar_iterator_new(&iter,
|
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(&
|
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(
|
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 *
|
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,
|
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 *
|
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 (
|
1100
|
-
|
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 *
|
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 (
|
1110
|
-
return
|
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
|
-
|
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
|
-
|
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 *
|
1301
|
+
git_config *config = NULL;
|
1219
1302
|
git_str buf = GIT_STR_INIT;
|
1220
1303
|
|
1221
|
-
if ((error = git_config_new(&
|
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(
|
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(
|
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(
|
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(
|
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(
|
1246
|
-
|
1328
|
+
git_config_free(config);
|
1329
|
+
config = NULL;
|
1247
1330
|
}
|
1248
1331
|
|
1249
|
-
*out =
|
1332
|
+
*out = config;
|
1250
1333
|
|
1251
1334
|
return error;
|
1252
1335
|
}
|
1253
1336
|
|
1254
|
-
int git_config_lock(git_transaction **out, git_config *
|
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(
|
1342
|
+
GIT_ASSERT_ARG(config);
|
1261
1343
|
|
1262
|
-
|
1263
|
-
|
1264
|
-
|
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
|
-
|
1353
|
+
GIT_REFCOUNT_INC(instance);
|
1354
|
+
return 0;
|
1273
1355
|
}
|
1274
1356
|
|
1275
|
-
int git_config_unlock(
|
1357
|
+
int git_config_unlock(
|
1358
|
+
git_config *config,
|
1359
|
+
void *data,
|
1360
|
+
int commit)
|
1276
1361
|
{
|
1277
|
-
|
1278
|
-
|
1279
|
-
|
1280
|
-
GIT_ASSERT_ARG(cfg);
|
1362
|
+
backend_instance *instance = data;
|
1363
|
+
int error;
|
1281
1364
|
|
1282
|
-
|
1283
|
-
|
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
|
-
|
1368
|
+
error = instance->backend->unlock(instance->backend, commit);
|
1369
|
+
GIT_REFCOUNT_DEC(instance, backend_instance_free);
|
1289
1370
|
|
1290
|
-
return
|
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 (
|
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
|
-
|
1511
|
-
|
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
|
-
|
1605
|
+
if (git_str_oom(&value)) {
|
1606
|
+
error = -1;
|
1607
|
+
goto cleanup;
|
1517
1608
|
}
|
1518
1609
|
|
1519
|
-
|
1520
|
-
|
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
|
|