mirror of
https://github.com/git/git.git
synced 2024-11-23 18:05:29 +08:00
t/helper/test-chmtime: update mingw to support chmtime on directories
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>
This commit is contained in:
parent
715d08a9e5
commit
090a3085bc
@ -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)
|
int mingw_utime (const char *file_name, const struct utimbuf *times)
|
||||||
{
|
{
|
||||||
FILETIME mft, aft;
|
FILETIME mft, aft;
|
||||||
int fh, rc;
|
int rc;
|
||||||
DWORD attrs;
|
DWORD attrs;
|
||||||
wchar_t wfilename[MAX_PATH];
|
wchar_t wfilename[MAX_PATH];
|
||||||
|
HANDLE osfilehandle;
|
||||||
|
|
||||||
if (xutftowcs_path(wfilename, file_name) < 0)
|
if (xutftowcs_path(wfilename, file_name) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -975,7 +977,17 @@ int mingw_utime (const char *file_name, const struct utimbuf *times)
|
|||||||
SetFileAttributesW(wfilename, attrs & ~FILE_ATTRIBUTE_READONLY);
|
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;
|
rc = -1;
|
||||||
goto revert_attrs;
|
goto revert_attrs;
|
||||||
}
|
}
|
||||||
@ -987,12 +999,15 @@ int mingw_utime (const char *file_name, const struct utimbuf *times)
|
|||||||
GetSystemTimeAsFileTime(&mft);
|
GetSystemTimeAsFileTime(&mft);
|
||||||
aft = mft;
|
aft = mft;
|
||||||
}
|
}
|
||||||
if (!SetFileTime((HANDLE)_get_osfhandle(fh), NULL, &aft, &mft)) {
|
|
||||||
|
if (!SetFileTime(osfilehandle, NULL, &aft, &mft)) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
rc = -1;
|
rc = -1;
|
||||||
} else
|
} else
|
||||||
rc = 0;
|
rc = 0;
|
||||||
close(fh);
|
|
||||||
|
if (osfilehandle != INVALID_HANDLE_VALUE)
|
||||||
|
CloseHandle(osfilehandle);
|
||||||
|
|
||||||
revert_attrs:
|
revert_attrs:
|
||||||
if (attrs != INVALID_FILE_ATTRIBUTES &&
|
if (attrs != INVALID_FILE_ATTRIBUTES &&
|
||||||
|
Loading…
Reference in New Issue
Block a user