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
|
@@ -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,149 +8,18 @@
|
|
|
8
8
|
#include "common.h"
|
|
9
9
|
#include "commit.h"
|
|
10
10
|
#include "odb.h"
|
|
11
|
-
#include "pqueue.h"
|
|
12
11
|
#include "pool.h"
|
|
13
|
-
#include "oidmap.h"
|
|
14
12
|
|
|
15
|
-
#include "
|
|
16
|
-
#include "git2/
|
|
13
|
+
#include "revwalk.h"
|
|
14
|
+
#include "git2/revparse.h"
|
|
15
|
+
#include "merge.h"
|
|
17
16
|
|
|
18
17
|
#include <regex.h>
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
#define PARENT1 (1 << 0)
|
|
23
|
-
#define PARENT2 (1 << 1)
|
|
24
|
-
#define RESULT (1 << 2)
|
|
25
|
-
#define STALE (1 << 3)
|
|
26
|
-
|
|
27
|
-
typedef struct commit_object {
|
|
28
|
-
git_oid oid;
|
|
29
|
-
uint32_t time;
|
|
30
|
-
unsigned int seen:1,
|
|
31
|
-
uninteresting:1,
|
|
32
|
-
topo_delay:1,
|
|
33
|
-
parsed:1,
|
|
34
|
-
flags : 4;
|
|
35
|
-
|
|
36
|
-
unsigned short in_degree;
|
|
37
|
-
unsigned short out_degree;
|
|
38
|
-
|
|
39
|
-
struct commit_object **parents;
|
|
40
|
-
} commit_object;
|
|
41
|
-
|
|
42
|
-
typedef struct commit_list {
|
|
43
|
-
commit_object *item;
|
|
44
|
-
struct commit_list *next;
|
|
45
|
-
} commit_list;
|
|
46
|
-
|
|
47
|
-
struct git_revwalk {
|
|
48
|
-
git_repository *repo;
|
|
49
|
-
git_odb *odb;
|
|
50
|
-
|
|
51
|
-
git_oidmap *commits;
|
|
52
|
-
git_pool commit_pool;
|
|
53
|
-
|
|
54
|
-
commit_list *iterator_topo;
|
|
55
|
-
commit_list *iterator_rand;
|
|
56
|
-
commit_list *iterator_reverse;
|
|
57
|
-
git_pqueue iterator_time;
|
|
58
|
-
|
|
59
|
-
int (*get_next)(commit_object **, git_revwalk *);
|
|
60
|
-
int (*enqueue)(git_revwalk *, commit_object *);
|
|
61
|
-
|
|
62
|
-
unsigned walking:1;
|
|
63
|
-
unsigned int sorting;
|
|
64
|
-
|
|
65
|
-
/* merge base calculation */
|
|
66
|
-
commit_object *one;
|
|
67
|
-
git_vector twos;
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
static int commit_time_cmp(void *a, void *b)
|
|
71
|
-
{
|
|
72
|
-
commit_object *commit_a = (commit_object *)a;
|
|
73
|
-
commit_object *commit_b = (commit_object *)b;
|
|
74
|
-
|
|
75
|
-
return (commit_a->time < commit_b->time);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
static commit_list *commit_list_insert(commit_object *item, commit_list **list_p)
|
|
79
|
-
{
|
|
80
|
-
commit_list *new_list = git__malloc(sizeof(commit_list));
|
|
81
|
-
if (new_list != NULL) {
|
|
82
|
-
new_list->item = item;
|
|
83
|
-
new_list->next = *list_p;
|
|
84
|
-
}
|
|
85
|
-
*list_p = new_list;
|
|
86
|
-
return new_list;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
static commit_list *commit_list_insert_by_date(commit_object *item, commit_list **list_p)
|
|
90
|
-
{
|
|
91
|
-
commit_list **pp = list_p;
|
|
92
|
-
commit_list *p;
|
|
93
|
-
|
|
94
|
-
while ((p = *pp) != NULL) {
|
|
95
|
-
if (commit_time_cmp(p->item, item) < 0)
|
|
96
|
-
break;
|
|
97
|
-
|
|
98
|
-
pp = &p->next;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return commit_list_insert(item, pp);
|
|
102
|
-
}
|
|
103
|
-
static void commit_list_free(commit_list **list_p)
|
|
104
|
-
{
|
|
105
|
-
commit_list *list = *list_p;
|
|
106
|
-
|
|
107
|
-
if (list == NULL)
|
|
108
|
-
return;
|
|
109
|
-
|
|
110
|
-
while (list) {
|
|
111
|
-
commit_list *temp = list;
|
|
112
|
-
list = temp->next;
|
|
113
|
-
git__free(temp);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
*list_p = NULL;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
static commit_object *commit_list_pop(commit_list **stack)
|
|
120
|
-
{
|
|
121
|
-
commit_list *top = *stack;
|
|
122
|
-
commit_object *item = top ? top->item : NULL;
|
|
123
|
-
|
|
124
|
-
if (top) {
|
|
125
|
-
*stack = top->next;
|
|
126
|
-
git__free(top);
|
|
127
|
-
}
|
|
128
|
-
return item;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
#define PARENTS_PER_COMMIT 2
|
|
132
|
-
#define COMMIT_ALLOC \
|
|
133
|
-
(sizeof(commit_object) + PARENTS_PER_COMMIT * sizeof(commit_object *))
|
|
134
|
-
|
|
135
|
-
static commit_object *alloc_commit(git_revwalk *walk)
|
|
136
|
-
{
|
|
137
|
-
return (commit_object *)git_pool_malloc(&walk->commit_pool, COMMIT_ALLOC);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
static commit_object **alloc_parents(
|
|
141
|
-
git_revwalk *walk, commit_object *commit, size_t n_parents)
|
|
142
|
-
{
|
|
143
|
-
if (n_parents <= PARENTS_PER_COMMIT)
|
|
144
|
-
return (commit_object **)((char *)commit + sizeof(commit_object));
|
|
145
|
-
|
|
146
|
-
return (commit_object **)git_pool_malloc(
|
|
147
|
-
&walk->commit_pool, (uint32_t)(n_parents * sizeof(commit_object *)));
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
static commit_object *commit_lookup(git_revwalk *walk, const git_oid *oid)
|
|
19
|
+
git_commit_list_node *git_revwalk__commit_lookup(
|
|
20
|
+
git_revwalk *walk, const git_oid *oid)
|
|
152
21
|
{
|
|
153
|
-
|
|
22
|
+
git_commit_list_node *commit;
|
|
154
23
|
khiter_t pos;
|
|
155
24
|
int ret;
|
|
156
25
|
|
|
@@ -159,7 +28,7 @@ static commit_object *commit_lookup(git_revwalk *walk, const git_oid *oid)
|
|
|
159
28
|
if (pos != kh_end(walk->commits))
|
|
160
29
|
return kh_value(walk->commits, pos);
|
|
161
30
|
|
|
162
|
-
commit =
|
|
31
|
+
commit = git_commit_list_alloc_node(walk);
|
|
163
32
|
if (commit == NULL)
|
|
164
33
|
return NULL;
|
|
165
34
|
|
|
@@ -172,300 +41,7 @@ static commit_object *commit_lookup(git_revwalk *walk, const git_oid *oid)
|
|
|
172
41
|
return commit;
|
|
173
42
|
}
|
|
174
43
|
|
|
175
|
-
static
|
|
176
|
-
{
|
|
177
|
-
char commit_oid[GIT_OID_HEXSZ + 1];
|
|
178
|
-
git_oid_fmt(commit_oid, &commit->oid);
|
|
179
|
-
commit_oid[GIT_OID_HEXSZ] = '\0';
|
|
180
|
-
|
|
181
|
-
giterr_set(GITERR_ODB, "Failed to parse commit %s - %s", commit_oid, msg);
|
|
182
|
-
|
|
183
|
-
return -1;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
static int commit_quick_parse(git_revwalk *walk, commit_object *commit, git_rawobj *raw)
|
|
187
|
-
{
|
|
188
|
-
const size_t parent_len = strlen("parent ") + GIT_OID_HEXSZ + 1;
|
|
189
|
-
unsigned char *buffer = raw->data;
|
|
190
|
-
unsigned char *buffer_end = buffer + raw->len;
|
|
191
|
-
unsigned char *parents_start, *committer_start;
|
|
192
|
-
int i, parents = 0;
|
|
193
|
-
int commit_time;
|
|
194
|
-
|
|
195
|
-
buffer += strlen("tree ") + GIT_OID_HEXSZ + 1;
|
|
196
|
-
|
|
197
|
-
parents_start = buffer;
|
|
198
|
-
while (buffer + parent_len < buffer_end && memcmp(buffer, "parent ", strlen("parent ")) == 0) {
|
|
199
|
-
parents++;
|
|
200
|
-
buffer += parent_len;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
commit->parents = alloc_parents(walk, commit, parents);
|
|
204
|
-
GITERR_CHECK_ALLOC(commit->parents);
|
|
205
|
-
|
|
206
|
-
buffer = parents_start;
|
|
207
|
-
for (i = 0; i < parents; ++i) {
|
|
208
|
-
git_oid oid;
|
|
209
|
-
|
|
210
|
-
if (git_oid_fromstr(&oid, (char *)buffer + strlen("parent ")) < 0)
|
|
211
|
-
return -1;
|
|
212
|
-
|
|
213
|
-
commit->parents[i] = commit_lookup(walk, &oid);
|
|
214
|
-
if (commit->parents[i] == NULL)
|
|
215
|
-
return -1;
|
|
216
|
-
|
|
217
|
-
buffer += parent_len;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
commit->out_degree = (unsigned short)parents;
|
|
221
|
-
|
|
222
|
-
if ((committer_start = buffer = memchr(buffer, '\n', buffer_end - buffer)) == NULL)
|
|
223
|
-
return commit_error(commit, "object is corrupted");
|
|
224
|
-
|
|
225
|
-
buffer++;
|
|
226
|
-
|
|
227
|
-
if ((buffer = memchr(buffer, '\n', buffer_end - buffer)) == NULL)
|
|
228
|
-
return commit_error(commit, "object is corrupted");
|
|
229
|
-
|
|
230
|
-
/* Skip trailing spaces */
|
|
231
|
-
while (buffer > committer_start && git__isspace(*buffer))
|
|
232
|
-
buffer--;
|
|
233
|
-
|
|
234
|
-
/* Seek for the begining of the pack of digits */
|
|
235
|
-
while (buffer > committer_start && git__isdigit(*buffer))
|
|
236
|
-
buffer--;
|
|
237
|
-
|
|
238
|
-
/* Skip potential timezone offset */
|
|
239
|
-
if ((buffer > committer_start) && (*buffer == '+' || *buffer == '-')) {
|
|
240
|
-
buffer--;
|
|
241
|
-
|
|
242
|
-
while (buffer > committer_start && git__isspace(*buffer))
|
|
243
|
-
buffer--;
|
|
244
|
-
|
|
245
|
-
while (buffer > committer_start && git__isdigit(*buffer))
|
|
246
|
-
buffer--;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
if ((buffer == committer_start) || (git__strtol32(&commit_time, (char *)(buffer + 1), NULL, 10) < 0))
|
|
250
|
-
return commit_error(commit, "cannot parse commit time");
|
|
251
|
-
|
|
252
|
-
commit->time = (time_t)commit_time;
|
|
253
|
-
commit->parsed = 1;
|
|
254
|
-
return 0;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
static int commit_parse(git_revwalk *walk, commit_object *commit)
|
|
258
|
-
{
|
|
259
|
-
git_odb_object *obj;
|
|
260
|
-
int error;
|
|
261
|
-
|
|
262
|
-
if (commit->parsed)
|
|
263
|
-
return 0;
|
|
264
|
-
|
|
265
|
-
if ((error = git_odb_read(&obj, walk->odb, &commit->oid)) < 0)
|
|
266
|
-
return error;
|
|
267
|
-
assert(obj->raw.type == GIT_OBJ_COMMIT);
|
|
268
|
-
|
|
269
|
-
error = commit_quick_parse(walk, commit, &obj->raw);
|
|
270
|
-
git_odb_object_free(obj);
|
|
271
|
-
return error;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
static int interesting(git_pqueue *list)
|
|
275
|
-
{
|
|
276
|
-
unsigned int i;
|
|
277
|
-
/* element 0 isn't used - we need to start at 1 */
|
|
278
|
-
for (i = 1; i < list->size; i++) {
|
|
279
|
-
commit_object *commit = list->d[i];
|
|
280
|
-
if ((commit->flags & STALE) == 0)
|
|
281
|
-
return 1;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
return 0;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
static int merge_bases_many(commit_list **out, git_revwalk *walk, commit_object *one, git_vector *twos)
|
|
288
|
-
{
|
|
289
|
-
int error;
|
|
290
|
-
unsigned int i;
|
|
291
|
-
commit_object *two;
|
|
292
|
-
commit_list *result = NULL, *tmp = NULL;
|
|
293
|
-
git_pqueue list;
|
|
294
|
-
|
|
295
|
-
/* if the commit is repeated, we have a our merge base already */
|
|
296
|
-
git_vector_foreach(twos, i, two) {
|
|
297
|
-
if (one == two)
|
|
298
|
-
return commit_list_insert(one, out) ? 0 : -1;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
if (git_pqueue_init(&list, twos->length * 2, commit_time_cmp) < 0)
|
|
302
|
-
return -1;
|
|
303
|
-
|
|
304
|
-
if (commit_parse(walk, one) < 0)
|
|
305
|
-
return -1;
|
|
306
|
-
|
|
307
|
-
one->flags |= PARENT1;
|
|
308
|
-
if (git_pqueue_insert(&list, one) < 0)
|
|
309
|
-
return -1;
|
|
310
|
-
|
|
311
|
-
git_vector_foreach(twos, i, two) {
|
|
312
|
-
commit_parse(walk, two);
|
|
313
|
-
two->flags |= PARENT2;
|
|
314
|
-
if (git_pqueue_insert(&list, two) < 0)
|
|
315
|
-
return -1;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
/* as long as there are non-STALE commits */
|
|
319
|
-
while (interesting(&list)) {
|
|
320
|
-
commit_object *commit;
|
|
321
|
-
int flags;
|
|
322
|
-
|
|
323
|
-
commit = git_pqueue_pop(&list);
|
|
324
|
-
|
|
325
|
-
flags = commit->flags & (PARENT1 | PARENT2 | STALE);
|
|
326
|
-
if (flags == (PARENT1 | PARENT2)) {
|
|
327
|
-
if (!(commit->flags & RESULT)) {
|
|
328
|
-
commit->flags |= RESULT;
|
|
329
|
-
if (commit_list_insert(commit, &result) == NULL)
|
|
330
|
-
return -1;
|
|
331
|
-
}
|
|
332
|
-
/* we mark the parents of a merge stale */
|
|
333
|
-
flags |= STALE;
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
for (i = 0; i < commit->out_degree; i++) {
|
|
337
|
-
commit_object *p = commit->parents[i];
|
|
338
|
-
if ((p->flags & flags) == flags)
|
|
339
|
-
continue;
|
|
340
|
-
|
|
341
|
-
if ((error = commit_parse(walk, p)) < 0)
|
|
342
|
-
return error;
|
|
343
|
-
|
|
344
|
-
p->flags |= flags;
|
|
345
|
-
if (git_pqueue_insert(&list, p) < 0)
|
|
346
|
-
return -1;
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
git_pqueue_free(&list);
|
|
351
|
-
|
|
352
|
-
/* filter out any stale commits in the results */
|
|
353
|
-
tmp = result;
|
|
354
|
-
result = NULL;
|
|
355
|
-
|
|
356
|
-
while (tmp) {
|
|
357
|
-
struct commit_list *next = tmp->next;
|
|
358
|
-
if (!(tmp->item->flags & STALE))
|
|
359
|
-
if (commit_list_insert_by_date(tmp->item, &result) == NULL)
|
|
360
|
-
return -1;
|
|
361
|
-
|
|
362
|
-
git__free(tmp);
|
|
363
|
-
tmp = next;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
*out = result;
|
|
367
|
-
return 0;
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
int git_merge_base_many(git_oid *out, git_repository *repo, const git_oid input_array[], size_t length)
|
|
371
|
-
{
|
|
372
|
-
git_revwalk *walk;
|
|
373
|
-
git_vector list;
|
|
374
|
-
commit_list *result = NULL;
|
|
375
|
-
int error = -1;
|
|
376
|
-
unsigned int i;
|
|
377
|
-
commit_object *commit;
|
|
378
|
-
|
|
379
|
-
assert(out && repo && input_array);
|
|
380
|
-
|
|
381
|
-
if (length < 2) {
|
|
382
|
-
giterr_set(GITERR_INVALID, "At least two commits are required to find an ancestor. Provided 'length' was %u.", length);
|
|
383
|
-
return -1;
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
if (git_vector_init(&list, length - 1, NULL) < 0)
|
|
387
|
-
return -1;
|
|
388
|
-
|
|
389
|
-
if (git_revwalk_new(&walk, repo) < 0)
|
|
390
|
-
goto cleanup;
|
|
391
|
-
|
|
392
|
-
for (i = 1; i < length; i++) {
|
|
393
|
-
commit = commit_lookup(walk, &input_array[i]);
|
|
394
|
-
if (commit == NULL)
|
|
395
|
-
goto cleanup;
|
|
396
|
-
|
|
397
|
-
git_vector_insert(&list, commit);
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
commit = commit_lookup(walk, &input_array[0]);
|
|
401
|
-
if (commit == NULL)
|
|
402
|
-
goto cleanup;
|
|
403
|
-
|
|
404
|
-
if (merge_bases_many(&result, walk, commit, &list) < 0)
|
|
405
|
-
goto cleanup;
|
|
406
|
-
|
|
407
|
-
if (!result) {
|
|
408
|
-
error = GIT_ENOTFOUND;
|
|
409
|
-
goto cleanup;
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
git_oid_cpy(out, &result->item->oid);
|
|
413
|
-
|
|
414
|
-
error = 0;
|
|
415
|
-
|
|
416
|
-
cleanup:
|
|
417
|
-
commit_list_free(&result);
|
|
418
|
-
git_revwalk_free(walk);
|
|
419
|
-
git_vector_free(&list);
|
|
420
|
-
return error;
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
int git_merge_base(git_oid *out, git_repository *repo, const git_oid *one, const git_oid *two)
|
|
424
|
-
{
|
|
425
|
-
git_revwalk *walk;
|
|
426
|
-
git_vector list;
|
|
427
|
-
commit_list *result = NULL;
|
|
428
|
-
commit_object *commit;
|
|
429
|
-
void *contents[1];
|
|
430
|
-
|
|
431
|
-
if (git_revwalk_new(&walk, repo) < 0)
|
|
432
|
-
return -1;
|
|
433
|
-
|
|
434
|
-
commit = commit_lookup(walk, two);
|
|
435
|
-
if (commit == NULL)
|
|
436
|
-
goto on_error;
|
|
437
|
-
|
|
438
|
-
/* This is just one value, so we can do it on the stack */
|
|
439
|
-
memset(&list, 0x0, sizeof(git_vector));
|
|
440
|
-
contents[0] = commit;
|
|
441
|
-
list.length = 1;
|
|
442
|
-
list.contents = contents;
|
|
443
|
-
|
|
444
|
-
commit = commit_lookup(walk, one);
|
|
445
|
-
if (commit == NULL)
|
|
446
|
-
goto on_error;
|
|
447
|
-
|
|
448
|
-
if (merge_bases_many(&result, walk, commit, &list) < 0)
|
|
449
|
-
goto on_error;
|
|
450
|
-
|
|
451
|
-
if (!result) {
|
|
452
|
-
git_revwalk_free(walk);
|
|
453
|
-
giterr_clear();
|
|
454
|
-
return GIT_ENOTFOUND;
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
git_oid_cpy(out, &result->item->oid);
|
|
458
|
-
commit_list_free(&result);
|
|
459
|
-
git_revwalk_free(walk);
|
|
460
|
-
|
|
461
|
-
return 0;
|
|
462
|
-
|
|
463
|
-
on_error:
|
|
464
|
-
git_revwalk_free(walk);
|
|
465
|
-
return -1;
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
static void mark_uninteresting(commit_object *commit)
|
|
44
|
+
static void mark_uninteresting(git_commit_list_node *commit)
|
|
469
45
|
{
|
|
470
46
|
unsigned short i;
|
|
471
47
|
assert(commit);
|
|
@@ -481,7 +57,7 @@ static void mark_uninteresting(commit_object *commit)
|
|
|
481
57
|
mark_uninteresting(commit->parents[i]);
|
|
482
58
|
}
|
|
483
59
|
|
|
484
|
-
static int process_commit(git_revwalk *walk,
|
|
60
|
+
static int process_commit(git_revwalk *walk, git_commit_list_node *commit, int hide)
|
|
485
61
|
{
|
|
486
62
|
int error;
|
|
487
63
|
|
|
@@ -493,13 +69,13 @@ static int process_commit(git_revwalk *walk, commit_object *commit, int hide)
|
|
|
493
69
|
|
|
494
70
|
commit->seen = 1;
|
|
495
71
|
|
|
496
|
-
if ((error =
|
|
72
|
+
if ((error = git_commit_list_parse(walk, commit)) < 0)
|
|
497
73
|
return error;
|
|
498
74
|
|
|
499
75
|
return walk->enqueue(walk, commit);
|
|
500
76
|
}
|
|
501
77
|
|
|
502
|
-
static int process_commit_parents(git_revwalk *walk,
|
|
78
|
+
static int process_commit_parents(git_revwalk *walk, git_commit_list_node *commit)
|
|
503
79
|
{
|
|
504
80
|
unsigned short i;
|
|
505
81
|
int error = 0;
|
|
@@ -514,7 +90,7 @@ static int push_commit(git_revwalk *walk, const git_oid *oid, int uninteresting)
|
|
|
514
90
|
{
|
|
515
91
|
git_object *obj;
|
|
516
92
|
git_otype type;
|
|
517
|
-
|
|
93
|
+
git_commit_list_node *commit;
|
|
518
94
|
|
|
519
95
|
if (git_object_lookup(&obj, walk->repo, oid, GIT_OBJ_ANY) < 0)
|
|
520
96
|
return -1;
|
|
@@ -527,7 +103,7 @@ static int push_commit(git_revwalk *walk, const git_oid *oid, int uninteresting)
|
|
|
527
103
|
return -1;
|
|
528
104
|
}
|
|
529
105
|
|
|
530
|
-
commit =
|
|
106
|
+
commit = git_revwalk__commit_lookup(walk, oid);
|
|
531
107
|
if (commit == NULL)
|
|
532
108
|
return -1; /* error already reported by failed lookup */
|
|
533
109
|
|
|
@@ -559,7 +135,7 @@ static int push_ref(git_revwalk *walk, const char *refname, int hide)
|
|
|
559
135
|
{
|
|
560
136
|
git_oid oid;
|
|
561
137
|
|
|
562
|
-
if (
|
|
138
|
+
if (git_reference_name_to_id(&oid, walk->repo, refname) < 0)
|
|
563
139
|
return -1;
|
|
564
140
|
|
|
565
141
|
return push_commit(walk, &oid, hide);
|
|
@@ -653,26 +229,51 @@ int git_revwalk_push_ref(git_revwalk *walk, const char *refname)
|
|
|
653
229
|
return push_ref(walk, refname, 0);
|
|
654
230
|
}
|
|
655
231
|
|
|
232
|
+
int git_revwalk_push_range(git_revwalk *walk, const char *range)
|
|
233
|
+
{
|
|
234
|
+
git_revspec revspec;
|
|
235
|
+
int error = 0;
|
|
236
|
+
|
|
237
|
+
if ((error = git_revparse(&revspec, walk->repo, range)))
|
|
238
|
+
return error;
|
|
239
|
+
|
|
240
|
+
if (revspec.flags & GIT_REVPARSE_MERGE_BASE) {
|
|
241
|
+
/* TODO: support "<commit>...<commit>" */
|
|
242
|
+
giterr_set(GITERR_INVALID, "Symmetric differences not implemented in revwalk");
|
|
243
|
+
return GIT_EINVALIDSPEC;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if ((error = push_commit(walk, git_object_id(revspec.from), 1)))
|
|
247
|
+
goto out;
|
|
248
|
+
|
|
249
|
+
error = push_commit(walk, git_object_id(revspec.to), 0);
|
|
250
|
+
|
|
251
|
+
out:
|
|
252
|
+
git_object_free(revspec.from);
|
|
253
|
+
git_object_free(revspec.to);
|
|
254
|
+
return error;
|
|
255
|
+
}
|
|
256
|
+
|
|
656
257
|
int git_revwalk_hide_ref(git_revwalk *walk, const char *refname)
|
|
657
258
|
{
|
|
658
259
|
assert(walk && refname);
|
|
659
260
|
return push_ref(walk, refname, 1);
|
|
660
261
|
}
|
|
661
262
|
|
|
662
|
-
static int revwalk_enqueue_timesort(git_revwalk *walk,
|
|
263
|
+
static int revwalk_enqueue_timesort(git_revwalk *walk, git_commit_list_node *commit)
|
|
663
264
|
{
|
|
664
265
|
return git_pqueue_insert(&walk->iterator_time, commit);
|
|
665
266
|
}
|
|
666
267
|
|
|
667
|
-
static int revwalk_enqueue_unsorted(git_revwalk *walk,
|
|
268
|
+
static int revwalk_enqueue_unsorted(git_revwalk *walk, git_commit_list_node *commit)
|
|
668
269
|
{
|
|
669
|
-
return
|
|
270
|
+
return git_commit_list_insert(commit, &walk->iterator_rand) ? 0 : -1;
|
|
670
271
|
}
|
|
671
272
|
|
|
672
|
-
static int revwalk_next_timesort(
|
|
273
|
+
static int revwalk_next_timesort(git_commit_list_node **object_out, git_revwalk *walk)
|
|
673
274
|
{
|
|
674
275
|
int error;
|
|
675
|
-
|
|
276
|
+
git_commit_list_node *next;
|
|
676
277
|
|
|
677
278
|
while ((next = git_pqueue_pop(&walk->iterator_time)) != NULL) {
|
|
678
279
|
if ((error = process_commit_parents(walk, next)) < 0)
|
|
@@ -688,12 +289,12 @@ static int revwalk_next_timesort(commit_object **object_out, git_revwalk *walk)
|
|
|
688
289
|
return GIT_ITEROVER;
|
|
689
290
|
}
|
|
690
291
|
|
|
691
|
-
static int revwalk_next_unsorted(
|
|
292
|
+
static int revwalk_next_unsorted(git_commit_list_node **object_out, git_revwalk *walk)
|
|
692
293
|
{
|
|
693
294
|
int error;
|
|
694
|
-
|
|
295
|
+
git_commit_list_node *next;
|
|
695
296
|
|
|
696
|
-
while ((next =
|
|
297
|
+
while ((next = git_commit_list_pop(&walk->iterator_rand)) != NULL) {
|
|
697
298
|
if ((error = process_commit_parents(walk, next)) < 0)
|
|
698
299
|
return error;
|
|
699
300
|
|
|
@@ -707,13 +308,13 @@ static int revwalk_next_unsorted(commit_object **object_out, git_revwalk *walk)
|
|
|
707
308
|
return GIT_ITEROVER;
|
|
708
309
|
}
|
|
709
310
|
|
|
710
|
-
static int revwalk_next_toposort(
|
|
311
|
+
static int revwalk_next_toposort(git_commit_list_node **object_out, git_revwalk *walk)
|
|
711
312
|
{
|
|
712
|
-
|
|
313
|
+
git_commit_list_node *next;
|
|
713
314
|
unsigned short i;
|
|
714
315
|
|
|
715
316
|
for (;;) {
|
|
716
|
-
next =
|
|
317
|
+
next = git_commit_list_pop(&walk->iterator_topo);
|
|
717
318
|
if (next == NULL) {
|
|
718
319
|
giterr_clear();
|
|
719
320
|
return GIT_ITEROVER;
|
|
@@ -725,11 +326,11 @@ static int revwalk_next_toposort(commit_object **object_out, git_revwalk *walk)
|
|
|
725
326
|
}
|
|
726
327
|
|
|
727
328
|
for (i = 0; i < next->out_degree; ++i) {
|
|
728
|
-
|
|
329
|
+
git_commit_list_node *parent = next->parents[i];
|
|
729
330
|
|
|
730
331
|
if (--parent->in_degree == 0 && parent->topo_delay) {
|
|
731
332
|
parent->topo_delay = 0;
|
|
732
|
-
if (
|
|
333
|
+
if (git_commit_list_insert(parent, &walk->iterator_topo) == NULL)
|
|
733
334
|
return -1;
|
|
734
335
|
}
|
|
735
336
|
}
|
|
@@ -739,9 +340,9 @@ static int revwalk_next_toposort(commit_object **object_out, git_revwalk *walk)
|
|
|
739
340
|
}
|
|
740
341
|
}
|
|
741
342
|
|
|
742
|
-
static int revwalk_next_reverse(
|
|
343
|
+
static int revwalk_next_reverse(git_commit_list_node **object_out, git_revwalk *walk)
|
|
743
344
|
{
|
|
744
|
-
*object_out =
|
|
345
|
+
*object_out = git_commit_list_pop(&walk->iterator_reverse);
|
|
745
346
|
return *object_out ? 0 : GIT_ITEROVER;
|
|
746
347
|
}
|
|
747
348
|
|
|
@@ -750,8 +351,8 @@ static int prepare_walk(git_revwalk *walk)
|
|
|
750
351
|
{
|
|
751
352
|
int error;
|
|
752
353
|
unsigned int i;
|
|
753
|
-
|
|
754
|
-
|
|
354
|
+
git_commit_list_node *next, *two;
|
|
355
|
+
git_commit_list *bases = NULL;
|
|
755
356
|
|
|
756
357
|
/*
|
|
757
358
|
* If walk->one is NULL, there were no positive references,
|
|
@@ -763,10 +364,10 @@ static int prepare_walk(git_revwalk *walk)
|
|
|
763
364
|
}
|
|
764
365
|
|
|
765
366
|
/* first figure out what the merge bases are */
|
|
766
|
-
if (
|
|
367
|
+
if (git_merge__bases_many(&bases, walk, walk->one, &walk->twos) < 0)
|
|
767
368
|
return -1;
|
|
768
369
|
|
|
769
|
-
|
|
370
|
+
git_commit_list_free(&bases);
|
|
770
371
|
if (process_commit(walk, walk->one, walk->one->uninteresting) < 0)
|
|
771
372
|
return -1;
|
|
772
373
|
|
|
@@ -780,11 +381,11 @@ static int prepare_walk(git_revwalk *walk)
|
|
|
780
381
|
|
|
781
382
|
while ((error = walk->get_next(&next, walk)) == 0) {
|
|
782
383
|
for (i = 0; i < next->out_degree; ++i) {
|
|
783
|
-
|
|
384
|
+
git_commit_list_node *parent = next->parents[i];
|
|
784
385
|
parent->in_degree++;
|
|
785
386
|
}
|
|
786
387
|
|
|
787
|
-
if (
|
|
388
|
+
if (git_commit_list_insert(next, &walk->iterator_topo) == NULL)
|
|
788
389
|
return -1;
|
|
789
390
|
}
|
|
790
391
|
|
|
@@ -797,7 +398,7 @@ static int prepare_walk(git_revwalk *walk)
|
|
|
797
398
|
if (walk->sorting & GIT_SORT_REVERSE) {
|
|
798
399
|
|
|
799
400
|
while ((error = walk->get_next(&next, walk)) == 0)
|
|
800
|
-
if (
|
|
401
|
+
if (git_commit_list_insert(next, &walk->iterator_reverse) == NULL)
|
|
801
402
|
return -1;
|
|
802
403
|
|
|
803
404
|
if (error != GIT_ITEROVER)
|
|
@@ -811,9 +412,6 @@ static int prepare_walk(git_revwalk *walk)
|
|
|
811
412
|
}
|
|
812
413
|
|
|
813
414
|
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
415
|
int git_revwalk_new(git_revwalk **revwalk_out, git_repository *repo)
|
|
818
416
|
{
|
|
819
417
|
git_revwalk *walk;
|
|
@@ -826,7 +424,7 @@ int git_revwalk_new(git_revwalk **revwalk_out, git_repository *repo)
|
|
|
826
424
|
walk->commits = git_oidmap_alloc();
|
|
827
425
|
GITERR_CHECK_ALLOC(walk->commits);
|
|
828
426
|
|
|
829
|
-
if (git_pqueue_init(&walk->iterator_time, 8,
|
|
427
|
+
if (git_pqueue_init(&walk->iterator_time, 8, git_commit_list_time_cmp) < 0 ||
|
|
830
428
|
git_vector_init(&walk->twos, 4, NULL) < 0 ||
|
|
831
429
|
git_pool_init(&walk->commit_pool, 1,
|
|
832
430
|
git_pool__suggest_items_per_page(COMMIT_ALLOC) * COMMIT_ALLOC) < 0)
|
|
@@ -888,7 +486,7 @@ void git_revwalk_sorting(git_revwalk *walk, unsigned int sort_mode)
|
|
|
888
486
|
int git_revwalk_next(git_oid *oid, git_revwalk *walk)
|
|
889
487
|
{
|
|
890
488
|
int error;
|
|
891
|
-
|
|
489
|
+
git_commit_list_node *next;
|
|
892
490
|
|
|
893
491
|
assert(walk && oid);
|
|
894
492
|
|
|
@@ -913,7 +511,7 @@ int git_revwalk_next(git_oid *oid, git_revwalk *walk)
|
|
|
913
511
|
|
|
914
512
|
void git_revwalk_reset(git_revwalk *walk)
|
|
915
513
|
{
|
|
916
|
-
|
|
514
|
+
git_commit_list_node *commit;
|
|
917
515
|
|
|
918
516
|
assert(walk);
|
|
919
517
|
|
|
@@ -925,9 +523,9 @@ void git_revwalk_reset(git_revwalk *walk)
|
|
|
925
523
|
});
|
|
926
524
|
|
|
927
525
|
git_pqueue_clear(&walk->iterator_time);
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
526
|
+
git_commit_list_free(&walk->iterator_topo);
|
|
527
|
+
git_commit_list_free(&walk->iterator_rand);
|
|
528
|
+
git_commit_list_free(&walk->iterator_reverse);
|
|
931
529
|
walk->walking = 0;
|
|
932
530
|
|
|
933
531
|
walk->one = NULL;
|