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:
		
				
					committed by
					
						
						Junio C Hamano
					
				
			
			
				
	
			
			
			
						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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user