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:
Junio C Hamano 2021-05-10 16:59:46 +09:00
commit aaa3c8065d
58 changed files with 305 additions and 198 deletions

View File

@ -203,7 +203,7 @@ static void queue_directory(const unsigned char *sha1,
d->mode = mode; d->mode = mode;
c->bottom = d; c->bottom = d;
d->len = xsnprintf(d->path, len, "%.*s%s/", (int)base->len, base->buf, filename); 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) static int write_directory(struct archiver_context *c)
@ -275,9 +275,11 @@ int write_archive_entries(struct archiver_args *args,
int err; int err;
struct strbuf path_in_archive = STRBUF_INIT; struct strbuf path_in_archive = STRBUF_INIT;
struct strbuf content = STRBUF_INIT; struct strbuf content = STRBUF_INIT;
struct object_id fake_oid = null_oid; struct object_id fake_oid;
int i; int i;
oidcpy(&fake_oid, null_oid());
if (args->baselen > 0 && args->base[args->baselen - 1] == '/') { if (args->baselen > 0 && args->base[args->baselen - 1] == '/') {
size_t len = args->baselen; size_t len = args->baselen;

View File

@ -242,7 +242,7 @@ static struct commit *fake_working_tree_commit(struct repository *r,
switch (st.st_mode & S_IFMT) { switch (st.st_mode & S_IFMT) {
case S_IFREG: case S_IFREG:
if (opt->flags.allow_textconv && 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); strbuf_attach(&buf, buf_ptr, buf_len, buf_len + 1);
else if (strbuf_read_file(&buf, read_from, st.st_size) != st.st_size) else if (strbuf_read_file(&buf, read_from, st.st_size) != st.st_size)
die_errno("cannot open or read '%s'", read_from); die_errno("cannot open or read '%s'", read_from);

View File

@ -322,7 +322,7 @@ void create_branch(struct repository *r,
transaction = ref_transaction_begin(&err); transaction = ref_transaction_begin(&err);
if (!transaction || if (!transaction ||
ref_transaction_update(transaction, ref.buf, ref_transaction_update(transaction, ref.buf,
&oid, forcing ? NULL : &null_oid, &oid, forcing ? NULL : null_oid(),
0, msg, &err) || 0, msg, &err) ||
ref_transaction_commit(transaction, &err)) ref_transaction_commit(transaction, &err))
die("%s", err.buf); die("%s", err.buf);

View File

@ -106,8 +106,8 @@ static int post_checkout_hook(struct commit *old_commit, struct commit *new_comm
int changed) int changed)
{ {
return run_hook_le(NULL, "post-checkout", return run_hook_le(NULL, "post-checkout",
oid_to_hex(old_commit ? &old_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), oid_to_hex(new_commit ? &new_commit->object.oid : null_oid()),
changed ? "1" : "0", NULL); changed ? "1" : "0", NULL);
/* "new_commit" can be NULL when checking out from the index before /* "new_commit" can be NULL when checking out from the index before
a commit exists. */ 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.src_index = &the_index;
opts.dst_index = &the_index; opts.dst_index = &the_index;
init_checkout_metadata(&opts.meta, info->refname, init_checkout_metadata(&opts.meta, info->refname,
info->commit ? &info->commit->object.oid : &null_oid, info->commit ? &info->commit->object.oid : null_oid(),
NULL); NULL);
parse_tree(tree); parse_tree(tree);
init_tree_desc(&tree_desc, tree->buffer, tree->size); init_tree_desc(&tree_desc, tree->buffer, tree->size);

View File

@ -820,7 +820,7 @@ static int checkout(int submodule_progress)
if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK)) if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
die(_("unable to write new index file")); 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); oid_to_hex(&oid), "1", NULL);
if (!err && (option_recurse_submodules.nr > 0)) { if (!err && (option_recurse_submodules.nr > 0)) {

View File

@ -502,7 +502,7 @@ static void describe_blob(struct object_id oid, struct strbuf *dst)
{ {
struct rev_info revs; struct rev_info revs;
struct strvec args = STRVEC_INIT; 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", strvec_pushl(&args, "internal: The first arg is not parsed",
"--objects", "--in-commit-order", "--reverse", "HEAD", "--objects", "--in-commit-order", "--reverse", "HEAD",

View File

@ -98,7 +98,7 @@ static int builtin_diff_b_f(struct rev_info *revs,
stuff_change(&revs->diffopt, stuff_change(&revs->diffopt,
blob[0]->mode, canon_mode(st.st_mode), blob[0]->mode, canon_mode(st.st_mode),
&blob[0]->item->oid, &null_oid, &blob[0]->item->oid, null_oid(),
1, 0, 1, 0,
blob[0]->path ? blob[0]->path : path, blob[0]->path ? blob[0]->path : path,
path); path);

View File

@ -870,7 +870,7 @@ static void handle_tag(const char *name, struct tag *tag)
p = rewrite_commit((struct commit *)tagged); p = rewrite_commit((struct commit *)tagged);
if (!p) { if (!p) {
printf("reset %s\nfrom %s\n\n", printf("reset %s\nfrom %s\n\n",
name, oid_to_hex(&null_oid)); name, oid_to_hex(null_oid()));
free(buf); free(buf);
return; return;
} }
@ -884,7 +884,7 @@ static void handle_tag(const char *name, struct tag *tag)
if (tagged->type == OBJ_TAG) { if (tagged->type == OBJ_TAG) {
printf("reset %s\nfrom %s\n\n", 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); skip_prefix(name, "refs/tags/", &name);
printf("tag %s\n", name); printf("tag %s\n", name);
@ -1016,7 +1016,7 @@ static void handle_tags_and_duplicates(struct string_list *extras)
* it. * it.
*/ */
printf("reset %s\nfrom %s\n\n", printf("reset %s\nfrom %s\n\n",
name, oid_to_hex(&null_oid)); name, oid_to_hex(null_oid()));
continue; continue;
} }
@ -1035,7 +1035,7 @@ static void handle_tags_and_duplicates(struct string_list *extras)
if (!reference_excluded_commits) { if (!reference_excluded_commits) {
/* delete the ref */ /* delete the ref */
printf("reset %s\nfrom %s\n\n", printf("reset %s\nfrom %s\n\n",
name, oid_to_hex(&null_oid)); name, oid_to_hex(null_oid()));
continue; continue;
} }
/* set ref to commit using oid, not mark */ /* set ref to commit using oid, not mark */
@ -1146,7 +1146,7 @@ static void handle_deletes(void)
continue; continue;
printf("reset %s\nfrom %s\n\n", printf("reset %s\nfrom %s\n\n",
refspec->dst, oid_to_hex(&null_oid)); refspec->dst, oid_to_hex(null_oid()));
} }
} }

View File

@ -940,7 +940,7 @@ static int store_object(
the_hash_algo->init_fn(&c); the_hash_algo->init_fn(&c);
the_hash_algo->update_fn(&c, hdr, hdrlen); the_hash_algo->update_fn(&c, hdr, hdrlen);
the_hash_algo->update_fn(&c, dat->buf, dat->len); 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) if (oidout)
oidcpy(oidout, &oid); 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); git_deflate_end(&s);
the_hash_algo->final_fn(oid.hash, &c); the_hash_algo->final_oid_fn(&oid, &c);
if (oidout) if (oidout)
oidcpy(oidout, &oid); oidcpy(oidout, &oid);
@ -1276,8 +1276,8 @@ static void load_tree(struct tree_entry *root)
e->versions[0].mode = e->versions[1].mode; e->versions[0].mode = e->versions[1].mode;
e->name = to_atom(c, strlen(c)); e->name = to_atom(c, strlen(c));
c += e->name->str_len + 1; c += e->name->str_len + 1;
hashcpy(e->versions[0].oid.hash, (unsigned char *)c); oidread(&e->versions[0].oid, (unsigned char *)c);
hashcpy(e->versions[1].oid.hash, (unsigned char *)c); oidread(&e->versions[1].oid, (unsigned char *)c);
c += the_hash_algo->rawsz; c += the_hash_algo->rawsz;
} }
free(buf); free(buf);

View File

@ -421,7 +421,7 @@ static int grep_submodule(struct grep_opt *opt,
struct grep_opt subopt; struct grep_opt subopt;
int hit; int hit;
sub = submodule_from_path(superproject, &null_oid, path); sub = submodule_from_path(superproject, null_oid(), path);
if (!is_submodule_active(superproject, path)) if (!is_submodule_active(superproject, path))
return 0; return 0;

View File

@ -489,7 +489,7 @@ static void *unpack_entry_data(off_t offset, unsigned long size,
bad_object(offset, _("inflate returned %d"), status); bad_object(offset, _("inflate returned %d"), status);
git_inflate_end(&stream); git_inflate_end(&stream);
if (oid) if (oid)
the_hash_algo->final_fn(oid->hash, &c); the_hash_algo->final_oid_fn(oid, &c);
return buf == fixed_buf ? NULL : buf; return buf == fixed_buf ? NULL : buf;
} }
@ -524,7 +524,7 @@ static void *unpack_raw_entry(struct object_entry *obj,
switch (obj->type) { switch (obj->type) {
case OBJ_REF_DELTA: 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); use(the_hash_algo->rawsz);
break; break;
case OBJ_OFS_DELTA: 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[1].idx.offset += write_compressed(f, buf, size);
obj[0].idx.crc32 = crc32_end(f); obj[0].idx.crc32 = crc32_end(f);
hashflush(f); hashflush(f);
hashcpy(obj->idx.oid.hash, sha1); oidread(&obj->idx.oid, sha1);
return obj; return obj;
} }

View File

@ -210,7 +210,7 @@ static void show_submodule(struct repository *superproject,
{ {
struct repository subrepo; struct repository subrepo;
const struct submodule *sub = submodule_from_path(superproject, const struct submodule *sub = submodule_from_path(superproject,
&null_oid, path); null_oid(), path);
if (repo_submodule_init(&subrepo, superproject, sub)) if (repo_submodule_init(&subrepo, superproject, sub))
return; return;

View File

@ -1030,7 +1030,7 @@ static void write_pack_file(void)
write_order = compute_write_order(); write_order = compute_write_order();
do { do {
struct object_id oid; unsigned char hash[GIT_MAX_RAWSZ];
char *pack_tmp_name = NULL; char *pack_tmp_name = NULL;
if (pack_to_stdout) if (pack_to_stdout)
@ -1059,13 +1059,13 @@ static void write_pack_file(void)
* If so, rewrite it like in fast-import * If so, rewrite it like in fast-import
*/ */
if (pack_to_stdout) { 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) { } 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 { } else {
int fd = finalize_hashfile(f, oid.hash, 0); int fd = finalize_hashfile(f, hash, 0);
fixup_pack_header_footer(fd, oid.hash, pack_tmp_name, fixup_pack_header_footer(fd, hash, pack_tmp_name,
nr_written, oid.hash, offset); nr_written, hash, offset);
close(fd); close(fd);
if (write_bitmap_index) { if (write_bitmap_index) {
if (write_bitmap_index != WRITE_BITMAP_QUIET) if (write_bitmap_index != WRITE_BITMAP_QUIET)
@ -1100,17 +1100,17 @@ static void write_pack_file(void)
strbuf_addf(&tmpname, "%s-", base_name); strbuf_addf(&tmpname, "%s-", base_name);
if (write_bitmap_index) { if (write_bitmap_index) {
bitmap_writer_set_checksum(oid.hash); bitmap_writer_set_checksum(hash);
bitmap_writer_build_type_index( bitmap_writer_build_type_index(
&to_pack, written_list, nr_written); &to_pack, written_list, nr_written);
} }
finish_tmp_packfile(&tmpname, pack_tmp_name, finish_tmp_packfile(&tmpname, pack_tmp_name,
written_list, nr_written, written_list, nr_written,
&pack_idx_opts, oid.hash); &pack_idx_opts, hash);
if (write_bitmap_index) { 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); stop_progress(&progress_state);
@ -1124,7 +1124,7 @@ static void write_pack_file(void)
strbuf_release(&tmpname); strbuf_release(&tmpname);
free(pack_tmp_name); free(pack_tmp_name);
puts(oid_to_hex(&oid)); puts(hash_to_hex(hash));
} }
/* mark written objects as written to previous pack */ /* mark written objects as written to previous pack */

View File

@ -20,7 +20,7 @@ static int load_all_packs, verbose, alt_odb;
struct llist_item { struct llist_item {
struct llist_item *next; struct llist_item *next;
const struct object_id *oid; struct object_id oid;
}; };
static struct llist { static struct llist {
struct llist_item *front; 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, static inline struct llist_item *llist_insert(struct llist *list,
struct llist_item *after, struct llist_item *after,
const struct object_id *oid) const unsigned char *oid)
{ {
struct llist_item *new_item = llist_item_get(); struct llist_item *new_item = llist_item_get();
new_item->oid = oid; oidread(&new_item->oid, oid);
new_item->next = NULL; new_item->next = NULL;
if (after != 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, 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); 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; l = (hint == NULL) ? list->front : hint;
while (l) { while (l) {
int cmp = oidcmp(l->oid, oid); int cmp = oidcmp(&l->oid, oid);
if (cmp > 0) { /* we insert before this entry */ 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 */ if (!cmp) { /* already exists */
return l; return l;
@ -141,11 +141,11 @@ static inline struct llist_item *llist_insert_sorted_unique(struct llist *list,
l = l->next; l = l->next;
} }
/* insert at the end */ /* 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 */ /* 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; struct llist_item *prev, *l;
@ -153,7 +153,7 @@ redo_from_start:
l = (hint == NULL) ? list->front : hint; l = (hint == NULL) ? list->front : hint;
prev = NULL; prev = NULL;
while (l) { 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 */ if (cmp > 0) /* not in list, since sorted */
return prev; return prev;
if (!cmp) { /* found */ if (!cmp) { /* found */
@ -188,7 +188,7 @@ static void llist_sorted_difference_inplace(struct llist *A,
b = B->front; b = B->front;
while (b) { while (b) {
hint = llist_sorted_remove(A, b->oid, hint); hint = llist_sorted_remove(A, b->oid.hash, hint);
b = b->next; b = b->next;
} }
} }
@ -260,10 +260,10 @@ static void cmp_two_packs(struct pack_list *p1, struct pack_list *p2)
/* cmp ~ p1 - p2 */ /* cmp ~ p1 - p2 */
if (cmp == 0) { if (cmp == 0) {
p1_hint = llist_sorted_remove(p1->unique_objects, p1_hint = llist_sorted_remove(p1->unique_objects,
(const struct object_id *)(p1_base + p1_off), p1_base + p1_off,
p1_hint); p1_hint);
p2_hint = llist_sorted_remove(p2->unique_objects, p2_hint = llist_sorted_remove(p2->unique_objects,
(const struct object_id *)(p1_base + p1_off), p1_base + p1_off,
p2_hint); p2_hint);
p1_off += p1_step; p1_off += p1_step;
p2_off += p2_step; p2_off += p2_step;
@ -455,7 +455,7 @@ static void load_all_objects(void)
l = pl->remaining_objects->front; l = pl->remaining_objects->front;
while (l) { while (l) {
hint = llist_insert_sorted_unique(all_objects, hint = llist_insert_sorted_unique(all_objects,
l->oid, hint); &l->oid, hint);
l = l->next; l = l->next;
} }
pl = pl->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); base += 256 * 4 + ((p->index_version < 2) ? 4 : 8);
step = the_hash_algo->rawsz + ((p->index_version < 2) ? 4 : 0); step = the_hash_algo->rawsz + ((p->index_version < 2) ? 4 : 0);
while (off < p->num_objects * step) { 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; off += step;
} }
l.all_objects_size = l.remaining_objects->size; l.all_objects_size = l.remaining_objects->size;

View File

@ -485,7 +485,7 @@ static const char * const builtin_rebase_interactive_usage[] = {
int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) int cmd_rebase__interactive(int argc, const char **argv, const char *prefix)
{ {
struct rebase_options opts = REBASE_OPTIONS_INIT; 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; enum action command = ACTION_NONE;
struct option options[] = { struct option options[] = {
OPT_NEGBIT(0, "ff", &opts.flags, N_("allow fast-forward"), 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); merge_bases = get_merge_bases(onto, head);
if (!merge_bases || merge_bases->next) { if (!merge_bases || merge_bases->next) {
oidcpy(merge_base, &null_oid); oidcpy(merge_base, null_oid());
goto done; goto done;
} }

View File

@ -329,7 +329,7 @@ static void write_head_info(void)
for_each_alternate_ref(show_one_alternate_ref, &seen); for_each_alternate_ref(show_one_alternate_ref, &seen);
oidset_clear(&seen); oidset_clear(&seen);
if (!sent_capabilities) if (!sent_capabilities)
show_ref("capabilities^{}", &null_oid); show_ref("capabilities^{}", null_oid());
advertise_shallow_grafts(1); advertise_shallow_grafts(1);

View File

@ -71,9 +71,11 @@ int cmd_show_index(int argc, const char **argv, const char *prefix)
uint32_t off; uint32_t off;
} *entries; } *entries;
ALLOC_ARRAY(entries, nr); 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) if (fread(entries[i].oid.hash, hashsz, 1, stdin) != 1)
die("unable to read sha1 %u/%u", i, nr); 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++) for (i = 0; i < nr; i++)
if (fread(&entries[i].crc, 4, 1, stdin) != 1) if (fread(&entries[i].crc, 4, 1, stdin) != 1)
die("unable to read crc %u/%u", i, nr); die("unable to read crc %u/%u", i, nr);

View File

@ -426,7 +426,8 @@ static int module_list(int argc, const char **argv, const char *prefix)
const struct cache_entry *ce = list.entries[i]; const struct cache_entry *ce = list.entries[i];
if (ce_stage(ce)) 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 else
printf("%06o %s %d\t", ce->ce_mode, printf("%06o %s %d\t", ce->ce_mode,
oid_to_hex(&ce->oid), ce_stage(ce)); 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); 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) if (!sub)
die(_("No url found for submodule path '%s' in .gitmodules"), 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); 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) if (!sub)
die(_("No url found for submodule path '%s' in .gitmodules"), 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; struct strbuf buf = STRBUF_INIT;
const char *git_dir; 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'"), die(_("no submodule mapping found in .gitmodules for path '%s'"),
path); path);
displaypath = get_submodule_displaypath(path, prefix); displaypath = get_submodule_displaypath(path, prefix);
if ((CE_STAGEMASK & ce_flags) >> CE_STAGESHIFT) { 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; goto cleanup;
} }
@ -916,7 +917,7 @@ static int module_name(int argc, const char **argv, const char *prefix)
if (argc != 2) if (argc != 2)
usage(_("git submodule--helper name <path>")); 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) if (!sub)
die(_("no submodule mapping found in .gitmodules for path '%s'"), 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; char *errmsg = NULL;
int total_commits = -1; 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)) { if (S_ISGITLINK(p->mod_dst)) {
struct ref_store *refs = get_submodule_ref_store(p->sm_path); struct ref_store *refs = get_submodule_ref_store(p->sm_path);
if (refs) if (refs)
@ -1177,7 +1178,7 @@ static void prepare_submodule_summary(struct summary_cb *info,
if (info->for_status && p->status != 'A' && if (info->for_status && p->status != 'A' &&
(sub = submodule_from_path(the_repository, (sub = submodule_from_path(the_repository,
&null_oid, p->sm_path))) { null_oid(), p->sm_path))) {
char *config_key = NULL; char *config_key = NULL;
const char *value; const char *value;
int ignore_all = 0; 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)) if (!is_submodule_active(the_repository, path))
return; return;
sub = submodule_from_path(the_repository, &null_oid, path); sub = submodule_from_path(the_repository, null_oid(), path);
if (sub && sub->url) { if (sub && sub->url) {
if (starts_with_dot_dot_slash(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; struct strbuf sb_config = STRBUF_INIT;
char *sub_git_dir = xstrfmt("%s/.git", path); 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) if (!sub || !sub->name)
goto cleanup; goto cleanup;
@ -1925,7 +1926,7 @@ static void determine_submodule_update_strategy(struct repository *r,
const char *update, const char *update,
struct submodule_update_strategy *out) 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; char *key;
const char *val; const char *val;
@ -2077,7 +2078,7 @@ static int prepare_to_clone_next_submodule(const struct cache_entry *ce,
goto cleanup; 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) if (suc->recursive_prefix)
displaypath = relative_path(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; const char *branch = NULL;
char *key; char *key;
sub = submodule_from_path(the_repository, &null_oid, path); sub = submodule_from_path(the_repository, null_oid(), path);
if (!sub) if (!sub)
return NULL; return NULL;
@ -2533,7 +2534,7 @@ static int ensure_core_worktree(int argc, const char **argv, const char *prefix)
path = argv[1]; path = argv[1];
sub = submodule_from_path(the_repository, &null_oid, path); sub = submodule_from_path(the_repository, null_oid(), path);
if (!sub) if (!sub)
BUG("We could get the submodule handle before?"); BUG("We could get the submodule handle before?");

View File

@ -355,7 +355,7 @@ static void unpack_delta_entry(enum object_type type, unsigned long delta_size,
struct object_id base_oid; struct object_id base_oid;
if (type == OBJ_REF_DELTA) { 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); use(the_hash_algo->rawsz);
delta_data = get_data(delta_size); delta_data = get_data(delta_size);
if (dry_run || !delta_data) { 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. * has not been resolved yet.
*/ */
oidclr(&obj_list[nr].oid); 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; return;
} }
} }
@ -576,7 +577,7 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)
the_hash_algo->init_fn(&ctx); the_hash_algo->init_fn(&ctx);
unpack_all(); unpack_all();
the_hash_algo->update_fn(&ctx, buffer, offset); 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) { if (strict) {
write_rest(); write_rest();
if (fsck_finish(&fsck_options)) if (fsck_finish(&fsck_options))

View File

@ -331,7 +331,7 @@ static int add_worktree(const char *path, const char *refname,
*/ */
strbuf_reset(&sb); strbuf_reset(&sb);
strbuf_addf(&sb, "%s/HEAD", sb_repo.buf); 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_reset(&sb);
strbuf_addf(&sb, "%s/commondir", sb_repo.buf); strbuf_addf(&sb, "%s/commondir", sb_repo.buf);
write_file(sb.buf, "../.."); write_file(sb.buf, "../..");
@ -394,7 +394,7 @@ done:
cp.argv = NULL; cp.argv = NULL;
cp.trace2_hook_name = "post-checkout"; cp.trace2_hook_name = "post-checkout";
strvec_pushl(&cp.args, absolute_path(hook), strvec_pushl(&cp.args, absolute_path(hook),
oid_to_hex(&null_oid), oid_to_hex(null_oid()),
oid_to_hex(&commit->object.oid), oid_to_hex(&commit->object.oid),
"1", NULL); "1", NULL);
ret = run_command(&cp); ret = run_command(&cp);

View File

@ -238,7 +238,7 @@ static int deflate_to_pack(struct bulk_checkin_state *state,
if (lseek(fd, seekback, SEEK_SET) == (off_t) -1) if (lseek(fd, seekback, SEEK_SET) == (off_t) -1)
return error("cannot seek back"); 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) if (!idx)
return 0; return 0;

View File

@ -1068,7 +1068,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
&result_size, NULL, NULL); &result_size, NULL, NULL);
} else if (textconv) { } else if (textconv) {
struct diff_filespec *df = alloc_filespec(elem->path); 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); result_size = fill_textconv(opt->repo, textconv, df, &result);
free_filespec(df); free_filespec(df);
} else if (0 <= (fd = open(elem->path, O_RDONLY))) { } else if (0 <= (fd = open(elem->path, O_RDONLY))) {

View File

@ -425,7 +425,7 @@ struct commit_graph *parse_commit_graph(struct repository *r,
FREE_AND_NULL(graph->bloom_filter_settings); 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)) if (verify_commit_graph_lite(graph))
goto free_and_return; 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; 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, 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 + commit_data = g->chunk_commit_data +
GRAPH_DATA_WIDTH * (graph_pos - g->num_commits_in_base); 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)); set_commit_tree(c, lookup_tree(r, &oid));
return c->maybe_tree; 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; struct lock_file lk = LOCK_INIT;
const unsigned hashsz = the_hash_algo->rawsz; const unsigned hashsz = the_hash_algo->rawsz;
struct strbuf progress_title = STRBUF_INIT; struct strbuf progress_title = STRBUF_INIT;
struct object_id file_hash;
struct chunkfile *cf; struct chunkfile *cf;
unsigned char file_hash[GIT_MAX_RAWSZ];
if (ctx->split) { if (ctx->split) {
struct strbuf tmp_file = STRBUF_INIT; 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); 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); free_chunkfile(cf);
if (ctx->split) { if (ctx->split) {
@ -1945,7 +1945,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
unlink(graph_name); 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, final_graph_name = get_split_graph_filename(ctx->odb,
ctx->commit_graph_hash_after[ctx->num_commit_graphs_after - 1]); 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; 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; struct commit_graph *g = ctx->r->objects->commit_graph;
for (i = 0; i < g->num_commits; i++) { for (i = 0; i < g->num_commits; i++) {
struct object_id oid; 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); 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) int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags)
{ {
uint32_t i, cur_fanout_pos = 0; 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; int generation_zero = 0;
struct hashfile *f; struct hashfile *f;
int devnull; 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); devnull = open("/dev/null", O_WRONLY);
f = hashfd(devnull, NULL); f = hashfd(devnull, NULL);
hashwrite(f, g->data, g->data_len - g->hash_len); hashwrite(f, g->data, g->data_len - g->hash_len);
finalize_hashfile(f, checksum.hash, CSUM_CLOSE); finalize_hashfile(f, checksum, CSUM_CLOSE);
if (!hasheq(checksum.hash, g->data + g->data_len - g->hash_len)) { if (!hasheq(checksum, g->data + g->data_len - g->hash_len)) {
graph_report(_("the commit-graph file has incorrect checksum and is likely corrupt")); graph_report(_("the commit-graph file has incorrect checksum and is likely corrupt"));
verify_commit_graph_error = VERIFY_COMMIT_GRAPH_ERROR_HASH; 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++) { for (i = 0; i < g->num_commits; i++) {
struct commit *graph_commit; 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) if (i && oidcmp(&prev_oid, &cur_oid) >= 0)
graph_report(_("commit-graph has incorrect OID order: %s then %s"), 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; timestamp_t generation;
display_progress(progress, i + 1); 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); graph_commit = lookup_commit(r, &cur_oid);
odb_commit = (struct commit *)create_object(r, &cur_oid, alloc_commit_node(r)); odb_commit = (struct commit *)create_object(r, &cur_oid, alloc_commit_node(r));

View File

@ -254,7 +254,7 @@ static int process_dummy_ref(const struct packet_reader *reader)
return 0; return 0;
name++; 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) static void check_no_capabilities(const char *line, int len)

View File

@ -232,7 +232,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
ce_intent_to_add(ce)) { ce_intent_to_add(ce)) {
newmode = ce_mode_from_stat(ce, st.st_mode); newmode = ce_mode_from_stat(ce, st.st_mode);
diff_addremove(&revs->diffopt, '+', newmode, diff_addremove(&revs->diffopt, '+', newmode,
&null_oid, 0, ce->name, 0); null_oid(), 0, ce->name, 0);
continue; continue;
} }
@ -249,7 +249,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
} }
oldmode = ce->ce_mode; oldmode = ce->ce_mode;
old_oid = &ce->oid; old_oid = &ce->oid;
new_oid = changed ? &null_oid : &ce->oid; new_oid = changed ? null_oid() : &ce->oid;
diff_change(&revs->diffopt, oldmode, newmode, diff_change(&revs->diffopt, oldmode, newmode,
old_oid, new_oid, old_oid, new_oid,
!is_null_oid(old_oid), !is_null_oid(old_oid),
@ -307,7 +307,7 @@ static int get_stat_data(const struct index_state *istate,
0, dirty_submodule); 0, dirty_submodule);
if (changed) { if (changed) {
mode = ce_mode_from_stat(ce, st.st_mode); mode = ce_mode_from_stat(ce, st.st_mode);
oid = &null_oid; oid = null_oid();
} }
} }

View File

@ -83,7 +83,7 @@ static struct diff_filespec *noindex_filespec(const char *name, int mode)
if (!name) if (!name)
name = "/dev/null"; name = "/dev/null";
s = alloc_filespec(name); s = alloc_filespec(name);
fill_filespec(s, &null_oid, 0, mode); fill_filespec(s, null_oid(), 0, mode);
if (name == file_from_standard_input) if (name == file_from_standard_input)
populate_from_stdin(s); populate_from_stdin(s);
return s; return s;

6
diff.c
View File

@ -4190,7 +4190,7 @@ static struct diff_tempfile *prepare_temp_file(struct repository *r,
die_errno("readlink(%s)", name); die_errno("readlink(%s)", name);
prep_temp_blob(r->index, name, temp, sb.buf, sb.len, prep_temp_blob(r->index, name, temp, sb.buf, sb.len,
(one->oid_valid ? (one->oid_valid ?
&one->oid : &null_oid), &one->oid : null_oid()),
(one->oid_valid ? (one->oid_valid ?
one->mode : S_IFLNK)); one->mode : S_IFLNK));
strbuf_release(&sb); 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 */ /* we can borrow from the file in the work tree */
temp->name = name; temp->name = name;
if (!one->oid_valid) if (!one->oid_valid)
oid_to_hex_r(temp->hex, &null_oid); oid_to_hex_r(temp->hex, null_oid());
else else
oid_to_hex_r(temp->hex, &one->oid); oid_to_hex_r(temp->hex, &one->oid);
/* Even though we may sometimes borrow the /* 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) if (!stable)
the_hash_algo->final_fn(oid->hash, &ctx); the_hash_algo->final_oid_fn(oid, &ctx);
return 0; return 0;
} }

6
dir.c
View File

@ -3344,7 +3344,7 @@ static void read_oid(size_t pos, void *cb)
rd->data = rd->end + 1; rd->data = rd->end + 1;
return; return;
} }
hashcpy(ud->exclude_oid.hash, rd->data); oidread(&ud->exclude_oid, rd->data);
rd->data += the_hash_algo->rawsz; 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) const unsigned char *sha1)
{ {
stat_data_from_disk(&oid_stat->stat, data); stat_data_from_disk(&oid_stat->stat, data);
hashcpy(oid_stat->oid.hash, sha1); oidread(&oid_stat->oid, sha1);
oid_stat->valid = 1; oid_stat->valid = 1;
} }
@ -3558,7 +3558,7 @@ static void connect_wt_gitdir_in_nested(const char *sub_worktree,
*/ */
i++; 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)) if (!sub || !is_submodule_active(&subrepo, ce->name))
/* .gitmodules broken or inactive sub */ /* .gitmodules broken or inactive sub */
continue; continue;

2
grep.c
View File

@ -1494,7 +1494,7 @@ static int fill_textconv_grep(struct repository *r,
fill_filespec(df, gs->identifier, 1, 0100644); fill_filespec(df, gs->identifier, 1, 0100644);
break; break;
case GREP_SOURCE_FILE: case GREP_SOURCE_FILE:
fill_filespec(df, &null_oid, 0, 0100644); fill_filespec(df, null_oid(), 0, 0100644);
break; break;
default: default:
BUG("attempt to textconv something without a path?"); BUG("attempt to textconv something without a path?");

98
hash.h
View File

@ -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). */ /* Number of algorithms supported (including unknown). */
#define GIT_HASH_NALGOS (GIT_HASH_SHA256 + 1) #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. */ /* A suitably aligned type for stack allocations of hash contexts. */
union git_hash_ctx { union git_hash_ctx {
git_SHA_CTX sha1; 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_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_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_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 { struct git_hash_algo {
/* /*
@ -138,11 +162,17 @@ struct git_hash_algo {
/* The hash finalization function. */ /* The hash finalization function. */
git_hash_final_fn final_fn; 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. */ /* The OID of the empty tree. */
const struct object_id *empty_tree; const struct object_id *empty_tree;
/* The OID of the empty blob. */ /* The OID of the empty blob. */
const struct object_id *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]; 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; 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 #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 * 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. * 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_MAX_RAWSZ);
return memcmp(sha1, sha2, GIT_SHA1_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 * We write this here instead of deferring to hashcmp so that the
* compiler can properly inline it and avoid calling memcmp. * 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_MAX_RAWSZ);
return !memcmp(sha1, sha2, GIT_SHA1_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) 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) 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) 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) static inline void oidcpy(struct object_id *dst, const struct object_id *src)
{ {
memcpy(dst->hash, src->hash, GIT_MAX_RAWSZ); memcpy(dst->hash, src->hash, GIT_MAX_RAWSZ);
dst->algo = src->algo;
} }
static inline struct object_id *oiddup(const struct object_id *src) 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) static inline void oidclr(struct object_id *oid)
{ {
memset(oid->hash, 0, GIT_MAX_RAWSZ); 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) static inline void oidread(struct object_id *oid, const unsigned char *hash)
{ {
memcpy(oid->hash, hash, the_hash_algo->rawsz); 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) 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); 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_tree_oid_hex(void);
const char *empty_blob_oid_hex(void); const char *empty_blob_oid_hex(void);

20
hex.c
View File

@ -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, int get_oid_hex_algop(const char *hex, struct object_id *oid,
const struct git_hash_algo *algop) 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; int i;
for (i = GIT_HASH_NALGOS - 1; i > 0; 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 i;
} }
return GIT_HASH_UNKNOWN; return GIT_HASH_UNKNOWN;
@ -95,7 +98,7 @@ int parse_oid_hex_algop(const char *hex, struct object_id *oid,
const char **end, const char **end,
const struct git_hash_algo *algop) 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) if (!ret)
*end = hex + algop->hexsz; *end = hex + algop->hexsz;
return ret; return ret;
@ -121,6 +124,13 @@ char *hash_to_hex_algop_r(char *buffer, const unsigned char *hash,
char *buf = buffer; char *buf = buffer;
int i; int i;
/*
* Our struct object_id has been memset to 0, so default to printing
* using the default hash.
*/
if (algop == &hash_algos[0])
algop = the_hash_algo;
for (i = 0; i < algop->rawsz; i++) { for (i = 0; i < algop->rawsz; i++) {
unsigned int val = *hash++; unsigned int val = *hash++;
*buf++ = hex[val >> 4]; *buf++ = hex[val >> 4];
@ -133,7 +143,7 @@ char *hash_to_hex_algop_r(char *buffer, const unsigned char *hash,
char *oid_to_hex_r(char *buffer, const struct object_id *oid) char *oid_to_hex_r(char *buffer, const struct object_id *oid)
{ {
return hash_to_hex_algop_r(buffer, oid->hash, the_hash_algo); return hash_to_hex_algop_r(buffer, oid->hash, &hash_algos[oid->algo]);
} }
char *hash_to_hex_algop(const unsigned char *hash, const struct git_hash_algo *algop) char *hash_to_hex_algop(const unsigned char *hash, const struct git_hash_algo *algop)
@ -151,5 +161,5 @@ char *hash_to_hex(const unsigned char *hash)
char *oid_to_hex(const struct object_id *oid) char *oid_to_hex(const struct object_id *oid)
{ {
return hash_to_hex_algop(oid->hash, the_hash_algo); return hash_to_hex_algop(oid->hash, &hash_algos[oid->algo]);
} }

View File

@ -1022,6 +1022,8 @@ static void remote_ls(const char *path, int flags,
/* extract hex from sharded "xx/x{38}" filename */ /* extract hex from sharded "xx/x{38}" filename */
static int get_oid_hex_from_objpath(const char *path, struct object_id *oid) static int get_oid_hex_from_objpath(const char *path, struct object_id *oid)
{ {
oid->algo = hash_algo_by_ptr(the_hash_algo);
if (strlen(path) != the_hash_algo->hexsz + 1) if (strlen(path) != the_hash_algo->hexsz + 1)
return -1; return -1;

View File

@ -155,7 +155,7 @@ static void prefetch(struct walker *walker, unsigned char *sha1)
newreq = xmalloc(sizeof(*newreq)); newreq = xmalloc(sizeof(*newreq));
newreq->walker = walker; newreq->walker = walker;
hashcpy(newreq->oid.hash, sha1); oidread(&newreq->oid, sha1);
newreq->repo = data->alt; newreq->repo = data->alt;
newreq->state = WAITING; newreq->state = WAITING;
newreq->req = NULL; newreq->req = NULL;

2
http.c
View File

@ -2576,7 +2576,7 @@ int finish_http_object_request(struct http_object_request *freq)
} }
git_inflate_end(&freq->stream); git_inflate_end(&freq->stream);
the_hash_algo->final_fn(freq->real_oid.hash, &freq->c); the_hash_algo->final_oid_fn(&freq->real_oid, &freq->c);
if (freq->zret != Z_STREAM_END) { if (freq->zret != Z_STREAM_END) {
unlink_or_warn(freq->tmpfile.buf); unlink_or_warn(freq->tmpfile.buf);
return -1; return -1;

View File

@ -419,7 +419,7 @@ void log_write_email_headers(struct rev_info *opt, struct commit *commit,
{ {
const char *extra_headers = opt->extra_headers; const char *extra_headers = opt->extra_headers;
const char *name = oid_to_hex(opt->zero_commit ? const char *name = oid_to_hex(opt->zero_commit ?
&null_oid : &commit->object.oid); null_oid() : &commit->object.oid);
*need_8bit_cte_p = 0; /* unknown */ *need_8bit_cte_p = 0; /* unknown */

View File

@ -226,7 +226,7 @@ static int splice_tree(const struct object_id *oid1, const char *prefix,
oid_to_hex(oid1)); oid_to_hex(oid1));
if (*subpath) { if (*subpath) {
struct object_id tree_oid; struct object_id tree_oid;
hashcpy(tree_oid.hash, rewrite_here); oidread(&tree_oid, rewrite_here);
status = splice_tree(&tree_oid, subpath, oid2, &subtree); status = splice_tree(&tree_oid, subpath, oid2, &subtree);
if (status) if (status)
return status; return status;

View File

@ -1406,7 +1406,7 @@ static int handle_content_merge(struct merge_options *opt,
two_way = ((S_IFMT & o->mode) != (S_IFMT & a->mode)); two_way = ((S_IFMT & o->mode) != (S_IFMT & a->mode));
merge_status = merge_3way(opt, path, merge_status = merge_3way(opt, path,
two_way ? &null_oid : &o->oid, two_way ? null_oid() : &o->oid,
&a->oid, &b->oid, &a->oid, &b->oid,
pathnames, extra_marker_size, pathnames, extra_marker_size,
&result_buf); &result_buf);
@ -1428,7 +1428,7 @@ static int handle_content_merge(struct merge_options *opt,
} else if (S_ISGITLINK(a->mode)) { } else if (S_ISGITLINK(a->mode)) {
int two_way = ((S_IFMT & o->mode) != (S_IFMT & a->mode)); int two_way = ((S_IFMT & o->mode) != (S_IFMT & a->mode));
clean = merge_submodule(opt, pathnames[0], clean = merge_submodule(opt, pathnames[0],
two_way ? &null_oid : &o->oid, two_way ? null_oid() : &o->oid,
&a->oid, &b->oid, &result->oid); &a->oid, &b->oid, &result->oid);
if (opt->priv->call_depth && two_way && !clean) { if (opt->priv->call_depth && two_way && !clean) {
result->mode = o->mode; result->mode = o->mode;
@ -2230,7 +2230,7 @@ static int process_renames(struct merge_options *opt,
if (type_changed) { if (type_changed) {
/* rename vs. typechange */ /* rename vs. typechange */
/* Mark the original as resolved by removal */ /* Mark the original as resolved by removal */
memcpy(&oldinfo->stages[0].oid, &null_oid, memcpy(&oldinfo->stages[0].oid, null_oid(),
sizeof(oldinfo->stages[0].oid)); sizeof(oldinfo->stages[0].oid));
oldinfo->stages[0].mode = 0; oldinfo->stages[0].mode = 0;
oldinfo->filemask &= 0x06; oldinfo->filemask &= 0x06;
@ -2917,7 +2917,7 @@ static void process_entry(struct merge_options *opt,
if (ci->filemask & (1 << i)) if (ci->filemask & (1 << i))
continue; continue;
ci->stages[i].mode = 0; ci->stages[i].mode = 0;
oidcpy(&ci->stages[i].oid, &null_oid); oidcpy(&ci->stages[i].oid, null_oid());
} }
} else if (ci->df_conflict && ci->merged.result.mode != 0) { } else if (ci->df_conflict && ci->merged.result.mode != 0) {
/* /*
@ -2963,7 +2963,7 @@ static void process_entry(struct merge_options *opt,
continue; continue;
/* zero out any entries related to directories */ /* zero out any entries related to directories */
new_ci->stages[i].mode = 0; new_ci->stages[i].mode = 0;
oidcpy(&new_ci->stages[i].oid, &null_oid); oidcpy(&new_ci->stages[i].oid, null_oid());
} }
/* /*
@ -3064,11 +3064,11 @@ static void process_entry(struct merge_options *opt,
new_ci->merged.result.mode = ci->stages[2].mode; new_ci->merged.result.mode = ci->stages[2].mode;
oidcpy(&new_ci->merged.result.oid, &ci->stages[2].oid); oidcpy(&new_ci->merged.result.oid, &ci->stages[2].oid);
new_ci->stages[1].mode = 0; new_ci->stages[1].mode = 0;
oidcpy(&new_ci->stages[1].oid, &null_oid); oidcpy(&new_ci->stages[1].oid, null_oid());
new_ci->filemask = 5; new_ci->filemask = 5;
if ((S_IFMT & b_mode) != (S_IFMT & o_mode)) { if ((S_IFMT & b_mode) != (S_IFMT & o_mode)) {
new_ci->stages[0].mode = 0; new_ci->stages[0].mode = 0;
oidcpy(&new_ci->stages[0].oid, &null_oid); oidcpy(&new_ci->stages[0].oid, null_oid());
new_ci->filemask = 4; new_ci->filemask = 4;
} }
@ -3076,11 +3076,11 @@ static void process_entry(struct merge_options *opt,
ci->merged.result.mode = ci->stages[1].mode; ci->merged.result.mode = ci->stages[1].mode;
oidcpy(&ci->merged.result.oid, &ci->stages[1].oid); oidcpy(&ci->merged.result.oid, &ci->stages[1].oid);
ci->stages[2].mode = 0; ci->stages[2].mode = 0;
oidcpy(&ci->stages[2].oid, &null_oid); oidcpy(&ci->stages[2].oid, null_oid());
ci->filemask = 3; ci->filemask = 3;
if ((S_IFMT & a_mode) != (S_IFMT & o_mode)) { if ((S_IFMT & a_mode) != (S_IFMT & o_mode)) {
ci->stages[0].mode = 0; ci->stages[0].mode = 0;
oidcpy(&ci->stages[0].oid, &null_oid); oidcpy(&ci->stages[0].oid, null_oid());
ci->filemask = 2; ci->filemask = 2;
} }
@ -3202,7 +3202,7 @@ static void process_entry(struct merge_options *opt,
/* Deleted on both sides */ /* Deleted on both sides */
ci->merged.is_null = 1; ci->merged.is_null = 1;
ci->merged.result.mode = 0; ci->merged.result.mode = 0;
oidcpy(&ci->merged.result.oid, &null_oid); oidcpy(&ci->merged.result.oid, null_oid());
ci->merged.clean = !ci->path_conflict; ci->merged.clean = !ci->path_conflict;
} }

View File

@ -486,7 +486,7 @@ static int get_tree_entry_if_blob(struct repository *r,
ret = get_tree_entry(r, tree, path, &dfs->oid, &dfs->mode); ret = get_tree_entry(r, tree, path, &dfs->oid, &dfs->mode);
if (S_ISDIR(dfs->mode)) { if (S_ISDIR(dfs->mode)) {
oidcpy(&dfs->oid, &null_oid); oidcpy(&dfs->oid, null_oid());
dfs->mode = 0; dfs->mode = 0;
} }
return ret; return ret;
@ -1626,7 +1626,7 @@ static int handle_file_collision(struct merge_options *opt,
/* Store things in diff_filespecs for functions that need it */ /* Store things in diff_filespecs for functions that need it */
null.path = (char *)collide_path; null.path = (char *)collide_path;
oidcpy(&null.oid, &null_oid); oidcpy(&null.oid, null_oid());
null.mode = 0; null.mode = 0;
if (merge_mode_and_contents(opt, &null, a, b, collide_path, if (merge_mode_and_contents(opt, &null, a, b, collide_path,
@ -2819,11 +2819,11 @@ static int process_renames(struct merge_options *opt,
dst_other.mode = ren1->dst_entry->stages[other_stage].mode; dst_other.mode = ren1->dst_entry->stages[other_stage].mode;
try_merge = 0; try_merge = 0;
if (oideq(&src_other.oid, &null_oid) && if (oideq(&src_other.oid, null_oid()) &&
ren1->dir_rename_original_type == 'A') { ren1->dir_rename_original_type == 'A') {
setup_rename_conflict_info(RENAME_VIA_DIR, setup_rename_conflict_info(RENAME_VIA_DIR,
opt, ren1, NULL); opt, ren1, NULL);
} else if (oideq(&src_other.oid, &null_oid)) { } else if (oideq(&src_other.oid, null_oid())) {
setup_rename_conflict_info(RENAME_DELETE, setup_rename_conflict_info(RENAME_DELETE,
opt, ren1, NULL); opt, ren1, NULL);
} else if ((dst_other.mode == ren1->pair->two->mode) && } else if ((dst_other.mode == ren1->pair->two->mode) &&
@ -2842,7 +2842,7 @@ static int process_renames(struct merge_options *opt,
1, /* update_cache */ 1, /* update_cache */
0 /* update_wd */)) 0 /* update_wd */))
clean_merge = -1; clean_merge = -1;
} else if (!oideq(&dst_other.oid, &null_oid)) { } else if (!oideq(&dst_other.oid, null_oid())) {
/* /*
* Probably not a clean merge, but it's * Probably not a clean merge, but it's
* premature to set clean_merge to 0 here, * premature to set clean_merge to 0 here,

2
midx.c
View File

@ -247,7 +247,7 @@ struct object_id *nth_midxed_object_oid(struct object_id *oid,
if (n >= m->num_objects) if (n >= m->num_objects)
return NULL; return NULL;
hashcpy(oid->hash, m->chunk_oid_lookup + m->hash_len * n); oidread(oid, m->chunk_oid_lookup + m->hash_len * n);
return oid; return oid;
} }

View File

@ -600,7 +600,7 @@ int notes_merge(struct notes_merge_options *o,
/* Find merge bases */ /* Find merge bases */
bases = get_merge_bases(local, remote); bases = get_merge_bases(local, remote);
if (!bases) { if (!bases) {
base_oid = &null_oid; base_oid = null_oid();
base_tree_oid = the_hash_algo->empty_tree; base_tree_oid = the_hash_algo->empty_tree;
if (o->verbosity >= 4) if (o->verbosity >= 4)
printf("No merge base found; doing history-less merge\n"); printf("No merge base found; doing history-less merge\n");

View File

@ -352,7 +352,7 @@ static void add_non_note(struct notes_tree *t, char *path,
n->next = NULL; n->next = NULL;
n->path = path; n->path = path;
n->mode = mode; n->mode = mode;
hashcpy(n->oid.hash, sha1); oidread(&n->oid, sha1);
t->prev_non_note = n; t->prev_non_note = n;
if (!t->first_non_note) { if (!t->first_non_note) {
@ -455,6 +455,8 @@ static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
CALLOC_ARRAY(l, 1); CALLOC_ARRAY(l, 1);
oidcpy(&l->key_oid, &object_oid); oidcpy(&l->key_oid, &object_oid);
oidcpy(&l->val_oid, &entry.oid); oidcpy(&l->val_oid, &entry.oid);
oid_set_algo(&l->key_oid, the_hash_algo);
oid_set_algo(&l->val_oid, the_hash_algo);
if (note_tree_insert(t, node, n, l, type, if (note_tree_insert(t, node, n, l, type,
combine_notes_concatenate)) combine_notes_concatenate))
die("Failed to load %s %s into notes tree " die("Failed to load %s %s into notes tree "
@ -484,6 +486,7 @@ handle_non_note:
strbuf_addch(&non_note_path, '/'); strbuf_addch(&non_note_path, '/');
} }
strbuf_addstr(&non_note_path, entry.path); strbuf_addstr(&non_note_path, entry.path);
oid_set_algo(&entry.oid, the_hash_algo);
add_non_note(t, strbuf_detach(&non_note_path, NULL), add_non_note(t, strbuf_detach(&non_note_path, NULL),
entry.mode, entry.oid.hash); entry.mode, entry.oid.hash);
} }
@ -1134,7 +1137,7 @@ int remove_note(struct notes_tree *t, const unsigned char *object_sha1)
if (!t) if (!t)
t = &default_notes_tree; t = &default_notes_tree;
assert(t->initialized); assert(t->initialized);
hashcpy(l.key_oid.hash, object_sha1); oidread(&l.key_oid, object_sha1);
oidclr(&l.val_oid); oidclr(&l.val_oid);
note_tree_remove(t, t->root, 0, &l); note_tree_remove(t, t->root, 0, &l);
if (is_null_oid(&l.val_oid)) /* no note was removed */ if (is_null_oid(&l.val_oid)) /* no note was removed */
@ -1324,7 +1327,7 @@ int copy_note(struct notes_tree *t,
if (note) if (note)
return add_note(t, to_obj, note, combine_notes); return add_note(t, to_obj, note, combine_notes);
else if (existing_note) else if (existing_note)
return add_note(t, to_obj, &null_oid, combine_notes); return add_note(t, to_obj, null_oid(), combine_notes);
return 0; return 0;
} }

View File

@ -55,18 +55,29 @@
"\x6f\xe1\x41\xf7\x74\x91\x20\xa3\x03\x72" \ "\x6f\xe1\x41\xf7\x74\x91\x20\xa3\x03\x72" \
"\x18\x13" "\x18\x13"
const struct object_id null_oid;
static const struct object_id empty_tree_oid = { static const struct object_id empty_tree_oid = {
EMPTY_TREE_SHA1_BIN_LITERAL .hash = EMPTY_TREE_SHA1_BIN_LITERAL,
.algo = GIT_HASH_SHA1,
}; };
static const struct object_id empty_blob_oid = { static const struct object_id empty_blob_oid = {
EMPTY_BLOB_SHA1_BIN_LITERAL .hash = EMPTY_BLOB_SHA1_BIN_LITERAL,
.algo = GIT_HASH_SHA1,
};
static const struct object_id null_oid_sha1 = {
.hash = {0},
.algo = GIT_HASH_SHA1,
}; };
static const struct object_id empty_tree_oid_sha256 = { static const struct object_id empty_tree_oid_sha256 = {
EMPTY_TREE_SHA256_BIN_LITERAL .hash = EMPTY_TREE_SHA256_BIN_LITERAL,
.algo = GIT_HASH_SHA256,
}; };
static const struct object_id empty_blob_oid_sha256 = { static const struct object_id empty_blob_oid_sha256 = {
EMPTY_BLOB_SHA256_BIN_LITERAL .hash = EMPTY_BLOB_SHA256_BIN_LITERAL,
.algo = GIT_HASH_SHA256,
};
static const struct object_id null_oid_sha256 = {
.hash = {0},
.algo = GIT_HASH_SHA256,
}; };
static void git_hash_sha1_init(git_hash_ctx *ctx) static void git_hash_sha1_init(git_hash_ctx *ctx)
@ -89,6 +100,13 @@ static void git_hash_sha1_final(unsigned char *hash, git_hash_ctx *ctx)
git_SHA1_Final(hash, &ctx->sha1); git_SHA1_Final(hash, &ctx->sha1);
} }
static void git_hash_sha1_final_oid(struct object_id *oid, git_hash_ctx *ctx)
{
git_SHA1_Final(oid->hash, &ctx->sha1);
memset(oid->hash + GIT_SHA1_RAWSZ, 0, GIT_MAX_RAWSZ - GIT_SHA1_RAWSZ);
oid->algo = GIT_HASH_SHA1;
}
static void git_hash_sha256_init(git_hash_ctx *ctx) static void git_hash_sha256_init(git_hash_ctx *ctx)
{ {
@ -110,6 +128,17 @@ static void git_hash_sha256_final(unsigned char *hash, git_hash_ctx *ctx)
git_SHA256_Final(hash, &ctx->sha256); git_SHA256_Final(hash, &ctx->sha256);
} }
static void git_hash_sha256_final_oid(struct object_id *oid, git_hash_ctx *ctx)
{
git_SHA256_Final(oid->hash, &ctx->sha256);
/*
* This currently does nothing, so the compiler should optimize it out,
* but keep it in case we extend the hash size again.
*/
memset(oid->hash + GIT_SHA256_RAWSZ, 0, GIT_MAX_RAWSZ - GIT_SHA256_RAWSZ);
oid->algo = GIT_HASH_SHA256;
}
static void git_hash_unknown_init(git_hash_ctx *ctx) static void git_hash_unknown_init(git_hash_ctx *ctx)
{ {
BUG("trying to init unknown hash"); BUG("trying to init unknown hash");
@ -130,6 +159,12 @@ static void git_hash_unknown_final(unsigned char *hash, git_hash_ctx *ctx)
BUG("trying to finalize unknown hash"); BUG("trying to finalize unknown hash");
} }
static void git_hash_unknown_final_oid(struct object_id *oid, git_hash_ctx *ctx)
{
BUG("trying to finalize unknown hash");
}
const struct git_hash_algo hash_algos[GIT_HASH_NALGOS] = { const struct git_hash_algo hash_algos[GIT_HASH_NALGOS] = {
{ {
NULL, NULL,
@ -141,6 +176,8 @@ const struct git_hash_algo hash_algos[GIT_HASH_NALGOS] = {
git_hash_unknown_clone, git_hash_unknown_clone,
git_hash_unknown_update, git_hash_unknown_update,
git_hash_unknown_final, git_hash_unknown_final,
git_hash_unknown_final_oid,
NULL,
NULL, NULL,
NULL, NULL,
}, },
@ -155,8 +192,10 @@ const struct git_hash_algo hash_algos[GIT_HASH_NALGOS] = {
git_hash_sha1_clone, git_hash_sha1_clone,
git_hash_sha1_update, git_hash_sha1_update,
git_hash_sha1_final, git_hash_sha1_final,
git_hash_sha1_final_oid,
&empty_tree_oid, &empty_tree_oid,
&empty_blob_oid, &empty_blob_oid,
&null_oid_sha1,
}, },
{ {
"sha256", "sha256",
@ -169,11 +208,18 @@ const struct git_hash_algo hash_algos[GIT_HASH_NALGOS] = {
git_hash_sha256_clone, git_hash_sha256_clone,
git_hash_sha256_update, git_hash_sha256_update,
git_hash_sha256_final, git_hash_sha256_final,
git_hash_sha256_final_oid,
&empty_tree_oid_sha256, &empty_tree_oid_sha256,
&empty_blob_oid_sha256, &empty_blob_oid_sha256,
&null_oid_sha256,
} }
}; };
const struct object_id *null_oid(void)
{
return the_hash_algo->null_oid;
}
const char *empty_tree_oid_hex(void) const char *empty_tree_oid_hex(void)
{ {
static char buf[GIT_MAX_HEXSZ + 1]; static char buf[GIT_MAX_HEXSZ + 1];
@ -1029,7 +1075,7 @@ int check_object_signature(struct repository *r, const struct object_id *oid,
break; break;
r->hash_algo->update_fn(&c, buf, readlen); r->hash_algo->update_fn(&c, buf, readlen);
} }
r->hash_algo->final_fn(real_oid.hash, &c); r->hash_algo->final_oid_fn(&real_oid, &c);
close_istream(st); close_istream(st);
return !oideq(oid, &real_oid) ? -1 : 0; return !oideq(oid, &real_oid) ? -1 : 0;
} }
@ -1730,7 +1776,7 @@ static void write_object_file_prepare(const struct git_hash_algo *algo,
algo->init_fn(&c); algo->init_fn(&c);
algo->update_fn(&c, hdr, *hdrlen); algo->update_fn(&c, hdr, *hdrlen);
algo->update_fn(&c, buf, len); algo->update_fn(&c, buf, len);
algo->final_fn(oid->hash, &c); algo->final_oid_fn(oid, &c);
} }
/* /*
@ -1902,7 +1948,7 @@ static int write_loose_object(const struct object_id *oid, char *hdr,
if (ret != Z_OK) if (ret != Z_OK)
die(_("deflateEnd on object %s failed (%d)"), oid_to_hex(oid), die(_("deflateEnd on object %s failed (%d)"), oid_to_hex(oid),
ret); ret);
the_hash_algo->final_fn(parano_oid.hash, &c); the_hash_algo->final_oid_fn(&parano_oid, &c);
if (!oideq(oid, &parano_oid)) if (!oideq(oid, &parano_oid))
die(_("confused by unstable object source data for %s"), die(_("confused by unstable object source data for %s"),
oid_to_hex(oid)); oid_to_hex(oid));
@ -2315,6 +2361,7 @@ int for_each_file_in_obj_subdir(unsigned int subdir_nr,
if (namelen == the_hash_algo->hexsz - 2 && if (namelen == the_hash_algo->hexsz - 2 &&
!hex_to_bytes(oid.hash + 1, de->d_name, !hex_to_bytes(oid.hash + 1, de->d_name,
the_hash_algo->rawsz - 1)) { the_hash_algo->rawsz - 1)) {
oid_set_algo(&oid, the_hash_algo);
if (obj_cb) { if (obj_cb) {
r = obj_cb(&oid, path->buf, data); r = obj_cb(&oid, path->buf, data);
if (r) if (r)
@ -2483,7 +2530,7 @@ static int check_stream_oid(git_zstream *stream,
return -1; return -1;
} }
the_hash_algo->final_fn(real_oid.hash, &c); the_hash_algo->final_oid_fn(&real_oid, &c);
if (!oideq(expected_oid, &real_oid)) { if (!oideq(expected_oid, &real_oid)) {
error(_("hash mismatch for %s (expected %s)"), path, error(_("hash mismatch for %s (expected %s)"), path,
oid_to_hex(expected_oid)); oid_to_hex(expected_oid));

View File

@ -140,7 +140,7 @@ int parse_opt_object_id(const struct option *opt, const char *arg, int unset)
struct object_id *target = opt->value; struct object_id *target = opt->value;
if (unset) { if (unset) {
*target = null_oid; oidcpy(target, null_oid());
return 0; return 0;
} }
if (!arg) if (!arg)

View File

@ -445,7 +445,7 @@ static struct diff_filespec *get_filespec(const char *name, const char *p)
{ {
struct diff_filespec *spec = alloc_filespec(name); struct diff_filespec *spec = alloc_filespec(name);
fill_filespec(spec, &null_oid, 0, 0100644); fill_filespec(spec, null_oid(), 0, 0100644);
spec->data = (char *)p; spec->data = (char *)p;
spec->size = strlen(p); spec->size = strlen(p);
spec->should_munmap = 0; spec->should_munmap = 0;

View File

@ -1886,7 +1886,7 @@ static struct cache_entry *create_from_disk(struct mem_pool *ce_mem_pool,
ce->ce_flags = flags & ~CE_NAMEMASK; ce->ce_flags = flags & ~CE_NAMEMASK;
ce->ce_namelen = len; ce->ce_namelen = len;
ce->index = 0; ce->index = 0;
hashcpy(ce->oid.hash, ondisk->data); oidread(&ce->oid, ondisk->data);
memcpy(ce->name, name, len); memcpy(ce->name, name, len);
ce->name[len] = '\0'; ce->name[len] = '\0';
@ -2236,7 +2236,7 @@ int do_read_index(struct index_state *istate, const char *path, int must_exist)
if (verify_hdr(hdr, mmap_size) < 0) if (verify_hdr(hdr, mmap_size) < 0)
goto unmap; goto unmap;
hashcpy(istate->oid.hash, (const unsigned char *)hdr + mmap_size - the_hash_algo->rawsz); oidread(&istate->oid, (const unsigned char *)hdr + mmap_size - the_hash_algo->rawsz);
istate->version = ntohl(hdr->hdr_version); istate->version = ntohl(hdr->hdr_version);
istate->cache_nr = ntohl(hdr->hdr_entries); istate->cache_nr = ntohl(hdr->hdr_entries);
istate->cache_alloc = alloc_nr(istate->cache_nr); istate->cache_alloc = alloc_nr(istate->cache_nr);

4
refs.c
View File

@ -1107,7 +1107,7 @@ int ref_transaction_create(struct ref_transaction *transaction,
if (!new_oid || is_null_oid(new_oid)) if (!new_oid || is_null_oid(new_oid))
BUG("create called without valid new_oid"); BUG("create called without valid new_oid");
return ref_transaction_update(transaction, refname, new_oid, return ref_transaction_update(transaction, refname, new_oid,
&null_oid, flags, msg, err); null_oid(), flags, msg, err);
} }
int ref_transaction_delete(struct ref_transaction *transaction, int ref_transaction_delete(struct ref_transaction *transaction,
@ -1119,7 +1119,7 @@ int ref_transaction_delete(struct ref_transaction *transaction,
if (old_oid && is_null_oid(old_oid)) if (old_oid && is_null_oid(old_oid))
BUG("delete called with old_oid set to zeros"); BUG("delete called with old_oid set to zeros");
return ref_transaction_update(transaction, refname, return ref_transaction_update(transaction, refname,
&null_oid, old_oid, null_oid(), old_oid,
flags, msg, err); flags, msg, err);
} }

View File

@ -243,7 +243,7 @@ static int debug_read_raw_ref(struct ref_store *ref_store, const char *refname,
struct debug_ref_store *drefs = (struct debug_ref_store *)ref_store; struct debug_ref_store *drefs = (struct debug_ref_store *)ref_store;
int res = 0; int res = 0;
oidcpy(oid, &null_oid); oidcpy(oid, null_oid());
errno = 0; errno = 0;
res = drefs->refs->be->read_raw_ref(drefs->refs, refname, oid, referent, res = drefs->refs->be->read_raw_ref(drefs->refs, refname, oid, referent,
type); type);

View File

@ -1084,7 +1084,7 @@ static void prune_ref(struct files_ref_store *refs, struct ref_to_prune *r)
ref_transaction_add_update( ref_transaction_add_update(
transaction, r->name, transaction, r->name,
REF_NO_DEREF | REF_HAVE_NEW | REF_HAVE_OLD | REF_IS_PRUNING, REF_NO_DEREF | REF_HAVE_NEW | REF_HAVE_OLD | REF_IS_PRUNING,
&null_oid, &r->oid, NULL); null_oid(), &r->oid, NULL);
if (ref_transaction_commit(transaction, &err)) if (ref_transaction_commit(transaction, &err))
goto cleanup; goto cleanup;

View File

@ -128,7 +128,7 @@ reset_head_refs:
} }
if (run_hook) if (run_hook)
run_hook_le(NULL, "post-checkout", run_hook_le(NULL, "post-checkout",
oid_to_hex(orig ? orig : &null_oid), oid_to_hex(orig ? orig : null_oid()),
oid_to_hex(oid), "1", NULL); oid_to_hex(oid), "1", NULL);
leave_reset_head: leave_reset_head:

View File

@ -525,7 +525,7 @@ static int fast_forward_to(struct repository *r,
if (!transaction || if (!transaction ||
ref_transaction_update(transaction, "HEAD", ref_transaction_update(transaction, "HEAD",
to, unborn && !is_rebase_i(opts) ? to, unborn && !is_rebase_i(opts) ?
&null_oid : from, null_oid() : from,
0, sb.buf, &err) || 0, sb.buf, &err) ||
ref_transaction_commit(transaction, &err)) { ref_transaction_commit(transaction, &err)) {
ref_transaction_free(transaction); ref_transaction_free(transaction);
@ -1132,7 +1132,7 @@ int update_head_with_reflog(const struct commit *old_head,
transaction = ref_transaction_begin(err); transaction = ref_transaction_begin(err);
if (!transaction || if (!transaction ||
ref_transaction_update(transaction, "HEAD", new_head, ref_transaction_update(transaction, "HEAD", new_head,
old_head ? &old_head->object.oid : &null_oid, old_head ? &old_head->object.oid : null_oid(),
0, sb.buf, err) || 0, sb.buf, err) ||
ref_transaction_commit(transaction, err)) { ref_transaction_commit(transaction, err)) {
ret = -1; ret = -1;

View File

@ -21,7 +21,7 @@ int read_link_extension(struct index_state *istate,
if (sz < the_hash_algo->rawsz) if (sz < the_hash_algo->rawsz)
return error("corrupt link extension (too short)"); return error("corrupt link extension (too short)");
si = init_split_index(istate); si = init_split_index(istate);
hashcpy(si->base_oid.hash, data); oidread(&si->base_oid, data);
data += the_hash_algo->rawsz; data += the_hash_algo->rawsz;
sz -= the_hash_algo->rawsz; sz -= the_hash_algo->rawsz;
if (!sz) if (!sz)

View File

@ -671,7 +671,7 @@ static int gitmodules_cb(const char *var, const char *value, void *data)
parameter.cache = repo->submodule_cache; parameter.cache = repo->submodule_cache;
parameter.treeish_name = NULL; parameter.treeish_name = NULL;
parameter.gitmodules_oid = &null_oid; parameter.gitmodules_oid = null_oid();
parameter.overwrite = 1; parameter.overwrite = 1;
return parse_config(var, value, &parameter); return parse_config(var, value, &parameter);

View File

@ -113,7 +113,7 @@ int update_path_in_gitmodules(const char *oldpath, const char *newpath)
if (is_gitmodules_unmerged(the_repository->index)) if (is_gitmodules_unmerged(the_repository->index))
die(_("Cannot change unmerged .gitmodules, resolve merge conflicts first")); die(_("Cannot change unmerged .gitmodules, resolve merge conflicts first"));
submodule = submodule_from_path(the_repository, &null_oid, oldpath); submodule = submodule_from_path(the_repository, null_oid(), oldpath);
if (!submodule || !submodule->name) { if (!submodule || !submodule->name) {
warning(_("Could not find section in .gitmodules where path=%s"), oldpath); warning(_("Could not find section in .gitmodules where path=%s"), oldpath);
return -1; return -1;
@ -142,7 +142,7 @@ int remove_path_from_gitmodules(const char *path)
if (is_gitmodules_unmerged(the_repository->index)) if (is_gitmodules_unmerged(the_repository->index))
die(_("Cannot change unmerged .gitmodules, resolve merge conflicts first")); die(_("Cannot change unmerged .gitmodules, resolve merge conflicts first"));
submodule = submodule_from_path(the_repository, &null_oid, path); submodule = submodule_from_path(the_repository, null_oid(), path);
if (!submodule || !submodule->name) { if (!submodule || !submodule->name) {
warning(_("Could not find section in .gitmodules where path=%s"), path); warning(_("Could not find section in .gitmodules where path=%s"), path);
return -1; return -1;
@ -188,7 +188,8 @@ void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt,
const char *path) const char *path)
{ {
const struct submodule *submodule = submodule_from_path(the_repository, const struct submodule *submodule = submodule_from_path(the_repository,
&null_oid, path); null_oid(),
path);
if (submodule) { if (submodule) {
const char *ignore; const char *ignore;
char *key; char *key;
@ -244,7 +245,7 @@ int is_submodule_active(struct repository *repo, const char *path)
const struct string_list *sl; const struct string_list *sl;
const struct submodule *module; const struct submodule *module;
module = submodule_from_path(repo, &null_oid, path); module = submodule_from_path(repo, null_oid(), path);
/* early return if there isn't a path->module mapping */ /* early return if there isn't a path->module mapping */
if (!module) if (!module)
@ -745,7 +746,7 @@ const struct submodule *submodule_from_ce(const struct cache_entry *ce)
if (!should_update_submodules()) if (!should_update_submodules())
return NULL; return NULL;
return submodule_from_path(the_repository, &null_oid, ce->name); return submodule_from_path(the_repository, null_oid(), ce->name);
} }
static struct oid_array *submodule_commits(struct string_list *submodules, static struct oid_array *submodule_commits(struct string_list *submodules,
@ -1037,7 +1038,7 @@ int find_unpushed_submodules(struct repository *r,
const struct submodule *submodule; const struct submodule *submodule;
const char *path = NULL; const char *path = NULL;
submodule = submodule_from_name(r, &null_oid, name->string); submodule = submodule_from_name(r, null_oid(), name->string);
if (submodule) if (submodule)
path = submodule->path; path = submodule->path;
else else
@ -1224,7 +1225,7 @@ static void calculate_changed_submodule_paths(struct repository *r,
const struct submodule *submodule; const struct submodule *submodule;
const char *path = NULL; const char *path = NULL;
submodule = submodule_from_name(r, &null_oid, name->string); submodule = submodule_from_name(r, null_oid(), name->string);
if (submodule) if (submodule)
path = submodule->path; path = submodule->path;
else else
@ -1361,7 +1362,7 @@ static struct fetch_task *fetch_task_create(struct repository *r,
struct fetch_task *task = xmalloc(sizeof(*task)); struct fetch_task *task = xmalloc(sizeof(*task));
memset(task, 0, sizeof(*task)); memset(task, 0, sizeof(*task));
task->sub = submodule_from_path(r, &null_oid, path); task->sub = submodule_from_path(r, null_oid(), path);
if (!task->sub) { if (!task->sub) {
/* /*
* No entry in .gitmodules? Technically not a submodule, * No entry in .gitmodules? Technically not a submodule,
@ -1917,7 +1918,7 @@ int submodule_move_head(const char *path,
if (old_head && !is_submodule_populated_gently(path, error_code_ptr)) if (old_head && !is_submodule_populated_gently(path, error_code_ptr))
return 0; return 0;
sub = submodule_from_path(the_repository, &null_oid, path); sub = submodule_from_path(the_repository, null_oid(), path);
if (!sub) if (!sub)
BUG("could not get submodule information for '%s'", path); BUG("could not get submodule information for '%s'", path);
@ -2076,7 +2077,7 @@ static void relocate_single_git_dir_into_superproject(const char *path)
real_old_git_dir = real_pathdup(old_git_dir, 1); real_old_git_dir = real_pathdup(old_git_dir, 1);
sub = submodule_from_path(the_repository, &null_oid, path); sub = submodule_from_path(the_repository, null_oid(), path);
if (!sub) if (!sub)
die(_("could not lookup name for submodule '%s'"), path); die(_("could not lookup name for submodule '%s'"), path);
@ -2135,7 +2136,7 @@ void absorb_git_dir_into_superproject(const char *path,
* superproject did not rewrite the git file links yet, * superproject did not rewrite the git file links yet,
* fix it now. * fix it now.
*/ */
sub = submodule_from_path(the_repository, &null_oid, path); sub = submodule_from_path(the_repository, null_oid(), path);
if (!sub) if (!sub)
die(_("could not lookup name for submodule '%s'"), path); die(_("could not lookup name for submodule '%s'"), path);
connect_work_tree_and_git_dir(path, connect_work_tree_and_git_dir(path,
@ -2283,7 +2284,8 @@ int submodule_to_gitdir(struct strbuf *buf, const char *submodule)
strbuf_addstr(buf, git_dir); strbuf_addstr(buf, git_dir);
} }
if (!is_git_directory(buf->buf)) { if (!is_git_directory(buf->buf)) {
sub = submodule_from_path(the_repository, &null_oid, submodule); sub = submodule_from_path(the_repository, null_oid(),
submodule);
if (!sub) { if (!sub) {
ret = -1; ret = -1;
goto cleanup; goto cleanup;

View File

@ -18,7 +18,7 @@ int cmd__submodule_nested_repo_config(int argc, const char **argv)
setup_git_directory(); setup_git_directory();
sub = submodule_from_path(the_repository, &null_oid, argv[1]); sub = submodule_from_path(the_repository, null_oid(), argv[1]);
if (repo_submodule_init(&subrepo, the_repository, sub)) { if (repo_submodule_init(&subrepo, the_repository, sub)) {
die_usage(argv, "Submodule not found."); die_usage(argv, "Submodule not found.");
} }

View File

@ -161,7 +161,7 @@ static struct combine_diff_path *path_appendnew(struct combine_diff_path *last,
memcpy(p->path + base->len, path, pathlen); memcpy(p->path + base->len, path, pathlen);
p->path[len] = 0; p->path[len] = 0;
p->mode = mode; p->mode = mode;
oidcpy(&p->oid, oid ? oid : &null_oid); oidcpy(&p->oid, oid ? oid : null_oid());
return p; return p;
} }
@ -243,7 +243,7 @@ static struct combine_diff_path *emit_path(struct combine_diff_path *p,
mode_i = tp[i].entry.mode; mode_i = tp[i].entry.mode;
} }
else { else {
oid_i = &null_oid; oid_i = null_oid();
mode_i = 0; mode_i = 0;
} }

View File

@ -49,7 +49,7 @@ static int decode_tree_entry(struct tree_desc *desc, const char *buf, unsigned l
desc->entry.path = path; desc->entry.path = path;
desc->entry.mode = canon_mode(mode); desc->entry.mode = canon_mode(mode);
desc->entry.pathlen = len - 1; desc->entry.pathlen = len - 1;
hashcpy(desc->entry.oid.hash, (const unsigned char *)path + len); oidread(&desc->entry.oid, (const unsigned char *)path + len);
return 0; return 0;
} }

View File

@ -1690,10 +1690,10 @@ void wt_status_get_state(struct repository *r,
if (!sequencer_get_last_command(r, &action)) { if (!sequencer_get_last_command(r, &action)) {
if (action == REPLAY_PICK) { if (action == REPLAY_PICK) {
state->cherry_pick_in_progress = 1; state->cherry_pick_in_progress = 1;
oidcpy(&state->cherry_pick_head_oid, &null_oid); oidcpy(&state->cherry_pick_head_oid, null_oid());
} else { } else {
state->revert_in_progress = 1; state->revert_in_progress = 1;
oidcpy(&state->revert_head_oid, &null_oid); oidcpy(&state->revert_head_oid, null_oid());
} }
} }
if (get_detached_from) if (get_detached_from)

View File

@ -172,7 +172,7 @@ void read_mmblob(mmfile_t *ptr, const struct object_id *oid)
unsigned long size; unsigned long size;
enum object_type type; enum object_type type;
if (oideq(oid, &null_oid)) { if (oideq(oid, null_oid())) {
ptr->ptr = xstrdup(""); ptr->ptr = xstrdup("");
ptr->size = 0; ptr->size = 0;
return; return;