Commit 59c050e7ff

Andrew Kelley <andrew@ziglang.org>
2019-01-30 22:06:18
collapse os_file_mtime into os_file_open_r and check for directory
This is a manual merge of kristate's pull request #1754, due to conflicts + a couple fixups. closes #1754
1 parent ad8381e
Changed files (3)
src/cache_hash.cpp
@@ -222,14 +222,9 @@ static Error populate_file_hash(CacheHash *ch, CacheHashFile *chf, Buf *contents
     assert(chf->path != nullptr);
 
     OsFile this_file;
-    if ((err = os_file_open_r(chf->path, &this_file)))
+    if ((err = os_file_open_r(chf->path, &this_file, &chf->mtime)))
         return err;
 
-    if ((err = os_file_mtime(this_file, &chf->mtime))) {
-        os_file_close(this_file);
-        return err;
-    }
-
     if ((err = hash_file(chf->bin_digest, this_file, contents))) {
         os_file_close(this_file);
         return err;
@@ -351,17 +346,12 @@ Error cache_hit(CacheHash *ch, Buf *out_digest) {
 
         // if the mtime matches we can trust the digest
         OsFile this_file;
-        if ((err = os_file_open_r(chf->path, &this_file))) {
+        OsTimeStamp actual_mtime;
+        if ((err = os_file_open_r(chf->path, &this_file, &actual_mtime))) {
             fprintf(stderr, "Unable to open %s\n: %s", buf_ptr(chf->path), err_str(err));
             os_file_close(ch->manifest_file);
             return ErrorCacheUnavailable;
         }
-        OsTimeStamp actual_mtime;
-        if ((err = os_file_mtime(this_file, &actual_mtime))) {
-            os_file_close(this_file);
-            os_file_close(ch->manifest_file);
-            return err;
-        }
         if (chf->mtime.sec == actual_mtime.sec && chf->mtime.nsec == actual_mtime.nsec) {
             os_file_close(this_file);
         } else {
src/os.cpp
@@ -1808,7 +1808,7 @@ Error os_self_exe_shared_libs(ZigList<Buf *> &paths) {
 #endif
 }
 
-Error os_file_open_r(Buf *full_path, OsFile *out_file) {
+Error os_file_open_r(Buf *full_path, OsFile *out_file, OsTimeStamp *mtime) {
 #if defined(ZIG_OS_WINDOWS)
     // TODO use CreateFileW
     HANDLE result = CreateFileA(buf_ptr(full_path), GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
@@ -1834,8 +1834,18 @@ Error os_file_open_r(Buf *full_path, OsFile *out_file) {
                 return ErrorUnexpected;
         }
     }
-
     *out_file = result;
+
+    if (mtime != nullptr) {
+        FILETIME last_write_time;
+        if (!GetFileTime(file, nullptr, nullptr, &last_write_time)) {
+            CloseHandle(result);
+            return ErrorUnexpected;
+        }
+        mtime->sec = (((ULONGLONG) last_write_time.dwHighDateTime) << 32) + last_write_time.dwLowDateTime;
+        mtime->nsec = 0;
+    }
+
     return ErrorNone;
 #else
     for (;;) {
@@ -1858,7 +1868,26 @@ Error os_file_open_r(Buf *full_path, OsFile *out_file) {
                     return ErrorFileSystem;
             }
         }
+        struct stat statbuf;
+        if (fstat(fd, &statbuf) == -1) {
+            close(fd);
+            return ErrorFileSystem;
+        }
+        if (S_ISDIR(statbuf.st_mode)) {
+            close(fd);
+            return ErrorIsDir;
+        }
         *out_file = fd;
+
+        if (mtime != nullptr) {
+#if defined(ZIG_OS_DARWIN)
+            mtime->sec = statbuf.st_mtimespec.tv_sec;
+            mtime->nsec = statbuf.st_mtimespec.tv_nsec;
+#else
+            mtime->sec = statbuf.st_mtim.tv_sec;
+            mtime->nsec = statbuf.st_mtim.tv_nsec;
+#endif
+        }
         return ErrorNone;
     }
 #endif
@@ -1948,35 +1977,6 @@ Error os_file_open_lock_rw(Buf *full_path, OsFile *out_file) {
 #endif
 }
 
-Error os_file_mtime(OsFile file, OsTimeStamp *mtime) {
-#if defined(ZIG_OS_WINDOWS)
-    FILETIME last_write_time;
-    if (!GetFileTime(file, nullptr, nullptr, &last_write_time))
-        return ErrorUnexpected;
-    mtime->sec = (((ULONGLONG) last_write_time.dwHighDateTime) << 32) + last_write_time.dwLowDateTime;
-    mtime->nsec = 0;
-    return ErrorNone;
-#elif defined(ZIG_OS_LINUX) || defined(ZIG_OS_FREEBSD)
-    struct stat statbuf;
-    if (fstat(file, &statbuf) == -1)
-        return ErrorFileSystem;
-
-    mtime->sec = statbuf.st_mtim.tv_sec;
-    mtime->nsec = statbuf.st_mtim.tv_nsec;
-    return ErrorNone;
-#elif defined(ZIG_OS_DARWIN)
-    struct stat statbuf;
-    if (fstat(file, &statbuf) == -1)
-        return ErrorFileSystem;
-
-    mtime->sec = statbuf.st_mtimespec.tv_sec;
-    mtime->nsec = statbuf.st_mtimespec.tv_nsec;
-    return ErrorNone;
-#else
-#error unimplemented
-#endif
-}
-
 Error os_file_read(OsFile file, void *ptr, size_t *len) {
 #if defined(ZIG_OS_WINDOWS)
     DWORD amt_read;
src/os.hpp
@@ -101,9 +101,8 @@ bool os_path_is_absolute(Buf *path);
 Error ATTRIBUTE_MUST_USE os_make_path(Buf *path);
 Error ATTRIBUTE_MUST_USE os_make_dir(Buf *path);
 
-Error ATTRIBUTE_MUST_USE os_file_open_r(Buf *full_path, OsFile *out_file);
+Error ATTRIBUTE_MUST_USE os_file_open_r(Buf *full_path, OsFile *out_file, OsTimeStamp *mtime);
 Error ATTRIBUTE_MUST_USE os_file_open_lock_rw(Buf *full_path, OsFile *out_file);
-Error ATTRIBUTE_MUST_USE os_file_mtime(OsFile file, OsTimeStamp *mtime);
 Error ATTRIBUTE_MUST_USE os_file_read(OsFile file, void *ptr, size_t *len);
 Error ATTRIBUTE_MUST_USE os_file_read_all(OsFile file, Buf *contents);
 Error ATTRIBUTE_MUST_USE os_file_overwrite(OsFile file, Buf *contents);