Re: [PATCH v5 2/9] diff: export diffstat interface
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Nov 8, 2019, 04:56 UTC
- Message-ID
- <xmqqd0e3nexw.fsf@gitster-ct.c.googlers.com>
- In-Reply-To
- <2fc8cc354690841cd8496d9a7660faf572580aef.1572869730.git.gitgitgadget@gmail.com>
"Daniel Ferreira via GitGitGadget" <gitgitgadget@gmail.com> writes:
Show 18 quoted lines
> From: Daniel Ferreira <bnmvco@gmail.com> > > 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@gmail.com> > Signed-off-by: Slavica Đukić <slawica92@hotmail.com> > Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> > --- > 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.
Show 109 quoted lines
>
> 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