]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.445 v7.3.445
authorBram Moolenaar <Bram@vim.org>
Sun, 19 Feb 2012 17:19:30 +0000 (18:19 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 19 Feb 2012 17:19:30 +0000 (18:19 +0100)
Problem:    Can't properly escape commands for cmd.exe.
Solution:   Default 'shellxquote' to '('.  Append ')' to make '(command)'.
            No need to use "/s" for 'shellcmdflag'.

src/misc2.c
src/option.c
src/os_win32.c
src/version.c

index 00d1ff4a0f4d5ce73bf3667b4ed9138bdaa0f86c..fc38cd029498c6c008def97ebf6a4ac71abc6854 100644 (file)
@@ -3230,7 +3230,11 @@ call_shell(cmd, opt)
            {
                STRCPY(ncmd, p_sxq);
                STRCAT(ncmd, cmd);
-               STRCAT(ncmd, p_sxq);
+               /* When 'shellxquote' is ( append ).
+                * When 'shellxquote' is "( append )". */
+               STRCAT(ncmd, STRCMP(p_sxq, "(") == 0 ? (char_u *)")"
+                          : STRCMP(p_sxq, "\"(") == 0 ? (char_u *)")\""
+                          : p_sxq);
                retval = mch_call_shell(ncmd, opt);
                vim_free(ncmd);
            }
index 04db07b9f25a187a112e1afa533a466004de991f..cac031e18419586b35b95e69dc35ce17a3c0d5f0 100644 (file)
@@ -3933,27 +3933,22 @@ set_init_3()
         *   my path/to/echo" "my args to echo
         * when executed.
         *
-        * To avoid this, use the /s argument in addition to /c to force the
-        * stripping behavior, and also set shellxquote to automatically
-        * surround the entire command in quotes (which get stripped as
-        * noted).
+        * To avoid this, set shellxquote to surround the command in
+        * parenthesis.  This appears to make most commands work, without
+        * breaking commands that worked previously, such as
+        * '"path with spaces/cmd" "a&b"'.
         */
-
-       /* Set shellxquote default to add the quotes to be stripped. */
        idx3 = findoption((char_u *)"sxq");
        if (idx3 >= 0 && !(options[idx3].flags & P_WAS_SET))
        {
-           p_sxq = (char_u *)"\"";
+           p_sxq = (char_u *)"(";
            options[idx3].def_val[VI_DEFAULT] = p_sxq;
        }
 
-       /* Set shellcmdflag default to always strip the quotes, note the order
-        * between /s and /c is important or cmd.exe will treat the /s as part
-        * of the command to be executed.  */
        idx3 = findoption((char_u *)"shcf");
        if (idx3 >= 0 && !(options[idx3].flags & P_WAS_SET))
        {
-           p_shcf = (char_u *)"/s /c";
+           p_shcf = (char_u *)"/c";
            options[idx3].def_val[VI_DEFAULT] = p_shcf;
        }
     }
index fbf077f6f7aafb17a1001e36d0bb4810dd5cad3d..520a09544d5860ffe0449a6839da26feccd5b440 100644 (file)
@@ -3908,8 +3908,13 @@ mch_call_shell(
        newcmd = lalloc(cmdlen, TRUE);
        if (newcmd != NULL)
        {
-           char_u *cmdbase = (*cmd == '"' ? cmd + 1 : cmd);
+           char_u *cmdbase = cmd;
 
+           /* Skip a leading ", ( and "(. */
+           if (*cmdbase == '"' )
+               ++cmdbase;
+           if (*cmdbase == '(')
+               ++cmdbase;
            if ((STRNICMP(cmdbase, "start", 5) == 0) && vim_iswhite(cmdbase[5]))
            {
                STARTUPINFO             si;
@@ -3953,16 +3958,26 @@ mch_call_shell(
                 * empty, keep the double quotes around the command.
                 * Otherwise remove the double quotes, they aren't needed
                 * here, because we don't use a shell to run the command. */
-               if (*cmd == '"' && *p_sxq == NUL)
+               if (cmdbase > cmd)
                {
-                   newcmd[0] = '"';
-                   STRCPY(newcmd + 1, cmdbase);
-               }
-               else
-               {
-                   STRCPY(newcmd, cmdbase);
-                   if (*cmd == '"' && *newcmd != NUL)
-                       newcmd[STRLEN(newcmd) - 1] = NUL;
+                   if (STRNCMP(cmd, p_sxq, cmd - cmdbase) != 0)
+                   {
+                       STRCPY(newcmd, cmd);
+                   }
+                   else
+                   {
+                       char_u *p;
+
+                       STRCPY(newcmd, cmdbase);
+                       /* Remove a trailing ", ) and )" if they have a match
+                        * at the start of the command. */
+                       p = newcmd + STRLEN(newcmd);
+                       if (p > newcmd && p[-1] == '"' && *cmd == '"')
+                           *--p = NUL;
+                       if (p > newcmd && p[-1] == ')'
+                                            && (*cmd =='(' || cmd[1] == '('))
+                           *--p = NUL;
+                   }
                }
 
                /*
@@ -3970,7 +3985,7 @@ mch_call_shell(
                 * inherit our handles which causes unpleasant dangling swap
                 * files if we exit before the spawned process
                 */
-               if (CreateProcess (NULL,        // Executable name
+               if (CreateProcess(NULL,         // Executable name
                        newcmd,                 // Command to execute
                        NULL,                   // Process security attributes
                        NULL,                   // Thread security attributes
index bf32d28d7261d7d25ea36eb9626c9ae262fd2b93..7b78a45a0d4a797a25118dd718692f022e971aeb 100644 (file)
@@ -714,6 +714,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    445,
 /**/
     444,
 /**/