Commit 3eb47c9f6768292b8c8f8199ef851812c03aff70

Vicent Marti 2011-02-24T21:43:08

Fix renaming of files in Win32 The `rename` call doesn't quite work on Win32: expects the destination file to not exist. We're using a native Win32 call in those cases -- that should do the trick. Signed-off-by: Vicent Marti <tanoku@gmail.com>

diff --git a/src/fileops.c b/src/fileops.c
index 461dcf0..1da6116 100644
--- a/src/fileops.c
+++ b/src/fileops.c
@@ -144,10 +144,22 @@ void gitfo_free_buf(gitfo_buf *obj)
 
 int gitfo_move_file(char *from, char *to)
 {
+#ifdef GIT_WIN32
+	/*
+	 * Win32 POSIX compilance my ass. If the destination
+	 * file exists, the `rename` call fails. This is as
+	 * close as it gets with the Win32 API.
+	 */
+	if (gitfo_exists(to) == GIT_SUCCESS)
+		return ReplaceFile(to, from, NULL, 0, NULL, NULL) ?
+			GIT_SUCCESS : GIT_EOSERR;
+#else
+	/* Don't even try this on Win32 */
 	if (!link(from, to)) {
 		gitfo_unlink(from);
 		return GIT_SUCCESS;
 	}
+#endif
 
 	if (!rename(from, to))
 		return GIT_SUCCESS;