Use WIN32 retry loop on Cygwin, too. From: David Rothenberger --- subversion/libsvn_subr/io.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/subversion/libsvn_subr/io.c b/subversion/libsvn_subr/io.c index 9d6db8f..4262c75 100644 --- a/subversion/libsvn_subr/io.c +++ b/subversion/libsvn_subr/io.c @@ -29,6 +29,10 @@ #include #endif +#ifdef __CYGWIN__ +#include +#endif + #ifndef APR_STATUS_IS_EPERM #include #ifdef EPERM @@ -136,6 +140,12 @@ || os_err == ERROR_SHARING_VIOLATION \ || os_err == ERROR_DIR_NOT_EMPTY), \ 1) +#elif defined(__CYGWIN__) +#define WIN32_RETRY_LOOP(err, expr) \ + RETRY_LOOP(err, expr, (os_err == EBUSY \ + || os_err == EACCES \ + || os_err == ENOTEMPTY), \ + 1) #else #define WIN32_RETRY_LOOP(err, expr) ((void)0) #endif @@ -2900,6 +2910,7 @@ svn_io_remove_file2(const char *path, apr_err = apr_file_remove(path_apr, scratch_pool); +#if defined(WIN32) || defined(__CYGWIN__) #ifdef WIN32 /* If the target is read only NTFS reports EACCESS and FAT/FAT32 reports EEXIST */ @@ -2910,10 +2921,14 @@ svn_io_remove_file2(const char *path, SVN_ERR(svn_io_set_file_read_write(path, ignore_enoent, scratch_pool)); apr_err = apr_file_remove(path_apr, scratch_pool); } - +#endif /* Check to make sure we aren't trying to delete a directory */ +#ifdef WIN32 if (apr_err == APR_FROM_OS_ERROR(ERROR_ACCESS_DENIED) || apr_err == APR_FROM_OS_ERROR(ERROR_SHARING_VIOLATION)) +#else + if (apr_err == APR_FROM_OS_ERROR(EACCES)) +#endif { apr_finfo_t finfo; @@ -4570,6 +4585,9 @@ svn_io_file_rename2(const char *from_path, const char *to_path, } #else status = apr_file_rename(from_path_apr, to_path_apr, pool); +#ifdef __CYGWIN__ + WIN32_RETRY_LOOP(status, apr_file_rename(from_path_apr, to_path_apr, pool)); +#endif #endif /* WIN32 || __OS2__ */ if (status) @@ -4702,7 +4720,7 @@ dir_make(const char *path, apr_fileperms_t perm, /* Windows does not implement sgid. Skip here because retrieving the file permissions via APR_FINFO_PROT | APR_FINFO_OWNER is documented to be 'incredibly expensive'. */ -#ifndef WIN32 +#if !defined(WIN32) && !defined(__CYGWIN__) if (sgid) { apr_finfo_t finfo;