MinGW: implement mmap
[gitweb.git] / read-cache.c
index bb07371597970c6343194e3e3a4e660e5d9201f6..3f587110cb9d7be1890b7db68a0bdac35d48cd35 100644 (file)
@@ -69,13 +69,8 @@ void fill_stat_cache_info(struct cache_entry *ce, struct stat *st)
 {
        ce->ce_ctime.sec = (unsigned int)st->st_ctime;
        ce->ce_mtime.sec = (unsigned int)st->st_mtime;
-#ifdef USE_NSEC
-       ce->ce_ctime.nsec = (unsigned int)st->st_ctim.tv_nsec;
-       ce->ce_mtime.nsec = (unsigned int)st->st_mtim.tv_nsec;
-#else
-       ce->ce_ctime.nsec = 0;
-       ce->ce_mtime.nsec = 0;
-#endif
+       ce->ce_ctime.nsec = ST_CTIME_NSEC(*st);
+       ce->ce_mtime.nsec = ST_MTIME_NSEC(*st);
        ce->ce_dev = st->st_dev;
        ce->ce_ino = st->st_ino;
        ce->ce_uid = st->st_uid;
@@ -209,9 +204,9 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)
                changed |= CTIME_CHANGED;
 
 #ifdef USE_NSEC
-       if (ce->ce_mtime.nsec != (unsigned int)st->st_mtim.tv_nsec)
+       if (ce->ce_mtime.nsec != ST_MTIME_NSEC(*st))
                changed |= MTIME_CHANGED;
-       if (trust_ctime && ce->ce_ctime.nsec != (unsigned int)st->st_ctim.tv_nsec)
+       if (trust_ctime && ce->ce_ctime.nsec != ST_CTIME_NSEC(*st))
                changed |= CTIME_CHANGED;
 #endif
 
@@ -1183,13 +1178,8 @@ static void convert_from_disk(struct ondisk_cache_entry *ondisk, struct cache_en
 
        ce->ce_ctime.sec = ntohl(ondisk->ctime.sec);
        ce->ce_mtime.sec = ntohl(ondisk->mtime.sec);
-#ifdef USE_NSEC
        ce->ce_ctime.nsec = ntohl(ondisk->ctime.nsec);
        ce->ce_mtime.nsec = ntohl(ondisk->mtime.nsec);
-#else
-       ce->ce_ctime.nsec = 0;
-       ce->ce_mtime.nsec = 0;
-#endif
        ce->ce_dev   = ntohl(ondisk->dev);
        ce->ce_ino   = ntohl(ondisk->ino);
        ce->ce_mode  = ntohl(ondisk->mode);
@@ -1309,11 +1299,7 @@ int read_index_from(struct index_state *istate, const char *path)
                dst_offset += ce_size(ce);
        }
        istate->timestamp.sec = st.st_mtime;
-#ifdef USE_NSEC
-       istate->timestamp.nsec = (unsigned int)st.st_mtim.tv_nsec;
-#else
-       istate->timestamp.nsec = 0;
-#endif
+       istate->timestamp.nsec = ST_MTIME_NSEC(st);
 
        while (src_offset <= mmap_size - 20 - 8) {
                /* After an array of active_nr index entries,
@@ -1500,13 +1486,8 @@ static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce)
 
        ondisk->ctime.sec = htonl(ce->ce_ctime.sec);
        ondisk->mtime.sec = htonl(ce->ce_mtime.sec);
-#ifdef USE_NSEC
        ondisk->ctime.nsec = htonl(ce->ce_ctime.nsec);
        ondisk->mtime.nsec = htonl(ce->ce_mtime.nsec);
-#else
-       ondisk->ctime.nsec = 0;
-       ondisk->mtime.nsec = 0;
-#endif
        ondisk->dev  = htonl(ce->ce_dev);
        ondisk->ino  = htonl(ce->ce_ino);
        ondisk->mode = htonl(ce->ce_mode);
@@ -1528,13 +1509,14 @@ static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce)
        return ce_write(c, fd, ondisk, size);
 }
 
-int write_index(const struct index_state *istate, int newfd)
+int write_index(struct index_state *istate, int newfd)
 {
        git_SHA_CTX c;
        struct cache_header hdr;
        int i, err, removed, extended;
        struct cache_entry **cache = istate->cache;
        int entries = istate->cache_nr;
+       struct stat st;
 
        for (i = removed = extended = 0; i < entries; i++) {
                if (cache[i]->ce_flags & CE_REMOVE)
@@ -1578,7 +1560,12 @@ int write_index(const struct index_state *istate, int newfd)
                if (err)
                        return -1;
        }
-       return ce_flush(&c, newfd);
+
+       if (ce_flush(&c, newfd) || fstat(newfd, &st))
+               return -1;
+       istate->timestamp.sec = (unsigned int)st.st_mtime;
+       istate->timestamp.nsec = ST_MTIME_NSEC(st);
+       return 0;
 }
 
 /*