Quellcode durchsuchen

BUG: Fix issue #7523: Analyze output of 'hdiutil attach' to get the name of the volume that was mounted. Eliminates the need to use the -mountpoint arg of hdiutil which has a silly 90 character limit on the name of the mount point. Also add a custom volume icon to the BundleGeneratorTest to cover this code.

David Cole vor 17 Jahren
Ursprung
Commit
36c228814b

+ 11 - 7
Source/CPack/cmCPackBundleGenerator.cxx

@@ -19,6 +19,8 @@
 #include "cmCPackLog.h"
 #include "cmSystemTools.h"
 
+#include <cmsys/RegularExpression.hxx>
+
 //----------------------------------------------------------------------
 cmCPackBundleGenerator::cmCPackBundleGenerator()
 {
@@ -245,16 +247,14 @@ int cmCPackBundleGenerator::CompressFiles(const char* outFileName,
   if(!cpack_package_icon.empty())
     {
     cmOStringStream temp_mount;
-    temp_mount << this->GetOption("CPACK_TOPLEVEL_DIRECTORY") << "/mnt";
-    cmSystemTools::MakeDirectory(temp_mount.str().c_str());
 
     cmOStringStream attach_command;
     attach_command << this->GetOption("CPACK_COMMAND_HDIUTIL");
     attach_command << " attach";
-    attach_command << " -mountpoint \"" << temp_mount.str() << "\"";
     attach_command << " \"" << temp_image.str() << "\"";
 
-    if(!this->RunCommand(attach_command))
+    std::string attach_output;
+    if(!this->RunCommand(attach_command, &attach_output))
       {
       cmCPackLogger(cmCPackLog::LOG_ERROR,
         "Error attaching temporary disk image."
@@ -263,6 +263,10 @@ int cmCPackBundleGenerator::CompressFiles(const char* outFileName,
       return 0;
       }
 
+    cmsys::RegularExpression mountpoint_regex(".*(/Volumes/[^\n]+)\n.*");
+    mountpoint_regex.find(attach_output.c_str());
+    temp_mount << mountpoint_regex.match(1);
+
     cmOStringStream setfile_command;
     setfile_command << this->GetOption("CPACK_COMMAND_SETFILE");
     setfile_command << " -a C";
@@ -335,14 +339,14 @@ bool cmCPackBundleGenerator::CopyFile(cmOStringStream& source,
 }
 
 //----------------------------------------------------------------------
-bool cmCPackBundleGenerator::RunCommand(cmOStringStream& command)
+bool cmCPackBundleGenerator::RunCommand(cmOStringStream& command, 
+  std::string* output)
 {
-  std::string output;
   int exit_code = 1;
 
   bool result = cmSystemTools::RunSingleCommand(
     command.str().c_str(),
-    &output,
+    output,
     &exit_code,
     0,
     this->GeneratorVerbose,

+ 1 - 1
Source/CPack/cmCPackBundleGenerator.h

@@ -41,7 +41,7 @@ protected:
     const std::vector<std::string>& files);
 
   bool CopyFile(cmOStringStream& source, cmOStringStream& target);
-  bool RunCommand(cmOStringStream& command);
+  bool RunCommand(cmOStringStream& command, std::string* output = 0);
 
   std::string InstallPrefix;
 };

+ 10 - 1
Tests/BundleGeneratorTest/CMakeLists.txt

@@ -18,7 +18,16 @@ SET(CPACK_BUNDLE_NAME "BundleGeneratorTest")
 SET(CPACK_BUNDLE_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info.plist")
 SET(CPACK_BUNDLE_STARTUP_COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/StartupCommand")
 SET(CPACK_PACKAGE_DESCRIPTION "Project for testing OSX bundle generation")
+
+# The custom volume icon is a copy of the normal Mac OSX volume icon, but
+# on a white background. This is to differentiate it from the normal one
+# so that you can verify that the custom icon is being used by doing a
+# visual inspection of the mounted volume... This was added when fixing
+# issue #7523...
+#
+SET(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/CustomVolumeIcon.icns")
+
 SET(CPACK_PACKAGE_NAME "BundleGeneratorTest")
 SET(CPACK_PACKAGE_VERSION "0.1")
-INCLUDE(CPack)
 
+INCLUDE(CPack)

BIN
Tests/BundleGeneratorTest/CustomVolumeIcon.icns