summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2017-04-26 23:27:17 -0400
committerJunio C Hamano <gitster@pobox.com>2017-04-27 14:38:55 +0900
commit2e2bbb9624e10537560c3ac45ff6820ff773b3d6 (patch)
tree71bd4bdda3292666974f4c7d456003e3e7b5e735
parentf131db9e3166c528d3b0352b653eb0d9deca5a65 (diff)
downloadgit-2e2bbb9624e10537560c3ac45ff6820ff773b3d6.tar.gz
am: simplify allocations in get_commit_info()
After we call split_ident_line(), we have several begin/end pairs for various parts of the ident. We then copy each into a strbuf to create a single string, and then detach that string. We can instead skip the strbuf entirely and just duplicate the strings directly. This is shorter, and it makes it more obvious that we are not leaking the strbuf (we were not before, because every code path either died or hit a strbuf_detach). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin/am.c25
1 files changed, 10 insertions, 15 deletions
diff --git a/builtin/am.c b/builtin/am.c
index 8dfe8f84fa..17f394c825 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -1376,40 +1376,35 @@ static int get_mail_commit_oid(struct object_id *commit_id, const char *mail)
*/
static void get_commit_info(struct am_state *state, struct commit *commit)
{
- const char *buffer, *ident_line, *author_date, *msg;
+ const char *buffer, *ident_line, *msg;
size_t ident_len;
struct ident_split ident_split;
- struct strbuf sb = STRBUF_INIT;
buffer = logmsg_reencode(commit, NULL, get_commit_output_encoding());
ident_line = find_commit_header(buffer, "author", &ident_len);
- if (split_ident_line(&ident_split, ident_line, ident_len) < 0) {
- strbuf_add(&sb, ident_line, ident_len);
- die(_("invalid ident line: %s"), sb.buf);
- }
+ if (split_ident_line(&ident_split, ident_line, ident_len) < 0)
+ die(_("invalid ident line: %.*s"), (int)ident_len, ident_line);
assert(!state->author_name);
if (ident_split.name_begin) {
- strbuf_add(&sb, ident_split.name_begin,
- ident_split.name_end - ident_split.name_begin);
- state->author_name = strbuf_detach(&sb, NULL);
+ state->author_name =
+ xmemdupz(ident_split.name_begin,
+ ident_split.name_end - ident_split.name_begin);
} else
state->author_name = xstrdup("");
assert(!state->author_email);
if (ident_split.mail_begin) {
- strbuf_add(&sb, ident_split.mail_begin,
- ident_split.mail_end - ident_split.mail_begin);
- state->author_email = strbuf_detach(&sb, NULL);
+ state->author_email =
+ xmemdupz(ident_split.mail_begin,
+ ident_split.mail_end - ident_split.mail_begin);
} else
state->author_email = xstrdup("");
- author_date = show_ident_date(&ident_split, DATE_MODE(NORMAL));
- strbuf_addstr(&sb, author_date);
assert(!state->author_date);
- state->author_date = strbuf_detach(&sb, NULL);
+ state->author_date = xstrdup(show_ident_date(&ident_split, DATE_MODE(NORMAL)));
assert(!state->msg);
msg = strstr(buffer, "\n\n");