Windows: fix utime() for read-only files
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 <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
da1fbed3ff
commit
852f098c06
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user