rugged 1.5.1 → 1.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/rugged/extconf.rb +2 -2
- data/ext/rugged/rugged_blame.c +2 -0
- data/ext/rugged/rugged_blob.c +3 -0
- data/ext/rugged/rugged_commit.c +1 -0
- data/ext/rugged/rugged_config.c +2 -0
- data/ext/rugged/rugged_diff.c +1 -0
- data/ext/rugged/rugged_index.c +2 -0
- data/ext/rugged/rugged_patch.c +1 -0
- data/ext/rugged/rugged_rebase.c +1 -0
- data/ext/rugged/rugged_reference.c +1 -0
- data/ext/rugged/rugged_remote.c +1 -0
- data/ext/rugged/rugged_repo.c +5 -2
- data/ext/rugged/rugged_revwalk.c +5 -1
- data/ext/rugged/rugged_submodule.c +1 -0
- data/ext/rugged/rugged_tag.c +1 -0
- data/ext/rugged/rugged_tree.c +4 -0
- data/lib/rugged/index.rb +1 -1
- data/lib/rugged/tree.rb +1 -1
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +5 -1
- data/vendor/libgit2/COPYING +30 -0
- data/vendor/libgit2/cmake/ExperimentalFeatures.cmake +23 -0
- data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +2 -0
- data/vendor/libgit2/include/git2/common.h +13 -6
- data/vendor/libgit2/include/git2/deprecated.h +6 -0
- data/vendor/libgit2/include/git2/diff.h +1 -1
- data/vendor/libgit2/include/git2/experimental.h +20 -0
- data/vendor/libgit2/include/git2/indexer.h +29 -0
- data/vendor/libgit2/include/git2/object.h +28 -2
- data/vendor/libgit2/include/git2/odb.h +58 -7
- data/vendor/libgit2/include/git2/odb_backend.h +106 -18
- data/vendor/libgit2/include/git2/oid.h +115 -15
- data/vendor/libgit2/include/git2/repository.h +20 -1
- data/vendor/libgit2/include/git2/stash.h +60 -6
- data/vendor/libgit2/include/git2/strarray.h +0 -13
- data/vendor/libgit2/include/git2/sys/odb_backend.h +1 -1
- data/vendor/libgit2/include/git2/sys/transport.h +12 -0
- data/vendor/libgit2/include/git2/version.h +4 -4
- data/vendor/libgit2/include/git2.h +1 -0
- data/vendor/libgit2/src/CMakeLists.txt +0 -6
- data/vendor/libgit2/src/cli/CMakeLists.txt +5 -2
- data/vendor/libgit2/src/cli/cmd_hash_object.c +27 -8
- data/vendor/libgit2/src/cli/opt.c +1 -1
- data/vendor/libgit2/src/libgit2/CMakeLists.txt +24 -15
- data/vendor/libgit2/src/libgit2/annotated_commit.c +1 -1
- data/vendor/libgit2/src/libgit2/annotated_commit.h +1 -1
- data/vendor/libgit2/src/libgit2/attr_file.c +1 -1
- data/vendor/libgit2/src/libgit2/attrcache.c +1 -1
- data/vendor/libgit2/src/libgit2/blame.c +2 -0
- data/vendor/libgit2/src/libgit2/blob.c +4 -2
- data/vendor/libgit2/src/libgit2/blob.h +2 -2
- data/vendor/libgit2/src/libgit2/branch.c +2 -2
- data/vendor/libgit2/src/libgit2/cherrypick.c +3 -3
- data/vendor/libgit2/src/libgit2/clone.c +31 -2
- data/vendor/libgit2/src/libgit2/commit.c +52 -17
- data/vendor/libgit2/src/libgit2/commit.h +25 -7
- data/vendor/libgit2/src/libgit2/commit_graph.c +47 -32
- data/vendor/libgit2/src/libgit2/commit_graph.h +3 -0
- data/vendor/libgit2/src/libgit2/commit_list.c +6 -2
- data/vendor/libgit2/src/libgit2/config.c +1 -1
- data/vendor/libgit2/src/libgit2/config_file.c +2 -2
- data/vendor/libgit2/src/libgit2/describe.c +8 -8
- data/vendor/libgit2/src/libgit2/diff.c +5 -1
- data/vendor/libgit2/src/libgit2/diff_file.c +15 -6
- data/vendor/libgit2/src/libgit2/diff_generate.c +17 -12
- data/vendor/libgit2/src/libgit2/diff_print.c +5 -5
- data/vendor/libgit2/src/libgit2/diff_tform.c +4 -0
- data/vendor/libgit2/src/libgit2/email.c +2 -2
- data/vendor/libgit2/src/libgit2/experimental.h.in +13 -0
- data/vendor/libgit2/src/libgit2/fetch.c +3 -6
- data/vendor/libgit2/src/libgit2/fetchhead.c +4 -4
- data/vendor/libgit2/src/libgit2/ident.c +3 -3
- data/vendor/libgit2/src/libgit2/index.c +13 -12
- data/vendor/libgit2/src/libgit2/indexer.c +107 -44
- data/vendor/libgit2/src/libgit2/iterator.c +4 -2
- data/vendor/libgit2/src/libgit2/libgit2.c +19 -0
- data/vendor/libgit2/src/libgit2/merge.c +3 -3
- data/vendor/libgit2/src/libgit2/midx.c +16 -15
- data/vendor/libgit2/src/libgit2/mwindow.c +5 -2
- data/vendor/libgit2/src/libgit2/mwindow.h +4 -1
- data/vendor/libgit2/src/libgit2/notes.c +5 -5
- data/vendor/libgit2/src/libgit2/object.c +89 -25
- data/vendor/libgit2/src/libgit2/object.h +12 -3
- data/vendor/libgit2/src/libgit2/odb.c +213 -50
- data/vendor/libgit2/src/libgit2/odb.h +43 -4
- data/vendor/libgit2/src/libgit2/odb_loose.c +128 -70
- data/vendor/libgit2/src/libgit2/odb_pack.c +96 -44
- data/vendor/libgit2/src/libgit2/oid.c +134 -76
- data/vendor/libgit2/src/libgit2/oid.h +183 -9
- data/vendor/libgit2/src/libgit2/pack-objects.c +15 -4
- data/vendor/libgit2/src/libgit2/pack.c +92 -69
- data/vendor/libgit2/src/libgit2/pack.h +29 -15
- data/vendor/libgit2/src/libgit2/parse.c +4 -3
- data/vendor/libgit2/src/libgit2/patch_parse.c +5 -5
- data/vendor/libgit2/src/libgit2/push.c +13 -3
- data/vendor/libgit2/src/libgit2/reader.c +1 -1
- data/vendor/libgit2/src/libgit2/rebase.c +19 -18
- data/vendor/libgit2/src/libgit2/refdb_fs.c +70 -39
- data/vendor/libgit2/src/libgit2/reflog.c +7 -5
- data/vendor/libgit2/src/libgit2/reflog.h +1 -2
- data/vendor/libgit2/src/libgit2/refs.c +2 -0
- data/vendor/libgit2/src/libgit2/remote.c +38 -37
- data/vendor/libgit2/src/libgit2/remote.h +40 -0
- data/vendor/libgit2/src/libgit2/repository.c +212 -36
- data/vendor/libgit2/src/libgit2/repository.h +9 -0
- data/vendor/libgit2/src/libgit2/reset.c +2 -2
- data/vendor/libgit2/src/libgit2/revert.c +4 -4
- data/vendor/libgit2/src/libgit2/revparse.c +23 -7
- data/vendor/libgit2/src/libgit2/revwalk.c +5 -1
- data/vendor/libgit2/src/libgit2/stash.c +201 -26
- data/vendor/libgit2/src/libgit2/strarray.c +1 -0
- data/vendor/libgit2/src/libgit2/strarray.h +25 -0
- data/vendor/libgit2/src/libgit2/streams/openssl.c +1 -1
- data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +7 -3
- data/vendor/libgit2/src/libgit2/streams/socket.c +4 -1
- data/vendor/libgit2/src/libgit2/submodule.c +6 -2
- data/vendor/libgit2/src/libgit2/sysdir.c +294 -7
- data/vendor/libgit2/src/libgit2/sysdir.h +41 -9
- data/vendor/libgit2/src/libgit2/tag.c +29 -10
- data/vendor/libgit2/src/libgit2/tag.h +2 -2
- data/vendor/libgit2/src/libgit2/threadstate.h +1 -1
- data/vendor/libgit2/src/libgit2/transports/http.c +8 -7
- data/vendor/libgit2/src/libgit2/transports/httpclient.c +9 -0
- data/vendor/libgit2/src/libgit2/transports/httpclient.h +10 -0
- data/vendor/libgit2/src/libgit2/transports/local.c +14 -0
- data/vendor/libgit2/src/libgit2/transports/smart.c +35 -0
- data/vendor/libgit2/src/libgit2/transports/smart.h +10 -1
- data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +153 -41
- data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +42 -12
- data/vendor/libgit2/src/libgit2/transports/ssh.c +62 -65
- data/vendor/libgit2/src/libgit2/transports/winhttp.c +9 -4
- data/vendor/libgit2/src/libgit2/tree-cache.c +4 -4
- data/vendor/libgit2/src/libgit2/tree.c +22 -16
- data/vendor/libgit2/src/libgit2/tree.h +2 -2
- data/vendor/libgit2/src/libgit2/worktree.c +5 -0
- data/vendor/libgit2/src/util/CMakeLists.txt +6 -1
- data/vendor/libgit2/src/util/fs_path.c +1 -1
- data/vendor/libgit2/src/util/futils.c +0 -3
- data/vendor/libgit2/src/util/git2_util.h +2 -2
- data/vendor/libgit2/src/util/hash/openssl.c +4 -3
- data/vendor/libgit2/src/util/hash/rfc6234/sha.h +0 -112
- data/vendor/libgit2/src/util/hash.h +13 -0
- data/vendor/libgit2/src/util/net.c +338 -84
- data/vendor/libgit2/src/util/net.h +7 -0
- data/vendor/libgit2/src/util/posix.h +2 -0
- data/vendor/libgit2/src/util/rand.c +4 -0
- data/vendor/libgit2/src/util/regexp.c +3 -3
- data/vendor/libgit2/src/util/thread.h +20 -19
- data/vendor/libgit2/src/util/util.h +1 -0
- metadata +7 -5
- data/vendor/libgit2/src/util/win32/findfile.c +0 -286
- data/vendor/libgit2/src/util/win32/findfile.h +0 -22
- /data/vendor/libgit2/src/{features.h.in → util/git2_features.h.in} +0 -0
@@ -181,7 +181,8 @@ GIT_INLINE(int) rebase_readoid(
|
|
181
181
|
if ((error = rebase_readfile(str_out, state_path, filename)) < 0)
|
182
182
|
return error;
|
183
183
|
|
184
|
-
if (str_out->size !=
|
184
|
+
if (str_out->size != GIT_OID_SHA1_HEXSIZE ||
|
185
|
+
git_oid__fromstr(out, str_out->ptr, GIT_OID_SHA1) < 0) {
|
185
186
|
git_error_set(GIT_ERROR_REBASE, "the file '%s' contains an invalid object ID", filename);
|
186
187
|
return -1;
|
187
188
|
}
|
@@ -363,7 +364,7 @@ int git_rebase_open(
|
|
363
364
|
|
364
365
|
git_str_rtrim(&orig_head_id);
|
365
366
|
|
366
|
-
if ((error =
|
367
|
+
if ((error = git_oid__fromstr(&rebase->orig_head_id, orig_head_id.ptr, GIT_OID_SHA1)) < 0)
|
367
368
|
goto done;
|
368
369
|
|
369
370
|
git_str_truncate(&path, state_path_len);
|
@@ -374,7 +375,7 @@ int git_rebase_open(
|
|
374
375
|
|
375
376
|
git_str_rtrim(&onto_id);
|
376
377
|
|
377
|
-
if ((error =
|
378
|
+
if ((error = git_oid__fromstr(&rebase->onto_id, onto_id.ptr, GIT_OID_SHA1)) < 0)
|
378
379
|
goto done;
|
379
380
|
|
380
381
|
if (!rebase->head_detached)
|
@@ -452,7 +453,7 @@ static const char *rebase_onto_name(const git_annotated_commit *onto)
|
|
452
453
|
static int rebase_setupfiles_merge(git_rebase *rebase)
|
453
454
|
{
|
454
455
|
git_str commit_filename = GIT_STR_INIT;
|
455
|
-
char id_str[
|
456
|
+
char id_str[GIT_OID_SHA1_HEXSIZE];
|
456
457
|
git_rebase_operation *operation;
|
457
458
|
size_t i;
|
458
459
|
int error = 0;
|
@@ -470,7 +471,7 @@ static int rebase_setupfiles_merge(git_rebase *rebase)
|
|
470
471
|
git_oid_fmt(id_str, &operation->id);
|
471
472
|
|
472
473
|
if ((error = rebase_setupfile(rebase, commit_filename.ptr, 0,
|
473
|
-
"%.*s\n",
|
474
|
+
"%.*s\n", GIT_OID_SHA1_HEXSIZE, id_str)) < 0)
|
474
475
|
goto done;
|
475
476
|
}
|
476
477
|
|
@@ -481,7 +482,7 @@ done:
|
|
481
482
|
|
482
483
|
static int rebase_setupfiles(git_rebase *rebase)
|
483
484
|
{
|
484
|
-
char onto[
|
485
|
+
char onto[GIT_OID_SHA1_HEXSIZE], orig_head[GIT_OID_SHA1_HEXSIZE];
|
485
486
|
const char *orig_head_name;
|
486
487
|
|
487
488
|
git_oid_fmt(onto, &rebase->onto_id);
|
@@ -497,8 +498,8 @@ static int rebase_setupfiles(git_rebase *rebase)
|
|
497
498
|
|
498
499
|
if (git_repository__set_orig_head(rebase->repo, &rebase->orig_head_id) < 0 ||
|
499
500
|
rebase_setupfile(rebase, HEAD_NAME_FILE, 0, "%s\n", orig_head_name) < 0 ||
|
500
|
-
rebase_setupfile(rebase, ONTO_FILE, 0, "%.*s\n",
|
501
|
-
rebase_setupfile(rebase, ORIG_HEAD_FILE, 0, "%.*s\n",
|
501
|
+
rebase_setupfile(rebase, ONTO_FILE, 0, "%.*s\n", GIT_OID_SHA1_HEXSIZE, onto) < 0 ||
|
502
|
+
rebase_setupfile(rebase, ORIG_HEAD_FILE, 0, "%.*s\n", GIT_OID_SHA1_HEXSIZE, orig_head) < 0 ||
|
502
503
|
rebase_setupfile(rebase, QUIET_FILE, 0, rebase->quiet ? "t\n" : "\n") < 0)
|
503
504
|
return -1;
|
504
505
|
|
@@ -813,7 +814,7 @@ static int rebase_next_merge(
|
|
813
814
|
git_indexwriter indexwriter = GIT_INDEXWRITER_INIT;
|
814
815
|
git_rebase_operation *operation;
|
815
816
|
git_checkout_options checkout_opts;
|
816
|
-
char current_idstr[
|
817
|
+
char current_idstr[GIT_OID_SHA1_HEXSIZE];
|
817
818
|
unsigned int parent_count;
|
818
819
|
int error;
|
819
820
|
|
@@ -842,7 +843,7 @@ static int rebase_next_merge(
|
|
842
843
|
|
843
844
|
if ((error = git_indexwriter_init_for_operation(&indexwriter, rebase->repo, &checkout_opts.checkout_strategy)) < 0 ||
|
844
845
|
(error = rebase_setupfile(rebase, MSGNUM_FILE, 0, "%" PRIuZ "\n", rebase->current+1)) < 0 ||
|
845
|
-
(error = rebase_setupfile(rebase, CURRENT_FILE, 0, "%.*s\n",
|
846
|
+
(error = rebase_setupfile(rebase, CURRENT_FILE, 0, "%.*s\n", GIT_OID_SHA1_HEXSIZE, current_idstr)) < 0 ||
|
846
847
|
(error = git_merge_trees(&index, rebase->repo, parent_tree, head_tree, current_tree, &rebase->options.merge_options)) < 0 ||
|
847
848
|
(error = git_merge__check_result(rebase->repo, index)) < 0 ||
|
848
849
|
(error = git_checkout_index(rebase->repo, index, &checkout_opts)) < 0 ||
|
@@ -1102,7 +1103,7 @@ static int rebase_commit_merge(
|
|
1102
1103
|
git_reference *head = NULL;
|
1103
1104
|
git_commit *head_commit = NULL, *commit = NULL;
|
1104
1105
|
git_index *index = NULL;
|
1105
|
-
char old_idstr[
|
1106
|
+
char old_idstr[GIT_OID_SHA1_HEXSIZE], new_idstr[GIT_OID_SHA1_HEXSIZE];
|
1106
1107
|
int error;
|
1107
1108
|
|
1108
1109
|
operation = git_array_get(rebase->operations, rebase->current);
|
@@ -1122,7 +1123,7 @@ static int rebase_commit_merge(
|
|
1122
1123
|
git_oid_fmt(new_idstr, git_commit_id(commit));
|
1123
1124
|
|
1124
1125
|
if ((error = rebase_setupfile(rebase, REWRITTEN_FILE, O_CREAT|O_WRONLY|O_APPEND,
|
1125
|
-
"%.*s %.*s\n",
|
1126
|
+
"%.*s %.*s\n", GIT_OID_SHA1_HEXSIZE, old_idstr, GIT_OID_SHA1_HEXSIZE, new_idstr)) < 0)
|
1126
1127
|
goto done;
|
1127
1128
|
|
1128
1129
|
git_oid_cpy(commit_id, git_commit_id(commit));
|
@@ -1341,10 +1342,10 @@ static int rebase_copy_notes(
|
|
1341
1342
|
tostr = end+1;
|
1342
1343
|
*end = '\0';
|
1343
1344
|
|
1344
|
-
if (strlen(fromstr) !=
|
1345
|
-
strlen(tostr) !=
|
1346
|
-
|
1347
|
-
|
1345
|
+
if (strlen(fromstr) != GIT_OID_SHA1_HEXSIZE ||
|
1346
|
+
strlen(tostr) != GIT_OID_SHA1_HEXSIZE ||
|
1347
|
+
git_oid__fromstr(&from, fromstr, GIT_OID_SHA1) < 0 ||
|
1348
|
+
git_oid__fromstr(&to, tostr, GIT_OID_SHA1) < 0)
|
1348
1349
|
goto on_error;
|
1349
1350
|
|
1350
1351
|
if ((error = rebase_copy_note(rebase, notes_ref.ptr, &from, &to, committer)) < 0)
|
@@ -1372,14 +1373,14 @@ static int return_to_orig_head(git_rebase *rebase)
|
|
1372
1373
|
git_reference *terminal_ref = NULL, *branch_ref = NULL, *head_ref = NULL;
|
1373
1374
|
git_commit *terminal_commit = NULL;
|
1374
1375
|
git_str branch_msg = GIT_STR_INIT, head_msg = GIT_STR_INIT;
|
1375
|
-
char onto[
|
1376
|
+
char onto[GIT_OID_SHA1_HEXSIZE];
|
1376
1377
|
int error = 0;
|
1377
1378
|
|
1378
1379
|
git_oid_fmt(onto, &rebase->onto_id);
|
1379
1380
|
|
1380
1381
|
if ((error = git_str_printf(&branch_msg,
|
1381
1382
|
"rebase finished: %s onto %.*s",
|
1382
|
-
rebase->orig_head_name,
|
1383
|
+
rebase->orig_head_name, GIT_OID_SHA1_HEXSIZE, onto)) == 0 &&
|
1383
1384
|
(error = git_str_printf(&head_msg,
|
1384
1385
|
"rebase finished: returning to %s",
|
1385
1386
|
rebase->orig_head_name)) == 0 &&
|
@@ -60,15 +60,17 @@ typedef struct refdb_fs_backend {
|
|
60
60
|
/* path to common objects' directory */
|
61
61
|
char *commonpath;
|
62
62
|
|
63
|
-
|
63
|
+
git_oid_t oid_type;
|
64
|
+
|
65
|
+
int fsync : 1,
|
66
|
+
sorted : 1;
|
64
67
|
int peeling_mode;
|
65
68
|
git_iterator_flag_t iterator_flags;
|
66
69
|
uint32_t direach_flags;
|
67
|
-
|
70
|
+
git_sortedcache *refcache;
|
68
71
|
git_map packed_refs_map;
|
69
72
|
git_mutex prlock; /* protect packed_refs_map */
|
70
73
|
git_futils_filestamp packed_refs_stamp;
|
71
|
-
bool sorted;
|
72
74
|
} refdb_fs_backend;
|
73
75
|
|
74
76
|
static int refdb_reflog_fs__delete(git_refdb_backend *_backend, const char *name);
|
@@ -113,6 +115,7 @@ static int packed_reload(refdb_fs_backend *backend)
|
|
113
115
|
{
|
114
116
|
int error;
|
115
117
|
git_str packedrefs = GIT_STR_INIT;
|
118
|
+
size_t oid_hexsize = git_oid_hexsize(backend->oid_type);
|
116
119
|
char *scan, *eof, *eol;
|
117
120
|
|
118
121
|
if (!backend->gitpath)
|
@@ -158,9 +161,9 @@ static int packed_reload(refdb_fs_backend *backend)
|
|
158
161
|
|
159
162
|
/* parse "<OID> <refname>\n" */
|
160
163
|
|
161
|
-
if (
|
164
|
+
if (git_oid__fromstr(&oid, scan, backend->oid_type) < 0)
|
162
165
|
goto parse_failed;
|
163
|
-
scan +=
|
166
|
+
scan += oid_hexsize;
|
164
167
|
|
165
168
|
if (*scan++ != ' ')
|
166
169
|
goto parse_failed;
|
@@ -179,9 +182,9 @@ static int packed_reload(refdb_fs_backend *backend)
|
|
179
182
|
/* look for optional "^<OID>\n" */
|
180
183
|
|
181
184
|
if (*scan == '^') {
|
182
|
-
if (
|
185
|
+
if (git_oid__fromstr(&oid, scan + 1, backend->oid_type) < 0)
|
183
186
|
goto parse_failed;
|
184
|
-
scan +=
|
187
|
+
scan += oid_hexsize + 1;
|
185
188
|
|
186
189
|
if (scan < eof) {
|
187
190
|
if (!(eol = strchr(scan, '\n')))
|
@@ -214,19 +217,23 @@ parse_failed:
|
|
214
217
|
}
|
215
218
|
|
216
219
|
static int loose_parse_oid(
|
217
|
-
git_oid *oid,
|
220
|
+
git_oid *oid,
|
221
|
+
const char *filename,
|
222
|
+
git_str *file_content,
|
223
|
+
git_oid_t oid_type)
|
218
224
|
{
|
219
225
|
const char *str = git_str_cstr(file_content);
|
226
|
+
size_t oid_hexsize = git_oid_hexsize(oid_type);
|
220
227
|
|
221
|
-
if (git_str_len(file_content) <
|
228
|
+
if (git_str_len(file_content) < oid_hexsize)
|
222
229
|
goto corrupted;
|
223
230
|
|
224
231
|
/* we need to get 40 OID characters from the file */
|
225
|
-
if (
|
232
|
+
if (git_oid__fromstr(oid, str, oid_type) < 0)
|
226
233
|
goto corrupted;
|
227
234
|
|
228
235
|
/* If the file is longer than 40 chars, the 41st must be a space */
|
229
|
-
str +=
|
236
|
+
str += oid_hexsize;
|
230
237
|
if (*str == '\0' || git__isspace(*str))
|
231
238
|
return 0;
|
232
239
|
|
@@ -266,7 +273,7 @@ static int loose_lookup_to_packfile(refdb_fs_backend *backend, const char *name)
|
|
266
273
|
goto done;
|
267
274
|
|
268
275
|
/* parse OID from file */
|
269
|
-
if ((error = loose_parse_oid(&oid, name, &ref_file)) < 0)
|
276
|
+
if ((error = loose_parse_oid(&oid, name, &ref_file, backend->oid_type)) < 0)
|
270
277
|
goto done;
|
271
278
|
|
272
279
|
if ((error = git_sortedcache_wlock(backend->refcache)) < 0)
|
@@ -437,7 +444,7 @@ static int loose_lookup(
|
|
437
444
|
} else {
|
438
445
|
git_oid oid;
|
439
446
|
|
440
|
-
if (!(error = loose_parse_oid(&oid, ref_name, &ref_file)) &&
|
447
|
+
if (!(error = loose_parse_oid(&oid, ref_name, &ref_file, backend->oid_type)) &&
|
441
448
|
out != NULL)
|
442
449
|
*out = git_reference__alloc(ref_name, &oid, NULL);
|
443
450
|
}
|
@@ -615,19 +622,24 @@ static const char *end_of_record(const char *p, const char *end)
|
|
615
622
|
return p;
|
616
623
|
}
|
617
624
|
|
618
|
-
static int
|
619
|
-
|
625
|
+
static int cmp_record_to_refname(
|
626
|
+
const char *rec,
|
627
|
+
size_t data_end,
|
628
|
+
const char *ref_name,
|
629
|
+
git_oid_t oid_type)
|
620
630
|
{
|
621
631
|
const size_t ref_len = strlen(ref_name);
|
622
632
|
int cmp_val;
|
623
633
|
const char *end;
|
634
|
+
size_t oid_hexsize = git_oid_hexsize(oid_type);
|
624
635
|
|
625
|
-
rec +=
|
626
|
-
|
627
|
-
|
636
|
+
rec += oid_hexsize + 1; /* <oid> + space */
|
637
|
+
|
638
|
+
/* an incomplete (corrupt) record is treated as less than ref_name */
|
639
|
+
if (data_end < oid_hexsize + 3)
|
628
640
|
return -1;
|
629
|
-
|
630
|
-
data_end -=
|
641
|
+
|
642
|
+
data_end -= oid_hexsize + 1;
|
631
643
|
|
632
644
|
end = memchr(rec, '\n', data_end);
|
633
645
|
if (end)
|
@@ -675,6 +687,7 @@ static int packed_lookup(
|
|
675
687
|
{
|
676
688
|
int error = 0;
|
677
689
|
const char *left, *right, *data_end;
|
690
|
+
size_t oid_hexsize = git_oid_hexsize(backend->oid_type);
|
678
691
|
|
679
692
|
if ((error = packed_map_check(backend)) < 0)
|
680
693
|
return error;
|
@@ -698,7 +711,7 @@ static int packed_lookup(
|
|
698
711
|
|
699
712
|
mid = left + (right - left) / 2;
|
700
713
|
rec = start_of_record(left, mid);
|
701
|
-
compare = cmp_record_to_refname(rec, data_end - rec, ref_name);
|
714
|
+
compare = cmp_record_to_refname(rec, data_end - rec, ref_name, backend->oid_type);
|
702
715
|
|
703
716
|
if (compare < 0) {
|
704
717
|
left = end_of_record(mid, right);
|
@@ -708,11 +721,11 @@ static int packed_lookup(
|
|
708
721
|
const char *eol;
|
709
722
|
git_oid oid, peel, *peel_ptr = NULL;
|
710
723
|
|
711
|
-
if (data_end - rec <
|
712
|
-
|
724
|
+
if (data_end - rec < (long)oid_hexsize ||
|
725
|
+
git_oid__fromstr(&oid, rec, backend->oid_type) < 0) {
|
713
726
|
goto parse_failed;
|
714
727
|
}
|
715
|
-
rec +=
|
728
|
+
rec += oid_hexsize + 1;
|
716
729
|
if (!(eol = memchr(rec, '\n', data_end - rec))) {
|
717
730
|
goto parse_failed;
|
718
731
|
}
|
@@ -724,8 +737,8 @@ static int packed_lookup(
|
|
724
737
|
|
725
738
|
if (*rec == '^') {
|
726
739
|
rec++;
|
727
|
-
if (data_end - rec <
|
728
|
-
|
740
|
+
if (data_end - rec < (long)oid_hexsize ||
|
741
|
+
git_oid__fromstr(&peel, rec, backend->oid_type) < 0) {
|
729
742
|
goto parse_failed;
|
730
743
|
}
|
731
744
|
peel_ptr = &peel;
|
@@ -1108,7 +1121,7 @@ static int loose_commit(git_filebuf *file, const git_reference *ref)
|
|
1108
1121
|
GIT_ASSERT_ARG(ref);
|
1109
1122
|
|
1110
1123
|
if (ref->type == GIT_REFERENCE_DIRECT) {
|
1111
|
-
char oid[
|
1124
|
+
char oid[GIT_OID_MAX_HEXSIZE + 1];
|
1112
1125
|
git_oid_nfmt(oid, sizeof(oid), &ref->target.oid);
|
1113
1126
|
|
1114
1127
|
git_filebuf_printf(file, "%s\n", oid);
|
@@ -1224,7 +1237,7 @@ static int packed_find_peel(refdb_fs_backend *backend, struct packref *ref)
|
|
1224
1237
|
*/
|
1225
1238
|
static int packed_write_ref(struct packref *ref, git_filebuf *file)
|
1226
1239
|
{
|
1227
|
-
char oid[
|
1240
|
+
char oid[GIT_OID_MAX_HEXSIZE + 1];
|
1228
1241
|
git_oid_nfmt(oid, sizeof(oid), &ref->oid);
|
1229
1242
|
|
1230
1243
|
/*
|
@@ -1238,7 +1251,7 @@ static int packed_write_ref(struct packref *ref, git_filebuf *file)
|
|
1238
1251
|
* The required peels have already been loaded into `ref->peel_target`.
|
1239
1252
|
*/
|
1240
1253
|
if (ref->flags & PACKREF_HAS_PEEL) {
|
1241
|
-
char peel[
|
1254
|
+
char peel[GIT_OID_MAX_HEXSIZE + 1];
|
1242
1255
|
git_oid_nfmt(peel, sizeof(peel), &ref->peel);
|
1243
1256
|
|
1244
1257
|
if (git_filebuf_printf(file, "%s %s\n^%s\n", oid, ref->name, peel) < 0)
|
@@ -1302,7 +1315,7 @@ static int packed_remove_loose(refdb_fs_backend *backend)
|
|
1302
1315
|
continue;
|
1303
1316
|
|
1304
1317
|
/* Figure out the current id; if we find a bad ref file, skip it so we can do the rest */
|
1305
|
-
if (loose_parse_oid(¤t_id, lock.path_original, &ref_content) < 0)
|
1318
|
+
if (loose_parse_oid(¤t_id, lock.path_original, &ref_content, backend->oid_type) < 0)
|
1306
1319
|
continue;
|
1307
1320
|
|
1308
1321
|
/* If the ref moved since we packed it, we must not delete it */
|
@@ -1891,7 +1904,10 @@ done:
|
|
1891
1904
|
return out;
|
1892
1905
|
}
|
1893
1906
|
|
1894
|
-
static int reflog_alloc(
|
1907
|
+
static int reflog_alloc(
|
1908
|
+
git_reflog **reflog,
|
1909
|
+
const char *name,
|
1910
|
+
git_oid_t oid_type)
|
1895
1911
|
{
|
1896
1912
|
git_reflog *log;
|
1897
1913
|
|
@@ -1903,6 +1919,8 @@ static int reflog_alloc(git_reflog **reflog, const char *name)
|
|
1903
1919
|
log->ref_name = git__strdup(name);
|
1904
1920
|
GIT_ERROR_CHECK_ALLOC(log->ref_name);
|
1905
1921
|
|
1922
|
+
log->oid_type = oid_type;
|
1923
|
+
|
1906
1924
|
if (git_vector_init(&log->entries, 0, NULL) < 0) {
|
1907
1925
|
git__free(log->ref_name);
|
1908
1926
|
git__free(log);
|
@@ -2032,7 +2050,10 @@ static int refdb_reflog_fs__has_log(git_refdb_backend *_backend, const char *nam
|
|
2032
2050
|
return has_reflog(backend->repo, name);
|
2033
2051
|
}
|
2034
2052
|
|
2035
|
-
static int refdb_reflog_fs__read(
|
2053
|
+
static int refdb_reflog_fs__read(
|
2054
|
+
git_reflog **out,
|
2055
|
+
git_refdb_backend *_backend,
|
2056
|
+
const char *name)
|
2036
2057
|
{
|
2037
2058
|
int error = -1;
|
2038
2059
|
git_str log_path = GIT_STR_INIT;
|
@@ -2048,7 +2069,7 @@ static int refdb_reflog_fs__read(git_reflog **out, git_refdb_backend *_backend,
|
|
2048
2069
|
backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
|
2049
2070
|
repo = backend->repo;
|
2050
2071
|
|
2051
|
-
if (reflog_alloc(&log, name) < 0)
|
2072
|
+
if (reflog_alloc(&log, name, backend->oid_type) < 0)
|
2052
2073
|
return -1;
|
2053
2074
|
|
2054
2075
|
if (reflog_path(&log_path, repo, name) < 0)
|
@@ -2086,11 +2107,11 @@ static int serialize_reflog_entry(
|
|
2086
2107
|
const git_signature *committer,
|
2087
2108
|
const char *msg)
|
2088
2109
|
{
|
2089
|
-
char raw_old[
|
2090
|
-
char raw_new[
|
2110
|
+
char raw_old[GIT_OID_MAX_HEXSIZE + 1];
|
2111
|
+
char raw_new[GIT_OID_MAX_HEXSIZE + 1];
|
2091
2112
|
|
2092
|
-
git_oid_tostr(raw_old,
|
2093
|
-
git_oid_tostr(raw_new,
|
2113
|
+
git_oid_tostr(raw_old, GIT_OID_MAX_HEXSIZE + 1, oid_old);
|
2114
|
+
git_oid_tostr(raw_new, GIT_OID_MAX_HEXSIZE + 1, oid_new);
|
2094
2115
|
|
2095
2116
|
git_str_clear(buf);
|
2096
2117
|
|
@@ -2189,10 +2210,16 @@ success:
|
|
2189
2210
|
}
|
2190
2211
|
|
2191
2212
|
/* Append to the reflog, must be called under reference lock */
|
2192
|
-
static int reflog_append(
|
2213
|
+
static int reflog_append(
|
2214
|
+
refdb_fs_backend *backend,
|
2215
|
+
const git_reference *ref,
|
2216
|
+
const git_oid *old,
|
2217
|
+
const git_oid *new,
|
2218
|
+
const git_signature *who,
|
2219
|
+
const char *message)
|
2193
2220
|
{
|
2194
2221
|
int error, is_symbolic, open_flags;
|
2195
|
-
git_oid old_id
|
2222
|
+
git_oid old_id, new_id;
|
2196
2223
|
git_str buf = GIT_STR_INIT, path = GIT_STR_INIT;
|
2197
2224
|
git_repository *repo = backend->repo;
|
2198
2225
|
|
@@ -2206,6 +2233,9 @@ static int reflog_append(refdb_fs_backend *backend, const git_reference *ref, co
|
|
2206
2233
|
|
2207
2234
|
/* From here on is_symbolic also means that it's HEAD */
|
2208
2235
|
|
2236
|
+
git_oid_clear(&old_id, backend->oid_type);
|
2237
|
+
git_oid_clear(&new_id, backend->oid_type);
|
2238
|
+
|
2209
2239
|
if (old) {
|
2210
2240
|
git_oid_cpy(&old_id, old);
|
2211
2241
|
} else {
|
@@ -2402,6 +2432,7 @@ int git_refdb_backend_fs(
|
|
2402
2432
|
goto fail;
|
2403
2433
|
|
2404
2434
|
backend->repo = repository;
|
2435
|
+
backend->oid_type = repository->oid_type;
|
2405
2436
|
|
2406
2437
|
if (repository->gitdir) {
|
2407
2438
|
backend->gitpath = setup_namespace(repository, repository->gitdir);
|
@@ -71,7 +71,11 @@ int git_reflog_write(git_reflog *reflog)
|
|
71
71
|
return db->backend->reflog_write(db->backend, reflog);
|
72
72
|
}
|
73
73
|
|
74
|
-
int git_reflog_append(
|
74
|
+
int git_reflog_append(
|
75
|
+
git_reflog *reflog,
|
76
|
+
const git_oid *new_oid,
|
77
|
+
const git_signature *committer,
|
78
|
+
const char *msg)
|
75
79
|
{
|
76
80
|
const git_reflog_entry *previous;
|
77
81
|
git_reflog_entry *entry;
|
@@ -104,7 +108,7 @@ int git_reflog_append(git_reflog *reflog, const git_oid *new_oid, const git_sign
|
|
104
108
|
previous = git_reflog_entry_byindex(reflog, 0);
|
105
109
|
|
106
110
|
if (previous == NULL)
|
107
|
-
|
111
|
+
git_oid_clear(&entry->oid_old, reflog->oid_type);
|
108
112
|
else
|
109
113
|
git_oid_cpy(&entry->oid_old, &previous->oid_cur);
|
110
114
|
|
@@ -219,9 +223,7 @@ int git_reflog_drop(git_reflog *reflog, size_t idx, int rewrite_previous_entry)
|
|
219
223
|
/* If the oldest entry has just been removed... */
|
220
224
|
if (idx == entrycount - 1) {
|
221
225
|
/* ...clear the oid_old member of the "new" oldest entry */
|
222
|
-
|
223
|
-
return -1;
|
224
|
-
|
226
|
+
git_oid_clear(&entry->oid_old, reflog->oid_type);
|
225
227
|
return 0;
|
226
228
|
}
|
227
229
|
|
@@ -16,8 +16,6 @@
|
|
16
16
|
#define GIT_REFLOG_DIR_MODE 0777
|
17
17
|
#define GIT_REFLOG_FILE_MODE 0666
|
18
18
|
|
19
|
-
#define GIT_REFLOG_SIZE_MIN (2*GIT_OID_HEXSZ+2+17)
|
20
|
-
|
21
19
|
struct git_reflog_entry {
|
22
20
|
git_oid oid_old;
|
23
21
|
git_oid oid_cur;
|
@@ -30,6 +28,7 @@ struct git_reflog_entry {
|
|
30
28
|
struct git_reflog {
|
31
29
|
git_refdb *db;
|
32
30
|
char *ref_name;
|
31
|
+
git_oid_t oid_type;
|
33
32
|
git_vector entries;
|
34
33
|
};
|
35
34
|
|
@@ -17,6 +17,7 @@
|
|
17
17
|
#include "fetchhead.h"
|
18
18
|
#include "push.h"
|
19
19
|
#include "proxy.h"
|
20
|
+
#include "strarray.h"
|
20
21
|
|
21
22
|
#include "git2/config.h"
|
22
23
|
#include "git2/types.h"
|
@@ -1026,6 +1027,24 @@ int git_remote_capabilities(unsigned int *out, git_remote *remote)
|
|
1026
1027
|
return remote->transport->capabilities(out, remote->transport);
|
1027
1028
|
}
|
1028
1029
|
|
1030
|
+
int git_remote_oid_type(git_oid_t *out, git_remote *remote)
|
1031
|
+
{
|
1032
|
+
GIT_ASSERT_ARG(remote);
|
1033
|
+
|
1034
|
+
if (!remote->transport) {
|
1035
|
+
git_error_set(GIT_ERROR_NET, "this remote has never connected");
|
1036
|
+
*out = 0;
|
1037
|
+
return -1;
|
1038
|
+
}
|
1039
|
+
|
1040
|
+
#ifdef GIT_EXPERIMENTAL_SHA256
|
1041
|
+
return remote->transport->oid_type(out, remote->transport);
|
1042
|
+
#else
|
1043
|
+
*out = GIT_OID_SHA1;
|
1044
|
+
return 0;
|
1045
|
+
#endif
|
1046
|
+
}
|
1047
|
+
|
1029
1048
|
static int lookup_config(char **out, git_config *cfg, const char *name)
|
1030
1049
|
{
|
1031
1050
|
git_config_entry *ce = NULL;
|
@@ -1225,24 +1244,6 @@ static int ls_to_vector(git_vector *out, git_remote *remote)
|
|
1225
1244
|
return 0;
|
1226
1245
|
}
|
1227
1246
|
|
1228
|
-
#define copy_opts(out, in) \
|
1229
|
-
if (in) { \
|
1230
|
-
(out)->callbacks = (in)->callbacks; \
|
1231
|
-
(out)->proxy_opts = (in)->proxy_opts; \
|
1232
|
-
(out)->custom_headers = (in)->custom_headers; \
|
1233
|
-
(out)->follow_redirects = (in)->follow_redirects; \
|
1234
|
-
}
|
1235
|
-
|
1236
|
-
GIT_INLINE(int) connect_opts_from_fetch_opts(
|
1237
|
-
git_remote_connect_options *out,
|
1238
|
-
git_remote *remote,
|
1239
|
-
const git_fetch_options *fetch_opts)
|
1240
|
-
{
|
1241
|
-
git_remote_connect_options tmp = GIT_REMOTE_CONNECT_OPTIONS_INIT;
|
1242
|
-
copy_opts(&tmp, fetch_opts);
|
1243
|
-
return git_remote_connect_options_normalize(out, remote->repo, &tmp);
|
1244
|
-
}
|
1245
|
-
|
1246
1247
|
static int connect_or_reset_options(
|
1247
1248
|
git_remote *remote,
|
1248
1249
|
int direction,
|
@@ -1330,7 +1331,8 @@ int git_remote_download(
|
|
1330
1331
|
return -1;
|
1331
1332
|
}
|
1332
1333
|
|
1333
|
-
if (
|
1334
|
+
if (git_remote_connect_options__from_fetch_opts(&connect_opts,
|
1335
|
+
remote, opts) < 0)
|
1334
1336
|
return -1;
|
1335
1337
|
|
1336
1338
|
if ((error = connect_or_reset_options(remote, GIT_DIRECTION_FETCH, &connect_opts)) < 0)
|
@@ -1350,6 +1352,8 @@ int git_remote_fetch(
|
|
1350
1352
|
bool prune = false;
|
1351
1353
|
git_str reflog_msg_buf = GIT_STR_INIT;
|
1352
1354
|
git_remote_connect_options connect_opts = GIT_REMOTE_CONNECT_OPTIONS_INIT;
|
1355
|
+
unsigned int capabilities;
|
1356
|
+
git_oid_t oid_type;
|
1353
1357
|
|
1354
1358
|
GIT_ASSERT_ARG(remote);
|
1355
1359
|
|
@@ -1358,7 +1362,8 @@ int git_remote_fetch(
|
|
1358
1362
|
return -1;
|
1359
1363
|
}
|
1360
1364
|
|
1361
|
-
if (
|
1365
|
+
if (git_remote_connect_options__from_fetch_opts(&connect_opts,
|
1366
|
+
remote, opts) < 0)
|
1362
1367
|
return -1;
|
1363
1368
|
|
1364
1369
|
if ((error = connect_or_reset_options(remote, GIT_DIRECTION_FETCH, &connect_opts)) < 0)
|
@@ -1369,6 +1374,10 @@ int git_remote_fetch(
|
|
1369
1374
|
tagopt = opts->download_tags;
|
1370
1375
|
}
|
1371
1376
|
|
1377
|
+
if ((error = git_remote_capabilities(&capabilities, remote)) < 0 ||
|
1378
|
+
(error = git_remote_oid_type(&oid_type, remote)) < 0)
|
1379
|
+
return error;
|
1380
|
+
|
1372
1381
|
/* Connect and download everything */
|
1373
1382
|
error = git_remote__download(remote, refspecs, opts);
|
1374
1383
|
|
@@ -1622,7 +1631,7 @@ int git_remote_prune(git_remote *remote, const git_remote_callbacks *callbacks)
|
|
1622
1631
|
const git_refspec *spec;
|
1623
1632
|
const char *refname;
|
1624
1633
|
int error;
|
1625
|
-
git_oid zero_id =
|
1634
|
+
git_oid zero_id = GIT_OID_SHA1_ZERO;
|
1626
1635
|
|
1627
1636
|
if (callbacks)
|
1628
1637
|
GIT_ERROR_CHECK_VERSION(callbacks, GIT_REMOTE_CALLBACKS_VERSION, "git_remote_callbacks");
|
@@ -1724,7 +1733,7 @@ static int update_ref(
|
|
1724
1733
|
const git_remote_callbacks *callbacks)
|
1725
1734
|
{
|
1726
1735
|
git_reference *ref;
|
1727
|
-
git_oid old_id;
|
1736
|
+
git_oid old_id = GIT_OID_SHA1_ZERO;
|
1728
1737
|
int error;
|
1729
1738
|
|
1730
1739
|
error = git_reference_name_to_id(&old_id, remote->repo, ref_name);
|
@@ -1830,7 +1839,7 @@ static int update_one_tip(
|
|
1830
1839
|
}
|
1831
1840
|
|
1832
1841
|
if (error == GIT_ENOTFOUND) {
|
1833
|
-
|
1842
|
+
git_oid_clear(&old, GIT_OID_SHA1);
|
1834
1843
|
error = 0;
|
1835
1844
|
|
1836
1845
|
if (autotag && (error = git_vector_insert(update_heads, head)) < 0)
|
@@ -1892,10 +1901,10 @@ static int update_tips_for_spec(
|
|
1892
1901
|
}
|
1893
1902
|
|
1894
1903
|
/* Handle specified oid sources */
|
1895
|
-
if (git_oid__is_hexstr(spec->src)) {
|
1904
|
+
if (git_oid__is_hexstr(spec->src, GIT_OID_SHA1)) {
|
1896
1905
|
git_oid id;
|
1897
1906
|
|
1898
|
-
if ((error =
|
1907
|
+
if ((error = git_oid__fromstr(&id, spec->src, GIT_OID_SHA1)) < 0)
|
1899
1908
|
goto on_error;
|
1900
1909
|
|
1901
1910
|
if (spec->dst &&
|
@@ -2896,16 +2905,6 @@ done:
|
|
2896
2905
|
return error;
|
2897
2906
|
}
|
2898
2907
|
|
2899
|
-
GIT_INLINE(int) connect_opts_from_push_opts(
|
2900
|
-
git_remote_connect_options *out,
|
2901
|
-
git_remote *remote,
|
2902
|
-
const git_push_options *push_opts)
|
2903
|
-
{
|
2904
|
-
git_remote_connect_options tmp = GIT_REMOTE_CONNECT_OPTIONS_INIT;
|
2905
|
-
copy_opts(&tmp, push_opts);
|
2906
|
-
return git_remote_connect_options_normalize(out, remote->repo, &tmp);
|
2907
|
-
}
|
2908
|
-
|
2909
2908
|
int git_remote_upload(
|
2910
2909
|
git_remote *remote,
|
2911
2910
|
const git_strarray *refspecs,
|
@@ -2924,7 +2923,8 @@ int git_remote_upload(
|
|
2924
2923
|
return -1;
|
2925
2924
|
}
|
2926
2925
|
|
2927
|
-
if ((error =
|
2926
|
+
if ((error = git_remote_connect_options__from_push_opts(
|
2927
|
+
&connect_opts, remote, opts)) < 0)
|
2928
2928
|
goto cleanup;
|
2929
2929
|
|
2930
2930
|
if ((error = connect_or_reset_options(remote, GIT_DIRECTION_PUSH, &connect_opts)) < 0)
|
@@ -2985,7 +2985,8 @@ int git_remote_push(
|
|
2985
2985
|
return -1;
|
2986
2986
|
}
|
2987
2987
|
|
2988
|
-
if (
|
2988
|
+
if (git_remote_connect_options__from_push_opts(&connect_opts,
|
2989
|
+
remote, opts) < 0)
|
2989
2990
|
return -1;
|
2990
2991
|
|
2991
2992
|
if ((error = git_remote_upload(remote, refspecs, opts)) < 0)
|