Browse Source

Merge branch 'backport-source_group-TREE-alt-root' into source_group-TREE-alt-root

Brad King 8 years ago
parent
commit
d286d24af3
1 changed files with 43 additions and 16 deletions
  1. 43 16
      Source/cmSourceGroupCommand.cxx

+ 43 - 16
Source/cmSourceGroupCommand.cxx

@@ -2,6 +2,8 @@
    file Copyright.txt or https://cmake.org/licensing for details.  */
 #include "cmSourceGroupCommand.h"
 
+#include <algorithm>
+#include <iterator>
 #include <set>
 #include <sstream>
 #include <stddef.h>
@@ -36,21 +38,31 @@ std::string getFullFilePath(const std::string& currentPath,
 }
 
 std::set<std::string> getSourceGroupFilesPaths(
-  const std::string& currentPath, const std::string& root,
-  const std::vector<std::string>& files)
+  const std::string& root, const std::vector<std::string>& files)
 {
   std::set<std::string> ret;
   const std::string::size_type rootLength = root.length();
 
   for (size_t i = 0; i < files.size(); ++i) {
-    const std::string fullPath = getFullFilePath(currentPath, files[i]);
-
-    ret.insert(fullPath.substr(rootLength + 1)); // +1 to also omnit last '/'
+    ret.insert(files[i].substr(rootLength + 1)); // +1 to also omnit last '/'
   }
 
   return ret;
 }
 
+bool rootIsPrefix(const std::string& root,
+                  const std::vector<std::string>& files, std::string& error)
+{
+  for (size_t i = 0; i < files.size(); ++i) {
+    if (!cmSystemTools::StringStartsWith(files[i], root.c_str())) {
+      error = "ROOT: " + root + " is not a prefix of file: " + files[i];
+      return false;
+    }
+  }
+
+  return true;
+}
+
 cmSourceGroup* addSourceGroup(const std::vector<std::string>& tokenizedPath,
                               cmMakefile& makefile)
 {
@@ -68,7 +80,22 @@ cmSourceGroup* addSourceGroup(const std::vector<std::string>& tokenizedPath,
   return sg;
 }
 
-bool addFilesToItsSourceGroups(const std::set<std::string>& sgFilesPaths,
+std::string prepareFilePathForTree(const std::string& path)
+{
+  return cmSystemTools::CollapseFullPath(path);
+}
+
+std::vector<std::string> prepareFilesPathsForTree(
+  std::vector<std::string>::const_iterator begin,
+  std::vector<std::string>::const_iterator end)
+{
+  std::vector<std::string> prepared(std::distance(begin, end));
+  std::transform(begin, end, prepared.begin(), prepareFilePathForTree);
+  return prepared;
+}
+
+bool addFilesToItsSourceGroups(const std::string& root,
+                               const std::set<std::string>& sgFilesPaths,
                                const std::string& prefix, cmMakefile& makefile,
                                std::string& errorMsg)
 {
@@ -93,8 +120,7 @@ bool addFilesToItsSourceGroups(const std::set<std::string>& sgFilesPaths,
         errorMsg = "Could not create source group for file: " + *it;
         return false;
       }
-      const std::string fullPath =
-        getFullFilePath(makefile.GetCurrentSourceDirectory(), *it);
+      const std::string fullPath = getFullFilePath(root, *it);
       sg->AddGroupFile(fullPath);
     }
   }
@@ -233,17 +259,18 @@ bool cmSourceGroupCommand::processTree(const std::vector<std::string>& args,
     filesBegin = FilesWithPrefixKeywordIndex + 1;
   }
 
-  const std::vector<std::string> filesVector(args.begin() + filesBegin,
-                                             args.end());
+  const std::vector<std::string> filesVector =
+    prepareFilesPathsForTree(args.begin() + filesBegin, args.end());
 
-  std::set<std::string> sourceGroupPaths = getSourceGroupFilesPaths(
-    this->Makefile->GetCurrentSourceDirectory(), root, filesVector);
+  if (!rootIsPrefix(root, filesVector, errorMsg)) {
+    return false;
+  }
 
-  addFilesToItsSourceGroups(sourceGroupPaths, prefix, *(this->Makefile),
-                            errorMsg);
+  std::set<std::string> sourceGroupPaths =
+    getSourceGroupFilesPaths(root, filesVector);
 
-  if (!errorMsg.empty()) {
-    this->SetError(errorMsg);
+  if (!addFilesToItsSourceGroups(root, sourceGroupPaths, prefix,
+                                 *(this->Makefile), errorMsg)) {
     return false;
   }