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>
This commit is contained in:
parent
6b3c4c0547
commit
13f8b72d8c
@ -56,7 +56,7 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
|
||||
if (strbuf_read(&buffer, 0, 0) < 0)
|
||||
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);
|
||||
return 1;
|
||||
}
|
||||
|
@ -1483,7 +1483,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
|
||||
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)) {
|
||||
rollback_index_files();
|
||||
die(_("failed to write commit object"));
|
||||
|
@ -913,7 +913,7 @@ static int merge_trivial(struct commit *head)
|
||||
parent->next->item = remoteheads->item;
|
||||
parent->next->next = NULL;
|
||||
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"));
|
||||
finish(head, result_commit, "In-index merge");
|
||||
drop_save();
|
||||
@ -945,7 +945,7 @@ static int finish_automerge(struct commit *head,
|
||||
strbuf_addch(&merge_msg, '\n');
|
||||
prepare_to_commit();
|
||||
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"));
|
||||
strbuf_addf(&buf, "Merge made by the '%s' strategy.", wt_strategy);
|
||||
finish(head, result_commit, buf.buf);
|
||||
|
@ -301,12 +301,12 @@ void commit_notes(struct notes_tree *t, const char *msg)
|
||||
return; /* don't have to commit an unchanged tree */
|
||||
|
||||
/* Prepare commit message and reflog message */
|
||||
strbuf_addstr(&buf, "notes: "); /* commit message starts at index 7 */
|
||||
strbuf_addstr(&buf, msg);
|
||||
if (buf.buf[buf.len - 1] != '\n')
|
||||
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);
|
||||
|
||||
strbuf_release(&buf);
|
||||
|
4
commit.c
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"
|
||||
"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,
|
||||
const char *author)
|
||||
{
|
||||
@ -884,7 +884,7 @@ int commit_tree(const char *msg, unsigned char *tree,
|
||||
strbuf_addch(&buffer, '\n');
|
||||
|
||||
/* And add the comment */
|
||||
strbuf_addstr(&buffer, msg);
|
||||
strbuf_addbuf(&buffer, msg);
|
||||
|
||||
/* And check the encoding */
|
||||
if (encoding_is_utf8 && !is_utf8(buffer.buf))
|
||||
|
2
commit.h
2
commit.h
@ -181,7 +181,7 @@ static inline int single_parent(struct commit *commit)
|
||||
|
||||
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,
|
||||
const char *author);
|
||||
|
||||
|
@ -48,6 +48,7 @@ int notes_cache_write(struct notes_cache *c)
|
||||
{
|
||||
unsigned char tree_sha1[20];
|
||||
unsigned char commit_sha1[20];
|
||||
struct strbuf msg = STRBUF_INIT;
|
||||
|
||||
if (!c || !c->tree.initialized || !c->tree.ref || !*c->tree.ref)
|
||||
return -1;
|
||||
@ -56,7 +57,9 @@ int notes_cache_write(struct notes_cache *c)
|
||||
|
||||
if (write_notes_tree(&c->tree, tree_sha1))
|
||||
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;
|
||||
if (update_ref("update notes cache", c->tree.ref, commit_sha1, NULL,
|
||||
0, QUIET_ON_ERR) < 0)
|
||||
|
@ -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,
|
||||
const char *msg, unsigned char *result_sha1)
|
||||
const struct strbuf *msg, unsigned char *result_sha1)
|
||||
{
|
||||
unsigned char tree_sha1[20];
|
||||
|
||||
@ -668,7 +668,7 @@ int notes_merge(struct notes_merge_options *o,
|
||||
struct commit_list *parents = NULL;
|
||||
commit_list_insert(remote, &parents); /* LIFO order */
|
||||
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);
|
||||
}
|
||||
|
||||
@ -695,7 +695,8 @@ int notes_merge_commit(struct notes_merge_options *o,
|
||||
struct dir_struct dir;
|
||||
char *path = xstrdup(git_path(NOTES_MERGE_WORKTREE "/"));
|
||||
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)
|
||||
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));
|
||||
}
|
||||
|
||||
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);
|
||||
if (o->verbosity >= 4)
|
||||
printf("Finalized notes merge commit: %s\n",
|
||||
|
@ -37,7 +37,7 @@ void init_notes_merge_options(struct notes_merge_options *o);
|
||||
* The resulting commit SHA1 is stored in result_sha1.
|
||||
*/
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user