rugged 1.7.2 → 1.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/rugged/extconf.rb +4 -4
- data/ext/rugged/rugged.c +12 -1
- data/ext/rugged/rugged_blame.c +22 -6
- data/ext/rugged/rugged_blob.c +24 -9
- data/ext/rugged/rugged_branch.c +10 -7
- data/ext/rugged/rugged_branch_collection.c +8 -6
- data/ext/rugged/rugged_commit.c +7 -6
- data/ext/rugged/rugged_config.c +20 -11
- data/ext/rugged/rugged_diff.c +26 -12
- data/ext/rugged/rugged_diff_hunk.c +2 -1
- data/ext/rugged/rugged_index.c +39 -29
- data/ext/rugged/rugged_note.c +7 -6
- data/ext/rugged/rugged_object.c +3 -2
- data/ext/rugged/rugged_patch.c +23 -9
- data/ext/rugged/rugged_rebase.c +22 -10
- data/ext/rugged/rugged_reference.c +22 -13
- data/ext/rugged/rugged_reference_collection.c +9 -7
- data/ext/rugged/rugged_remote.c +23 -12
- data/ext/rugged/rugged_remote_collection.c +11 -9
- data/ext/rugged/rugged_repo.c +60 -45
- data/ext/rugged/rugged_revwalk.c +22 -12
- data/ext/rugged/rugged_submodule.c +23 -20
- data/ext/rugged/rugged_submodule_collection.c +20 -9
- data/ext/rugged/rugged_tag.c +6 -4
- data/ext/rugged/rugged_tag_collection.c +7 -5
- data/ext/rugged/rugged_tree.c +27 -15
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/AUTHORS +3 -0
- data/vendor/libgit2/CMakeLists.txt +23 -10
- data/vendor/libgit2/COPYING +195 -1
- data/vendor/libgit2/cmake/DefaultCFlags.cmake +4 -1
- data/vendor/libgit2/cmake/{FindIconv.cmake → FindIntlIconv.cmake} +6 -0
- data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
- data/vendor/libgit2/cmake/SelectGSSAPI.cmake +1 -1
- data/vendor/libgit2/cmake/SelectHTTPParser.cmake +23 -8
- data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +17 -8
- data/vendor/libgit2/cmake/SelectHashes.cmake +28 -11
- data/vendor/libgit2/cmake/SelectRegex.cmake +6 -1
- data/vendor/libgit2/cmake/SelectSSH.cmake +30 -19
- 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 +3 -3
- data/vendor/libgit2/deps/xdiff/CMakeLists.txt +1 -1
- data/vendor/libgit2/deps/xdiff/xmerge.c +16 -12
- 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 +120 -63
- 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 +134 -4
- data/vendor/libgit2/include/git2/describe.h +13 -1
- data/vendor/libgit2/include/git2/diff.h +38 -8
- data/vendor/libgit2/include/git2/email.h +9 -29
- data/vendor/libgit2/include/git2/errors.h +46 -73
- 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 -15
- 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 +50 -3
- 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 +23 -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 +12 -3
- 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 +113 -25
- data/vendor/libgit2/include/git2/repository.h +57 -21
- 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 -0
- data/vendor/libgit2/include/git2/sys/commit.h +77 -3
- data/vendor/libgit2/include/git2/sys/commit_graph.h +103 -62
- 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 +43 -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 +11 -2
- data/vendor/libgit2/include/git2/sys/transport.h +25 -4
- 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 +46 -8
- data/vendor/libgit2/include/git2/worktree.h +16 -6
- data/vendor/libgit2/src/CMakeLists.txt +6 -4
- data/vendor/libgit2/src/cli/CMakeLists.txt +3 -4
- 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 +5 -7
- 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 +31 -5
- 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 +51 -2
- data/vendor/libgit2/src/cli/progress.h +12 -0
- 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 +55 -21
- data/vendor/libgit2/src/libgit2/apply.c +10 -13
- data/vendor/libgit2/src/libgit2/attr.c +30 -13
- data/vendor/libgit2/src/libgit2/attr_file.c +17 -5
- 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 +130 -44
- data/vendor/libgit2/src/libgit2/blame.h +1 -0
- 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 +1 -2
- data/vendor/libgit2/src/libgit2/clone.c +192 -166
- data/vendor/libgit2/src/libgit2/clone.h +4 -1
- data/vendor/libgit2/src/libgit2/commit.c +93 -1
- data/vendor/libgit2/src/libgit2/commit_graph.c +68 -58
- data/vendor/libgit2/src/libgit2/commit_graph.h +1 -2
- data/vendor/libgit2/src/libgit2/config.c +390 -299
- 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 +101 -89
- 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 +195 -40
- data/vendor/libgit2/src/libgit2/config_parse.c +12 -10
- data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
- data/vendor/libgit2/src/libgit2/delta.c +5 -1
- data/vendor/libgit2/src/libgit2/describe.c +24 -24
- data/vendor/libgit2/src/libgit2/diff.c +1 -1
- data/vendor/libgit2/src/libgit2/diff_driver.c +13 -20
- data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
- data/vendor/libgit2/src/libgit2/diff_generate.c +3 -3
- data/vendor/libgit2/src/libgit2/diff_parse.c +2 -2
- data/vendor/libgit2/src/libgit2/diff_print.c +65 -9
- data/vendor/libgit2/src/libgit2/diff_stats.c +19 -12
- data/vendor/libgit2/src/libgit2/diff_tform.c +36 -8
- data/vendor/libgit2/src/libgit2/email.c +1 -0
- data/vendor/libgit2/src/libgit2/fetch.c +5 -3
- data/vendor/libgit2/src/libgit2/fetchhead.c +1 -1
- 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 +18 -20
- data/vendor/libgit2/src/libgit2/grafts.h +0 -1
- data/vendor/libgit2/src/libgit2/graph.c +1 -1
- data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
- data/vendor/libgit2/src/libgit2/ignore.c +9 -5
- data/vendor/libgit2/src/libgit2/index.c +76 -98
- data/vendor/libgit2/src/libgit2/index.h +5 -2
- 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 +36 -40
- data/vendor/libgit2/src/libgit2/iterator.c +14 -8
- data/vendor/libgit2/src/libgit2/libgit2.c +153 -368
- data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
- data/vendor/libgit2/src/libgit2/merge.c +43 -38
- data/vendor/libgit2/src/libgit2/merge.h +4 -0
- data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
- data/vendor/libgit2/src/libgit2/merge_file.c +43 -30
- data/vendor/libgit2/src/libgit2/message.c +1 -1
- data/vendor/libgit2/src/libgit2/midx.c +30 -18
- data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
- data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
- data/vendor/libgit2/src/libgit2/object.c +6 -5
- data/vendor/libgit2/src/libgit2/odb.c +7 -10
- data/vendor/libgit2/src/libgit2/odb_loose.c +24 -14
- data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
- data/vendor/libgit2/src/libgit2/odb_pack.c +13 -5
- data/vendor/libgit2/src/libgit2/oid.c +36 -10
- data/vendor/libgit2/src/libgit2/oid.h +11 -0
- data/vendor/libgit2/src/libgit2/pack-objects.c +59 -34
- data/vendor/libgit2/src/libgit2/pack-objects.h +12 -4
- data/vendor/libgit2/src/libgit2/pack.c +33 -24
- data/vendor/libgit2/src/libgit2/pack.h +15 -10
- data/vendor/libgit2/src/libgit2/patch_parse.c +2 -2
- 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 +79 -28
- data/vendor/libgit2/src/libgit2/push.h +1 -0
- data/vendor/libgit2/src/libgit2/refdb_fs.c +128 -61
- 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 +41 -13
- 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 +125 -62
- data/vendor/libgit2/src/libgit2/remote.h +0 -1
- data/vendor/libgit2/src/libgit2/repository.c +235 -54
- data/vendor/libgit2/src/libgit2/repository.h +10 -6
- data/vendor/libgit2/src/libgit2/revert.c +1 -2
- data/vendor/libgit2/src/libgit2/revparse.c +2 -2
- data/vendor/libgit2/src/libgit2/revwalk.c +13 -10
- 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/status.c +1 -1
- data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -60
- data/vendor/libgit2/src/libgit2/streams/openssl.c +32 -7
- 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/socket.c +30 -0
- data/vendor/libgit2/src/libgit2/streams/stransport.c +39 -7
- data/vendor/libgit2/src/libgit2/submodule.c +118 -68
- data/vendor/libgit2/src/libgit2/submodule.h +6 -7
- data/vendor/libgit2/src/libgit2/tag.c +4 -2
- 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_sspi.c +2 -0
- data/vendor/libgit2/src/libgit2/transports/credential.c +2 -2
- data/vendor/libgit2/src/libgit2/transports/git.c +1 -1
- data/vendor/libgit2/src/libgit2/transports/http.c +1 -2
- data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
- data/vendor/libgit2/src/libgit2/transports/httpclient.c +124 -81
- 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 +16 -8
- data/vendor/libgit2/src/libgit2/transports/smart.c +25 -13
- data/vendor/libgit2/src/libgit2/transports/smart.h +4 -2
- data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +5 -5
- data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +55 -10
- data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
- data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +386 -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 +35 -7
- data/vendor/libgit2/src/libgit2/tree.c +34 -26
- data/vendor/libgit2/src/libgit2/tree.h +3 -2
- data/vendor/libgit2/src/libgit2/worktree.c +14 -17
- data/vendor/libgit2/src/util/CMakeLists.txt +7 -10
- data/vendor/libgit2/src/util/alloc.c +4 -1
- 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/stdalloc.c +0 -10
- data/vendor/libgit2/src/util/array.h +18 -17
- data/vendor/libgit2/src/util/cc-compat.h +2 -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/fs_path.c +81 -10
- data/vendor/libgit2/src/util/fs_path.h +29 -0
- data/vendor/libgit2/src/util/futils.c +6 -5
- data/vendor/libgit2/src/util/futils.h +24 -7
- data/vendor/libgit2/src/util/git2_features.h.in +12 -1
- data/vendor/libgit2/src/util/git2_util.h +6 -0
- data/vendor/libgit2/src/util/hash/builtin.c +14 -4
- data/vendor/libgit2/src/util/hash/openssl.c +148 -0
- data/vendor/libgit2/src/util/hash/openssl.h +17 -1
- data/vendor/libgit2/src/util/hash/rfc6234/sha224-256.c +8 -6
- data/vendor/libgit2/src/util/hash/sha.h +4 -1
- data/vendor/libgit2/src/util/hashmap.h +425 -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 +17 -11
- data/vendor/libgit2/src/util/net.h +2 -0
- data/vendor/libgit2/src/util/pool.c +1 -1
- data/vendor/libgit2/src/util/pool.h +5 -0
- data/vendor/libgit2/src/util/pqueue.h +1 -1
- data/vendor/libgit2/src/util/process.h +223 -0
- data/vendor/libgit2/src/util/rand.c +1 -7
- data/vendor/libgit2/src/util/regexp.c +1 -1
- data/vendor/libgit2/src/util/runtime.c +2 -2
- data/vendor/libgit2/src/util/sortedcache.c +14 -13
- data/vendor/libgit2/src/util/sortedcache.h +3 -3
- data/vendor/libgit2/src/util/str.c +20 -8
- data/vendor/libgit2/src/util/str.h +5 -3
- 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 +706 -0
- data/vendor/libgit2/src/util/unix/realpath.c +23 -5
- data/vendor/libgit2/src/util/util.c +18 -5
- data/vendor/libgit2/src/util/util.h +5 -38
- data/vendor/libgit2/src/util/vector.c +3 -3
- data/vendor/libgit2/src/util/vector.h +2 -2
- data/vendor/libgit2/src/util/win32/path_w32.c +81 -5
- data/vendor/libgit2/src/util/win32/posix_w32.c +29 -6
- data/vendor/libgit2/src/util/win32/process.c +522 -0
- metadata +60 -32
- 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 -293
- 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/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 -97
- data/vendor/libgit2/src/libgit2/threadstate.h +0 -22
- 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
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
#include "transaction.h"
|
|
9
9
|
|
|
10
10
|
#include "repository.h"
|
|
11
|
-
#include "strmap.h"
|
|
12
11
|
#include "refdb.h"
|
|
13
12
|
#include "pool.h"
|
|
14
13
|
#include "reflog.h"
|
|
@@ -44,17 +43,23 @@ typedef struct {
|
|
|
44
43
|
remove :1;
|
|
45
44
|
} transaction_node;
|
|
46
45
|
|
|
46
|
+
GIT_HASHMAP_STR_SETUP(git_transaction_nodemap, transaction_node *);
|
|
47
|
+
|
|
47
48
|
struct git_transaction {
|
|
48
49
|
transaction_t type;
|
|
49
50
|
git_repository *repo;
|
|
50
51
|
git_refdb *db;
|
|
51
52
|
git_config *cfg;
|
|
53
|
+
void *cfg_data;
|
|
52
54
|
|
|
53
|
-
|
|
55
|
+
git_transaction_nodemap locks;
|
|
54
56
|
git_pool pool;
|
|
55
57
|
};
|
|
56
58
|
|
|
57
|
-
int git_transaction_config_new(
|
|
59
|
+
int git_transaction_config_new(
|
|
60
|
+
git_transaction **out,
|
|
61
|
+
git_config *cfg,
|
|
62
|
+
void *data)
|
|
58
63
|
{
|
|
59
64
|
git_transaction *tx;
|
|
60
65
|
|
|
@@ -66,6 +71,8 @@ int git_transaction_config_new(git_transaction **out, git_config *cfg)
|
|
|
66
71
|
|
|
67
72
|
tx->type = TRANSACTION_CONFIG;
|
|
68
73
|
tx->cfg = cfg;
|
|
74
|
+
tx->cfg_data = data;
|
|
75
|
+
|
|
69
76
|
*out = tx;
|
|
70
77
|
return 0;
|
|
71
78
|
}
|
|
@@ -88,11 +95,6 @@ int git_transaction_new(git_transaction **out, git_repository *repo)
|
|
|
88
95
|
goto on_error;
|
|
89
96
|
}
|
|
90
97
|
|
|
91
|
-
if ((error = git_strmap_new(&tx->locks)) < 0) {
|
|
92
|
-
error = -1;
|
|
93
|
-
goto on_error;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
98
|
if ((error = git_repository_refdb(&tx->db, repo)) < 0)
|
|
97
99
|
goto on_error;
|
|
98
100
|
|
|
@@ -124,7 +126,7 @@ int git_transaction_lock_ref(git_transaction *tx, const char *refname)
|
|
|
124
126
|
if ((error = git_refdb_lock(&node->payload, tx->db, refname)) < 0)
|
|
125
127
|
return error;
|
|
126
128
|
|
|
127
|
-
if ((error =
|
|
129
|
+
if ((error = git_transaction_nodemap_put(&tx->locks, node->name, node)) < 0)
|
|
128
130
|
goto cleanup;
|
|
129
131
|
|
|
130
132
|
return 0;
|
|
@@ -138,8 +140,11 @@ cleanup:
|
|
|
138
140
|
static int find_locked(transaction_node **out, git_transaction *tx, const char *refname)
|
|
139
141
|
{
|
|
140
142
|
transaction_node *node;
|
|
143
|
+
int error;
|
|
144
|
+
|
|
145
|
+
error = git_transaction_nodemap_get(&node, &tx->locks, refname);
|
|
141
146
|
|
|
142
|
-
if (
|
|
147
|
+
if (error != 0) {
|
|
143
148
|
git_error_set(GIT_ERROR_REFERENCE, "the specified reference is not locked");
|
|
144
149
|
return GIT_ENOTFOUND;
|
|
145
150
|
}
|
|
@@ -328,18 +333,20 @@ static int update_target(git_refdb *db, transaction_node *node)
|
|
|
328
333
|
int git_transaction_commit(git_transaction *tx)
|
|
329
334
|
{
|
|
330
335
|
transaction_node *node;
|
|
336
|
+
git_hashmap_iter_t iter = GIT_HASHMAP_ITER_INIT;
|
|
331
337
|
int error = 0;
|
|
332
338
|
|
|
333
339
|
GIT_ASSERT_ARG(tx);
|
|
334
340
|
|
|
335
341
|
if (tx->type == TRANSACTION_CONFIG) {
|
|
336
|
-
error = git_config_unlock(tx->cfg, true);
|
|
342
|
+
error = git_config_unlock(tx->cfg, tx->cfg_data, true);
|
|
337
343
|
tx->cfg = NULL;
|
|
344
|
+
tx->cfg_data = NULL;
|
|
338
345
|
|
|
339
346
|
return error;
|
|
340
347
|
}
|
|
341
348
|
|
|
342
|
-
|
|
349
|
+
while (git_transaction_nodemap_iterate(&iter, NULL, &node, &tx->locks) == 0) {
|
|
343
350
|
if (node->reflog) {
|
|
344
351
|
if ((error = tx->db->backend->reflog_write(tx->db->backend, node->reflog)) < 0)
|
|
345
352
|
return error;
|
|
@@ -355,7 +362,7 @@ int git_transaction_commit(git_transaction *tx)
|
|
|
355
362
|
if ((error = update_target(tx->db, node)) < 0)
|
|
356
363
|
return error;
|
|
357
364
|
}
|
|
358
|
-
}
|
|
365
|
+
}
|
|
359
366
|
|
|
360
367
|
return 0;
|
|
361
368
|
}
|
|
@@ -364,30 +371,29 @@ void git_transaction_free(git_transaction *tx)
|
|
|
364
371
|
{
|
|
365
372
|
transaction_node *node;
|
|
366
373
|
git_pool pool;
|
|
374
|
+
git_hashmap_iter_t iter = GIT_HASHMAP_ITER_INIT;
|
|
367
375
|
|
|
368
376
|
if (!tx)
|
|
369
377
|
return;
|
|
370
378
|
|
|
371
379
|
if (tx->type == TRANSACTION_CONFIG) {
|
|
372
|
-
if (tx->cfg)
|
|
373
|
-
git_config_unlock(tx->cfg, false);
|
|
374
|
-
git_config_free(tx->cfg);
|
|
375
|
-
}
|
|
380
|
+
if (tx->cfg)
|
|
381
|
+
git_config_unlock(tx->cfg, tx->cfg_data, false);
|
|
376
382
|
|
|
377
383
|
git__free(tx);
|
|
378
384
|
return;
|
|
379
385
|
}
|
|
380
386
|
|
|
381
387
|
/* start by unlocking the ones we've left hanging, if any */
|
|
382
|
-
|
|
388
|
+
while (git_transaction_nodemap_iterate(&iter, NULL, &node, &tx->locks) == 0) {
|
|
383
389
|
if (node->committed)
|
|
384
390
|
continue;
|
|
385
391
|
|
|
386
392
|
git_refdb_unlock(tx->db, node->payload, false, false, NULL, NULL, NULL);
|
|
387
|
-
}
|
|
393
|
+
}
|
|
388
394
|
|
|
389
395
|
git_refdb_free(tx->db);
|
|
390
|
-
|
|
396
|
+
git_transaction_nodemap_dispose(&tx->locks);
|
|
391
397
|
|
|
392
398
|
/* tx is inside the pool, so we need to extract the data */
|
|
393
399
|
memcpy(&pool, &tx->pool, sizeof(git_pool));
|
|
@@ -22,6 +22,7 @@ typedef struct transport_definition {
|
|
|
22
22
|
|
|
23
23
|
static git_smart_subtransport_definition http_subtransport_definition = { git_smart_subtransport_http, 1, NULL };
|
|
24
24
|
static git_smart_subtransport_definition git_subtransport_definition = { git_smart_subtransport_git, 0, NULL };
|
|
25
|
+
|
|
25
26
|
#ifdef GIT_SSH
|
|
26
27
|
static git_smart_subtransport_definition ssh_subtransport_definition = { git_smart_subtransport_ssh, 0, NULL };
|
|
27
28
|
#endif
|
|
@@ -33,11 +34,13 @@ static transport_definition transports[] = {
|
|
|
33
34
|
{ "http://", git_transport_smart, &http_subtransport_definition },
|
|
34
35
|
{ "https://", git_transport_smart, &http_subtransport_definition },
|
|
35
36
|
{ "file://", git_transport_local, NULL },
|
|
37
|
+
|
|
36
38
|
#ifdef GIT_SSH
|
|
37
39
|
{ "ssh://", git_transport_smart, &ssh_subtransport_definition },
|
|
38
40
|
{ "ssh+git://", git_transport_smart, &ssh_subtransport_definition },
|
|
39
41
|
{ "git+ssh://", git_transport_smart, &ssh_subtransport_definition },
|
|
40
42
|
#endif
|
|
43
|
+
|
|
41
44
|
{ NULL, 0, 0 }
|
|
42
45
|
};
|
|
43
46
|
|
|
@@ -200,7 +203,7 @@ int git_transport_unregister(const char *scheme)
|
|
|
200
203
|
git__free(d);
|
|
201
204
|
|
|
202
205
|
if (!custom_transports.length)
|
|
203
|
-
|
|
206
|
+
git_vector_dispose(&custom_transports);
|
|
204
207
|
|
|
205
208
|
error = 0;
|
|
206
209
|
goto done;
|
|
@@ -324,12 +324,14 @@ static int sspi_init_context(
|
|
|
324
324
|
return 0;
|
|
325
325
|
}
|
|
326
326
|
|
|
327
|
+
#if defined(GIT_GSSAPI) || defined(GIT_GSSFRAMEWORK) || defined(GIT_WIN32)
|
|
327
328
|
int git_http_auth_negotiate(
|
|
328
329
|
git_http_auth_context **out,
|
|
329
330
|
const git_net_url *url)
|
|
330
331
|
{
|
|
331
332
|
return sspi_init_context(out, GIT_HTTP_AUTH_NEGOTIATE, url);
|
|
332
333
|
}
|
|
334
|
+
#endif
|
|
333
335
|
|
|
334
336
|
int git_http_auth_ntlm(
|
|
335
337
|
git_http_auth_context **out,
|
|
@@ -161,7 +161,7 @@ static void ssh_custom_free(struct git_credential *cred)
|
|
|
161
161
|
|
|
162
162
|
if (c->publickey) {
|
|
163
163
|
/* Zero the memory which previously held the publickey */
|
|
164
|
-
size_t key_len =
|
|
164
|
+
size_t key_len = c->publickey_len;
|
|
165
165
|
git__memzero(c->publickey, key_len);
|
|
166
166
|
git__free(c->publickey);
|
|
167
167
|
}
|
|
@@ -204,7 +204,7 @@ int git_credential_ssh_key_memory_new(
|
|
|
204
204
|
const char *privatekey,
|
|
205
205
|
const char *passphrase)
|
|
206
206
|
{
|
|
207
|
-
#ifdef
|
|
207
|
+
#ifdef GIT_SSH_LIBSSH2_MEMORY_CREDENTIALS
|
|
208
208
|
return git_credential_ssh_key_type_new(
|
|
209
209
|
cred,
|
|
210
210
|
username,
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
|
|
10
10
|
#ifndef GIT_WINHTTP
|
|
11
11
|
|
|
12
|
-
#include "http_parser.h"
|
|
13
12
|
#include "net.h"
|
|
14
13
|
#include "remote.h"
|
|
15
14
|
#include "smart.h"
|
|
@@ -334,7 +333,7 @@ static int lookup_proxy(
|
|
|
334
333
|
return 0;
|
|
335
334
|
}
|
|
336
335
|
|
|
337
|
-
if (!proxy ||
|
|
336
|
+
if (!proxy || !*proxy ||
|
|
338
337
|
(error = git_net_url_parse_http(&transport->proxy.url, proxy)) < 0)
|
|
339
338
|
goto done;
|
|
340
339
|
|
|
@@ -15,14 +15,4 @@
|
|
|
15
15
|
|
|
16
16
|
extern bool git_http__expect_continue;
|
|
17
17
|
|
|
18
|
-
GIT_INLINE(int) git_http__user_agent(git_str *buf)
|
|
19
|
-
{
|
|
20
|
-
const char *ua = git_libgit2__user_agent();
|
|
21
|
-
|
|
22
|
-
if (!ua)
|
|
23
|
-
ua = "libgit2 " LIBGIT2_VERSION;
|
|
24
|
-
|
|
25
|
-
return git_str_printf(buf, "git/2.0 (%s)", ua);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
18
|
#endif
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
#include "common.h"
|
|
9
9
|
#include "git2.h"
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
#include "vector.h"
|
|
12
12
|
#include "trace.h"
|
|
13
13
|
#include "httpclient.h"
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
#include "streams/socket.h"
|
|
22
22
|
#include "streams/tls.h"
|
|
23
23
|
#include "auth.h"
|
|
24
|
+
#include "httpparser.h"
|
|
24
25
|
|
|
25
26
|
static git_http_auth_scheme auth_schemes[] = {
|
|
26
27
|
{ GIT_HTTP_AUTH_NEGOTIATE, "Negotiate", GIT_CREDENTIAL_DEFAULT, git_http_auth_negotiate },
|
|
@@ -108,7 +109,7 @@ struct git_http_client {
|
|
|
108
109
|
git_http_server_t current_server;
|
|
109
110
|
http_client_state state;
|
|
110
111
|
|
|
111
|
-
|
|
112
|
+
git_http_parser parser;
|
|
112
113
|
|
|
113
114
|
git_http_server server;
|
|
114
115
|
git_http_server proxy;
|
|
@@ -154,7 +155,7 @@ void git_http_response_dispose(git_http_response *response)
|
|
|
154
155
|
memset(response, 0, sizeof(git_http_response));
|
|
155
156
|
}
|
|
156
157
|
|
|
157
|
-
static int on_header_complete(
|
|
158
|
+
static int on_header_complete(git_http_parser *parser)
|
|
158
159
|
{
|
|
159
160
|
http_parser_context *ctx = (http_parser_context *) parser->data;
|
|
160
161
|
git_http_client *client = ctx->client;
|
|
@@ -219,7 +220,7 @@ static int on_header_complete(http_parser *parser)
|
|
|
219
220
|
return 0;
|
|
220
221
|
}
|
|
221
222
|
|
|
222
|
-
static int on_header_field(
|
|
223
|
+
static int on_header_field(git_http_parser *parser, const char *str, size_t len)
|
|
223
224
|
{
|
|
224
225
|
http_parser_context *ctx = (http_parser_context *) parser->data;
|
|
225
226
|
|
|
@@ -254,7 +255,7 @@ static int on_header_field(http_parser *parser, const char *str, size_t len)
|
|
|
254
255
|
return 0;
|
|
255
256
|
}
|
|
256
257
|
|
|
257
|
-
static int on_header_value(
|
|
258
|
+
static int on_header_value(git_http_parser *parser, const char *str, size_t len)
|
|
258
259
|
{
|
|
259
260
|
http_parser_context *ctx = (http_parser_context *) parser->data;
|
|
260
261
|
|
|
@@ -342,7 +343,7 @@ static int resend_needed(git_http_client *client, git_http_response *response)
|
|
|
342
343
|
return 0;
|
|
343
344
|
}
|
|
344
345
|
|
|
345
|
-
static int on_headers_complete(
|
|
346
|
+
static int on_headers_complete(git_http_parser *parser)
|
|
346
347
|
{
|
|
347
348
|
http_parser_context *ctx = (http_parser_context *) parser->data;
|
|
348
349
|
|
|
@@ -364,8 +365,8 @@ static int on_headers_complete(http_parser *parser)
|
|
|
364
365
|
return ctx->parse_status = PARSE_STATUS_ERROR;
|
|
365
366
|
}
|
|
366
367
|
|
|
367
|
-
ctx->response->status = parser
|
|
368
|
-
ctx->client->keepalive =
|
|
368
|
+
ctx->response->status = git_http_parser_status_code(parser);
|
|
369
|
+
ctx->client->keepalive = git_http_parser_keep_alive(parser);
|
|
369
370
|
|
|
370
371
|
/* Prepare for authentication */
|
|
371
372
|
collect_authinfo(&ctx->response->server_auth_schemetypes,
|
|
@@ -378,18 +379,15 @@ static int on_headers_complete(http_parser *parser)
|
|
|
378
379
|
ctx->response->resend_credentials = resend_needed(ctx->client,
|
|
379
380
|
ctx->response);
|
|
380
381
|
|
|
381
|
-
|
|
382
|
-
http_parser_pause(parser, 1);
|
|
383
|
-
|
|
384
|
-
if (ctx->response->content_type || ctx->response->chunked)
|
|
382
|
+
if (ctx->response->content_length || ctx->response->chunked)
|
|
385
383
|
ctx->client->state = READING_BODY;
|
|
386
384
|
else
|
|
387
385
|
ctx->client->state = DONE;
|
|
388
386
|
|
|
389
|
-
return
|
|
387
|
+
return git_http_parser_pause(parser);
|
|
390
388
|
}
|
|
391
389
|
|
|
392
|
-
static int on_body(
|
|
390
|
+
static int on_body(git_http_parser *parser, const char *buf, size_t len)
|
|
393
391
|
{
|
|
394
392
|
http_parser_context *ctx = (http_parser_context *) parser->data;
|
|
395
393
|
size_t max_len;
|
|
@@ -411,7 +409,7 @@ static int on_body(http_parser *parser, const char *buf, size_t len)
|
|
|
411
409
|
return 0;
|
|
412
410
|
}
|
|
413
411
|
|
|
414
|
-
static int on_message_complete(
|
|
412
|
+
static int on_message_complete(git_http_parser *parser)
|
|
415
413
|
{
|
|
416
414
|
http_parser_context *ctx = (http_parser_context *) parser->data;
|
|
417
415
|
|
|
@@ -555,7 +553,7 @@ static int apply_credentials(
|
|
|
555
553
|
{
|
|
556
554
|
git_http_auth_context *auth = server->auth_context;
|
|
557
555
|
git_vector *challenges = &server->auth_challenges;
|
|
558
|
-
const char *challenge;
|
|
556
|
+
const char *challenge = NULL;
|
|
559
557
|
git_str token = GIT_STR_INIT;
|
|
560
558
|
int error = 0;
|
|
561
559
|
|
|
@@ -651,6 +649,30 @@ static int puts_host_and_port(git_str *buf, git_net_url *url, bool force_port)
|
|
|
651
649
|
return git_str_oom(buf) ? -1 : 0;
|
|
652
650
|
}
|
|
653
651
|
|
|
652
|
+
static int append_user_agent(git_str *buf)
|
|
653
|
+
{
|
|
654
|
+
const char *product = git_settings__user_agent_product();
|
|
655
|
+
const char *comment = git_settings__user_agent();
|
|
656
|
+
|
|
657
|
+
GIT_ASSERT(product && comment);
|
|
658
|
+
|
|
659
|
+
if (!*product)
|
|
660
|
+
return 0;
|
|
661
|
+
|
|
662
|
+
git_str_puts(buf, "User-Agent: ");
|
|
663
|
+
git_str_puts(buf, product);
|
|
664
|
+
|
|
665
|
+
if (*comment) {
|
|
666
|
+
git_str_puts(buf, " (");
|
|
667
|
+
git_str_puts(buf, comment);
|
|
668
|
+
git_str_puts(buf, ")");
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
git_str_puts(buf, "\r\n");
|
|
672
|
+
|
|
673
|
+
return git_str_oom(buf) ? -1 : 0;
|
|
674
|
+
}
|
|
675
|
+
|
|
654
676
|
static int generate_connect_request(
|
|
655
677
|
git_http_client *client,
|
|
656
678
|
git_http_request *request)
|
|
@@ -665,9 +687,7 @@ static int generate_connect_request(
|
|
|
665
687
|
puts_host_and_port(buf, &client->server.url, true);
|
|
666
688
|
git_str_puts(buf, " HTTP/1.1\r\n");
|
|
667
689
|
|
|
668
|
-
|
|
669
|
-
git_http__user_agent(buf);
|
|
670
|
-
git_str_puts(buf, "\r\n");
|
|
690
|
+
append_user_agent(buf);
|
|
671
691
|
|
|
672
692
|
git_str_puts(buf, "Host: ");
|
|
673
693
|
puts_host_and_port(buf, &client->server.url, true);
|
|
@@ -711,9 +731,7 @@ static int generate_request(
|
|
|
711
731
|
|
|
712
732
|
git_str_puts(buf, " HTTP/1.1\r\n");
|
|
713
733
|
|
|
714
|
-
|
|
715
|
-
git_http__user_agent(buf);
|
|
716
|
-
git_str_puts(buf, "\r\n");
|
|
734
|
+
append_user_agent(buf);
|
|
717
735
|
|
|
718
736
|
git_str_puts(buf, "Host: ");
|
|
719
737
|
puts_host_and_port(buf, request->url, false);
|
|
@@ -768,25 +786,37 @@ static int check_certificate(
|
|
|
768
786
|
void *cert_cb_payload)
|
|
769
787
|
{
|
|
770
788
|
git_cert *cert;
|
|
771
|
-
|
|
789
|
+
git_error *last_error;
|
|
772
790
|
int error;
|
|
773
791
|
|
|
774
792
|
if ((error = git_stream_certificate(&cert, stream)) < 0)
|
|
775
793
|
return error;
|
|
776
794
|
|
|
777
|
-
|
|
795
|
+
/*
|
|
796
|
+
* Allow callers to set an error - but save ours and clear
|
|
797
|
+
* it, so that we can detect if they set one and restore it
|
|
798
|
+
* if we need to.
|
|
799
|
+
*/
|
|
800
|
+
git_error_save(&last_error);
|
|
801
|
+
git_error_clear();
|
|
778
802
|
|
|
779
803
|
error = cert_cb(cert, is_valid, url->host, cert_cb_payload);
|
|
780
804
|
|
|
781
|
-
if (error == GIT_PASSTHROUGH
|
|
782
|
-
|
|
783
|
-
else if (error == GIT_PASSTHROUGH)
|
|
784
|
-
error = 0;
|
|
785
|
-
else if (error && !git_error_last())
|
|
786
|
-
git_error_set(GIT_ERROR_HTTP,
|
|
787
|
-
"user rejected certificate for %s", url->host);
|
|
805
|
+
if (error == GIT_PASSTHROUGH) {
|
|
806
|
+
error = is_valid ? 0 : -1;
|
|
788
807
|
|
|
789
|
-
|
|
808
|
+
if (error) {
|
|
809
|
+
git_error_restore(last_error);
|
|
810
|
+
last_error = NULL;
|
|
811
|
+
}
|
|
812
|
+
} else if (error) {
|
|
813
|
+
if (!git_error_exists())
|
|
814
|
+
git_error_set(GIT_ERROR_HTTP,
|
|
815
|
+
"user rejected certificate for %s",
|
|
816
|
+
url->host);
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
git_error_free(last_error);
|
|
790
820
|
return error;
|
|
791
821
|
}
|
|
792
822
|
|
|
@@ -864,9 +894,29 @@ GIT_INLINE(int) server_setup_from_url(
|
|
|
864
894
|
return 0;
|
|
865
895
|
}
|
|
866
896
|
|
|
897
|
+
static bool parser_settings_initialized;
|
|
898
|
+
static git_http_parser_settings parser_settings;
|
|
899
|
+
|
|
900
|
+
GIT_INLINE(git_http_parser_settings *) http_client_parser_settings(void)
|
|
901
|
+
{
|
|
902
|
+
if (!parser_settings_initialized) {
|
|
903
|
+
parser_settings.on_header_field = on_header_field;
|
|
904
|
+
parser_settings.on_header_value = on_header_value;
|
|
905
|
+
parser_settings.on_headers_complete = on_headers_complete;
|
|
906
|
+
parser_settings.on_body = on_body;
|
|
907
|
+
parser_settings.on_message_complete = on_message_complete;
|
|
908
|
+
|
|
909
|
+
parser_settings_initialized = true;
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
return &parser_settings;
|
|
913
|
+
}
|
|
914
|
+
|
|
867
915
|
static void reset_parser(git_http_client *client)
|
|
868
916
|
{
|
|
869
|
-
|
|
917
|
+
git_http_parser_init(&client->parser,
|
|
918
|
+
GIT_HTTP_PARSER_RESPONSE,
|
|
919
|
+
http_client_parser_settings());
|
|
870
920
|
}
|
|
871
921
|
|
|
872
922
|
static int setup_hosts(
|
|
@@ -1109,27 +1159,9 @@ GIT_INLINE(int) client_read(git_http_client *client)
|
|
|
1109
1159
|
return (int)read_len;
|
|
1110
1160
|
}
|
|
1111
1161
|
|
|
1112
|
-
static bool parser_settings_initialized;
|
|
1113
|
-
static http_parser_settings parser_settings;
|
|
1114
|
-
|
|
1115
|
-
GIT_INLINE(http_parser_settings *) http_client_parser_settings(void)
|
|
1116
|
-
{
|
|
1117
|
-
if (!parser_settings_initialized) {
|
|
1118
|
-
parser_settings.on_header_field = on_header_field;
|
|
1119
|
-
parser_settings.on_header_value = on_header_value;
|
|
1120
|
-
parser_settings.on_headers_complete = on_headers_complete;
|
|
1121
|
-
parser_settings.on_body = on_body;
|
|
1122
|
-
parser_settings.on_message_complete = on_message_complete;
|
|
1123
|
-
|
|
1124
|
-
parser_settings_initialized = true;
|
|
1125
|
-
}
|
|
1126
|
-
|
|
1127
|
-
return &parser_settings;
|
|
1128
|
-
}
|
|
1129
|
-
|
|
1130
1162
|
GIT_INLINE(int) client_read_and_parse(git_http_client *client)
|
|
1131
1163
|
{
|
|
1132
|
-
|
|
1164
|
+
git_http_parser *parser = &client->parser;
|
|
1133
1165
|
http_parser_context *ctx = (http_parser_context *) parser->data;
|
|
1134
1166
|
unsigned char http_errno;
|
|
1135
1167
|
int read_len;
|
|
@@ -1143,11 +1175,10 @@ GIT_INLINE(int) client_read_and_parse(git_http_client *client)
|
|
|
1143
1175
|
if (!client->read_buf.size && (read_len = client_read(client)) < 0)
|
|
1144
1176
|
return read_len;
|
|
1145
1177
|
|
|
1146
|
-
parsed_len =
|
|
1147
|
-
http_client_parser_settings(),
|
|
1178
|
+
parsed_len = git_http_parser_execute(parser,
|
|
1148
1179
|
client->read_buf.ptr,
|
|
1149
1180
|
client->read_buf.size);
|
|
1150
|
-
http_errno =
|
|
1181
|
+
http_errno = git_http_parser_errno(parser);
|
|
1151
1182
|
|
|
1152
1183
|
if (parsed_len > INT_MAX) {
|
|
1153
1184
|
git_error_set(GIT_ERROR_HTTP, "unexpectedly large parse");
|
|
@@ -1166,26 +1197,29 @@ GIT_INLINE(int) client_read_and_parse(git_http_client *client)
|
|
|
1166
1197
|
* (This can happen in response to an expect/continue request,
|
|
1167
1198
|
* where the server gives you a 100 and 200 simultaneously.)
|
|
1168
1199
|
*/
|
|
1169
|
-
if (http_errno ==
|
|
1200
|
+
if (http_errno == GIT_HTTP_PARSER_PAUSED) {
|
|
1201
|
+
size_t additional_size;
|
|
1202
|
+
|
|
1203
|
+
git_http_parser_resume(parser);
|
|
1204
|
+
|
|
1170
1205
|
/*
|
|
1171
|
-
* http-parser has a "feature" where it will not deliver
|
|
1172
|
-
* final byte when paused in a callback. Consume
|
|
1173
|
-
*
|
|
1206
|
+
* http-parser has a "feature" where it will not deliver
|
|
1207
|
+
* the final byte when paused in a callback. Consume
|
|
1208
|
+
* that byte.
|
|
1174
1209
|
*/
|
|
1175
|
-
|
|
1210
|
+
if ((additional_size = git_http_parser_remain_after_pause(parser)) > 0) {
|
|
1211
|
+
GIT_ASSERT((client->read_buf.size - parsed_len) >= additional_size);
|
|
1176
1212
|
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
client->read_buf.ptr + parsed_len,
|
|
1182
|
-
1);
|
|
1213
|
+
parsed_len += git_http_parser_execute(parser,
|
|
1214
|
+
client->read_buf.ptr + parsed_len,
|
|
1215
|
+
additional_size);
|
|
1216
|
+
}
|
|
1183
1217
|
}
|
|
1184
1218
|
|
|
1185
1219
|
/* Most failures will be reported in http_errno */
|
|
1186
|
-
else if (parser
|
|
1220
|
+
else if (git_http_parser_errno(parser) != GIT_HTTP_PARSER_OK) {
|
|
1187
1221
|
git_error_set(GIT_ERROR_HTTP, "http parser error: %s",
|
|
1188
|
-
|
|
1222
|
+
git_http_parser_errmsg(parser, http_errno));
|
|
1189
1223
|
return -1;
|
|
1190
1224
|
}
|
|
1191
1225
|
|
|
@@ -1193,7 +1227,7 @@ GIT_INLINE(int) client_read_and_parse(git_http_client *client)
|
|
|
1193
1227
|
else if (parsed_len != client->read_buf.size) {
|
|
1194
1228
|
git_error_set(GIT_ERROR_HTTP,
|
|
1195
1229
|
"http parser did not consume entire buffer: %s",
|
|
1196
|
-
|
|
1230
|
+
git_http_parser_errmsg(parser, http_errno));
|
|
1197
1231
|
return -1;
|
|
1198
1232
|
}
|
|
1199
1233
|
|
|
@@ -1209,13 +1243,16 @@ GIT_INLINE(int) client_read_and_parse(git_http_client *client)
|
|
|
1209
1243
|
}
|
|
1210
1244
|
|
|
1211
1245
|
/*
|
|
1212
|
-
*
|
|
1213
|
-
*
|
|
1214
|
-
*
|
|
1215
|
-
*
|
|
1216
|
-
*
|
|
1217
|
-
*
|
|
1218
|
-
* more
|
|
1246
|
+
* Try to consume any remaining response body. The client may have
|
|
1247
|
+
* decided that it did not need to consume the entire response body.
|
|
1248
|
+
* For example, the client saw a redirect in the header and ignored
|
|
1249
|
+
* the body. Or the client saw a particular sequence (like a final
|
|
1250
|
+
* flush in a git response) and stopped reading (but there were
|
|
1251
|
+
* additional response bytes, perhaps because the response was chunked).
|
|
1252
|
+
* Do one more read to try to clear this out; this takes care of small
|
|
1253
|
+
* remainders, like a chunk response or a small redirect message. If
|
|
1254
|
+
* there is too much data, we'll just leave it and close the
|
|
1255
|
+
* connection.
|
|
1219
1256
|
*/
|
|
1220
1257
|
static void complete_response_body(git_http_client *client)
|
|
1221
1258
|
{
|
|
@@ -1232,7 +1269,7 @@ static void complete_response_body(git_http_client *client)
|
|
|
1232
1269
|
|
|
1233
1270
|
/* If there was an error, just close the connection. */
|
|
1234
1271
|
if (client_read_and_parse(client) < 0 ||
|
|
1235
|
-
parser_context.error !=
|
|
1272
|
+
parser_context.error != GIT_HTTP_PARSER_OK ||
|
|
1236
1273
|
(parser_context.parse_status != PARSE_STATUS_OK &&
|
|
1237
1274
|
parser_context.parse_status != PARSE_STATUS_NO_OUTPUT)) {
|
|
1238
1275
|
git_error_clear();
|
|
@@ -1240,6 +1277,7 @@ static void complete_response_body(git_http_client *client)
|
|
|
1240
1277
|
}
|
|
1241
1278
|
|
|
1242
1279
|
done:
|
|
1280
|
+
client->parser.data = NULL;
|
|
1243
1281
|
git_str_clear(&client->read_buf);
|
|
1244
1282
|
}
|
|
1245
1283
|
|
|
@@ -1407,9 +1445,9 @@ int git_http_client_read_response(
|
|
|
1407
1445
|
git_http_response_dispose(response);
|
|
1408
1446
|
|
|
1409
1447
|
if (client->current_server == PROXY) {
|
|
1410
|
-
|
|
1448
|
+
git_vector_dispose_deep(&client->proxy.auth_challenges);
|
|
1411
1449
|
} else if(client->current_server == SERVER) {
|
|
1412
|
-
|
|
1450
|
+
git_vector_dispose_deep(&client->server.auth_challenges);
|
|
1413
1451
|
}
|
|
1414
1452
|
|
|
1415
1453
|
client->state = READING_RESPONSE;
|
|
@@ -1429,6 +1467,7 @@ int git_http_client_read_response(
|
|
|
1429
1467
|
done:
|
|
1430
1468
|
git_str_dispose(&parser_context.parse_header_name);
|
|
1431
1469
|
git_str_dispose(&parser_context.parse_header_value);
|
|
1470
|
+
client->parser.data = NULL;
|
|
1432
1471
|
|
|
1433
1472
|
return error;
|
|
1434
1473
|
}
|
|
@@ -1484,6 +1523,8 @@ done:
|
|
|
1484
1523
|
if (error < 0)
|
|
1485
1524
|
client->connected = 0;
|
|
1486
1525
|
|
|
1526
|
+
client->parser.data = NULL;
|
|
1527
|
+
|
|
1487
1528
|
return error;
|
|
1488
1529
|
}
|
|
1489
1530
|
|
|
@@ -1506,7 +1547,7 @@ int git_http_client_skip_body(git_http_client *client)
|
|
|
1506
1547
|
do {
|
|
1507
1548
|
error = client_read_and_parse(client);
|
|
1508
1549
|
|
|
1509
|
-
if (parser_context.error !=
|
|
1550
|
+
if (parser_context.error != GIT_HTTP_PARSER_OK ||
|
|
1510
1551
|
(parser_context.parse_status != PARSE_STATUS_OK &&
|
|
1511
1552
|
parser_context.parse_status != PARSE_STATUS_NO_OUTPUT)) {
|
|
1512
1553
|
git_error_set(GIT_ERROR_HTTP,
|
|
@@ -1518,6 +1559,8 @@ int git_http_client_skip_body(git_http_client *client)
|
|
|
1518
1559
|
if (error < 0)
|
|
1519
1560
|
client->connected = 0;
|
|
1520
1561
|
|
|
1562
|
+
client->parser.data = NULL;
|
|
1563
|
+
|
|
1521
1564
|
return error;
|
|
1522
1565
|
}
|
|
1523
1566
|
|
|
@@ -1565,7 +1608,7 @@ GIT_INLINE(void) http_server_close(git_http_server *server)
|
|
|
1565
1608
|
|
|
1566
1609
|
git_net_url_dispose(&server->url);
|
|
1567
1610
|
|
|
1568
|
-
|
|
1611
|
+
git_vector_dispose_deep(&server->auth_challenges);
|
|
1569
1612
|
free_auth_context(server);
|
|
1570
1613
|
}
|
|
1571
1614
|
|