diff options
author | Heiko Voigt <hvoigt@hvoigt.net> | 2011-02-07 21:52:34 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-02-07 15:45:54 -0800 |
commit | 4f288100ceed14c65a1e964b2db4aaee4f4199fc (patch) | |
tree | 452ad7b77100f834bc4e1189ba12041d36dbb697 | |
parent | mingw: make failures to unlink or move raise a question (diff) | |
download | tgif-4f288100ceed14c65a1e964b2db4aaee4f4199fc.tar.xz |
mingw: add fallback for rmdir in case directory is in use
The same logic as for unlink and rename also applies to rmdir. For
example in case you have a shell open in a git controlled folder. This
will easily fail. So lets be nice for such cases as well.
Signed-off-by: Heiko Voigt <heiko.voigt@mahr.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | compat/mingw.c | 25 | ||||
-rw-r--r-- | compat/mingw.h | 3 |
2 files changed, 28 insertions, 0 deletions
diff --git a/compat/mingw.c b/compat/mingw.c index e8e20282df..e55c3cac77 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -225,6 +225,31 @@ int mingw_unlink(const char *pathname) return ret; } +#undef rmdir +int mingw_rmdir(const char *pathname) +{ + int ret, tries = 0; + + while ((ret = rmdir(pathname)) == -1 && tries < ARRAY_SIZE(delay)) { + if (!is_file_in_use_error(GetLastError())) + break; + /* + * We assume that some other process had the source or + * destination file open at the wrong moment and retry. + * In order to give the other process a higher chance to + * complete its operation, we give up our time slice now. + * If we have to retry again, we do sleep a bit. + */ + Sleep(delay[tries]); + tries++; + } + while (ret == -1 && is_file_in_use_error(GetLastError()) && + ask_yes_no_if_possible("Deletion of directory '%s' failed. " + "Should I try again?", pathname)) + ret = rmdir(pathname); + return ret; +} + #undef open int mingw_open (const char *filename, int oflags, ...) { diff --git a/compat/mingw.h b/compat/mingw.h index 8316938020..8b159c4447 100644 --- a/compat/mingw.h +++ b/compat/mingw.h @@ -175,6 +175,9 @@ int link(const char *oldpath, const char *newpath); int mingw_unlink(const char *pathname); #define unlink mingw_unlink +int mingw_rmdir(const char *path); +#define rmdir mingw_rmdir + int mingw_open (const char *filename, int oflags, ...); #define open mingw_open |