summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvimboss <devnull@localhost>2006-02-28 23:52:23 +0000
committervimboss <devnull@localhost>2006-02-28 23:52:23 +0000
commit5491b9ea0f60f8e1ba46b02291911e6d3b2ca6c6 (patch)
treec012f29a3c1c0f89b959e1a73105eda82afc4060
parent974b44294ae1956d64a406d64952d7fe1b9fca58 (diff)
downloadvim-5491b9ea0f60f8e1ba46b02291911e6d3b2ca6c6.tar.gz
updated for version 7.0210
-rw-r--r--src/fileio.c23
-rw-r--r--src/os_win32.c55
-rw-r--r--src/proto/undo.pro1
3 files changed, 79 insertions, 0 deletions
diff --git a/src/fileio.c b/src/fileio.c
index c3ff07c4..508de0bc 100644
--- 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, eap, append, forceit,
)
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
{
/*
diff --git a/src/os_win32.c b/src/os_win32.c
index 08df912c..3aec6ac6 100644
--- 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.
diff --git a/src/proto/undo.pro b/src/proto/undo.pro
index 8ac23239..5114ed07 100644
--- a/src/proto/undo.pro
+++ b/src/proto/undo.pro
@@ -7,6 +7,7 @@ int u_savedel __ARGS((linenr_T lnum, long nlines));
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));