]> granicus.if.org Git - vim/commitdiff
patch 7.4.1128 v7.4.1128
authorBram Moolenaar <Bram@vim.org>
Sun, 17 Jan 2016 21:15:16 +0000 (22:15 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 17 Jan 2016 21:15:16 +0000 (22:15 +0100)
Problem:    MS-Windows: delete() does not recognize junctions.
Solution:   Add mch_isrealdir() for MS-Windows. Update mch_is_symbolic_link().
            (Ken Takata)

src/fileio.c
src/os_win32.c
src/proto/os_win32.pro
src/version.c

index 55337d6825a27ab58396739ffd5c41931ea4a613..cd538095f9c1e4d12602151600996231f0c24381 100644 (file)
@@ -7297,14 +7297,10 @@ delete_recursive(char_u *name)
     /* A symbolic link to a directory itself is deleted, not the directory it
      * points to. */
     if (
-# if defined(WIN32)
-        mch_isdir(name) && !mch_is_symbolic_link(name)
-# else
-#  ifdef UNIX
+# if defined(UNIX) || defined(WIN32)
         mch_isrealdir(name)
-#  else
+# else
         mch_isdir(name)
-#  endif
 # endif
            )
     {
index a47ffaf18a04d652c254aba8d664afca3c4cbbf6..b4f5fa466646de3e770c249aa6ae9107c9d83c7c 100644 (file)
@@ -3129,6 +3129,17 @@ mch_isdir(char_u *name)
     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".
  * 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
-mch_is_symbolic_link(char_u *fname)
+mch_is_symbolic_link(char_u *name)
 {
     HANDLE             hFind;
     int                        res = FALSE;
@@ -3204,7 +3215,7 @@ mch_is_symbolic_link(char_u *fname)
     WIN32_FIND_DATAW   findDataW;
 
     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-       wn = enc_to_utf16(fname, NULL);
+       wn = enc_to_utf16(name, NULL);
     if (wn != NULL)
     {
        hFind = FindFirstFileW(wn, &findDataW);
@@ -3213,7 +3224,7 @@ mch_is_symbolic_link(char_u *fname)
                && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
        {
            /* Retry with non-wide function (for Windows 98). */
-           hFind = FindFirstFile(fname, &findDataA);
+           hFind = FindFirstFile(name, &findDataA);
            if (hFind != INVALID_HANDLE_VALUE)
            {
                fileFlags = findDataA.dwFileAttributes;
@@ -3229,7 +3240,7 @@ mch_is_symbolic_link(char_u *fname)
     else
 #endif
     {
-       hFind = FindFirstFile(fname, &findDataA);
+       hFind = FindFirstFile(name, &findDataA);
        if (hFind != INVALID_HANDLE_VALUE)
        {
            fileFlags = findDataA.dwFileAttributes;
@@ -3241,7 +3252,8 @@ mch_is_symbolic_link(char_u *fname)
        FindClose(hFind);
 
     if ((fileFlags & FILE_ATTRIBUTE_REPARSE_POINT)
-           && reparseTag == IO_REPARSE_TAG_SYMLINK)
+           && (reparseTag == IO_REPARSE_TAG_SYMLINK
+               || reparseTag == IO_REPARSE_TAG_MOUNT_POINT))
        res = TRUE;
 
     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.
  */
     int
@@ -5850,6 +5863,13 @@ mch_remove(char_u *name)
     int                n;
 #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);
 
 #ifdef FEAT_MBYTE
index 7cdd15677a74738e33ff86ca76aa22b73e8760d2..b3acb4f4cb147da507af4c2d80fdb1c11ece8cbf 100644 (file)
@@ -21,6 +21,7 @@ int mch_setperm __ARGS((char_u *name, long perm));
 void mch_hide __ARGS((char_u *name));
 int mch_ishidden __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_rmdir __ARGS((char_u *name));
 int mch_is_hard_link __ARGS((char_u *fname));
index 61393c2e4c8a34fb89026c4890ac2462d4a73de5..5e5a31990afcbd34e6084ab1103babd4ca65e776 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1128,
 /**/
     1127,
 /**/