[PATCH] -w support for git-ssh-pull/push
[gitweb.git] / read-cache.c
index 24ebe383d7a4e72c8cd461f90b4b06bf5cfdb0d1..bfdaee02ab4f25d39620e8d398f90ce27ed03805 100644 (file)
@@ -17,7 +17,7 @@ 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
+#ifdef USE_NSEC
        ce->ce_ctime.nsec = htonl(st->st_ctim.tv_nsec);
        ce->ce_mtime.nsec = htonl(st->st_mtim.tv_nsec);
 #endif
@@ -50,7 +50,7 @@ int ce_match_stat(struct cache_entry *ce, struct stat *st)
        if (ce->ce_ctime.sec != htonl(st->st_ctime))
                changed |= CTIME_CHANGED;
 
-#ifdef NSEC
+#ifdef USE_NSEC
        /*
         * nsec seems unreliable - not all filesystems support it, so
         * as long as it is in the inode cache you get right nsec
@@ -65,9 +65,19 @@ int ce_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;
-       if (ce->ce_dev != htonl(st->st_dev) ||
-           ce->ce_ino != htonl(st->st_ino))
+       if (ce->ce_ino != htonl(st->st_ino))
                changed |= INODE_CHANGED;
+
+#ifdef USE_STDEV
+       /*
+        * st_dev breaks on network filesystems where different
+        * clients will have different views of what "device"
+        * the filesystem is on
+        */
+       if (ce->ce_dev != htonl(st->st_dev))
+               changed |= INODE_CHANGED;
+#endif
+
        if (ce->ce_size != htonl(st->st_size))
                changed |= DATA_CHANGED;
        return changed;
@@ -190,11 +200,13 @@ static int check_file_directory_conflict(const struct cache_entry *ce,
        cp = pathbuf;
        while (1) {
                char *ep = strchr(cp, '/');
+               int len;
                if (!ep)
                        break;
                *ep = 0;    /* first cut it at slash */
+               len = ep - pathbuf;
                pos = cache_name_pos(pathbuf,
-                                    htons(create_ce_flags(ep-cp, stage)));
+                                    htons(create_ce_flags(len, stage)));
                if (0 <= pos) {
                        /* Our leading path component is registered as a file,
                         * and we are trying to make it a directory.  This is