Re: [PATCH v5 2/9] diff: export diffstat interface

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



"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




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux