rugged 0.17.0.b7 → 0.18.0.b1
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.
- data/LICENSE +1 -1
- data/README.md +88 -32
- data/ext/rugged/extconf.rb +4 -2
- data/ext/rugged/rugged.c +72 -10
- data/ext/rugged/rugged.h +14 -10
- data/ext/rugged/rugged_blob.c +8 -10
- data/ext/rugged/rugged_branch.c +11 -14
- data/ext/rugged/rugged_commit.c +31 -24
- data/ext/rugged/rugged_config.c +2 -2
- data/ext/rugged/rugged_index.c +133 -198
- data/ext/rugged/rugged_note.c +372 -0
- data/ext/rugged/rugged_object.c +50 -22
- data/ext/rugged/rugged_reference.c +122 -130
- data/ext/rugged/rugged_remote.c +72 -29
- data/ext/rugged/rugged_repo.c +402 -20
- data/ext/rugged/rugged_revwalk.c +7 -3
- data/ext/rugged/rugged_settings.c +110 -0
- data/ext/rugged/rugged_signature.c +23 -7
- data/ext/rugged/rugged_tag.c +32 -16
- data/ext/rugged/rugged_tree.c +44 -15
- data/lib/rugged.rb +1 -0
- data/lib/rugged/index.rb +8 -0
- data/lib/rugged/remote.rb +13 -0
- data/lib/rugged/repository.rb +3 -3
- data/lib/rugged/version.rb +1 -1
- data/test/blob_test.rb +13 -15
- data/test/branch_test.rb +32 -67
- data/test/commit_test.rb +50 -12
- data/test/config_test.rb +12 -11
- data/test/coverage/HEAD.json +1 -1
- data/test/coverage/cover.rb +40 -21
- data/test/errors_test.rb +34 -0
- 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/testrepo.git/logs/refs/notes/commits +1 -0
- data/test/fixtures/testrepo.git/objects/44/1034f860c1d5d90e4188d11ae0d325176869a8 +1 -0
- data/test/fixtures/testrepo.git/objects/60/d415052a33de2150bf68757f6461df4f563ae4 +0 -0
- data/test/fixtures/testrepo.git/objects/68/8a8f4ef7496901d15322972f96e212a9e466cc +1 -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/b7/4713326bc972cc15751ed504dca6f6f3b91f7a +3 -0
- data/test/fixtures/testrepo.git/refs/notes/commits +1 -0
- data/test/index_test.rb +65 -69
- data/test/lib_test.rb +76 -11
- data/test/note_test.rb +158 -0
- data/test/object_test.rb +8 -11
- data/test/reference_test.rb +77 -85
- data/test/remote_test.rb +86 -8
- data/test/repo_pack_test.rb +9 -7
- data/test/repo_reset_test.rb +80 -0
- data/test/repo_test.rb +176 -53
- data/test/tag_test.rb +44 -7
- data/test/test_helper.rb +63 -35
- data/test/tree_test.rb +34 -13
- data/test/walker_test.rb +14 -14
- data/vendor/libgit2/Makefile.embed +1 -1
- data/vendor/libgit2/deps/http-parser/http_parser.c +974 -578
- data/vendor/libgit2/deps/http-parser/http_parser.h +106 -70
- data/vendor/libgit2/deps/regex/regcomp.c +7 -6
- data/vendor/libgit2/deps/regex/regex_internal.c +1 -1
- data/vendor/libgit2/deps/regex/regex_internal.h +12 -3
- data/vendor/libgit2/deps/regex/regexec.c +5 -5
- data/vendor/libgit2/include/git2.h +5 -1
- data/vendor/libgit2/include/git2/attr.h +4 -2
- data/vendor/libgit2/include/git2/blob.h +39 -12
- data/vendor/libgit2/include/git2/branch.h +123 -35
- data/vendor/libgit2/include/git2/checkout.h +206 -48
- data/vendor/libgit2/include/git2/clone.h +72 -27
- data/vendor/libgit2/include/git2/commit.h +20 -17
- data/vendor/libgit2/include/git2/common.h +67 -1
- data/vendor/libgit2/include/git2/config.h +81 -60
- data/vendor/libgit2/include/git2/cred_helpers.h +53 -0
- data/vendor/libgit2/include/git2/diff.h +459 -150
- data/vendor/libgit2/include/git2/errors.h +9 -1
- data/vendor/libgit2/include/git2/graph.h +41 -0
- data/vendor/libgit2/include/git2/ignore.h +7 -6
- data/vendor/libgit2/include/git2/index.h +323 -97
- data/vendor/libgit2/include/git2/indexer.h +27 -59
- data/vendor/libgit2/include/git2/inttypes.h +4 -0
- data/vendor/libgit2/include/git2/merge.h +13 -3
- data/vendor/libgit2/include/git2/message.h +14 -8
- data/vendor/libgit2/include/git2/net.h +9 -7
- data/vendor/libgit2/include/git2/notes.h +88 -29
- data/vendor/libgit2/include/git2/object.h +16 -6
- data/vendor/libgit2/include/git2/odb.h +80 -17
- data/vendor/libgit2/include/git2/odb_backend.h +47 -11
- data/vendor/libgit2/include/git2/oid.h +26 -17
- data/vendor/libgit2/include/git2/pack.h +62 -8
- data/vendor/libgit2/include/git2/push.h +131 -0
- data/vendor/libgit2/include/git2/refdb.h +103 -0
- data/vendor/libgit2/include/git2/refdb_backend.h +109 -0
- data/vendor/libgit2/include/git2/reflog.h +30 -21
- data/vendor/libgit2/include/git2/refs.h +215 -193
- data/vendor/libgit2/include/git2/refspec.h +22 -2
- data/vendor/libgit2/include/git2/remote.h +158 -37
- data/vendor/libgit2/include/git2/repository.h +150 -31
- data/vendor/libgit2/include/git2/reset.h +43 -9
- data/vendor/libgit2/include/git2/revparse.h +48 -4
- data/vendor/libgit2/include/git2/revwalk.h +25 -10
- data/vendor/libgit2/include/git2/signature.h +20 -12
- data/vendor/libgit2/include/git2/stash.h +121 -0
- data/vendor/libgit2/include/git2/status.h +122 -53
- data/vendor/libgit2/include/git2/strarray.h +17 -11
- data/vendor/libgit2/include/git2/submodule.h +42 -7
- data/vendor/libgit2/include/git2/tag.h +72 -59
- data/vendor/libgit2/include/git2/threads.h +4 -2
- data/vendor/libgit2/include/git2/trace.h +68 -0
- data/vendor/libgit2/include/git2/transport.h +328 -0
- data/vendor/libgit2/include/git2/tree.h +149 -120
- data/vendor/libgit2/include/git2/types.h +13 -12
- data/vendor/libgit2/include/git2/version.h +3 -3
- data/vendor/libgit2/src/amiga/map.c +2 -2
- data/vendor/libgit2/src/attr.c +58 -48
- data/vendor/libgit2/src/attr.h +4 -18
- data/vendor/libgit2/src/attr_file.c +30 -6
- data/vendor/libgit2/src/attr_file.h +6 -8
- data/vendor/libgit2/src/attrcache.h +24 -0
- data/vendor/libgit2/src/blob.c +30 -7
- data/vendor/libgit2/src/blob.h +1 -1
- data/vendor/libgit2/src/branch.c +361 -68
- data/vendor/libgit2/src/branch.h +17 -0
- data/vendor/libgit2/src/bswap.h +1 -1
- data/vendor/libgit2/src/buf_text.c +291 -0
- data/vendor/libgit2/src/buf_text.h +122 -0
- data/vendor/libgit2/src/buffer.c +27 -101
- data/vendor/libgit2/src/buffer.h +54 -39
- data/vendor/libgit2/src/cache.c +15 -6
- data/vendor/libgit2/src/cache.h +1 -1
- data/vendor/libgit2/src/cc-compat.h +3 -1
- data/vendor/libgit2/src/checkout.c +1165 -222
- data/vendor/libgit2/src/checkout.h +24 -0
- data/vendor/libgit2/src/clone.c +171 -86
- data/vendor/libgit2/src/commit.c +44 -45
- data/vendor/libgit2/src/commit.h +3 -3
- data/vendor/libgit2/src/commit_list.c +194 -0
- data/vendor/libgit2/src/commit_list.h +49 -0
- data/vendor/libgit2/src/common.h +44 -10
- data/vendor/libgit2/src/compress.c +1 -1
- data/vendor/libgit2/src/compress.h +1 -1
- data/vendor/libgit2/src/config.c +211 -124
- data/vendor/libgit2/src/config.h +23 -4
- data/vendor/libgit2/src/config_cache.c +2 -2
- data/vendor/libgit2/src/config_file.c +129 -53
- data/vendor/libgit2/src/config_file.h +10 -8
- data/vendor/libgit2/src/crlf.c +66 -67
- data/vendor/libgit2/src/date.c +12 -12
- data/vendor/libgit2/src/delta-apply.c +14 -1
- data/vendor/libgit2/src/delta-apply.h +18 -1
- data/vendor/libgit2/src/delta.c +40 -107
- data/vendor/libgit2/src/delta.h +19 -17
- data/vendor/libgit2/src/diff.c +347 -496
- data/vendor/libgit2/src/diff.h +27 -1
- data/vendor/libgit2/src/diff_output.c +564 -249
- data/vendor/libgit2/src/diff_output.h +15 -8
- data/vendor/libgit2/src/diff_tform.c +687 -0
- data/vendor/libgit2/src/errors.c +27 -36
- data/vendor/libgit2/src/fetch.c +13 -351
- data/vendor/libgit2/src/fetch.h +13 -3
- data/vendor/libgit2/src/fetchhead.c +295 -0
- data/vendor/libgit2/src/fetchhead.h +34 -0
- data/vendor/libgit2/src/filebuf.c +42 -15
- data/vendor/libgit2/src/filebuf.h +4 -2
- data/vendor/libgit2/src/fileops.c +466 -113
- data/vendor/libgit2/src/fileops.h +154 -28
- data/vendor/libgit2/src/filter.c +3 -75
- data/vendor/libgit2/src/filter.h +1 -29
- data/vendor/libgit2/src/fnmatch.c +1 -1
- data/vendor/libgit2/src/fnmatch.h +1 -1
- data/vendor/libgit2/src/global.c +54 -10
- data/vendor/libgit2/src/global.h +10 -1
- data/vendor/libgit2/src/graph.c +178 -0
- data/vendor/libgit2/src/hash.c +25 -52
- data/vendor/libgit2/src/hash.h +21 -9
- data/vendor/libgit2/src/{sha1/sha1.c → hash/hash_generic.c} +20 -12
- data/vendor/libgit2/src/hash/hash_generic.h +24 -0
- data/vendor/libgit2/src/hash/hash_openssl.h +45 -0
- data/vendor/libgit2/src/hash/hash_win32.c +291 -0
- data/vendor/libgit2/src/hash/hash_win32.h +140 -0
- data/vendor/libgit2/src/hashsig.c +368 -0
- data/vendor/libgit2/src/hashsig.h +72 -0
- data/vendor/libgit2/src/ignore.c +22 -15
- data/vendor/libgit2/src/ignore.h +6 -1
- data/vendor/libgit2/src/index.c +770 -171
- data/vendor/libgit2/src/index.h +13 -5
- data/vendor/libgit2/src/indexer.c +286 -431
- data/vendor/libgit2/src/iterator.c +854 -466
- data/vendor/libgit2/src/iterator.h +134 -109
- data/vendor/libgit2/src/map.h +1 -1
- data/vendor/libgit2/src/merge.c +296 -0
- data/vendor/libgit2/src/merge.h +22 -0
- data/vendor/libgit2/src/message.c +1 -1
- data/vendor/libgit2/src/message.h +1 -1
- data/vendor/libgit2/src/mwindow.c +35 -30
- data/vendor/libgit2/src/mwindow.h +2 -2
- data/vendor/libgit2/src/netops.c +162 -98
- data/vendor/libgit2/src/netops.h +50 -15
- data/vendor/libgit2/src/notes.c +109 -58
- data/vendor/libgit2/src/notes.h +2 -1
- data/vendor/libgit2/src/object.c +46 -57
- data/vendor/libgit2/src/object.h +1 -8
- data/vendor/libgit2/src/odb.c +151 -40
- data/vendor/libgit2/src/odb.h +5 -1
- data/vendor/libgit2/src/odb_loose.c +4 -5
- data/vendor/libgit2/src/odb_pack.c +122 -80
- data/vendor/libgit2/src/offmap.h +65 -0
- data/vendor/libgit2/src/oid.c +12 -4
- data/vendor/libgit2/src/oidmap.h +1 -1
- data/vendor/libgit2/src/pack-objects.c +88 -61
- data/vendor/libgit2/src/pack-objects.h +8 -8
- data/vendor/libgit2/src/pack.c +293 -28
- data/vendor/libgit2/src/pack.h +49 -4
- data/vendor/libgit2/src/path.c +103 -14
- data/vendor/libgit2/src/path.h +23 -7
- data/vendor/libgit2/src/pathspec.c +168 -0
- data/vendor/libgit2/src/pathspec.h +40 -0
- data/vendor/libgit2/src/pool.c +29 -4
- data/vendor/libgit2/src/pool.h +8 -1
- data/vendor/libgit2/src/posix.c +26 -27
- data/vendor/libgit2/src/posix.h +2 -3
- data/vendor/libgit2/src/pqueue.c +23 -1
- data/vendor/libgit2/src/pqueue.h +23 -1
- data/vendor/libgit2/src/push.c +653 -0
- data/vendor/libgit2/src/push.h +51 -0
- data/vendor/libgit2/src/refdb.c +185 -0
- data/vendor/libgit2/src/refdb.h +46 -0
- data/vendor/libgit2/src/refdb_fs.c +1024 -0
- data/vendor/libgit2/src/refdb_fs.h +15 -0
- data/vendor/libgit2/src/reflog.c +77 -45
- data/vendor/libgit2/src/reflog.h +1 -3
- data/vendor/libgit2/src/refs.c +366 -1326
- data/vendor/libgit2/src/refs.h +22 -13
- data/vendor/libgit2/src/refspec.c +46 -7
- data/vendor/libgit2/src/refspec.h +11 -1
- data/vendor/libgit2/src/remote.c +758 -120
- data/vendor/libgit2/src/remote.h +10 -5
- data/vendor/libgit2/src/repo_template.h +6 -6
- data/vendor/libgit2/src/repository.c +315 -96
- data/vendor/libgit2/src/repository.h +5 -3
- data/vendor/libgit2/src/reset.c +99 -81
- data/vendor/libgit2/src/revparse.c +157 -84
- data/vendor/libgit2/src/revwalk.c +68 -470
- data/vendor/libgit2/src/revwalk.h +44 -0
- data/vendor/libgit2/src/sha1_lookup.c +1 -1
- data/vendor/libgit2/src/sha1_lookup.h +1 -1
- data/vendor/libgit2/src/signature.c +68 -200
- data/vendor/libgit2/src/signature.h +1 -1
- data/vendor/libgit2/src/stash.c +663 -0
- data/vendor/libgit2/src/status.c +101 -79
- data/vendor/libgit2/src/strmap.h +1 -1
- data/vendor/libgit2/src/submodule.c +67 -51
- data/vendor/libgit2/src/submodule.h +1 -1
- data/vendor/libgit2/src/tag.c +35 -29
- data/vendor/libgit2/src/tag.h +1 -1
- data/vendor/libgit2/src/thread-utils.c +1 -1
- data/vendor/libgit2/src/thread-utils.h +2 -2
- data/vendor/libgit2/src/trace.c +39 -0
- data/vendor/libgit2/src/trace.h +56 -0
- data/vendor/libgit2/src/transport.c +81 -34
- data/vendor/libgit2/src/transports/cred.c +60 -0
- data/vendor/libgit2/src/transports/cred_helpers.c +49 -0
- data/vendor/libgit2/src/transports/git.c +234 -127
- data/vendor/libgit2/src/transports/http.c +761 -433
- data/vendor/libgit2/src/transports/local.c +460 -64
- data/vendor/libgit2/src/transports/smart.c +345 -0
- data/vendor/libgit2/src/transports/smart.h +179 -0
- data/vendor/libgit2/src/{pkt.c → transports/smart_pkt.c} +131 -12
- data/vendor/libgit2/src/transports/smart_protocol.c +856 -0
- data/vendor/libgit2/src/transports/winhttp.c +1136 -0
- data/vendor/libgit2/src/tree-cache.c +2 -2
- data/vendor/libgit2/src/tree-cache.h +1 -1
- data/vendor/libgit2/src/tree.c +239 -166
- data/vendor/libgit2/src/tree.h +11 -2
- data/vendor/libgit2/src/tsort.c +39 -23
- data/vendor/libgit2/src/unix/map.c +1 -1
- data/vendor/libgit2/src/unix/posix.h +12 -2
- data/vendor/libgit2/src/unix/realpath.c +30 -0
- data/vendor/libgit2/src/util.c +250 -13
- data/vendor/libgit2/src/util.h +71 -14
- data/vendor/libgit2/src/vector.c +123 -60
- data/vendor/libgit2/src/vector.h +24 -22
- data/vendor/libgit2/src/win32/dir.c +1 -1
- data/vendor/libgit2/src/win32/dir.h +1 -1
- data/vendor/libgit2/src/win32/error.c +77 -0
- data/vendor/libgit2/src/win32/error.h +13 -0
- data/vendor/libgit2/src/win32/findfile.c +143 -54
- data/vendor/libgit2/src/win32/findfile.h +10 -6
- data/vendor/libgit2/src/win32/map.c +1 -1
- data/vendor/libgit2/src/win32/mingw-compat.h +1 -1
- data/vendor/libgit2/src/win32/msvc-compat.h +10 -1
- data/vendor/libgit2/src/win32/posix.h +10 -1
- data/vendor/libgit2/src/win32/posix_w32.c +132 -63
- data/vendor/libgit2/src/win32/precompiled.c +1 -1
- data/vendor/libgit2/src/win32/pthread.c +1 -1
- data/vendor/libgit2/src/win32/pthread.h +1 -1
- data/vendor/libgit2/src/win32/utf-conv.c +5 -5
- data/vendor/libgit2/src/win32/utf-conv.h +3 -3
- data/vendor/libgit2/src/win32/version.h +20 -0
- metadata +308 -252
- data/test/fixtures/testrepo.git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 +0 -0
- data/test/fixtures/testrepo.git/objects/7f/043268ea43ce18e3540acaabf9e090c91965b0 +0 -0
- data/test/fixtures/testrepo.git/objects/a3/e05719b428a2d0ed7a55c4ce53dcc5768c6d5e +0 -0
- data/test/index_test.rb~ +0 -218
- data/vendor/libgit2/src/pkt.h +0 -91
- data/vendor/libgit2/src/ppc/sha1.c +0 -70
- data/vendor/libgit2/src/ppc/sha1.h +0 -26
- data/vendor/libgit2/src/protocol.c +0 -110
- data/vendor/libgit2/src/protocol.h +0 -21
- data/vendor/libgit2/src/sha1.h +0 -33
- data/vendor/libgit2/src/transport.h +0 -148
data/vendor/libgit2/src/errors.c
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (C)
|
|
2
|
+
* Copyright (C) the libgit2 contributors. All rights reserved.
|
|
3
3
|
*
|
|
4
4
|
* This file is part of libgit2, distributed under the GNU GPL v2 with
|
|
5
5
|
* a Linking Exception. For full terms see the included COPYING file.
|
|
@@ -40,52 +40,34 @@ void giterr_set(int error_class, const char *string, ...)
|
|
|
40
40
|
{
|
|
41
41
|
git_buf buf = GIT_BUF_INIT;
|
|
42
42
|
va_list arglist;
|
|
43
|
-
|
|
44
|
-
int unix_error_code = 0;
|
|
45
|
-
|
|
46
|
-
#ifdef GIT_WIN32
|
|
47
|
-
DWORD win32_error_code = 0;
|
|
48
|
-
#endif
|
|
49
|
-
|
|
50
|
-
if (error_class == GITERR_OS) {
|
|
51
|
-
unix_error_code = errno;
|
|
52
|
-
errno = 0;
|
|
53
|
-
|
|
54
43
|
#ifdef GIT_WIN32
|
|
55
|
-
|
|
56
|
-
SetLastError(0);
|
|
44
|
+
DWORD win32_error_code = (error_class == GITERR_OS) ? GetLastError() : 0;
|
|
57
45
|
#endif
|
|
58
|
-
|
|
46
|
+
int error_code = (error_class == GITERR_OS) ? errno : 0;
|
|
59
47
|
|
|
60
48
|
va_start(arglist, string);
|
|
61
49
|
git_buf_vprintf(&buf, string, arglist);
|
|
62
50
|
va_end(arglist);
|
|
63
51
|
|
|
64
|
-
/* automatically suffix strerror(errno) for GITERR_OS errors */
|
|
65
52
|
if (error_class == GITERR_OS) {
|
|
66
|
-
|
|
67
|
-
|
|
53
|
+
#ifdef GIT_WIN32
|
|
54
|
+
char * win32_error = git_win32_get_error_message(win32_error_code);
|
|
55
|
+
if (win32_error) {
|
|
68
56
|
git_buf_PUTS(&buf, ": ");
|
|
69
|
-
git_buf_puts(&buf,
|
|
70
|
-
|
|
57
|
+
git_buf_puts(&buf, win32_error);
|
|
58
|
+
git__free(win32_error);
|
|
71
59
|
|
|
72
|
-
|
|
73
|
-
else if (win32_error_code != 0) {
|
|
74
|
-
LPVOID lpMsgBuf = NULL;
|
|
75
|
-
|
|
76
|
-
FormatMessage(
|
|
77
|
-
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
78
|
-
FORMAT_MESSAGE_FROM_SYSTEM |
|
|
79
|
-
FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
80
|
-
NULL, win32_error_code, 0, (LPTSTR) &lpMsgBuf, 0, NULL);
|
|
81
|
-
|
|
82
|
-
if (lpMsgBuf) {
|
|
83
|
-
git_buf_PUTS(&buf, ": ");
|
|
84
|
-
git_buf_puts(&buf, lpMsgBuf);
|
|
85
|
-
LocalFree(lpMsgBuf);
|
|
86
|
-
}
|
|
60
|
+
SetLastError(0);
|
|
87
61
|
}
|
|
62
|
+
else
|
|
88
63
|
#endif
|
|
64
|
+
if (error_code) {
|
|
65
|
+
git_buf_PUTS(&buf, ": ");
|
|
66
|
+
git_buf_puts(&buf, strerror(error_code));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (error_code)
|
|
70
|
+
errno = 0;
|
|
89
71
|
}
|
|
90
72
|
|
|
91
73
|
if (!git_buf_oom(&buf))
|
|
@@ -104,15 +86,24 @@ void giterr_set_str(int error_class, const char *string)
|
|
|
104
86
|
set_error(error_class, message);
|
|
105
87
|
}
|
|
106
88
|
|
|
107
|
-
|
|
89
|
+
int giterr_set_regex(const regex_t *regex, int error_code)
|
|
108
90
|
{
|
|
109
91
|
char error_buf[1024];
|
|
92
|
+
|
|
93
|
+
assert(error_code);
|
|
94
|
+
|
|
110
95
|
regerror(error_code, regex, error_buf, sizeof(error_buf));
|
|
111
96
|
giterr_set_str(GITERR_REGEX, error_buf);
|
|
97
|
+
|
|
98
|
+
if (error_code == REG_NOMATCH)
|
|
99
|
+
return GIT_ENOTFOUND;
|
|
100
|
+
|
|
101
|
+
return GIT_EINVALIDSPEC;
|
|
112
102
|
}
|
|
113
103
|
|
|
114
104
|
void giterr_clear(void)
|
|
115
105
|
{
|
|
106
|
+
set_error(0, NULL);
|
|
116
107
|
GIT_GLOBAL->last_error = NULL;
|
|
117
108
|
|
|
118
109
|
errno = 0;
|
data/vendor/libgit2/src/fetch.c
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Copyright (C)
|
|
2
|
+
* Copyright (C) the libgit2 contributors. All rights reserved.
|
|
3
3
|
*
|
|
4
4
|
* This file is part of libgit2, distributed under the GNU GPL v2 with
|
|
5
5
|
* a Linking Exception. For full terms see the included COPYING file.
|
|
@@ -8,16 +8,14 @@
|
|
|
8
8
|
#include "git2/oid.h"
|
|
9
9
|
#include "git2/refs.h"
|
|
10
10
|
#include "git2/revwalk.h"
|
|
11
|
-
#include "git2/
|
|
11
|
+
#include "git2/transport.h"
|
|
12
12
|
|
|
13
13
|
#include "common.h"
|
|
14
|
-
#include "transport.h"
|
|
15
14
|
#include "remote.h"
|
|
16
15
|
#include "refspec.h"
|
|
17
16
|
#include "pack.h"
|
|
18
17
|
#include "fetch.h"
|
|
19
18
|
#include "netops.h"
|
|
20
|
-
#include "pkt.h"
|
|
21
19
|
|
|
22
20
|
struct filter_payload {
|
|
23
21
|
git_remote *remote;
|
|
@@ -86,61 +84,6 @@ cleanup:
|
|
|
86
84
|
return error;
|
|
87
85
|
}
|
|
88
86
|
|
|
89
|
-
/* Wait until we get an ack from the */
|
|
90
|
-
static int recv_pkt(git_pkt **out, gitno_buffer *buf)
|
|
91
|
-
{
|
|
92
|
-
const char *ptr = buf->data, *line_end = ptr;
|
|
93
|
-
git_pkt *pkt;
|
|
94
|
-
int pkt_type, error = 0, ret;
|
|
95
|
-
|
|
96
|
-
do {
|
|
97
|
-
if (buf->offset > 0)
|
|
98
|
-
error = git_pkt_parse_line(&pkt, ptr, &line_end, buf->offset);
|
|
99
|
-
else
|
|
100
|
-
error = GIT_EBUFS;
|
|
101
|
-
|
|
102
|
-
if (error == 0)
|
|
103
|
-
break; /* return the pkt */
|
|
104
|
-
|
|
105
|
-
if (error < 0 && error != GIT_EBUFS)
|
|
106
|
-
return -1;
|
|
107
|
-
|
|
108
|
-
if ((ret = gitno_recv(buf)) < 0)
|
|
109
|
-
return -1;
|
|
110
|
-
} while (error);
|
|
111
|
-
|
|
112
|
-
gitno_consume(buf, line_end);
|
|
113
|
-
pkt_type = pkt->type;
|
|
114
|
-
if (out != NULL)
|
|
115
|
-
*out = pkt;
|
|
116
|
-
else
|
|
117
|
-
git__free(pkt);
|
|
118
|
-
|
|
119
|
-
return pkt_type;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
static int store_common(git_transport *t)
|
|
123
|
-
{
|
|
124
|
-
git_pkt *pkt = NULL;
|
|
125
|
-
gitno_buffer *buf = &t->buffer;
|
|
126
|
-
|
|
127
|
-
do {
|
|
128
|
-
if (recv_pkt(&pkt, buf) < 0)
|
|
129
|
-
return -1;
|
|
130
|
-
|
|
131
|
-
if (pkt->type == GIT_PKT_ACK) {
|
|
132
|
-
if (git_vector_insert(&t->common, pkt) < 0)
|
|
133
|
-
return -1;
|
|
134
|
-
} else {
|
|
135
|
-
git__free(pkt);
|
|
136
|
-
return 0;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
} while (1);
|
|
140
|
-
|
|
141
|
-
return 0;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
87
|
/*
|
|
145
88
|
* In this first version, we push all our refs in and start sending
|
|
146
89
|
* them out. When we get an ACK we hide that commit and continue
|
|
@@ -149,13 +92,7 @@ static int store_common(git_transport *t)
|
|
|
149
92
|
int git_fetch_negotiate(git_remote *remote)
|
|
150
93
|
{
|
|
151
94
|
git_transport *t = remote->transport;
|
|
152
|
-
|
|
153
|
-
git_buf data = GIT_BUF_INIT;
|
|
154
|
-
git_revwalk *walk = NULL;
|
|
155
|
-
int error = -1, pkt_type;
|
|
156
|
-
unsigned int i;
|
|
157
|
-
git_oid oid;
|
|
158
|
-
|
|
95
|
+
|
|
159
96
|
if (filter_wants(remote) < 0) {
|
|
160
97
|
giterr_set(GITERR_NET, "Failed to filter the reference list for wants");
|
|
161
98
|
return -1;
|
|
@@ -167,298 +104,23 @@ int git_fetch_negotiate(git_remote *remote)
|
|
|
167
104
|
|
|
168
105
|
/*
|
|
169
106
|
* Now we have everything set up so we can start tell the
|
|
170
|
-
* server what we want and what we have.
|
|
171
|
-
* the transport has its own logic. This is transitional and
|
|
172
|
-
* will be removed once this function can support git and http.
|
|
173
|
-
*/
|
|
174
|
-
if (t->own_logic)
|
|
175
|
-
return t->negotiate_fetch(t, remote->repo, &remote->refs);
|
|
176
|
-
|
|
177
|
-
/* No own logic, do our thing */
|
|
178
|
-
if (git_pkt_buffer_wants(&remote->refs, &t->caps, &data) < 0)
|
|
179
|
-
return -1;
|
|
180
|
-
|
|
181
|
-
if (git_fetch_setup_walk(&walk, remote->repo) < 0)
|
|
182
|
-
goto on_error;
|
|
183
|
-
/*
|
|
184
|
-
* We don't support any kind of ACK extensions, so the negotiation
|
|
185
|
-
* boils down to sending what we have and listening for an ACK
|
|
186
|
-
* every once in a while.
|
|
107
|
+
* server what we want and what we have.
|
|
187
108
|
*/
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
if (i % 20 == 0) {
|
|
193
|
-
if (t->cancel.val) {
|
|
194
|
-
giterr_set(GITERR_NET, "The fetch was cancelled by the user");
|
|
195
|
-
error = GIT_EUSER;
|
|
196
|
-
goto on_error;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
git_pkt_buffer_flush(&data);
|
|
200
|
-
if (git_buf_oom(&data))
|
|
201
|
-
goto on_error;
|
|
202
|
-
|
|
203
|
-
if (t->negotiation_step(t, data.ptr, data.size) < 0)
|
|
204
|
-
goto on_error;
|
|
205
|
-
|
|
206
|
-
git_buf_clear(&data);
|
|
207
|
-
if (t->caps.multi_ack) {
|
|
208
|
-
if (store_common(t) < 0)
|
|
209
|
-
goto on_error;
|
|
210
|
-
} else {
|
|
211
|
-
pkt_type = recv_pkt(NULL, buf);
|
|
212
|
-
|
|
213
|
-
if (pkt_type == GIT_PKT_ACK) {
|
|
214
|
-
break;
|
|
215
|
-
} else if (pkt_type == GIT_PKT_NAK) {
|
|
216
|
-
continue;
|
|
217
|
-
} else {
|
|
218
|
-
giterr_set(GITERR_NET, "Unexpected pkt type");
|
|
219
|
-
goto on_error;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
if (t->common.length > 0)
|
|
225
|
-
break;
|
|
226
|
-
|
|
227
|
-
if (i % 20 == 0 && t->rpc) {
|
|
228
|
-
git_pkt_ack *pkt;
|
|
229
|
-
unsigned int i;
|
|
230
|
-
|
|
231
|
-
if (git_pkt_buffer_wants(&remote->refs, &t->caps, &data) < 0)
|
|
232
|
-
goto on_error;
|
|
233
|
-
|
|
234
|
-
git_vector_foreach(&t->common, i, pkt) {
|
|
235
|
-
git_pkt_buffer_have(&pkt->oid, &data);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
if (git_buf_oom(&data))
|
|
239
|
-
goto on_error;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
if (error < 0 && error != GIT_ITEROVER)
|
|
244
|
-
goto on_error;
|
|
245
|
-
|
|
246
|
-
/* Tell the other end that we're done negotiating */
|
|
247
|
-
if (t->rpc && t->common.length > 0) {
|
|
248
|
-
git_pkt_ack *pkt;
|
|
249
|
-
unsigned int i;
|
|
250
|
-
|
|
251
|
-
if (git_pkt_buffer_wants(&remote->refs, &t->caps, &data) < 0)
|
|
252
|
-
goto on_error;
|
|
253
|
-
|
|
254
|
-
git_vector_foreach(&t->common, i, pkt) {
|
|
255
|
-
git_pkt_buffer_have(&pkt->oid, &data);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
if (git_buf_oom(&data))
|
|
259
|
-
goto on_error;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
git_pkt_buffer_done(&data);
|
|
263
|
-
if (t->cancel.val) {
|
|
264
|
-
giterr_set(GITERR_NET, "The fetch was cancelled by the user");
|
|
265
|
-
error = GIT_EUSER;
|
|
266
|
-
goto on_error;
|
|
267
|
-
}
|
|
268
|
-
if (t->negotiation_step(t, data.ptr, data.size) < 0)
|
|
269
|
-
goto on_error;
|
|
270
|
-
|
|
271
|
-
git_buf_free(&data);
|
|
272
|
-
git_revwalk_free(walk);
|
|
273
|
-
|
|
274
|
-
/* Now let's eat up whatever the server gives us */
|
|
275
|
-
if (!t->caps.multi_ack) {
|
|
276
|
-
pkt_type = recv_pkt(NULL, buf);
|
|
277
|
-
if (pkt_type != GIT_PKT_ACK && pkt_type != GIT_PKT_NAK) {
|
|
278
|
-
giterr_set(GITERR_NET, "Unexpected pkt type");
|
|
279
|
-
return -1;
|
|
280
|
-
}
|
|
281
|
-
} else {
|
|
282
|
-
git_pkt_ack *pkt;
|
|
283
|
-
do {
|
|
284
|
-
if (recv_pkt((git_pkt **)&pkt, buf) < 0)
|
|
285
|
-
return -1;
|
|
286
|
-
|
|
287
|
-
if (pkt->type == GIT_PKT_NAK ||
|
|
288
|
-
(pkt->type == GIT_PKT_ACK && pkt->status != GIT_ACK_CONTINUE)) {
|
|
289
|
-
git__free(pkt);
|
|
290
|
-
break;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
git__free(pkt);
|
|
294
|
-
} while (1);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
return 0;
|
|
298
|
-
|
|
299
|
-
on_error:
|
|
300
|
-
git_revwalk_free(walk);
|
|
301
|
-
git_buf_free(&data);
|
|
302
|
-
return error;
|
|
109
|
+
return t->negotiate_fetch(t,
|
|
110
|
+
remote->repo,
|
|
111
|
+
(const git_remote_head * const *)remote->refs.contents,
|
|
112
|
+
remote->refs.length);
|
|
303
113
|
}
|
|
304
114
|
|
|
305
|
-
int git_fetch_download_pack(
|
|
115
|
+
int git_fetch_download_pack(
|
|
116
|
+
git_remote *remote,
|
|
117
|
+
git_transfer_progress_callback progress_cb,
|
|
118
|
+
void *progress_payload)
|
|
306
119
|
{
|
|
307
120
|
git_transport *t = remote->transport;
|
|
308
121
|
|
|
309
122
|
if(!remote->need_pack)
|
|
310
123
|
return 0;
|
|
311
124
|
|
|
312
|
-
|
|
313
|
-
return t->download_pack(t, remote->repo, bytes, stats);
|
|
314
|
-
|
|
315
|
-
return git_fetch__download_pack(t, remote->repo, bytes, stats);
|
|
316
|
-
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
static int no_sideband(git_transport *t, git_indexer_stream *idx, gitno_buffer *buf, git_off_t *bytes, git_indexer_stats *stats)
|
|
320
|
-
{
|
|
321
|
-
int recvd;
|
|
322
|
-
|
|
323
|
-
do {
|
|
324
|
-
if (t->cancel.val) {
|
|
325
|
-
giterr_set(GITERR_NET, "The fetch was cancelled by the user");
|
|
326
|
-
return GIT_EUSER;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
if (git_indexer_stream_add(idx, buf->data, buf->offset, stats) < 0)
|
|
330
|
-
return -1;
|
|
331
|
-
|
|
332
|
-
gitno_consume_n(buf, buf->offset);
|
|
333
|
-
|
|
334
|
-
if ((recvd = gitno_recv(buf)) < 0)
|
|
335
|
-
return -1;
|
|
336
|
-
|
|
337
|
-
*bytes += recvd;
|
|
338
|
-
} while(recvd > 0);
|
|
339
|
-
|
|
340
|
-
if (git_indexer_stream_finalize(idx, stats))
|
|
341
|
-
return -1;
|
|
342
|
-
|
|
343
|
-
return 0;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
/* Receiving data from a socket and storing it is pretty much the same for git and HTTP */
|
|
347
|
-
int git_fetch__download_pack(
|
|
348
|
-
git_transport *t,
|
|
349
|
-
git_repository *repo,
|
|
350
|
-
git_off_t *bytes,
|
|
351
|
-
git_indexer_stats *stats)
|
|
352
|
-
{
|
|
353
|
-
git_buf path = GIT_BUF_INIT;
|
|
354
|
-
gitno_buffer *buf = &t->buffer;
|
|
355
|
-
git_indexer_stream *idx = NULL;
|
|
356
|
-
int error = -1;
|
|
357
|
-
|
|
358
|
-
if (git_buf_joinpath(&path, git_repository_path(repo), "objects/pack") < 0)
|
|
359
|
-
return -1;
|
|
360
|
-
|
|
361
|
-
if (git_indexer_stream_new(&idx, git_buf_cstr(&path)) < 0)
|
|
362
|
-
goto on_error;
|
|
363
|
-
|
|
364
|
-
git_buf_free(&path);
|
|
365
|
-
memset(stats, 0, sizeof(git_indexer_stats));
|
|
366
|
-
*bytes = 0;
|
|
367
|
-
|
|
368
|
-
/*
|
|
369
|
-
* If the remote doesn't support the side-band, we can feed
|
|
370
|
-
* the data directly to the indexer. Otherwise, we need to
|
|
371
|
-
* check which one belongs there.
|
|
372
|
-
*/
|
|
373
|
-
if (!t->caps.side_band && !t->caps.side_band_64k) {
|
|
374
|
-
if (no_sideband(t, idx, buf, bytes, stats) < 0)
|
|
375
|
-
goto on_error;
|
|
376
|
-
|
|
377
|
-
git_indexer_stream_free(idx);
|
|
378
|
-
return 0;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
do {
|
|
382
|
-
git_pkt *pkt;
|
|
383
|
-
|
|
384
|
-
if (t->cancel.val) {
|
|
385
|
-
giterr_set(GITERR_NET, "The fetch was cancelled by the user");
|
|
386
|
-
error = GIT_EUSER;
|
|
387
|
-
goto on_error;
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
if (recv_pkt(&pkt, buf) < 0)
|
|
391
|
-
goto on_error;
|
|
392
|
-
|
|
393
|
-
if (pkt->type == GIT_PKT_PROGRESS) {
|
|
394
|
-
if (t->progress_cb) {
|
|
395
|
-
git_pkt_progress *p = (git_pkt_progress *) pkt;
|
|
396
|
-
t->progress_cb(p->data, p->len, t->cb_data);
|
|
397
|
-
}
|
|
398
|
-
git__free(pkt);
|
|
399
|
-
} else if (pkt->type == GIT_PKT_DATA) {
|
|
400
|
-
git_pkt_data *p = (git_pkt_data *) pkt;
|
|
401
|
-
*bytes += p->len;
|
|
402
|
-
if (git_indexer_stream_add(idx, p->data, p->len, stats) < 0)
|
|
403
|
-
goto on_error;
|
|
404
|
-
|
|
405
|
-
git__free(pkt);
|
|
406
|
-
} else if (pkt->type == GIT_PKT_FLUSH) {
|
|
407
|
-
/* A flush indicates the end of the packfile */
|
|
408
|
-
git__free(pkt);
|
|
409
|
-
break;
|
|
410
|
-
}
|
|
411
|
-
} while (1);
|
|
412
|
-
|
|
413
|
-
if (git_indexer_stream_finalize(idx, stats) < 0)
|
|
414
|
-
goto on_error;
|
|
415
|
-
|
|
416
|
-
git_indexer_stream_free(idx);
|
|
417
|
-
return 0;
|
|
418
|
-
|
|
419
|
-
on_error:
|
|
420
|
-
git_buf_free(&path);
|
|
421
|
-
git_indexer_stream_free(idx);
|
|
422
|
-
return error;
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
int git_fetch_setup_walk(git_revwalk **out, git_repository *repo)
|
|
426
|
-
{
|
|
427
|
-
git_revwalk *walk;
|
|
428
|
-
git_strarray refs;
|
|
429
|
-
unsigned int i;
|
|
430
|
-
git_reference *ref;
|
|
431
|
-
|
|
432
|
-
if (git_reference_list(&refs, repo, GIT_REF_LISTALL) < 0)
|
|
433
|
-
return -1;
|
|
434
|
-
|
|
435
|
-
if (git_revwalk_new(&walk, repo) < 0)
|
|
436
|
-
return -1;
|
|
437
|
-
|
|
438
|
-
git_revwalk_sorting(walk, GIT_SORT_TIME);
|
|
439
|
-
|
|
440
|
-
for (i = 0; i < refs.count; ++i) {
|
|
441
|
-
/* No tags */
|
|
442
|
-
if (!git__prefixcmp(refs.strings[i], GIT_REFS_TAGS_DIR))
|
|
443
|
-
continue;
|
|
444
|
-
|
|
445
|
-
if (git_reference_lookup(&ref, repo, refs.strings[i]) < 0)
|
|
446
|
-
goto on_error;
|
|
447
|
-
|
|
448
|
-
if (git_reference_type(ref) == GIT_REF_SYMBOLIC)
|
|
449
|
-
continue;
|
|
450
|
-
if (git_revwalk_push(walk, git_reference_oid(ref)) < 0)
|
|
451
|
-
goto on_error;
|
|
452
|
-
|
|
453
|
-
git_reference_free(ref);
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
git_strarray_free(&refs);
|
|
457
|
-
*out = walk;
|
|
458
|
-
return 0;
|
|
459
|
-
|
|
460
|
-
on_error:
|
|
461
|
-
git_reference_free(ref);
|
|
462
|
-
git_strarray_free(&refs);
|
|
463
|
-
return -1;
|
|
125
|
+
return t->download_pack(t, remote->repo, &remote->stats, progress_cb, progress_payload);
|
|
464
126
|
}
|