Browse Source

Convert commit_tree() to take strbuf as message

There wan't a way for commit_tree() to notice if the message the caller
prepared contained a NUL byte, as it did not take the length of the
message as a parameter. Use a pointer to a strbuf instead, so that we can
either choose to allow low-level plumbing commands to make commits that
contain NUL byte in its message, or forbid NUL everywhere by adding the
check in commit_tree(), in later patches.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Nguyễn Thái Ngọc Duy 13 years ago committed by Junio C Hamano
parent
commit
13f8b72d8c
  1. 2
      builtin/commit-tree.c
  2. 2
      builtin/commit.c
  3. 4
      builtin/merge.c
  4. 4
      builtin/notes.c
  5. 4
      commit.c
  6. 2
      commit.h
  7. 5
      notes-cache.c
  8. 10
      notes-merge.c
  9. 2
      notes-merge.h

2
builtin/commit-tree.c

@ -56,7 +56,7 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
if (strbuf_read(&buffer, 0, 0) < 0) if (strbuf_read(&buffer, 0, 0) < 0)
die_errno("git commit-tree: failed to read"); die_errno("git commit-tree: failed to read");


if (commit_tree(buffer.buf, tree_sha1, parents, commit_sha1, NULL)) { if (commit_tree(&buffer, tree_sha1, parents, commit_sha1, NULL)) {
strbuf_release(&buffer); strbuf_release(&buffer);
return 1; return 1;
} }

2
builtin/commit.c

@ -1483,7 +1483,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
exit(1); exit(1);
} }


if (commit_tree(sb.buf, active_cache_tree->sha1, parents, sha1, if (commit_tree(&sb, active_cache_tree->sha1, parents, sha1,
author_ident.buf)) { author_ident.buf)) {
rollback_index_files(); rollback_index_files();
die(_("failed to write commit object")); die(_("failed to write commit object"));

4
builtin/merge.c

@ -913,7 +913,7 @@ static int merge_trivial(struct commit *head)
parent->next->item = remoteheads->item; parent->next->item = remoteheads->item;
parent->next->next = NULL; parent->next->next = NULL;
prepare_to_commit(); prepare_to_commit();
if (commit_tree(merge_msg.buf, result_tree, parent, result_commit, NULL)) if (commit_tree(&merge_msg, result_tree, parent, result_commit, NULL))
die(_("failed to write commit object")); die(_("failed to write commit object"));
finish(head, result_commit, "In-index merge"); finish(head, result_commit, "In-index merge");
drop_save(); drop_save();
@ -945,7 +945,7 @@ static int finish_automerge(struct commit *head,
strbuf_addch(&merge_msg, '\n'); strbuf_addch(&merge_msg, '\n');
prepare_to_commit(); prepare_to_commit();
free_commit_list(remoteheads); free_commit_list(remoteheads);
if (commit_tree(merge_msg.buf, result_tree, parents, result_commit, NULL)) if (commit_tree(&merge_msg, result_tree, parents, result_commit, NULL))
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, result_commit, buf.buf); finish(head, result_commit, buf.buf);

4
builtin/notes.c

@ -301,12 +301,12 @@ void commit_notes(struct notes_tree *t, const char *msg)
return; /* don't have to commit an unchanged tree */ return; /* don't have to commit an unchanged tree */


/* Prepare commit message and reflog message */ /* Prepare commit message and reflog message */
strbuf_addstr(&buf, "notes: "); /* commit message starts at index 7 */
strbuf_addstr(&buf, msg); strbuf_addstr(&buf, msg);
if (buf.buf[buf.len - 1] != '\n') if (buf.buf[buf.len - 1] != '\n')
strbuf_addch(&buf, '\n'); /* Make sure msg ends with newline */ strbuf_addch(&buf, '\n'); /* Make sure msg ends with newline */


create_notes_commit(t, NULL, buf.buf + 7, commit_sha1); create_notes_commit(t, NULL, &buf, commit_sha1);
strbuf_insert(&buf, 0, "notes: ", 7); /* commit message starts at index 7 */
update_ref(buf.buf, t->ref, commit_sha1, NULL, 0, DIE_ON_ERR); update_ref(buf.buf, t->ref, commit_sha1, NULL, 0, DIE_ON_ERR);


strbuf_release(&buf); strbuf_release(&buf);

4
commit.c

@ -845,7 +845,7 @@ static const char commit_utf8_warn[] =
"You may want to amend it after fixing the message, or set the config\n" "You may want to amend it after fixing the message, or set the config\n"
"variable i18n.commitencoding to the encoding your project uses.\n"; "variable i18n.commitencoding to the encoding your project uses.\n";


int commit_tree(const char *msg, unsigned char *tree, int commit_tree(const struct strbuf *msg, unsigned char *tree,
struct commit_list *parents, unsigned char *ret, struct commit_list *parents, unsigned char *ret,
const char *author) const char *author)
{ {
@ -884,7 +884,7 @@ int commit_tree(const char *msg, unsigned char *tree,
strbuf_addch(&buffer, '\n'); strbuf_addch(&buffer, '\n');


/* And add the comment */ /* And add the comment */
strbuf_addstr(&buffer, msg); strbuf_addbuf(&buffer, msg);


/* And check the encoding */ /* And check the encoding */
if (encoding_is_utf8 && !is_utf8(buffer.buf)) if (encoding_is_utf8 && !is_utf8(buffer.buf))

2
commit.h

@ -181,7 +181,7 @@ static inline int single_parent(struct commit *commit)


struct commit_list *reduce_heads(struct commit_list *heads); struct commit_list *reduce_heads(struct commit_list *heads);


extern int commit_tree(const char *msg, unsigned char *tree, extern int commit_tree(const struct strbuf *msg, unsigned char *tree,
struct commit_list *parents, unsigned char *ret, struct commit_list *parents, unsigned char *ret,
const char *author); const char *author);



5
notes-cache.c

@ -48,6 +48,7 @@ int notes_cache_write(struct notes_cache *c)
{ {
unsigned char tree_sha1[20]; unsigned char tree_sha1[20];
unsigned char commit_sha1[20]; unsigned char commit_sha1[20];
struct strbuf msg = STRBUF_INIT;


if (!c || !c->tree.initialized || !c->tree.ref || !*c->tree.ref) if (!c || !c->tree.initialized || !c->tree.ref || !*c->tree.ref)
return -1; return -1;
@ -56,7 +57,9 @@ int notes_cache_write(struct notes_cache *c)


if (write_notes_tree(&c->tree, tree_sha1)) if (write_notes_tree(&c->tree, tree_sha1))
return -1; return -1;
if (commit_tree(c->validity, tree_sha1, NULL, commit_sha1, NULL) < 0) strbuf_attach(&msg, c->validity,
strlen(c->validity), strlen(c->validity) + 1);
if (commit_tree(&msg, tree_sha1, NULL, commit_sha1, NULL) < 0)
return -1; return -1;
if (update_ref("update notes cache", c->tree.ref, commit_sha1, NULL, if (update_ref("update notes cache", c->tree.ref, commit_sha1, NULL,
0, QUIET_ON_ERR) < 0) 0, QUIET_ON_ERR) < 0)

10
notes-merge.c

@ -530,7 +530,7 @@ static int merge_from_diffs(struct notes_merge_options *o,
} }


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, unsigned char *result_sha1) const struct strbuf *msg, unsigned char *result_sha1)
{ {
unsigned char tree_sha1[20]; unsigned char tree_sha1[20];


@ -668,7 +668,7 @@ 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, o->commit_msg.buf, create_notes_commit(local_tree, parents, &o->commit_msg,
result_sha1); result_sha1);
} }


@ -695,7 +695,8 @@ int notes_merge_commit(struct notes_merge_options *o,
struct dir_struct dir; struct dir_struct dir;
char *path = xstrdup(git_path(NOTES_MERGE_WORKTREE "/")); char *path = xstrdup(git_path(NOTES_MERGE_WORKTREE "/"));
int path_len = strlen(path), i; int path_len = strlen(path), i;
const char *msg = strstr(partial_commit->buffer, "\n\n"); char *msg = strstr(partial_commit->buffer, "\n\n");
struct strbuf sb_msg = STRBUF_INIT;


if (o->verbosity >= 3) if (o->verbosity >= 3)
printf("Committing notes in notes merge worktree at %.*s\n", printf("Committing notes in notes merge worktree at %.*s\n",
@ -733,7 +734,8 @@ int notes_merge_commit(struct notes_merge_options *o,
sha1_to_hex(obj_sha1), sha1_to_hex(blob_sha1)); sha1_to_hex(obj_sha1), sha1_to_hex(blob_sha1));
} }


create_notes_commit(partial_tree, partial_commit->parents, msg, strbuf_attach(&sb_msg, msg, strlen(msg), strlen(msg) + 1);
create_notes_commit(partial_tree, partial_commit->parents, &sb_msg,
result_sha1); result_sha1);
if (o->verbosity >= 4) if (o->verbosity >= 4)
printf("Finalized notes merge commit: %s\n", printf("Finalized notes merge commit: %s\n",

2
notes-merge.h

@ -37,7 +37,7 @@ void init_notes_merge_options(struct notes_merge_options *o);
* 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, unsigned char *result_sha1); const struct strbuf *msg, unsigned char *result_sha1);


/* /*
* Merge notes from o->remote_ref into o->local_ref * Merge notes from o->remote_ref into o->local_ref

Loading…
Cancel
Save