浏览代码

FIX: go back to not trying to handle spaces in the path for run single command and comment it so that people know to call the right thing

Bill Hoffman 21 年之前
父节点
当前提交
626be7884a

+ 7 - 37
Source/cmSystemTools.cxx

@@ -427,54 +427,25 @@ bool cmSystemTools::RunSingleCommand(
     verbose = false;
     }
 
-  std::string program;          // store name of program must be in scope function as it
-                                // is put into argv list as a cont char*
-  std::vector<cmStdString> args; // store the program and args program is args[0]
-  std::vector<const char*> argv; // store args in a format so that process cmsysProcess can use it
-  // check to see if the command contains a double quoted string at the start
-  // if so, then just use parse arguments to split things up
-  if(command && *command == '\"')
-    {
-    args = cmSystemTools::ParseArguments(command);
-    }
-  else
+  std::vector<cmStdString> args = cmSystemTools::ParseArguments(command);
+
+  if(args.size() < 1)
     {
-    std::string argsTemp; // Store the arguments to the program
-    cmSystemTools::SplitProgramFromArgs(command, program, argsTemp);
-    // if there is no program to run then return false
-    if(program.size() < 1)
-      {
-      // check for a bad call to SplitProgramFromArgs
-      if(strlen(command) >= 1)
-        {
-        cmSystemTools::Error("Error in SplitProgramFromArgs for: ", command);
-        }
-      return false;
-      }
-    argv.push_back(program.c_str()); // put program in as argv[0]
-    if(argsTemp.size())
-      {
-      args = cmSystemTools::ParseArguments(argsTemp.c_str());
-      }
+    return false;
     }
-  // copy args into argv
+  
+  std::vector<const char*> argv;
   for(std::vector<cmStdString>::const_iterator a = args.begin();
       a != args.end(); ++a)
     {
     argv.push_back(a->c_str());
     }
-  // null terminate array
   argv.push_back(0);
-  // if the only argument is null then there is nothing to run and return false
-  if(!argv[0])
-    {
-    return false;
-    }
-  
   if ( output )
     {
     *output = "";
     }
+
   cmsysProcess* cp = cmsysProcess_New();
   cmsysProcess_SetCommand(cp, &*argv.begin());
   cmsysProcess_SetWorkingDirectory(cp, dir);
@@ -565,7 +536,6 @@ bool cmSystemTools::RunSingleCommand(
     }
   
   cmsysProcess_Delete(cp);
-  
   return result;
 }
 bool cmSystemTools::RunCommand(const char* command, 

+ 5 - 0
Source/cmSystemTools.h

@@ -188,6 +188,11 @@ public:
    * exit code will be stored. If the retVal is not specified and 
    * the program exits with a code other than 0, then the this 
    * function will return false.
+   *
+   * If the command has spaces in the path the caller MUST call
+   * cmSystemTools::ConvertToRunCommandPath on the command before passing
+   * it into this function or it will not work.  The command must be correctly
+   * escaped for this to with spaces.  
    */
   static bool RunSingleCommand(const char* command, std::string* output = 0,
     int* retVal = 0, const char* dir = 0, bool verbose = true, double timeout = 0.0);

+ 2 - 1
Tests/Complex/Executable/complex.cxx

@@ -117,7 +117,8 @@ int main()
   exe += "A";
   exe += cmSystemTools::GetExecutableExtension();
   int ret;
-  std::string errorMessage;
+  std::string errorMessage; 
+  exe = cmSystemTools::ConvertToRunCommandPath(exe.c_str());
   if(cmSystemTools::RunSingleCommand(exe.c_str(), 0, &ret))
     {
     if(ret != 10)

+ 2 - 1
Tests/ComplexOneConfig/Executable/complex.cxx

@@ -117,7 +117,8 @@ int main()
   exe += "A";
   exe += cmSystemTools::GetExecutableExtension();
   int ret;
-  std::string errorMessage;
+  std::string errorMessage; 
+  exe = cmSystemTools::ConvertToRunCommandPath(exe.c_str());
   if(cmSystemTools::RunSingleCommand(exe.c_str(), 0, &ret))
     {
     if(ret != 10)

+ 2 - 1
Tests/ComplexRelativePaths/Executable/complex.cxx

@@ -117,7 +117,8 @@ int main()
   exe += "A";
   exe += cmSystemTools::GetExecutableExtension();
   int ret;
-  std::string errorMessage;
+  std::string errorMessage; 
+  exe = cmSystemTools::ConvertToRunCommandPath(exe.c_str());
   if(cmSystemTools::RunSingleCommand(exe.c_str(), 0, &ret))
     {
     if(ret != 10)