Conversion from uchar[20] to struct object_id continues.

* po/object-id:
  sha1_file: rename hash_sha1_file_literally
  sha1_file: convert write_loose_object to object_id
  sha1_file: convert force_object_loose to object_id
  sha1_file: convert write_sha1_file to object_id
  notes: convert write_notes_tree to object_id
  notes: convert combine_notes_* to object_id
  commit: convert commit_tree* to object_id
  match-trees: convert splice_tree to object_id
  cache: clear whole hash buffer with oidclr
  sha1_file: convert hash_sha1_file to object_id
  dir: convert struct sha1_stat to use object_id
  sha1_file: convert pretend_sha1_file to object_id
This commit is contained in:
Junio C Hamano 2018-02-15 14:55:43 -08:00
Родитель 157ee05061 1752cbbc44
Коммит 8be8342b4c
39 изменённых файлов: 302 добавлений и 281 удалений

Просмотреть файл

@ -7,7 +7,7 @@ Talk about <sha1_file.c> and <object.h> family, things like
* read_object_with_reference() * read_object_with_reference()
* has_sha1_file() * has_sha1_file()
* write_sha1_file() * write_sha1_file()
* pretend_sha1_file() * pretend_object_file()
* lookup_{object,commit,tag,blob,tree} * lookup_{object,commit,tag,blob,tree}
* parse_{object,commit,tag,blob,tree} * parse_{object,commit,tag,blob,tree}
* Use of object flags * Use of object flags

12
apply.c
Просмотреть файл

@ -3154,7 +3154,7 @@ static int apply_binary(struct apply_state *state,
* See if the old one matches what the patch * See if the old one matches what the patch
* applies to. * applies to.
*/ */
hash_sha1_file(img->buf, img->len, blob_type, oid.hash); hash_object_file(img->buf, img->len, blob_type, &oid);
if (strcmp(oid_to_hex(&oid), patch->old_sha1_prefix)) if (strcmp(oid_to_hex(&oid), patch->old_sha1_prefix))
return error(_("the patch applies to '%s' (%s), " return error(_("the patch applies to '%s' (%s), "
"which does not match the " "which does not match the "
@ -3199,7 +3199,7 @@ static int apply_binary(struct apply_state *state,
name); name);
/* verify that the result matches */ /* verify that the result matches */
hash_sha1_file(img->buf, img->len, blob_type, oid.hash); hash_object_file(img->buf, img->len, blob_type, &oid);
if (strcmp(oid_to_hex(&oid), patch->new_sha1_prefix)) if (strcmp(oid_to_hex(&oid), patch->new_sha1_prefix))
return error(_("binary patch to '%s' creates incorrect result (expecting %s, got %s)"), return error(_("binary patch to '%s' creates incorrect result (expecting %s, got %s)"),
name, patch->new_sha1_prefix, oid_to_hex(&oid)); name, patch->new_sha1_prefix, oid_to_hex(&oid));
@ -3554,7 +3554,7 @@ static int try_threeway(struct apply_state *state,
/* Preimage the patch was prepared for */ /* Preimage the patch was prepared for */
if (patch->is_new) if (patch->is_new)
write_sha1_file("", 0, blob_type, pre_oid.hash); write_object_file("", 0, blob_type, &pre_oid);
else if (get_oid(patch->old_sha1_prefix, &pre_oid) || else if (get_oid(patch->old_sha1_prefix, &pre_oid) ||
read_blob_object(&buf, &pre_oid, patch->old_mode)) read_blob_object(&buf, &pre_oid, patch->old_mode))
return error(_("repository lacks the necessary blob to fall back on 3-way merge.")); return error(_("repository lacks the necessary blob to fall back on 3-way merge."));
@ -3570,7 +3570,7 @@ static int try_threeway(struct apply_state *state,
return -1; return -1;
} }
/* post_oid is theirs */ /* post_oid is theirs */
write_sha1_file(tmp_image.buf, tmp_image.len, blob_type, post_oid.hash); write_object_file(tmp_image.buf, tmp_image.len, blob_type, &post_oid);
clear_image(&tmp_image); clear_image(&tmp_image);
/* our_oid is ours */ /* our_oid is ours */
@ -3583,7 +3583,7 @@ static int try_threeway(struct apply_state *state,
return error(_("cannot read the current contents of '%s'"), return error(_("cannot read the current contents of '%s'"),
patch->old_name); patch->old_name);
} }
write_sha1_file(tmp_image.buf, tmp_image.len, blob_type, our_oid.hash); write_object_file(tmp_image.buf, tmp_image.len, blob_type, &our_oid);
clear_image(&tmp_image); clear_image(&tmp_image);
/* in-core three-way merge between post and our using pre as base */ /* in-core three-way merge between post and our using pre as base */
@ -4291,7 +4291,7 @@ static int add_index_file(struct apply_state *state,
} }
fill_stat_cache_info(ce, &st); fill_stat_cache_info(ce, &st);
} }
if (write_sha1_file(buf, size, blob_type, ce->oid.hash) < 0) { if (write_object_file(buf, size, blob_type, &ce->oid) < 0) {
free(ce); free(ce);
return error(_("unable to create backing store " return error(_("unable to create backing store "
"for newly created file %s"), path); "for newly created file %s"), path);

Просмотреть файл

@ -232,7 +232,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
convert_to_git(&the_index, path, buf.buf, buf.len, &buf, 0); convert_to_git(&the_index, path, buf.buf, buf.len, &buf, 0);
origin->file.ptr = buf.buf; origin->file.ptr = buf.buf;
origin->file.size = buf.len; origin->file.size = buf.len;
pretend_sha1_file(buf.buf, buf.len, OBJ_BLOB, origin->blob_oid.hash); pretend_object_file(buf.buf, buf.len, OBJ_BLOB, &origin->blob_oid);
/* /*
* Read the current index, replace the path entry with * Read the current index, replace the path entry with

Просмотреть файл

@ -1641,8 +1641,8 @@ static void do_commit(const struct am_state *state)
setenv("GIT_COMMITTER_DATE", setenv("GIT_COMMITTER_DATE",
state->ignore_date ? "" : state->author_date, 1); state->ignore_date ? "" : state->author_date, 1);
if (commit_tree(state->msg, state->msg_len, tree.hash, parents, commit.hash, if (commit_tree(state->msg, state->msg_len, &tree, parents, &commit,
author, state->sign_commit)) author, state->sign_commit))
die(_("failed to write commit object")); die(_("failed to write commit object"));
reflog_msg = getenv("GIT_REFLOG_ACTION"); reflog_msg = getenv("GIT_REFLOG_ACTION");

Просмотреть файл

@ -227,8 +227,7 @@ static int checkout_merged(int pos, const struct checkout *state)
* (it also writes the merge result to the object database even * (it also writes the merge result to the object database even
* when it may contain conflicts). * when it may contain conflicts).
*/ */
if (write_sha1_file(result_buf.ptr, result_buf.size, if (write_object_file(result_buf.ptr, result_buf.size, blob_type, &oid))
blob_type, oid.hash))
die(_("Unable to add merge result for '%s'"), path); die(_("Unable to add merge result for '%s'"), path);
free(result_buf.ptr); free(result_buf.ptr);
ce = make_cache_entry(mode, oid.hash, path, 2, 0); ce = make_cache_entry(mode, oid.hash, path, 2, 0);

Просмотреть файл

@ -117,8 +117,8 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
die_errno("git commit-tree: failed to read"); die_errno("git commit-tree: failed to read");
} }
if (commit_tree(buffer.buf, buffer.len, tree_oid.hash, parents, if (commit_tree(buffer.buf, buffer.len, &tree_oid, parents, &commit_oid,
commit_oid.hash, NULL, sign_commit)) { NULL, sign_commit)) {
strbuf_release(&buffer); strbuf_release(&buffer);
return 1; return 1;
} }

Просмотреть файл

@ -1579,8 +1579,9 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
append_merge_tag_headers(parents, &tail); append_merge_tag_headers(parents, &tail);
} }
if (commit_tree_extended(sb.buf, sb.len, active_cache_tree->oid.hash, if (commit_tree_extended(sb.buf, sb.len, &active_cache_tree->oid,
parents, oid.hash, author_ident.buf, sign_commit, extra)) { parents, &oid, author_ident.buf, sign_commit,
extra)) {
rollback_index_files(); rollback_index_files();
die(_("failed to write commit object")); die(_("failed to write commit object"));
} }

Просмотреть файл

@ -24,7 +24,8 @@ static int hash_literally(struct object_id *oid, int fd, const char *type, unsig
if (strbuf_read(&buf, fd, 4096) < 0) if (strbuf_read(&buf, fd, 4096) < 0)
ret = -1; ret = -1;
else else
ret = hash_sha1_file_literally(buf.buf, buf.len, type, oid, flags); ret = hash_object_file_literally(buf.buf, buf.len, type, oid,
flags);
strbuf_release(&buf); strbuf_release(&buf);
return ret; return ret;
} }

Просмотреть файл

@ -958,9 +958,8 @@ static void resolve_delta(struct object_entry *delta_obj,
free(delta_data); free(delta_data);
if (!result->data) if (!result->data)
bad_object(delta_obj->idx.offset, _("failed to apply delta")); bad_object(delta_obj->idx.offset, _("failed to apply delta"));
hash_sha1_file(result->data, result->size, hash_object_file(result->data, result->size,
typename(delta_obj->real_type), typename(delta_obj->real_type), &delta_obj->idx.oid);
delta_obj->idx.oid.hash);
sha1_object(result->data, NULL, result->size, delta_obj->real_type, sha1_object(result->data, NULL, result->size, delta_obj->real_type,
&delta_obj->idx.oid); &delta_obj->idx.oid);
counter_lock(); counter_lock();

Просмотреть файл

@ -820,8 +820,8 @@ static int merge_trivial(struct commit *head, struct commit_list *remoteheads)
pptr = commit_list_append(head, pptr); pptr = commit_list_append(head, pptr);
pptr = commit_list_append(remoteheads->item, pptr); pptr = commit_list_append(remoteheads->item, pptr);
prepare_to_commit(remoteheads); prepare_to_commit(remoteheads);
if (commit_tree(merge_msg.buf, merge_msg.len, result_tree.hash, parents, if (commit_tree(merge_msg.buf, merge_msg.len, &result_tree, parents,
result_commit.hash, NULL, sign_commit)) &result_commit, NULL, sign_commit))
die(_("failed to write commit object")); die(_("failed to write commit object"));
finish(head, remoteheads, &result_commit, "In-index merge"); finish(head, remoteheads, &result_commit, "In-index merge");
drop_save(); drop_save();
@ -845,8 +845,8 @@ static int finish_automerge(struct commit *head,
commit_list_insert(head, &parents); commit_list_insert(head, &parents);
strbuf_addch(&merge_msg, '\n'); strbuf_addch(&merge_msg, '\n');
prepare_to_commit(remoteheads); prepare_to_commit(remoteheads);
if (commit_tree(merge_msg.buf, merge_msg.len, result_tree->hash, parents, if (commit_tree(merge_msg.buf, merge_msg.len, result_tree, parents,
result_commit.hash, NULL, sign_commit)) &result_commit, NULL, sign_commit))
die(_("failed to write commit object")); die(_("failed to write commit object"));
strbuf_addf(&buf, "Merge made by the '%s' strategy.", wt_strategy); strbuf_addf(&buf, "Merge made by the '%s' strategy.", wt_strategy);
finish(head, remoteheads, &result_commit, buf.buf); finish(head, remoteheads, &result_commit, buf.buf);

Просмотреть файл

@ -151,7 +151,7 @@ static int verify_tag(char *buffer, unsigned long size)
int cmd_mktag(int argc, const char **argv, const char *prefix) int cmd_mktag(int argc, const char **argv, const char *prefix)
{ {
struct strbuf buf = STRBUF_INIT; struct strbuf buf = STRBUF_INIT;
unsigned char result_sha1[20]; struct object_id result;
if (argc != 1) if (argc != 1)
usage("git mktag"); usage("git mktag");
@ -165,10 +165,10 @@ int cmd_mktag(int argc, const char **argv, const char *prefix)
if (verify_tag(buf.buf, buf.len) < 0) if (verify_tag(buf.buf, buf.len) < 0)
die("invalid tag signature file"); die("invalid tag signature file");
if (write_sha1_file(buf.buf, buf.len, tag_type, result_sha1) < 0) if (write_object_file(buf.buf, buf.len, tag_type, &result) < 0)
die("unable to write tag file"); die("unable to write tag file");
strbuf_release(&buf); strbuf_release(&buf);
printf("%s\n", sha1_to_hex(result_sha1)); printf("%s\n", oid_to_hex(&result));
return 0; return 0;
} }

Просмотреть файл

@ -40,7 +40,7 @@ static int ent_compare(const void *a_, const void *b_)
b->name, b->len, b->mode); b->name, b->len, b->mode);
} }
static void write_tree(unsigned char *sha1) static void write_tree(struct object_id *oid)
{ {
struct strbuf buf; struct strbuf buf;
size_t size; size_t size;
@ -57,7 +57,7 @@ static void write_tree(unsigned char *sha1)
strbuf_add(&buf, ent->sha1, 20); strbuf_add(&buf, ent->sha1, 20);
} }
write_sha1_file(buf.buf, buf.len, tree_type, sha1); write_object_file(buf.buf, buf.len, tree_type, oid);
strbuf_release(&buf); strbuf_release(&buf);
} }
@ -142,7 +142,7 @@ static void mktree_line(char *buf, size_t len, int nul_term_line, int allow_miss
int cmd_mktree(int ac, const char **av, const char *prefix) int cmd_mktree(int ac, const char **av, const char *prefix)
{ {
struct strbuf sb = STRBUF_INIT; struct strbuf sb = STRBUF_INIT;
unsigned char sha1[20]; struct object_id oid;
int nul_term_line = 0; int nul_term_line = 0;
int allow_missing = 0; int allow_missing = 0;
int is_batch_mode = 0; int is_batch_mode = 0;
@ -181,8 +181,8 @@ int cmd_mktree(int ac, const char **av, const char *prefix)
*/ */
; /* skip creating an empty tree */ ; /* skip creating an empty tree */
} else { } else {
write_tree(sha1); write_tree(&oid);
puts(sha1_to_hex(sha1)); puts(oid_to_hex(&oid));
fflush(stdout); fflush(stdout);
} }
used=0; /* reset tree entry buffer for re-use in batch mode */ used=0; /* reset tree entry buffer for re-use in batch mode */

Просмотреть файл

@ -198,9 +198,9 @@ static void prepare_note_data(const struct object_id *object, struct note_data *
} }
} }
static void write_note_data(struct note_data *d, unsigned char *sha1) static void write_note_data(struct note_data *d, struct object_id *oid)
{ {
if (write_sha1_file(d->buf.buf, d->buf.len, blob_type, sha1)) { if (write_object_file(d->buf.buf, d->buf.len, blob_type, oid)) {
error(_("unable to write note object")); error(_("unable to write note object"));
if (d->edit_path) if (d->edit_path)
error(_("the note contents have been left in %s"), error(_("the note contents have been left in %s"),
@ -459,7 +459,7 @@ static int add(int argc, const char **argv, const char *prefix)
prepare_note_data(&object, &d, note ? note->hash : NULL); prepare_note_data(&object, &d, note ? note->hash : NULL);
if (d.buf.len || allow_empty) { if (d.buf.len || allow_empty) {
write_note_data(&d, new_note.hash); write_note_data(&d, &new_note);
if (add_note(t, &object, &new_note, combine_notes_overwrite)) if (add_note(t, &object, &new_note, combine_notes_overwrite))
die("BUG: combine_notes_overwrite failed"); die("BUG: combine_notes_overwrite failed");
commit_notes(t, "Notes added by 'git notes add'"); commit_notes(t, "Notes added by 'git notes add'");
@ -619,7 +619,7 @@ static int append_edit(int argc, const char **argv, const char *prefix)
} }
if (d.buf.len || allow_empty) { if (d.buf.len || allow_empty) {
write_note_data(&d, new_note.hash); write_note_data(&d, &new_note);
if (add_note(t, &object, &new_note, combine_notes_overwrite)) if (add_note(t, &object, &new_note, combine_notes_overwrite))
die("BUG: combine_notes_overwrite failed"); die("BUG: combine_notes_overwrite failed");
logmsg = xstrfmt("Notes added by 'git notes %s'", argv[0]); logmsg = xstrfmt("Notes added by 'git notes %s'", argv[0]);

Просмотреть файл

@ -2793,7 +2793,7 @@ static void loosen_unused_packed_objects(struct rev_info *revs)
if (!packlist_find(&to_pack, oid.hash, NULL) && if (!packlist_find(&to_pack, oid.hash, NULL) &&
!has_sha1_pack_kept_or_nonlocal(&oid) && !has_sha1_pack_kept_or_nonlocal(&oid) &&
!loosened_object_can_be_discarded(&oid, p->mtime)) !loosened_object_can_be_discarded(&oid, p->mtime))
if (force_object_loose(oid.hash, p->mtime)) if (force_object_loose(&oid, p->mtime))
die("unable to force loose object"); die("unable to force loose object");
} }
} }

Просмотреть файл

@ -69,7 +69,7 @@ static int sent_capabilities;
static int shallow_update; static int shallow_update;
static const char *alt_shallow_file; static const char *alt_shallow_file;
static struct strbuf push_cert = STRBUF_INIT; static struct strbuf push_cert = STRBUF_INIT;
static unsigned char push_cert_sha1[20]; static struct object_id push_cert_oid;
static struct signature_check sigcheck; static struct signature_check sigcheck;
static const char *push_cert_nonce; static const char *push_cert_nonce;
static const char *cert_nonce_seed; static const char *cert_nonce_seed;
@ -633,8 +633,9 @@ static void prepare_push_cert_sha1(struct child_process *proc)
int bogs /* beginning_of_gpg_sig */; int bogs /* beginning_of_gpg_sig */;
already_done = 1; already_done = 1;
if (write_sha1_file(push_cert.buf, push_cert.len, "blob", push_cert_sha1)) if (write_object_file(push_cert.buf, push_cert.len, "blob",
hashclr(push_cert_sha1); &push_cert_oid))
oidclr(&push_cert_oid);
memset(&sigcheck, '\0', sizeof(sigcheck)); memset(&sigcheck, '\0', sizeof(sigcheck));
sigcheck.result = 'N'; sigcheck.result = 'N';
@ -655,9 +656,9 @@ static void prepare_push_cert_sha1(struct child_process *proc)
strbuf_release(&gpg_status); strbuf_release(&gpg_status);
nonce_status = check_nonce(push_cert.buf, bogs); nonce_status = check_nonce(push_cert.buf, bogs);
} }
if (!is_null_sha1(push_cert_sha1)) { if (!is_null_oid(&push_cert_oid)) {
argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT=%s", argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT=%s",
sha1_to_hex(push_cert_sha1)); oid_to_hex(&push_cert_oid));
argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT_SIGNER=%s", argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT_SIGNER=%s",
sigcheck.signer ? sigcheck.signer : ""); sigcheck.signer ? sigcheck.signer : "");
argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT_KEY=%s", argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT_KEY=%s",

Просмотреть файл

@ -355,7 +355,7 @@ static void check_one_mergetag(struct commit *commit,
struct tag *tag; struct tag *tag;
int i; int i;
hash_sha1_file(extra->value, extra->len, typename(OBJ_TAG), tag_oid.hash); hash_object_file(extra->value, extra->len, typename(OBJ_TAG), &tag_oid);
tag = lookup_tag(&tag_oid); tag = lookup_tag(&tag_oid);
if (!tag) if (!tag)
die(_("bad mergetag in commit '%s'"), ref); die(_("bad mergetag in commit '%s'"), ref);
@ -410,7 +410,7 @@ static int create_graft(int argc, const char **argv, int force)
check_mergetags(commit, argc, argv); check_mergetags(commit, argc, argv);
if (write_sha1_file(buf.buf, buf.len, commit_type, new.hash)) if (write_object_file(buf.buf, buf.len, commit_type, &new))
die(_("could not write replacement commit for: '%s'"), old_ref); die(_("could not write replacement commit for: '%s'"), old_ref);
strbuf_release(&buf); strbuf_release(&buf);

Просмотреть файл

@ -187,7 +187,7 @@ static int build_tag_object(struct strbuf *buf, int sign, struct object_id *resu
{ {
if (sign && do_sign(buf) < 0) if (sign && do_sign(buf) < 0)
return error(_("unable to sign the tag")); return error(_("unable to sign the tag"));
if (write_sha1_file(buf->buf, buf->len, tag_type, result->hash) < 0) if (write_object_file(buf->buf, buf->len, tag_type, result) < 0)
return error(_("unable to write tag file")); return error(_("unable to write tag file"));
return 0; return 0;
} }

Просмотреть файл

@ -172,7 +172,8 @@ static void write_cached_object(struct object *obj, struct obj_buffer *obj_buf)
{ {
struct object_id oid; struct object_id oid;
if (write_sha1_file(obj_buf->buffer, obj_buf->size, typename(obj->type), oid.hash) < 0) if (write_object_file(obj_buf->buffer, obj_buf->size,
typename(obj->type), &oid) < 0)
die("failed to write object %s", oid_to_hex(&obj->oid)); die("failed to write object %s", oid_to_hex(&obj->oid));
obj->flags |= FLAG_WRITTEN; obj->flags |= FLAG_WRITTEN;
} }
@ -237,14 +238,16 @@ static void write_object(unsigned nr, enum object_type type,
void *buf, unsigned long size) void *buf, unsigned long size)
{ {
if (!strict) { if (!strict) {
if (write_sha1_file(buf, size, typename(type), obj_list[nr].oid.hash) < 0) if (write_object_file(buf, size, typename(type),
&obj_list[nr].oid) < 0)
die("failed to write object"); die("failed to write object");
added_object(nr, type, buf, size); added_object(nr, type, buf, size);
free(buf); free(buf);
obj_list[nr].obj = NULL; obj_list[nr].obj = NULL;
} else if (type == OBJ_BLOB) { } else if (type == OBJ_BLOB) {
struct blob *blob; struct blob *blob;
if (write_sha1_file(buf, size, typename(type), obj_list[nr].oid.hash) < 0) if (write_object_file(buf, size, typename(type),
&obj_list[nr].oid) < 0)
die("failed to write object"); die("failed to write object");
added_object(nr, type, buf, size); added_object(nr, type, buf, size);
free(buf); free(buf);
@ -258,7 +261,7 @@ static void write_object(unsigned nr, enum object_type type,
} else { } else {
struct object *obj; struct object *obj;
int eaten; int eaten;
hash_sha1_file(buf, size, typename(type), obj_list[nr].oid.hash); hash_object_file(buf, size, typename(type), &obj_list[nr].oid);
added_object(nr, type, buf, size); added_object(nr, type, buf, size);
obj = parse_object_buffer(&obj_list[nr].oid, type, size, buf, obj = parse_object_buffer(&obj_list[nr].oid, type, size, buf,
&eaten); &eaten);

Просмотреть файл

@ -399,16 +399,16 @@ static int update_one(struct cache_tree *it,
} }
if (repair) { if (repair) {
unsigned char sha1[20]; struct object_id oid;
hash_sha1_file(buffer.buf, buffer.len, tree_type, sha1); hash_object_file(buffer.buf, buffer.len, tree_type, &oid);
if (has_sha1_file(sha1)) if (has_sha1_file(oid.hash))
hashcpy(it->oid.hash, sha1); oidcpy(&it->oid, &oid);
else else
to_invalidate = 1; to_invalidate = 1;
} else if (dryrun) } else if (dryrun) {
hash_sha1_file(buffer.buf, buffer.len, tree_type, hash_object_file(buffer.buf, buffer.len, tree_type, &it->oid);
it->oid.hash); } else if (write_object_file(buffer.buf, buffer.len, tree_type,
else if (write_sha1_file(buffer.buf, buffer.len, tree_type, it->oid.hash)) { &it->oid)) {
strbuf_release(&buffer); strbuf_release(&buffer);
return -1; return -1;
} }

25
cache.h
Просмотреть файл

@ -1032,7 +1032,7 @@ static inline void hashclr(unsigned char *hash)
static inline void oidclr(struct object_id *oid) static inline void oidclr(struct object_id *oid)
{ {
hashclr(oid->hash); memset(oid->hash, 0, GIT_MAX_RAWSZ);
} }
@ -1050,8 +1050,6 @@ extern const struct object_id empty_tree_oid;
"\xe6\x9d\xe2\x9b\xb2\xd1\xd6\x43\x4b\x8b" \ "\xe6\x9d\xe2\x9b\xb2\xd1\xd6\x43\x4b\x8b" \
"\x29\xae\x77\x5a\xd8\xc2\xe4\x8c\x53\x91" "\x29\xae\x77\x5a\xd8\xc2\xe4\x8c\x53\x91"
extern const struct object_id empty_blob_oid; extern const struct object_id empty_blob_oid;
#define EMPTY_BLOB_SHA1_BIN (empty_blob_oid.hash)
static inline int is_empty_blob_sha1(const unsigned char *sha1) static inline int is_empty_blob_sha1(const unsigned char *sha1)
{ {
@ -1241,11 +1239,22 @@ static inline const unsigned char *lookup_replace_object(const unsigned char *sh
/* Read and unpack a sha1 file into memory, write memory to a sha1 file */ /* Read and unpack a sha1 file into memory, write memory to a sha1 file */
extern int sha1_object_info(const unsigned char *, unsigned long *); extern int sha1_object_info(const unsigned char *, unsigned long *);
extern int hash_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *sha1);
extern int write_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *return_sha1); extern int hash_object_file(const void *buf, unsigned long len,
extern int hash_sha1_file_literally(const void *buf, unsigned long len, const char *type, struct object_id *oid, unsigned flags); const char *type, struct object_id *oid);
extern int pretend_sha1_file(void *, unsigned long, enum object_type, unsigned char *);
extern int force_object_loose(const unsigned char *sha1, time_t mtime); extern int write_object_file(const void *buf, unsigned long len,
const char *type, struct object_id *oid);
extern int hash_object_file_literally(const void *buf, unsigned long len,
const char *type, struct object_id *oid,
unsigned flags);
extern int pretend_object_file(void *, unsigned long, enum object_type,
struct object_id *oid);
extern int force_object_loose(const struct object_id *oid, time_t mtime);
extern int git_open_cloexec(const char *name, int flags); extern int git_open_cloexec(const char *name, int flags);
#define git_open(name) git_open_cloexec(name, O_RDONLY) #define git_open(name) git_open_cloexec(name, O_RDONLY)
extern void *map_sha1_file(const unsigned char *sha1, unsigned long *size); extern void *map_sha1_file(const unsigned char *sha1, unsigned long *size);

Просмотреть файл

@ -1378,9 +1378,8 @@ void free_commit_extra_headers(struct commit_extra_header *extra)
} }
} }
int commit_tree(const char *msg, size_t msg_len, int commit_tree(const char *msg, size_t msg_len, const struct object_id *tree,
const unsigned char *tree, struct commit_list *parents, struct object_id *ret,
struct commit_list *parents, unsigned char *ret,
const char *author, const char *sign_commit) const char *author, const char *sign_commit)
{ {
struct commit_extra_header *extra = NULL, **tail = &extra; struct commit_extra_header *extra = NULL, **tail = &extra;
@ -1509,8 +1508,8 @@ N_("Warning: commit message did not conform to UTF-8.\n"
"variable i18n.commitencoding to the encoding your project uses.\n"); "variable i18n.commitencoding to the encoding your project uses.\n");
int commit_tree_extended(const char *msg, size_t msg_len, int commit_tree_extended(const char *msg, size_t msg_len,
const unsigned char *tree, const struct object_id *tree,
struct commit_list *parents, unsigned char *ret, struct commit_list *parents, struct object_id *ret,
const char *author, const char *sign_commit, const char *author, const char *sign_commit,
struct commit_extra_header *extra) struct commit_extra_header *extra)
{ {
@ -1518,7 +1517,7 @@ int commit_tree_extended(const char *msg, size_t msg_len,
int encoding_is_utf8; int encoding_is_utf8;
struct strbuf buffer; struct strbuf buffer;
assert_sha1_type(tree, OBJ_TREE); assert_sha1_type(tree->hash, OBJ_TREE);
if (memchr(msg, '\0', msg_len)) if (memchr(msg, '\0', msg_len))
return error("a NUL byte in commit log message not allowed."); return error("a NUL byte in commit log message not allowed.");
@ -1527,7 +1526,7 @@ int commit_tree_extended(const char *msg, size_t msg_len,
encoding_is_utf8 = is_encoding_utf8(git_commit_encoding); encoding_is_utf8 = is_encoding_utf8(git_commit_encoding);
strbuf_init(&buffer, 8192); /* should avoid reallocs for the headers */ strbuf_init(&buffer, 8192); /* should avoid reallocs for the headers */
strbuf_addf(&buffer, "tree %s\n", sha1_to_hex(tree)); strbuf_addf(&buffer, "tree %s\n", oid_to_hex(tree));
/* /*
* NOTE! This ordering means that the same exact tree merged with a * NOTE! This ordering means that the same exact tree merged with a
@ -1566,7 +1565,7 @@ int commit_tree_extended(const char *msg, size_t msg_len,
goto out; goto out;
} }
result = write_sha1_file(buffer.buf, buffer.len, commit_type, ret); result = write_object_file(buffer.buf, buffer.len, commit_type, ret);
out: out:
strbuf_release(&buffer); strbuf_release(&buffer);
return result; return result;

Просмотреть файл

@ -262,14 +262,15 @@ extern void append_merge_tag_headers(struct commit_list *parents,
struct commit_extra_header ***tail); struct commit_extra_header ***tail);
extern int commit_tree(const char *msg, size_t msg_len, extern int commit_tree(const char *msg, size_t msg_len,
const unsigned char *tree, const struct object_id *tree,
struct commit_list *parents, unsigned char *ret, struct commit_list *parents, struct object_id *ret,
const char *author, const char *sign_commit); const char *author, const char *sign_commit);
extern int commit_tree_extended(const char *msg, size_t msg_len, extern int commit_tree_extended(const char *msg, size_t msg_len,
const unsigned char *tree, const struct object_id *tree,
struct commit_list *parents, unsigned char *ret, struct commit_list *parents,
const char *author, const char *sign_commit, struct object_id *ret, const char *author,
const char *sign_commit,
struct commit_extra_header *); struct commit_extra_header *);
extern struct commit_extra_header *read_commit_extra_headers(struct commit *, const char **); extern struct commit_extra_header *read_commit_extra_headers(struct commit *, const char **);

Просмотреть файл

@ -898,7 +898,7 @@ static int ident_to_git(const char *path, const char *src, size_t len,
static int ident_to_worktree(const char *path, const char *src, size_t len, static int ident_to_worktree(const char *path, const char *src, size_t len,
struct strbuf *buf, int ident) struct strbuf *buf, int ident)
{ {
unsigned char sha1[20]; struct object_id oid;
char *to_free = NULL, *dollar, *spc; char *to_free = NULL, *dollar, *spc;
int cnt; int cnt;
@ -912,7 +912,7 @@ static int ident_to_worktree(const char *path, const char *src, size_t len,
/* are we "faking" in place editing ? */ /* are we "faking" in place editing ? */
if (src == buf->buf) if (src == buf->buf)
to_free = strbuf_detach(buf, NULL); to_free = strbuf_detach(buf, NULL);
hash_sha1_file(src, len, "blob", sha1); hash_object_file(src, len, "blob", &oid);
strbuf_grow(buf, len + cnt * 43); strbuf_grow(buf, len + cnt * 43);
for (;;) { for (;;) {
@ -969,7 +969,7 @@ static int ident_to_worktree(const char *path, const char *src, size_t len,
/* step 4: substitute */ /* step 4: substitute */
strbuf_addstr(buf, "Id: "); strbuf_addstr(buf, "Id: ");
strbuf_add(buf, sha1_to_hex(sha1), 40); strbuf_addstr(buf, oid_to_hex(&oid));
strbuf_addstr(buf, " $"); strbuf_addstr(buf, " $");
} }
strbuf_add(buf, src, len); strbuf_add(buf, src, len);

Просмотреть файл

@ -260,8 +260,8 @@ static unsigned int hash_filespec(struct diff_filespec *filespec)
if (!filespec->oid_valid) { if (!filespec->oid_valid) {
if (diff_populate_filespec(filespec, 0)) if (diff_populate_filespec(filespec, 0))
return 0; return 0;
hash_sha1_file(filespec->data, filespec->size, "blob", hash_object_file(filespec->data, filespec->size, "blob",
filespec->oid.hash); &filespec->oid);
} }
return sha1hash(filespec->oid.hash); return sha1hash(filespec->oid.hash);
} }

104
dir.c
Просмотреть файл

@ -231,12 +231,10 @@ int within_depth(const char *name, int namelen,
* 1 along with { data, size } of the (possibly augmented) buffer * 1 along with { data, size } of the (possibly augmented) buffer
* when successful. * when successful.
* *
* Optionally updates the given sha1_stat with the given OID (when valid). * Optionally updates the given oid_stat with the given OID (when valid).
*/ */
static int do_read_blob(const struct object_id *oid, static int do_read_blob(const struct object_id *oid, struct oid_stat *oid_stat,
struct sha1_stat *sha1_stat, size_t *size_out, char **data_out)
size_t *size_out,
char **data_out)
{ {
enum object_type type; enum object_type type;
unsigned long sz; unsigned long sz;
@ -251,9 +249,9 @@ static int do_read_blob(const struct object_id *oid,
return -1; return -1;
} }
if (sha1_stat) { if (oid_stat) {
memset(&sha1_stat->stat, 0, sizeof(sha1_stat->stat)); memset(&oid_stat->stat, 0, sizeof(oid_stat->stat));
hashcpy(sha1_stat->sha1, oid->hash); oidcpy(&oid_stat->oid, oid);
} }
if (sz == 0) { if (sz == 0) {
@ -654,9 +652,8 @@ void add_exclude(const char *string, const char *base,
static int read_skip_worktree_file_from_index(const struct index_state *istate, static int read_skip_worktree_file_from_index(const struct index_state *istate,
const char *path, const char *path,
size_t *size_out, size_t *size_out, char **data_out,
char **data_out, struct oid_stat *oid_stat)
struct sha1_stat *sha1_stat)
{ {
int pos, len; int pos, len;
@ -667,7 +664,7 @@ static int read_skip_worktree_file_from_index(const struct index_state *istate,
if (!ce_skip_worktree(istate->cache[pos])) if (!ce_skip_worktree(istate->cache[pos]))
return -1; return -1;
return do_read_blob(&istate->cache[pos]->oid, sha1_stat, size_out, data_out); return do_read_blob(&istate->cache[pos]->oid, oid_stat, size_out, data_out);
} }
/* /*
@ -795,9 +792,8 @@ static int add_excludes_from_buffer(char *buf, size_t size,
* ss_valid is non-zero, "ss" must contain good value as input. * ss_valid is non-zero, "ss" must contain good value as input.
*/ */
static int add_excludes(const char *fname, const char *base, int baselen, static int add_excludes(const char *fname, const char *base, int baselen,
struct exclude_list *el, struct exclude_list *el, struct index_state *istate,
struct index_state *istate, struct oid_stat *oid_stat)
struct sha1_stat *sha1_stat)
{ {
struct stat st; struct stat st;
int r; int r;
@ -815,16 +811,16 @@ static int add_excludes(const char *fname, const char *base, int baselen,
return -1; return -1;
r = read_skip_worktree_file_from_index(istate, fname, r = read_skip_worktree_file_from_index(istate, fname,
&size, &buf, &size, &buf,
sha1_stat); oid_stat);
if (r != 1) if (r != 1)
return r; return r;
} else { } else {
size = xsize_t(st.st_size); size = xsize_t(st.st_size);
if (size == 0) { if (size == 0) {
if (sha1_stat) { if (oid_stat) {
fill_stat_data(&sha1_stat->stat, &st); fill_stat_data(&oid_stat->stat, &st);
hashcpy(sha1_stat->sha1, EMPTY_BLOB_SHA1_BIN); oidcpy(&oid_stat->oid, &empty_blob_oid);
sha1_stat->valid = 1; oid_stat->valid = 1;
} }
close(fd); close(fd);
return 0; return 0;
@ -837,22 +833,23 @@ static int add_excludes(const char *fname, const char *base, int baselen,
} }
buf[size++] = '\n'; buf[size++] = '\n';
close(fd); close(fd);
if (sha1_stat) { if (oid_stat) {
int pos; int pos;
if (sha1_stat->valid && if (oid_stat->valid &&
!match_stat_data_racy(istate, &sha1_stat->stat, &st)) !match_stat_data_racy(istate, &oid_stat->stat, &st))
; /* no content change, ss->sha1 still good */ ; /* no content change, ss->sha1 still good */
else if (istate && else if (istate &&
(pos = index_name_pos(istate, fname, strlen(fname))) >= 0 && (pos = index_name_pos(istate, fname, strlen(fname))) >= 0 &&
!ce_stage(istate->cache[pos]) && !ce_stage(istate->cache[pos]) &&
ce_uptodate(istate->cache[pos]) && ce_uptodate(istate->cache[pos]) &&
!would_convert_to_git(istate, fname)) !would_convert_to_git(istate, fname))
hashcpy(sha1_stat->sha1, oidcpy(&oid_stat->oid,
istate->cache[pos]->oid.hash); &istate->cache[pos]->oid);
else else
hash_sha1_file(buf, size, "blob", sha1_stat->sha1); hash_object_file(buf, size, "blob",
fill_stat_data(&sha1_stat->stat, &st); &oid_stat->oid);
sha1_stat->valid = 1; fill_stat_data(&oid_stat->stat, &st);
oid_stat->valid = 1;
} }
} }
@ -930,7 +927,7 @@ struct exclude_list *add_exclude_list(struct dir_struct *dir,
* Used to set up core.excludesfile and .git/info/exclude lists. * Used to set up core.excludesfile and .git/info/exclude lists.
*/ */
static void add_excludes_from_file_1(struct dir_struct *dir, const char *fname, static void add_excludes_from_file_1(struct dir_struct *dir, const char *fname,
struct sha1_stat *sha1_stat) struct oid_stat *oid_stat)
{ {
struct exclude_list *el; struct exclude_list *el;
/* /*
@ -941,7 +938,7 @@ static void add_excludes_from_file_1(struct dir_struct *dir, const char *fname,
if (!dir->untracked) if (!dir->untracked)
dir->unmanaged_exclude_files++; dir->unmanaged_exclude_files++;
el = add_exclude_list(dir, EXC_FILE, fname); el = add_exclude_list(dir, EXC_FILE, fname);
if (add_excludes(fname, "", 0, el, NULL, sha1_stat) < 0) if (add_excludes(fname, "", 0, el, NULL, oid_stat) < 0)
die("cannot use %s as an exclude file", fname); die("cannot use %s as an exclude file", fname);
} }
@ -1180,7 +1177,7 @@ static void prep_exclude(struct dir_struct *dir,
while (current < baselen) { while (current < baselen) {
const char *cp; const char *cp;
struct sha1_stat sha1_stat; struct oid_stat oid_stat;
stk = xcalloc(1, sizeof(*stk)); stk = xcalloc(1, sizeof(*stk));
if (current < 0) { if (current < 0) {
@ -1223,8 +1220,8 @@ static void prep_exclude(struct dir_struct *dir,
} }
/* Try to read per-directory file */ /* Try to read per-directory file */
hashclr(sha1_stat.sha1); oidclr(&oid_stat.oid);
sha1_stat.valid = 0; oid_stat.valid = 0;
if (dir->exclude_per_dir && if (dir->exclude_per_dir &&
/* /*
* If we know that no files have been added in * If we know that no files have been added in
@ -1252,7 +1249,7 @@ static void prep_exclude(struct dir_struct *dir,
strbuf_addstr(&sb, dir->exclude_per_dir); strbuf_addstr(&sb, dir->exclude_per_dir);
el->src = strbuf_detach(&sb, NULL); el->src = strbuf_detach(&sb, NULL);
add_excludes(el->src, el->src, stk->baselen, el, istate, add_excludes(el->src, el->src, stk->baselen, el, istate,
untracked ? &sha1_stat : NULL); untracked ? &oid_stat : NULL);
} }
/* /*
* NEEDSWORK: when untracked cache is enabled, prep_exclude() * NEEDSWORK: when untracked cache is enabled, prep_exclude()
@ -1269,9 +1266,9 @@ static void prep_exclude(struct dir_struct *dir,
* order, though, if you do that. * order, though, if you do that.
*/ */
if (untracked && if (untracked &&
hashcmp(sha1_stat.sha1, untracked->exclude_sha1)) { hashcmp(oid_stat.oid.hash, untracked->exclude_sha1)) {
invalidate_gitignore(dir->untracked, untracked); invalidate_gitignore(dir->untracked, untracked);
hashcpy(untracked->exclude_sha1, sha1_stat.sha1); hashcpy(untracked->exclude_sha1, oid_stat.oid.hash);
} }
dir->exclude_stack = stk; dir->exclude_stack = stk;
current = stk->baselen; current = stk->baselen;
@ -2228,13 +2225,13 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d
/* Validate $GIT_DIR/info/exclude and core.excludesfile */ /* Validate $GIT_DIR/info/exclude and core.excludesfile */
root = dir->untracked->root; root = dir->untracked->root;
if (hashcmp(dir->ss_info_exclude.sha1, if (oidcmp(&dir->ss_info_exclude.oid,
dir->untracked->ss_info_exclude.sha1)) { &dir->untracked->ss_info_exclude.oid)) {
invalidate_gitignore(dir->untracked, root); invalidate_gitignore(dir->untracked, root);
dir->untracked->ss_info_exclude = dir->ss_info_exclude; dir->untracked->ss_info_exclude = dir->ss_info_exclude;
} }
if (hashcmp(dir->ss_excludes_file.sha1, if (oidcmp(&dir->ss_excludes_file.oid,
dir->untracked->ss_excludes_file.sha1)) { &dir->untracked->ss_excludes_file.oid)) {
invalidate_gitignore(dir->untracked, root); invalidate_gitignore(dir->untracked, root);
dir->untracked->ss_excludes_file = dir->ss_excludes_file; dir->untracked->ss_excludes_file = dir->ss_excludes_file;
} }
@ -2638,8 +2635,8 @@ void write_untracked_extension(struct strbuf *out, struct untracked_cache *untra
FLEX_ALLOC_MEM(ouc, exclude_per_dir, untracked->exclude_per_dir, len); FLEX_ALLOC_MEM(ouc, exclude_per_dir, untracked->exclude_per_dir, len);
stat_data_to_disk(&ouc->info_exclude_stat, &untracked->ss_info_exclude.stat); stat_data_to_disk(&ouc->info_exclude_stat, &untracked->ss_info_exclude.stat);
stat_data_to_disk(&ouc->excludes_file_stat, &untracked->ss_excludes_file.stat); stat_data_to_disk(&ouc->excludes_file_stat, &untracked->ss_excludes_file.stat);
hashcpy(ouc->info_exclude_sha1, untracked->ss_info_exclude.sha1); hashcpy(ouc->info_exclude_sha1, untracked->ss_info_exclude.oid.hash);
hashcpy(ouc->excludes_file_sha1, untracked->ss_excludes_file.sha1); hashcpy(ouc->excludes_file_sha1, untracked->ss_excludes_file.oid.hash);
ouc->dir_flags = htonl(untracked->dir_flags); ouc->dir_flags = htonl(untracked->dir_flags);
varint_len = encode_varint(untracked->ident.len, varbuf); varint_len = encode_varint(untracked->ident.len, varbuf);
@ -2816,13 +2813,12 @@ static void read_sha1(size_t pos, void *cb)
rd->data += 20; rd->data += 20;
} }
static void load_sha1_stat(struct sha1_stat *sha1_stat, static void load_oid_stat(struct oid_stat *oid_stat, const unsigned char *data,
const unsigned char *data, const unsigned char *sha1)
const unsigned char *sha1)
{ {
stat_data_from_disk(&sha1_stat->stat, data); stat_data_from_disk(&oid_stat->stat, data);
hashcpy(sha1_stat->sha1, sha1); hashcpy(oid_stat->oid.hash, sha1);
sha1_stat->valid = 1; oid_stat->valid = 1;
} }
struct untracked_cache *read_untracked_extension(const void *data, unsigned long sz) struct untracked_cache *read_untracked_extension(const void *data, unsigned long sz)
@ -2850,12 +2846,12 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long
uc = xcalloc(1, sizeof(*uc)); uc = xcalloc(1, sizeof(*uc));
strbuf_init(&uc->ident, ident_len); strbuf_init(&uc->ident, ident_len);
strbuf_add(&uc->ident, ident, ident_len); strbuf_add(&uc->ident, ident, ident_len);
load_sha1_stat(&uc->ss_info_exclude, load_oid_stat(&uc->ss_info_exclude,
next + ouc_offset(info_exclude_stat), next + ouc_offset(info_exclude_stat),
next + ouc_offset(info_exclude_sha1)); next + ouc_offset(info_exclude_sha1));
load_sha1_stat(&uc->ss_excludes_file, load_oid_stat(&uc->ss_excludes_file,
next + ouc_offset(excludes_file_stat), next + ouc_offset(excludes_file_stat),
next + ouc_offset(excludes_file_sha1)); next + ouc_offset(excludes_file_sha1));
uc->dir_flags = get_be32(next + ouc_offset(dir_flags)); uc->dir_flags = get_be32(next + ouc_offset(dir_flags));
exclude_per_dir = (const char *)next + ouc_offset(exclude_per_dir); exclude_per_dir = (const char *)next + ouc_offset(exclude_per_dir);
uc->exclude_per_dir = xstrdup(exclude_per_dir); uc->exclude_per_dir = xstrdup(exclude_per_dir);

12
dir.h
Просмотреть файл

@ -74,9 +74,9 @@ struct exclude_list_group {
struct exclude_list *el; struct exclude_list *el;
}; };
struct sha1_stat { struct oid_stat {
struct stat_data stat; struct stat_data stat;
unsigned char sha1[20]; struct object_id oid;
int valid; int valid;
}; };
@ -124,8 +124,8 @@ struct untracked_cache_dir {
}; };
struct untracked_cache { struct untracked_cache {
struct sha1_stat ss_info_exclude; struct oid_stat ss_info_exclude;
struct sha1_stat ss_excludes_file; struct oid_stat ss_excludes_file;
const char *exclude_per_dir; const char *exclude_per_dir;
struct strbuf ident; struct strbuf ident;
/* /*
@ -195,8 +195,8 @@ struct dir_struct {
/* Enable untracked file cache if set */ /* Enable untracked file cache if set */
struct untracked_cache *untracked; struct untracked_cache *untracked;
struct sha1_stat ss_info_exclude; struct oid_stat ss_info_exclude;
struct sha1_stat ss_excludes_file; struct oid_stat ss_excludes_file;
unsigned unmanaged_exclude_files; unsigned unmanaged_exclude_files;
}; };

Просмотреть файл

@ -499,7 +499,7 @@ static void show_one_mergetag(struct commit *commit,
int status, nth; int status, nth;
size_t payload_size, gpg_message_offset; size_t payload_size, gpg_message_offset;
hash_sha1_file(extra->value, extra->len, typename(OBJ_TAG), oid.hash); hash_object_file(extra->value, extra->len, typename(OBJ_TAG), &oid);
tag = lookup_tag(&oid); tag = lookup_tag(&oid);
if (!tag) if (!tag)
return; /* error message already given */ return; /* error message already given */

Просмотреть файл

@ -158,22 +158,20 @@ static void match_trees(const struct object_id *hash1,
} }
/* /*
* A tree "hash1" has a subdirectory at "prefix". Come up with a * A tree "oid1" has a subdirectory at "prefix". Come up with a tree object by
* tree object by replacing it with another tree "hash2". * replacing it with another tree "oid2".
*/ */
static int splice_tree(const unsigned char *hash1, static int splice_tree(const struct object_id *oid1, const char *prefix,
const char *prefix, const struct object_id *oid2, struct object_id *result)
const unsigned char *hash2,
unsigned char *result)
{ {
char *subpath; char *subpath;
int toplen; int toplen;
char *buf; char *buf;
unsigned long sz; unsigned long sz;
struct tree_desc desc; struct tree_desc desc;
unsigned char *rewrite_here; struct object_id *rewrite_here;
const unsigned char *rewrite_with; const struct object_id *rewrite_with;
unsigned char subtree[20]; struct object_id subtree;
enum object_type type; enum object_type type;
int status; int status;
@ -182,9 +180,9 @@ static int splice_tree(const unsigned char *hash1,
if (*subpath) if (*subpath)
subpath++; subpath++;
buf = read_sha1_file(hash1, &type, &sz); buf = read_sha1_file(oid1->hash, &type, &sz);
if (!buf) if (!buf)
die("cannot read tree %s", sha1_to_hex(hash1)); die("cannot read tree %s", oid_to_hex(oid1));
init_tree_desc(&desc, buf, sz); init_tree_desc(&desc, buf, sz);
rewrite_here = NULL; rewrite_here = NULL;
@ -197,26 +195,26 @@ static int splice_tree(const unsigned char *hash1,
if (strlen(name) == toplen && if (strlen(name) == toplen &&
!memcmp(name, prefix, toplen)) { !memcmp(name, prefix, toplen)) {
if (!S_ISDIR(mode)) if (!S_ISDIR(mode))
die("entry %s in tree %s is not a tree", die("entry %s in tree %s is not a tree", name,
name, sha1_to_hex(hash1)); oid_to_hex(oid1));
rewrite_here = (unsigned char *) oid->hash; rewrite_here = (struct object_id *)oid;
break; break;
} }
update_tree_entry(&desc); update_tree_entry(&desc);
} }
if (!rewrite_here) if (!rewrite_here)
die("entry %.*s not found in tree %s", die("entry %.*s not found in tree %s", toplen, prefix,
toplen, prefix, sha1_to_hex(hash1)); oid_to_hex(oid1));
if (*subpath) { if (*subpath) {
status = splice_tree(rewrite_here, subpath, hash2, subtree); status = splice_tree(rewrite_here, subpath, oid2, &subtree);
if (status) if (status)
return status; return status;
rewrite_with = subtree; rewrite_with = &subtree;
} else {
rewrite_with = oid2;
} }
else oidcpy(rewrite_here, rewrite_with);
rewrite_with = hash2; status = write_object_file(buf, sz, tree_type, result);
hashcpy(rewrite_here, rewrite_with);
status = write_sha1_file(buf, sz, tree_type, result);
free(buf); free(buf);
return status; return status;
} }
@ -280,7 +278,7 @@ void shift_tree(const struct object_id *hash1,
if (!*add_prefix) if (!*add_prefix)
return; return;
splice_tree(hash1->hash, add_prefix, hash2->hash, shifted->hash); splice_tree(hash1, add_prefix, hash2, shifted);
} }
/* /*
@ -334,7 +332,7 @@ void shift_tree_by(const struct object_id *hash1,
* shift tree2 down by adding shift_prefix above it * shift tree2 down by adding shift_prefix above it
* to match tree1. * to match tree1.
*/ */
splice_tree(hash1->hash, shift_prefix, hash2->hash, shifted->hash); splice_tree(hash1, shift_prefix, hash2, shifted);
else else
/* /*
* shift tree2 up by removing shift_prefix from it * shift tree2 up by removing shift_prefix from it

Просмотреть файл

@ -1028,8 +1028,9 @@ static int merge_file_1(struct merge_options *o,
if ((merge_status < 0) || !result_buf.ptr) if ((merge_status < 0) || !result_buf.ptr)
ret = err(o, _("Failed to execute internal merge")); ret = err(o, _("Failed to execute internal merge"));
if (!ret && write_sha1_file(result_buf.ptr, result_buf.size, if (!ret &&
blob_type, result->oid.hash)) write_object_file(result_buf.ptr, result_buf.size,
blob_type, &result->oid))
ret = err(o, _("Unable to add %s to database"), ret = err(o, _("Unable to add %s to database"),
a->path); a->path);

Просмотреть файл

@ -54,10 +54,10 @@ int notes_cache_write(struct notes_cache *c)
if (!c->tree.dirty) if (!c->tree.dirty)
return 0; return 0;
if (write_notes_tree(&c->tree, tree_oid.hash)) if (write_notes_tree(&c->tree, &tree_oid))
return -1; return -1;
if (commit_tree(c->validity, strlen(c->validity), tree_oid.hash, NULL, if (commit_tree(c->validity, strlen(c->validity), &tree_oid, NULL,
commit_oid.hash, NULL, NULL) < 0) &commit_oid, NULL, NULL) < 0)
return -1; return -1;
if (update_ref("update notes cache", c->tree.update_ref, &commit_oid, if (update_ref("update notes cache", c->tree.update_ref, &commit_oid,
NULL, 0, UPDATE_REFS_QUIET_ON_ERR) < 0) NULL, 0, UPDATE_REFS_QUIET_ON_ERR) < 0)
@ -88,7 +88,7 @@ int notes_cache_put(struct notes_cache *c, struct object_id *key_oid,
{ {
struct object_id value_oid; struct object_id value_oid;
if (write_sha1_file(data, size, "blob", value_oid.hash) < 0) if (write_object_file(data, size, "blob", &value_oid) < 0)
return -1; return -1;
return add_note(&c->tree, key_oid, &value_oid, NULL); return add_note(&c->tree, key_oid, &value_oid, NULL);
} }

Просмотреть файл

@ -642,9 +642,8 @@ int notes_merge(struct notes_merge_options *o,
struct commit_list *parents = NULL; struct commit_list *parents = NULL;
commit_list_insert(remote, &parents); /* LIFO order */ commit_list_insert(remote, &parents); /* LIFO order */
commit_list_insert(local, &parents); commit_list_insert(local, &parents);
create_notes_commit(local_tree, parents, create_notes_commit(local_tree, parents, o->commit_msg.buf,
o->commit_msg.buf, o->commit_msg.len, o->commit_msg.len, result_oid);
result_oid->hash);
} }
found_result: found_result:
@ -718,8 +717,8 @@ int notes_merge_commit(struct notes_merge_options *o,
strbuf_setlen(&path, baselen); strbuf_setlen(&path, baselen);
} }
create_notes_commit(partial_tree, partial_commit->parents, create_notes_commit(partial_tree, partial_commit->parents, msg,
msg, strlen(msg), result_oid->hash); strlen(msg), result_oid);
unuse_commit_buffer(partial_commit, buffer); unuse_commit_buffer(partial_commit, buffer);
if (o->verbosity >= 4) if (o->verbosity >= 4)
printf("Finalized notes merge commit: %s\n", printf("Finalized notes merge commit: %s\n",

Просмотреть файл

@ -6,13 +6,13 @@
void create_notes_commit(struct notes_tree *t, struct commit_list *parents, void create_notes_commit(struct notes_tree *t, struct commit_list *parents,
const char *msg, size_t msg_len, const char *msg, size_t msg_len,
unsigned char *result_sha1) struct object_id *result_oid)
{ {
struct object_id tree_oid; struct object_id tree_oid;
assert(t->initialized); assert(t->initialized);
if (write_notes_tree(t, tree_oid.hash)) if (write_notes_tree(t, &tree_oid))
die("Failed to write notes tree to database"); die("Failed to write notes tree to database");
if (!parents) { if (!parents) {
@ -27,7 +27,8 @@ void create_notes_commit(struct notes_tree *t, struct commit_list *parents,
/* else: t->ref points to nothing, assume root/orphan commit */ /* else: t->ref points to nothing, assume root/orphan commit */
} }
if (commit_tree(msg, msg_len, tree_oid.hash, parents, result_sha1, NULL, NULL)) if (commit_tree(msg, msg_len, &tree_oid, parents, result_oid, NULL,
NULL))
die("Failed to commit notes tree to database"); die("Failed to commit notes tree to database");
} }
@ -47,7 +48,7 @@ void commit_notes(struct notes_tree *t, const char *msg)
strbuf_addstr(&buf, msg); strbuf_addstr(&buf, msg);
strbuf_complete_line(&buf); strbuf_complete_line(&buf);
create_notes_commit(t, NULL, buf.buf, buf.len, commit_oid.hash); create_notes_commit(t, NULL, buf.buf, buf.len, &commit_oid);
strbuf_insert(&buf, 0, "notes: ", 7); /* commit message starts at index 7 */ strbuf_insert(&buf, 0, "notes: ", 7); /* commit message starts at index 7 */
update_ref(buf.buf, t->update_ref, &commit_oid, NULL, 0, update_ref(buf.buf, t->update_ref, &commit_oid, NULL, 0,
UPDATE_REFS_DIE_ON_ERR); UPDATE_REFS_DIE_ON_ERR);

Просмотреть файл

@ -15,7 +15,8 @@
* The resulting commit SHA1 is stored in result_sha1. * The resulting commit SHA1 is stored in result_sha1.
*/ */
void create_notes_commit(struct notes_tree *t, struct commit_list *parents, void create_notes_commit(struct notes_tree *t, struct commit_list *parents,
const char *msg, size_t msg_len, unsigned char *result_sha1); const char *msg, size_t msg_len,
struct object_id *result_oid);
void commit_notes(struct notes_tree *t, const char *msg); void commit_notes(struct notes_tree *t, const char *msg);

63
notes.c
Просмотреть файл

@ -270,8 +270,8 @@ static int note_tree_insert(struct notes_tree *t, struct int_node *tree,
if (!oidcmp(&l->val_oid, &entry->val_oid)) if (!oidcmp(&l->val_oid, &entry->val_oid))
return 0; return 0;
ret = combine_notes(l->val_oid.hash, ret = combine_notes(&l->val_oid,
entry->val_oid.hash); &entry->val_oid);
if (!ret && is_null_oid(&l->val_oid)) if (!ret && is_null_oid(&l->val_oid))
note_tree_remove(t, tree, n, entry); note_tree_remove(t, tree, n, entry);
free(entry); free(entry);
@ -667,7 +667,7 @@ static int tree_write_stack_finish_subtree(struct tree_write_stack *tws)
ret = tree_write_stack_finish_subtree(n); ret = tree_write_stack_finish_subtree(n);
if (ret) if (ret)
return ret; return ret;
ret = write_sha1_file(n->buf.buf, n->buf.len, tree_type, s.hash); ret = write_object_file(n->buf.buf, n->buf.len, tree_type, &s);
if (ret) if (ret)
return ret; return ret;
strbuf_release(&n->buf); strbuf_release(&n->buf);
@ -786,8 +786,8 @@ static int prune_notes_helper(const struct object_id *object_oid,
return 0; return 0;
} }
int combine_notes_concatenate(unsigned char *cur_sha1, int combine_notes_concatenate(struct object_id *cur_oid,
const unsigned char *new_sha1) const struct object_id *new_oid)
{ {
char *cur_msg = NULL, *new_msg = NULL, *buf; char *cur_msg = NULL, *new_msg = NULL, *buf;
unsigned long cur_len, new_len, buf_len; unsigned long cur_len, new_len, buf_len;
@ -795,18 +795,18 @@ int combine_notes_concatenate(unsigned char *cur_sha1,
int ret; int ret;
/* read in both note blob objects */ /* read in both note blob objects */
if (!is_null_sha1(new_sha1)) if (!is_null_oid(new_oid))
new_msg = read_sha1_file(new_sha1, &new_type, &new_len); new_msg = read_sha1_file(new_oid->hash, &new_type, &new_len);
if (!new_msg || !new_len || new_type != OBJ_BLOB) { if (!new_msg || !new_len || new_type != OBJ_BLOB) {
free(new_msg); free(new_msg);
return 0; return 0;
} }
if (!is_null_sha1(cur_sha1)) if (!is_null_oid(cur_oid))
cur_msg = read_sha1_file(cur_sha1, &cur_type, &cur_len); cur_msg = read_sha1_file(cur_oid->hash, &cur_type, &cur_len);
if (!cur_msg || !cur_len || cur_type != OBJ_BLOB) { if (!cur_msg || !cur_len || cur_type != OBJ_BLOB) {
free(cur_msg); free(cur_msg);
free(new_msg); free(new_msg);
hashcpy(cur_sha1, new_sha1); oidcpy(cur_oid, new_oid);
return 0; return 0;
} }
@ -825,20 +825,20 @@ int combine_notes_concatenate(unsigned char *cur_sha1,
free(new_msg); free(new_msg);
/* create a new blob object from buf */ /* create a new blob object from buf */
ret = write_sha1_file(buf, buf_len, blob_type, cur_sha1); ret = write_object_file(buf, buf_len, blob_type, cur_oid);
free(buf); free(buf);
return ret; return ret;
} }
int combine_notes_overwrite(unsigned char *cur_sha1, int combine_notes_overwrite(struct object_id *cur_oid,
const unsigned char *new_sha1) const struct object_id *new_oid)
{ {
hashcpy(cur_sha1, new_sha1); oidcpy(cur_oid, new_oid);
return 0; return 0;
} }
int combine_notes_ignore(unsigned char *cur_sha1, int combine_notes_ignore(struct object_id *cur_oid,
const unsigned char *new_sha1) const struct object_id *new_oid)
{ {
return 0; return 0;
} }
@ -848,17 +848,17 @@ int combine_notes_ignore(unsigned char *cur_sha1,
* newlines removed. * newlines removed.
*/ */
static int string_list_add_note_lines(struct string_list *list, static int string_list_add_note_lines(struct string_list *list,
const unsigned char *sha1) const struct object_id *oid)
{ {
char *data; char *data;
unsigned long len; unsigned long len;
enum object_type t; enum object_type t;
if (is_null_sha1(sha1)) if (is_null_oid(oid))
return 0; return 0;
/* read_sha1_file NUL-terminates */ /* read_sha1_file NUL-terminates */
data = read_sha1_file(sha1, &t, &len); data = read_sha1_file(oid->hash, &t, &len);
if (t != OBJ_BLOB || !data || !len) { if (t != OBJ_BLOB || !data || !len) {
free(data); free(data);
return t != OBJ_BLOB || !data; return t != OBJ_BLOB || !data;
@ -884,17 +884,17 @@ static int string_list_join_lines_helper(struct string_list_item *item,
return 0; return 0;
} }
int combine_notes_cat_sort_uniq(unsigned char *cur_sha1, int combine_notes_cat_sort_uniq(struct object_id *cur_oid,
const unsigned char *new_sha1) const struct object_id *new_oid)
{ {
struct string_list sort_uniq_list = STRING_LIST_INIT_DUP; struct string_list sort_uniq_list = STRING_LIST_INIT_DUP;
struct strbuf buf = STRBUF_INIT; struct strbuf buf = STRBUF_INIT;
int ret = 1; int ret = 1;
/* read both note blob objects into unique_lines */ /* read both note blob objects into unique_lines */
if (string_list_add_note_lines(&sort_uniq_list, cur_sha1)) if (string_list_add_note_lines(&sort_uniq_list, cur_oid))
goto out; goto out;
if (string_list_add_note_lines(&sort_uniq_list, new_sha1)) if (string_list_add_note_lines(&sort_uniq_list, new_oid))
goto out; goto out;
string_list_remove_empty_items(&sort_uniq_list, 0); string_list_remove_empty_items(&sort_uniq_list, 0);
string_list_sort(&sort_uniq_list); string_list_sort(&sort_uniq_list);
@ -905,7 +905,7 @@ int combine_notes_cat_sort_uniq(unsigned char *cur_sha1,
string_list_join_lines_helper, &buf)) string_list_join_lines_helper, &buf))
goto out; goto out;
ret = write_sha1_file(buf.buf, buf.len, blob_type, cur_sha1); ret = write_object_file(buf.buf, buf.len, blob_type, cur_oid);
out: out:
strbuf_release(&buf); strbuf_release(&buf);
@ -1123,11 +1123,12 @@ int for_each_note(struct notes_tree *t, int flags, each_note_fn fn,
return for_each_note_helper(t, t->root, 0, 0, flags, fn, cb_data); return for_each_note_helper(t, t->root, 0, 0, flags, fn, cb_data);
} }
int write_notes_tree(struct notes_tree *t, unsigned char *result) int write_notes_tree(struct notes_tree *t, struct object_id *result)
{ {
struct tree_write_stack root; struct tree_write_stack root;
struct write_each_note_data cb_data; struct write_each_note_data cb_data;
int ret; int ret;
int flags;
if (!t) if (!t)
t = &default_notes_tree; t = &default_notes_tree;
@ -1141,12 +1142,12 @@ int write_notes_tree(struct notes_tree *t, unsigned char *result)
cb_data.next_non_note = t->first_non_note; cb_data.next_non_note = t->first_non_note;
/* Write tree objects representing current notes tree */ /* Write tree objects representing current notes tree */
ret = for_each_note(t, FOR_EACH_NOTE_DONT_UNPACK_SUBTREES | flags = FOR_EACH_NOTE_DONT_UNPACK_SUBTREES |
FOR_EACH_NOTE_YIELD_SUBTREES, FOR_EACH_NOTE_YIELD_SUBTREES;
write_each_note, &cb_data) || ret = for_each_note(t, flags, write_each_note, &cb_data) ||
write_each_non_note_until(NULL, &cb_data) || write_each_non_note_until(NULL, &cb_data) ||
tree_write_stack_finish_subtree(&root) || tree_write_stack_finish_subtree(&root) ||
write_sha1_file(root.buf.buf, root.buf.len, tree_type, result); write_object_file(root.buf.buf, root.buf.len, tree_type, result);
strbuf_release(&root.buf); strbuf_release(&root.buf);
return ret; return ret;
} }

29
notes.h
Просмотреть файл

@ -9,27 +9,32 @@
* When adding a new note annotating the same object as an existing note, it is * When adding a new note annotating the same object as an existing note, it is
* up to the caller to decide how to combine the two notes. The decision is * up to the caller to decide how to combine the two notes. The decision is
* made by passing in a function of the following form. The function accepts * made by passing in a function of the following form. The function accepts
* two SHA1s -- of the existing note and the new note, respectively. The * two object_ids -- of the existing note and the new note, respectively. The
* function then combines the notes in whatever way it sees fit, and writes the * function then combines the notes in whatever way it sees fit, and writes the
* resulting SHA1 into the first SHA1 argument (cur_sha1). A non-zero return * resulting oid into the first argument (cur_oid). A non-zero return
* value indicates failure. * value indicates failure.
* *
* The two given SHA1s shall both be non-NULL and different from each other. * The two given object_ids shall both be non-NULL and different from each
* Either of them (but not both) may be == null_sha1, which indicates an * other. Either of them (but not both) may be == null_oid, which indicates an
* empty/non-existent note. If the resulting SHA1 (cur_sha1) is == null_sha1, * empty/non-existent note. If the resulting oid (cur_oid) is == null_oid,
* the note will be removed from the notes tree. * the note will be removed from the notes tree.
* *
* The default combine_notes function (you get this when passing NULL) is * The default combine_notes function (you get this when passing NULL) is
* combine_notes_concatenate(), which appends the contents of the new note to * combine_notes_concatenate(), which appends the contents of the new note to
* the contents of the existing note. * the contents of the existing note.
*/ */
typedef int (*combine_notes_fn)(unsigned char *cur_sha1, const unsigned char *new_sha1); typedef int (*combine_notes_fn)(struct object_id *cur_oid,
const struct object_id *new_oid);
/* Common notes combinators */ /* Common notes combinators */
int combine_notes_concatenate(unsigned char *cur_sha1, const unsigned char *new_sha1); int combine_notes_concatenate(struct object_id *cur_oid,
int combine_notes_overwrite(unsigned char *cur_sha1, const unsigned char *new_sha1); const struct object_id *new_oid);
int combine_notes_ignore(unsigned char *cur_sha1, const unsigned char *new_sha1); int combine_notes_overwrite(struct object_id *cur_oid,
int combine_notes_cat_sort_uniq(unsigned char *cur_sha1, const unsigned char *new_sha1); const struct object_id *new_oid);
int combine_notes_ignore(struct object_id *cur_oid,
const struct object_id *new_oid);
int combine_notes_cat_sort_uniq(struct object_id *cur_oid,
const struct object_id *new_oid);
/* /*
* Notes tree object * Notes tree object
@ -212,7 +217,7 @@ int for_each_note(struct notes_tree *t, int flags, each_note_fn fn,
* Write the given notes_tree structure to the object database * Write the given notes_tree structure to the object database
* *
* Creates a new tree object encapsulating the current state of the given * Creates a new tree object encapsulating the current state of the given
* notes_tree, and stores its SHA1 into the 'result' argument. * notes_tree, and stores its object id into the 'result' argument.
* *
* Returns zero on success, non-zero on failure. * Returns zero on success, non-zero on failure.
* *
@ -220,7 +225,7 @@ int for_each_note(struct notes_tree *t, int flags, each_note_fn fn,
* this function has returned zero. Please also remember to create a * this function has returned zero. Please also remember to create a
* corresponding commit object, and update the appropriate notes ref. * corresponding commit object, and update the appropriate notes ref.
*/ */
int write_notes_tree(struct notes_tree *t, unsigned char *result); int write_notes_tree(struct notes_tree *t, struct object_id *result);
/* Flags controlling the operation of prune */ /* Flags controlling the operation of prune */
#define NOTES_PRUNE_VERBOSE 1 #define NOTES_PRUNE_VERBOSE 1

Просмотреть файл

@ -631,10 +631,10 @@ static struct cache_entry *create_alias_ce(struct index_state *istate,
void set_object_name_for_intent_to_add_entry(struct cache_entry *ce) void set_object_name_for_intent_to_add_entry(struct cache_entry *ce)
{ {
unsigned char sha1[20]; struct object_id oid;
if (write_sha1_file("", 0, blob_type, sha1)) if (write_object_file("", 0, blob_type, &oid))
die("cannot create an empty blob in the object database"); die("cannot create an empty blob in the object database");
hashcpy(ce->oid.hash, sha1); oidcpy(&ce->oid, &oid);
} }
int add_to_index(struct index_state *istate, const char *path, struct stat *st, int flags) int add_to_index(struct index_state *istate, const char *path, struct stat *st, int flags)

Просмотреть файл

@ -1149,8 +1149,8 @@ static int try_to_commit(struct strbuf *msg, const char *author,
goto out; goto out;
} }
if (commit_tree_extended(msg->buf, msg->len, tree.hash, parents, if (commit_tree_extended(msg->buf, msg->len, &tree, parents,
oid->hash, author, opts->gpg_sign, extra)) { oid, author, opts->gpg_sign, extra)) {
res = error(_("failed to write commit object")); res = error(_("failed to write commit object"));
goto out; goto out;
} }

Просмотреть файл

@ -789,7 +789,7 @@ void *xmmap(void *start, size_t length,
int check_sha1_signature(const unsigned char *sha1, void *map, int check_sha1_signature(const unsigned char *sha1, void *map,
unsigned long size, const char *type) unsigned long size, const char *type)
{ {
unsigned char real_sha1[20]; struct object_id real_oid;
enum object_type obj_type; enum object_type obj_type;
struct git_istream *st; struct git_istream *st;
git_SHA_CTX c; git_SHA_CTX c;
@ -797,8 +797,8 @@ int check_sha1_signature(const unsigned char *sha1, void *map,
int hdrlen; int hdrlen;
if (map) { if (map) {
hash_sha1_file(map, size, type, real_sha1); hash_object_file(map, size, type, &real_oid);
return hashcmp(sha1, real_sha1) ? -1 : 0; return hashcmp(sha1, real_oid.hash) ? -1 : 0;
} }
st = open_istream(sha1, &obj_type, &size, NULL); st = open_istream(sha1, &obj_type, &size, NULL);
@ -823,9 +823,9 @@ int check_sha1_signature(const unsigned char *sha1, void *map,
break; break;
git_SHA1_Update(&c, buf, readlen); git_SHA1_Update(&c, buf, readlen);
} }
git_SHA1_Final(real_sha1, &c); git_SHA1_Final(real_oid.hash, &c);
close_istream(st); close_istream(st);
return hashcmp(sha1, real_sha1) ? -1 : 0; return hashcmp(sha1, real_oid.hash) ? -1 : 0;
} }
int git_open_cloexec(const char *name, int flags) int git_open_cloexec(const char *name, int flags)
@ -1336,13 +1336,13 @@ static void *read_object(const unsigned char *sha1, enum object_type *type,
return content; return content;
} }
int pretend_sha1_file(void *buf, unsigned long len, enum object_type type, int pretend_object_file(void *buf, unsigned long len, enum object_type type,
unsigned char *sha1) struct object_id *oid)
{ {
struct cached_object *co; struct cached_object *co;
hash_sha1_file(buf, len, typename(type), sha1); hash_object_file(buf, len, typename(type), oid);
if (has_sha1_file(sha1) || find_cached_object(sha1)) if (has_sha1_file(oid->hash) || find_cached_object(oid->hash))
return 0; return 0;
ALLOC_GROW(cached_objects, cached_object_nr + 1, cached_object_alloc); ALLOC_GROW(cached_objects, cached_object_nr + 1, cached_object_alloc);
co = &cached_objects[cached_object_nr++]; co = &cached_objects[cached_object_nr++];
@ -1350,7 +1350,7 @@ int pretend_sha1_file(void *buf, unsigned long len, enum object_type type,
co->type = type; co->type = type;
co->buf = xmalloc(len); co->buf = xmalloc(len);
memcpy(co->buf, buf, len); memcpy(co->buf, buf, len);
hashcpy(co->sha1, sha1); hashcpy(co->sha1, oid->hash);
return 0; return 0;
} }
@ -1443,9 +1443,9 @@ void *read_object_with_reference(const unsigned char *sha1,
} }
} }
static void write_sha1_file_prepare(const void *buf, unsigned long len, static void write_object_file_prepare(const void *buf, unsigned long len,
const char *type, unsigned char *sha1, const char *type, struct object_id *oid,
char *hdr, int *hdrlen) char *hdr, int *hdrlen)
{ {
git_SHA_CTX c; git_SHA_CTX c;
@ -1456,7 +1456,7 @@ static void write_sha1_file_prepare(const void *buf, unsigned long len,
git_SHA1_Init(&c); git_SHA1_Init(&c);
git_SHA1_Update(&c, hdr, *hdrlen); git_SHA1_Update(&c, hdr, *hdrlen);
git_SHA1_Update(&c, buf, len); git_SHA1_Update(&c, buf, len);
git_SHA1_Final(sha1, &c); git_SHA1_Final(oid->hash, &c);
} }
/* /*
@ -1509,12 +1509,12 @@ static int write_buffer(int fd, const void *buf, size_t len)
return 0; return 0;
} }
int hash_sha1_file(const void *buf, unsigned long len, const char *type, int hash_object_file(const void *buf, unsigned long len, const char *type,
unsigned char *sha1) struct object_id *oid)
{ {
char hdr[32]; char hdr[32];
int hdrlen = sizeof(hdr); int hdrlen = sizeof(hdr);
write_sha1_file_prepare(buf, len, type, sha1, hdr, &hdrlen); write_object_file_prepare(buf, len, type, oid, hdr, &hdrlen);
return 0; return 0;
} }
@ -1572,19 +1572,20 @@ static int create_tmpfile(struct strbuf *tmp, const char *filename)
return fd; return fd;
} }
static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen, static int write_loose_object(const struct object_id *oid, char *hdr,
const void *buf, unsigned long len, time_t mtime) int hdrlen, const void *buf, unsigned long len,
time_t mtime)
{ {
int fd, ret; int fd, ret;
unsigned char compressed[4096]; unsigned char compressed[4096];
git_zstream stream; git_zstream stream;
git_SHA_CTX c; git_SHA_CTX c;
unsigned char parano_sha1[20]; struct object_id parano_oid;
static struct strbuf tmp_file = STRBUF_INIT; static struct strbuf tmp_file = STRBUF_INIT;
static struct strbuf filename = STRBUF_INIT; static struct strbuf filename = STRBUF_INIT;
strbuf_reset(&filename); strbuf_reset(&filename);
sha1_file_name(&filename, sha1); sha1_file_name(&filename, oid->hash);
fd = create_tmpfile(&tmp_file, filename.buf); fd = create_tmpfile(&tmp_file, filename.buf);
if (fd < 0) { if (fd < 0) {
@ -1621,13 +1622,16 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen,
} while (ret == Z_OK); } while (ret == Z_OK);
if (ret != Z_STREAM_END) if (ret != Z_STREAM_END)
die("unable to deflate new object %s (%d)", sha1_to_hex(sha1), ret); die("unable to deflate new object %s (%d)", oid_to_hex(oid),
ret);
ret = git_deflate_end_gently(&stream); ret = git_deflate_end_gently(&stream);
if (ret != Z_OK) if (ret != Z_OK)
die("deflateEnd on object %s failed (%d)", sha1_to_hex(sha1), ret); die("deflateEnd on object %s failed (%d)", oid_to_hex(oid),
git_SHA1_Final(parano_sha1, &c); ret);
if (hashcmp(sha1, parano_sha1) != 0) git_SHA1_Final(parano_oid.hash, &c);
die("confused by unstable object source data for %s", sha1_to_hex(sha1)); if (oidcmp(oid, &parano_oid) != 0)
die("confused by unstable object source data for %s",
oid_to_hex(oid));
close_sha1_file(fd); close_sha1_file(fd);
@ -1660,7 +1664,8 @@ static int freshen_packed_object(const unsigned char *sha1)
return 1; return 1;
} }
int write_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *sha1) int write_object_file(const void *buf, unsigned long len, const char *type,
struct object_id *oid)
{ {
char hdr[32]; char hdr[32];
int hdrlen = sizeof(hdr); int hdrlen = sizeof(hdr);
@ -1668,14 +1673,15 @@ int write_sha1_file(const void *buf, unsigned long len, const char *type, unsign
/* Normally if we have it in the pack then we do not bother writing /* Normally if we have it in the pack then we do not bother writing
* it out into .git/objects/??/?{38} file. * it out into .git/objects/??/?{38} file.
*/ */
write_sha1_file_prepare(buf, len, type, sha1, hdr, &hdrlen); write_object_file_prepare(buf, len, type, oid, hdr, &hdrlen);
if (freshen_packed_object(sha1) || freshen_loose_object(sha1)) if (freshen_packed_object(oid->hash) || freshen_loose_object(oid->hash))
return 0; return 0;
return write_loose_object(sha1, hdr, hdrlen, buf, len, 0); return write_loose_object(oid, hdr, hdrlen, buf, len, 0);
} }
int hash_sha1_file_literally(const void *buf, unsigned long len, const char *type, int hash_object_file_literally(const void *buf, unsigned long len,
struct object_id *oid, unsigned flags) const char *type, struct object_id *oid,
unsigned flags)
{ {
char *header; char *header;
int hdrlen, status = 0; int hdrlen, status = 0;
@ -1683,20 +1689,20 @@ int hash_sha1_file_literally(const void *buf, unsigned long len, const char *typ
/* type string, SP, %lu of the length plus NUL must fit this */ /* type string, SP, %lu of the length plus NUL must fit this */
hdrlen = strlen(type) + 32; hdrlen = strlen(type) + 32;
header = xmalloc(hdrlen); header = xmalloc(hdrlen);
write_sha1_file_prepare(buf, len, type, oid->hash, header, &hdrlen); write_object_file_prepare(buf, len, type, oid, header, &hdrlen);
if (!(flags & HASH_WRITE_OBJECT)) if (!(flags & HASH_WRITE_OBJECT))
goto cleanup; goto cleanup;
if (freshen_packed_object(oid->hash) || freshen_loose_object(oid->hash)) if (freshen_packed_object(oid->hash) || freshen_loose_object(oid->hash))
goto cleanup; goto cleanup;
status = write_loose_object(oid->hash, header, hdrlen, buf, len, 0); status = write_loose_object(oid, header, hdrlen, buf, len, 0);
cleanup: cleanup:
free(header); free(header);
return status; return status;
} }
int force_object_loose(const unsigned char *sha1, time_t mtime) int force_object_loose(const struct object_id *oid, time_t mtime)
{ {
void *buf; void *buf;
unsigned long len; unsigned long len;
@ -1705,13 +1711,13 @@ int force_object_loose(const unsigned char *sha1, time_t mtime)
int hdrlen; int hdrlen;
int ret; int ret;
if (has_loose_object(sha1)) if (has_loose_object(oid->hash))
return 0; return 0;
buf = read_object(sha1, &type, &len); buf = read_object(oid->hash, &type, &len);
if (!buf) if (!buf)
return error("cannot read sha1_file for %s", sha1_to_hex(sha1)); return error("cannot read sha1_file for %s", oid_to_hex(oid));
hdrlen = xsnprintf(hdr, sizeof(hdr), "%s %lu", typename(type), len) + 1; hdrlen = xsnprintf(hdr, sizeof(hdr), "%s %lu", typename(type), len) + 1;
ret = write_loose_object(sha1, hdr, hdrlen, buf, len, mtime); ret = write_loose_object(oid, hdr, hdrlen, buf, len, mtime);
free(buf); free(buf);
return ret; return ret;
@ -1794,9 +1800,9 @@ static int index_mem(struct object_id *oid, void *buf, size_t size,
} }
if (write_object) if (write_object)
ret = write_sha1_file(buf, size, typename(type), oid->hash); ret = write_object_file(buf, size, typename(type), oid);
else else
ret = hash_sha1_file(buf, size, typename(type), oid->hash); ret = hash_object_file(buf, size, typename(type), oid);
if (re_allocated) if (re_allocated)
free(buf); free(buf);
return ret; return ret;
@ -1816,11 +1822,11 @@ static int index_stream_convert_blob(struct object_id *oid, int fd,
get_conv_flags(flags)); get_conv_flags(flags));
if (write_object) if (write_object)
ret = write_sha1_file(sbuf.buf, sbuf.len, typename(OBJ_BLOB), ret = write_object_file(sbuf.buf, sbuf.len, typename(OBJ_BLOB),
oid->hash); oid);
else else
ret = hash_sha1_file(sbuf.buf, sbuf.len, typename(OBJ_BLOB), ret = hash_object_file(sbuf.buf, sbuf.len, typename(OBJ_BLOB),
oid->hash); oid);
strbuf_release(&sbuf); strbuf_release(&sbuf);
return ret; return ret;
} }
@ -1934,8 +1940,8 @@ int index_path(struct object_id *oid, const char *path, struct stat *st, unsigne
if (strbuf_readlink(&sb, path, st->st_size)) if (strbuf_readlink(&sb, path, st->st_size))
return error_errno("readlink(\"%s\")", path); return error_errno("readlink(\"%s\")", path);
if (!(flags & HASH_WRITE_OBJECT)) if (!(flags & HASH_WRITE_OBJECT))
hash_sha1_file(sb.buf, sb.len, blob_type, oid->hash); hash_object_file(sb.buf, sb.len, blob_type, oid);
else if (write_sha1_file(sb.buf, sb.len, blob_type, oid->hash)) else if (write_object_file(sb.buf, sb.len, blob_type, oid))
rc = error("%s: failed to insert into database", path); rc = error("%s: failed to insert into database", path);
strbuf_release(&sb); strbuf_release(&sb);
break; break;

Просмотреть файл

@ -54,8 +54,8 @@ int cmd_main(int ac, const char **av)
printf("no untracked cache\n"); printf("no untracked cache\n");
return 0; return 0;
} }
printf("info/exclude %s\n", sha1_to_hex(uc->ss_info_exclude.sha1)); printf("info/exclude %s\n", oid_to_hex(&uc->ss_info_exclude.oid));
printf("core.excludesfile %s\n", sha1_to_hex(uc->ss_excludes_file.sha1)); printf("core.excludesfile %s\n", oid_to_hex(&uc->ss_excludes_file.oid));
printf("exclude_per_dir %s\n", uc->exclude_per_dir); printf("exclude_per_dir %s\n", uc->exclude_per_dir);
printf("flags %08x\n", uc->dir_flags); printf("flags %08x\n", uc->dir_flags);
if (uc->root) if (uc->root)