From: Heiko Voigt <hvoigt@hvoigt.net>
To: Johannes Sixt <j6t@kdbg.org>
Cc: Pat Thoyts <patthoyts@users.sourceforge.net>,
msysgit@googlegroups.com, git@vger.kernel.org,
Junio C Hamano <gitster@pobox.com>
Subject: [PATCH v3 4/5] mingw: add fallback for rmdir in case directory is in use
Date: Tue, 14 Dec 2010 23:25:29 +0100 [thread overview]
Message-ID: <20101214222528.GE4084@sandbox> (raw)
In-Reply-To: <20101214220604.GA4084@sandbox>
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>
---
I just realized that there was a wrong patch count in the subject. It
should have been 5 instead of 8 all the time.
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 ac9fb4a..b920644 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -229,6 +229,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_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 8316938..8b159c4 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
--
1.7.3.3.566.gf422f
next prev parent reply other threads:[~2010-12-14 22:26 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-14 22:06 [PATCH v3 0/5] make open/unlink failures user friendly on windows using retry/abort Heiko Voigt
2010-12-14 22:09 ` [PATCH v3 1/8] mingw: move unlink wrapper to mingw.c Heiko Voigt
2010-12-14 22:11 ` [PATCH v3 2/8] mingw: work around irregular failures of unlink on windows Heiko Voigt
2010-12-14 22:14 ` Erik Faye-Lund
2010-12-14 22:31 ` Heiko Voigt
2010-12-14 22:44 ` [PATCH v4 2/5] " Heiko Voigt
2010-12-14 22:21 ` [PATCH v3 3/8] mingw: make failures to unlink or move raise a question Heiko Voigt
2010-12-14 22:35 ` Erik Faye-Lund
2010-12-14 23:52 ` Junio C Hamano
2010-12-15 7:48 ` Heiko Voigt
2010-12-15 0:11 ` Johannes Schindelin
2010-12-15 3:05 ` Junio C Hamano
2010-12-15 7:28 ` Heiko Voigt
2010-12-15 9:09 ` Erik Faye-Lund
2010-12-15 7:36 ` Heiko Voigt
2010-12-14 22:25 ` Heiko Voigt [this message]
2010-12-14 22:28 ` [PATCH v3 5/5] mingw_rmdir: set errno=ENOTEMPTY when appropriate Heiko Voigt
2010-12-14 22:49 ` Erik Faye-Lund
2010-12-15 0:21 ` Johannes Schindelin
2010-12-15 15:52 ` [PATCH v3 0/5] make open/unlink failures user friendly on windows using retry/abort Erik Faye-Lund
2010-12-15 20:45 ` Junio C Hamano
2011-02-07 20:48 ` [PATCH v4 " Heiko Voigt
2011-02-07 20:49 ` [PATCH v4 1/5] mingw: move unlink wrapper to mingw.c Heiko Voigt
2011-02-17 23:18 ` Johannes Schindelin
2011-02-07 20:50 ` [PATCH v4 2/5] mingw: work around irregular failures of unlink on windows Heiko Voigt
2011-02-07 20:51 ` [PATCH v4 3/5] mingw: make failures to unlink or move raise a question Heiko Voigt
2011-02-07 20:52 ` [PATCH v4 4/5] mingw: add fallback for rmdir in case directory is in use Heiko Voigt
2011-02-07 20:54 ` [PATCH v4 5/5] mingw_rmdir: set errno=ENOTEMPTY when appropriate Heiko Voigt
2011-02-07 21:07 ` Erik Faye-Lund
2011-02-07 21:18 ` [msysGit] " Heiko Voigt
2011-02-07 21:23 ` Erik Faye-Lund
2011-02-07 21:54 ` Junio C Hamano
2011-02-07 21:57 ` Erik Faye-Lund
2011-02-08 4:34 ` [PATCH v4 0/5] make open/unlink failures user friendly on windows using retry/abort Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20101214222528.GE4084@sandbox \
--to=hvoigt@hvoigt.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=j6t@kdbg.org \
--cc=msysgit@googlegroups.com \
--cc=patthoyts@users.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).