git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 4/4] mingw: add fallback for rmdir in case directory is in use

From
Heiko Voigt <hvoigt@hvoigt.net>
Date
Nov 7, 2010, 14:56 UTC
Message-ID
<2497be75bac8877a06bef1d8c702f0c714fbc588.1289139299.git.hvoigt@hvoigt.net>
In-Reply-To
<cover.1289139299.git.hvoigt@hvoigt.net>
From: Heiko Voigt <heiko.voigt@mahr.de>

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: Heiko Voigt <hvoigt@hvoigt.net>
---
 compat/mingw.c |   25 +++++++++++++++++++++++++
 compat/mingw.h |    3 +++
 2 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/compat/mingw.c b/compat/mingw.c
index b66bf89..8e4f1e2 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -263,6 +263,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())
+			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() &&
+	       ask_user_yes_no("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 220ae90..cf69d39 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -172,6 +172,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
 
-- 
1.7.2.2.177.geec0d
Previous: Heiko VoigtNext: Johannes Sixt
Message 32 of 38 in “Pull request for msysGit patches”
  1. Pat ThoytsSep 28, 2010
  2. Junio C HamanoSep 28, 2010
  3. Johannes SixtSep 28, 2010
  4. Junio C HamanoSep 29, 2010
  5. Ævar Arnfjörð BjarmasonSep 28, 2010
  6. Pat ThoytsSep 30, 2010
  7. Ævar Arnfjörð BjarmasonSep 30, 2010
  8. Erik Faye-LundSep 30, 2010
  9. Eric SunshineSep 29, 2010
  10. msysGit patches for upstreamPat Thoyts, Sep 29, 2010
  11. Junio C HamanoSep 29, 2010
  12. 1/2 Make sure that git_getpass() never returns NULLPat Thoyts, Sep 29, 2010
  13. 2/2 Fix typo in pack-objects' usagePat Thoyts, Sep 29, 2010
  14. Johannes SixtSep 28, 2010
  15. Erik Faye-LundSep 28, 2010
  16. Johannes SixtSep 28, 2010
  17. Erik Faye-LundSep 28, 2010
  18. Erik Faye-LundSep 28, 2010
  19. Jonathan NiederSep 28, 2010
  20. Junio C HamanoSep 29, 2010
  21. Pat ThoytsSep 29, 2010
  22. Eric SunshineSep 29, 2010
  23. Junio C HamanoSep 29, 2010
  24. Eric SunshineSep 29, 2010
  25. git-am: fix detection of absolute paths for windowsPat Thoyts, Sep 30, 2010
  26. Johannes SixtOct 1, 2010
  27. git-am: fix detection of absolute paths for windowsPat Thoyts, Sep 30, 2010
  28. 0/4 make open/unlink failures user friendly on windows using retry/abortHeiko Voigt, Nov 7, 2010
  29. 1/4 mingw: move unlink wrapper to mingw.cHeiko Voigt, Nov 7, 2010
  30. 2/4 mingw: work around irregular failures of unlink on windowsHeiko Voigt, Nov 7, 2010
  31. 3/4 mingw: make failures to unlink or move raise a questionHeiko Voigt, Nov 7, 2010
  32. 4/4 mingw: add fallback for rmdir in case directory is in useHeiko Voigt, Nov 7, 2010
  33. Johannes SixtNov 7, 2010
  34. Heiko VoigtNov 7, 2010
  35. Johannes SixtNov 7, 2010
  36. yj2133011Sep 29, 2010
  37. Ramsay JonesSep 29, 2010
  38. Eric SunshineSep 29, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.