Explorar o código

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 %!s(int64=21) %!d(string=hai) anos
pai
achega
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)