rugged 0.19.0 → 0.21.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +1 -1
- data/README.md +151 -25
- data/ext/rugged/extconf.rb +48 -27
- data/ext/rugged/rugged.c +107 -35
- data/ext/rugged/rugged.h +44 -8
- data/ext/rugged/rugged_blame.c +292 -0
- data/ext/rugged/rugged_blob.c +84 -31
- data/ext/rugged/rugged_branch.c +90 -223
- data/ext/rugged/rugged_branch_collection.c +445 -0
- data/ext/rugged/rugged_commit.c +190 -9
- data/ext/rugged/rugged_config.c +1 -1
- data/ext/rugged/rugged_cred.c +125 -0
- data/ext/rugged/rugged_diff.c +267 -94
- data/ext/rugged/rugged_diff_delta.c +14 -3
- data/ext/rugged/rugged_diff_hunk.c +31 -28
- data/ext/rugged/rugged_diff_line.c +21 -17
- data/ext/rugged/rugged_index.c +326 -6
- data/ext/rugged/rugged_note.c +39 -34
- data/ext/rugged/rugged_object.c +9 -9
- data/ext/rugged/rugged_patch.c +245 -0
- data/ext/rugged/rugged_reference.c +67 -332
- data/ext/rugged/rugged_reference_collection.c +490 -0
- data/ext/rugged/rugged_remote.c +447 -351
- data/ext/rugged/rugged_remote_collection.c +285 -0
- data/ext/rugged/rugged_repo.c +752 -203
- data/ext/rugged/rugged_revwalk.c +119 -27
- data/ext/rugged/rugged_settings.c +48 -1
- data/ext/rugged/rugged_signature.c +30 -16
- data/ext/rugged/rugged_tag.c +86 -191
- data/ext/rugged/rugged_tag_collection.c +279 -0
- data/ext/rugged/rugged_tree.c +159 -22
- data/lib/rugged/branch.rb +8 -17
- data/lib/rugged/credentials.rb +43 -0
- data/lib/rugged/diff/delta.rb +1 -2
- data/lib/rugged/diff/hunk.rb +4 -9
- data/lib/rugged/diff/line.rb +23 -3
- data/lib/rugged/diff.rb +3 -1
- data/lib/rugged/patch.rb +26 -0
- data/lib/rugged/reference.rb +1 -3
- data/lib/rugged/remote.rb +0 -9
- data/lib/rugged/repository.rb +70 -13
- data/lib/rugged/tag.rb +23 -18
- data/lib/rugged/tree.rb +7 -0
- data/lib/rugged/version.rb +1 -1
- data/lib/rugged.rb +8 -1
- data/vendor/libgit2/AUTHORS +75 -0
- data/vendor/libgit2/CMakeLists.txt +490 -0
- data/vendor/libgit2/COPYING +920 -0
- data/vendor/libgit2/Makefile.embed +25 -7
- data/vendor/libgit2/cmake/Modules/AddCFlagIfSupported.cmake +16 -0
- data/vendor/libgit2/cmake/Modules/FindHTTP_Parser.cmake +39 -0
- data/vendor/libgit2/cmake/Modules/FindIconv.cmake +43 -0
- data/vendor/libgit2/cmake/Modules/FindLIBSSH2.cmake +44 -0
- data/vendor/libgit2/deps/http-parser/LICENSE-MIT +23 -0
- data/vendor/libgit2/deps/regex/regex.c +10 -3
- data/vendor/libgit2/include/git2/attr.h +2 -1
- data/vendor/libgit2/include/git2/blame.h +213 -0
- data/vendor/libgit2/include/git2/blob.h +57 -29
- data/vendor/libgit2/include/git2/branch.h +56 -44
- data/vendor/libgit2/include/git2/buffer.h +112 -0
- data/vendor/libgit2/include/git2/checkout.h +72 -37
- data/vendor/libgit2/include/git2/cherrypick.h +87 -0
- data/vendor/libgit2/include/git2/clone.h +153 -56
- data/vendor/libgit2/include/git2/commit.h +82 -12
- data/vendor/libgit2/include/git2/common.h +31 -19
- data/vendor/libgit2/include/git2/config.h +124 -19
- data/vendor/libgit2/include/git2/cred_helpers.h +1 -1
- data/vendor/libgit2/include/git2/diff.h +636 -494
- data/vendor/libgit2/include/git2/errors.h +48 -15
- data/vendor/libgit2/include/git2/filter.h +149 -0
- data/vendor/libgit2/include/git2/graph.h +14 -0
- data/vendor/libgit2/include/git2/index.h +95 -54
- data/vendor/libgit2/include/git2/indexer.h +15 -9
- data/vendor/libgit2/include/git2/merge.h +402 -39
- data/vendor/libgit2/include/git2/message.h +9 -14
- data/vendor/libgit2/include/git2/net.h +5 -0
- data/vendor/libgit2/include/git2/notes.h +6 -6
- data/vendor/libgit2/include/git2/object.h +34 -2
- data/vendor/libgit2/include/git2/odb.h +77 -14
- data/vendor/libgit2/include/git2/odb_backend.h +50 -6
- data/vendor/libgit2/include/git2/oid.h +4 -8
- data/vendor/libgit2/include/git2/pack.h +58 -4
- data/vendor/libgit2/include/git2/patch.h +277 -0
- data/vendor/libgit2/include/git2/pathspec.h +263 -0
- data/vendor/libgit2/include/git2/push.h +55 -5
- data/vendor/libgit2/include/git2/reflog.h +11 -8
- data/vendor/libgit2/include/git2/refs.h +219 -33
- data/vendor/libgit2/include/git2/refspec.h +3 -4
- data/vendor/libgit2/include/git2/remote.h +216 -76
- data/vendor/libgit2/include/git2/repository.h +85 -40
- data/vendor/libgit2/include/git2/reset.h +15 -4
- data/vendor/libgit2/include/git2/revert.h +86 -0
- data/vendor/libgit2/include/git2/revparse.h +27 -16
- data/vendor/libgit2/include/git2/revwalk.h +44 -6
- data/vendor/libgit2/include/git2/signature.h +17 -3
- data/vendor/libgit2/include/git2/stash.h +8 -12
- data/vendor/libgit2/include/git2/status.h +67 -18
- data/vendor/libgit2/include/git2/submodule.h +100 -85
- data/vendor/libgit2/include/git2/sys/commit.h +38 -4
- data/vendor/libgit2/include/git2/sys/config.h +44 -3
- data/vendor/libgit2/include/git2/sys/diff.h +91 -0
- data/vendor/libgit2/include/git2/sys/filter.h +301 -0
- data/vendor/libgit2/include/git2/sys/index.h +0 -2
- data/vendor/libgit2/include/git2/sys/mempack.h +85 -0
- data/vendor/libgit2/include/git2/sys/odb_backend.h +33 -11
- data/vendor/libgit2/include/git2/sys/refdb_backend.h +51 -5
- data/vendor/libgit2/include/git2/sys/reflog.h +21 -0
- data/vendor/libgit2/include/git2/sys/refs.h +2 -2
- data/vendor/libgit2/include/git2/sys/repository.h +19 -1
- data/vendor/libgit2/include/git2/transport.h +216 -75
- data/vendor/libgit2/include/git2/tree.h +32 -11
- data/vendor/libgit2/include/git2/types.h +124 -10
- data/vendor/libgit2/include/git2/version.h +4 -2
- data/vendor/libgit2/include/git2.h +41 -40
- data/vendor/libgit2/libgit2.pc.in +10 -0
- data/vendor/libgit2/src/array.h +16 -8
- data/vendor/libgit2/src/attr.c +140 -402
- data/vendor/libgit2/src/attr.h +1 -33
- data/vendor/libgit2/src/attr_file.c +298 -135
- data/vendor/libgit2/src/attr_file.h +61 -22
- data/vendor/libgit2/src/attrcache.c +449 -0
- data/vendor/libgit2/src/attrcache.h +38 -6
- data/vendor/libgit2/src/bitvec.h +75 -0
- data/vendor/libgit2/src/blame.c +488 -0
- data/vendor/libgit2/src/blame.h +93 -0
- data/vendor/libgit2/src/blame_git.c +624 -0
- data/vendor/libgit2/src/blame_git.h +20 -0
- data/vendor/libgit2/src/blob.c +137 -92
- data/vendor/libgit2/src/blob.h +9 -0
- data/vendor/libgit2/src/branch.c +175 -156
- data/vendor/libgit2/src/buf_text.c +29 -14
- data/vendor/libgit2/src/buf_text.h +5 -4
- data/vendor/libgit2/src/buffer.c +158 -15
- data/vendor/libgit2/src/buffer.h +33 -20
- data/vendor/libgit2/src/cc-compat.h +8 -2
- data/vendor/libgit2/src/checkout.c +1081 -287
- data/vendor/libgit2/src/checkout.h +1 -1
- data/vendor/libgit2/src/cherrypick.c +226 -0
- data/vendor/libgit2/src/clone.c +297 -245
- data/vendor/libgit2/src/{compress.h → clone.h} +4 -8
- data/vendor/libgit2/src/commit.c +313 -101
- data/vendor/libgit2/src/commit.h +6 -3
- data/vendor/libgit2/src/commit_list.c +3 -3
- data/vendor/libgit2/src/commit_list.h +1 -1
- data/vendor/libgit2/src/common.h +74 -1
- data/vendor/libgit2/src/config.c +570 -145
- data/vendor/libgit2/src/config.h +39 -6
- data/vendor/libgit2/src/config_cache.c +32 -18
- data/vendor/libgit2/src/config_file.c +711 -424
- data/vendor/libgit2/src/config_file.h +4 -3
- data/vendor/libgit2/src/crlf.c +149 -109
- data/vendor/libgit2/src/date.c +35 -7
- data/vendor/libgit2/src/delta.c +1 -1
- data/vendor/libgit2/src/diff.c +719 -414
- data/vendor/libgit2/src/diff.h +52 -7
- data/vendor/libgit2/src/diff_driver.c +183 -85
- data/vendor/libgit2/src/diff_driver.h +1 -1
- data/vendor/libgit2/src/diff_file.c +65 -84
- data/vendor/libgit2/src/diff_file.h +12 -10
- data/vendor/libgit2/src/diff_patch.c +274 -333
- data/vendor/libgit2/src/diff_patch.h +10 -9
- data/vendor/libgit2/src/diff_print.c +381 -179
- data/vendor/libgit2/src/diff_stats.c +336 -0
- data/vendor/libgit2/src/diff_tform.c +393 -215
- data/vendor/libgit2/src/diff_xdiff.c +117 -42
- data/vendor/libgit2/src/errors.c +59 -4
- data/vendor/libgit2/src/fetch.c +40 -34
- data/vendor/libgit2/src/fetch.h +2 -5
- data/vendor/libgit2/src/fetchhead.c +14 -7
- data/vendor/libgit2/src/filebuf.c +13 -24
- data/vendor/libgit2/src/filebuf.h +3 -3
- data/vendor/libgit2/src/fileops.c +104 -296
- data/vendor/libgit2/src/fileops.h +23 -94
- data/vendor/libgit2/src/filter.c +642 -43
- data/vendor/libgit2/src/filter.h +7 -66
- data/vendor/libgit2/src/fnmatch.c +46 -3
- data/vendor/libgit2/src/fnmatch.h +24 -3
- data/vendor/libgit2/src/global.c +158 -42
- data/vendor/libgit2/src/global.h +9 -0
- data/vendor/libgit2/src/graph.c +34 -20
- data/vendor/libgit2/src/hash/hash_generic.h +0 -1
- data/vendor/libgit2/src/hash/hash_openssl.h +0 -1
- data/vendor/libgit2/src/hash/hash_win32.c +14 -29
- data/vendor/libgit2/src/hash.h +0 -2
- data/vendor/libgit2/src/hashsig.c +97 -117
- data/vendor/libgit2/src/ident.c +125 -0
- data/vendor/libgit2/src/ignore.c +159 -110
- data/vendor/libgit2/src/ignore.h +13 -3
- data/vendor/libgit2/src/index.c +803 -445
- data/vendor/libgit2/src/index.h +43 -6
- data/vendor/libgit2/src/indexer.c +475 -157
- data/vendor/libgit2/src/iterator.c +198 -55
- data/vendor/libgit2/src/iterator.h +28 -4
- data/vendor/libgit2/src/map.h +1 -0
- data/vendor/libgit2/src/merge.c +849 -142
- data/vendor/libgit2/src/merge.h +11 -4
- data/vendor/libgit2/src/merge_file.c +183 -78
- data/vendor/libgit2/src/merge_file.h +0 -57
- data/vendor/libgit2/src/message.c +4 -28
- data/vendor/libgit2/src/mwindow.c +117 -8
- data/vendor/libgit2/src/mwindow.h +9 -1
- data/vendor/libgit2/src/netops.c +164 -59
- data/vendor/libgit2/src/netops.h +37 -1
- data/vendor/libgit2/src/notes.c +9 -18
- data/vendor/libgit2/src/notes.h +1 -1
- data/vendor/libgit2/src/object.c +78 -2
- data/vendor/libgit2/src/odb.c +191 -59
- data/vendor/libgit2/src/odb.h +2 -1
- data/vendor/libgit2/src/odb_loose.c +66 -51
- data/vendor/libgit2/src/odb_mempack.c +182 -0
- data/vendor/libgit2/src/odb_pack.c +151 -61
- data/vendor/libgit2/src/oid.c +30 -19
- data/vendor/libgit2/src/oid.h +13 -10
- data/vendor/libgit2/src/pack-objects.c +198 -147
- data/vendor/libgit2/src/pack-objects.h +7 -0
- data/vendor/libgit2/src/pack.c +272 -101
- data/vendor/libgit2/src/pack.h +15 -1
- data/vendor/libgit2/src/path.c +359 -117
- data/vendor/libgit2/src/path.h +110 -20
- data/vendor/libgit2/src/pathspec.c +583 -57
- data/vendor/libgit2/src/pathspec.h +36 -15
- data/vendor/libgit2/src/pool.c +4 -5
- data/vendor/libgit2/src/posix.c +45 -2
- data/vendor/libgit2/src/posix.h +13 -5
- data/vendor/libgit2/src/pqueue.c +73 -119
- data/vendor/libgit2/src/pqueue.h +35 -82
- data/vendor/libgit2/src/push.c +116 -48
- data/vendor/libgit2/src/push.h +5 -0
- data/vendor/libgit2/src/refdb.c +45 -6
- data/vendor/libgit2/src/refdb.h +13 -3
- data/vendor/libgit2/src/refdb_fs.c +1130 -551
- data/vendor/libgit2/src/reflog.c +36 -327
- data/vendor/libgit2/src/reflog.h +6 -1
- data/vendor/libgit2/src/refs.c +345 -142
- data/vendor/libgit2/src/refs.h +9 -2
- data/vendor/libgit2/src/refspec.c +90 -62
- data/vendor/libgit2/src/refspec.h +7 -24
- data/vendor/libgit2/src/remote.c +815 -415
- data/vendor/libgit2/src/remote.h +3 -4
- data/vendor/libgit2/src/repository.c +360 -207
- data/vendor/libgit2/src/repository.h +16 -10
- data/vendor/libgit2/src/reset.c +28 -13
- data/vendor/libgit2/src/revert.c +228 -0
- data/vendor/libgit2/src/revparse.c +29 -30
- data/vendor/libgit2/src/revwalk.c +141 -96
- data/vendor/libgit2/src/revwalk.h +6 -1
- data/vendor/libgit2/src/settings.c +140 -0
- data/vendor/libgit2/src/sha1_lookup.c +71 -0
- data/vendor/libgit2/src/sha1_lookup.h +5 -0
- data/vendor/libgit2/src/signature.c +38 -10
- data/vendor/libgit2/src/sortedcache.c +378 -0
- data/vendor/libgit2/src/sortedcache.h +178 -0
- data/vendor/libgit2/src/stash.c +98 -116
- data/vendor/libgit2/src/status.c +88 -60
- data/vendor/libgit2/src/status.h +2 -2
- data/vendor/libgit2/src/strmap.c +32 -0
- data/vendor/libgit2/src/strmap.h +14 -1
- data/vendor/libgit2/src/strnlen.h +23 -0
- data/vendor/libgit2/src/submodule.c +1073 -615
- data/vendor/libgit2/src/submodule.h +89 -21
- data/vendor/libgit2/src/sysdir.c +252 -0
- data/vendor/libgit2/src/sysdir.h +101 -0
- data/vendor/libgit2/src/tag.c +31 -20
- data/vendor/libgit2/src/thread-utils.h +98 -17
- data/vendor/libgit2/src/trace.h +0 -2
- data/vendor/libgit2/src/transport.c +76 -6
- data/vendor/libgit2/src/transports/cred.c +164 -61
- data/vendor/libgit2/src/transports/git.c +41 -48
- data/vendor/libgit2/src/transports/http.c +65 -109
- data/vendor/libgit2/src/transports/local.c +88 -65
- data/vendor/libgit2/src/transports/smart.c +91 -19
- data/vendor/libgit2/src/transports/smart.h +13 -5
- data/vendor/libgit2/src/transports/smart_pkt.c +24 -14
- data/vendor/libgit2/src/transports/smart_protocol.c +268 -113
- data/vendor/libgit2/src/transports/ssh.c +284 -186
- data/vendor/libgit2/src/transports/winhttp.c +279 -198
- data/vendor/libgit2/src/tree-cache.c +21 -23
- data/vendor/libgit2/src/tree-cache.h +1 -0
- data/vendor/libgit2/src/tree.c +109 -92
- data/vendor/libgit2/src/tree.h +2 -3
- data/vendor/libgit2/src/unix/map.c +7 -1
- data/vendor/libgit2/src/unix/posix.h +0 -1
- data/vendor/libgit2/src/userdiff.h +208 -0
- data/vendor/libgit2/src/util.c +16 -112
- data/vendor/libgit2/src/util.h +107 -3
- data/vendor/libgit2/src/vector.c +72 -17
- data/vendor/libgit2/src/vector.h +32 -5
- data/vendor/libgit2/src/win32/dir.c +15 -40
- data/vendor/libgit2/src/win32/dir.h +3 -2
- data/vendor/libgit2/src/win32/error.c +5 -31
- data/vendor/libgit2/src/win32/findfile.c +47 -66
- data/vendor/libgit2/src/win32/findfile.h +1 -12
- data/vendor/libgit2/src/win32/git2.rc +40 -0
- data/vendor/libgit2/src/win32/map.c +7 -1
- data/vendor/libgit2/src/win32/mingw-compat.h +3 -0
- data/vendor/libgit2/src/win32/posix.h +17 -11
- data/vendor/libgit2/src/win32/posix_w32.c +424 -292
- data/vendor/libgit2/src/win32/precompiled.h +6 -2
- data/vendor/libgit2/src/win32/pthread.c +141 -18
- data/vendor/libgit2/src/win32/pthread.h +50 -8
- data/vendor/libgit2/src/win32/reparse.h +57 -0
- data/vendor/libgit2/src/win32/utf-conv.c +117 -60
- data/vendor/libgit2/src/win32/utf-conv.h +81 -6
- data/vendor/libgit2/src/win32/version.h +21 -4
- data/vendor/libgit2/src/win32/w32_util.c +139 -0
- data/vendor/libgit2/src/win32/w32_util.h +54 -0
- data/vendor/libgit2/src/zstream.c +156 -0
- data/vendor/libgit2/src/zstream.h +39 -0
- metadata +84 -167
- data/Rakefile +0 -61
- data/ext/rugged/rugged_diff_patch.c +0 -169
- data/lib/rugged/diff/patch.rb +0 -28
- data/test/blob_test.rb +0 -341
- data/test/branch_test.rb +0 -199
- data/test/commit_test.rb +0 -104
- data/test/config_test.rb +0 -45
- data/test/coverage/cover.rb +0 -133
- data/test/diff_test.rb +0 -777
- data/test/errors_test.rb +0 -34
- data/test/fixtures/alternate/objects/14/6ae76773c91e3b1d00cf7a338ec55ae58297e2 +0 -0
- data/test/fixtures/alternate/objects/14/9c32d47e99d0a3572ff1e70a2e0051bbf347a9 +0 -0
- data/test/fixtures/alternate/objects/14/fb3108588f9421bf764041e5e3ac305eb6277f +0 -0
- data/test/fixtures/archive.tar.gz +0 -0
- data/test/fixtures/attr/attr0 +0 -1
- data/test/fixtures/attr/attr1 +0 -29
- data/test/fixtures/attr/attr2 +0 -21
- data/test/fixtures/attr/attr3 +0 -4
- data/test/fixtures/attr/binfile +0 -1
- data/test/fixtures/attr/dir/file +0 -0
- data/test/fixtures/attr/file +0 -1
- data/test/fixtures/attr/gitattributes +0 -29
- data/test/fixtures/attr/gitignore +0 -2
- data/test/fixtures/attr/ign +0 -1
- data/test/fixtures/attr/macro_bad +0 -1
- data/test/fixtures/attr/macro_test +0 -1
- data/test/fixtures/attr/root_test1 +0 -1
- data/test/fixtures/attr/root_test2 +0 -6
- data/test/fixtures/attr/root_test3 +0 -19
- data/test/fixtures/attr/root_test4.txt +0 -14
- data/test/fixtures/attr/sub/abc +0 -37
- data/test/fixtures/attr/sub/dir/file +0 -0
- data/test/fixtures/attr/sub/file +0 -1
- data/test/fixtures/attr/sub/ign/file +0 -1
- data/test/fixtures/attr/sub/ign/sub/file +0 -1
- data/test/fixtures/attr/sub/sub/dir +0 -0
- data/test/fixtures/attr/sub/sub/file +0 -1
- data/test/fixtures/attr/sub/sub/subsub.txt +0 -1
- data/test/fixtures/attr/sub/subdir_test1 +0 -2
- data/test/fixtures/attr/sub/subdir_test2.txt +0 -1
- data/test/fixtures/diff/another.txt +0 -38
- data/test/fixtures/diff/readme.txt +0 -36
- data/test/fixtures/mergedrepo/conflicts-one.txt +0 -5
- data/test/fixtures/mergedrepo/conflicts-two.txt +0 -5
- data/test/fixtures/mergedrepo/one.txt +0 -10
- data/test/fixtures/mergedrepo/two.txt +0 -12
- data/test/fixtures/status/current_file +0 -1
- data/test/fixtures/status/ignored_file +0 -1
- data/test/fixtures/status/modified_file +0 -2
- data/test/fixtures/status/new_file +0 -1
- data/test/fixtures/status/staged_changes +0 -2
- data/test/fixtures/status/staged_changes_modified_file +0 -3
- data/test/fixtures/status/staged_delete_modified_file +0 -1
- data/test/fixtures/status/staged_new_file +0 -1
- data/test/fixtures/status/staged_new_file_modified_file +0 -2
- data/test/fixtures/status/subdir/current_file +0 -1
- data/test/fixtures/status/subdir/modified_file +0 -2
- data/test/fixtures/status/subdir/new_file +0 -1
- data/test/fixtures/status/subdir.txt +0 -2
- data/test/fixtures/status//350/277/231 +0 -1
- data/test/fixtures/testrepo.git/HEAD +0 -1
- data/test/fixtures/testrepo.git/config +0 -13
- data/test/fixtures/testrepo.git/description +0 -1
- data/test/fixtures/testrepo.git/index +0 -0
- data/test/fixtures/testrepo.git/info/exclude +0 -6
- data/test/fixtures/testrepo.git/logs/HEAD +0 -3
- data/test/fixtures/testrepo.git/logs/refs/heads/master +0 -3
- data/test/fixtures/testrepo.git/logs/refs/notes/commits +0 -1
- data/test/fixtures/testrepo.git/objects/0c/37a5391bbff43c37f0d0371823a5509eed5b1d +0 -0
- data/test/fixtures/testrepo.git/objects/13/85f264afb75a56a5bec74243be9b367ba4ca08 +0 -0
- data/test/fixtures/testrepo.git/objects/18/1037049a54a1eb5fab404658a3a250b44335d7 +0 -0
- data/test/fixtures/testrepo.git/objects/18/10dff58d8a660512d4832e740f692884338ccd +0 -0
- data/test/fixtures/testrepo.git/objects/2d/2eff63372b08adf0a9eb84109ccf7d19e2f3a2 +0 -0
- data/test/fixtures/testrepo.git/objects/36/060c58702ed4c2a40832c51758d5344201d89a +0 -2
- data/test/fixtures/testrepo.git/objects/44/1034f860c1d5d90e4188d11ae0d325176869a8 +0 -1
- data/test/fixtures/testrepo.git/objects/45/b983be36b73c0788dc9cbcb76cbb80fc7bb057 +0 -0
- data/test/fixtures/testrepo.git/objects/4a/202b346bb0fb0db7eff3cffeb3c70babbd2045 +0 -2
- data/test/fixtures/testrepo.git/objects/5b/5b025afb0b4c913b4c338a42934a3863bf3644 +0 -2
- data/test/fixtures/testrepo.git/objects/60/d415052a33de2150bf68757f6461df4f563ae4 +0 -0
- data/test/fixtures/testrepo.git/objects/61/9f9935957e010c419cb9d15621916ddfcc0b96 +0 -0
- data/test/fixtures/testrepo.git/objects/68/8a8f4ef7496901d15322972f96e212a9e466cc +0 -1
- data/test/fixtures/testrepo.git/objects/75/057dd4114e74cca1d750d0aee1647c903cb60a +0 -0
- data/test/fixtures/testrepo.git/objects/77/71329dfa3002caf8c61a0ceb62a31d09023f37 +0 -0
- data/test/fixtures/testrepo.git/objects/81/4889a078c031f61ed08ab5fa863aea9314344d +0 -0
- data/test/fixtures/testrepo.git/objects/84/96071c1b46c854b31185ea97743be6a8774479 +0 -0
- data/test/fixtures/testrepo.git/objects/94/eca2de348d5f672faf56b0decafa5937e3235e +0 -0
- data/test/fixtures/testrepo.git/objects/9b/7384fe1676186192842f5d3e129457b62db9e3 +0 -0
- data/test/fixtures/testrepo.git/objects/9f/d738e8f7967c078dceed8190330fc8648ee56a +0 -3
- data/test/fixtures/testrepo.git/objects/a4/a7dce85cf63874e984719f4fdd239f5145052f +0 -2
- data/test/fixtures/testrepo.git/objects/a7/1586c1dfe8a71c6cbf6c129f404c5642ff31bd +0 -0
- data/test/fixtures/testrepo.git/objects/a8/233120f6ad708f843d861ce2b7228ec4e3dec6 +0 -0
- data/test/fixtures/testrepo.git/objects/b7/4713326bc972cc15751ed504dca6f6f3b91f7a +0 -3
- data/test/fixtures/testrepo.git/objects/be/3563ae3f795b2b4353bcce3a527ad0a4f7f644 +0 -3
- data/test/fixtures/testrepo.git/objects/c4/7800c7266a2be04c571c04d5a6614691ea99bd +0 -3
- data/test/fixtures/testrepo.git/objects/c4/dc1555e4d4fa0e0c9c3fc46734c7c35b3ce90b +0 -0
- data/test/fixtures/testrepo.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
- data/test/fixtures/testrepo.git/objects/f6/0079018b664e4e79329a7ef9559c8d9e0378d1 +0 -0
- data/test/fixtures/testrepo.git/objects/fa/49b077972391ad58037050f2a75f74e3671e92 +0 -0
- data/test/fixtures/testrepo.git/objects/fd/093bff70906175335656e6ce6ae05783708765 +0 -0
- data/test/fixtures/testrepo.git/objects/pack/pack-d7c6adf9f61318f041845b01440d09aa7a91e1b5.idx +0 -0
- data/test/fixtures/testrepo.git/objects/pack/pack-d7c6adf9f61318f041845b01440d09aa7a91e1b5.pack +0 -0
- data/test/fixtures/testrepo.git/packed-refs +0 -2
- data/test/fixtures/testrepo.git/refs/heads/master +0 -1
- data/test/fixtures/testrepo.git/refs/notes/commits +0 -1
- data/test/fixtures/testrepo.git/refs/tags/v0.9 +0 -1
- data/test/fixtures/testrepo.git/refs/tags/v1.0 +0 -1
- data/test/fixtures/text_file.md +0 -464
- data/test/fixtures/unsymlinked.git/HEAD +0 -1
- data/test/fixtures/unsymlinked.git/config +0 -6
- data/test/fixtures/unsymlinked.git/description +0 -1
- data/test/fixtures/unsymlinked.git/info/exclude +0 -2
- data/test/fixtures/unsymlinked.git/objects/08/8b64704e0d6b8bd061dea879418cb5442a3fbf +0 -0
- data/test/fixtures/unsymlinked.git/objects/13/a5e939bca25940c069fd2169d993dba328e30b +0 -0
- data/test/fixtures/unsymlinked.git/objects/19/bf568e59e3a0b363cafb4106226e62d4a4c41c +0 -0
- data/test/fixtures/unsymlinked.git/objects/58/1fadd35b4cf320d102a152f918729011604773 +0 -0
- data/test/fixtures/unsymlinked.git/objects/5c/87b6791e8b13da658a14d1ef7e09b5dc3bac8c +0 -0
- data/test/fixtures/unsymlinked.git/objects/6f/e5f5398af85fb3de8a6aba0339b6d3bfa26a27 +0 -0
- data/test/fixtures/unsymlinked.git/objects/7f/ccd75616ec188b8f1b23d67506a334cc34a49d +0 -0
- data/test/fixtures/unsymlinked.git/objects/80/6999882bf91d24241e4077906b9017605eb1f3 +0 -0
- data/test/fixtures/unsymlinked.git/objects/83/7d176303c5005505ec1e4a30231c40930c0230 +0 -0
- data/test/fixtures/unsymlinked.git/objects/a8/595ccca04f40818ae0155c8f9c77a230e597b6 +0 -2
- data/test/fixtures/unsymlinked.git/objects/cf/8f1cf5cce859c438d6cc067284cb5e161206e7 +0 -0
- data/test/fixtures/unsymlinked.git/objects/d5/278d05c8607ec420bfee4cf219fbc0eeebfd6a +0 -0
- data/test/fixtures/unsymlinked.git/objects/f4/e16fb76536591a41454194058d048d8e4dd2e9 +0 -0
- data/test/fixtures/unsymlinked.git/objects/f9/e65619d93fdf2673882e0a261c5e93b1a84006 +0 -0
- data/test/fixtures/unsymlinked.git/refs/heads/exe-file +0 -1
- data/test/fixtures/unsymlinked.git/refs/heads/master +0 -1
- data/test/fixtures/unsymlinked.git/refs/heads/reg-file +0 -1
- data/test/index_test.rb +0 -333
- data/test/lib_test.rb +0 -127
- data/test/note_test.rb +0 -158
- data/test/object_test.rb +0 -43
- data/test/reference_test.rb +0 -207
- data/test/remote_test.rb +0 -324
- data/test/repo_pack_test.rb +0 -24
- data/test/repo_reset_test.rb +0 -82
- data/test/repo_test.rb +0 -402
- data/test/tag_test.rb +0 -68
- data/test/test_helper.rb +0 -92
- data/test/tree_test.rb +0 -91
- data/test/walker_test.rb +0 -88
- data/vendor/libgit2/src/amiga/map.c +0 -48
- data/vendor/libgit2/src/compress.c +0 -53
@@ -13,8 +13,11 @@
|
|
13
13
|
#include "push.h"
|
14
14
|
#include "pack-objects.h"
|
15
15
|
#include "remote.h"
|
16
|
+
#include "util.h"
|
16
17
|
|
17
18
|
#define NETWORK_XFER_THRESHOLD (100*1024)
|
19
|
+
/* The minimal interval between progress updates (in seconds). */
|
20
|
+
#define MIN_PROGRESS_UPDATE_INTERVAL 0.5
|
18
21
|
|
19
22
|
int git_smart__store_refs(transport_smart *t, int flushes)
|
20
23
|
{
|
@@ -23,17 +26,16 @@ int git_smart__store_refs(transport_smart *t, int flushes)
|
|
23
26
|
int error, flush = 0, recvd;
|
24
27
|
const char *line_end = NULL;
|
25
28
|
git_pkt *pkt = NULL;
|
26
|
-
git_pkt_ref *ref;
|
27
29
|
size_t i;
|
28
30
|
|
29
31
|
/* Clear existing refs in case git_remote_connect() is called again
|
30
32
|
* after git_remote_disconnect().
|
31
33
|
*/
|
32
|
-
git_vector_foreach(refs, i,
|
33
|
-
|
34
|
-
git__free(ref);
|
34
|
+
git_vector_foreach(refs, i, pkt) {
|
35
|
+
git_pkt_free(pkt);
|
35
36
|
}
|
36
37
|
git_vector_clear(refs);
|
38
|
+
pkt = NULL;
|
37
39
|
|
38
40
|
do {
|
39
41
|
if (buf->offset > 0)
|
@@ -42,11 +44,11 @@ int git_smart__store_refs(transport_smart *t, int flushes)
|
|
42
44
|
error = GIT_EBUFS;
|
43
45
|
|
44
46
|
if (error < 0 && error != GIT_EBUFS)
|
45
|
-
return
|
47
|
+
return error;
|
46
48
|
|
47
49
|
if (error == GIT_EBUFS) {
|
48
50
|
if ((recvd = gitno_recv(buf)) < 0)
|
49
|
-
return
|
51
|
+
return recvd;
|
50
52
|
|
51
53
|
if (recvd == 0 && !flush) {
|
52
54
|
giterr_set(GITERR_NET, "Early EOF");
|
@@ -75,7 +77,52 @@ int git_smart__store_refs(transport_smart *t, int flushes)
|
|
75
77
|
return flush;
|
76
78
|
}
|
77
79
|
|
78
|
-
int
|
80
|
+
static int append_symref(const char **out, git_vector *symrefs, const char *ptr)
|
81
|
+
{
|
82
|
+
int error;
|
83
|
+
const char *end;
|
84
|
+
git_buf buf = GIT_BUF_INIT;
|
85
|
+
git_refspec *mapping;
|
86
|
+
|
87
|
+
ptr += strlen(GIT_CAP_SYMREF);
|
88
|
+
if (*ptr != '=')
|
89
|
+
goto on_invalid;
|
90
|
+
|
91
|
+
ptr++;
|
92
|
+
if (!(end = strchr(ptr, ' ')) &&
|
93
|
+
!(end = strchr(ptr, '\0')))
|
94
|
+
goto on_invalid;
|
95
|
+
|
96
|
+
if ((error = git_buf_put(&buf, ptr, end - ptr)) < 0)
|
97
|
+
return error;
|
98
|
+
|
99
|
+
/* symref mapping has refspec format */
|
100
|
+
mapping = git__malloc(sizeof(git_refspec));
|
101
|
+
GITERR_CHECK_ALLOC(mapping);
|
102
|
+
|
103
|
+
error = git_refspec__parse(mapping, git_buf_cstr(&buf), true);
|
104
|
+
git_buf_free(&buf);
|
105
|
+
|
106
|
+
/* if the error isn't OOM, then it's a parse error; let's use a nicer message */
|
107
|
+
if (error < 0) {
|
108
|
+
if (giterr_last()->klass != GITERR_NOMEMORY)
|
109
|
+
goto on_invalid;
|
110
|
+
|
111
|
+
return error;
|
112
|
+
}
|
113
|
+
|
114
|
+
if ((error = git_vector_insert(symrefs, mapping)) < 0)
|
115
|
+
return error;
|
116
|
+
|
117
|
+
*out = end;
|
118
|
+
return 0;
|
119
|
+
|
120
|
+
on_invalid:
|
121
|
+
giterr_set(GITERR_NET, "remote sent invalid symref");
|
122
|
+
return -1;
|
123
|
+
}
|
124
|
+
|
125
|
+
int git_smart__detect_caps(git_pkt_ref *pkt, transport_smart_caps *caps, git_vector *symrefs)
|
79
126
|
{
|
80
127
|
const char *ptr;
|
81
128
|
|
@@ -94,6 +141,13 @@ int git_smart__detect_caps(git_pkt_ref *pkt, transport_smart_caps *caps)
|
|
94
141
|
continue;
|
95
142
|
}
|
96
143
|
|
144
|
+
/* Keep multi_ack_detailed before multi_ack */
|
145
|
+
if (!git__prefixcmp(ptr, GIT_CAP_MULTI_ACK_DETAILED)) {
|
146
|
+
caps->common = caps->multi_ack_detailed = 1;
|
147
|
+
ptr += strlen(GIT_CAP_MULTI_ACK_DETAILED);
|
148
|
+
continue;
|
149
|
+
}
|
150
|
+
|
97
151
|
if (!git__prefixcmp(ptr, GIT_CAP_MULTI_ACK)) {
|
98
152
|
caps->common = caps->multi_ack = 1;
|
99
153
|
ptr += strlen(GIT_CAP_MULTI_ACK);
|
@@ -125,6 +179,21 @@ int git_smart__detect_caps(git_pkt_ref *pkt, transport_smart_caps *caps)
|
|
125
179
|
continue;
|
126
180
|
}
|
127
181
|
|
182
|
+
if (!git__prefixcmp(ptr, GIT_CAP_THIN_PACK)) {
|
183
|
+
caps->common = caps->thin_pack = 1;
|
184
|
+
ptr += strlen(GIT_CAP_THIN_PACK);
|
185
|
+
continue;
|
186
|
+
}
|
187
|
+
|
188
|
+
if (!git__prefixcmp(ptr, GIT_CAP_SYMREF)) {
|
189
|
+
int error;
|
190
|
+
|
191
|
+
if ((error = append_symref(&ptr, symrefs, ptr)) < 0)
|
192
|
+
return error;
|
193
|
+
|
194
|
+
continue;
|
195
|
+
}
|
196
|
+
|
128
197
|
/* We don't know this capability, so skip it */
|
129
198
|
ptr = strchr(ptr, ' ');
|
130
199
|
}
|
@@ -148,10 +217,10 @@ static int recv_pkt(git_pkt **out, gitno_buffer *buf)
|
|
148
217
|
break; /* return the pkt */
|
149
218
|
|
150
219
|
if (error < 0 && error != GIT_EBUFS)
|
151
|
-
return
|
220
|
+
return error;
|
152
221
|
|
153
222
|
if ((ret = gitno_recv(buf)) < 0)
|
154
|
-
return
|
223
|
+
return ret;
|
155
224
|
} while (error);
|
156
225
|
|
157
226
|
gitno_consume(buf, line_end);
|
@@ -168,10 +237,11 @@ static int store_common(transport_smart *t)
|
|
168
237
|
{
|
169
238
|
git_pkt *pkt = NULL;
|
170
239
|
gitno_buffer *buf = &t->buffer;
|
240
|
+
int error;
|
171
241
|
|
172
242
|
do {
|
173
|
-
if (recv_pkt(&pkt, buf) < 0)
|
174
|
-
return
|
243
|
+
if ((error = recv_pkt(&pkt, buf)) < 0)
|
244
|
+
return error;
|
175
245
|
|
176
246
|
if (pkt->type == GIT_PKT_ACK) {
|
177
247
|
if (git_vector_insert(&t->common, pkt) < 0)
|
@@ -192,12 +262,13 @@ static int fetch_setup_walk(git_revwalk **out, git_repository *repo)
|
|
192
262
|
git_strarray refs;
|
193
263
|
unsigned int i;
|
194
264
|
git_reference *ref;
|
265
|
+
int error;
|
195
266
|
|
196
|
-
if (git_reference_list(&refs, repo) < 0)
|
197
|
-
return
|
267
|
+
if ((error = git_reference_list(&refs, repo)) < 0)
|
268
|
+
return error;
|
198
269
|
|
199
|
-
if (git_revwalk_new(&walk, repo) < 0)
|
200
|
-
return
|
270
|
+
if ((error = git_revwalk_new(&walk, repo)) < 0)
|
271
|
+
return error;
|
201
272
|
|
202
273
|
git_revwalk_sorting(walk, GIT_SORT_TIME);
|
203
274
|
|
@@ -206,12 +277,13 @@ static int fetch_setup_walk(git_revwalk **out, git_repository *repo)
|
|
206
277
|
if (!git__prefixcmp(refs.strings[i], GIT_REFS_TAGS_DIR))
|
207
278
|
continue;
|
208
279
|
|
209
|
-
if (git_reference_lookup(&ref, repo, refs.strings[i]) < 0)
|
280
|
+
if ((error = git_reference_lookup(&ref, repo, refs.strings[i])) < 0)
|
210
281
|
goto on_error;
|
211
282
|
|
212
283
|
if (git_reference_type(ref) == GIT_REF_SYMBOLIC)
|
213
284
|
continue;
|
214
|
-
|
285
|
+
|
286
|
+
if ((error = git_revwalk_push(walk, git_reference_target(ref))) < 0)
|
215
287
|
goto on_error;
|
216
288
|
|
217
289
|
git_reference_free(ref);
|
@@ -224,10 +296,36 @@ static int fetch_setup_walk(git_revwalk **out, git_repository *repo)
|
|
224
296
|
on_error:
|
225
297
|
git_reference_free(ref);
|
226
298
|
git_strarray_free(&refs);
|
227
|
-
return
|
299
|
+
return error;
|
300
|
+
}
|
301
|
+
|
302
|
+
static int wait_while_ack(gitno_buffer *buf)
|
303
|
+
{
|
304
|
+
int error;
|
305
|
+
git_pkt_ack *pkt = NULL;
|
306
|
+
|
307
|
+
while (1) {
|
308
|
+
git__free(pkt);
|
309
|
+
|
310
|
+
if ((error = recv_pkt((git_pkt **)&pkt, buf)) < 0)
|
311
|
+
return error;
|
312
|
+
|
313
|
+
if (pkt->type == GIT_PKT_NAK)
|
314
|
+
break;
|
315
|
+
|
316
|
+
if (pkt->type == GIT_PKT_ACK &&
|
317
|
+
(pkt->status != GIT_ACK_CONTINUE ||
|
318
|
+
pkt->status != GIT_ACK_COMMON)) {
|
319
|
+
git__free(pkt);
|
320
|
+
return 0;
|
321
|
+
}
|
322
|
+
}
|
323
|
+
|
324
|
+
git__free(pkt);
|
325
|
+
return 0;
|
228
326
|
}
|
229
327
|
|
230
|
-
int git_smart__negotiate_fetch(git_transport *transport, git_repository *repo, const git_remote_head * const *
|
328
|
+
int git_smart__negotiate_fetch(git_transport *transport, git_repository *repo, const git_remote_head * const *wants, size_t count)
|
231
329
|
{
|
232
330
|
transport_smart *t = (transport_smart *)transport;
|
233
331
|
gitno_buffer *buf = &t->buffer;
|
@@ -237,19 +335,20 @@ int git_smart__negotiate_fetch(git_transport *transport, git_repository *repo, c
|
|
237
335
|
unsigned int i;
|
238
336
|
git_oid oid;
|
239
337
|
|
240
|
-
|
241
|
-
if ((error = git_pkt_buffer_wants(refs, count, &t->caps, &data)) < 0)
|
338
|
+
if ((error = git_pkt_buffer_wants(wants, count, &t->caps, &data)) < 0)
|
242
339
|
return error;
|
243
340
|
|
244
341
|
if ((error = fetch_setup_walk(&walk, repo)) < 0)
|
245
342
|
goto on_error;
|
343
|
+
|
246
344
|
/*
|
247
|
-
*
|
248
|
-
*
|
249
|
-
*
|
345
|
+
* Our support for ACK extensions is simply to parse them. On
|
346
|
+
* the first ACK we will accept that as enough common
|
347
|
+
* objects. We give up if we haven't found an answer in the
|
348
|
+
* first 256 we send.
|
250
349
|
*/
|
251
350
|
i = 0;
|
252
|
-
while (
|
351
|
+
while (i < 256) {
|
253
352
|
error = git_revwalk_next(&oid, walk);
|
254
353
|
|
255
354
|
if (error < 0) {
|
@@ -278,7 +377,7 @@ int git_smart__negotiate_fetch(git_transport *transport, git_repository *repo, c
|
|
278
377
|
goto on_error;
|
279
378
|
|
280
379
|
git_buf_clear(&data);
|
281
|
-
if (t->caps.multi_ack) {
|
380
|
+
if (t->caps.multi_ack || t->caps.multi_ack_detailed) {
|
282
381
|
if ((error = store_common(t)) < 0)
|
283
382
|
goto on_error;
|
284
383
|
} else {
|
@@ -307,7 +406,7 @@ int git_smart__negotiate_fetch(git_transport *transport, git_repository *repo, c
|
|
307
406
|
git_pkt_ack *pkt;
|
308
407
|
unsigned int i;
|
309
408
|
|
310
|
-
if ((error = git_pkt_buffer_wants(
|
409
|
+
if ((error = git_pkt_buffer_wants(wants, count, &t->caps, &data)) < 0)
|
311
410
|
goto on_error;
|
312
411
|
|
313
412
|
git_vector_foreach(&t->common, i, pkt) {
|
@@ -327,7 +426,7 @@ int git_smart__negotiate_fetch(git_transport *transport, git_repository *repo, c
|
|
327
426
|
git_pkt_ack *pkt;
|
328
427
|
unsigned int i;
|
329
428
|
|
330
|
-
if ((error = git_pkt_buffer_wants(
|
429
|
+
if ((error = git_pkt_buffer_wants(wants, count, &t->caps, &data)) < 0)
|
331
430
|
goto on_error;
|
332
431
|
|
333
432
|
git_vector_foreach(&t->common, i, pkt) {
|
@@ -356,7 +455,7 @@ int git_smart__negotiate_fetch(git_transport *transport, git_repository *repo, c
|
|
356
455
|
git_revwalk_free(walk);
|
357
456
|
|
358
457
|
/* Now let's eat up whatever the server gives us */
|
359
|
-
if (!t->caps.multi_ack) {
|
458
|
+
if (!t->caps.multi_ack && !t->caps.multi_ack_detailed) {
|
360
459
|
pkt_type = recv_pkt(NULL, buf);
|
361
460
|
|
362
461
|
if (pkt_type < 0) {
|
@@ -366,22 +465,10 @@ int git_smart__negotiate_fetch(git_transport *transport, git_repository *repo, c
|
|
366
465
|
return -1;
|
367
466
|
}
|
368
467
|
} else {
|
369
|
-
|
370
|
-
do {
|
371
|
-
if ((error = recv_pkt((git_pkt **)&pkt, buf)) < 0)
|
372
|
-
return error;
|
373
|
-
|
374
|
-
if (pkt->type == GIT_PKT_NAK ||
|
375
|
-
(pkt->type == GIT_PKT_ACK && pkt->status != GIT_ACK_CONTINUE)) {
|
376
|
-
git__free(pkt);
|
377
|
-
break;
|
378
|
-
}
|
379
|
-
|
380
|
-
git__free(pkt);
|
381
|
-
} while (1);
|
468
|
+
error = wait_while_ack(buf);
|
382
469
|
}
|
383
470
|
|
384
|
-
return
|
471
|
+
return error;
|
385
472
|
|
386
473
|
on_error:
|
387
474
|
git_revwalk_free(walk);
|
@@ -399,16 +486,16 @@ static int no_sideband(transport_smart *t, struct git_odb_writepack *writepack,
|
|
399
486
|
return GIT_EUSER;
|
400
487
|
}
|
401
488
|
|
402
|
-
if (writepack->
|
489
|
+
if (writepack->append(writepack, buf->data, buf->offset, stats) < 0)
|
403
490
|
return -1;
|
404
491
|
|
405
492
|
gitno_consume_n(buf, buf->offset);
|
406
493
|
|
407
494
|
if ((recvd = gitno_recv(buf)) < 0)
|
408
|
-
return
|
495
|
+
return recvd;
|
409
496
|
} while(recvd > 0);
|
410
497
|
|
411
|
-
if (writepack->commit(writepack, stats))
|
498
|
+
if (writepack->commit(writepack, stats) < 0)
|
412
499
|
return -1;
|
413
500
|
|
414
501
|
return 0;
|
@@ -416,13 +503,13 @@ static int no_sideband(transport_smart *t, struct git_odb_writepack *writepack,
|
|
416
503
|
|
417
504
|
struct network_packetsize_payload
|
418
505
|
{
|
419
|
-
|
506
|
+
git_transfer_progress_cb callback;
|
420
507
|
void *payload;
|
421
508
|
git_transfer_progress *stats;
|
422
509
|
size_t last_fired_bytes;
|
423
510
|
};
|
424
511
|
|
425
|
-
static
|
512
|
+
static int network_packetsize(size_t received, void *payload)
|
426
513
|
{
|
427
514
|
struct network_packetsize_payload *npp = (struct network_packetsize_payload*)payload;
|
428
515
|
|
@@ -432,41 +519,46 @@ static void network_packetsize(size_t received, void *payload)
|
|
432
519
|
/* Fire notification if the threshold is reached */
|
433
520
|
if ((npp->stats->received_bytes - npp->last_fired_bytes) > NETWORK_XFER_THRESHOLD) {
|
434
521
|
npp->last_fired_bytes = npp->stats->received_bytes;
|
435
|
-
|
522
|
+
|
523
|
+
if (npp->callback(npp->stats, npp->payload))
|
524
|
+
return GIT_EUSER;
|
436
525
|
}
|
526
|
+
|
527
|
+
return 0;
|
437
528
|
}
|
438
529
|
|
439
530
|
int git_smart__download_pack(
|
440
531
|
git_transport *transport,
|
441
532
|
git_repository *repo,
|
442
533
|
git_transfer_progress *stats,
|
443
|
-
|
534
|
+
git_transfer_progress_cb transfer_progress_cb,
|
444
535
|
void *progress_payload)
|
445
536
|
{
|
446
537
|
transport_smart *t = (transport_smart *)transport;
|
447
538
|
gitno_buffer *buf = &t->buffer;
|
448
539
|
git_odb *odb;
|
449
540
|
struct git_odb_writepack *writepack = NULL;
|
450
|
-
int error =
|
541
|
+
int error = 0;
|
451
542
|
struct network_packetsize_payload npp = {0};
|
452
543
|
|
453
544
|
memset(stats, 0, sizeof(git_transfer_progress));
|
454
545
|
|
455
|
-
if (
|
456
|
-
npp.callback =
|
546
|
+
if (transfer_progress_cb) {
|
547
|
+
npp.callback = transfer_progress_cb;
|
457
548
|
npp.payload = progress_payload;
|
458
549
|
npp.stats = stats;
|
459
550
|
t->packetsize_cb = &network_packetsize;
|
460
551
|
t->packetsize_payload = &npp;
|
461
552
|
|
462
553
|
/* We might have something in the buffer already from negotiate_fetch */
|
463
|
-
if (t->buffer.offset > 0)
|
464
|
-
t->packetsize_cb(t->buffer.offset, t->packetsize_payload)
|
554
|
+
if (t->buffer.offset > 0 && !t->cancelled.val)
|
555
|
+
if (t->packetsize_cb(t->buffer.offset, t->packetsize_payload))
|
556
|
+
git_atomic_set(&t->cancelled, 1);
|
465
557
|
}
|
466
558
|
|
467
559
|
if ((error = git_repository_odb__weakptr(&odb, repo)) < 0 ||
|
468
|
-
((error = git_odb_write_pack(&writepack, odb,
|
469
|
-
goto
|
560
|
+
((error = git_odb_write_pack(&writepack, odb, transfer_progress_cb, progress_payload)) != 0))
|
561
|
+
goto done;
|
470
562
|
|
471
563
|
/*
|
472
564
|
* If the remote doesn't support the side-band, we can feed
|
@@ -474,57 +566,70 @@ int git_smart__download_pack(
|
|
474
566
|
* check which one belongs there.
|
475
567
|
*/
|
476
568
|
if (!t->caps.side_band && !t->caps.side_band_64k) {
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
goto on_success;
|
569
|
+
error = no_sideband(t, writepack, buf, stats);
|
570
|
+
goto done;
|
481
571
|
}
|
482
572
|
|
483
573
|
do {
|
484
|
-
git_pkt *pkt;
|
574
|
+
git_pkt *pkt = NULL;
|
485
575
|
|
576
|
+
/* Check cancellation before network call */
|
486
577
|
if (t->cancelled.val) {
|
487
|
-
|
578
|
+
giterr_clear();
|
488
579
|
error = GIT_EUSER;
|
489
|
-
goto
|
580
|
+
goto done;
|
490
581
|
}
|
491
582
|
|
492
|
-
if (recv_pkt(&pkt, buf)
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
t->progress_cb
|
583
|
+
if ((error = recv_pkt(&pkt, buf)) >= 0) {
|
584
|
+
/* Check cancellation after network call */
|
585
|
+
if (t->cancelled.val) {
|
586
|
+
giterr_clear();
|
587
|
+
error = GIT_EUSER;
|
588
|
+
} else if (pkt->type == GIT_PKT_PROGRESS) {
|
589
|
+
if (t->progress_cb) {
|
590
|
+
git_pkt_progress *p = (git_pkt_progress *) pkt;
|
591
|
+
error = t->progress_cb(p->data, p->len, t->message_cb_payload);
|
592
|
+
}
|
593
|
+
} else if (pkt->type == GIT_PKT_DATA) {
|
594
|
+
git_pkt_data *p = (git_pkt_data *) pkt;
|
595
|
+
error = writepack->append(writepack, p->data, p->len, stats);
|
596
|
+
} else if (pkt->type == GIT_PKT_FLUSH) {
|
597
|
+
/* A flush indicates the end of the packfile */
|
598
|
+
git__free(pkt);
|
599
|
+
break;
|
499
600
|
}
|
500
|
-
git__free(pkt);
|
501
|
-
} else if (pkt->type == GIT_PKT_DATA) {
|
502
|
-
git_pkt_data *p = (git_pkt_data *) pkt;
|
503
|
-
error = writepack->add(writepack, p->data, p->len, stats);
|
504
|
-
|
505
|
-
git__free(pkt);
|
506
|
-
if (error < 0)
|
507
|
-
goto on_error;
|
508
|
-
} else if (pkt->type == GIT_PKT_FLUSH) {
|
509
|
-
/* A flush indicates the end of the packfile */
|
510
|
-
git__free(pkt);
|
511
|
-
break;
|
512
601
|
}
|
602
|
+
|
603
|
+
git__free(pkt);
|
604
|
+
if (error < 0)
|
605
|
+
goto done;
|
606
|
+
|
513
607
|
} while (1);
|
514
608
|
|
515
|
-
|
516
|
-
|
609
|
+
/*
|
610
|
+
* Trailing execution of transfer_progress_cb, if necessary...
|
611
|
+
* Only the callback through the npp datastructure currently
|
612
|
+
* updates the last_fired_bytes value. It is possible that
|
613
|
+
* progress has already been reported with the correct
|
614
|
+
* "received_bytes" value, but until (if?) this is unified
|
615
|
+
* then we will report progress again to be sure that the
|
616
|
+
* correct last received_bytes value is reported.
|
617
|
+
*/
|
618
|
+
if (npp.callback && npp.stats->received_bytes > npp.last_fired_bytes) {
|
619
|
+
error = npp.callback(npp.stats, npp.payload);
|
620
|
+
if (error != 0)
|
621
|
+
goto done;
|
622
|
+
}
|
517
623
|
|
518
|
-
|
519
|
-
error = 0;
|
624
|
+
error = writepack->commit(writepack, stats);
|
520
625
|
|
521
|
-
|
626
|
+
done:
|
522
627
|
if (writepack)
|
523
628
|
writepack->free(writepack);
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
629
|
+
if (transfer_progress_cb) {
|
630
|
+
t->packetsize_cb = NULL;
|
631
|
+
t->packetsize_payload = NULL;
|
632
|
+
}
|
528
633
|
|
529
634
|
return error;
|
530
635
|
}
|
@@ -576,7 +681,7 @@ static int add_push_report_pkt(git_push *push, git_pkt *pkt)
|
|
576
681
|
|
577
682
|
switch (pkt->type) {
|
578
683
|
case GIT_PKT_OK:
|
579
|
-
status = git__calloc(
|
684
|
+
status = git__calloc(sizeof(push_status), 1);
|
580
685
|
GITERR_CHECK_ALLOC(status);
|
581
686
|
status->msg = NULL;
|
582
687
|
status->ref = git__strdup(((git_pkt_ok *)pkt)->ref);
|
@@ -638,10 +743,11 @@ static int add_push_report_sideband_pkt(git_push *push, git_pkt_data *data_pkt)
|
|
638
743
|
return 0;
|
639
744
|
}
|
640
745
|
|
641
|
-
static int parse_report(
|
746
|
+
static int parse_report(transport_smart *transport, git_push *push)
|
642
747
|
{
|
643
748
|
git_pkt *pkt = NULL;
|
644
749
|
const char *line_end = NULL;
|
750
|
+
gitno_buffer *buf = &transport->buffer;
|
645
751
|
int error, recvd;
|
646
752
|
|
647
753
|
for (;;) {
|
@@ -656,7 +762,7 @@ static int parse_report(gitno_buffer *buf, git_push *push)
|
|
656
762
|
|
657
763
|
if (error == GIT_EBUFS) {
|
658
764
|
if ((recvd = gitno_recv(buf)) < 0)
|
659
|
-
return
|
765
|
+
return recvd;
|
660
766
|
|
661
767
|
if (recvd == 0) {
|
662
768
|
giterr_set(GITERR_NET, "Early EOF");
|
@@ -680,6 +786,10 @@ static int parse_report(gitno_buffer *buf, git_push *push)
|
|
680
786
|
error = -1;
|
681
787
|
break;
|
682
788
|
case GIT_PKT_PROGRESS:
|
789
|
+
if (transport->progress_cb) {
|
790
|
+
git_pkt_progress *p = (git_pkt_progress *) pkt;
|
791
|
+
error = transport->progress_cb(p->data, p->len, transport->message_cb_payload);
|
792
|
+
}
|
683
793
|
break;
|
684
794
|
default:
|
685
795
|
error = add_push_report_pkt(push, pkt);
|
@@ -801,22 +911,53 @@ static int update_refs_from_report(
|
|
801
911
|
return 0;
|
802
912
|
}
|
803
913
|
|
914
|
+
struct push_packbuilder_payload
|
915
|
+
{
|
916
|
+
git_smart_subtransport_stream *stream;
|
917
|
+
git_packbuilder *pb;
|
918
|
+
git_push_transfer_progress cb;
|
919
|
+
void *cb_payload;
|
920
|
+
size_t last_bytes;
|
921
|
+
double last_progress_report_time;
|
922
|
+
};
|
923
|
+
|
804
924
|
static int stream_thunk(void *buf, size_t size, void *data)
|
805
925
|
{
|
806
|
-
|
926
|
+
int error = 0;
|
927
|
+
struct push_packbuilder_payload *payload = data;
|
807
928
|
|
808
|
-
|
929
|
+
if ((error = payload->stream->write(payload->stream, (const char *)buf, size)) < 0)
|
930
|
+
return error;
|
931
|
+
|
932
|
+
if (payload->cb) {
|
933
|
+
double current_time = git__timer();
|
934
|
+
payload->last_bytes += size;
|
935
|
+
|
936
|
+
if ((current_time - payload->last_progress_report_time) >= MIN_PROGRESS_UPDATE_INTERVAL) {
|
937
|
+
payload->last_progress_report_time = current_time;
|
938
|
+
error = payload->cb(payload->pb->nr_written, payload->pb->nr_objects, payload->last_bytes, payload->cb_payload);
|
939
|
+
}
|
940
|
+
}
|
941
|
+
|
942
|
+
return error;
|
809
943
|
}
|
810
944
|
|
811
945
|
int git_smart__push(git_transport *transport, git_push *push)
|
812
946
|
{
|
813
947
|
transport_smart *t = (transport_smart *)transport;
|
814
|
-
|
948
|
+
struct push_packbuilder_payload packbuilder_payload = {0};
|
815
949
|
git_buf pktline = GIT_BUF_INIT;
|
816
|
-
int error =
|
950
|
+
int error = 0, need_pack = 0;
|
817
951
|
push_spec *spec;
|
818
952
|
unsigned int i;
|
819
953
|
|
954
|
+
packbuilder_payload.pb = push->pb;
|
955
|
+
|
956
|
+
if (push->transfer_progress_cb) {
|
957
|
+
packbuilder_payload.cb = push->transfer_progress_cb;
|
958
|
+
packbuilder_payload.cb_payload = push->transfer_progress_cb_payload;
|
959
|
+
}
|
960
|
+
|
820
961
|
#ifdef PUSH_DEBUG
|
821
962
|
{
|
822
963
|
git_remote_head *head;
|
@@ -848,29 +989,43 @@ int git_smart__push(git_transport *transport, git_push *push)
|
|
848
989
|
}
|
849
990
|
}
|
850
991
|
|
851
|
-
if (git_smart__get_push_stream(t, &
|
852
|
-
gen_pktline(&pktline, push) < 0 ||
|
853
|
-
|
854
|
-
goto
|
992
|
+
if ((error = git_smart__get_push_stream(t, &packbuilder_payload.stream)) < 0 ||
|
993
|
+
(error = gen_pktline(&pktline, push)) < 0 ||
|
994
|
+
(error = packbuilder_payload.stream->write(packbuilder_payload.stream, git_buf_cstr(&pktline), git_buf_len(&pktline))) < 0)
|
995
|
+
goto done;
|
855
996
|
|
856
|
-
if (need_pack &&
|
857
|
-
|
997
|
+
if (need_pack &&
|
998
|
+
(error = git_packbuilder_foreach(push->pb, &stream_thunk, &packbuilder_payload)) < 0)
|
999
|
+
goto done;
|
858
1000
|
|
859
1001
|
/* If we sent nothing or the server doesn't support report-status, then
|
860
1002
|
* we consider the pack to have been unpacked successfully */
|
861
1003
|
if (!push->specs.length || !push->report_status)
|
862
1004
|
push->unpack_ok = 1;
|
863
|
-
else if (parse_report(
|
864
|
-
goto
|
1005
|
+
else if ((error = parse_report(t, push)) < 0)
|
1006
|
+
goto done;
|
865
1007
|
|
866
|
-
|
867
|
-
|
868
|
-
|
1008
|
+
/* If progress is being reported write the final report */
|
1009
|
+
if (push->transfer_progress_cb) {
|
1010
|
+
error = push->transfer_progress_cb(
|
1011
|
+
push->pb->nr_written,
|
1012
|
+
push->pb->nr_objects,
|
1013
|
+
packbuilder_payload.last_bytes,
|
1014
|
+
push->transfer_progress_cb_payload);
|
869
1015
|
|
870
|
-
|
1016
|
+
if (error < 0)
|
1017
|
+
goto done;
|
1018
|
+
}
|
871
1019
|
|
872
|
-
|
873
|
-
|
1020
|
+
if (push->status.length) {
|
1021
|
+
error = update_refs_from_report(&t->refs, &push->specs, &push->status);
|
1022
|
+
if (error < 0)
|
1023
|
+
goto done;
|
1024
|
+
|
1025
|
+
error = git_smart__update_heads(t, NULL);
|
1026
|
+
}
|
874
1027
|
|
1028
|
+
done:
|
1029
|
+
git_buf_free(&pktline);
|
875
1030
|
return error;
|
876
1031
|
}
|