Skip to content

Commit

Permalink
diff: modify output_prefix function pointer
Browse files Browse the repository at this point in the history
The uses of the output_prefix function pointer in the diff_options
struct is currently difficult to work with by returning a pointer to a
strbuf. There is only one use that cares about the length of the string,
which appears to be the only justification of the return type.

We already noticed confusing memory issues around this return type, so
use a const char * return type to make it clear that the caller does not
own this string buffer.

Signed-off-by: Jeff King <[email protected]>
Signed-off-by: Derrick Stolee <[email protected]>
  • Loading branch information
peff authored and dscho committed Oct 9, 2024
1 parent 569863b commit 85d5d43
Show file tree
Hide file tree
Showing 6 changed files with 12 additions and 14 deletions.
4 changes: 2 additions & 2 deletions diff-lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -701,7 +701,7 @@ int index_differs_from(struct repository *r,
return (has_changes != 0);
}

static struct strbuf *idiff_prefix_cb(struct diff_options *opt UNUSED, void *data)
static const char *idiff_prefix_cb(struct diff_options *opt UNUSED, void *data)
{
return data;
}
Expand All @@ -716,7 +716,7 @@ void show_interdiff(const struct object_id *oid1, const struct object_id *oid2,
opts.output_format = DIFF_FORMAT_PATCH;
opts.output_prefix = idiff_prefix_cb;
strbuf_addchars(&prefix, ' ', indent);
opts.output_prefix_data = &prefix;
opts.output_prefix_data = prefix.buf;
diff_setup_done(&opts);

diff_tree_oid(oid1, oid2, "", &opts);
Expand Down
8 changes: 3 additions & 5 deletions diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -2317,12 +2317,10 @@ const char *diff_get_color(int diff_use_color, enum color_diff ix)

const char *diff_line_prefix(struct diff_options *opt)
{
struct strbuf *msgbuf;
if (!opt->output_prefix)
return "";
if (opt->output_prefix)
return opt->output_prefix(opt, opt->output_prefix_data);

msgbuf = opt->output_prefix(opt, opt->output_prefix_data);
return msgbuf->buf;
return "";
}

static unsigned long sane_truncate_line(char *line, unsigned long len)
Expand Down
2 changes: 1 addition & 1 deletion diff.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ typedef void (*add_remove_fn_t)(struct diff_options *options,
typedef void (*diff_format_fn_t)(struct diff_queue_struct *q,
struct diff_options *options, void *data);

typedef struct strbuf *(*diff_prefix_fn_t)(struct diff_options *opt, void *data);
typedef const char *(*diff_prefix_fn_t)(struct diff_options *opt, void *data);

#define DIFF_FORMAT_RAW 0x0001
#define DIFF_FORMAT_DIFFSTAT 0x0002
Expand Down
4 changes: 2 additions & 2 deletions graph.c
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ struct git_graph {
unsigned short default_column_color;
};

static struct strbuf *diff_output_prefix_callback(struct diff_options *opt, void *data)
static const char *diff_output_prefix_callback(struct diff_options *opt, void *data)
{
struct git_graph *graph = data;
static struct strbuf msgbuf = STRBUF_INIT;
Expand All @@ -327,7 +327,7 @@ static struct strbuf *diff_output_prefix_callback(struct diff_options *opt, void
opt->line_prefix_length);
if (graph)
graph_padding_line(graph, &msgbuf);
return &msgbuf;
return msgbuf.buf;
}

static const struct diff_options *default_diffopt;
Expand Down
4 changes: 2 additions & 2 deletions log-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -923,10 +923,10 @@ int log_tree_diff_flush(struct rev_info *opt)
*/
int pch = DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_PATCH;
if (opt->diffopt.output_prefix) {
struct strbuf *msg = NULL;
const char *msg;
msg = opt->diffopt.output_prefix(&opt->diffopt,
opt->diffopt.output_prefix_data);
fwrite(msg->buf, msg->len, 1, opt->diffopt.file);
fwrite(msg, strlen(msg), 1, opt->diffopt.file);
}

/*
Expand Down
4 changes: 2 additions & 2 deletions range-diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -480,7 +480,7 @@ static void patch_diff(const char *a, const char *b,
diff_flush(diffopt);
}

static struct strbuf *output_prefix_cb(struct diff_options *opt UNUSED, void *data)
static const char *output_prefix_cb(struct diff_options *opt UNUSED, void *data)
{
return data;
}
Expand Down Expand Up @@ -508,7 +508,7 @@ static void output(struct string_list *a, struct string_list *b,
opts.flags.suppress_hunk_header_line_count = 1;
opts.output_prefix = output_prefix_cb;
strbuf_addstr(&indent, " ");
opts.output_prefix_data = &indent;
opts.output_prefix_data = indent.buf;
diff_setup_done(&opts);

/*
Expand Down

0 comments on commit 85d5d43

Please sign in to comment.