git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 1/2] t/helper/test-chmtime: update mingw to support chmtime on directories

From
JHJeff Hostetler <git@jeffhostetler.com>
Date
Mar 1, 2022, 16:34 UTC
Message-ID
<37f66fae-911a-62f1-4711-c9f6c7794911@jeffhostetler.com>
In-Reply-To
<7cdef0ad5fb6fc1a16ee1cee27b9dec0300c8c1d.1646127910.git.gitgitgadget@gmail.com>
On 3/1/22 4:45 AM, Tao Klerks via GitGitGadget wrote:
Show 46 quoted lines
> From: Tao Klerks <tao@klerks.biz>
> 
> 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>
> ---
>   compat/mingw.c | 21 +++++++++++++++++----
>   1 file changed, 17 insertions(+), 4 deletions(-)
> 
> diff --git a/compat/mingw.c b/compat/mingw.c
> index 03af369b2b9..11c43ad2dfb 100644
> --- a/compat/mingw.c
> +++ b/compat/mingw.c
> @@ -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,16 @@ 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,
> +				   0x100 /*FILE_WRITE_ATTRIBUTES*/,
https://docs.microsoft.com/en-us/windows/win32/fileio/file-access-rights-constants

indicates that FILE_WRITE_ATTRIBUTES is defined in <WinNT.h> which we get from <windows.h> which was included by "win32.h", so it should already be present.

Show 5 quoted lines
> +				   0 /*FileShare.None*/,
> +				   NULL,
> +				   OPEN_EXISTING,
> +				   attrs & FILE_ATTRIBUTE_DIRECTORY ?
> +					FILE_FLAG_BACKUP_SEMANTICS : 0,

There is a weird error case here. If the GetFileAttributesW() call at the top fails, it returns INVALID_FILE_ATTRIBUTES (aka -1). So the (attrs & ...) here expression is questionable.

I'm not sure that there is a best way to handle the earlier failure (other than returning an error at the top), but we do try to limp along (for some reason).

So maybe make this something like:
     (attrs != INVALID_FILE_ATTRIBUTES &&
      (attrs & FILE_ATTRIBUTE_DIRECTORY)) ?
         FILE_FLAG_BACKUP_SEMANTICS : 0
Show 24 quoted lines
> +				   NULL);
> +	if (osfilehandle == INVALID_HANDLE_VALUE) {
> +		errno = err_win_to_posix(GetLastError());
>   		rc = -1;
>   		goto revert_attrs;
>   	}
> @@ -987,12 +998,14 @@ 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 &&
> 
Previous: Tao Klerks via GitGitGadgetNext: Tao Klerks
Message 15 of 30 in “Reduce explicit sleep calls in t7063 untracked cache tests”
  1. 0/2 Reduce explicit sleep calls in t7063 untracked cache testsTao Klerks via GitGitGadget, Feb 28, 2022
  2. 1/2 t/helper/test-chmtime: update mingw to support chmtime on directoriesTao Klerks via GitGitGadget, Feb 28, 2022
  3. Jeff HostetlerFeb 28, 2022
  4. Junio C HamanoFeb 28, 2022
  5. Tao KlerksMar 1, 2022
  6. Junio C HamanoFeb 28, 2022
  7. Tao KlerksMar 1, 2022
  8. 2/2 t7063: mtime-mangling instead of delays in untracked cache testingTao Klerks via GitGitGadget, Feb 28, 2022
  9. Junio C HamanoFeb 28, 2022
  10. Tao KlerksMar 1, 2022
  11. Ævar Arnfjörð BjarmasonFeb 28, 2022
  12. Jeff HostetlerFeb 28, 2022
  13. 0/2 Reduce explicit sleep calls in t7063 untracked cache testsTao Klerks via GitGitGadget, Mar 1, 2022
  14. 1/2 t/helper/test-chmtime: update mingw to support chmtime on directoriesTao Klerks via GitGitGadget, Mar 1, 2022
  15. Jeff HostetlerMar 1, 2022
  16. Tao KlerksMar 1, 2022
  17. 2/2 t7063: mtime-mangling instead of delays in untracked cache testingTao Klerks via GitGitGadget, Mar 1, 2022
  18. Junio C HamanoMar 1, 2022
  19. Tao KlerksMar 1, 2022
  20. Tao KlerksMar 1, 2022
  21. Junio C HamanoMar 1, 2022
  22. 0/2 Reduce explicit sleep calls in t7063 untracked cache testsTao Klerks via GitGitGadget, Mar 2, 2022
  23. 1/2 t/helper/test-chmtime: update mingw to support chmtime on directoriesTao Klerks via GitGitGadget, Mar 2, 2022
  24. Johannes SchindelinMar 9, 2022
  25. 2/2 t7063: mtime-mangling instead of delays in untracked cache testingTao Klerks via GitGitGadget, Mar 2, 2022
  26. Johannes SchindelinMar 9, 2022
  27. Tao KlerksMar 5, 2022
  28. Junio C HamanoMar 6, 2022
  29. Tao KlerksMar 7, 2022
  30. Junio C HamanoMar 7, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.