mirror of https://github.com/git/git.git
Merge branch 'bc/hash-transition-interop-part-1'
SHA-256 transition. * bc/hash-transition-interop-part-1: hex: print objects using the hash algorithm member hex: default to the_hash_algo on zero algorithm value builtin/pack-objects: avoid using struct object_id for pack hash commit-graph: don't store file hashes as struct object_id builtin/show-index: set the algorithm for object IDs hash: provide per-algorithm null OIDs hash: set, copy, and use algo field in struct object_id builtin/pack-redundant: avoid casting buffers to struct object_id Use the final_oid_fn to finalize hashing of object IDs hash: add a function to finalize object IDs http-push: set algorithm when reading object ID Always use oidread to read into struct object_id hash: add an algo member to struct object_id
This commit is contained in:
commit
aaa3c8065d
|
@ -203,7 +203,7 @@ static void queue_directory(const unsigned char *sha1,
|
|||
d->mode = mode;
|
||||
c->bottom = d;
|
||||
d->len = xsnprintf(d->path, len, "%.*s%s/", (int)base->len, base->buf, filename);
|
||||
hashcpy(d->oid.hash, sha1);
|
||||
oidread(&d->oid, sha1);
|
||||
}
|
||||
|
||||
static int write_directory(struct archiver_context *c)
|
||||
|
@ -275,9 +275,11 @@ int write_archive_entries(struct archiver_args *args,
|
|||
int err;
|
||||
struct strbuf path_in_archive = STRBUF_INIT;
|
||||
struct strbuf content = STRBUF_INIT;
|
||||
struct object_id fake_oid = null_oid;
|
||||
struct object_id fake_oid;
|
||||
int i;
|
||||
|
||||
oidcpy(&fake_oid, null_oid());
|
||||
|
||||
if (args->baselen > 0 && args->base[args->baselen - 1] == '/') {
|
||||
size_t len = args->baselen;
|
||||
|
||||
|
|
2
blame.c
2
blame.c
|
@ -242,7 +242,7 @@ static struct commit *fake_working_tree_commit(struct repository *r,
|
|||
switch (st.st_mode & S_IFMT) {
|
||||
case S_IFREG:
|
||||
if (opt->flags.allow_textconv &&
|
||||
textconv_object(r, read_from, mode, &null_oid, 0, &buf_ptr, &buf_len))
|
||||
textconv_object(r, read_from, mode, null_oid(), 0, &buf_ptr, &buf_len))
|
||||
strbuf_attach(&buf, buf_ptr, buf_len, buf_len + 1);
|
||||
else if (strbuf_read_file(&buf, read_from, st.st_size) != st.st_size)
|
||||
die_errno("cannot open or read '%s'", read_from);
|
||||
|
|
2
branch.c
2
branch.c
|
@ -322,7 +322,7 @@ void create_branch(struct repository *r,
|
|||
transaction = ref_transaction_begin(&err);
|
||||
if (!transaction ||
|
||||
ref_transaction_update(transaction, ref.buf,
|
||||
&oid, forcing ? NULL : &null_oid,
|
||||
&oid, forcing ? NULL : null_oid(),
|
||||
0, msg, &err) ||
|
||||
ref_transaction_commit(transaction, &err))
|
||||
die("%s", err.buf);
|
||||
|
|
|
@ -106,8 +106,8 @@ static int post_checkout_hook(struct commit *old_commit, struct commit *new_comm
|
|||
int changed)
|
||||
{
|
||||
return run_hook_le(NULL, "post-checkout",
|
||||
oid_to_hex(old_commit ? &old_commit->object.oid : &null_oid),
|
||||
oid_to_hex(new_commit ? &new_commit->object.oid : &null_oid),
|
||||
oid_to_hex(old_commit ? &old_commit->object.oid : null_oid()),
|
||||
oid_to_hex(new_commit ? &new_commit->object.oid : null_oid()),
|
||||
changed ? "1" : "0", NULL);
|
||||
/* "new_commit" can be NULL when checking out from the index before
|
||||
a commit exists. */
|
||||
|
@ -644,7 +644,7 @@ static int reset_tree(struct tree *tree, const struct checkout_opts *o,
|
|||
opts.src_index = &the_index;
|
||||
opts.dst_index = &the_index;
|
||||
init_checkout_metadata(&opts.meta, info->refname,
|
||||
info->commit ? &info->commit->object.oid : &null_oid,
|
||||
info->commit ? &info->commit->object.oid : null_oid(),
|
||||
NULL);
|
||||
parse_tree(tree);
|
||||
init_tree_desc(&tree_desc, tree->buffer, tree->size);
|
||||
|
|
|
@ -820,7 +820,7 @@ static int checkout(int submodule_progress)
|
|||
if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
|
||||
die(_("unable to write new index file"));
|
||||
|
||||
err |= run_hook_le(NULL, "post-checkout", oid_to_hex(&null_oid),
|
||||
err |= run_hook_le(NULL, "post-checkout", oid_to_hex(null_oid()),
|
||||
oid_to_hex(&oid), "1", NULL);
|
||||
|
||||
if (!err && (option_recurse_submodules.nr > 0)) {
|
||||
|
|
|
@ -502,7 +502,7 @@ static void describe_blob(struct object_id oid, struct strbuf *dst)
|
|||
{
|
||||
struct rev_info revs;
|
||||
struct strvec args = STRVEC_INIT;
|
||||
struct process_commit_data pcd = { null_oid, oid, dst, &revs};
|
||||
struct process_commit_data pcd = { *null_oid(), oid, dst, &revs};
|
||||
|
||||
strvec_pushl(&args, "internal: The first arg is not parsed",
|
||||
"--objects", "--in-commit-order", "--reverse", "HEAD",
|
||||
|
|
|
@ -98,7 +98,7 @@ static int builtin_diff_b_f(struct rev_info *revs,
|
|||
|
||||
stuff_change(&revs->diffopt,
|
||||
blob[0]->mode, canon_mode(st.st_mode),
|
||||
&blob[0]->item->oid, &null_oid,
|
||||
&blob[0]->item->oid, null_oid(),
|
||||
1, 0,
|
||||
blob[0]->path ? blob[0]->path : path,
|
||||
path);
|
||||
|
|
|
@ -870,7 +870,7 @@ static void handle_tag(const char *name, struct tag *tag)
|
|||
p = rewrite_commit((struct commit *)tagged);
|
||||
if (!p) {
|
||||
printf("reset %s\nfrom %s\n\n",
|
||||
name, oid_to_hex(&null_oid));
|
||||
name, oid_to_hex(null_oid()));
|
||||
free(buf);
|
||||
return;
|
||||
}
|
||||
|
@ -884,7 +884,7 @@ static void handle_tag(const char *name, struct tag *tag)
|
|||
|
||||
if (tagged->type == OBJ_TAG) {
|
||||
printf("reset %s\nfrom %s\n\n",
|
||||
name, oid_to_hex(&null_oid));
|
||||
name, oid_to_hex(null_oid()));
|
||||
}
|
||||
skip_prefix(name, "refs/tags/", &name);
|
||||
printf("tag %s\n", name);
|
||||
|
@ -1016,7 +1016,7 @@ static void handle_tags_and_duplicates(struct string_list *extras)
|
|||
* it.
|
||||
*/
|
||||
printf("reset %s\nfrom %s\n\n",
|
||||
name, oid_to_hex(&null_oid));
|
||||
name, oid_to_hex(null_oid()));
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1035,7 +1035,7 @@ static void handle_tags_and_duplicates(struct string_list *extras)
|
|||
if (!reference_excluded_commits) {
|
||||
/* delete the ref */
|
||||
printf("reset %s\nfrom %s\n\n",
|
||||
name, oid_to_hex(&null_oid));
|
||||
name, oid_to_hex(null_oid()));
|
||||
continue;
|
||||
}
|
||||
/* set ref to commit using oid, not mark */
|
||||
|
@ -1146,7 +1146,7 @@ static void handle_deletes(void)
|
|||
continue;
|
||||
|
||||
printf("reset %s\nfrom %s\n\n",
|
||||
refspec->dst, oid_to_hex(&null_oid));
|
||||
refspec->dst, oid_to_hex(null_oid()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -940,7 +940,7 @@ static int store_object(
|
|||
the_hash_algo->init_fn(&c);
|
||||
the_hash_algo->update_fn(&c, hdr, hdrlen);
|
||||
the_hash_algo->update_fn(&c, dat->buf, dat->len);
|
||||
the_hash_algo->final_fn(oid.hash, &c);
|
||||
the_hash_algo->final_oid_fn(&oid, &c);
|
||||
if (oidout)
|
||||
oidcpy(oidout, &oid);
|
||||
|
||||
|
@ -1136,7 +1136,7 @@ static void stream_blob(uintmax_t len, struct object_id *oidout, uintmax_t mark)
|
|||
}
|
||||
}
|
||||
git_deflate_end(&s);
|
||||
the_hash_algo->final_fn(oid.hash, &c);
|
||||
the_hash_algo->final_oid_fn(&oid, &c);
|
||||
|
||||
if (oidout)
|
||||
oidcpy(oidout, &oid);
|
||||
|
@ -1276,8 +1276,8 @@ static void load_tree(struct tree_entry *root)
|
|||
e->versions[0].mode = e->versions[1].mode;
|
||||
e->name = to_atom(c, strlen(c));
|
||||
c += e->name->str_len + 1;
|
||||
hashcpy(e->versions[0].oid.hash, (unsigned char *)c);
|
||||
hashcpy(e->versions[1].oid.hash, (unsigned char *)c);
|
||||
oidread(&e->versions[0].oid, (unsigned char *)c);
|
||||
oidread(&e->versions[1].oid, (unsigned char *)c);
|
||||
c += the_hash_algo->rawsz;
|
||||
}
|
||||
free(buf);
|
||||
|
|
|
@ -421,7 +421,7 @@ static int grep_submodule(struct grep_opt *opt,
|
|||
struct grep_opt subopt;
|
||||
int hit;
|
||||
|
||||
sub = submodule_from_path(superproject, &null_oid, path);
|
||||
sub = submodule_from_path(superproject, null_oid(), path);
|
||||
|
||||
if (!is_submodule_active(superproject, path))
|
||||
return 0;
|
||||
|
|
|
@ -489,7 +489,7 @@ static void *unpack_entry_data(off_t offset, unsigned long size,
|
|||
bad_object(offset, _("inflate returned %d"), status);
|
||||
git_inflate_end(&stream);
|
||||
if (oid)
|
||||
the_hash_algo->final_fn(oid->hash, &c);
|
||||
the_hash_algo->final_oid_fn(oid, &c);
|
||||
return buf == fixed_buf ? NULL : buf;
|
||||
}
|
||||
|
||||
|
@ -524,7 +524,7 @@ static void *unpack_raw_entry(struct object_entry *obj,
|
|||
|
||||
switch (obj->type) {
|
||||
case OBJ_REF_DELTA:
|
||||
hashcpy(ref_oid->hash, fill(the_hash_algo->rawsz));
|
||||
oidread(ref_oid, fill(the_hash_algo->rawsz));
|
||||
use(the_hash_algo->rawsz);
|
||||
break;
|
||||
case OBJ_OFS_DELTA:
|
||||
|
@ -1358,7 +1358,7 @@ static struct object_entry *append_obj_to_pack(struct hashfile *f,
|
|||
obj[1].idx.offset += write_compressed(f, buf, size);
|
||||
obj[0].idx.crc32 = crc32_end(f);
|
||||
hashflush(f);
|
||||
hashcpy(obj->idx.oid.hash, sha1);
|
||||
oidread(&obj->idx.oid, sha1);
|
||||
return obj;
|
||||
}
|
||||
|
||||
|
|
|
@ -210,7 +210,7 @@ static void show_submodule(struct repository *superproject,
|
|||
{
|
||||
struct repository subrepo;
|
||||
const struct submodule *sub = submodule_from_path(superproject,
|
||||
&null_oid, path);
|
||||
null_oid(), path);
|
||||
|
||||
if (repo_submodule_init(&subrepo, superproject, sub))
|
||||
return;
|
||||
|
|
|
@ -1030,7 +1030,7 @@ static void write_pack_file(void)
|
|||
write_order = compute_write_order();
|
||||
|
||||
do {
|
||||
struct object_id oid;
|
||||
unsigned char hash[GIT_MAX_RAWSZ];
|
||||
char *pack_tmp_name = NULL;
|
||||
|
||||
if (pack_to_stdout)
|
||||
|
@ -1059,13 +1059,13 @@ static void write_pack_file(void)
|
|||
* If so, rewrite it like in fast-import
|
||||
*/
|
||||
if (pack_to_stdout) {
|
||||
finalize_hashfile(f, oid.hash, CSUM_HASH_IN_STREAM | CSUM_CLOSE);
|
||||
finalize_hashfile(f, hash, CSUM_HASH_IN_STREAM | CSUM_CLOSE);
|
||||
} else if (nr_written == nr_remaining) {
|
||||
finalize_hashfile(f, oid.hash, CSUM_HASH_IN_STREAM | CSUM_FSYNC | CSUM_CLOSE);
|
||||
finalize_hashfile(f, hash, CSUM_HASH_IN_STREAM | CSUM_FSYNC | CSUM_CLOSE);
|
||||
} else {
|
||||
int fd = finalize_hashfile(f, oid.hash, 0);
|
||||
fixup_pack_header_footer(fd, oid.hash, pack_tmp_name,
|
||||
nr_written, oid.hash, offset);
|
||||
int fd = finalize_hashfile(f, hash, 0);
|
||||
fixup_pack_header_footer(fd, hash, pack_tmp_name,
|
||||
nr_written, hash, offset);
|
||||
close(fd);
|
||||
if (write_bitmap_index) {
|
||||
if (write_bitmap_index != WRITE_BITMAP_QUIET)
|
||||
|
@ -1100,17 +1100,17 @@ static void write_pack_file(void)
|
|||
strbuf_addf(&tmpname, "%s-", base_name);
|
||||
|
||||
if (write_bitmap_index) {
|
||||
bitmap_writer_set_checksum(oid.hash);
|
||||
bitmap_writer_set_checksum(hash);
|
||||
bitmap_writer_build_type_index(
|
||||
&to_pack, written_list, nr_written);
|
||||
}
|
||||
|
||||
finish_tmp_packfile(&tmpname, pack_tmp_name,
|
||||
written_list, nr_written,
|
||||
&pack_idx_opts, oid.hash);
|
||||
&pack_idx_opts, hash);
|
||||
|
||||
if (write_bitmap_index) {
|
||||
strbuf_addf(&tmpname, "%s.bitmap", oid_to_hex(&oid));
|
||||
strbuf_addf(&tmpname, "%s.bitmap", hash_to_hex(hash));
|
||||
|
||||
stop_progress(&progress_state);
|
||||
|
||||
|
@ -1124,7 +1124,7 @@ static void write_pack_file(void)
|
|||
|
||||
strbuf_release(&tmpname);
|
||||
free(pack_tmp_name);
|
||||
puts(oid_to_hex(&oid));
|
||||
puts(hash_to_hex(hash));
|
||||
}
|
||||
|
||||
/* mark written objects as written to previous pack */
|
||||
|
|
|
@ -20,7 +20,7 @@ static int load_all_packs, verbose, alt_odb;
|
|||
|
||||
struct llist_item {
|
||||
struct llist_item *next;
|
||||
const struct object_id *oid;
|
||||
struct object_id oid;
|
||||
};
|
||||
static struct llist {
|
||||
struct llist_item *front;
|
||||
|
@ -95,10 +95,10 @@ static struct llist * llist_copy(struct llist *list)
|
|||
|
||||
static inline struct llist_item *llist_insert(struct llist *list,
|
||||
struct llist_item *after,
|
||||
const struct object_id *oid)
|
||||
const unsigned char *oid)
|
||||
{
|
||||
struct llist_item *new_item = llist_item_get();
|
||||
new_item->oid = oid;
|
||||
oidread(&new_item->oid, oid);
|
||||
new_item->next = NULL;
|
||||
|
||||
if (after != NULL) {
|
||||
|
@ -118,7 +118,7 @@ static inline struct llist_item *llist_insert(struct llist *list,
|
|||
}
|
||||
|
||||
static inline struct llist_item *llist_insert_back(struct llist *list,
|
||||
const struct object_id *oid)
|
||||
const unsigned char *oid)
|
||||
{
|
||||
return llist_insert(list, list->back, oid);
|
||||
}
|
||||
|
@ -130,9 +130,9 @@ static inline struct llist_item *llist_insert_sorted_unique(struct llist *list,
|
|||
|
||||
l = (hint == NULL) ? list->front : hint;
|
||||
while (l) {
|
||||
int cmp = oidcmp(l->oid, oid);
|
||||
int cmp = oidcmp(&l->oid, oid);
|
||||
if (cmp > 0) { /* we insert before this entry */
|
||||
return llist_insert(list, prev, oid);
|
||||
return llist_insert(list, prev, oid->hash);
|
||||
}
|
||||
if (!cmp) { /* already exists */
|
||||
return l;
|
||||
|
@ -141,11 +141,11 @@ static inline struct llist_item *llist_insert_sorted_unique(struct llist *list,
|
|||
l = l->next;
|
||||
}
|
||||
/* insert at the end */
|
||||
return llist_insert_back(list, oid);
|
||||
return llist_insert_back(list, oid->hash);
|
||||
}
|
||||
|
||||
/* returns a pointer to an item in front of sha1 */
|
||||
static inline struct llist_item * llist_sorted_remove(struct llist *list, const struct object_id *oid, struct llist_item *hint)
|
||||
static inline struct llist_item * llist_sorted_remove(struct llist *list, const unsigned char *oid, struct llist_item *hint)
|
||||
{
|
||||
struct llist_item *prev, *l;
|
||||
|
||||
|
@ -153,7 +153,7 @@ redo_from_start:
|
|||
l = (hint == NULL) ? list->front : hint;
|
||||
prev = NULL;
|
||||
while (l) {
|
||||
const int cmp = oidcmp(l->oid, oid);
|
||||
const int cmp = hashcmp(l->oid.hash, oid);
|
||||
if (cmp > 0) /* not in list, since sorted */
|
||||
return prev;
|
||||
if (!cmp) { /* found */
|
||||
|
@ -188,7 +188,7 @@ static void llist_sorted_difference_inplace(struct llist *A,
|
|||
b = B->front;
|
||||
|
||||
while (b) {
|
||||
hint = llist_sorted_remove(A, b->oid, hint);
|
||||
hint = llist_sorted_remove(A, b->oid.hash, hint);
|
||||
b = b->next;
|
||||
}
|
||||
}
|
||||
|
@ -260,10 +260,10 @@ static void cmp_two_packs(struct pack_list *p1, struct pack_list *p2)
|
|||
/* cmp ~ p1 - p2 */
|
||||
if (cmp == 0) {
|
||||
p1_hint = llist_sorted_remove(p1->unique_objects,
|
||||
(const struct object_id *)(p1_base + p1_off),
|
||||
p1_base + p1_off,
|
||||
p1_hint);
|
||||
p2_hint = llist_sorted_remove(p2->unique_objects,
|
||||
(const struct object_id *)(p1_base + p1_off),
|
||||
p1_base + p1_off,
|
||||
p2_hint);
|
||||
p1_off += p1_step;
|
||||
p2_off += p2_step;
|
||||
|
@ -455,7 +455,7 @@ static void load_all_objects(void)
|
|||
l = pl->remaining_objects->front;
|
||||
while (l) {
|
||||
hint = llist_insert_sorted_unique(all_objects,
|
||||
l->oid, hint);
|
||||
&l->oid, hint);
|
||||
l = l->next;
|
||||
}
|
||||
pl = pl->next;
|
||||
|
@ -521,7 +521,7 @@ static struct pack_list * add_pack(struct packed_git *p)
|
|||
base += 256 * 4 + ((p->index_version < 2) ? 4 : 8);
|
||||
step = the_hash_algo->rawsz + ((p->index_version < 2) ? 4 : 0);
|
||||
while (off < p->num_objects * step) {
|
||||
llist_insert_back(l.remaining_objects, (const struct object_id *)(base + off));
|
||||
llist_insert_back(l.remaining_objects, base + off);
|
||||
off += step;
|
||||
}
|
||||
l.all_objects_size = l.remaining_objects->size;
|
||||
|
|
|
@ -485,7 +485,7 @@ static const char * const builtin_rebase_interactive_usage[] = {
|
|||
int cmd_rebase__interactive(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
struct rebase_options opts = REBASE_OPTIONS_INIT;
|
||||
struct object_id squash_onto = null_oid;
|
||||
struct object_id squash_onto = *null_oid();
|
||||
enum action command = ACTION_NONE;
|
||||
struct option options[] = {
|
||||
OPT_NEGBIT(0, "ff", &opts.flags, N_("allow fast-forward"),
|
||||
|
@ -1140,7 +1140,7 @@ static int can_fast_forward(struct commit *onto, struct commit *upstream,
|
|||
|
||||
merge_bases = get_merge_bases(onto, head);
|
||||
if (!merge_bases || merge_bases->next) {
|
||||
oidcpy(merge_base, &null_oid);
|
||||
oidcpy(merge_base, null_oid());
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
|
|
@ -329,7 +329,7 @@ static void write_head_info(void)
|
|||
for_each_alternate_ref(show_one_alternate_ref, &seen);
|
||||
oidset_clear(&seen);
|
||||
if (!sent_capabilities)
|
||||
show_ref("capabilities^{}", &null_oid);
|
||||
show_ref("capabilities^{}", null_oid());
|
||||
|
||||
advertise_shallow_grafts(1);
|
||||
|
||||
|
|
|
@ -71,9 +71,11 @@ int cmd_show_index(int argc, const char **argv, const char *prefix)
|
|||
uint32_t off;
|
||||
} *entries;
|
||||
ALLOC_ARRAY(entries, nr);
|
||||
for (i = 0; i < nr; i++)
|
||||
for (i = 0; i < nr; i++) {
|
||||
if (fread(entries[i].oid.hash, hashsz, 1, stdin) != 1)
|
||||
die("unable to read sha1 %u/%u", i, nr);
|
||||
entries[i].oid.algo = hash_algo_by_ptr(the_hash_algo);
|
||||
}
|
||||
for (i = 0; i < nr; i++)
|
||||
if (fread(&entries[i].crc, 4, 1, stdin) != 1)
|
||||
die("unable to read crc %u/%u", i, nr);
|
||||
|
|
|
@ -426,7 +426,8 @@ static int module_list(int argc, const char **argv, const char *prefix)
|
|||
const struct cache_entry *ce = list.entries[i];
|
||||
|
||||
if (ce_stage(ce))
|
||||
printf("%06o %s U\t", ce->ce_mode, oid_to_hex(&null_oid));
|
||||
printf("%06o %s U\t", ce->ce_mode,
|
||||
oid_to_hex(null_oid()));
|
||||
else
|
||||
printf("%06o %s %d\t", ce->ce_mode,
|
||||
oid_to_hex(&ce->oid), ce_stage(ce));
|
||||
|
@ -466,7 +467,7 @@ static void runcommand_in_submodule_cb(const struct cache_entry *list_item,
|
|||
|
||||
displaypath = get_submodule_displaypath(path, info->prefix);
|
||||
|
||||
sub = submodule_from_path(the_repository, &null_oid, path);
|
||||
sub = submodule_from_path(the_repository, null_oid(), path);
|
||||
|
||||
if (!sub)
|
||||
die(_("No url found for submodule path '%s' in .gitmodules"),
|
||||
|
@ -623,7 +624,7 @@ static void init_submodule(const char *path, const char *prefix,
|
|||
|
||||
displaypath = get_submodule_displaypath(path, prefix);
|
||||
|
||||
sub = submodule_from_path(the_repository, &null_oid, path);
|
||||
sub = submodule_from_path(the_repository, null_oid(), path);
|
||||
|
||||
if (!sub)
|
||||
die(_("No url found for submodule path '%s' in .gitmodules"),
|
||||
|
@ -783,14 +784,14 @@ static void status_submodule(const char *path, const struct object_id *ce_oid,
|
|||
struct strbuf buf = STRBUF_INIT;
|
||||
const char *git_dir;
|
||||
|
||||
if (!submodule_from_path(the_repository, &null_oid, path))
|
||||
if (!submodule_from_path(the_repository, null_oid(), path))
|
||||
die(_("no submodule mapping found in .gitmodules for path '%s'"),
|
||||
path);
|
||||
|
||||
displaypath = get_submodule_displaypath(path, prefix);
|
||||
|
||||
if ((CE_STAGEMASK & ce_flags) >> CE_STAGESHIFT) {
|
||||
print_status(flags, 'U', path, &null_oid, displaypath);
|
||||
print_status(flags, 'U', path, null_oid(), displaypath);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
|
@ -916,7 +917,7 @@ static int module_name(int argc, const char **argv, const char *prefix)
|
|||
if (argc != 2)
|
||||
usage(_("git submodule--helper name <path>"));
|
||||
|
||||
sub = submodule_from_path(the_repository, &null_oid, argv[1]);
|
||||
sub = submodule_from_path(the_repository, null_oid(), argv[1]);
|
||||
|
||||
if (!sub)
|
||||
die(_("no submodule mapping found in .gitmodules for path '%s'"),
|
||||
|
@ -1040,7 +1041,7 @@ static void generate_submodule_summary(struct summary_cb *info,
|
|||
char *errmsg = NULL;
|
||||
int total_commits = -1;
|
||||
|
||||
if (!info->cached && oideq(&p->oid_dst, &null_oid)) {
|
||||
if (!info->cached && oideq(&p->oid_dst, null_oid())) {
|
||||
if (S_ISGITLINK(p->mod_dst)) {
|
||||
struct ref_store *refs = get_submodule_ref_store(p->sm_path);
|
||||
if (refs)
|
||||
|
@ -1177,7 +1178,7 @@ static void prepare_submodule_summary(struct summary_cb *info,
|
|||
|
||||
if (info->for_status && p->status != 'A' &&
|
||||
(sub = submodule_from_path(the_repository,
|
||||
&null_oid, p->sm_path))) {
|
||||
null_oid(), p->sm_path))) {
|
||||
char *config_key = NULL;
|
||||
const char *value;
|
||||
int ignore_all = 0;
|
||||
|
@ -1373,7 +1374,7 @@ static void sync_submodule(const char *path, const char *prefix,
|
|||
if (!is_submodule_active(the_repository, path))
|
||||
return;
|
||||
|
||||
sub = submodule_from_path(the_repository, &null_oid, path);
|
||||
sub = submodule_from_path(the_repository, null_oid(), path);
|
||||
|
||||
if (sub && sub->url) {
|
||||
if (starts_with_dot_dot_slash(sub->url) ||
|
||||
|
@ -1525,7 +1526,7 @@ static void deinit_submodule(const char *path, const char *prefix,
|
|||
struct strbuf sb_config = STRBUF_INIT;
|
||||
char *sub_git_dir = xstrfmt("%s/.git", path);
|
||||
|
||||
sub = submodule_from_path(the_repository, &null_oid, path);
|
||||
sub = submodule_from_path(the_repository, null_oid(), path);
|
||||
|
||||
if (!sub || !sub->name)
|
||||
goto cleanup;
|
||||
|
@ -1925,7 +1926,7 @@ static void determine_submodule_update_strategy(struct repository *r,
|
|||
const char *update,
|
||||
struct submodule_update_strategy *out)
|
||||
{
|
||||
const struct submodule *sub = submodule_from_path(r, &null_oid, path);
|
||||
const struct submodule *sub = submodule_from_path(r, null_oid(), path);
|
||||
char *key;
|
||||
const char *val;
|
||||
|
||||
|
@ -2077,7 +2078,7 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
sub = submodule_from_path(the_repository, &null_oid, ce->name);
|
||||
sub = submodule_from_path(the_repository, null_oid(), ce->name);
|
||||
|
||||
if (suc->recursive_prefix)
|
||||
displaypath = relative_path(suc->recursive_prefix,
|
||||
|
@ -2395,7 +2396,7 @@ static const char *remote_submodule_branch(const char *path)
|
|||
const char *branch = NULL;
|
||||
char *key;
|
||||
|
||||
sub = submodule_from_path(the_repository, &null_oid, path);
|
||||
sub = submodule_from_path(the_repository, null_oid(), path);
|
||||
if (!sub)
|
||||
return NULL;
|
||||
|
||||
|
@ -2533,7 +2534,7 @@ static int ensure_core_worktree(int argc, const char **argv, const char *prefix)
|
|||
|
||||
path = argv[1];
|
||||
|
||||
sub = submodule_from_path(the_repository, &null_oid, path);
|
||||
sub = submodule_from_path(the_repository, null_oid(), path);
|
||||
if (!sub)
|
||||
BUG("We could get the submodule handle before?");
|
||||
|
||||
|
|
|
@ -355,7 +355,7 @@ static void unpack_delta_entry(enum object_type type, unsigned long delta_size,
|
|||
struct object_id base_oid;
|
||||
|
||||
if (type == OBJ_REF_DELTA) {
|
||||
hashcpy(base_oid.hash, fill(the_hash_algo->rawsz));
|
||||
oidread(&base_oid, fill(the_hash_algo->rawsz));
|
||||
use(the_hash_algo->rawsz);
|
||||
delta_data = get_data(delta_size);
|
||||
if (dry_run || !delta_data) {
|
||||
|
@ -421,7 +421,8 @@ static void unpack_delta_entry(enum object_type type, unsigned long delta_size,
|
|||
* has not been resolved yet.
|
||||
*/
|
||||
oidclr(&obj_list[nr].oid);
|
||||
add_delta_to_list(nr, &null_oid, base_offset, delta_data, delta_size);
|
||||
add_delta_to_list(nr, null_oid(), base_offset,
|
||||
delta_data, delta_size);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -576,7 +577,7 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)
|
|||
the_hash_algo->init_fn(&ctx);
|
||||
unpack_all();
|
||||
the_hash_algo->update_fn(&ctx, buffer, offset);
|
||||
the_hash_algo->final_fn(oid.hash, &ctx);
|
||||
the_hash_algo->final_oid_fn(&oid, &ctx);
|
||||
if (strict) {
|
||||
write_rest();
|
||||
if (fsck_finish(&fsck_options))
|
||||
|
|
|
@ -331,7 +331,7 @@ static int add_worktree(const char *path, const char *refname,
|
|||
*/
|
||||
strbuf_reset(&sb);
|
||||
strbuf_addf(&sb, "%s/HEAD", sb_repo.buf);
|
||||
write_file(sb.buf, "%s", oid_to_hex(&null_oid));
|
||||
write_file(sb.buf, "%s", oid_to_hex(null_oid()));
|
||||
strbuf_reset(&sb);
|
||||
strbuf_addf(&sb, "%s/commondir", sb_repo.buf);
|
||||
write_file(sb.buf, "../..");
|
||||
|
@ -394,7 +394,7 @@ done:
|
|||
cp.argv = NULL;
|
||||
cp.trace2_hook_name = "post-checkout";
|
||||
strvec_pushl(&cp.args, absolute_path(hook),
|
||||
oid_to_hex(&null_oid),
|
||||
oid_to_hex(null_oid()),
|
||||
oid_to_hex(&commit->object.oid),
|
||||
"1", NULL);
|
||||
ret = run_command(&cp);
|
||||
|
|
|
@ -238,7 +238,7 @@ static int deflate_to_pack(struct bulk_checkin_state *state,
|
|||
if (lseek(fd, seekback, SEEK_SET) == (off_t) -1)
|
||||
return error("cannot seek back");
|
||||
}
|
||||
the_hash_algo->final_fn(result_oid->hash, &ctx);
|
||||
the_hash_algo->final_oid_fn(result_oid, &ctx);
|
||||
if (!idx)
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -1068,7 +1068,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
|
|||
&result_size, NULL, NULL);
|
||||
} else if (textconv) {
|
||||
struct diff_filespec *df = alloc_filespec(elem->path);
|
||||
fill_filespec(df, &null_oid, 0, st.st_mode);
|
||||
fill_filespec(df, null_oid(), 0, st.st_mode);
|
||||
result_size = fill_textconv(opt->repo, textconv, df, &result);
|
||||
free_filespec(df);
|
||||
} else if (0 <= (fd = open(elem->path, O_RDONLY))) {
|
||||
|
|
|
@ -425,7 +425,7 @@ struct commit_graph *parse_commit_graph(struct repository *r,
|
|||
FREE_AND_NULL(graph->bloom_filter_settings);
|
||||
}
|
||||
|
||||
hashcpy(graph->oid.hash, graph->data + graph->data_len - graph->hash_len);
|
||||
oidread(&graph->oid, graph->data + graph->data_len - graph->hash_len);
|
||||
|
||||
if (verify_commit_graph_lite(graph))
|
||||
goto free_and_return;
|
||||
|
@ -746,7 +746,7 @@ static void load_oid_from_graph(struct commit_graph *g,
|
|||
|
||||
lex_index = pos - g->num_commits_in_base;
|
||||
|
||||
hashcpy(oid->hash, g->chunk_oid_lookup + g->hash_len * lex_index);
|
||||
oidread(oid, g->chunk_oid_lookup + g->hash_len * lex_index);
|
||||
}
|
||||
|
||||
static struct commit_list **insert_parent_or_die(struct repository *r,
|
||||
|
@ -939,7 +939,7 @@ static struct tree *load_tree_for_commit(struct repository *r,
|
|||
commit_data = g->chunk_commit_data +
|
||||
GRAPH_DATA_WIDTH * (graph_pos - g->num_commits_in_base);
|
||||
|
||||
hashcpy(oid.hash, commit_data);
|
||||
oidread(&oid, commit_data);
|
||||
set_commit_tree(c, lookup_tree(r, &oid));
|
||||
|
||||
return c->maybe_tree;
|
||||
|
@ -1793,8 +1793,8 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
|
|||
struct lock_file lk = LOCK_INIT;
|
||||
const unsigned hashsz = the_hash_algo->rawsz;
|
||||
struct strbuf progress_title = STRBUF_INIT;
|
||||
struct object_id file_hash;
|
||||
struct chunkfile *cf;
|
||||
unsigned char file_hash[GIT_MAX_RAWSZ];
|
||||
|
||||
if (ctx->split) {
|
||||
struct strbuf tmp_file = STRBUF_INIT;
|
||||
|
@ -1909,7 +1909,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
|
|||
}
|
||||
|
||||
close_commit_graph(ctx->r->objects);
|
||||
finalize_hashfile(f, file_hash.hash, CSUM_HASH_IN_STREAM | CSUM_FSYNC);
|
||||
finalize_hashfile(f, file_hash, CSUM_HASH_IN_STREAM | CSUM_FSYNC);
|
||||
free_chunkfile(cf);
|
||||
|
||||
if (ctx->split) {
|
||||
|
@ -1945,7 +1945,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
|
|||
unlink(graph_name);
|
||||
}
|
||||
|
||||
ctx->commit_graph_hash_after[ctx->num_commit_graphs_after - 1] = xstrdup(oid_to_hex(&file_hash));
|
||||
ctx->commit_graph_hash_after[ctx->num_commit_graphs_after - 1] = xstrdup(hash_to_hex(file_hash));
|
||||
final_graph_name = get_split_graph_filename(ctx->odb,
|
||||
ctx->commit_graph_hash_after[ctx->num_commit_graphs_after - 1]);
|
||||
ctx->commit_graph_filenames_after[ctx->num_commit_graphs_after - 1] = final_graph_name;
|
||||
|
@ -2322,7 +2322,7 @@ int write_commit_graph(struct object_directory *odb,
|
|||
struct commit_graph *g = ctx->r->objects->commit_graph;
|
||||
for (i = 0; i < g->num_commits; i++) {
|
||||
struct object_id oid;
|
||||
hashcpy(oid.hash, g->chunk_oid_lookup + g->hash_len * i);
|
||||
oidread(&oid, g->chunk_oid_lookup + g->hash_len * i);
|
||||
oid_array_append(&ctx->oids, &oid);
|
||||
}
|
||||
}
|
||||
|
@ -2425,7 +2425,8 @@ static void graph_report(const char *fmt, ...)
|
|||
int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags)
|
||||
{
|
||||
uint32_t i, cur_fanout_pos = 0;
|
||||
struct object_id prev_oid, cur_oid, checksum;
|
||||
struct object_id prev_oid, cur_oid;
|
||||
unsigned char checksum[GIT_MAX_HEXSZ];
|
||||
int generation_zero = 0;
|
||||
struct hashfile *f;
|
||||
int devnull;
|
||||
|
@ -2444,8 +2445,8 @@ int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags)
|
|||
devnull = open("/dev/null", O_WRONLY);
|
||||
f = hashfd(devnull, NULL);
|
||||
hashwrite(f, g->data, g->data_len - g->hash_len);
|
||||
finalize_hashfile(f, checksum.hash, CSUM_CLOSE);
|
||||
if (!hasheq(checksum.hash, g->data + g->data_len - g->hash_len)) {
|
||||
finalize_hashfile(f, checksum, CSUM_CLOSE);
|
||||
if (!hasheq(checksum, g->data + g->data_len - g->hash_len)) {
|
||||
graph_report(_("the commit-graph file has incorrect checksum and is likely corrupt"));
|
||||
verify_commit_graph_error = VERIFY_COMMIT_GRAPH_ERROR_HASH;
|
||||
}
|
||||
|
@ -2453,7 +2454,7 @@ int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags)
|
|||
for (i = 0; i < g->num_commits; i++) {
|
||||
struct commit *graph_commit;
|
||||
|
||||
hashcpy(cur_oid.hash, g->chunk_oid_lookup + g->hash_len * i);
|
||||
oidread(&cur_oid, g->chunk_oid_lookup + g->hash_len * i);
|
||||
|
||||
if (i && oidcmp(&prev_oid, &cur_oid) >= 0)
|
||||
graph_report(_("commit-graph has incorrect OID order: %s then %s"),
|
||||
|
@ -2501,7 +2502,7 @@ int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags)
|
|||
timestamp_t generation;
|
||||
|
||||
display_progress(progress, i + 1);
|
||||
hashcpy(cur_oid.hash, g->chunk_oid_lookup + g->hash_len * i);
|
||||
oidread(&cur_oid, g->chunk_oid_lookup + g->hash_len * i);
|
||||
|
||||
graph_commit = lookup_commit(r, &cur_oid);
|
||||
odb_commit = (struct commit *)create_object(r, &cur_oid, alloc_commit_node(r));
|
||||
|
|
|
@ -254,7 +254,7 @@ static int process_dummy_ref(const struct packet_reader *reader)
|
|||
return 0;
|
||||
name++;
|
||||
|
||||
return oideq(&null_oid, &oid) && !strcmp(name, "capabilities^{}");
|
||||
return oideq(null_oid(), &oid) && !strcmp(name, "capabilities^{}");
|
||||
}
|
||||
|
||||
static void check_no_capabilities(const char *line, int len)
|
||||
|
|
|
@ -232,7 +232,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
|
|||
ce_intent_to_add(ce)) {
|
||||
newmode = ce_mode_from_stat(ce, st.st_mode);
|
||||
diff_addremove(&revs->diffopt, '+', newmode,
|
||||
&null_oid, 0, ce->name, 0);
|
||||
null_oid(), 0, ce->name, 0);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -249,7 +249,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
|
|||
}
|
||||
oldmode = ce->ce_mode;
|
||||
old_oid = &ce->oid;
|
||||
new_oid = changed ? &null_oid : &ce->oid;
|
||||
new_oid = changed ? null_oid() : &ce->oid;
|
||||
diff_change(&revs->diffopt, oldmode, newmode,
|
||||
old_oid, new_oid,
|
||||
!is_null_oid(old_oid),
|
||||
|
@ -307,7 +307,7 @@ static int get_stat_data(const struct index_state *istate,
|
|||
0, dirty_submodule);
|
||||
if (changed) {
|
||||
mode = ce_mode_from_stat(ce, st.st_mode);
|
||||
oid = &null_oid;
|
||||
oid = null_oid();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -83,7 +83,7 @@ static struct diff_filespec *noindex_filespec(const char *name, int mode)
|
|||
if (!name)
|
||||
name = "/dev/null";
|
||||
s = alloc_filespec(name);
|
||||
fill_filespec(s, &null_oid, 0, mode);
|
||||
fill_filespec(s, null_oid(), 0, mode);
|
||||
if (name == file_from_standard_input)
|
||||
populate_from_stdin(s);
|
||||
return s;
|
||||
|
|
6
diff.c
6
diff.c
|
@ -4190,7 +4190,7 @@ static struct diff_tempfile *prepare_temp_file(struct repository *r,
|
|||
die_errno("readlink(%s)", name);
|
||||
prep_temp_blob(r->index, name, temp, sb.buf, sb.len,
|
||||
(one->oid_valid ?
|
||||
&one->oid : &null_oid),
|
||||
&one->oid : null_oid()),
|
||||
(one->oid_valid ?
|
||||
one->mode : S_IFLNK));
|
||||
strbuf_release(&sb);
|
||||
|
@ -4199,7 +4199,7 @@ static struct diff_tempfile *prepare_temp_file(struct repository *r,
|
|||
/* we can borrow from the file in the work tree */
|
||||
temp->name = name;
|
||||
if (!one->oid_valid)
|
||||
oid_to_hex_r(temp->hex, &null_oid);
|
||||
oid_to_hex_r(temp->hex, null_oid());
|
||||
else
|
||||
oid_to_hex_r(temp->hex, &one->oid);
|
||||
/* Even though we may sometimes borrow the
|
||||
|
@ -6234,7 +6234,7 @@ static int diff_get_patch_id(struct diff_options *options, struct object_id *oid
|
|||
}
|
||||
|
||||
if (!stable)
|
||||
the_hash_algo->final_fn(oid->hash, &ctx);
|
||||
the_hash_algo->final_oid_fn(oid, &ctx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
6
dir.c
6
dir.c
|
@ -3344,7 +3344,7 @@ static void read_oid(size_t pos, void *cb)
|
|||
rd->data = rd->end + 1;
|
||||
return;
|
||||
}
|
||||
hashcpy(ud->exclude_oid.hash, rd->data);
|
||||
oidread(&ud->exclude_oid, rd->data);
|
||||
rd->data += the_hash_algo->rawsz;
|
||||
}
|
||||
|
||||
|
@ -3352,7 +3352,7 @@ static void load_oid_stat(struct oid_stat *oid_stat, const unsigned char *data,
|
|||
const unsigned char *sha1)
|
||||
{
|
||||
stat_data_from_disk(&oid_stat->stat, data);
|
||||
hashcpy(oid_stat->oid.hash, sha1);
|
||||
oidread(&oid_stat->oid, sha1);
|
||||
oid_stat->valid = 1;
|
||||
}
|
||||
|
||||
|
@ -3558,7 +3558,7 @@ static void connect_wt_gitdir_in_nested(const char *sub_worktree,
|
|||
*/
|
||||
i++;
|
||||
|
||||
sub = submodule_from_path(&subrepo, &null_oid, ce->name);
|
||||
sub = submodule_from_path(&subrepo, null_oid(), ce->name);
|
||||
if (!sub || !is_submodule_active(&subrepo, ce->name))
|
||||
/* .gitmodules broken or inactive sub */
|
||||
continue;
|
||||
|
|
2
grep.c
2
grep.c
|
@ -1494,7 +1494,7 @@ static int fill_textconv_grep(struct repository *r,
|
|||
fill_filespec(df, gs->identifier, 1, 0100644);
|
||||
break;
|
||||
case GREP_SOURCE_FILE:
|
||||
fill_filespec(df, &null_oid, 0, 0100644);
|
||||
fill_filespec(df, null_oid(), 0, 0100644);
|
||||
break;
|
||||
default:
|
||||
BUG("attempt to textconv something without a path?");
|
||||
|
|
98
hash.h
98
hash.h
|
@ -95,6 +95,29 @@ static inline void git_SHA256_Clone(git_SHA256_CTX *dst, const git_SHA256_CTX *s
|
|||
/* Number of algorithms supported (including unknown). */
|
||||
#define GIT_HASH_NALGOS (GIT_HASH_SHA256 + 1)
|
||||
|
||||
/* The length in bytes and in hex digits of an object name (SHA-1 value). */
|
||||
#define GIT_SHA1_RAWSZ 20
|
||||
#define GIT_SHA1_HEXSZ (2 * GIT_SHA1_RAWSZ)
|
||||
/* The block size of SHA-1. */
|
||||
#define GIT_SHA1_BLKSZ 64
|
||||
|
||||
/* The length in bytes and in hex digits of an object name (SHA-256 value). */
|
||||
#define GIT_SHA256_RAWSZ 32
|
||||
#define GIT_SHA256_HEXSZ (2 * GIT_SHA256_RAWSZ)
|
||||
/* The block size of SHA-256. */
|
||||
#define GIT_SHA256_BLKSZ 64
|
||||
|
||||
/* The length in byte and in hex digits of the largest possible hash value. */
|
||||
#define GIT_MAX_RAWSZ GIT_SHA256_RAWSZ
|
||||
#define GIT_MAX_HEXSZ GIT_SHA256_HEXSZ
|
||||
/* The largest possible block size for any supported hash. */
|
||||
#define GIT_MAX_BLKSZ GIT_SHA256_BLKSZ
|
||||
|
||||
struct object_id {
|
||||
unsigned char hash[GIT_MAX_RAWSZ];
|
||||
int algo;
|
||||
};
|
||||
|
||||
/* A suitably aligned type for stack allocations of hash contexts. */
|
||||
union git_hash_ctx {
|
||||
git_SHA_CTX sha1;
|
||||
|
@ -106,6 +129,7 @@ typedef void (*git_hash_init_fn)(git_hash_ctx *ctx);
|
|||
typedef void (*git_hash_clone_fn)(git_hash_ctx *dst, const git_hash_ctx *src);
|
||||
typedef void (*git_hash_update_fn)(git_hash_ctx *ctx, const void *in, size_t len);
|
||||
typedef void (*git_hash_final_fn)(unsigned char *hash, git_hash_ctx *ctx);
|
||||
typedef void (*git_hash_final_oid_fn)(struct object_id *oid, git_hash_ctx *ctx);
|
||||
|
||||
struct git_hash_algo {
|
||||
/*
|
||||
|
@ -138,11 +162,17 @@ struct git_hash_algo {
|
|||
/* The hash finalization function. */
|
||||
git_hash_final_fn final_fn;
|
||||
|
||||
/* The hash finalization function for object IDs. */
|
||||
git_hash_final_oid_fn final_oid_fn;
|
||||
|
||||
/* The OID of the empty tree. */
|
||||
const struct object_id *empty_tree;
|
||||
|
||||
/* The OID of the empty blob. */
|
||||
const struct object_id *empty_blob;
|
||||
|
||||
/* The all-zeros OID. */
|
||||
const struct object_id *null_oid;
|
||||
};
|
||||
extern const struct git_hash_algo hash_algos[GIT_HASH_NALGOS];
|
||||
|
||||
|
@ -161,67 +191,65 @@ static inline int hash_algo_by_ptr(const struct git_hash_algo *p)
|
|||
return p - hash_algos;
|
||||
}
|
||||
|
||||
/* The length in bytes and in hex digits of an object name (SHA-1 value). */
|
||||
#define GIT_SHA1_RAWSZ 20
|
||||
#define GIT_SHA1_HEXSZ (2 * GIT_SHA1_RAWSZ)
|
||||
/* The block size of SHA-1. */
|
||||
#define GIT_SHA1_BLKSZ 64
|
||||
|
||||
/* The length in bytes and in hex digits of an object name (SHA-256 value). */
|
||||
#define GIT_SHA256_RAWSZ 32
|
||||
#define GIT_SHA256_HEXSZ (2 * GIT_SHA256_RAWSZ)
|
||||
/* The block size of SHA-256. */
|
||||
#define GIT_SHA256_BLKSZ 64
|
||||
|
||||
/* The length in byte and in hex digits of the largest possible hash value. */
|
||||
#define GIT_MAX_RAWSZ GIT_SHA256_RAWSZ
|
||||
#define GIT_MAX_HEXSZ GIT_SHA256_HEXSZ
|
||||
/* The largest possible block size for any supported hash. */
|
||||
#define GIT_MAX_BLKSZ GIT_SHA256_BLKSZ
|
||||
|
||||
struct object_id {
|
||||
unsigned char hash[GIT_MAX_RAWSZ];
|
||||
};
|
||||
|
||||
#define the_hash_algo the_repository->hash_algo
|
||||
|
||||
extern const struct object_id null_oid;
|
||||
const struct object_id *null_oid(void);
|
||||
|
||||
static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2)
|
||||
static inline int hashcmp_algop(const unsigned char *sha1, const unsigned char *sha2, const struct git_hash_algo *algop)
|
||||
{
|
||||
/*
|
||||
* Teach the compiler that there are only two possibilities of hash size
|
||||
* here, so that it can optimize for this case as much as possible.
|
||||
*/
|
||||
if (the_hash_algo->rawsz == GIT_MAX_RAWSZ)
|
||||
if (algop->rawsz == GIT_MAX_RAWSZ)
|
||||
return memcmp(sha1, sha2, GIT_MAX_RAWSZ);
|
||||
return memcmp(sha1, sha2, GIT_SHA1_RAWSZ);
|
||||
}
|
||||
|
||||
static inline int oidcmp(const struct object_id *oid1, const struct object_id *oid2)
|
||||
static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2)
|
||||
{
|
||||
return hashcmp(oid1->hash, oid2->hash);
|
||||
return hashcmp_algop(sha1, sha2, the_hash_algo);
|
||||
}
|
||||
|
||||
static inline int hasheq(const unsigned char *sha1, const unsigned char *sha2)
|
||||
static inline int oidcmp(const struct object_id *oid1, const struct object_id *oid2)
|
||||
{
|
||||
const struct git_hash_algo *algop;
|
||||
if (!oid1->algo)
|
||||
algop = the_hash_algo;
|
||||
else
|
||||
algop = &hash_algos[oid1->algo];
|
||||
return hashcmp_algop(oid1->hash, oid2->hash, algop);
|
||||
}
|
||||
|
||||
static inline int hasheq_algop(const unsigned char *sha1, const unsigned char *sha2, const struct git_hash_algo *algop)
|
||||
{
|
||||
/*
|
||||
* We write this here instead of deferring to hashcmp so that the
|
||||
* compiler can properly inline it and avoid calling memcmp.
|
||||
*/
|
||||
if (the_hash_algo->rawsz == GIT_MAX_RAWSZ)
|
||||
if (algop->rawsz == GIT_MAX_RAWSZ)
|
||||
return !memcmp(sha1, sha2, GIT_MAX_RAWSZ);
|
||||
return !memcmp(sha1, sha2, GIT_SHA1_RAWSZ);
|
||||
}
|
||||
|
||||
static inline int hasheq(const unsigned char *sha1, const unsigned char *sha2)
|
||||
{
|
||||
return hasheq_algop(sha1, sha2, the_hash_algo);
|
||||
}
|
||||
|
||||
static inline int oideq(const struct object_id *oid1, const struct object_id *oid2)
|
||||
{
|
||||
return hasheq(oid1->hash, oid2->hash);
|
||||
const struct git_hash_algo *algop;
|
||||
if (!oid1->algo)
|
||||
algop = the_hash_algo;
|
||||
else
|
||||
algop = &hash_algos[oid1->algo];
|
||||
return hasheq_algop(oid1->hash, oid2->hash, algop);
|
||||
}
|
||||
|
||||
static inline int is_null_oid(const struct object_id *oid)
|
||||
{
|
||||
return oideq(oid, &null_oid);
|
||||
return oideq(oid, null_oid());
|
||||
}
|
||||
|
||||
static inline void hashcpy(unsigned char *sha_dst, const unsigned char *sha_src)
|
||||
|
@ -232,6 +260,7 @@ static inline void hashcpy(unsigned char *sha_dst, const unsigned char *sha_src)
|
|||
static inline void oidcpy(struct object_id *dst, const struct object_id *src)
|
||||
{
|
||||
memcpy(dst->hash, src->hash, GIT_MAX_RAWSZ);
|
||||
dst->algo = src->algo;
|
||||
}
|
||||
|
||||
static inline struct object_id *oiddup(const struct object_id *src)
|
||||
|
@ -249,11 +278,13 @@ static inline void hashclr(unsigned char *hash)
|
|||
static inline void oidclr(struct object_id *oid)
|
||||
{
|
||||
memset(oid->hash, 0, GIT_MAX_RAWSZ);
|
||||
oid->algo = hash_algo_by_ptr(the_hash_algo);
|
||||
}
|
||||
|
||||
static inline void oidread(struct object_id *oid, const unsigned char *hash)
|
||||
{
|
||||
memcpy(oid->hash, hash, the_hash_algo->rawsz);
|
||||
oid->algo = hash_algo_by_ptr(the_hash_algo);
|
||||
}
|
||||
|
||||
static inline int is_empty_blob_sha1(const unsigned char *sha1)
|
||||
|
@ -276,6 +307,11 @@ static inline int is_empty_tree_oid(const struct object_id *oid)
|
|||
return oideq(oid, the_hash_algo->empty_tree);
|
||||
}
|
||||
|
||||
static inline void oid_set_algo(struct object_id *oid, const struct git_hash_algo *algop)
|
||||
{
|
||||
oid->algo = hash_algo_by_ptr(algop);
|
||||
}
|
||||
|
||||
const char *empty_tree_oid_hex(void);
|
||||
const char *empty_blob_oid_hex(void);
|
||||
|
||||
|
|
20
hex.c
20
hex.c
|
@ -69,7 +69,10 @@ int get_sha1_hex(const char *hex, unsigned char *sha1)
|
|||
int get_oid_hex_algop(const char *hex, struct object_id *oid,
|
||||
const struct git_hash_algo *algop)
|
||||
{
|
||||
return get_hash_hex_algop(hex, oid->hash, algop);
|
||||
int ret = get_hash_hex_algop(hex, oid->hash, algop);
|
||||
if (!ret)
|
||||
oid_set_algo(oid, algop);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -80,7 +83,7 @@ int get_oid_hex_any(const char *hex, struct object_id *oid)
|
|||
{
|
||||
int i;
|
||||
for (i = GIT_HASH_NALGOS - 1; i > 0; i--) {
|
||||
if (!get_hash_hex_algop(hex, oid->hash, &hash_algos[i]))
|
||||
if (!get_oid_hex_algop(hex, oid, &hash_algos[i]))
|
||||
return i;
|
||||
}
|
||||
return GIT_HASH_UNKNOWN;
|
||||
|
@ -95,7 +98,7 @@ int parse_oid_hex_algop(const char *hex, struct object_id *oid,
|
|||
const char **end,
|
||||
const struct git_hash_algo *algop)
|
||||
{
|
||||
int ret = get_hash_hex_algop(hex, oid->hash, algop);
|
||||
int ret = get_oid_hex_algop(hex, oid, algop);
|
||||
if (!ret)
|
||||
*end = hex + algop->hexsz;
|
||||
return ret;
|
||||
|
@ -121,6 +124,13 @@ char *hash_to_hex_algop_r(char *buffer, const unsigned char *hash,
|
|||
char *buf = buffe |