diff options
author | Johannes Sixt <j6t@kdbg.org> | 2010-03-30 09:46:23 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-03-30 16:34:04 -0700 |
commit | 852f098c0667abc634f5aba0b91e0317f714fa67 (patch) | |
tree | 6c9c16317171d42e707c8b4843645d868baf35b2 | |
parent | da1fbed3fff6ed2d64399ff26d8a9ab3bcf00540 (diff) | |
download | git-852f098c0667abc634f5aba0b91e0317f714fa67.tar.gz git-852f098c0667abc634f5aba0b91e0317f714fa67.tar.xz |
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>
-rw-r--r-- | compat/mingw.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/compat/mingw.c b/compat/mingw.c index ab65f77ab..59b18dc7c 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -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; } |