mingw: add fallback for rmdir in case directory is in use
authorHeiko Voigt <hvoigt@hvoigt.net>
Mon, 7 Feb 2011 20:52:34 +0000 (21:52 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 7 Feb 2011 23:45:54 +0000 (15:45 -0800)
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>
compat/mingw.c
compat/mingw.h

index e8e20282df81b234171dbef9504eae9d369067ac..e55c3cac7747d4b381ff9943dd72314225f42c5c 100644 (file)
@@ -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, ...)
 {
index 8316938020beb556d6926e95dcd1b44a26669325..8b159c44476efd7c7830d87cc5a5ec3dea6818c0 100644 (file)
@@ -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