changeset 696:f0a9ef4db025

updated for version 7.0210
author vimboss
date Tue, 28 Feb 2006 23:52:23 +0000
parents 653eeb31bad6
children f08390485cd3
files src/fileio.c src/os_win32.c src/proto/undo.pro
diffstat 3 files changed, 79 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -2357,6 +2357,22 @@ failed:
 	curbuf->b_op_start.col = 0;
 	curbuf->b_op_end.lnum = from + linecnt;
 	curbuf->b_op_end.col = 0;
+
+#ifdef WIN32
+	/*
+	 * Work around a weird problem: When a file has two links (only
+	 * possible on NTFS) and we write through one link, then stat() it
+	 * throught the other link, the timestamp information may be wrong.
+	 * It's correct again after reading the file, thus reset the timestamp
+	 * here.
+	 */
+	if (newfile && !read_stdin && !read_buffer
+					 && mch_stat((char *)fname, &st) >= 0)
+	{
+	    buf_store_time(curbuf, &st, fname);
+	    curbuf->b_mtime_read = curbuf->b_mtime;
+	}
+#endif
     }
     msg_scroll = msg_save;
 
@@ -3263,6 +3279,13 @@ buf_write(buf, fname, sfname, start, end
 		    )
 		backup_copy = TRUE;
 	    else
+# else
+#  ifdef WIN32
+	    /* On NTFS file systems hard links are possible. */
+	    if (mch_is_linked(fname))
+		backup_copy = TRUE;
+	    else
+#  endif
 # endif
 	    {
 		/*
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -2548,6 +2548,61 @@ mch_isdir(char_u *name)
 }
 
 /*
+ * Return TRUE if file "fname" has more than one link.
+ */
+    int
+mch_is_linked(char_u *fname)
+{
+    HANDLE	hFile;
+    int		res = 0;
+    BY_HANDLE_FILE_INFORMATION inf;
+#ifdef FEAT_MBYTE
+    WCHAR	*wn = NULL;
+
+    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	wn = enc_to_ucs2(fname, NULL);
+    if (wn != NULL)
+    {
+	hFile = CreateFileW(wn,		/* file name */
+		    GENERIC_READ,	/* access mode */
+		    0,			/* share mode */
+		    NULL,		/* security descriptor */
+		    OPEN_EXISTING,	/* creation disposition */
+		    0,			/* file attributes */
+		    NULL);		/* handle to template file */
+	if (hFile == INVALID_HANDLE_VALUE
+		&& GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
+	{
+	    /* Retry with non-wide function (for Windows 98). */
+	    vim_free(wn);
+	    wn = NULL;
+	}
+    }
+    if (wn == NULL)
+#endif
+	hFile = CreateFile(fname,	/* file name */
+		    GENERIC_READ,	/* access mode */
+		    0,			/* share mode */
+		    NULL,		/* security descriptor */
+		    OPEN_EXISTING,	/* creation disposition */
+		    0,			/* file attributes */
+		    NULL);		/* handle to template file */
+
+    if (hFile != INVALID_HANDLE_VALUE)
+    {
+	if (GetFileInformationByHandle(hFile, &inf) != 0
+		&& inf.nNumberOfLinks > 1)
+	    res = 1;
+	CloseHandle(hFile);
+    }
+
+#ifdef FEAT_MBYTE
+    vim_free(wn);
+#endif
+    return res;
+}
+
+/*
  * Return TRUE if file or directory "name" is writable (not readonly).
  * Strange semantics of Win32: a readonly directory is writable, but you can't
  * delete a file.  Let's say this means it is writable.
--- a/src/proto/undo.pro
+++ b/src/proto/undo.pro
@@ -7,6 +7,7 @@ int u_savedel __ARGS((linenr_T lnum, lon
 void u_undo __ARGS((int count));
 void u_redo __ARGS((int count));
 void u_sync __ARGS((void));
+void ex_undojoin __ARGS((exarg_T *eap));
 void u_unchanged __ARGS((buf_T *buf));
 void u_clearall __ARGS((buf_T *buf));
 void u_saveline __ARGS((linenr_T lnum));