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/fetch.h
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.
|
|
@@ -10,9 +10,19 @@
|
|
|
10
10
|
#include "netops.h"
|
|
11
11
|
|
|
12
12
|
int git_fetch_negotiate(git_remote *remote);
|
|
13
|
-
int git_fetch_download_pack(git_remote *remote, git_off_t *bytes, git_indexer_stats *stats);
|
|
14
13
|
|
|
15
|
-
int
|
|
14
|
+
int git_fetch_download_pack(
|
|
15
|
+
git_remote *remote,
|
|
16
|
+
git_transfer_progress_callback progress_cb,
|
|
17
|
+
void *progress_payload);
|
|
18
|
+
|
|
19
|
+
int git_fetch__download_pack(
|
|
20
|
+
git_transport *t,
|
|
21
|
+
git_repository *repo,
|
|
22
|
+
git_transfer_progress *stats,
|
|
23
|
+
git_transfer_progress_callback progress_cb,
|
|
24
|
+
void *progress_payload);
|
|
25
|
+
|
|
16
26
|
int git_fetch_setup_walk(git_revwalk **out, git_repository *repo);
|
|
17
27
|
|
|
18
28
|
#endif
|
|
@@ -0,0 +1,295 @@
|
|
|
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/types.h"
|
|
9
|
+
#include "git2/oid.h"
|
|
10
|
+
|
|
11
|
+
#include "fetchhead.h"
|
|
12
|
+
#include "common.h"
|
|
13
|
+
#include "buffer.h"
|
|
14
|
+
#include "fileops.h"
|
|
15
|
+
#include "filebuf.h"
|
|
16
|
+
#include "refs.h"
|
|
17
|
+
#include "repository.h"
|
|
18
|
+
|
|
19
|
+
int git_fetchhead_ref_cmp(const void *a, const void *b)
|
|
20
|
+
{
|
|
21
|
+
const git_fetchhead_ref *one = (const git_fetchhead_ref *)a;
|
|
22
|
+
const git_fetchhead_ref *two = (const git_fetchhead_ref *)b;
|
|
23
|
+
|
|
24
|
+
if (one->is_merge && !two->is_merge)
|
|
25
|
+
return -1;
|
|
26
|
+
if (two->is_merge && !one->is_merge)
|
|
27
|
+
return 1;
|
|
28
|
+
|
|
29
|
+
if (one->ref_name && two->ref_name)
|
|
30
|
+
return strcmp(one->ref_name, two->ref_name);
|
|
31
|
+
else if (one->ref_name)
|
|
32
|
+
return -1;
|
|
33
|
+
else if (two->ref_name)
|
|
34
|
+
return 1;
|
|
35
|
+
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
int git_fetchhead_ref_create(
|
|
40
|
+
git_fetchhead_ref **out,
|
|
41
|
+
git_oid *oid,
|
|
42
|
+
unsigned int is_merge,
|
|
43
|
+
const char *ref_name,
|
|
44
|
+
const char *remote_url)
|
|
45
|
+
{
|
|
46
|
+
git_fetchhead_ref *fetchhead_ref;
|
|
47
|
+
|
|
48
|
+
assert(out && oid);
|
|
49
|
+
|
|
50
|
+
*out = NULL;
|
|
51
|
+
|
|
52
|
+
fetchhead_ref = git__malloc(sizeof(git_fetchhead_ref));
|
|
53
|
+
GITERR_CHECK_ALLOC(fetchhead_ref);
|
|
54
|
+
|
|
55
|
+
memset(fetchhead_ref, 0x0, sizeof(git_fetchhead_ref));
|
|
56
|
+
|
|
57
|
+
git_oid_cpy(&fetchhead_ref->oid, oid);
|
|
58
|
+
fetchhead_ref->is_merge = is_merge;
|
|
59
|
+
|
|
60
|
+
if (ref_name)
|
|
61
|
+
fetchhead_ref->ref_name = git__strdup(ref_name);
|
|
62
|
+
|
|
63
|
+
if (remote_url)
|
|
64
|
+
fetchhead_ref->remote_url = git__strdup(remote_url);
|
|
65
|
+
|
|
66
|
+
*out = fetchhead_ref;
|
|
67
|
+
|
|
68
|
+
return 0;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
static int fetchhead_ref_write(
|
|
72
|
+
git_filebuf *file,
|
|
73
|
+
git_fetchhead_ref *fetchhead_ref)
|
|
74
|
+
{
|
|
75
|
+
char oid[GIT_OID_HEXSZ + 1];
|
|
76
|
+
const char *type, *name;
|
|
77
|
+
|
|
78
|
+
assert(file && fetchhead_ref);
|
|
79
|
+
|
|
80
|
+
git_oid_fmt(oid, &fetchhead_ref->oid);
|
|
81
|
+
oid[GIT_OID_HEXSZ] = '\0';
|
|
82
|
+
|
|
83
|
+
if (git__prefixcmp(fetchhead_ref->ref_name, GIT_REFS_HEADS_DIR) == 0) {
|
|
84
|
+
type = "branch ";
|
|
85
|
+
name = fetchhead_ref->ref_name + strlen(GIT_REFS_HEADS_DIR);
|
|
86
|
+
} else if(git__prefixcmp(fetchhead_ref->ref_name,
|
|
87
|
+
GIT_REFS_TAGS_DIR) == 0) {
|
|
88
|
+
type = "tag ";
|
|
89
|
+
name = fetchhead_ref->ref_name + strlen(GIT_REFS_TAGS_DIR);
|
|
90
|
+
} else {
|
|
91
|
+
type = "";
|
|
92
|
+
name = fetchhead_ref->ref_name;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return git_filebuf_printf(file, "%s\t%s\t%s'%s' of %s\n",
|
|
96
|
+
oid,
|
|
97
|
+
(fetchhead_ref->is_merge) ? "" : "not-for-merge",
|
|
98
|
+
type,
|
|
99
|
+
name,
|
|
100
|
+
fetchhead_ref->remote_url);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
int git_fetchhead_write(git_repository *repo, git_vector *fetchhead_refs)
|
|
104
|
+
{
|
|
105
|
+
git_filebuf file = GIT_FILEBUF_INIT;
|
|
106
|
+
git_buf path = GIT_BUF_INIT;
|
|
107
|
+
unsigned int i;
|
|
108
|
+
git_fetchhead_ref *fetchhead_ref;
|
|
109
|
+
|
|
110
|
+
assert(repo && fetchhead_refs);
|
|
111
|
+
|
|
112
|
+
if (git_buf_joinpath(&path, repo->path_repository, GIT_FETCH_HEAD_FILE) < 0)
|
|
113
|
+
return -1;
|
|
114
|
+
|
|
115
|
+
if (git_filebuf_open(&file, path.ptr, GIT_FILEBUF_FORCE) < 0) {
|
|
116
|
+
git_buf_free(&path);
|
|
117
|
+
return -1;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
git_buf_free(&path);
|
|
121
|
+
|
|
122
|
+
git_vector_sort(fetchhead_refs);
|
|
123
|
+
|
|
124
|
+
git_vector_foreach(fetchhead_refs, i, fetchhead_ref)
|
|
125
|
+
fetchhead_ref_write(&file, fetchhead_ref);
|
|
126
|
+
|
|
127
|
+
return git_filebuf_commit(&file, GIT_REFS_FILE_MODE);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
static int fetchhead_ref_parse(
|
|
131
|
+
git_oid *oid,
|
|
132
|
+
unsigned int *is_merge,
|
|
133
|
+
git_buf *ref_name,
|
|
134
|
+
const char **remote_url,
|
|
135
|
+
char *line,
|
|
136
|
+
size_t line_num)
|
|
137
|
+
{
|
|
138
|
+
char *oid_str, *is_merge_str, *desc, *name = NULL;
|
|
139
|
+
const char *type = NULL;
|
|
140
|
+
int error = 0;
|
|
141
|
+
|
|
142
|
+
*remote_url = NULL;
|
|
143
|
+
|
|
144
|
+
if (!*line) {
|
|
145
|
+
giterr_set(GITERR_FETCHHEAD,
|
|
146
|
+
"Empty line in FETCH_HEAD line %d", line_num);
|
|
147
|
+
return -1;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/* Compat with old git clients that wrote FETCH_HEAD like a loose ref. */
|
|
151
|
+
if ((oid_str = git__strsep(&line, "\t")) == NULL) {
|
|
152
|
+
oid_str = line;
|
|
153
|
+
line += strlen(line);
|
|
154
|
+
|
|
155
|
+
*is_merge = 1;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if (strlen(oid_str) != GIT_OID_HEXSZ) {
|
|
159
|
+
giterr_set(GITERR_FETCHHEAD,
|
|
160
|
+
"Invalid object ID in FETCH_HEAD line %d", line_num);
|
|
161
|
+
return -1;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (git_oid_fromstr(oid, oid_str) < 0) {
|
|
165
|
+
const git_error *oid_err = giterr_last();
|
|
166
|
+
const char *err_msg = oid_err ? oid_err->message : "Invalid object ID";
|
|
167
|
+
|
|
168
|
+
giterr_set(GITERR_FETCHHEAD, "%s in FETCH_HEAD line %d",
|
|
169
|
+
err_msg, line_num);
|
|
170
|
+
return -1;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/* Parse new data from newer git clients */
|
|
174
|
+
if (*line) {
|
|
175
|
+
if ((is_merge_str = git__strsep(&line, "\t")) == NULL) {
|
|
176
|
+
giterr_set(GITERR_FETCHHEAD,
|
|
177
|
+
"Invalid description data in FETCH_HEAD line %d", line_num);
|
|
178
|
+
return -1;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (*is_merge_str == '\0')
|
|
182
|
+
*is_merge = 1;
|
|
183
|
+
else if (strcmp(is_merge_str, "not-for-merge") == 0)
|
|
184
|
+
*is_merge = 0;
|
|
185
|
+
else {
|
|
186
|
+
giterr_set(GITERR_FETCHHEAD,
|
|
187
|
+
"Invalid for-merge entry in FETCH_HEAD line %d", line_num);
|
|
188
|
+
return -1;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if ((desc = line) == NULL) {
|
|
192
|
+
giterr_set(GITERR_FETCHHEAD,
|
|
193
|
+
"Invalid description in FETCH_HEAD line %d", line_num);
|
|
194
|
+
return -1;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (git__prefixcmp(desc, "branch '") == 0) {
|
|
198
|
+
type = GIT_REFS_HEADS_DIR;
|
|
199
|
+
name = desc + 8;
|
|
200
|
+
} else if (git__prefixcmp(desc, "tag '") == 0) {
|
|
201
|
+
type = GIT_REFS_TAGS_DIR;
|
|
202
|
+
name = desc + 5;
|
|
203
|
+
} else if (git__prefixcmp(desc, "'") == 0)
|
|
204
|
+
name = desc + 1;
|
|
205
|
+
|
|
206
|
+
if (name) {
|
|
207
|
+
if ((desc = strchr(name, '\'')) == NULL ||
|
|
208
|
+
git__prefixcmp(desc, "' of ") != 0) {
|
|
209
|
+
giterr_set(GITERR_FETCHHEAD,
|
|
210
|
+
"Invalid description in FETCH_HEAD line %d", line_num);
|
|
211
|
+
return -1;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
*desc = '\0';
|
|
215
|
+
desc += 5;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
*remote_url = desc;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
git_buf_clear(ref_name);
|
|
222
|
+
|
|
223
|
+
if (type)
|
|
224
|
+
git_buf_join(ref_name, '/', type, name);
|
|
225
|
+
else if(name)
|
|
226
|
+
git_buf_puts(ref_name, name);
|
|
227
|
+
|
|
228
|
+
return error;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
int git_repository_fetchhead_foreach(git_repository *repo,
|
|
232
|
+
git_repository_fetchhead_foreach_cb cb,
|
|
233
|
+
void *payload)
|
|
234
|
+
{
|
|
235
|
+
git_buf path = GIT_BUF_INIT, file = GIT_BUF_INIT, name = GIT_BUF_INIT;
|
|
236
|
+
const char *ref_name;
|
|
237
|
+
git_oid oid;
|
|
238
|
+
const char *remote_url;
|
|
239
|
+
unsigned int is_merge = 0;
|
|
240
|
+
char *buffer, *line;
|
|
241
|
+
size_t line_num = 0;
|
|
242
|
+
int error = 0;
|
|
243
|
+
|
|
244
|
+
assert(repo && cb);
|
|
245
|
+
|
|
246
|
+
if (git_buf_joinpath(&path, repo->path_repository, GIT_FETCH_HEAD_FILE) < 0)
|
|
247
|
+
return -1;
|
|
248
|
+
|
|
249
|
+
if ((error = git_futils_readbuffer(&file, git_buf_cstr(&path))) < 0)
|
|
250
|
+
goto done;
|
|
251
|
+
|
|
252
|
+
buffer = file.ptr;
|
|
253
|
+
|
|
254
|
+
while ((line = git__strsep(&buffer, "\n")) != NULL) {
|
|
255
|
+
++line_num;
|
|
256
|
+
|
|
257
|
+
if ((error = fetchhead_ref_parse(&oid, &is_merge, &name, &remote_url,
|
|
258
|
+
line, line_num)) < 0)
|
|
259
|
+
goto done;
|
|
260
|
+
|
|
261
|
+
if (git_buf_len(&name) > 0)
|
|
262
|
+
ref_name = git_buf_cstr(&name);
|
|
263
|
+
else
|
|
264
|
+
ref_name = NULL;
|
|
265
|
+
|
|
266
|
+
if ((cb(ref_name, remote_url, &oid, is_merge, payload)) != 0) {
|
|
267
|
+
error = GIT_EUSER;
|
|
268
|
+
goto done;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (*buffer) {
|
|
273
|
+
giterr_set(GITERR_FETCHHEAD, "No EOL at line %d", line_num+1);
|
|
274
|
+
error = -1;
|
|
275
|
+
goto done;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
done:
|
|
279
|
+
git_buf_free(&file);
|
|
280
|
+
git_buf_free(&path);
|
|
281
|
+
git_buf_free(&name);
|
|
282
|
+
|
|
283
|
+
return error;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
void git_fetchhead_ref_free(git_fetchhead_ref *fetchhead_ref)
|
|
287
|
+
{
|
|
288
|
+
if (fetchhead_ref == NULL)
|
|
289
|
+
return;
|
|
290
|
+
|
|
291
|
+
git__free(fetchhead_ref->remote_url);
|
|
292
|
+
git__free(fetchhead_ref->ref_name);
|
|
293
|
+
git__free(fetchhead_ref);
|
|
294
|
+
}
|
|
295
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
#ifndef INCLUDE_fetchhead_h__
|
|
8
|
+
#define INCLUDE_fetchhead_h__
|
|
9
|
+
|
|
10
|
+
#include "vector.h"
|
|
11
|
+
|
|
12
|
+
struct git_fetchhead_ref {
|
|
13
|
+
git_oid oid;
|
|
14
|
+
unsigned int is_merge;
|
|
15
|
+
char *ref_name;
|
|
16
|
+
char *remote_url;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
typedef struct git_fetchhead_ref git_fetchhead_ref;
|
|
20
|
+
|
|
21
|
+
int git_fetchhead_ref_create(
|
|
22
|
+
git_fetchhead_ref **fetchhead_ref_out,
|
|
23
|
+
git_oid *oid,
|
|
24
|
+
unsigned int is_merge,
|
|
25
|
+
const char *ref_name,
|
|
26
|
+
const char *remote_url);
|
|
27
|
+
|
|
28
|
+
int git_fetchhead_ref_cmp(const void *a, const void *b);
|
|
29
|
+
|
|
30
|
+
int git_fetchhead_write(git_repository *repo, git_vector *fetchhead_refs);
|
|
31
|
+
|
|
32
|
+
void git_fetchhead_ref_free(git_fetchhead_ref *fetchhead_ref);
|
|
33
|
+
|
|
34
|
+
#endif
|
|
@@ -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.
|
|
@@ -85,8 +85,8 @@ static int lock_file(git_filebuf *file, int flags)
|
|
|
85
85
|
|
|
86
86
|
while ((read_bytes = p_read(source, buffer, sizeof(buffer))) > 0) {
|
|
87
87
|
p_write(file->fd, buffer, read_bytes);
|
|
88
|
-
if (file->
|
|
89
|
-
git_hash_update(file->digest, buffer, read_bytes);
|
|
88
|
+
if (file->compute_digest)
|
|
89
|
+
git_hash_update(&file->digest, buffer, read_bytes);
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
p_close(source);
|
|
@@ -108,8 +108,10 @@ void git_filebuf_cleanup(git_filebuf *file)
|
|
|
108
108
|
if (file->fd_is_open && file->path_lock && git_path_exists(file->path_lock))
|
|
109
109
|
p_unlink(file->path_lock);
|
|
110
110
|
|
|
111
|
-
if (file->
|
|
112
|
-
|
|
111
|
+
if (file->compute_digest) {
|
|
112
|
+
git_hash_ctx_cleanup(&file->digest);
|
|
113
|
+
file->compute_digest = 0;
|
|
114
|
+
}
|
|
113
115
|
|
|
114
116
|
if (file->buffer)
|
|
115
117
|
git__free(file->buffer);
|
|
@@ -149,8 +151,8 @@ static int write_normal(git_filebuf *file, void *source, size_t len)
|
|
|
149
151
|
return -1;
|
|
150
152
|
}
|
|
151
153
|
|
|
152
|
-
if (file->
|
|
153
|
-
git_hash_update(file->digest, source, len);
|
|
154
|
+
if (file->compute_digest)
|
|
155
|
+
git_hash_update(&file->digest, source, len);
|
|
154
156
|
}
|
|
155
157
|
|
|
156
158
|
return 0;
|
|
@@ -186,8 +188,8 @@ static int write_deflate(git_filebuf *file, void *source, size_t len)
|
|
|
186
188
|
|
|
187
189
|
assert(zs->avail_in == 0);
|
|
188
190
|
|
|
189
|
-
if (file->
|
|
190
|
-
git_hash_update(file->digest, source, len);
|
|
191
|
+
if (file->compute_digest)
|
|
192
|
+
git_hash_update(&file->digest, source, len);
|
|
191
193
|
}
|
|
192
194
|
|
|
193
195
|
return 0;
|
|
@@ -221,8 +223,10 @@ int git_filebuf_open(git_filebuf *file, const char *path, int flags)
|
|
|
221
223
|
|
|
222
224
|
/* If we are hashing on-write, allocate a new hash context */
|
|
223
225
|
if (flags & GIT_FILEBUF_HASH_CONTENTS) {
|
|
224
|
-
file->
|
|
225
|
-
|
|
226
|
+
file->compute_digest = 1;
|
|
227
|
+
|
|
228
|
+
if (git_hash_ctx_init(&file->digest) < 0)
|
|
229
|
+
goto cleanup;
|
|
226
230
|
}
|
|
227
231
|
|
|
228
232
|
compression = flags >> GIT_FILEBUF_DEFLATE_SHIFT;
|
|
@@ -291,16 +295,16 @@ cleanup:
|
|
|
291
295
|
|
|
292
296
|
int git_filebuf_hash(git_oid *oid, git_filebuf *file)
|
|
293
297
|
{
|
|
294
|
-
assert(oid && file && file->
|
|
298
|
+
assert(oid && file && file->compute_digest);
|
|
295
299
|
|
|
296
300
|
flush_buffer(file);
|
|
297
301
|
|
|
298
302
|
if (verify_last_error(file) < 0)
|
|
299
303
|
return -1;
|
|
300
304
|
|
|
301
|
-
git_hash_final(oid, file->digest);
|
|
302
|
-
|
|
303
|
-
file->
|
|
305
|
+
git_hash_final(oid, &file->digest);
|
|
306
|
+
git_hash_ctx_cleanup(&file->digest);
|
|
307
|
+
file->compute_digest = 0;
|
|
304
308
|
|
|
305
309
|
return 0;
|
|
306
310
|
}
|
|
@@ -466,3 +470,26 @@ int git_filebuf_printf(git_filebuf *file, const char *format, ...)
|
|
|
466
470
|
return res;
|
|
467
471
|
}
|
|
468
472
|
|
|
473
|
+
int git_filebuf_stats(time_t *mtime, size_t *size, git_filebuf *file)
|
|
474
|
+
{
|
|
475
|
+
int res;
|
|
476
|
+
struct stat st;
|
|
477
|
+
|
|
478
|
+
if (file->fd_is_open)
|
|
479
|
+
res = p_fstat(file->fd, &st);
|
|
480
|
+
else
|
|
481
|
+
res = p_stat(file->path_original, &st);
|
|
482
|
+
|
|
483
|
+
if (res < 0) {
|
|
484
|
+
giterr_set(GITERR_OS, "Could not get stat info for '%s'",
|
|
485
|
+
file->path_original);
|
|
486
|
+
return res;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
if (mtime)
|
|
490
|
+
*mtime = st.st_mtime;
|
|
491
|
+
if (size)
|
|
492
|
+
*size = (size_t)st.st_size;
|
|
493
|
+
|
|
494
|
+
return 0;
|
|
495
|
+
}
|