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
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) the libgit2 contributors. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* This file is part of libgit2, distributed under the GNU GPL v2 with
|
|
5
|
+
* a Linking Exception. For full terms see the included COPYING file.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#include "git2.h"
|
|
9
|
+
#include "smart.h"
|
|
10
|
+
#include "git2/cred_helpers.h"
|
|
11
|
+
|
|
12
|
+
static void plaintext_free(struct git_cred *cred)
|
|
13
|
+
{
|
|
14
|
+
git_cred_userpass_plaintext *c = (git_cred_userpass_plaintext *)cred;
|
|
15
|
+
size_t pass_len = strlen(c->password);
|
|
16
|
+
|
|
17
|
+
git__free(c->username);
|
|
18
|
+
|
|
19
|
+
/* Zero the memory which previously held the password */
|
|
20
|
+
memset(c->password, 0x0, pass_len);
|
|
21
|
+
git__free(c->password);
|
|
22
|
+
|
|
23
|
+
memset(c, 0, sizeof(*c));
|
|
24
|
+
|
|
25
|
+
git__free(c);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
int git_cred_userpass_plaintext_new(
|
|
29
|
+
git_cred **cred,
|
|
30
|
+
const char *username,
|
|
31
|
+
const char *password)
|
|
32
|
+
{
|
|
33
|
+
git_cred_userpass_plaintext *c;
|
|
34
|
+
|
|
35
|
+
if (!cred)
|
|
36
|
+
return -1;
|
|
37
|
+
|
|
38
|
+
c = git__malloc(sizeof(git_cred_userpass_plaintext));
|
|
39
|
+
GITERR_CHECK_ALLOC(c);
|
|
40
|
+
|
|
41
|
+
c->parent.credtype = GIT_CREDTYPE_USERPASS_PLAINTEXT;
|
|
42
|
+
c->parent.free = plaintext_free;
|
|
43
|
+
c->username = git__strdup(username);
|
|
44
|
+
|
|
45
|
+
if (!c->username) {
|
|
46
|
+
git__free(c);
|
|
47
|
+
return -1;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
c->password = git__strdup(password);
|
|
51
|
+
|
|
52
|
+
if (!c->password) {
|
|
53
|
+
git__free(c->username);
|
|
54
|
+
git__free(c);
|
|
55
|
+
return -1;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
*cred = &c->parent;
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) the libgit2 contributors. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* This file is part of libgit2, distributed under the GNU GPL v2 with
|
|
5
|
+
* a Linking Exception. For full terms see the included COPYING file.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#include "common.h"
|
|
9
|
+
#include "git2/cred_helpers.h"
|
|
10
|
+
|
|
11
|
+
int git_cred_userpass(
|
|
12
|
+
git_cred **cred,
|
|
13
|
+
const char *url,
|
|
14
|
+
const char *user_from_url,
|
|
15
|
+
unsigned int allowed_types,
|
|
16
|
+
void *payload)
|
|
17
|
+
{
|
|
18
|
+
git_cred_userpass_payload *userpass = (git_cred_userpass_payload*)payload;
|
|
19
|
+
const char *effective_username = NULL;
|
|
20
|
+
|
|
21
|
+
GIT_UNUSED(url);
|
|
22
|
+
|
|
23
|
+
if (!userpass || !userpass->password) return -1;
|
|
24
|
+
|
|
25
|
+
/* Username resolution: a username can be passed with the URL, the
|
|
26
|
+
* credentials payload, or both. Here's what we do. Note that if we get
|
|
27
|
+
* this far, we know that any password the url may contain has already
|
|
28
|
+
* failed at least once, so we ignore it.
|
|
29
|
+
*
|
|
30
|
+
* | Payload | URL | Used |
|
|
31
|
+
* +-------------+----------+-----------+
|
|
32
|
+
* | yes | no | payload |
|
|
33
|
+
* | yes | yes | payload |
|
|
34
|
+
* | no | yes | url |
|
|
35
|
+
* | no | no | FAIL |
|
|
36
|
+
*/
|
|
37
|
+
if (userpass->username)
|
|
38
|
+
effective_username = userpass->username;
|
|
39
|
+
else if (user_from_url)
|
|
40
|
+
effective_username = user_from_url;
|
|
41
|
+
else
|
|
42
|
+
return -1;
|
|
43
|
+
|
|
44
|
+
if ((GIT_CREDTYPE_USERPASS_PLAINTEXT & allowed_types) == 0 ||
|
|
45
|
+
git_cred_userpass_plaintext_new(cred, effective_username, userpass->password) < 0)
|
|
46
|
+
return -1;
|
|
47
|
+
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
@@ -1,44 +1,42 @@
|
|
|
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.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
#include "git2
|
|
9
|
-
#include "
|
|
10
|
-
#include "git2/types.h"
|
|
11
|
-
#include "git2/errors.h"
|
|
12
|
-
#include "git2/net.h"
|
|
13
|
-
#include "git2/revwalk.h"
|
|
14
|
-
|
|
15
|
-
#include "vector.h"
|
|
16
|
-
#include "transport.h"
|
|
17
|
-
#include "pkt.h"
|
|
18
|
-
#include "common.h"
|
|
8
|
+
#include "git2.h"
|
|
9
|
+
#include "buffer.h"
|
|
19
10
|
#include "netops.h"
|
|
20
|
-
|
|
21
|
-
#
|
|
22
|
-
|
|
23
|
-
|
|
11
|
+
|
|
12
|
+
#define OWNING_SUBTRANSPORT(s) ((git_subtransport *)(s)->parent.subtransport)
|
|
13
|
+
|
|
14
|
+
static const char prefix_git[] = "git://";
|
|
15
|
+
static const char cmd_uploadpack[] = "git-upload-pack";
|
|
16
|
+
static const char cmd_receivepack[] = "git-receive-pack";
|
|
17
|
+
|
|
18
|
+
typedef struct {
|
|
19
|
+
git_smart_subtransport_stream parent;
|
|
20
|
+
gitno_socket socket;
|
|
21
|
+
const char *cmd;
|
|
22
|
+
char *url;
|
|
23
|
+
unsigned sent_command : 1;
|
|
24
|
+
} git_stream;
|
|
24
25
|
|
|
25
26
|
typedef struct {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
#endif
|
|
31
|
-
} transport_git;
|
|
27
|
+
git_smart_subtransport parent;
|
|
28
|
+
git_transport *owner;
|
|
29
|
+
git_stream *current_stream;
|
|
30
|
+
} git_subtransport;
|
|
32
31
|
|
|
33
32
|
/*
|
|
34
|
-
* Create a git
|
|
33
|
+
* Create a git protocol request.
|
|
35
34
|
*
|
|
36
35
|
* For example: 0035git-upload-pack /libgit2/libgit2\0host=github.com\0
|
|
37
36
|
*/
|
|
38
37
|
static int gen_proto(git_buf *request, const char *cmd, const char *url)
|
|
39
38
|
{
|
|
40
39
|
char *delim, *repo;
|
|
41
|
-
char default_command[] = "git-upload-pack";
|
|
42
40
|
char host[] = "host=";
|
|
43
41
|
size_t len;
|
|
44
42
|
|
|
@@ -54,9 +52,6 @@ static int gen_proto(git_buf *request, const char *cmd, const char *url)
|
|
|
54
52
|
if (delim == NULL)
|
|
55
53
|
delim = strchr(url, '/');
|
|
56
54
|
|
|
57
|
-
if (cmd == NULL)
|
|
58
|
-
cmd = default_command;
|
|
59
|
-
|
|
60
55
|
len = 4 + strlen(cmd) + 1 + strlen(repo) + 1 + strlen(host) + (delim - url) + 1;
|
|
61
56
|
|
|
62
57
|
git_buf_grow(request, len);
|
|
@@ -71,175 +66,287 @@ static int gen_proto(git_buf *request, const char *cmd, const char *url)
|
|
|
71
66
|
return 0;
|
|
72
67
|
}
|
|
73
68
|
|
|
74
|
-
static int
|
|
69
|
+
static int send_command(git_stream *s)
|
|
75
70
|
{
|
|
76
71
|
int error;
|
|
77
72
|
git_buf request = GIT_BUF_INIT;
|
|
78
73
|
|
|
79
|
-
error = gen_proto(&request, cmd, url);
|
|
74
|
+
error = gen_proto(&request, s->cmd, s->url);
|
|
80
75
|
if (error < 0)
|
|
81
76
|
goto cleanup;
|
|
82
77
|
|
|
83
|
-
|
|
78
|
+
/* It looks like negative values are errors here, and positive values
|
|
79
|
+
* are the number of bytes sent. */
|
|
80
|
+
error = gitno_send(&s->socket, request.ptr, request.size, 0);
|
|
81
|
+
|
|
82
|
+
if (error >= 0)
|
|
83
|
+
s->sent_command = 1;
|
|
84
84
|
|
|
85
85
|
cleanup:
|
|
86
86
|
git_buf_free(&request);
|
|
87
87
|
return error;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
static int do_connect(transport_git *t, const char *url)
|
|
90
|
+
static int git_stream_read(
|
|
91
|
+
git_smart_subtransport_stream *stream,
|
|
92
|
+
char *buffer,
|
|
93
|
+
size_t buf_size,
|
|
94
|
+
size_t *bytes_read)
|
|
96
95
|
{
|
|
97
|
-
|
|
98
|
-
|
|
96
|
+
git_stream *s = (git_stream *)stream;
|
|
97
|
+
gitno_buffer buf;
|
|
99
98
|
|
|
100
|
-
|
|
101
|
-
url += strlen(prefix);
|
|
99
|
+
*bytes_read = 0;
|
|
102
100
|
|
|
103
|
-
if (
|
|
101
|
+
if (!s->sent_command && send_command(s) < 0)
|
|
104
102
|
return -1;
|
|
105
103
|
|
|
106
|
-
|
|
107
|
-
goto on_error;
|
|
104
|
+
gitno_buffer_setup(&s->socket, &buf, buffer, buf_size);
|
|
108
105
|
|
|
109
|
-
if (
|
|
110
|
-
|
|
106
|
+
if (gitno_recv(&buf) < 0)
|
|
107
|
+
return -1;
|
|
111
108
|
|
|
112
|
-
|
|
113
|
-
git__free(port);
|
|
109
|
+
*bytes_read = buf.offset;
|
|
114
110
|
|
|
115
111
|
return 0;
|
|
116
|
-
|
|
117
|
-
on_error:
|
|
118
|
-
git__free(host);
|
|
119
|
-
git__free(port);
|
|
120
|
-
gitno_close(t->parent.socket);
|
|
121
|
-
return -1;
|
|
122
112
|
}
|
|
123
113
|
|
|
124
|
-
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
|
|
128
|
-
static int git_connect(git_transport *transport, int direction)
|
|
114
|
+
static int git_stream_write(
|
|
115
|
+
git_smart_subtransport_stream *stream,
|
|
116
|
+
const char *buffer,
|
|
117
|
+
size_t len)
|
|
129
118
|
{
|
|
130
|
-
|
|
119
|
+
git_stream *s = (git_stream *)stream;
|
|
131
120
|
|
|
132
|
-
if (
|
|
133
|
-
giterr_set(GITERR_NET, "Pushing over git:// is not supported");
|
|
121
|
+
if (!s->sent_command && send_command(s) < 0)
|
|
134
122
|
return -1;
|
|
123
|
+
|
|
124
|
+
return gitno_send(&s->socket, buffer, len, 0);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
static void git_stream_free(git_smart_subtransport_stream *stream)
|
|
128
|
+
{
|
|
129
|
+
git_stream *s = (git_stream *)stream;
|
|
130
|
+
git_subtransport *t = OWNING_SUBTRANSPORT(s);
|
|
131
|
+
int ret;
|
|
132
|
+
|
|
133
|
+
GIT_UNUSED(ret);
|
|
134
|
+
|
|
135
|
+
t->current_stream = NULL;
|
|
136
|
+
|
|
137
|
+
if (s->socket.socket) {
|
|
138
|
+
ret = gitno_close(&s->socket);
|
|
139
|
+
assert(!ret);
|
|
135
140
|
}
|
|
136
141
|
|
|
137
|
-
|
|
142
|
+
git__free(s->url);
|
|
143
|
+
git__free(s);
|
|
144
|
+
}
|
|
138
145
|
|
|
139
|
-
|
|
140
|
-
|
|
146
|
+
static int git_stream_alloc(
|
|
147
|
+
git_subtransport *t,
|
|
148
|
+
const char *url,
|
|
149
|
+
const char *cmd,
|
|
150
|
+
git_smart_subtransport_stream **stream)
|
|
151
|
+
{
|
|
152
|
+
git_stream *s;
|
|
153
|
+
|
|
154
|
+
if (!stream)
|
|
141
155
|
return -1;
|
|
142
156
|
|
|
143
|
-
|
|
157
|
+
s = git__calloc(sizeof(git_stream), 1);
|
|
158
|
+
GITERR_CHECK_ALLOC(s);
|
|
159
|
+
|
|
160
|
+
s->parent.subtransport = &t->parent;
|
|
161
|
+
s->parent.read = git_stream_read;
|
|
162
|
+
s->parent.write = git_stream_write;
|
|
163
|
+
s->parent.free = git_stream_free;
|
|
164
|
+
|
|
165
|
+
s->cmd = cmd;
|
|
166
|
+
s->url = git__strdup(url);
|
|
144
167
|
|
|
145
|
-
|
|
146
|
-
|
|
168
|
+
if (!s->url) {
|
|
169
|
+
git__free(s);
|
|
147
170
|
return -1;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
*stream = &s->parent;
|
|
174
|
+
return 0;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
static int _git_uploadpack_ls(
|
|
178
|
+
git_subtransport *t,
|
|
179
|
+
const char *url,
|
|
180
|
+
git_smart_subtransport_stream **stream)
|
|
181
|
+
{
|
|
182
|
+
char *host, *port, *user=NULL, *pass=NULL;
|
|
183
|
+
git_stream *s;
|
|
148
184
|
|
|
149
|
-
|
|
185
|
+
*stream = NULL;
|
|
186
|
+
|
|
187
|
+
if (!git__prefixcmp(url, prefix_git))
|
|
188
|
+
url += strlen(prefix_git);
|
|
189
|
+
|
|
190
|
+
if (git_stream_alloc(t, url, cmd_uploadpack, stream) < 0)
|
|
150
191
|
return -1;
|
|
151
192
|
|
|
193
|
+
s = (git_stream *)*stream;
|
|
194
|
+
|
|
195
|
+
if (gitno_extract_url_parts(&host, &port, &user, &pass, url, GIT_DEFAULT_PORT) < 0)
|
|
196
|
+
goto on_error;
|
|
197
|
+
|
|
198
|
+
if (gitno_connect(&s->socket, host, port, 0) < 0)
|
|
199
|
+
goto on_error;
|
|
200
|
+
|
|
201
|
+
t->current_stream = s;
|
|
202
|
+
git__free(host);
|
|
203
|
+
git__free(port);
|
|
204
|
+
git__free(user);
|
|
205
|
+
git__free(pass);
|
|
152
206
|
return 0;
|
|
207
|
+
|
|
208
|
+
on_error:
|
|
209
|
+
if (*stream)
|
|
210
|
+
git_stream_free(*stream);
|
|
211
|
+
|
|
212
|
+
git__free(host);
|
|
213
|
+
git__free(port);
|
|
214
|
+
return -1;
|
|
153
215
|
}
|
|
154
216
|
|
|
155
|
-
static int
|
|
217
|
+
static int _git_uploadpack(
|
|
218
|
+
git_subtransport *t,
|
|
219
|
+
const char *url,
|
|
220
|
+
git_smart_subtransport_stream **stream)
|
|
156
221
|
{
|
|
157
|
-
|
|
222
|
+
GIT_UNUSED(url);
|
|
223
|
+
|
|
224
|
+
if (t->current_stream) {
|
|
225
|
+
*stream = &t->current_stream->parent;
|
|
226
|
+
return 0;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
giterr_set(GITERR_NET, "Must call UPLOADPACK_LS before UPLOADPACK");
|
|
230
|
+
return -1;
|
|
158
231
|
}
|
|
159
232
|
|
|
160
|
-
static int
|
|
233
|
+
static int _git_receivepack_ls(
|
|
234
|
+
git_subtransport *t,
|
|
235
|
+
const char *url,
|
|
236
|
+
git_smart_subtransport_stream **stream)
|
|
161
237
|
{
|
|
162
|
-
|
|
238
|
+
char *host, *port, *user=NULL, *pass=NULL;
|
|
239
|
+
git_stream *s;
|
|
163
240
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
git_buf_free(&buf);
|
|
241
|
+
*stream = NULL;
|
|
242
|
+
|
|
243
|
+
if (!git__prefixcmp(url, prefix_git))
|
|
244
|
+
url += strlen(prefix_git);
|
|
169
245
|
|
|
170
|
-
if (
|
|
171
|
-
giterr_set(GITERR_NET, "Failed to close socket");
|
|
246
|
+
if (git_stream_alloc(t, url, cmd_receivepack, stream) < 0)
|
|
172
247
|
return -1;
|
|
173
|
-
}
|
|
174
248
|
|
|
175
|
-
|
|
249
|
+
s = (git_stream *)*stream;
|
|
176
250
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
251
|
+
if (gitno_extract_url_parts(&host, &port, &user, &pass, url, GIT_DEFAULT_PORT) < 0)
|
|
252
|
+
goto on_error;
|
|
253
|
+
|
|
254
|
+
if (gitno_connect(&s->socket, host, port, 0) < 0)
|
|
255
|
+
goto on_error;
|
|
180
256
|
|
|
257
|
+
t->current_stream = s;
|
|
258
|
+
git__free(host);
|
|
259
|
+
git__free(port);
|
|
260
|
+
git__free(user);
|
|
261
|
+
git__free(pass);
|
|
181
262
|
return 0;
|
|
263
|
+
|
|
264
|
+
on_error:
|
|
265
|
+
if (*stream)
|
|
266
|
+
git_stream_free(*stream);
|
|
267
|
+
|
|
268
|
+
git__free(host);
|
|
269
|
+
git__free(port);
|
|
270
|
+
return -1;
|
|
182
271
|
}
|
|
183
272
|
|
|
184
|
-
static
|
|
273
|
+
static int _git_receivepack(
|
|
274
|
+
git_subtransport *t,
|
|
275
|
+
const char *url,
|
|
276
|
+
git_smart_subtransport_stream **stream)
|
|
185
277
|
{
|
|
186
|
-
|
|
187
|
-
git_vector *refs = &transport->refs;
|
|
188
|
-
unsigned int i;
|
|
278
|
+
GIT_UNUSED(url);
|
|
189
279
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
280
|
+
if (t->current_stream) {
|
|
281
|
+
*stream = &t->current_stream->parent;
|
|
282
|
+
return 0;
|
|
193
283
|
}
|
|
194
|
-
git_vector_free(refs);
|
|
195
284
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
285
|
+
giterr_set(GITERR_NET, "Must call RECEIVEPACK_LS before RECEIVEPACK");
|
|
286
|
+
return -1;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
static int _git_action(
|
|
290
|
+
git_smart_subtransport_stream **stream,
|
|
291
|
+
git_smart_subtransport *subtransport,
|
|
292
|
+
const char *url,
|
|
293
|
+
git_smart_service_t action)
|
|
294
|
+
{
|
|
295
|
+
git_subtransport *t = (git_subtransport *) subtransport;
|
|
296
|
+
|
|
297
|
+
switch (action) {
|
|
298
|
+
case GIT_SERVICE_UPLOADPACK_LS:
|
|
299
|
+
return _git_uploadpack_ls(t, url, stream);
|
|
300
|
+
|
|
301
|
+
case GIT_SERVICE_UPLOADPACK:
|
|
302
|
+
return _git_uploadpack(t, url, stream);
|
|
303
|
+
|
|
304
|
+
case GIT_SERVICE_RECEIVEPACK_LS:
|
|
305
|
+
return _git_receivepack_ls(t, url, stream);
|
|
306
|
+
|
|
307
|
+
case GIT_SERVICE_RECEIVEPACK:
|
|
308
|
+
return _git_receivepack(t, url, stream);
|
|
200
309
|
}
|
|
201
|
-
git_vector_free(refs);
|
|
202
310
|
|
|
203
|
-
|
|
204
|
-
|
|
311
|
+
*stream = NULL;
|
|
312
|
+
return -1;
|
|
205
313
|
}
|
|
206
314
|
|
|
207
|
-
int
|
|
315
|
+
static int _git_close(git_smart_subtransport *subtransport)
|
|
208
316
|
{
|
|
209
|
-
|
|
210
|
-
#ifdef GIT_WIN32
|
|
211
|
-
int ret;
|
|
212
|
-
#endif
|
|
317
|
+
git_subtransport *t = (git_subtransport *) subtransport;
|
|
213
318
|
|
|
214
|
-
t
|
|
215
|
-
GITERR_CHECK_ALLOC(t);
|
|
319
|
+
assert(!t->current_stream);
|
|
216
320
|
|
|
217
|
-
|
|
218
|
-
if (git_vector_init(&t->parent.common, 8, NULL))
|
|
219
|
-
goto on_error;
|
|
321
|
+
GIT_UNUSED(t);
|
|
220
322
|
|
|
221
|
-
|
|
222
|
-
|
|
323
|
+
return 0;
|
|
324
|
+
}
|
|
223
325
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
t
|
|
227
|
-
t->parent.free = git_free;
|
|
326
|
+
static void _git_free(git_smart_subtransport *subtransport)
|
|
327
|
+
{
|
|
328
|
+
git_subtransport *t = (git_subtransport *) subtransport;
|
|
228
329
|
|
|
229
|
-
|
|
330
|
+
assert(!t->current_stream);
|
|
230
331
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
332
|
+
git__free(t);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
int git_smart_subtransport_git(git_smart_subtransport **out, git_transport *owner)
|
|
336
|
+
{
|
|
337
|
+
git_subtransport *t;
|
|
338
|
+
|
|
339
|
+
if (!out)
|
|
236
340
|
return -1;
|
|
237
|
-
}
|
|
238
|
-
#endif
|
|
239
341
|
|
|
240
|
-
|
|
342
|
+
t = git__calloc(sizeof(git_subtransport), 1);
|
|
343
|
+
GITERR_CHECK_ALLOC(t);
|
|
241
344
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
345
|
+
t->owner = owner;
|
|
346
|
+
t->parent.action = _git_action;
|
|
347
|
+
t->parent.close = _git_close;
|
|
348
|
+
t->parent.free = _git_free;
|
|
349
|
+
|
|
350
|
+
*out = (git_smart_subtransport *) t;
|
|
351
|
+
return 0;
|
|
245
352
|
}
|