This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, next has been updated
       via  e5be35f906c7af3806e2002c1e05c3fa0e20e1e9 (commit)
       via  6e5c134e098548eb946b5a1c1bbad7874851136a (commit)
       via  20c0a6a0add0380290adab4989425d0b26e38d24 (commit)
      from  4babede6b64b9ca86004f59f5a3f57abe8086cb2 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=e5be35f906c7af3806e2002c1e05c3fa0e20e1e9
commit e5be35f906c7af3806e2002c1e05c3fa0e20e1e9
Merge: 4babede 6e5c134
Author:     Nils Gladitz <nilsglad...@gmail.com>
AuthorDate: Wed Oct 23 06:19:08 2013 -0400
Commit:     CMake Topic Stage <kwro...@kitware.com>
CommitDate: Wed Oct 23 06:19:08 2013 -0400

    Merge topic 'wix-fix-shortcut-ids' into next
    
    6e5c134 CPackWiX: use safe IDs for generated start menu shortcuts
    20c0a6a CMake Nightly Date Stamp


http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=6e5c134e098548eb946b5a1c1bbad7874851136a
commit 6e5c134e098548eb946b5a1c1bbad7874851136a
Author:     Nils Gladitz <nilsglad...@gmail.com>
AuthorDate: Wed Oct 23 12:14:39 2013 +0200
Commit:     Nils Gladitz <nilsglad...@gmail.com>
CommitDate: Wed Oct 23 12:14:39 2013 +0200

    CPackWiX: use safe IDs for generated start menu shortcuts

diff --git a/Source/CPack/WiX/cmCPackWIXGenerator.cxx 
b/Source/CPack/WiX/cmCPackWIXGenerator.cxx
index 725810b..3c11528 100644
--- a/Source/CPack/WiX/cmCPackWIXGenerator.cxx
+++ b/Source/CPack/WiX/cmCPackWIXGenerator.cxx
@@ -170,6 +170,16 @@ bool cmCPackWIXGenerator::InitializeWiXConfiguration()
       }
     }
 
+  if(GetOption("CPACK_PACKAGE_VENDOR") == 0)
+    {
+      std::string defaultVendor = "Humanity";
+      SetOption("CPACK_PACKAGE_VENDOR", defaultVendor.c_str());
+
+      cmCPackLogger(cmCPackLog::LOG_VERBOSE,
+        "CPACK_PACKAGE_VENDOR implicitly set to " << defaultVendor << " . "
+        << std::endl);
+    }
+
   return true;
 }
 
@@ -368,117 +378,49 @@ bool cmCPackWIXGenerator::CreateWiXSourceFiles()
   featureDefinitions.AddAttribute("Id", "ProductFeature");
   featureDefinitions.AddAttribute("Title", Name);
   featureDefinitions.AddAttribute("Level", "1");
-  featureDefinitions.EndElement();
+  featureDefinitions.EndElement("Feature");
 
   featureDefinitions.BeginElement("FeatureRef");
   featureDefinitions.AddAttribute("Id", "ProductFeature");
 
+  std::vector<std::string> cpackPackageExecutablesList;
   const char *cpackPackageExecutables = GetOption("CPACK_PACKAGE_EXECUTABLES");
-  std::vector<std::string> cpackPkgExecutables;
-  std::string regKey;
-  if ( cpackPackageExecutables )
+  if(cpackPackageExecutables)
     {
-    cmSystemTools::ExpandListArgument(cpackPackageExecutables,
-      cpackPkgExecutables);
-    if ( cpackPkgExecutables.size() % 2 != 0 )
-      {
-      cmCPackLogger(cmCPackLog::LOG_ERROR,
-        "CPACK_PACKAGE_EXECUTABLES should contain pairs of <executable> and "
-        "<icon name>." << std::endl);
-      cpackPkgExecutables.clear();
-      }
-
-    const char *cpackVendor = GetOption("CPACK_PACKAGE_VENDOR");
-    const char *cpackPkgName = GetOption("CPACK_PACKAGE_NAME");
-    if (!cpackVendor || !cpackPkgName)
-      {
-      cmCPackLogger(cmCPackLog::LOG_WARNING, "CPACK_PACKAGE_VENDOR and "
-        "CPACK_PACKAGE_NAME must be defined for shortcut creation"
-        << std::endl);
-      cpackPkgExecutables.clear();
-      }
-    else
-      {
-        regKey = std::string("Software/") + cpackVendor + "/" + cpackPkgName;
-      }
+      cmSystemTools::ExpandListArgument(cpackPackageExecutables,
+        cpackPackageExecutablesList);
+      if(cpackPackageExecutablesList.size() % 2 != 0 )
+        {
+        cmCPackLogger(cmCPackLog::LOG_ERROR,
+          "CPACK_PACKAGE_EXECUTABLES should contain pairs of <executable> and "
+          "<text label>." << std::endl);
+        return false;
+        }
     }
 
-  std::vector<std::string> dirIdExecutables;
   AddDirectoryAndFileDefinitons(
     toplevel, "INSTALL_ROOT",
     directoryDefinitions, fileDefinitions, featureDefinitions,
-    cpackPkgExecutables, dirIdExecutables);
-
-  directoryDefinitions.EndElement();
-  directoryDefinitions.EndElement();
+    cpackPackageExecutablesList);
 
-  if (dirIdExecutables.size() > 0 && dirIdExecutables.size() % 3 == 0)
+  if(!CreateStartMenuShortcuts(
+    directoryDefinitions, fileDefinitions, featureDefinitions))
     {
-    fileDefinitions.BeginElement("DirectoryRef");
-    fileDefinitions.AddAttribute("Id", "PROGRAM_MENU_FOLDER");
-    fileDefinitions.BeginElement("Component");
-    fileDefinitions.AddAttribute("Id", "SHORTCUT");
-    fileDefinitions.AddAttribute("Guid", "*");
+      return false;
+    }
 
-    std::vector<std::string>::iterator it;
-    for ( it = dirIdExecutables.begin() ;
-          it != dirIdExecutables.end();
-          ++it)
-      {
-      std::string fileName = *it++;
-      std::string iconName = *it++;
-      std::string directoryId = *it;
-
-      fileDefinitions.BeginElement("Shortcut");
-
-      // the iconName is more likely to contain blanks early on
-      std::string shortcutName = fileName;
-
-      std::string::size_type const dotPos = shortcutName.find('.');
-      if(std::string::npos == dotPos)
-        { shortcutName = shortcutName.substr(0, dotPos); }
-      fileDefinitions.AddAttribute("Id", "SHORTCUT_" + shortcutName);
-      fileDefinitions.AddAttribute("Name", iconName);
-      std::string target = "[" + directoryId + "]" + fileName;
-      fileDefinitions.AddAttribute("Target", target);
-      fileDefinitions.AddAttribute("WorkingDirectory", directoryId);
-      fileDefinitions.EndElement();
-      }
-    fileDefinitions.BeginElement("Shortcut");
-    fileDefinitions.AddAttribute("Id", "UNINSTALL");
-    std::string pkgName = GetOption("CPACK_PACKAGE_NAME");
-    fileDefinitions.AddAttribute("Name", "Uninstall " + pkgName);
-    fileDefinitions.AddAttribute("Description", "Uninstalls " + pkgName);
-    fileDefinitions.AddAttribute("Target", "[SystemFolder]msiexec.exe");
-    fileDefinitions.AddAttribute("Arguments", "/x [ProductCode]");
-    fileDefinitions.EndElement();
-    fileDefinitions.BeginElement("RemoveFolder");
-    fileDefinitions.AddAttribute("Id", "PROGRAM_MENU_FOLDER");
-    fileDefinitions.AddAttribute("On", "uninstall");
-    fileDefinitions.EndElement();
-    fileDefinitions.BeginElement("RegistryValue");
-    fileDefinitions.AddAttribute("Root", "HKCU");
-    fileDefinitions.AddAttribute("Key", regKey);
-    fileDefinitions.AddAttribute("Name", "installed");
-    fileDefinitions.AddAttribute("Type", "integer");
-    fileDefinitions.AddAttribute("Value", "1");
-    fileDefinitions.AddAttribute("KeyPath", "yes");
-
-    featureDefinitions.BeginElement("ComponentRef");
-    featureDefinitions.AddAttribute("Id", "SHORTCUT");
-    featureDefinitions.EndElement();
-    directoryDefinitions.BeginElement("Directory");
-    directoryDefinitions.AddAttribute("Id", "ProgramMenuFolder");
-    directoryDefinitions.BeginElement("Directory");
-    directoryDefinitions.AddAttribute("Id", "PROGRAM_MENU_FOLDER");
-    const char *startMenuFolder = GetOption("CPACK_WIX_PROGRAM_MENU_FOLDER");
-    directoryDefinitions.AddAttribute("Name", startMenuFolder);
-  }
+  featureDefinitions.EndElement("FeatureRef");
+  featureDefinitions.EndElement("Fragment");
+  fileDefinitions.EndElement("Fragment");
 
-  featureDefinitions.EndElement();
-  featureDefinitions.EndElement();
-  fileDefinitions.EndElement();
-  directoryDefinitions.EndElement();
+  for(size_t i = 1; i < install_root.size(); ++i)
+    {
+    directoryDefinitions.EndElement("Directory");
+    }
+
+  directoryDefinitions.EndElement("Directory");
+  directoryDefinitions.EndElement("Directory");
+  directoryDefinitions.EndElement("Fragment");
 
   std::string wixTemplate = FindTemplate("WIX.template.in");
   if(GetOption("CPACK_WIX_TEMPLATE") != 0)
@@ -508,6 +450,106 @@ bool cmCPackWIXGenerator::CreateWiXSourceFiles()
   return true;
 }
 
+bool cmCPackWIXGenerator::CreateStartMenuShortcuts(
+  cmWIXSourceWriter& directoryDefinitions,
+  cmWIXSourceWriter& fileDefinitions,
+  cmWIXSourceWriter& featureDefinitions)
+{
+  if(shortcutMap.empty())
+    {
+      return true;
+    }
+
+  std::string cpackVendor;
+  if(!RequireOption("CPACK_PACKAGE_VENDOR", cpackVendor))
+    {
+    return false;
+    }
+
+  std::string cpackPackageName;
+  if(!RequireOption("CPACK_PACKAGE_NAME", cpackPackageName))
+    {
+    return false;
+    }
+
+  fileDefinitions.BeginElement("DirectoryRef");
+  fileDefinitions.AddAttribute("Id", "PROGRAM_MENU_FOLDER");
+  fileDefinitions.BeginElement("Component");
+  fileDefinitions.AddAttribute("Id", "SHORTCUT");
+  fileDefinitions.AddAttribute("Guid", "*");
+
+  for(shortcut_map_t::const_iterator
+    i = shortcutMap.begin(); i != shortcutMap.end(); ++i)
+    {
+    std::string const& id = i->first;
+    cmWIXShortcut const& shortcut = i->second;
+
+    std::string shortcutId = std::string("CM_S") + id;
+    std::string fileId = std::string("CM_F") + id;
+
+    fileDefinitions.BeginElement("Shortcut");
+    fileDefinitions.AddAttribute("Id", shortcutId);
+    fileDefinitions.AddAttribute("Name", shortcut.textLabel);
+    std::string target = "[#" + fileId + "]";
+    fileDefinitions.AddAttribute("Target", target);
+    fileDefinitions.AddAttribute("WorkingDirectory",
+      shortcut.workingDirectoryId);
+    fileDefinitions.EndElement("Shortcut");
+    }
+
+  CreateUninstallShortcut(cpackPackageName, fileDefinitions);
+
+  fileDefinitions.BeginElement("RemoveFolder");
+  fileDefinitions.AddAttribute("Id", "PROGRAM_MENU_FOLDER");
+  fileDefinitions.AddAttribute("On", "uninstall");
+  fileDefinitions.EndElement("RemoveFolder");
+
+  std::string registryKey =
+    std::string("Software/") + cpackVendor + "/" + cpackPackageName;
+
+  fileDefinitions.BeginElement("RegistryValue");
+  fileDefinitions.AddAttribute("Root", "HKCU");
+  fileDefinitions.AddAttribute("Key", registryKey);
+  fileDefinitions.AddAttribute("Name", "installed");
+  fileDefinitions.AddAttribute("Type", "integer");
+  fileDefinitions.AddAttribute("Value", "1");
+  fileDefinitions.AddAttribute("KeyPath", "yes");
+  fileDefinitions.EndElement("RegistryValue");
+
+  fileDefinitions.EndElement("Component");
+  fileDefinitions.EndElement("DirectoryRef");
+
+  featureDefinitions.BeginElement("ComponentRef");
+  featureDefinitions.AddAttribute("Id", "SHORTCUT");
+  featureDefinitions.EndElement("ComponentRef");
+
+  directoryDefinitions.BeginElement("Directory");
+  directoryDefinitions.AddAttribute("Id", "ProgramMenuFolder");
+
+  directoryDefinitions.BeginElement("Directory");
+  directoryDefinitions.AddAttribute("Id", "PROGRAM_MENU_FOLDER");
+  const char *startMenuFolder = GetOption("CPACK_WIX_PROGRAM_MENU_FOLDER");
+  directoryDefinitions.AddAttribute("Name", startMenuFolder);
+  directoryDefinitions.EndElement("Directory");
+
+  directoryDefinitions.EndElement("Directory");
+
+  return true;
+}
+
+void cmCPackWIXGenerator::CreateUninstallShortcut(
+  std::string const& packageName,
+  cmWIXSourceWriter& fileDefinitions)
+{
+  fileDefinitions.BeginElement("Shortcut");
+  fileDefinitions.AddAttribute("Id", "UNINSTALL");
+  fileDefinitions.AddAttribute("Name", "Uninstall " + packageName);
+  fileDefinitions.AddAttribute("Description", "Uninstalls " + packageName);
+  fileDefinitions.AddAttribute("Target", "[SystemFolder]msiexec.exe");
+  fileDefinitions.AddAttribute("Arguments", "/x [ProductCode]");
+  fileDefinitions.EndElement("Shortcut");
+}
+
 bool cmCPackWIXGenerator::CreateLicenseFile()
 {
   std::string licenseSourceFilename;
@@ -561,8 +603,7 @@ void cmCPackWIXGenerator::AddDirectoryAndFileDefinitons(
   cmWIXSourceWriter& directoryDefinitions,
   cmWIXSourceWriter& fileDefinitions,
   cmWIXSourceWriter& featureDefinitions,
-  const std::vector<std::string>& pkgExecutables,
-  std::vector<std::string>& dirIdExecutables)
+  const std::vector<std::string>& packageExecutables)
 {
   cmsys::Directory dir;
   dir.Load(topdir.c_str());
@@ -596,9 +637,9 @@ void cmCPackWIXGenerator::AddDirectoryAndFileDefinitons(
         directoryDefinitions,
         fileDefinitions,
         featureDefinitions,
-        pkgExecutables,
-        dirIdExecutables);
-      directoryDefinitions.EndElement();
+        packageExecutables);
+
+      directoryDefinitions.EndElement("Directory");
       }
     else
       {
@@ -617,28 +658,25 @@ void cmCPackWIXGenerator::AddDirectoryAndFileDefinitons(
       fileDefinitions.AddAttribute("Source", fullPath);
       fileDefinitions.AddAttribute("KeyPath", "yes");
 
-      fileDefinitions.EndElement();
-      fileDefinitions.EndElement();
-      fileDefinitions.EndElement();
+      fileDefinitions.EndElement("File");
+      fileDefinitions.EndElement("Component");
+      fileDefinitions.EndElement("DirectoryRef");
 
       featureDefinitions.BeginElement("ComponentRef");
       featureDefinitions.AddAttribute("Id", componentId);
-      featureDefinitions.EndElement();
+      featureDefinitions.EndElement("ComponentRef");
 
-      std::vector<std::string>::const_iterator it;
-      for (it = pkgExecutables.begin() ;
-           it != pkgExecutables.end() ;
-           ++it)
+      for(size_t i = 0; i < packageExecutables.size(); ++i)
         {
-        std::string execName = *it++;
-        std::string iconName = *it;
+        std::string const& executableName = packageExecutables[i++];
+        std::string const& textLabel = packageExecutables[i++];
 
-        if (cmSystemTools::LowerCase(fileName) ==
-            cmSystemTools::LowerCase(execName) + ".exe")
+        if(cmSystemTools::LowerCase(fileName) ==
+            cmSystemTools::LowerCase(executableName) + ".exe")
           {
-            dirIdExecutables.push_back(fileName);
-            dirIdExecutables.push_back(iconName);
-            dirIdExecutables.push_back(directoryId);
+          cmWIXShortcut &shortcut = shortcutMap[id];
+          shortcut.textLabel= textLabel;
+          shortcut.workingDirectoryId = directoryId;
           }
         }
       }
diff --git a/Source/CPack/WiX/cmCPackWIXGenerator.h 
b/Source/CPack/WiX/cmCPackWIXGenerator.h
index eac69fe..c96ad5a 100644
--- a/Source/CPack/WiX/cmCPackWIXGenerator.h
+++ b/Source/CPack/WiX/cmCPackWIXGenerator.h
@@ -18,6 +18,12 @@
 #include <string>
 #include <map>
 
+struct cmWIXShortcut
+{
+  std::string textLabel;
+  std::string workingDirectoryId;
+};
+
 class cmWIXSourceWriter;
 
 /** \class cmCPackWIXGenerator
@@ -56,6 +62,7 @@ protected:
 private:
   typedef std::map<std::string, std::string> id_map_t;
   typedef std::map<std::string, size_t> ambiguity_map_t;
+  typedef std::map<std::string, cmWIXShortcut> shortcut_map_t;
 
   bool InitializeWiXConfiguration();
 
@@ -71,6 +78,15 @@ private:
 
   bool CreateWiXSourceFiles();
 
+  bool CreateStartMenuShortcuts(
+    cmWIXSourceWriter& directoryDefinitions,
+    cmWIXSourceWriter& fileDefinitions,
+    cmWIXSourceWriter& featureDefinitions);
+
+  void CreateUninstallShortcut(
+    std::string const& packageName,
+    cmWIXSourceWriter& fileDefinitions);
+
   void AppendUserSuppliedExtraSources();
 
   void AppendUserSuppliedExtraObjects(std::ostream& stream);
@@ -89,9 +105,7 @@ private:
     cmWIXSourceWriter& directoryDefinitions,
     cmWIXSourceWriter& fileDefinitions,
     cmWIXSourceWriter& featureDefinitions,
-    const std::vector<std::string>& pkgExecutables,
-    std::vector<std::string>& dirIdExecutables
-    );
+    const std::vector<std::string>& pkgExecutables);
 
   bool RequireOption(const std::string& name, std::string& value) const;
 
@@ -118,6 +132,7 @@ private:
   std::vector<std::string> wixSources;
   id_map_t pathToIdMap;
   ambiguity_map_t idAmbiguityCounter;
+  shortcut_map_t shortcutMap;
 };
 
 #endif
diff --git a/Source/CPack/WiX/cmWIXSourceWriter.cxx 
b/Source/CPack/WiX/cmWIXSourceWriter.cxx
index af7ba80..a84f42d 100644
--- a/Source/CPack/WiX/cmWIXSourceWriter.cxx
+++ b/Source/CPack/WiX/cmWIXSourceWriter.cxx
@@ -21,7 +21,8 @@ cmWIXSourceWriter::cmWIXSourceWriter(cmCPackLog* logger,
   bool isIncludeFile):
     Logger(logger),
     file(filename.c_str()),
-    state(DEFAULT)
+    state(DEFAULT),
+    filename(filename)
 {
   WriteXMLDeclaration();
 
@@ -39,10 +40,15 @@ cmWIXSourceWriter::cmWIXSourceWriter(cmCPackLog* logger,
 
 cmWIXSourceWriter::~cmWIXSourceWriter()
 {
-  while(elements.size())
+  if(elements.size() > 1)
     {
-    EndElement();
+    cmCPackLogger(cmCPackLog::LOG_ERROR,
+      elements.size() - 1 << " WiX elements were still open when closing '" <<
+      filename << "'" << std::endl);
+    return;
     }
+
+  EndElement(elements.back());
 }
 
 void cmWIXSourceWriter::BeginElement(const std::string& name)
@@ -60,12 +66,22 @@ void cmWIXSourceWriter::BeginElement(const std::string& 
name)
   state = BEGIN;
 }
 
-void cmWIXSourceWriter::EndElement()
+void cmWIXSourceWriter::EndElement(std::string const& name)
 {
   if(elements.empty())
     {
     cmCPackLogger(cmCPackLog::LOG_ERROR,
-      "can not end WiX element with no open elements" << std::endl);
+      "can not end WiX element with no open elements in '" <<
+      filename << "'" << std::endl);
+    return;
+    }
+
+  if(elements.back() != name)
+    {
+    cmCPackLogger(cmCPackLog::LOG_ERROR,
+      "WiX element <" << elements.back() <<
+      "> can not be closed by </" << name << "> in '" <<
+      filename << "'" << std::endl);
     return;
     }
 
@@ -173,6 +189,9 @@ std::string cmWIXSourceWriter::EscapeAttributeValue(
     case '<':
       result += "&lt;";
       break;
+    case '>':
+      result += "&gt;";
+      break;
     case '&':
       result +="&amp;";
       break;
diff --git a/Source/CPack/WiX/cmWIXSourceWriter.h 
b/Source/CPack/WiX/cmWIXSourceWriter.h
index 1dafc1f..eac83c6 100644
--- a/Source/CPack/WiX/cmWIXSourceWriter.h
+++ b/Source/CPack/WiX/cmWIXSourceWriter.h
@@ -32,7 +32,7 @@ public:
 
   void BeginElement(const std::string& name);
 
-  void EndElement();
+  void EndElement(const std::string& name);
 
   void AddProcessingInstruction(
     const std::string& target, const std::string& content);
@@ -62,6 +62,8 @@ private:
   State state;
 
   std::vector<std::string> elements;
+
+  std::string filename;
 };
 
 #endif
diff --git a/Tests/CPackWiXGenerator/CMakeLists.txt 
b/Tests/CPackWiXGenerator/CMakeLists.txt
index 475e60d..c22909e 100644
--- a/Tests/CPackWiXGenerator/CMakeLists.txt
+++ b/Tests/CPackWiXGenerator/CMakeLists.txt
@@ -4,15 +4,15 @@ project(CPackWiXGenerator)
 
 add_library(mylib mylib.cpp)
 
-add_executable(mylibapp mylibapp.cpp)
-target_link_libraries(mylibapp mylib)
+add_executable(my-libapp mylibapp.cpp)
+target_link_libraries(my-libapp mylib)
 
 install(TARGETS mylib
   ARCHIVE
   DESTINATION lib
   COMPONENT libraries)
 
-install(TARGETS mylibapp
+install(TARGETS my-libapp
   RUNTIME
   DESTINATION bin
   COMPONENT applications)
@@ -36,7 +36,7 @@ set(CPACK_PACKAGE_INSTALL_DIRECTORY "CPack Component Example")
 
 set(CPACK_WIX_UPGRADE_GUID "BF20CE5E-7F7C-401D-8F7C-AB45E8D170E6")
 set(CPACK_WIX_UNINSTALL "1")
-set(CPACK_PACKAGE_EXECUTABLES "mylibapp; CPack Wix Test")
+set(CPACK_PACKAGE_EXECUTABLES "my-libapp; CPack Wix Test")
 
 include(CPack)
 

-----------------------------------------------------------------------

Summary of changes:
 Source/CMakeVersion.cmake                |    2 +-
 Source/CPack/WiX/cmCPackWIXGenerator.cxx |  270 +++++++++++++++++-------------
 Source/CPack/WiX/cmCPackWIXGenerator.h   |   21 ++-
 Source/CPack/WiX/cmWIXSourceWriter.cxx   |   29 +++-
 Source/CPack/WiX/cmWIXSourceWriter.h     |    4 +-
 Tests/CPackWiXGenerator/CMakeLists.txt   |    8 +-
 6 files changed, 204 insertions(+), 130 deletions(-)


hooks/post-receive
-- 
CMake
_______________________________________________
Cmake-commits mailing list
Cmake-commits@cmake.org
http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-commits

Reply via email to