From 0976a94724854501a12581201b2c6d860a0f6dd4 Mon Sep 17 00:00:00 2001 From: Ivan Komissarov Date: Sun, 18 Apr 2021 13:46:19 +0200 Subject: update dmgbuild to master branch This contains fixes for Python 3.9 Change-Id: I087e21a4208c9091aab4cd9fcb9b3c2d1bf9945a Fixes: QBS-1642 Reviewed-by: Max Bespalov Reviewed-by: Denis Shienkov Reviewed-by: Christian Kandeler --- .../lib/python2.7/site-packages/dmgbuild/core.py | 79 ++++++++++++++++++---- 1 file changed, 66 insertions(+), 13 deletions(-) diff --git a/src/3rdparty/python/lib/python2.7/site-packages/dmgbuild/core.py b/src/3rdparty/python/lib/python2.7/site-packages/dmgbuild/core.py index efccd0028..d94a06c1f 100644 --- a/src/3rdparty/python/lib/python2.7/site-packages/dmgbuild/core.py +++ b/src/3rdparty/python/lib/python2.7/site-packages/dmgbuild/core.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals import os import pkg_resources +import platform import re import shutil import stat @@ -25,7 +26,19 @@ try: except NameError: unicode = str -import biplist +if sys.version_info < (3, 4): + import biplist + def plist_from_bytes(data): + return biplist.readPlistFromString(data) + def plist_bytes(data): + return biplist.Data(data) +else: + import plistlib + def plist_from_bytes(data): + return plistlib.loads(data) + def plist_bytes(data): + return data + from mac_alias import * from ds_store import * @@ -39,6 +52,10 @@ except ImportError: _hexcolor_re = re.compile(r'#[0-9a-f]{3}(?:[0-9a-f]{3})?') +# The first element in the platform.mac_ver() tuple is a string containing the +# macOS version (e.g., '10.15.6'). Parse into an integer tuple. +MACOS_VERSION = tuple(int(v) for v in platform.mac_ver()[0].split('.')) + class DMGError(Exception): pass @@ -51,7 +68,7 @@ def hdiutil(cmd, *args, **kwargs): p = subprocess.Popen(all_args, stdout=subprocess.PIPE, close_fds=True) output, errors = p.communicate() if plist: - results = biplist.readPlistFromString(output) + results = plist_from_bytes(output) else: results = output retcode = p.wait() @@ -103,6 +120,8 @@ def load_json(filename, settings): settings['compression_level'] = json_data.get('compression-level', None) settings['license'] = json_data.get('license', None) files = [] + hide = [] + hide_extensions = [] symlinks = {} icon_locations = {} for fileinfo in json_data.get('contents', []): @@ -123,8 +142,16 @@ def load_json(filename, settings): elif kind == 'position': pass icon_locations[name] = (fileinfo['x'], fileinfo['y']) + hide_ext = fileinfo.get('hide_extension', False) + if hide_ext: + hide_extensions.append(name) + hidden = fileinfo.get('hidden', False) + if hidden: + hide.append(name) settings['files'] = files + settings['hide_extensions'] = hide_extensions + settings['hide'] = hide settings['symlinks'] = symlinks settings['icon_locations'] = icon_locations @@ -139,6 +166,8 @@ def build_dmg(filename, volume_name, settings_file=None, settings={}, 'size': None, 'files': [], 'symlinks': {}, + 'hide': [], + 'hide_extensions': [], 'icon': None, 'badge_icon': None, 'background': None, @@ -258,7 +287,7 @@ def build_dmg(filename, volume_name, settings_file=None, settings={}, } background = options['background'] - + columns = { 'name': 'name', 'date-modified': 'dateModified', @@ -297,7 +326,7 @@ def build_dmg(filename, volume_name, settings_file=None, settings={}, 'version': 'ascending', 'comments': 'ascending', } - + lsvp = { 'viewOptionsVersion': 1, 'sortColumn': columns.get(options['list_sort_by'], 'name'), @@ -319,7 +348,7 @@ def build_dmg(filename, volume_name, settings_file=None, settings={}, default_widths[column]) asc = 'ascending' == options['list_column_sort_directions'].get(column, default_sort_directions[column]) - + lsvp['columns'][columns[column]] = { 'index': n, 'width': width, @@ -334,7 +363,7 @@ def build_dmg(filename, volume_name, settings_file=None, settings={}, cndx[k] = n width = default_widths[k] asc = 'ascending' == default_sort_directions[k] - + lsvp['columns'][columns[column]] = { 'index': n, 'width': width, @@ -344,7 +373,7 @@ def build_dmg(filename, volume_name, settings_file=None, settings={}, } n += 1 - + default_view = options['default_view'] views = { 'icon-view': b'icnv', @@ -411,11 +440,19 @@ def build_dmg(filename, volume_name, settings_file=None, settings={}, if ret: raise DMGError('Unable to create disk image') - ret, output = hdiutil('attach', - '-nobrowse', - '-owners', 'off', - '-noidme', - writableFile.name) + # IDME was deprecated in macOS 10.15/Catalina; as a result, use of -noidme + # started raising a warning. + if MACOS_VERSION >= (10, 15): + ret, output = hdiutil('attach', + '-nobrowse', + '-owners', 'off', + writableFile.name) + else: + ret, output = hdiutil('attach', + '-nobrowse', + '-owners', 'off', + '-noidme', + writableFile.name) if ret: raise DMGError('Unable to attach disk image') @@ -506,7 +543,7 @@ def build_dmg(filename, volume_name, settings_file=None, settings={}, background_bmk = Bookmark.for_file(path_in_image) icvp['backgroundType'] = 2 - icvp['backgroundImageAlias'] = biplist.Data(alias.to_bytes()) + icvp['backgroundImageAlias'] = plist_bytes(alias.to_bytes()) for f in options['files']: if isinstance(f, tuple): @@ -523,6 +560,22 @@ def build_dmg(filename, volume_name, settings_file=None, settings={}, name_in_image = os.path.join(mount_point, name) os.symlink(target, name_in_image) + to_hide = [] + for name in options['hide_extensions']: + name_in_image = os.path.join(mount_point, name) + to_hide.append(name_in_image) + + if to_hide: + subprocess.call(['/usr/bin/SetFile', '-a', 'E'] + to_hide) + + to_hide = [] + for name in options['hide']: + name_in_image = os.path.join(mount_point, name) + to_hide.append(name_in_image) + + if to_hide: + subprocess.call(['/usr/bin/SetFile', '-a', 'V'] + to_hide) + userfn = options.get('create_hook', None) if callable(userfn): userfn(mount_point, options) -- cgit v1.2.3