diff-tree: don't print multiple headers for merges when silent.
[git.git] / read-cache.c
index da2adf4..b3eec84 100644 (file)
@@ -9,7 +9,27 @@
 struct cache_entry **active_cache = NULL;
 unsigned int active_nr = 0, active_alloc = 0, active_cache_changed = 0;
 
-int cache_match_stat(struct cache_entry *ce, struct stat *st)
+/*
+ * This only updates the "non-critical" parts of the directory
+ * cache, ie the parts that aren't tracked by GIT, and only used
+ * to validate the cache.
+ */
+void fill_stat_cache_info(struct cache_entry *ce, struct stat *st)
+{
+       ce->ce_ctime.sec = htonl(st->st_ctime);
+       ce->ce_mtime.sec = htonl(st->st_mtime);
+#ifdef NSEC
+       ce->ce_ctime.nsec = htonl(st->st_ctim.tv_nsec);
+       ce->ce_mtime.nsec = htonl(st->st_mtim.tv_nsec);
+#endif
+       ce->ce_dev = htonl(st->st_dev);
+       ce->ce_ino = htonl(st->st_ino);
+       ce->ce_uid = htonl(st->st_uid);
+       ce->ce_gid = htonl(st->st_gid);
+       ce->ce_size = htonl(st->st_size);
+}
+
+int ce_match_stat(struct cache_entry *ce, struct stat *st)
 {
        unsigned int changed = 0;
 
@@ -54,6 +74,25 @@ int cache_match_stat(struct cache_entry *ce, struct stat *st)
        return changed;
 }
 
+int base_name_compare(const char *name1, int len1, int mode1,
+                     const char *name2, int len2, int mode2)
+{
+       unsigned char c1, c2;
+       int len = len1 < len2 ? len1 : len2;
+       int cmp;
+
+       cmp = memcmp(name1, name2, len);
+       if (cmp)
+               return cmp;
+       c1 = name1[len];
+       c2 = name2[len];
+       if (!c1 && S_ISDIR(mode1))
+               c1 = '/';
+       if (!c2 && S_ISDIR(mode2))
+               c2 = '/';
+       return (c1 < c2) ? -1 : (c1 > c2) ? 1 : 0;
+}
+
 int cache_name_compare(const char *name1, int flags1, const char *name2, int flags2)
 {
        int len1 = flags1 & CE_NAMEMASK;
@@ -97,7 +136,7 @@ int cache_name_pos(const char *name, int namelen)
 }
 
 /* Remove entry, return true if there are more entries to go.. */
-int remove_entry_at(int pos)
+int remove_cache_entry_at(int pos)
 {
        active_cache_changed = 1;
        active_nr--;
@@ -113,11 +152,11 @@ int remove_file_from_cache(char *path)
        if (pos < 0)
                pos = -pos-1;
        while (pos < active_nr && !strcmp(active_cache[pos]->name, path))
-               remove_entry_at(pos);
+               remove_cache_entry_at(pos);
        return 0;
 }
 
-int same_name(struct cache_entry *a, struct cache_entry *b)
+int ce_same_name(struct cache_entry *a, struct cache_entry *b)
 {
        int len = ce_namelen(a);
        return ce_namelen(b) == len && !memcmp(a->name, b->name, len);
@@ -167,7 +206,7 @@ static int check_file_directory_conflict(const struct cache_entry *ce,
                                return -1;
                        }
                        fprintf(stderr, "removing file '%s' to replace it with a directory to create '%s'.\n", pathbuf, path);
-                       remove_entry_at(pos);
+                       remove_cache_entry_at(pos);
                        replaced = 1;
                }
                *ep = '/';  /* then restore it and go downwards */
@@ -215,7 +254,7 @@ static int check_file_directory_conflict(const struct cache_entry *ce,
                        if (!ok_to_replace)
                                return -1;
                        fprintf(stderr, "removing file '%s' under '%s' to be replaced with a file\n", other->name, path);
-                       remove_entry_at(pos);
+                       remove_cache_entry_at(pos);
                        replaced = 1;
                        continue; /* cycle without updating pos */
                }
@@ -244,9 +283,9 @@ int add_cache_entry(struct cache_entry *ce, int option)
         * will always replace all non-merged entries..
         */
        if (pos < active_nr && ce_stage(ce) == 0) {
-               while (same_name(active_cache[pos], ce)) {
+               while (ce_same_name(active_cache[pos], ce)) {
                        ok_to_add = 1;
-                       if (!remove_entry_at(pos))
+                       if (!remove_cache_entry_at(pos))
                                break;
                }
        }
@@ -344,7 +383,7 @@ unmap:
 }
 
 #define WRITE_BUFFER_SIZE 8192
-static char write_buffer[WRITE_BUFFER_SIZE];
+static unsigned char write_buffer[WRITE_BUFFER_SIZE];
 static unsigned long write_buffer_len;
 
 static int ce_write(SHA_CTX *context, int fd, void *data, unsigned int len)