"Daniel Ferreira via GitGitGadget" <gitgitgadget@xxxxxxxxx> writes: > From: Daniel Ferreira <bnmvco@xxxxxxxxx> > > Make the diffstat interface (namely, the diffstat_t struct and > compute_diffstat) no longer be internal to diff.c and allow it to be used > by other parts of git. > > This is helpful for code that may want to easily extract information > from files using the diff machinery, while flushing it differently from > how the show_* functions used by diff_flush() do it. One example is the > builtin implementation of git-add--interactive's status. > > Signed-off-by: Daniel Ferreira <bnmvco@xxxxxxxxx> > Signed-off-by: Slavica Đukić <slawica92@xxxxxxxxxxx> > Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> > --- > diff.c | 39 ++++++++++++++++----------------------- > diff.h | 20 ++++++++++++++++++++ > 2 files changed, 36 insertions(+), 23 deletions(-) Looks good. The diffstat API seems to be quite well isolated to allow this with minimum (eh, rather no) changes. Thanks. > > diff --git a/diff.c b/diff.c > index afe4400a60..5703a9b78f 100644 > --- a/diff.c > +++ b/diff.c > @@ -2495,22 +2495,6 @@ static void pprint_rename(struct strbuf *name, const char *a, const char *b) > } > } > > -struct diffstat_t { > - int nr; > - int alloc; > - struct diffstat_file { > - char *from_name; > - char *name; > - char *print_name; > - const char *comments; > - unsigned is_unmerged:1; > - unsigned is_binary:1; > - unsigned is_renamed:1; > - unsigned is_interesting:1; > - uintmax_t added, deleted; > - } **files; > -}; > - > static struct diffstat_file *diffstat_add(struct diffstat_t *diffstat, > const char *name_a, > const char *name_b) > @@ -3157,7 +3141,7 @@ static void show_dirstat_by_line(struct diffstat_t *data, struct diff_options *o > gather_dirstat(options, &dir, changed, "", 0); > } > > -static void free_diffstat_info(struct diffstat_t *diffstat) > +void free_diffstat_info(struct diffstat_t *diffstat) > { > int i; > for (i = 0; i < diffstat->nr; i++) { > @@ -6283,12 +6267,7 @@ void diff_flush(struct diff_options *options) > dirstat_by_line) { > struct diffstat_t diffstat; > > - memset(&diffstat, 0, sizeof(struct diffstat_t)); > - for (i = 0; i < q->nr; i++) { > - struct diff_filepair *p = q->queue[i]; > - if (check_pair_status(p)) > - diff_flush_stat(p, options, &diffstat); > - } > + compute_diffstat(options, &diffstat, q); > if (output_format & DIFF_FORMAT_NUMSTAT) > show_numstat(&diffstat, options); > if (output_format & DIFF_FORMAT_DIFFSTAT) > @@ -6621,6 +6600,20 @@ static int is_submodule_ignored(const char *path, struct diff_options *options) > return ignored; > } > > +void compute_diffstat(struct diff_options *options, > + struct diffstat_t *diffstat, > + struct diff_queue_struct *q) > +{ > + int i; > + > + memset(diffstat, 0, sizeof(struct diffstat_t)); > + for (i = 0; i < q->nr; i++) { > + struct diff_filepair *p = q->queue[i]; > + if (check_pair_status(p)) > + diff_flush_stat(p, options, diffstat); > + } > +} > + > void diff_addremove(struct diff_options *options, > int addremove, unsigned mode, > const struct object_id *oid, > diff --git a/diff.h b/diff.h > index 7f8f024feb..d986ddc3b5 100644 > --- a/diff.h > +++ b/diff.h > @@ -245,6 +245,22 @@ void diff_emit_submodule_error(struct diff_options *o, const char *err); > void diff_emit_submodule_pipethrough(struct diff_options *o, > const char *line, int len); > > +struct diffstat_t { > + int nr; > + int alloc; > + struct diffstat_file { > + char *from_name; > + char *name; > + char *print_name; > + const char *comments; > + unsigned is_unmerged:1; > + unsigned is_binary:1; > + unsigned is_renamed:1; > + unsigned is_interesting:1; > + uintmax_t added, deleted; > + } **files; > +}; > + > enum color_diff { > DIFF_RESET = 0, > DIFF_CONTEXT = 1, > @@ -334,6 +350,10 @@ void diff_change(struct diff_options *, > > struct diff_filepair *diff_unmerge(struct diff_options *, const char *path); > > +void compute_diffstat(struct diff_options *options, struct diffstat_t *diffstat, > + struct diff_queue_struct *q); > +void free_diffstat_info(struct diffstat_t *diffstat); > + > #define DIFF_SETUP_REVERSE 1 > #define DIFF_SETUP_USE_SIZE_CACHE 4