From: Torsten Bögershausen Date: Fri, 24 Jan 2014 21:05:14 GMT Subject: [PATCH] repack.c: chmod +w before rename() Message-ID: <201401242205.16313.tboegi@web.de> commit a1bbc6c0 "repack: rewrite the shell script in C" introduced a possible regression, when a Git repo is located on a Windows network share. When git gc is called on an already packed repository, it could fail like this: "fatal: renaming '.git/objects/pack/.tmp-xyz.pack' failed: Permission denied" Temporary *.pack and *.idx files remain in .git/objects/pack/ In a1bbc6c0 the rename() function replaced the "mv -f" shell command. Obviously the -f option can also override a read-only file but rename() can not on a network share. Make the C-code to work similar to the shell script, by making the files writable before calling rename(). Another solution could be to do the "chmod +x" in mingw_rename(). This may be done in another commit, because a) It improves git gc only when Git for Windows is used on the client machine b) Windows refuses to delete a file when the file is read-only. So setting a file to read-only under Windows is a way for a user to protect it from being deleted. Changing the behaviour of rename() globally may not be what we want. Reported-by: Jochen Haag Signed-off-by: Torsten Bögershausen --- builtin/repack.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/builtin/repack.c b/builtin/repack.c index ba66c6e..033b4c2 100644 --- a/builtin/repack.c +++ b/builtin/repack.c @@ -324,6 +324,10 @@ int cmd_repack(int argc, const char **argv, const char *prefix) statbuffer.st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH); chmod(fname_old, statbuffer.st_mode); } + if (!stat(fname, &statbuffer)) { + statbuffer.st_mode |= (S_IWUSR | S_IWGRP | S_IWOTH); + chmod(fname, statbuffer.st_mode); + } if (rename(fname_old, fname)) die_errno(_("renaming '%s' failed"), fname_old); free(fname); -- 1.9.rc0.143.g6fd479e -- -- *** Please reply-to-all at all times *** *** (do not pretend to know who is subscribed and who is not) *** *** Please avoid top-posting. *** The msysGit Wiki is here: https://github.com/msysgit/msysgit/wiki - Github accounts are free. You received this message because you are subscribed to the Google Groups "msysGit" group. To post to this group, send email to msysgit@googlegroups.com To unsubscribe from this group, send email to msysgit+unsubscribe@googlegroups.com For more options, and view previous threads, visit this group at http://groups.google.com/group/msysgit?hl=en_US?hl=en --- You received this message because you are subscribed to the Google Groups "msysGit" group. To unsubscribe from this group and stop receiving emails from it, send an email to msysgit+unsubscribe@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.