rugged 0.17.0.b7 → 0.18.0.b1
Sign up to get free protection for your applications and to get access to all the features.
- 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/remote.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.
|
@@ -8,9 +8,9 @@
|
|
8
8
|
#define INCLUDE_remote_h__
|
9
9
|
|
10
10
|
#include "git2/remote.h"
|
11
|
+
#include "git2/transport.h"
|
11
12
|
|
12
13
|
#include "refspec.h"
|
13
|
-
#include "transport.h"
|
14
14
|
#include "repository.h"
|
15
15
|
|
16
16
|
#define GIT_REMOTE_ORIGIN "origin"
|
@@ -22,14 +22,19 @@ struct git_remote {
|
|
22
22
|
git_vector refs;
|
23
23
|
struct git_refspec fetch;
|
24
24
|
struct git_refspec push;
|
25
|
+
git_cred_acquire_cb cred_acquire_cb;
|
26
|
+
void *cred_acquire_payload;
|
25
27
|
git_transport *transport;
|
26
28
|
git_repository *repo;
|
27
29
|
git_remote_callbacks callbacks;
|
28
|
-
|
29
|
-
|
30
|
-
|
30
|
+
git_transfer_progress stats;
|
31
|
+
unsigned int need_pack;
|
32
|
+
git_remote_autotag_option_t download_tags;
|
33
|
+
unsigned int check_cert;
|
34
|
+
unsigned int update_fetchhead;
|
31
35
|
};
|
32
36
|
|
33
37
|
const char* git_remote__urlfordirection(struct git_remote *remote, int direction);
|
38
|
+
int git_remote__get_http_proxy(git_remote *remote, bool use_ssl, char **proxy_url);
|
34
39
|
|
35
40
|
#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.
|
@@ -11,10 +11,10 @@
|
|
11
11
|
#define GIT_OBJECTS_PACK_DIR GIT_OBJECTS_DIR "pack/"
|
12
12
|
|
13
13
|
#define GIT_HOOKS_DIR "hooks/"
|
14
|
-
#define GIT_HOOKS_DIR_MODE
|
14
|
+
#define GIT_HOOKS_DIR_MODE 0777
|
15
15
|
|
16
16
|
#define GIT_HOOKS_README_FILE GIT_HOOKS_DIR "README.sample"
|
17
|
-
#define GIT_HOOKS_README_MODE
|
17
|
+
#define GIT_HOOKS_README_MODE 0777
|
18
18
|
#define GIT_HOOKS_README_CONTENT \
|
19
19
|
"#!/bin/sh\n"\
|
20
20
|
"#\n"\
|
@@ -23,16 +23,16 @@
|
|
23
23
|
"# more information.\n"
|
24
24
|
|
25
25
|
#define GIT_INFO_DIR "info/"
|
26
|
-
#define GIT_INFO_DIR_MODE
|
26
|
+
#define GIT_INFO_DIR_MODE 0777
|
27
27
|
|
28
28
|
#define GIT_INFO_EXCLUDE_FILE GIT_INFO_DIR "exclude"
|
29
|
-
#define GIT_INFO_EXCLUDE_MODE
|
29
|
+
#define GIT_INFO_EXCLUDE_MODE 0666
|
30
30
|
#define GIT_INFO_EXCLUDE_CONTENT \
|
31
31
|
"# File patterns to ignore; see `git help ignore` for more information.\n"\
|
32
32
|
"# Lines that start with '#' are comments.\n"
|
33
33
|
|
34
34
|
#define GIT_DESC_FILE "description"
|
35
|
-
#define GIT_DESC_MODE
|
35
|
+
#define GIT_DESC_MODE 0666
|
36
36
|
#define GIT_DESC_CONTENT \
|
37
37
|
"Unnamed repository; edit this file 'description' to name the repository.\n"
|
38
38
|
|
@@ -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,6 +8,7 @@
|
|
8
8
|
#include <ctype.h>
|
9
9
|
|
10
10
|
#include "git2/object.h"
|
11
|
+
#include "git2/refdb.h"
|
11
12
|
|
12
13
|
#include "common.h"
|
13
14
|
#include "repository.h"
|
@@ -20,6 +21,7 @@
|
|
20
21
|
#include "filter.h"
|
21
22
|
#include "odb.h"
|
22
23
|
#include "remote.h"
|
24
|
+
#include "merge.h"
|
23
25
|
|
24
26
|
#define GIT_FILE_CONTENT_PREFIX "gitdir:"
|
25
27
|
|
@@ -38,6 +40,15 @@ static void drop_odb(git_repository *repo)
|
|
38
40
|
}
|
39
41
|
}
|
40
42
|
|
43
|
+
static void drop_refdb(git_repository *repo)
|
44
|
+
{
|
45
|
+
if (repo->_refdb != NULL) {
|
46
|
+
GIT_REFCOUNT_OWN(repo->_refdb, NULL);
|
47
|
+
git_refdb_free(repo->_refdb);
|
48
|
+
repo->_refdb = NULL;
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
41
52
|
static void drop_config(git_repository *repo)
|
42
53
|
{
|
43
54
|
if (repo->_config != NULL) {
|
@@ -64,7 +75,6 @@ void git_repository_free(git_repository *repo)
|
|
64
75
|
return;
|
65
76
|
|
66
77
|
git_cache_free(&repo->objects);
|
67
|
-
git_repository__refcache_free(&repo->references);
|
68
78
|
git_attr_cache_flush(repo);
|
69
79
|
git_submodule_config_free(repo);
|
70
80
|
|
@@ -74,6 +84,7 @@ void git_repository_free(git_repository *repo)
|
|
74
84
|
drop_config(repo);
|
75
85
|
drop_index(repo);
|
76
86
|
drop_odb(repo);
|
87
|
+
drop_refdb(repo);
|
77
88
|
|
78
89
|
git__free(repo);
|
79
90
|
}
|
@@ -357,10 +368,41 @@ static int find_repo(
|
|
357
368
|
return error;
|
358
369
|
}
|
359
370
|
|
371
|
+
int git_repository_open_bare(
|
372
|
+
git_repository **repo_ptr,
|
373
|
+
const char *bare_path)
|
374
|
+
{
|
375
|
+
int error;
|
376
|
+
git_buf path = GIT_BUF_INIT;
|
377
|
+
git_repository *repo = NULL;
|
378
|
+
|
379
|
+
if ((error = git_path_prettify_dir(&path, bare_path, NULL)) < 0)
|
380
|
+
return error;
|
381
|
+
|
382
|
+
if (!valid_repository_path(&path)) {
|
383
|
+
git_buf_free(&path);
|
384
|
+
giterr_set(GITERR_REPOSITORY, "Path is not a repository: %s", bare_path);
|
385
|
+
return GIT_ENOTFOUND;
|
386
|
+
}
|
387
|
+
|
388
|
+
repo = repository_alloc();
|
389
|
+
GITERR_CHECK_ALLOC(repo);
|
390
|
+
|
391
|
+
repo->path_repository = git_buf_detach(&path);
|
392
|
+
GITERR_CHECK_ALLOC(repo->path_repository);
|
393
|
+
|
394
|
+
/* of course we're bare! */
|
395
|
+
repo->is_bare = 1;
|
396
|
+
repo->workdir = NULL;
|
397
|
+
|
398
|
+
*repo_ptr = repo;
|
399
|
+
return 0;
|
400
|
+
}
|
401
|
+
|
360
402
|
int git_repository_open_ext(
|
361
403
|
git_repository **repo_ptr,
|
362
404
|
const char *start_path,
|
363
|
-
|
405
|
+
unsigned int flags,
|
364
406
|
const char *ceiling_dirs)
|
365
407
|
{
|
366
408
|
int error;
|
@@ -449,37 +491,46 @@ static int load_config(
|
|
449
491
|
const char *xdg_config_path,
|
450
492
|
const char *system_config_path)
|
451
493
|
{
|
494
|
+
int error;
|
452
495
|
git_buf config_path = GIT_BUF_INIT;
|
453
496
|
git_config *cfg = NULL;
|
454
497
|
|
455
498
|
assert(repo && out);
|
456
499
|
|
457
|
-
if (git_config_new(&cfg) < 0)
|
458
|
-
return
|
500
|
+
if ((error = git_config_new(&cfg)) < 0)
|
501
|
+
return error;
|
459
502
|
|
460
|
-
|
461
|
-
&config_path, repo->path_repository, GIT_CONFIG_FILENAME_INREPO)
|
503
|
+
error = git_buf_joinpath(
|
504
|
+
&config_path, repo->path_repository, GIT_CONFIG_FILENAME_INREPO);
|
505
|
+
if (error < 0)
|
462
506
|
goto on_error;
|
463
507
|
|
464
|
-
if (
|
508
|
+
if ((error = git_config_add_file_ondisk(
|
509
|
+
cfg, config_path.ptr, GIT_CONFIG_LEVEL_LOCAL, 0)) < 0 &&
|
510
|
+
error != GIT_ENOTFOUND)
|
465
511
|
goto on_error;
|
466
512
|
|
467
513
|
git_buf_free(&config_path);
|
468
514
|
|
469
|
-
if (global_config_path != NULL
|
470
|
-
|
471
|
-
|
472
|
-
|
515
|
+
if (global_config_path != NULL &&
|
516
|
+
(error = git_config_add_file_ondisk(
|
517
|
+
cfg, global_config_path, GIT_CONFIG_LEVEL_GLOBAL, 0)) < 0 &&
|
518
|
+
error != GIT_ENOTFOUND)
|
519
|
+
goto on_error;
|
473
520
|
|
474
|
-
if (xdg_config_path != NULL
|
475
|
-
|
476
|
-
|
477
|
-
|
521
|
+
if (xdg_config_path != NULL &&
|
522
|
+
(error = git_config_add_file_ondisk(
|
523
|
+
cfg, xdg_config_path, GIT_CONFIG_LEVEL_XDG, 0)) < 0 &&
|
524
|
+
error != GIT_ENOTFOUND)
|
525
|
+
goto on_error;
|
478
526
|
|
479
|
-
if (system_config_path != NULL
|
480
|
-
|
481
|
-
|
482
|
-
|
527
|
+
if (system_config_path != NULL &&
|
528
|
+
(error = git_config_add_file_ondisk(
|
529
|
+
cfg, system_config_path, GIT_CONFIG_LEVEL_SYSTEM, 0)) < 0 &&
|
530
|
+
error != GIT_ENOTFOUND)
|
531
|
+
goto on_error;
|
532
|
+
|
533
|
+
giterr_clear(); /* clear any lingering ENOTFOUND errors */
|
483
534
|
|
484
535
|
*out = cfg;
|
485
536
|
return 0;
|
@@ -488,7 +539,7 @@ on_error:
|
|
488
539
|
git_buf_free(&config_path);
|
489
540
|
git_config_free(cfg);
|
490
541
|
*out = NULL;
|
491
|
-
return
|
542
|
+
return error;
|
492
543
|
}
|
493
544
|
|
494
545
|
int git_repository_config__weakptr(git_config **out, git_repository *repo)
|
@@ -543,6 +594,7 @@ void git_repository_set_config(git_repository *repo, git_config *config)
|
|
543
594
|
|
544
595
|
repo->_config = config;
|
545
596
|
GIT_REFCOUNT_OWN(repo->_config, repo);
|
597
|
+
GIT_REFCOUNT_INC(repo->_config);
|
546
598
|
}
|
547
599
|
|
548
600
|
int git_repository_odb__weakptr(git_odb **out, git_repository *repo)
|
@@ -589,6 +641,45 @@ void git_repository_set_odb(git_repository *repo, git_odb *odb)
|
|
589
641
|
GIT_REFCOUNT_INC(odb);
|
590
642
|
}
|
591
643
|
|
644
|
+
int git_repository_refdb__weakptr(git_refdb **out, git_repository *repo)
|
645
|
+
{
|
646
|
+
assert(out && repo);
|
647
|
+
|
648
|
+
if (repo->_refdb == NULL) {
|
649
|
+
int res;
|
650
|
+
|
651
|
+
res = git_refdb_open(&repo->_refdb, repo);
|
652
|
+
|
653
|
+
if (res < 0)
|
654
|
+
return -1;
|
655
|
+
|
656
|
+
GIT_REFCOUNT_OWN(repo->_refdb, repo);
|
657
|
+
}
|
658
|
+
|
659
|
+
*out = repo->_refdb;
|
660
|
+
return 0;
|
661
|
+
}
|
662
|
+
|
663
|
+
int git_repository_refdb(git_refdb **out, git_repository *repo)
|
664
|
+
{
|
665
|
+
if (git_repository_refdb__weakptr(out, repo) < 0)
|
666
|
+
return -1;
|
667
|
+
|
668
|
+
GIT_REFCOUNT_INC(*out);
|
669
|
+
return 0;
|
670
|
+
}
|
671
|
+
|
672
|
+
void git_repository_set_refdb(git_repository *repo, git_refdb *refdb)
|
673
|
+
{
|
674
|
+
assert (repo && refdb);
|
675
|
+
|
676
|
+
drop_refdb(repo);
|
677
|
+
|
678
|
+
repo->_refdb = refdb;
|
679
|
+
GIT_REFCOUNT_OWN(repo->_refdb, repo);
|
680
|
+
GIT_REFCOUNT_INC(refdb);
|
681
|
+
}
|
682
|
+
|
592
683
|
int git_repository_index__weakptr(git_index **out, git_repository *repo)
|
593
684
|
{
|
594
685
|
assert(out && repo);
|
@@ -749,6 +840,23 @@ static bool are_symlinks_supported(const char *wd_path)
|
|
749
840
|
return _symlinks_supported;
|
750
841
|
}
|
751
842
|
|
843
|
+
static int create_empty_file(const char *path, mode_t mode)
|
844
|
+
{
|
845
|
+
int fd;
|
846
|
+
|
847
|
+
if ((fd = p_creat(path, mode)) < 0) {
|
848
|
+
giterr_set(GITERR_OS, "Error while creating '%s'", path);
|
849
|
+
return -1;
|
850
|
+
}
|
851
|
+
|
852
|
+
if (p_close(fd) < 0) {
|
853
|
+
giterr_set(GITERR_OS, "Error while closing '%s'", path);
|
854
|
+
return -1;
|
855
|
+
}
|
856
|
+
|
857
|
+
return 0;
|
858
|
+
}
|
859
|
+
|
752
860
|
static int repo_init_config(
|
753
861
|
const char *repo_dir,
|
754
862
|
const char *work_dir,
|
@@ -765,6 +873,12 @@ static int repo_init_config(
|
|
765
873
|
if (git_buf_joinpath(&cfg_path, repo_dir, GIT_CONFIG_FILENAME_INREPO) < 0)
|
766
874
|
return -1;
|
767
875
|
|
876
|
+
if (!git_path_isfile(git_buf_cstr(&cfg_path)) &&
|
877
|
+
create_empty_file(git_buf_cstr(&cfg_path), GIT_CONFIG_FILE_MODE) < 0) {
|
878
|
+
git_buf_free(&cfg_path);
|
879
|
+
return -1;
|
880
|
+
}
|
881
|
+
|
768
882
|
if (git_config_open_ondisk(&config, git_buf_cstr(&cfg_path)) < 0) {
|
769
883
|
git_buf_free(&cfg_path);
|
770
884
|
return -1;
|
@@ -791,7 +905,7 @@ static int repo_init_config(
|
|
791
905
|
SET_REPO_CONFIG(string, "core.worktree", work_dir);
|
792
906
|
}
|
793
907
|
else if ((opts->flags & GIT_REPOSITORY_INIT__IS_REINIT) != 0) {
|
794
|
-
if (
|
908
|
+
if (git_config_delete_entry(config, "core.worktree") < 0)
|
795
909
|
giterr_clear();
|
796
910
|
}
|
797
911
|
} else {
|
@@ -901,7 +1015,7 @@ static int repo_write_gitlink(
|
|
901
1015
|
error = git_buf_printf(&buf, "%s %s", GIT_FILE_CONTENT_PREFIX, to_repo);
|
902
1016
|
|
903
1017
|
if (!error)
|
904
|
-
error = repo_write_template(in_dir, true, DOT_GIT,
|
1018
|
+
error = repo_write_template(in_dir, true, DOT_GIT, 0666, true, buf.ptr);
|
905
1019
|
|
906
1020
|
cleanup:
|
907
1021
|
git_buf_free(&buf);
|
@@ -911,7 +1025,7 @@ cleanup:
|
|
911
1025
|
static mode_t pick_dir_mode(git_repository_init_options *opts)
|
912
1026
|
{
|
913
1027
|
if (opts->mode == GIT_REPOSITORY_INIT_SHARED_UMASK)
|
914
|
-
return
|
1028
|
+
return 0777;
|
915
1029
|
if (opts->mode == GIT_REPOSITORY_INIT_SHARED_GROUP)
|
916
1030
|
return (0775 | S_ISGID);
|
917
1031
|
if (opts->mode == GIT_REPOSITORY_INIT_SHARED_ALL)
|
@@ -973,7 +1087,8 @@ static int repo_init_structure(
|
|
973
1087
|
}
|
974
1088
|
|
975
1089
|
error = git_futils_cp_r(tdir, repo_dir,
|
976
|
-
GIT_CPDIR_COPY_SYMLINKS |
|
1090
|
+
GIT_CPDIR_COPY_SYMLINKS | GIT_CPDIR_CHMOD_DIRS |
|
1091
|
+
GIT_CPDIR_SIMPLE_TO_MODE, dmode);
|
977
1092
|
|
978
1093
|
if (error < 0) {
|
979
1094
|
if (strcmp(tdir, GIT_TEMPLATE_DIR) != 0)
|
@@ -982,6 +1097,7 @@ static int repo_init_structure(
|
|
982
1097
|
/* if template was default, ignore error and use internal */
|
983
1098
|
giterr_clear();
|
984
1099
|
external_tpl = false;
|
1100
|
+
error = 0;
|
985
1101
|
}
|
986
1102
|
}
|
987
1103
|
|
@@ -1007,6 +1123,17 @@ static int repo_init_structure(
|
|
1007
1123
|
return error;
|
1008
1124
|
}
|
1009
1125
|
|
1126
|
+
static int mkdir_parent(git_buf *buf, uint32_t mode, bool skip2)
|
1127
|
+
{
|
1128
|
+
/* When making parent directories during repository initialization
|
1129
|
+
* don't try to set gid or grant world write access
|
1130
|
+
*/
|
1131
|
+
return git_futils_mkdir(
|
1132
|
+
buf->ptr, NULL, mode & ~(S_ISGID | 0002),
|
1133
|
+
GIT_MKDIR_PATH | GIT_MKDIR_VERIFY_DIR |
|
1134
|
+
(skip2 ? GIT_MKDIR_SKIP_LAST2 : GIT_MKDIR_SKIP_LAST));
|
1135
|
+
}
|
1136
|
+
|
1010
1137
|
static int repo_init_directories(
|
1011
1138
|
git_buf *repo_path,
|
1012
1139
|
git_buf *wd_path,
|
@@ -1014,14 +1141,36 @@ static int repo_init_directories(
|
|
1014
1141
|
git_repository_init_options *opts)
|
1015
1142
|
{
|
1016
1143
|
int error = 0;
|
1017
|
-
bool add_dotgit, has_dotgit, natural_wd;
|
1144
|
+
bool is_bare, add_dotgit, has_dotgit, natural_wd;
|
1018
1145
|
mode_t dirmode;
|
1019
1146
|
|
1147
|
+
/* There are three possible rules for what we are allowed to create:
|
1148
|
+
* - MKPATH means anything we need
|
1149
|
+
* - MKDIR means just the .git directory and its parent and the workdir
|
1150
|
+
* - Neither means only the .git directory can be created
|
1151
|
+
*
|
1152
|
+
* There are 5 "segments" of path that we might need to deal with:
|
1153
|
+
* 1. The .git directory
|
1154
|
+
* 2. The parent of the .git directory
|
1155
|
+
* 3. Everything above the parent of the .git directory
|
1156
|
+
* 4. The working directory (often the same as #2)
|
1157
|
+
* 5. Everything above the working directory (often the same as #3)
|
1158
|
+
*
|
1159
|
+
* For all directories created, we start with the init_mode value for
|
1160
|
+
* permissions and then strip off bits in some cases:
|
1161
|
+
*
|
1162
|
+
* For MKPATH, we create #3 (and #5) paths without S_ISGID or S_IWOTH
|
1163
|
+
* For MKPATH and MKDIR, we create #2 (and #4) without S_ISGID
|
1164
|
+
* For all rules, we create #1 using the untouched init_mode
|
1165
|
+
*/
|
1166
|
+
|
1020
1167
|
/* set up repo path */
|
1021
1168
|
|
1169
|
+
is_bare = ((opts->flags & GIT_REPOSITORY_INIT_BARE) != 0);
|
1170
|
+
|
1022
1171
|
add_dotgit =
|
1023
1172
|
(opts->flags & GIT_REPOSITORY_INIT_NO_DOTGIT_DIR) == 0 &&
|
1024
|
-
|
1173
|
+
!is_bare &&
|
1025
1174
|
git__suffixcmp(given_repo, "/" DOT_GIT) != 0 &&
|
1026
1175
|
git__suffixcmp(given_repo, "/" GIT_DIR) != 0;
|
1027
1176
|
|
@@ -1034,7 +1183,7 @@ static int repo_init_directories(
|
|
1034
1183
|
|
1035
1184
|
/* set up workdir path */
|
1036
1185
|
|
1037
|
-
if (
|
1186
|
+
if (!is_bare) {
|
1038
1187
|
if (opts->workdir_path) {
|
1039
1188
|
if (git_path_join_unrooted(
|
1040
1189
|
wd_path, opts->workdir_path, repo_path->ptr, NULL) < 0)
|
@@ -1066,30 +1215,45 @@ static int repo_init_directories(
|
|
1066
1215
|
|
1067
1216
|
dirmode = pick_dir_mode(opts);
|
1068
1217
|
|
1069
|
-
if ((opts->flags &
|
1070
|
-
|
1071
|
-
if (
|
1072
|
-
error =
|
1073
|
-
|
1218
|
+
if ((opts->flags & GIT_REPOSITORY_INIT_MKPATH) != 0) {
|
1219
|
+
/* create path #5 */
|
1220
|
+
if (wd_path->size > 0 &&
|
1221
|
+
(error = mkdir_parent(wd_path, dirmode, false)) < 0)
|
1222
|
+
return error;
|
1223
|
+
|
1224
|
+
/* create path #3 (if not the same as #5) */
|
1225
|
+
if (!natural_wd &&
|
1226
|
+
(error = mkdir_parent(repo_path, dirmode, has_dotgit)) < 0)
|
1227
|
+
return error;
|
1228
|
+
}
|
1229
|
+
|
1230
|
+
if ((opts->flags & GIT_REPOSITORY_INIT_MKDIR) != 0 ||
|
1231
|
+
(opts->flags & GIT_REPOSITORY_INIT_MKPATH) != 0)
|
1232
|
+
{
|
1233
|
+
/* create path #4 */
|
1234
|
+
if (wd_path->size > 0 &&
|
1235
|
+
(error = git_futils_mkdir(
|
1236
|
+
wd_path->ptr, NULL, dirmode & ~S_ISGID,
|
1237
|
+
GIT_MKDIR_VERIFY_DIR)) < 0)
|
1238
|
+
return error;
|
1239
|
+
|
1240
|
+
/* create path #2 (if not the same as #4) */
|
1241
|
+
if (!natural_wd &&
|
1242
|
+
(error = git_futils_mkdir(
|
1243
|
+
repo_path->ptr, NULL, dirmode & ~S_ISGID,
|
1244
|
+
GIT_MKDIR_VERIFY_DIR | GIT_MKDIR_SKIP_LAST)) < 0)
|
1245
|
+
return error;
|
1074
1246
|
}
|
1075
1247
|
|
1076
1248
|
if ((opts->flags & GIT_REPOSITORY_INIT_MKDIR) != 0 ||
|
1077
1249
|
(opts->flags & GIT_REPOSITORY_INIT_MKPATH) != 0 ||
|
1078
1250
|
has_dotgit)
|
1079
1251
|
{
|
1080
|
-
|
1081
|
-
|
1082
|
-
|
1083
|
-
error = git_futils_mkdir(repo_path->ptr, NULL, dirmode, mkflag);
|
1252
|
+
/* create path #1 */
|
1253
|
+
error = git_futils_mkdir(repo_path->ptr, NULL, dirmode,
|
1254
|
+
GIT_MKDIR_VERIFY_DIR | ((dirmode & S_ISGID) ? GIT_MKDIR_CHMOD : 0));
|
1084
1255
|
}
|
1085
1256
|
|
1086
|
-
if (wd_path->size > 0 &&
|
1087
|
-
!natural_wd &&
|
1088
|
-
((opts->flags & GIT_REPOSITORY_INIT_MKDIR) != 0 ||
|
1089
|
-
(opts->flags & GIT_REPOSITORY_INIT_MKPATH) != 0))
|
1090
|
-
error = git_futils_mkdir(wd_path->ptr, NULL, dirmode & ~S_ISGID,
|
1091
|
-
(opts->flags & GIT_REPOSITORY_INIT_MKPATH) ? GIT_MKDIR_PATH : 0);
|
1092
|
-
|
1093
1257
|
/* prettify both directories now that they are created */
|
1094
1258
|
|
1095
1259
|
if (!error) {
|
@@ -1107,8 +1271,7 @@ static int repo_init_create_origin(git_repository *repo, const char *url)
|
|
1107
1271
|
int error;
|
1108
1272
|
git_remote *remote;
|
1109
1273
|
|
1110
|
-
if (!(error =
|
1111
|
-
error = git_remote_save(remote);
|
1274
|
+
if (!(error = git_remote_create(&remote, repo, GIT_REMOTE_ORIGIN, url))) {
|
1112
1275
|
git_remote_free(remote);
|
1113
1276
|
}
|
1114
1277
|
|
@@ -1118,9 +1281,8 @@ static int repo_init_create_origin(git_repository *repo, const char *url)
|
|
1118
1281
|
int git_repository_init(
|
1119
1282
|
git_repository **repo_out, const char *path, unsigned is_bare)
|
1120
1283
|
{
|
1121
|
-
git_repository_init_options opts;
|
1284
|
+
git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
|
1122
1285
|
|
1123
|
-
memset(&opts, 0, sizeof(opts));
|
1124
1286
|
opts.flags = GIT_REPOSITORY_INIT_MKPATH; /* don't love this default */
|
1125
1287
|
if (is_bare)
|
1126
1288
|
opts.flags |= GIT_REPOSITORY_INIT_BARE;
|
@@ -1129,14 +1291,16 @@ int git_repository_init(
|
|
1129
1291
|
}
|
1130
1292
|
|
1131
1293
|
int git_repository_init_ext(
|
1132
|
-
git_repository **
|
1294
|
+
git_repository **out,
|
1133
1295
|
const char *given_repo,
|
1134
1296
|
git_repository_init_options *opts)
|
1135
1297
|
{
|
1136
1298
|
int error;
|
1137
1299
|
git_buf repo_path = GIT_BUF_INIT, wd_path = GIT_BUF_INIT;
|
1138
1300
|
|
1139
|
-
assert(
|
1301
|
+
assert(out && given_repo && opts);
|
1302
|
+
|
1303
|
+
GITERR_CHECK_VERSION(opts, GIT_REPOSITORY_INIT_OPTIONS_VERSION, "git_repository_init_options");
|
1140
1304
|
|
1141
1305
|
error = repo_init_directories(&repo_path, &wd_path, given_repo, opts);
|
1142
1306
|
if (error < 0)
|
@@ -1169,10 +1333,10 @@ int git_repository_init_ext(
|
|
1169
1333
|
if (error < 0)
|
1170
1334
|
goto cleanup;
|
1171
1335
|
|
1172
|
-
error = git_repository_open(
|
1336
|
+
error = git_repository_open(out, git_buf_cstr(&repo_path));
|
1173
1337
|
|
1174
1338
|
if (!error && opts->origin_url)
|
1175
|
-
error = repo_init_create_origin(*
|
1339
|
+
error = repo_init_create_origin(*out, opts->origin_url);
|
1176
1340
|
|
1177
1341
|
cleanup:
|
1178
1342
|
git_buf_free(&repo_path);
|
@@ -1198,7 +1362,7 @@ int git_repository_head_detached(git_repository *repo)
|
|
1198
1362
|
return 0;
|
1199
1363
|
}
|
1200
1364
|
|
1201
|
-
exists = git_odb_exists(odb,
|
1365
|
+
exists = git_odb_exists(odb, git_reference_target(ref));
|
1202
1366
|
|
1203
1367
|
git_reference_free(ref);
|
1204
1368
|
return exists;
|
@@ -1206,9 +1370,19 @@ int git_repository_head_detached(git_repository *repo)
|
|
1206
1370
|
|
1207
1371
|
int git_repository_head(git_reference **head_out, git_repository *repo)
|
1208
1372
|
{
|
1373
|
+
git_reference *head;
|
1209
1374
|
int error;
|
1210
1375
|
|
1211
|
-
error =
|
1376
|
+
if ((error = git_reference_lookup(&head, repo, GIT_HEAD_FILE)) < 0)
|
1377
|
+
return error;
|
1378
|
+
|
1379
|
+
if (git_reference_type(head) == GIT_REF_OID) {
|
1380
|
+
*head_out = head;
|
1381
|
+
return 0;
|
1382
|
+
}
|
1383
|
+
|
1384
|
+
error = git_reference_lookup_resolved(head_out, repo, git_reference_symbolic_target(head), -1);
|
1385
|
+
git_reference_free(head);
|
1212
1386
|
|
1213
1387
|
return error == GIT_ENOTFOUND ? GIT_EORPHANEDHEAD : error;
|
1214
1388
|
}
|
@@ -1230,36 +1404,47 @@ int git_repository_head_orphan(git_repository *repo)
|
|
1230
1404
|
return 0;
|
1231
1405
|
}
|
1232
1406
|
|
1407
|
+
static int at_least_one_cb(const char *refname, void *payload)
|
1408
|
+
{
|
1409
|
+
GIT_UNUSED(refname);
|
1410
|
+
GIT_UNUSED(payload);
|
1411
|
+
|
1412
|
+
return GIT_EUSER;
|
1413
|
+
}
|
1414
|
+
|
1415
|
+
static int repo_contains_no_reference(git_repository *repo)
|
1416
|
+
{
|
1417
|
+
int error;
|
1418
|
+
|
1419
|
+
error = git_reference_foreach(repo, GIT_REF_LISTALL, at_least_one_cb, NULL);
|
1420
|
+
|
1421
|
+
if (error == GIT_EUSER)
|
1422
|
+
return 0;
|
1423
|
+
|
1424
|
+
return error == 0 ? 1 : error;
|
1425
|
+
}
|
1426
|
+
|
1233
1427
|
int git_repository_is_empty(git_repository *repo)
|
1234
1428
|
{
|
1235
|
-
git_reference *head = NULL
|
1429
|
+
git_reference *head = NULL;
|
1236
1430
|
int error;
|
1237
1431
|
|
1238
1432
|
if (git_reference_lookup(&head, repo, GIT_HEAD_FILE) < 0)
|
1239
1433
|
return -1;
|
1240
1434
|
|
1241
|
-
if (git_reference_type(head)
|
1242
|
-
|
1243
|
-
return 0;
|
1244
|
-
}
|
1435
|
+
if (!(error = git_reference_type(head) == GIT_REF_SYMBOLIC))
|
1436
|
+
goto cleanup;
|
1245
1437
|
|
1246
|
-
if (
|
1247
|
-
|
1248
|
-
|
1249
|
-
|
1438
|
+
if (!(error = strcmp(
|
1439
|
+
git_reference_symbolic_target(head),
|
1440
|
+
GIT_REFS_HEADS_DIR "master") == 0))
|
1441
|
+
goto cleanup;
|
1250
1442
|
|
1251
|
-
error =
|
1443
|
+
error = repo_contains_no_reference(repo);
|
1252
1444
|
|
1445
|
+
cleanup:
|
1253
1446
|
git_reference_free(head);
|
1254
|
-
|
1255
|
-
|
1256
|
-
if (error == GIT_ENOTFOUND)
|
1257
|
-
return 1;
|
1258
|
-
|
1259
|
-
if (error < 0)
|
1260
|
-
return -1;
|
1261
|
-
|
1262
|
-
return 0;
|
1447
|
+
return error < 0 ? -1 : error;
|
1263
1448
|
}
|
1264
1449
|
|
1265
1450
|
const char *git_repository_path(git_repository *repo)
|
@@ -1302,7 +1487,7 @@ int git_repository_set_workdir(
|
|
1302
1487
|
|
1303
1488
|
/* passthrough error means gitlink is unnecessary */
|
1304
1489
|
if (error == GIT_PASSTHROUGH)
|
1305
|
-
error =
|
1490
|
+
error = git_config_delete_entry(config, "core.worktree");
|
1306
1491
|
else if (!error)
|
1307
1492
|
error = git_config_set_string(config, "core.worktree", path.ptr);
|
1308
1493
|
|
@@ -1330,25 +1515,22 @@ int git_repository_is_bare(git_repository *repo)
|
|
1330
1515
|
|
1331
1516
|
int git_repository_head_tree(git_tree **tree, git_repository *repo)
|
1332
1517
|
{
|
1333
|
-
|
1334
|
-
git_object *obj
|
1518
|
+
git_reference *head;
|
1519
|
+
git_object *obj;
|
1520
|
+
int error;
|
1335
1521
|
|
1336
|
-
if (
|
1337
|
-
|
1338
|
-
giterr_clear();
|
1339
|
-
*tree = NULL;
|
1340
|
-
return 0;
|
1341
|
-
}
|
1522
|
+
if ((error = git_repository_head(&head, repo)) < 0)
|
1523
|
+
return error;
|
1342
1524
|
|
1343
|
-
if (
|
1344
|
-
|
1345
|
-
return -1;
|
1525
|
+
if ((error = git_reference_peel(&obj, head, GIT_OBJ_TREE)) < 0)
|
1526
|
+
goto cleanup;
|
1346
1527
|
|
1347
1528
|
*tree = (git_tree *)obj;
|
1348
|
-
return 0;
|
1349
|
-
}
|
1350
1529
|
|
1351
|
-
|
1530
|
+
cleanup:
|
1531
|
+
git_reference_free(head);
|
1532
|
+
return error;
|
1533
|
+
}
|
1352
1534
|
|
1353
1535
|
int git_repository_message(char *buffer, size_t len, git_repository *repo)
|
1354
1536
|
{
|
@@ -1356,7 +1538,7 @@ int git_repository_message(char *buffer, size_t len, git_repository *repo)
|
|
1356
1538
|
struct stat st;
|
1357
1539
|
int error;
|
1358
1540
|
|
1359
|
-
if (git_buf_joinpath(&path, repo->path_repository,
|
1541
|
+
if (git_buf_joinpath(&path, repo->path_repository, GIT_MERGE_MSG_FILE) < 0)
|
1360
1542
|
return -1;
|
1361
1543
|
|
1362
1544
|
if ((error = p_stat(git_buf_cstr(&path), &st)) < 0) {
|
@@ -1382,7 +1564,7 @@ int git_repository_message_remove(git_repository *repo)
|
|
1382
1564
|
git_buf path = GIT_BUF_INIT;
|
1383
1565
|
int error;
|
1384
1566
|
|
1385
|
-
if (git_buf_joinpath(&path, repo->path_repository,
|
1567
|
+
if (git_buf_joinpath(&path, repo->path_repository, GIT_MERGE_MSG_FILE) < 0)
|
1386
1568
|
return -1;
|
1387
1569
|
|
1388
1570
|
error = p_unlink(git_buf_cstr(&path));
|
@@ -1480,11 +1662,11 @@ int git_repository_set_head(
|
|
1480
1662
|
|
1481
1663
|
if (!error) {
|
1482
1664
|
if (git_reference_is_branch(ref))
|
1483
|
-
error =
|
1665
|
+
error = git_reference_symbolic_create(&new_head, repo, GIT_HEAD_FILE, git_reference_name(ref), 1);
|
1484
1666
|
else
|
1485
|
-
error = git_repository_set_head_detached(repo,
|
1667
|
+
error = git_repository_set_head_detached(repo, git_reference_target(ref));
|
1486
1668
|
} else if (looks_like_a_branch(refname))
|
1487
|
-
error =
|
1669
|
+
error = git_reference_symbolic_create(&new_head, repo, GIT_HEAD_FILE, refname, 1);
|
1488
1670
|
|
1489
1671
|
git_reference_free(ref);
|
1490
1672
|
git_reference_free(new_head);
|
@@ -1508,7 +1690,7 @@ int git_repository_set_head_detached(
|
|
1508
1690
|
if ((error = git_object_peel(&peeled, object, GIT_OBJ_COMMIT)) < 0)
|
1509
1691
|
goto cleanup;
|
1510
1692
|
|
1511
|
-
error =
|
1693
|
+
error = git_reference_create(&new_head, repo, GIT_HEAD_FILE, git_object_id(peeled), 1);
|
1512
1694
|
|
1513
1695
|
cleanup:
|
1514
1696
|
git_object_free(object);
|
@@ -1530,10 +1712,10 @@ int git_repository_detach_head(
|
|
1530
1712
|
if ((error = git_repository_head(&old_head, repo)) < 0)
|
1531
1713
|
return error;
|
1532
1714
|
|
1533
|
-
if ((error = git_object_lookup(&object, repo,
|
1715
|
+
if ((error = git_object_lookup(&object, repo, git_reference_target(old_head), GIT_OBJ_COMMIT)) < 0)
|
1534
1716
|
goto cleanup;
|
1535
1717
|
|
1536
|
-
error =
|
1718
|
+
error = git_reference_create(&new_head, repo, GIT_HEAD_FILE, git_reference_target(old_head), 1);
|
1537
1719
|
|
1538
1720
|
cleanup:
|
1539
1721
|
git_object_free(object);
|
@@ -1541,3 +1723,40 @@ cleanup:
|
|
1541
1723
|
git_reference_free(new_head);
|
1542
1724
|
return error;
|
1543
1725
|
}
|
1726
|
+
|
1727
|
+
/**
|
1728
|
+
* Loosely ported from git.git
|
1729
|
+
* https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh#L198-289
|
1730
|
+
*/
|
1731
|
+
int git_repository_state(git_repository *repo)
|
1732
|
+
{
|
1733
|
+
git_buf repo_path = GIT_BUF_INIT;
|
1734
|
+
int state = GIT_REPOSITORY_STATE_NONE;
|
1735
|
+
|
1736
|
+
assert(repo);
|
1737
|
+
|
1738
|
+
if (git_buf_puts(&repo_path, repo->path_repository) < 0)
|
1739
|
+
return -1;
|
1740
|
+
|
1741
|
+
if (git_path_contains_file(&repo_path, GIT_REBASE_MERGE_INTERACTIVE_FILE))
|
1742
|
+
state = GIT_REPOSITORY_STATE_REBASE_INTERACTIVE;
|
1743
|
+
else if (git_path_contains_dir(&repo_path, GIT_REBASE_MERGE_DIR))
|
1744
|
+
state = GIT_REPOSITORY_STATE_REBASE_MERGE;
|
1745
|
+
else if (git_path_contains_file(&repo_path, GIT_REBASE_APPLY_REBASING_FILE))
|
1746
|
+
state = GIT_REPOSITORY_STATE_REBASE;
|
1747
|
+
else if (git_path_contains_file(&repo_path, GIT_REBASE_APPLY_APPLYING_FILE))
|
1748
|
+
state = GIT_REPOSITORY_STATE_APPLY_MAILBOX;
|
1749
|
+
else if (git_path_contains_dir(&repo_path, GIT_REBASE_APPLY_DIR))
|
1750
|
+
state = GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE;
|
1751
|
+
else if (git_path_contains_file(&repo_path, GIT_MERGE_HEAD_FILE))
|
1752
|
+
state = GIT_REPOSITORY_STATE_MERGE;
|
1753
|
+
else if(git_path_contains_file(&repo_path, GIT_REVERT_HEAD_FILE))
|
1754
|
+
state = GIT_REPOSITORY_STATE_REVERT;
|
1755
|
+
else if(git_path_contains_file(&repo_path, GIT_CHERRY_PICK_HEAD_FILE))
|
1756
|
+
state = GIT_REPOSITORY_STATE_CHERRY_PICK;
|
1757
|
+
else if(git_path_contains_file(&repo_path, GIT_BISECT_LOG_FILE))
|
1758
|
+
state = GIT_REPOSITORY_STATE_BISECT;
|
1759
|
+
|
1760
|
+
git_buf_free(&repo_path);
|
1761
|
+
return state;
|
1762
|
+
}
|