Windows: fix utime() for read-only files
PATCH 1/1 Windows: fix utime() for read-only files
From: Johannes Sixt <[email protected]>
Starting with 5256b00 (Use git_mkstemp_mode instead of plain mkstemp to create object files, 2010-02-22) utime() is invoked on read-only files. This is not allowed on Windows and results in many warnings of the form
failed utime() on .git/objects/23/tmp_obj_VlgHlc: Permission denied
during a repack. Fix it by making the file temporarily writable.
Signed-off-by Johannes Sixt <[email protected]>
---
This should go on top of 5256b00 in maint.
-- Hannes
PS: First patch submission with a new MUA; I hope it gets through undamaged.
compat/mingw.c | 20 ++++++++++++++++++-- 1 files changed, 18 insertions(+), 2 deletions(-)
compat/mingw.c +18 -2
@@ -259,8 +259,17 @@ int mingw_utime (const char *file_name, const struct utimbuf *times)int fh, rc;/* must have write permission */ -if ((fh =open (file_name,O_RDWR |O_BINARY )) <0 ) -return -1 ; +DWORD attrs =GetFileAttributes (file_name); +if (attrs !=INVALID_FILE_ATTRIBUTES && + (attrs &FILE_ATTRIBUTE_READONLY )) { +/* ignore errors here; open() will report them */ +SetFileAttributes (file_name, attrs & ~FILE_ATTRIBUTE_READONLY ); + } + +if ((fh =open (file_name,O_RDWR |O_BINARY )) <0 ) { + rc =-1 ; + goto revert_attrs; + }time_t_to_filetime (times->modtime, &mft);time_t_to_filetime (times->actime, &aft);
@@ -270,6 +279,13 @@ int mingw_utime (const char *file_name, const struct utimbuf *times) }else rc =0 ;close (fh); + +revert_attrs: +if (attrs !=INVALID_FILE_ATTRIBUTES && + (attrs &FILE_ATTRIBUTE_READONLY )) { +/* ignore errors again */ +SetFileAttributes (file_name, attrs); + }return rc; }
Signature · 1 line
1.7.0.7.gcaca7