From 13f8b72d8c8e24215a3dd7771592b30083f1c740 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nguy=E1=BB=85n=20Th=C3=A1i=20Ng=E1=BB=8Dc=20Duy?= Date: Thu, 15 Dec 2011 20:47:22 +0700 Subject: [PATCH] Convert commit_tree() to take strbuf as message MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Junio C Hamano --- builtin/commit-tree.c | 2 +- builtin/commit.c | 2 +- builtin/merge.c | 4 ++-- builtin/notes.c | 4 ++-- commit.c | 4 ++-- commit.h | 2 +- notes-cache.c | 5 ++++- notes-merge.c | 10 ++++++---- notes-merge.h | 2 +- 9 files changed, 20 insertions(+), 15 deletions(-) diff --git a/builtin/commit-tree.c b/builtin/commit-tree.c index d083795e26..0895861457 100644 --- a/builtin/commit-tree.c +++ b/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) 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; } diff --git a/builtin/commit.c b/builtin/commit.c index 8f2bebecf3..849151e951 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -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")); diff --git a/builtin/merge.c b/builtin/merge.c index 27576c0f7f..e066bf1b0b 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -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); diff --git a/builtin/notes.c b/builtin/notes.c index f8e437db01..5e32548cdd 100644 --- a/builtin/notes.c +++ b/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 */ /* 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); diff --git a/commit.c b/commit.c index 73b7e00292..0a214a649e 100644 --- a/commit.c +++ b/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)) diff --git a/commit.h b/commit.h index 009b113e5b..5cf46b2e0a 100644 --- a/commit.h +++ b/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); diff --git a/notes-cache.c b/notes-cache.c index 4c8984ede1..bea013eeae 100644 --- a/notes-cache.c +++ b/notes-cache.c @@ -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) diff --git a/notes-merge.c b/notes-merge.c index ce10aacf29..b5a36ac158 100644 --- a/notes-merge.c +++ b/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, - 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", diff --git a/notes-merge.h b/notes-merge.h index 168a6724cd..0c11b173a1 100644 --- a/notes-merge.h +++ b/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. */ 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 -- 2.11.4.GIT