changeset 1778:0b42546f036b v7.2.076

updated for version 7.2-076
author vimboss
date Tue, 30 Dec 2008 15:15:57 +0000
parents 7209e03df100
children 28e9eb0f2d84
files src/fileio.c src/version.c
diffstat 2 files changed, 43 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -6119,6 +6119,47 @@ vim_rename(from, to)
     if (mch_stat((char *)from, &st) < 0)
 	return -1;
 
+#ifdef UNIX
+    {
+	struct stat	st_to;
+	char		tempname[MAXPATHL + 1];
+
+	/* It's possible for the source and destination to be the same file.
+	 * This happens when "from" and "to" differ in case and are on a FAT32
+	 * filesystem.  In that case go through a temp file name. */
+	if (mch_stat((char *)to, &st_to) >= 0
+		&& st.st_dev == st_to.st_dev
+		&& st.st_ino == st_to.st_ino)
+	{
+	    /* Find a name that doesn't exist and is in the same directory.
+	     * Move "from" to "tempname" and then to "to". */
+	    if (STRLEN(from) >= MAXPATHL - 5)
+		return -1;
+	    STRCPY(tempname, from);
+	    for (n = 123; n < 99999; ++n)
+	    {
+		sprintf(gettail(tempname), "%d", n);
+		if (mch_stat(tempname, &st_to) < 0)
+		{
+		    if (mch_rename((char *)from, tempname) == 0)
+		    {
+			if (mch_rename(tempname, (char *)to) == 0)
+			    return 0;
+			/* Strange, the second step failed.  Try moving the
+			 * file back and return failure. */
+			mch_rename(tempname, (char *)from);
+			return -1;
+		    }
+		    /* If it fails for one temp name it will most likely fail
+		     * for any temp name, give up. */
+		    return -1;
+		}
+	    }
+	    return -1;
+	}
+    }
+#endif
+
     /*
      * Delete the "to" file, this is required on some systems to make the
      * mch_rename() work, on other systems it makes sure that we don't have
--- a/src/version.c
+++ b/src/version.c
@@ -677,6 +677,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    76,
+/**/
     75,
 /**/
     74,