Nguyễn Thái Ngọc Duy  <pclo...@gmail.com> writes:

> This is not used anywhere yet. But the goal is to compare quickly if a
> .gitignore file has changed when we have the SHA-1 of both old (cached
> somewhere) and new (from index or a tree) versions.
>
> Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
> ---
>  dir.c | 50 +++++++++++++++++++++++++++++++++++++++++++-------
>  dir.h |  5 +++++
>  2 files changed, 48 insertions(+), 7 deletions(-)
>
> diff --git a/dir.c b/dir.c
> index bd274a7..33a35c1 100644
> --- a/dir.c
> +++ b/dir.c
> @@ -466,7 +466,8 @@ void add_exclude(const char *string, const char *base,
>       x->el = el;
>  }
>  
> -static void *read_skip_worktree_file_from_index(const char *path, size_t 
> *size)
> +static void *read_skip_worktree_file_from_index(const char *path, size_t 
> *size,
> +                                             struct sha1_stat *ss)
>  {
>       int pos, len;
>       unsigned long sz;
> @@ -485,6 +486,10 @@ static void *read_skip_worktree_file_from_index(const 
> char *path, size_t *size)
>               return NULL;
>       }
>       *size = xsize_t(sz);
> +     if (ss) {
> +             memset(&ss->stat, 0, sizeof(ss->stat));
> +             hashcpy(ss->sha1, active_cache[pos]->sha1);
> +     }
>       return data;
>  }
>  
> @@ -529,11 +534,18 @@ static void trim_trailing_spaces(char *buf)
>               *last_space = '\0';
>  }
>  
> -int add_excludes_from_file_to_list(const char *fname,
> -                                const char *base,
> -                                int baselen,
> -                                struct exclude_list *el,
> -                                int check_index)
> +/*
> + * Given a file with name "fname", read it (either from disk, or from
> + * the index if "check_index" is non-zero), parse it and store the
> + * exclude rules in "el".
> + *
> + * If "ss" is not NULL, compute SHA-1 of the exclude file and fill
> + * stat data from disk (only valid if add_excludes returns zero). If
> + * ss_valid is non-zero, "ss" must contain good value as input.
> + */

Hmm, do we want a separate parameter for that?  Wouldn't it be
sufficient and cleaner to pass is_null_sha1(ss->sha1[]), or
alternatively have an element ss->valid that is initialized to
false?

That is...

> @@ -571,6 +587,19 @@ int add_excludes_from_file_to_list(const char *fname,
>               }
>               buf[size++] = '\n';
>               close(fd);
> +             if (ss) {
> +                     int pos;
> +                     if (ss_valid && !match_stat_data(&ss->stat, &st))

s/ss_valid/ss->valid/;

> +                             ; /* no content change, ss->sha1 still good */
> +                     else if (check_index &&
> +                              (pos = cache_name_pos(fname, strlen(fname))) 
> >= 0 &&
> +                              !ce_stage(active_cache[pos]) &&
> +                              ce_uptodate(active_cache[pos]))
> +                             hashcpy(ss->sha1, active_cache[pos]->sha1);
> +                     else
> +                             hash_sha1_file(buf, size, "blob", ss->sha1);
> +                     fill_stat_data(&ss->stat, &st);

And toggle "ss->valid = 1"; here...

> @@ -589,6 +618,13 @@ int add_excludes_from_file_to_list(const char *fname,
>       return 0;
>  }
>  
> +int add_excludes_from_file_to_list(const char *fname, const char *base,
> +                                int baselen, struct exclude_list *el,
> +                                int check_index)
> +{
> +     return add_excludes(fname, base, baselen, el, check_index, NULL, 0);
> +}
> +
>  struct exclude_list *add_exclude_list(struct dir_struct *dir,
>                                     int group_type, const char *src)
>  {
> diff --git a/dir.h b/dir.h
> index 6c45e9d..032d197 100644
> --- a/dir.h
> +++ b/dir.h
> @@ -73,6 +73,11 @@ struct exclude_list_group {
>       struct exclude_list *el;
>  };
>  
> +struct sha1_stat {
> +     struct stat_data stat;
> +     unsigned char sha1[20];
> +};
> +
>  struct dir_struct {
>       int nr, alloc;
>       int ignored_nr, ignored_alloc;
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to