0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

patch 7.4.1128

Problem:    MS-Windows: delete() does not recognize junctions.
Solution:   Add mch_isrealdir() for MS-Windows. Update mch_is_symbolic_link().
            (Ken Takata)
This commit is contained in:
Bram Moolenaar
2016-01-17 22:15:16 +01:00
parent 021b593e7e
commit 203258c3ad
4 changed files with 32 additions and 13 deletions

View File

@@ -7297,14 +7297,10 @@ delete_recursive(char_u *name)
/* A symbolic link to a directory itself is deleted, not the directory it /* A symbolic link to a directory itself is deleted, not the directory it
* points to. */ * points to. */
if ( if (
# if defined(WIN32) # if defined(UNIX) || defined(WIN32)
mch_isdir(name) && !mch_is_symbolic_link(name)
# else
# ifdef UNIX
mch_isrealdir(name) mch_isrealdir(name)
# else # else
mch_isdir(name) mch_isdir(name)
# endif
# endif # endif
) )
{ {

View File

@@ -3129,6 +3129,17 @@ mch_isdir(char_u *name)
return (f & FILE_ATTRIBUTE_DIRECTORY) != 0; return (f & FILE_ATTRIBUTE_DIRECTORY) != 0;
} }
/*
* return TRUE if "name" is a directory, NOT a symlink to a directory
* return FALSE if "name" is not a directory
* return FALSE for error
*/
int
mch_isrealdir(char_u *name)
{
return mch_isdir(name) && !mch_is_symbolic_link(name);
}
/* /*
* Create directory "name". * Create directory "name".
* Return 0 on success, -1 on error. * Return 0 on success, -1 on error.
@@ -3190,10 +3201,10 @@ mch_is_hard_link(char_u *fname)
} }
/* /*
* Return TRUE if file "fname" is a symbolic link. * Return TRUE if "name" is a symbolic link (or a junction).
*/ */
int int
mch_is_symbolic_link(char_u *fname) mch_is_symbolic_link(char_u *name)
{ {
HANDLE hFind; HANDLE hFind;
int res = FALSE; int res = FALSE;
@@ -3204,7 +3215,7 @@ mch_is_symbolic_link(char_u *fname)
WIN32_FIND_DATAW findDataW; WIN32_FIND_DATAW findDataW;
if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
wn = enc_to_utf16(fname, NULL); wn = enc_to_utf16(name, NULL);
if (wn != NULL) if (wn != NULL)
{ {
hFind = FindFirstFileW(wn, &findDataW); hFind = FindFirstFileW(wn, &findDataW);
@@ -3213,7 +3224,7 @@ mch_is_symbolic_link(char_u *fname)
&& GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
{ {
/* Retry with non-wide function (for Windows 98). */ /* Retry with non-wide function (for Windows 98). */
hFind = FindFirstFile(fname, &findDataA); hFind = FindFirstFile(name, &findDataA);
if (hFind != INVALID_HANDLE_VALUE) if (hFind != INVALID_HANDLE_VALUE)
{ {
fileFlags = findDataA.dwFileAttributes; fileFlags = findDataA.dwFileAttributes;
@@ -3229,7 +3240,7 @@ mch_is_symbolic_link(char_u *fname)
else else
#endif #endif
{ {
hFind = FindFirstFile(fname, &findDataA); hFind = FindFirstFile(name, &findDataA);
if (hFind != INVALID_HANDLE_VALUE) if (hFind != INVALID_HANDLE_VALUE)
{ {
fileFlags = findDataA.dwFileAttributes; fileFlags = findDataA.dwFileAttributes;
@@ -3241,7 +3252,8 @@ mch_is_symbolic_link(char_u *fname)
FindClose(hFind); FindClose(hFind);
if ((fileFlags & FILE_ATTRIBUTE_REPARSE_POINT) if ((fileFlags & FILE_ATTRIBUTE_REPARSE_POINT)
&& reparseTag == IO_REPARSE_TAG_SYMLINK) && (reparseTag == IO_REPARSE_TAG_SYMLINK
|| reparseTag == IO_REPARSE_TAG_MOUNT_POINT))
res = TRUE; res = TRUE;
return res; return res;
@@ -5839,7 +5851,8 @@ mch_delay(
/* /*
* this version of remove is not scared by a readonly (backup) file * This version of remove is not scared by a readonly (backup) file.
* This can also remove a symbolic link like Unix.
* Return 0 for success, -1 for failure. * Return 0 for success, -1 for failure.
*/ */
int int
@@ -5850,6 +5863,13 @@ mch_remove(char_u *name)
int n; int n;
#endif #endif
/*
* On Windows, deleting a directory's symbolic link is done by
* RemoveDirectory(): mch_rmdir. It seems unnatural, but it is fact.
*/
if (mch_isdir(name) && mch_is_symbolic_link(name))
return mch_rmdir(name);
win32_setattrs(name, FILE_ATTRIBUTE_NORMAL); win32_setattrs(name, FILE_ATTRIBUTE_NORMAL);
#ifdef FEAT_MBYTE #ifdef FEAT_MBYTE

View File

@@ -21,6 +21,7 @@ int mch_setperm __ARGS((char_u *name, long perm));
void mch_hide __ARGS((char_u *name)); void mch_hide __ARGS((char_u *name));
int mch_ishidden __ARGS((char_u *name)); int mch_ishidden __ARGS((char_u *name));
int mch_isdir __ARGS((char_u *name)); int mch_isdir __ARGS((char_u *name));
int mch_isrealdir __ARGS((char_u *name));
int mch_mkdir __ARGS((char_u *name)); int mch_mkdir __ARGS((char_u *name));
int mch_rmdir __ARGS((char_u *name)); int mch_rmdir __ARGS((char_u *name));
int mch_is_hard_link __ARGS((char_u *fname)); int mch_is_hard_link __ARGS((char_u *fname));

View File

@@ -741,6 +741,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1128,
/**/ /**/
1127, 1127,
/**/ /**/