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>
This commit is contained in:
parent
c9b7840080
commit
4f288100ce
@ -225,6 +225,31 @@ int mingw_unlink(const char *pathname)
|
|||||||
return ret;
|
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
|
#undef open
|
||||||
int mingw_open (const char *filename, int oflags, ...)
|
int mingw_open (const char *filename, int oflags, ...)
|
||||||
{
|
{
|
||||||
|
@ -175,6 +175,9 @@ int link(const char *oldpath, const char *newpath);
|
|||||||
int mingw_unlink(const char *pathname);
|
int mingw_unlink(const char *pathname);
|
||||||
#define unlink mingw_unlink
|
#define unlink mingw_unlink
|
||||||
|
|
||||||
|
int mingw_rmdir(const char *path);
|
||||||
|
#define rmdir mingw_rmdir
|
||||||
|
|
||||||
int mingw_open (const char *filename, int oflags, ...);
|
int mingw_open (const char *filename, int oflags, ...);
|
||||||
#define open mingw_open
|
#define open mingw_open
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user