rugged 1.5.1 → 1.6.2
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.
- 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 +6 -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 +25 -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 +11 -9
- 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 +194 -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 +90 -66
- 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 +39 -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 +7 -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
@@ -115,19 +115,19 @@ static int midx_parse_oid_lookup(
|
|
115
115
|
struct git_midx_chunk *chunk_oid_lookup)
|
116
116
|
{
|
117
117
|
uint32_t i;
|
118
|
-
unsigned char *oid, *prev_oid, zero_oid[
|
118
|
+
unsigned char *oid, *prev_oid, zero_oid[GIT_OID_SHA1_SIZE] = {0};
|
119
119
|
|
120
120
|
if (chunk_oid_lookup->offset == 0)
|
121
121
|
return midx_error("missing OID Lookup chunk");
|
122
122
|
if (chunk_oid_lookup->length == 0)
|
123
123
|
return midx_error("empty OID Lookup chunk");
|
124
|
-
if (chunk_oid_lookup->length != idx->num_objects *
|
124
|
+
if (chunk_oid_lookup->length != idx->num_objects * GIT_OID_SHA1_SIZE)
|
125
125
|
return midx_error("OID Lookup chunk has wrong length");
|
126
126
|
|
127
127
|
idx->oid_lookup = oid = (unsigned char *)(data + chunk_oid_lookup->offset);
|
128
128
|
prev_oid = zero_oid;
|
129
|
-
for (i = 0; i < idx->num_objects; ++i, oid +=
|
130
|
-
if (git_oid_raw_cmp(prev_oid, oid) >= 0)
|
129
|
+
for (i = 0; i < idx->num_objects; ++i, oid += GIT_OID_SHA1_SIZE) {
|
130
|
+
if (git_oid_raw_cmp(prev_oid, oid, GIT_OID_SHA1_SIZE) >= 0)
|
131
131
|
return midx_error("OID Lookup index is non-monotonic");
|
132
132
|
prev_oid = oid;
|
133
133
|
}
|
@@ -188,7 +188,7 @@ int git_midx_parse(
|
|
188
188
|
|
189
189
|
GIT_ASSERT_ARG(idx);
|
190
190
|
|
191
|
-
if (size < sizeof(struct git_midx_header) +
|
191
|
+
if (size < sizeof(struct git_midx_header) + GIT_OID_SHA1_SIZE)
|
192
192
|
return midx_error("multi-pack index is too short");
|
193
193
|
|
194
194
|
hdr = ((struct git_midx_header *)data);
|
@@ -365,7 +365,7 @@ bool git_midx_needs_refresh(
|
|
365
365
|
}
|
366
366
|
|
367
367
|
checksum_size = GIT_HASH_SHA1_SIZE;
|
368
|
-
bytes_read = p_pread(fd, checksum, checksum_size, st.st_size -
|
368
|
+
bytes_read = p_pread(fd, checksum, checksum_size, st.st_size - GIT_OID_SHA1_SIZE);
|
369
369
|
p_close(fd);
|
370
370
|
|
371
371
|
if (bytes_read != (ssize_t)checksum_size)
|
@@ -392,27 +392,27 @@ int git_midx_entry_find(
|
|
392
392
|
hi = ntohl(idx->oid_fanout[(int)short_oid->id[0]]);
|
393
393
|
lo = ((short_oid->id[0] == 0x0) ? 0 : ntohl(idx->oid_fanout[(int)short_oid->id[0] - 1]));
|
394
394
|
|
395
|
-
pos =
|
395
|
+
pos = git_pack__lookup_id(idx->oid_lookup, GIT_OID_SHA1_SIZE, lo, hi, short_oid->id, GIT_OID_SHA1);
|
396
396
|
|
397
397
|
if (pos >= 0) {
|
398
398
|
/* An object matching exactly the oid was found */
|
399
399
|
found = 1;
|
400
|
-
current = idx->oid_lookup + (pos *
|
400
|
+
current = idx->oid_lookup + (pos * GIT_OID_SHA1_SIZE);
|
401
401
|
} else {
|
402
402
|
/* No object was found */
|
403
403
|
/* pos refers to the object with the "closest" oid to short_oid */
|
404
404
|
pos = -1 - pos;
|
405
405
|
if (pos < (int)idx->num_objects) {
|
406
|
-
current = idx->oid_lookup + (pos *
|
406
|
+
current = idx->oid_lookup + (pos * GIT_OID_SHA1_SIZE);
|
407
407
|
|
408
408
|
if (!git_oid_raw_ncmp(short_oid->id, current, len))
|
409
409
|
found = 1;
|
410
410
|
}
|
411
411
|
}
|
412
412
|
|
413
|
-
if (found && len !=
|
413
|
+
if (found && len != GIT_OID_SHA1_HEXSIZE && pos + 1 < (int)idx->num_objects) {
|
414
414
|
/* Check for ambiguousity */
|
415
|
-
const unsigned char *next = current +
|
415
|
+
const unsigned char *next = current + GIT_OID_SHA1_SIZE;
|
416
416
|
|
417
417
|
if (!git_oid_raw_ncmp(short_oid->id, next, len))
|
418
418
|
found = 2;
|
@@ -443,7 +443,7 @@ int git_midx_entry_find(
|
|
443
443
|
return midx_error("invalid index into the packfile names table");
|
444
444
|
e->pack_index = pack_index;
|
445
445
|
e->offset = offset;
|
446
|
-
|
446
|
+
git_oid__fromraw(&e->sha1, current, GIT_OID_SHA1);
|
447
447
|
return 0;
|
448
448
|
}
|
449
449
|
|
@@ -459,7 +459,7 @@ int git_midx_foreach_entry(
|
|
459
459
|
GIT_ASSERT_ARG(idx);
|
460
460
|
|
461
461
|
for (i = 0; i < idx->num_objects; ++i) {
|
462
|
-
if ((error =
|
462
|
+
if ((error = git_oid__fromraw(&oid, &idx->oid_lookup[i * GIT_OID_SHA1_SIZE], GIT_OID_SHA1)) < 0)
|
463
463
|
return error;
|
464
464
|
|
465
465
|
if ((error = cb(&oid, data)) != 0)
|
@@ -549,7 +549,8 @@ int git_midx_writer_add(
|
|
549
549
|
if (error < 0)
|
550
550
|
return error;
|
551
551
|
|
552
|
-
|
552
|
+
/* TODO: SHA256 */
|
553
|
+
error = git_mwindow_get_pack(&p, git_str_cstr(&idx_path_buf), 0);
|
553
554
|
git_str_dispose(&idx_path_buf);
|
554
555
|
if (error < 0)
|
555
556
|
return error;
|
@@ -748,7 +749,7 @@ static int midx_write(
|
|
748
749
|
|
749
750
|
/* Fill the OID Lookup table. */
|
750
751
|
git_vector_foreach (&object_entries, i, entry) {
|
751
|
-
error = git_str_put(&oid_lookup, (char *)&entry->sha1.id,
|
752
|
+
error = git_str_put(&oid_lookup, (char *)&entry->sha1.id, GIT_OID_SHA1_SIZE);
|
752
753
|
if (error < 0)
|
753
754
|
goto cleanup;
|
754
755
|
}
|
@@ -61,7 +61,10 @@ int git_mwindow_global_init(void)
|
|
61
61
|
return git_runtime_shutdown_register(git_mwindow_global_shutdown);
|
62
62
|
}
|
63
63
|
|
64
|
-
int git_mwindow_get_pack(
|
64
|
+
int git_mwindow_get_pack(
|
65
|
+
struct git_pack_file **out,
|
66
|
+
const char *path,
|
67
|
+
git_oid_t oid_type)
|
65
68
|
{
|
66
69
|
struct git_pack_file *pack;
|
67
70
|
char *packname;
|
@@ -86,7 +89,7 @@ int git_mwindow_get_pack(struct git_pack_file **out, const char *path)
|
|
86
89
|
}
|
87
90
|
|
88
91
|
/* If we didn't find it, we need to create it */
|
89
|
-
if ((error = git_packfile_alloc(&pack, path)) < 0) {
|
92
|
+
if ((error = git_packfile_alloc(&pack, path, oid_type)) < 0) {
|
90
93
|
git_mutex_unlock(&git__mwindow_mutex);
|
91
94
|
return error;
|
92
95
|
}
|
@@ -48,7 +48,10 @@ void git_mwindow_close(git_mwindow **w_cursor);
|
|
48
48
|
extern int git_mwindow_global_init(void);
|
49
49
|
|
50
50
|
struct git_pack_file; /* just declaration to avoid cyclical includes */
|
51
|
-
int git_mwindow_get_pack(
|
51
|
+
int git_mwindow_get_pack(
|
52
|
+
struct git_pack_file **out,
|
53
|
+
const char *path,
|
54
|
+
git_oid_t oid_type);
|
52
55
|
int git_mwindow_put_pack(struct git_pack_file *pack);
|
53
56
|
|
54
57
|
#endif
|
@@ -460,7 +460,7 @@ int git_note_commit_read(
|
|
460
460
|
{
|
461
461
|
int error;
|
462
462
|
git_tree *tree = NULL;
|
463
|
-
char target[
|
463
|
+
char target[GIT_OID_SHA1_HEXSIZE + 1];
|
464
464
|
|
465
465
|
git_oid_tostr(target, sizeof(target), oid);
|
466
466
|
|
@@ -507,7 +507,7 @@ int git_note_commit_create(
|
|
507
507
|
{
|
508
508
|
int error;
|
509
509
|
git_tree *tree = NULL;
|
510
|
-
char target[
|
510
|
+
char target[GIT_OID_SHA1_HEXSIZE + 1];
|
511
511
|
|
512
512
|
git_oid_tostr(target, sizeof(target), oid);
|
513
513
|
|
@@ -578,7 +578,7 @@ int git_note_commit_remove(
|
|
578
578
|
{
|
579
579
|
int error;
|
580
580
|
git_tree *tree = NULL;
|
581
|
-
char target[
|
581
|
+
char target[GIT_OID_SHA1_HEXSIZE + 1];
|
582
582
|
|
583
583
|
git_oid_tostr(target, sizeof(target), oid);
|
584
584
|
|
@@ -698,12 +698,12 @@ static int process_entry_path(
|
|
698
698
|
buf.ptr[j] = '\0';
|
699
699
|
buf.size = j;
|
700
700
|
|
701
|
-
if (j !=
|
701
|
+
if (j != GIT_OID_SHA1_HEXSIZE) {
|
702
702
|
/* This is not a note entry */
|
703
703
|
goto cleanup;
|
704
704
|
}
|
705
705
|
|
706
|
-
error =
|
706
|
+
error = git_oid__fromstr(annotated_object_id, buf.ptr, GIT_OID_SHA1);
|
707
707
|
|
708
708
|
cleanup:
|
709
709
|
git_str_dispose(&buf);
|
@@ -21,15 +21,14 @@
|
|
21
21
|
|
22
22
|
bool git_object__strict_input_validation = true;
|
23
23
|
|
24
|
-
extern int git_odb_hash(git_oid *out, const void *data, size_t len, git_object_t type);
|
25
24
|
size_t git_object__size(git_object_t type);
|
26
25
|
|
27
26
|
typedef struct {
|
28
27
|
const char *str; /* type name string */
|
29
28
|
size_t size; /* size in bytes of the object structure */
|
30
29
|
|
31
|
-
int (*parse)(void *self, git_odb_object *obj);
|
32
|
-
int (*parse_raw)(void *self, const char *data, size_t size);
|
30
|
+
int (*parse)(void *self, git_odb_object *obj, git_oid_t oid_type);
|
31
|
+
int (*parse_raw)(void *self, const char *data, size_t size, git_oid_t oid_type);
|
33
32
|
void (*free)(void *self);
|
34
33
|
} git_object_def;
|
35
34
|
|
@@ -61,7 +60,8 @@ int git_object__from_raw(
|
|
61
60
|
git_object **object_out,
|
62
61
|
const char *data,
|
63
62
|
size_t size,
|
64
|
-
git_object_t
|
63
|
+
git_object_t object_type,
|
64
|
+
git_oid_t oid_type)
|
65
65
|
{
|
66
66
|
git_object_def *def;
|
67
67
|
git_object *object;
|
@@ -72,12 +72,15 @@ int git_object__from_raw(
|
|
72
72
|
*object_out = NULL;
|
73
73
|
|
74
74
|
/* Validate type match */
|
75
|
-
if (
|
75
|
+
if (object_type != GIT_OBJECT_BLOB &&
|
76
|
+
object_type != GIT_OBJECT_TREE &&
|
77
|
+
object_type != GIT_OBJECT_COMMIT &&
|
78
|
+
object_type != GIT_OBJECT_TAG) {
|
76
79
|
git_error_set(GIT_ERROR_INVALID, "the requested type is invalid");
|
77
80
|
return GIT_ENOTFOUND;
|
78
81
|
}
|
79
82
|
|
80
|
-
if ((object_size = git_object__size(
|
83
|
+
if ((object_size = git_object__size(object_type)) == 0) {
|
81
84
|
git_error_set(GIT_ERROR_INVALID, "the requested type is invalid");
|
82
85
|
return GIT_ENOTFOUND;
|
83
86
|
}
|
@@ -86,15 +89,15 @@ int git_object__from_raw(
|
|
86
89
|
object = git__calloc(1, object_size);
|
87
90
|
GIT_ERROR_CHECK_ALLOC(object);
|
88
91
|
object->cached.flags = GIT_CACHE_STORE_PARSED;
|
89
|
-
object->cached.type =
|
90
|
-
if ((error =
|
92
|
+
object->cached.type = object_type;
|
93
|
+
if ((error = git_odb__hash(&object->cached.oid, data, size, object_type, oid_type)) < 0)
|
91
94
|
return error;
|
92
95
|
|
93
96
|
/* Parse raw object data */
|
94
|
-
def = &git_objects_table[
|
97
|
+
def = &git_objects_table[object_type];
|
95
98
|
GIT_ASSERT(def->free && def->parse_raw);
|
96
99
|
|
97
|
-
if ((error = def->parse_raw(object, data, size)) < 0) {
|
100
|
+
if ((error = def->parse_raw(object, data, size, oid_type)) < 0) {
|
98
101
|
def->free(object);
|
99
102
|
return error;
|
100
103
|
}
|
@@ -144,7 +147,7 @@ int git_object__from_odb_object(
|
|
144
147
|
def = &git_objects_table[odb_obj->cached.type];
|
145
148
|
GIT_ASSERT(def->free && def->parse);
|
146
149
|
|
147
|
-
if ((error = def->parse(object, odb_obj)) < 0) {
|
150
|
+
if ((error = def->parse(object, odb_obj, repo->oid_type)) < 0) {
|
148
151
|
/*
|
149
152
|
* parse returns EINVALID on invalid data; downgrade
|
150
153
|
* that to a normal -1 error code.
|
@@ -193,10 +196,10 @@ int git_object_lookup_prefix(
|
|
193
196
|
if (error < 0)
|
194
197
|
return error;
|
195
198
|
|
196
|
-
if (len >
|
197
|
-
len =
|
199
|
+
if (len > GIT_OID_SHA1_HEXSIZE)
|
200
|
+
len = GIT_OID_SHA1_HEXSIZE;
|
198
201
|
|
199
|
-
if (len ==
|
202
|
+
if (len == GIT_OID_SHA1_HEXSIZE) {
|
200
203
|
git_cached_obj *cached = NULL;
|
201
204
|
|
202
205
|
/* We want to match the full id : we can first look up in the cache,
|
@@ -230,11 +233,11 @@ int git_object_lookup_prefix(
|
|
230
233
|
error = git_odb_read(&odb_obj, odb, id);
|
231
234
|
}
|
232
235
|
} else {
|
233
|
-
git_oid short_oid =
|
236
|
+
git_oid short_oid = GIT_OID_SHA1_ZERO;
|
234
237
|
|
235
238
|
git_oid__cpy_prefix(&short_oid, id, len);
|
236
239
|
|
237
|
-
/* If len <
|
240
|
+
/* If len < GIT_OID_SHA1_HEXSIZE (a strict short oid was given), we have
|
238
241
|
* 2 options :
|
239
242
|
* - We always search in the cache first. If we find that short oid is
|
240
243
|
* ambiguous, we can stop. But in all the other cases, we must then
|
@@ -259,7 +262,7 @@ int git_object_lookup_prefix(
|
|
259
262
|
}
|
260
263
|
|
261
264
|
int git_object_lookup(git_object **object_out, git_repository *repo, const git_oid *id, git_object_t type) {
|
262
|
-
return git_object_lookup_prefix(object_out, repo, id,
|
265
|
+
return git_object_lookup_prefix(object_out, repo, id, GIT_OID_SHA1_HEXSIZE, type);
|
263
266
|
}
|
264
267
|
|
265
268
|
void git_object_free(git_object *object)
|
@@ -358,12 +361,11 @@ static int dereference_object(git_object **dereferenced, git_object *obj)
|
|
358
361
|
static int peel_error(int error, const git_oid *oid, git_object_t type)
|
359
362
|
{
|
360
363
|
const char *type_name;
|
361
|
-
char hex_oid[
|
364
|
+
char hex_oid[GIT_OID_MAX_HEXSIZE + 1];
|
362
365
|
|
363
366
|
type_name = git_object_type2string(type);
|
364
367
|
|
365
|
-
|
366
|
-
hex_oid[GIT_OID_HEXSZ] = '\0';
|
368
|
+
git_oid_nfmt(hex_oid, GIT_OID_MAX_HEXSIZE + 1, oid);
|
367
369
|
|
368
370
|
git_error_set(GIT_ERROR_OBJECT, "the git_object of id '%s' can not be "
|
369
371
|
"successfully peeled into a %s (git_object_t=%i).", hex_oid, type_name, type);
|
@@ -502,7 +504,7 @@ static int git_object__short_id(git_str *out, const git_object *obj)
|
|
502
504
|
{
|
503
505
|
git_repository *repo;
|
504
506
|
int len = GIT_ABBREV_DEFAULT, error;
|
505
|
-
git_oid id =
|
507
|
+
git_oid id = GIT_OID_SHA1_ZERO;
|
506
508
|
git_odb *odb;
|
507
509
|
|
508
510
|
GIT_ASSERT_ARG(out);
|
@@ -516,12 +518,16 @@ static int git_object__short_id(git_str *out, const git_object *obj)
|
|
516
518
|
if ((error = git_repository_odb(&odb, repo)) < 0)
|
517
519
|
return error;
|
518
520
|
|
519
|
-
while (len <
|
521
|
+
while (len < GIT_OID_SHA1_HEXSIZE) {
|
520
522
|
/* set up short oid */
|
521
523
|
memcpy(&id.id, &obj->cached.oid.id, (len + 1) / 2);
|
522
524
|
if (len & 1)
|
523
525
|
id.id[len / 2] &= 0xf0;
|
524
526
|
|
527
|
+
#ifdef GIT_EXPERIMENTAL_SHA256
|
528
|
+
id.type = GIT_OID_SHA1;
|
529
|
+
#endif
|
530
|
+
|
525
531
|
error = git_odb_exists_prefix(NULL, odb, &id, len);
|
526
532
|
if (error != GIT_EAMBIGUOUS)
|
527
533
|
break;
|
@@ -573,21 +579,29 @@ int git_object_rawcontent_is_valid(
|
|
573
579
|
int *valid,
|
574
580
|
const char *buf,
|
575
581
|
size_t len,
|
576
|
-
git_object_t
|
582
|
+
git_object_t object_type
|
583
|
+
#ifdef GIT_EXPERIMENTAL_SHA256
|
584
|
+
, git_oid_t oid_type
|
585
|
+
#endif
|
586
|
+
)
|
577
587
|
{
|
578
588
|
git_object *obj = NULL;
|
579
589
|
int error;
|
580
590
|
|
591
|
+
#ifndef GIT_EXPERIMENTAL_SHA256
|
592
|
+
git_oid_t oid_type = GIT_OID_SHA1;
|
593
|
+
#endif
|
594
|
+
|
581
595
|
GIT_ASSERT_ARG(valid);
|
582
596
|
GIT_ASSERT_ARG(buf);
|
583
597
|
|
584
598
|
/* Blobs are always valid; don't bother parsing. */
|
585
|
-
if (
|
599
|
+
if (object_type == GIT_OBJECT_BLOB) {
|
586
600
|
*valid = 1;
|
587
601
|
return 0;
|
588
602
|
}
|
589
603
|
|
590
|
-
error = git_object__from_raw(&obj, buf, len,
|
604
|
+
error = git_object__from_raw(&obj, buf, len, object_type, oid_type);
|
591
605
|
git_object_free(obj);
|
592
606
|
|
593
607
|
if (error == 0) {
|
@@ -600,3 +614,53 @@ int git_object_rawcontent_is_valid(
|
|
600
614
|
|
601
615
|
return error;
|
602
616
|
}
|
617
|
+
|
618
|
+
int git_object__parse_oid_header(
|
619
|
+
git_oid *oid,
|
620
|
+
const char **buffer_out,
|
621
|
+
const char *buffer_end,
|
622
|
+
const char *header,
|
623
|
+
git_oid_t oid_type)
|
624
|
+
{
|
625
|
+
const size_t sha_len = git_oid_hexsize(oid_type);
|
626
|
+
const size_t header_len = strlen(header);
|
627
|
+
|
628
|
+
const char *buffer = *buffer_out;
|
629
|
+
|
630
|
+
if (buffer + (header_len + sha_len + 1) > buffer_end)
|
631
|
+
return -1;
|
632
|
+
|
633
|
+
if (memcmp(buffer, header, header_len) != 0)
|
634
|
+
return -1;
|
635
|
+
|
636
|
+
if (buffer[header_len + sha_len] != '\n')
|
637
|
+
return -1;
|
638
|
+
|
639
|
+
if (git_oid__fromstr(oid, buffer + header_len, oid_type) < 0)
|
640
|
+
return -1;
|
641
|
+
|
642
|
+
*buffer_out = buffer + (header_len + sha_len + 1);
|
643
|
+
|
644
|
+
return 0;
|
645
|
+
}
|
646
|
+
|
647
|
+
int git_object__write_oid_header(
|
648
|
+
git_str *buf,
|
649
|
+
const char *header,
|
650
|
+
const git_oid *oid)
|
651
|
+
{
|
652
|
+
size_t hex_size = git_oid_hexsize(git_oid_type(oid));
|
653
|
+
char hex_oid[GIT_OID_MAX_HEXSIZE];
|
654
|
+
|
655
|
+
if (!hex_size) {
|
656
|
+
git_error_set(GIT_ERROR_INVALID, "unknown type");
|
657
|
+
return -1;
|
658
|
+
}
|
659
|
+
|
660
|
+
git_oid_fmt(hex_oid, oid);
|
661
|
+
git_str_puts(buf, header);
|
662
|
+
git_str_put(buf, hex_oid, hex_size);
|
663
|
+
git_str_putc(buf, '\n');
|
664
|
+
|
665
|
+
return git_str_oom(buf) ? -1 : 0;
|
666
|
+
}
|
@@ -33,7 +33,8 @@ int git_object__from_raw(
|
|
33
33
|
git_object **object_out,
|
34
34
|
const char *data,
|
35
35
|
size_t size,
|
36
|
-
git_object_t
|
36
|
+
git_object_t object_type,
|
37
|
+
git_oid_t oid_type);
|
37
38
|
|
38
39
|
int git_object__from_odb_object(
|
39
40
|
git_object **object_out,
|
@@ -45,9 +46,17 @@ int git_object__resolve_to_type(git_object **obj, git_object_t type);
|
|
45
46
|
|
46
47
|
git_object_t git_object_stringn2type(const char *str, size_t len);
|
47
48
|
|
48
|
-
int
|
49
|
+
int git_object__parse_oid_header(
|
50
|
+
git_oid *oid,
|
51
|
+
const char **buffer_out,
|
52
|
+
const char *buffer_end,
|
53
|
+
const char *header,
|
54
|
+
git_oid_t oid_type);
|
49
55
|
|
50
|
-
|
56
|
+
int git_object__write_oid_header(
|
57
|
+
git_str *buf,
|
58
|
+
const char *header,
|
59
|
+
const git_oid *oid);
|
51
60
|
|
52
61
|
bool git_object__is_valid(
|
53
62
|
git_repository *repo, const git_oid *id, git_object_t expected_type);
|