]> git.ipfire.org Git - thirdparty/git.git/commitdiff
t/helper/test-chmtime: update mingw to support chmtime on directories
authorTao Klerks <tao@klerks.biz>
Wed, 2 Mar 2022 06:05:23 +0000 (06:05 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 2 Mar 2022 06:55:07 +0000 (22:55 -0800)
The mingw_utime implementation in mingw.c does not support
directories. This means that "test-tool chmtime" fails on Windows when
targeting directories. This has previously been noted and sidestepped
temporarily by Jeff Hostetler, in "t/helper/test-chmtime: skip
directories on Windows" in the "Builtin FSMonitor Part 2" work, but
not yet fixed.

It would make sense to backdate file and folder changes in untracked
cache tests, to avoid needing to insert explicit delays/pauses in the
tests.

Add support for directory date manipulation in mingw_utime by
replacing the file-oriented _wopen() call with the
directory-supporting CreateFileW() windows API explicitly.

Signed-off-by: Tao Klerks <tao@klerks.biz>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
compat/mingw.c

index 03af369b2b972fdce2476b256ef3679ec88e025e..58f347d6ae5d88e9ecd6968166e2bb815a4de8ae 100644 (file)
@@ -961,9 +961,11 @@ static inline void time_t_to_filetime(time_t t, FILETIME *ft)
 int mingw_utime (const char *file_name, const struct utimbuf *times)
 {
        FILETIME mft, aft;
-       int fh, rc;
+       int rc;
        DWORD attrs;
        wchar_t wfilename[MAX_PATH];
+       HANDLE osfilehandle;
+
        if (xutftowcs_path(wfilename, file_name) < 0)
                return -1;
 
@@ -975,7 +977,17 @@ int mingw_utime (const char *file_name, const struct utimbuf *times)
                SetFileAttributesW(wfilename, attrs & ~FILE_ATTRIBUTE_READONLY);
        }
 
-       if ((fh = _wopen(wfilename, O_RDWR | O_BINARY)) < 0) {
+       osfilehandle = CreateFileW(wfilename,
+                                  FILE_WRITE_ATTRIBUTES,
+                                  0 /*FileShare.None*/,
+                                  NULL,
+                                  OPEN_EXISTING,
+                                  (attrs != INVALID_FILE_ATTRIBUTES &&
+                                       (attrs & FILE_ATTRIBUTE_DIRECTORY)) ?
+                                       FILE_FLAG_BACKUP_SEMANTICS : 0,
+                                  NULL);
+       if (osfilehandle == INVALID_HANDLE_VALUE) {
+               errno = err_win_to_posix(GetLastError());
                rc = -1;
                goto revert_attrs;
        }
@@ -987,12 +999,15 @@ int mingw_utime (const char *file_name, const struct utimbuf *times)
                GetSystemTimeAsFileTime(&mft);
                aft = mft;
        }
-       if (!SetFileTime((HANDLE)_get_osfhandle(fh), NULL, &aft, &mft)) {
+
+       if (!SetFileTime(osfilehandle, NULL, &aft, &mft)) {
                errno = EINVAL;
                rc = -1;
        } else
                rc = 0;
-       close(fh);
+
+       if (osfilehandle != INVALID_HANDLE_VALUE)
+               CloseHandle(osfilehandle);
 
 revert_attrs:
        if (attrs != INVALID_FILE_ATTRIBUTES &&