Add check program "git-check-racy"
[gitweb.git] / read-cache.c
index c923a327071875c41c60273db135e7adce25cfbd..4d621ef4448b34ce8c46674989191513a950cd35 100644 (file)
@@ -5,7 +5,6 @@
  */
 #include "cache.h"
 #include "cache-tree.h"
-#include <time.h>
 
 /* Index extensions.
  *
@@ -170,9 +169,11 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)
        return changed;
 }
 
-int ce_match_stat(struct cache_entry *ce, struct stat *st, int ignore_valid)
+int ce_match_stat(struct cache_entry *ce, struct stat *st, int options)
 {
        unsigned int changed;
+       int ignore_valid = options & 01;
+       int assume_racy_is_modified = options & 02;
 
        /*
         * If it's marked as always valid in the index, it's
@@ -201,8 +202,12 @@ int ce_match_stat(struct cache_entry *ce, struct stat *st, int ignore_valid)
         */
        if (!changed &&
            index_file_timestamp &&
-           index_file_timestamp <= ntohl(ce->ce_mtime.sec))
-               changed |= ce_modified_check_fs(ce, st);
+           index_file_timestamp <= ntohl(ce->ce_mtime.sec)) {
+               if (assume_racy_is_modified)
+                       changed |= DATA_CHANGED;
+               else
+                       changed |= ce_modified_check_fs(ce, st);
+       }
 
        return changed;
 }
@@ -880,10 +885,8 @@ static int write_index_ext_header(SHA_CTX *context, int fd,
 {
        ext = htonl(ext);
        sz = htonl(sz);
-       if ((ce_write(context, fd, &ext, 4) < 0) ||
-           (ce_write(context, fd, &sz, 4) < 0))
-               return -1;
-       return 0;
+       return ((ce_write(context, fd, &ext, 4) < 0) ||
+               (ce_write(context, fd, &sz, 4) < 0)) ? -1 : 0;
 }
 
 static int ce_flush(SHA_CTX *context, int fd)
@@ -905,9 +908,7 @@ static int ce_flush(SHA_CTX *context, int fd)
        /* Append the SHA1 signature at the end */
        SHA1_Final(write_buffer + left, context);
        left += 20;
-       if (write(fd, write_buffer, left) != left)
-               return -1;
-       return 0;
+       return (write(fd, write_buffer, left) != left) ? -1 : 0;
 }
 
 static void ce_smudge_racily_clean_entry(struct cache_entry *ce)
@@ -1037,11 +1038,8 @@ int write_cache(int newfd, struct cache_entry **cache, int entries)
                        fprintf(stderr, "now        %lu\n", now);
 #endif
                        while (!fstat(newfd, &st) && st.st_mtime <= now) {
-                               struct timespec rq, rm;
                                off_t where = lseek(newfd, 0, SEEK_CUR);
-                               rq.tv_sec = 0;
-                               rq.tv_nsec = 250000000;
-                               nanosleep(&rq, &rm);
+                               sleep(1);
                                if ((where == (off_t) -1) ||
                                    (write(newfd, "", 1) != 1) ||
                                    (lseek(newfd, -1, SEEK_CUR) != where) ||