[PATCH] Document --stdin, -m, -s, and -v flags to git-diff-tree
[git.git] / read-cache.c
index 2354e80..2a88d18 100644 (file)
@@ -13,6 +13,19 @@ int cache_match_stat(struct cache_entry *ce, struct stat *st)
 {
        unsigned int changed = 0;
 
+       switch (ntohl(ce->ce_mode) & S_IFMT) {
+       case S_IFREG:
+               changed |= !S_ISREG(st->st_mode) ? TYPE_CHANGED : 0;
+               /* We consider only the owner x bit to be relevant for "mode changes" */
+               if (0100 & (ntohl(ce->ce_mode) ^ st->st_mode))
+                       changed |= MODE_CHANGED;
+               break;
+       case S_IFLNK:
+               changed |= !S_ISLNK(st->st_mode) ? TYPE_CHANGED : 0;
+               break;
+       default:
+               die("internal error: ce_mode is %o", ntohl(ce->ce_mode));
+       }
        if (ce->ce_mtime.sec != htonl(st->st_mtime))
                changed |= MTIME_CHANGED;
        if (ce->ce_ctime.sec != htonl(st->st_ctime))
@@ -33,9 +46,6 @@ int cache_match_stat(struct cache_entry *ce, struct stat *st)
        if (ce->ce_uid != htonl(st->st_uid) ||
            ce->ce_gid != htonl(st->st_gid))
                changed |= OWNER_CHANGED;
-       /* We consider only the owner x bit to be relevant for "mode changes" */
-       if (0100 & (ntohl(ce->ce_mode) ^ st->st_mode))
-               changed |= MODE_CHANGED;
        if (ce->ce_dev != htonl(st->st_dev) ||
            ce->ce_ino != htonl(st->st_ino))
                changed |= INODE_CHANGED;
@@ -198,7 +208,7 @@ int read_cache(void)
                size = st.st_size;
                errno = EINVAL;
                if (size >= sizeof(struct cache_header) + 20)
-                       map = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
+                       map = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
        }
        close(fd);
        if (-1 == (int)(long)map)