This is not used anywhere yet. But the goal is to compare quickly if a
.gitignore file has changed when one has SHA-1 of the old .gitignore.
---
 dir.c | 51 ++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 44 insertions(+), 7 deletions(-)

diff --git a/dir.c b/dir.c
index c081754..e2edeca 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,
+                                               unsigned char *sha1)
 {
        int pos, len;
        unsigned long sz;
@@ -485,6 +486,8 @@ static void *read_skip_worktree_file_from_index(const char 
*path, size_t *size)
                return NULL;
        }
        *size = xsize_t(sz);
+       if (sha1)
+               hashcpy(sha1, active_cache[pos]->sha1);
        return data;
 }
 
@@ -525,11 +528,14 @@ static void trim_trailing_spaces(char *buf)
                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)
+static int add_excludes(const char *fname,
+                       const char *base,
+                       int baselen,
+                       struct exclude_list *el,
+                       int check_index,
+                       unsigned char *sha1,
+                       struct stat_data *ref_stat,
+                       const unsigned char *ref_sha1)
 {
        struct stat st;
        int fd, i, lineno = 1;
@@ -543,9 +549,13 @@ int add_excludes_from_file_to_list(const char *fname,
                if (0 <= fd)
                        close(fd);
                if (!check_index ||
-                   (buf = read_skip_worktree_file_from_index(fname, &size)) == 
NULL)
+                   (buf = read_skip_worktree_file_from_index(fname, &size, 
sha1)) == NULL)
                        return -1;
+               if (ref_stat)
+                       memset(ref_stat, 0, sizeof(*ref_stat));
                if (size == 0) {
+                       if (sha1)
+                               hashcpy(sha1, EMPTY_BLOB_SHA1_BIN);
                        free(buf);
                        return 0;
                }
@@ -556,6 +566,10 @@ int add_excludes_from_file_to_list(const char *fname,
        } else {
                size = xsize_t(st.st_size);
                if (size == 0) {
+                       if (ref_stat)
+                               fill_stat_data(ref_stat, &st);
+                       if (sha1)
+                               hashcpy(sha1, EMPTY_BLOB_SHA1_BIN);
                        close(fd);
                        return 0;
                }
@@ -567,6 +581,21 @@ int add_excludes_from_file_to_list(const char *fname,
                }
                buf[size++] = '\n';
                close(fd);
+               if (sha1) {
+                       int pos;
+                       if (!ref_stat &&
+                           (pos = cache_name_pos(fname, strlen(fname))) >= 0 &&
+                           !ce_stage(active_cache[pos]) &&
+                           ce_uptodate(active_cache[pos]))
+                               hashcpy(sha1, active_cache[pos]->sha1);
+                       else if (ref_stat && !match_stat_data(ref_stat, &st)) {
+                               if (ref_sha1 != sha1) /* support ref_sha1 == 
sha1 */
+                                       hashcpy(sha1, ref_sha1);
+                       } else
+                               hash_sha1_file(buf, size, "blob", sha1);
+               }
+               if (ref_stat)
+                       fill_stat_data(ref_stat, &st);
        }
 
        el->filebuf = buf;
@@ -585,6 +614,14 @@ 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, NULL, NULL);
+}
+
+
 struct exclude_list *add_exclude_list(struct dir_struct *dir,
                                      int group_type, const char *src)
 {
-- 
1.9.1.346.ga2b5940

--
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