Browse Source

convert logmsg_reencode to get_commit_buffer

Like the callsites in the previous commit, logmsg_reencode
already falls back to read_sha1_file when necessary.
However, I split its conversion out into its own commit
because it's a bit more complex.

We return either:

  1. The original commit->buffer

  2. A newly allocated buffer from read_sha1_file

  3. A reencoded buffer (based on either 1 or 2 above).

while trying to do as few extra reads/allocations as
possible. Callers currently free the result with
logmsg_free, but we can simplify this by pointing them
straight to unuse_commit_buffer. This is a slight layering
violation, in that we may be passing a buffer from (3).
However, since the end result is to free() anything except
(1), which is unlikely to change, and because this makes the
interface much simpler, it's a reasonable bending of the
rules.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Jeff King 11 years ago committed by Junio C Hamano
parent
commit
b66103c3ba
  1. 4
      builtin/blame.c
  2. 2
      builtin/reset.c
  3. 1
      commit.h
  4. 40
      pretty.c
  5. 2
      revision.c
  6. 2
      sequencer.c

4
builtin/blame.c

@ -1416,7 +1416,7 @@ static void get_commit_info(struct commit *commit, @@ -1416,7 +1416,7 @@ static void get_commit_info(struct commit *commit,
&ret->author_time, &ret->author_tz);

if (!detailed) {
logmsg_free(message, commit);
unuse_commit_buffer(commit, message);
return;
}

@ -1430,7 +1430,7 @@ static void get_commit_info(struct commit *commit, @@ -1430,7 +1430,7 @@ static void get_commit_info(struct commit *commit,
else
strbuf_addf(&ret->summary, "(%s)", sha1_to_hex(commit->object.sha1));

logmsg_free(message, commit);
unuse_commit_buffer(commit, message);
}

/*

2
builtin/reset.c

@ -109,7 +109,7 @@ static void print_new_head_line(struct commit *commit) @@ -109,7 +109,7 @@ static void print_new_head_line(struct commit *commit)
}
else
printf("\n");
logmsg_free(msg, commit);
unuse_commit_buffer(commit, msg);
}

static void update_index_from_diff(struct diff_queue_struct *q,

1
commit.h

@ -156,7 +156,6 @@ struct rev_info; /* in revision.h, it circularly uses enum cmit_fmt */ @@ -156,7 +156,6 @@ struct rev_info; /* in revision.h, it circularly uses enum cmit_fmt */
extern const char *logmsg_reencode(const struct commit *commit,
char **commit_encoding,
const char *output_encoding);
extern void logmsg_free(const char *msg, const struct commit *commit);
extern void get_commit_format(const char *arg, struct rev_info *);
extern const char *format_subject(struct strbuf *sb, const char *msg,
const char *line_separator);

40
pretty.c

@ -613,22 +613,9 @@ const char *logmsg_reencode(const struct commit *commit, @@ -613,22 +613,9 @@ const char *logmsg_reencode(const struct commit *commit,
static const char *utf8 = "UTF-8";
const char *use_encoding;
char *encoding;
char *msg = commit->buffer;
const char *msg = get_commit_buffer(commit);
char *out;

if (!msg) {
enum object_type type;
unsigned long size;

msg = read_sha1_file(commit->object.sha1, &type, &size);
if (!msg)
die("Cannot read commit object %s",
sha1_to_hex(commit->object.sha1));
if (type != OBJ_COMMIT)
die("Expected commit for '%s', got %s",
sha1_to_hex(commit->object.sha1), typename(type));
}

if (!output_encoding || !*output_encoding) {
if (commit_encoding)
*commit_encoding =
@ -652,12 +639,13 @@ const char *logmsg_reencode(const struct commit *commit, @@ -652,12 +639,13 @@ const char *logmsg_reencode(const struct commit *commit,
* Otherwise, we still want to munge the encoding header in the
* result, which will be done by modifying the buffer. If we
* are using a fresh copy, we can reuse it. But if we are using
* the cached copy from commit->buffer, we need to duplicate it
* to avoid munging commit->buffer.
* the cached copy from get_commit_buffer, we need to duplicate it
* to avoid munging the cached copy.
*/
out = msg;
if (out == commit->buffer)
out = xstrdup(out);
if (msg == get_cached_commit_buffer(commit))
out = xstrdup(msg);
else
out = (char *)msg;
}
else {
/*
@ -667,8 +655,8 @@ const char *logmsg_reencode(const struct commit *commit, @@ -667,8 +655,8 @@ const char *logmsg_reencode(const struct commit *commit,
* copy, we can free it.
*/
out = reencode_string(msg, output_encoding, use_encoding);
if (out && msg != commit->buffer)
free(msg);
if (out)
unuse_commit_buffer(commit, msg);
}

/*
@ -687,12 +675,6 @@ const char *logmsg_reencode(const struct commit *commit, @@ -687,12 +675,6 @@ const char *logmsg_reencode(const struct commit *commit,
return out ? out : msg;
}

void logmsg_free(const char *msg, const struct commit *commit)
{
if (msg != commit->buffer)
free((void *)msg);
}

static int mailmap_name(const char **email, size_t *email_len,
const char **name, size_t *name_len)
{
@ -1531,7 +1513,7 @@ void format_commit_message(const struct commit *commit, @@ -1531,7 +1513,7 @@ void format_commit_message(const struct commit *commit,
}

free(context.commit_encoding);
logmsg_free(context.message, commit);
unuse_commit_buffer(commit, context.message);
free(context.signature_check.gpg_output);
free(context.signature_check.signer);
}
@ -1767,7 +1749,7 @@ void pretty_print_commit(struct pretty_print_context *pp, @@ -1767,7 +1749,7 @@ void pretty_print_commit(struct pretty_print_context *pp,
if (pp->fmt == CMIT_FMT_EMAIL && sb->len <= beginning_of_body)
strbuf_addch(sb, '\n');

logmsg_free(reencoded, commit);
unuse_commit_buffer(commit, reencoded);
}

void pp_commit_easy(enum cmit_fmt fmt, const struct commit *commit,

2
revision.c

@ -2844,7 +2844,7 @@ static int commit_match(struct commit *commit, struct rev_info *opt) @@ -2844,7 +2844,7 @@ static int commit_match(struct commit *commit, struct rev_info *opt)
retval = grep_buffer(&opt->grep_filter,
(char *)message, strlen(message));
strbuf_release(&buf);
logmsg_free(message, commit);
unuse_commit_buffer(commit, message);
return retval;
}


2
sequencer.c

@ -154,7 +154,7 @@ static int get_message(struct commit *commit, struct commit_message *out) @@ -154,7 +154,7 @@ static int get_message(struct commit *commit, struct commit_message *out)
static void free_message(struct commit *commit, struct commit_message *msg)
{
free(msg->parent_label);
logmsg_free(msg->message, commit);
unuse_commit_buffer(commit, msg->message);
}

static void write_cherry_pick_head(struct commit *commit, const char *pseudoref)

Loading…
Cancel
Save