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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.