# HG changeset patch # User vimboss # Date 1141170743 0 # Node ID f0a9ef4db02532b12e9cdd05455f577ec4d16d7e # Parent 653eeb31bad669cbc420d867fd7282b9e68657cd updated for version 7.0210 diff --git a/src/fileio.c b/src/fileio.c --- 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 { /* diff --git a/src/os_win32.c b/src/os_win32.c --- 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 --- 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));