diff --git a/osx/DmgImageInstallBackground.png b/osx/DmgImageInstallBackground.png old mode 100755 new mode 100644 diff --git a/osx/Makefile b/osx/Makefile deleted file mode 100644 index 738a27a..0000000 --- a/osx/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -all: - python build.py -c openlp.cfg - -view: - python build.py -c openlp.cfg --package-view --compress-view - -package: - - python build.py -c openlp.cfg --package --package-view - -bundle: - - python build.py -c openlp.cfg --compress --compress-view - -clean: - # remove old configuration files - rm -f openlp.spec - rm -f Info.plist - rm -f .version - - # remove old build artifacts - rm -rf build - rm -rf dist - rm -rf Macopenlp.app - rm -rf OpenLP.app - rm -f warnopenlp.txt - rm -f *dmg - diff --git a/osx/applescript-adjustview-10-6.master b/osx/applescript-adjust-dmg-view.master similarity index 56% rename from osx/applescript-adjustview-10-6.master rename to osx/applescript-adjust-dmg-view.master index 1708425..abd8b7e 100755 --- a/osx/applescript-adjustview-10-6.master +++ b/osx/applescript-adjust-dmg-view.master @@ -1,43 +1,6 @@ -on saveImageWithItselfAsIcon(icon_image_file) - -- save icon_image_file with itself as icon - set icon_image_file_string to icon_image_file as string - tell application "Image Events" - launch - set icon_image to open file icon_image_file_string - save icon_image with icon - close icon_image - end tell -end saveImageWithItselfAsIcon - -on copyIconOfTo(aFileOrFolderWithIcon, aFileOrFolder) - tell application "Finder" to set f to aFileOrFolderWithIcon as alias - -- grab the file's icon - my CopyOrPaste(f, "c") - -- now the icon is in the clipboard - tell application "Finder" to set c to aFileOrFolder as alias - my CopyOrPaste(result, "v") -end copyIconOfTo - -on CopyOrPaste(i, cv) - tell application "Finder" - activate - set infoWindow to open information window of i - set infoWindowName to name of infoWindow - end tell - tell application "System Events" to tell process "Finder" to tell window infoWindowName - keystroke tab -- select icon button - keystroke (cv & "w") using command down (* (copy or paste) + close window *) - end tell -- window 1 then process Finder then System Events -end CopyOrPaste - on run - set icon_image_file to POSIX file "%s" as alias - set dmg_file to POSIX file "/Volumes/%s" as alias - - my saveImageWithItselfAsIcon(icon_image_file) -- wait for virus scanner delay 2 - my copyIconOfTo(icon_image_file, dmg_file) tell application "Finder" tell disk "%s" diff --git a/osx/applescript-adjustview-10-5.master b/osx/applescript-adjustview-10-5.master deleted file mode 100755 index 19be239..0000000 --- a/osx/applescript-adjustview-10-5.master +++ /dev/null @@ -1,74 +0,0 @@ -on saveImageWithItselfAsIcon(icon_image_file) - -- save icon_image_file with itself as icon - set icon_image_file_string to icon_image_file as string - tell application "Image Events" - launch - set icon_image to open file icon_image_file_string - save icon_image with icon - close icon_image - end tell -end saveImageWithItselfAsIcon - -on copyIconOfTo(aFileOrFolderWithIcon, aFileOrFolder) - tell application "Finder" to set f to aFileOrFolderWithIcon as alias - -- grab the file's icon - my CopyOrPaste(f, "c") - -- now the icon is in the clipboard - tell application "Finder" to set c to aFileOrFolder as alias - my CopyOrPaste(result, "v") -end copyIconOfTo - -on CopyOrPaste(i, cv) - tell application "Finder" - activate - open information window of i - end tell - tell application "System Events" to tell process "Finder" to tell window 1 - keystroke tab -- select icon button - keystroke (cv & "w") using command down (* (copy or paste) + close window *) - end tell -- window 1 then process Finder then System Events -end CopyOrPaste - -on run - set icon_image_file to POSIX file "%s" as alias - set dmg_file to POSIX file "/Volumes/%s" as alias - - my saveImageWithItselfAsIcon(icon_image_file) - -- wait for virus scanner - delay 2 - my copyIconOfTo(icon_image_file, dmg_file) - - tell application "Finder" - tell disk "%s" - open - set current view of container window to icon view - set toolbar visible of container window to false - set statusbar visible of container window to false - set the bounds of container window to {400, 100, 1100, 500} - set theViewOptions to the icon view options of container window - set arrangement of theViewOptions to not arranged - set icon size of theViewOptions to 128 - set background picture of theViewOptions to file ".background:installer-background.png" - if not exists file "Applications" then - make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"} - end if - delay 5 - set position of item "%s" of container window to {160, 200} - set position of item ".Trashes" of container window to {100, 500} - set position of item ".installer-background.png" of container window to {200, 500} - set position of item ".DS_Store" of container window to {400, 500} - set position of item "Applications" of container window to {550, 200} - set position of item ".VolumeIcon.icns" of container window to {500, 500} - set position of item ".fseventsd" of container window to {300, 500} - if exists POSIX file ".SymAVx86QSFile" then - set position of item ".SymAVx86QSFile" of container window to {600, 500} - end if - open - close - update without registering applications - -- wait until the virus scan completes - delay 5 - -- eject - end tell - end tell -end run diff --git a/osx/applescript-seticon-10-5.master b/osx/applescript-seticon-10-5.master deleted file mode 100755 index 738c4b8..0000000 --- a/osx/applescript-seticon-10-5.master +++ /dev/null @@ -1,40 +0,0 @@ -on saveImageWithItselfAsIcon(icon_image_file) - -- save icon_image_file with itself as icon - set icon_image_file_string to icon_image_file as string - tell application "Image Events" - launch - set icon_image to open file icon_image_file_string - save icon_image with icon - close icon_image - end tell -end saveImageWithItselfAsIcon - -on copyIconOfTo(aFileOrFolderWithIcon, aFileOrFolder) - tell application "Finder" to set f to aFileOrFolderWithIcon as alias - -- grab the file's icon - my CopyOrPaste(f, "c") - -- now the icon is in the clipboard - tell application "Finder" to set c to aFileOrFolder as alias - my CopyOrPaste(result, "v") -end copyIconOfTo - -on CopyOrPaste(i, cv) - tell application "Finder" - activate - open information window of i - end tell - tell application "System Events" to tell process "Finder" to tell window 1 - keystroke tab -- select icon button - keystroke (cv & "w") using command down (* (copy or paste) + close window *) - end tell -- window 1 then process Finder then System Events -end CopyOrPaste - -on run - set icon_image_file to POSIX file "%s" as alias - set dmg_file to POSIX file "%s" as alias - - my saveImageWithItselfAsIcon(icon_image_file) - -- wait for virus scanner - delay 2 - my copyIconOfTo(icon_image_file, dmg_file) -end run diff --git a/osx/applescript-seticon-10-6.master b/osx/applescript-seticon-10-6.master deleted file mode 100755 index 849f023..0000000 --- a/osx/applescript-seticon-10-6.master +++ /dev/null @@ -1,41 +0,0 @@ -on saveImageWithItselfAsIcon(icon_image_file) - -- save icon_image_file with itself as icon - set icon_image_file_string to icon_image_file as string - tell application "Image Events" - launch - set icon_image to open file icon_image_file_string - save icon_image with icon - close icon_image - end tell -end saveImageWithItselfAsIcon - -on copyIconOfTo(aFileOrFolderWithIcon, aFileOrFolder) - tell application "Finder" to set f to aFileOrFolderWithIcon as alias - -- grab the file's icon - my CopyOrPaste(f, "c") - -- now the icon is in the clipboard - tell application "Finder" to set c to aFileOrFolder as alias - my CopyOrPaste(result, "v") -end copyIconOfTo - -on CopyOrPaste(i, cv) - tell application "Finder" - activate - set infoWindow to open information window of i - set infoWindowName to name of infoWindow - end tell - tell application "System Events" to tell process "Finder" to tell window infoWindowName - keystroke tab -- select icon button - keystroke (cv & "w") using command down (* (copy or paste) + close window *) - end tell -- window 1 then process Finder then System Events -end CopyOrPaste - -on run - set icon_image_file to POSIX file "%s" as alias - set dmg_file to POSIX file "%s" as alias - - my saveImageWithItselfAsIcon(icon_image_file) - -- wait for virus scanner - delay 2 - my copyIconOfTo(icon_image_file, dmg_file) -end run diff --git a/osx/config.ini.default b/osx/config.ini.default index 0fc6792..4445e64 100644 --- a/osx/config.ini.default +++ b/osx/config.ini.default @@ -1,6 +1,6 @@ [executables] sphinx = sphinx-build -pyinstaller = %(here)s/../pyinstaller/pyinstaller.py +pyinstaller = %(projects)s/pyinstaller/pyinstaller.py lrelease = lrelease diskutil = diskutil hdiutil = hdiutil diff --git a/osx/macosx-builder.py b/osx/macosx-builder.py index 5179e9a..3b8a16e 100644 --- a/osx/macosx-builder.py +++ b/osx/macosx-builder.py @@ -205,14 +205,13 @@ class MacosxBuilder(object): """ parser = ArgumentParser() parser.add_argument('-b', '--branch', metavar='BRANCH', dest='branch', - help='Specify the path to the branch you wish to build.', - default='../trunk') + help='Specify the path to the branch you wish to build.') parser.add_argument('--devel', dest='devel', action='store_true', default=False, help='Development build does not have set icons for .dmg file ' 'and .dmg filename contains bzr revision number.') parser.add_argument('-d', '--documentation', metavar='DOCS', - dest='docs', default=os.path.join('..', 'documentation'), + dest='docs', help='Specify the path to the documentation branch.') parser.add_argument('-c', '--config', metavar='CONFIG', dest='config', help='Specify the path to the configuration file.', @@ -226,6 +225,10 @@ class MacosxBuilder(object): parser.add_argument('--transifex', dest='update_translations', action='store_true', default=False, help='Update the language translation from Transifex.') + parser.add_argument('--transifex-user', + dest='transifex_user', help='Transifex username.') + parser.add_argument('--transifex-pass', + dest='transifex_pass', help='Transifex password.') parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', default=False, help='Print out additional information.') @@ -236,7 +239,9 @@ class MacosxBuilder(object): Read the configuration from the configuration file. """ self.config = ConfigParser(defaults={ - u'here': self.script_path + u'here': self.script_path, + u'projects': os.path.abspath(os.path.join(self.script_path, + '..', '..')), }) self.config.read(os.path.abspath(self.args.config)) @@ -264,18 +269,16 @@ class MacosxBuilder(object): Set up a variety of paths that we use throughout the build process. """ if self.args.branch: - branch_path = self.args.branch + self.branch_path = os.path.abspath(self.args.branch) else: - branch_path = self.config.get(u'paths', u'branch') - self.branch_path = os.path.abspath(branch_path) + self.branch_path = self.config.get(u'paths', u'branch') if self.args.docs: - docs_path = self.args.docs + self.docs_path = os.path.abspath(self.args.docs) else: - docs_path = self.config.get(u'paths', u'documentation') - self.docs_path = os.path.abspath(docs_path) + self.docs_path = self.config.get(u'paths', u'documentation') self.openlp_script = os.path.abspath( - os.path.join(branch_path, u'openlp.pyw')) + os.path.join(self.branch_path, u'openlp.pyw')) self.hooks_path = os.path.abspath(os.path.join( self.branch_path, self.config.get(u'paths', u'hooks'))) self.mac_icon = os.path.abspath( @@ -371,11 +374,10 @@ class MacosxBuilder(object): raise Exception(u'Error running bzr log') output_ascii = unicode(output, errors=u'ignore') latest = output_ascii.split(u':')[0] - version_string = latest == revision and tag or \ - u'%s-bzr%s' % (tag, latest) - self.version_string = version_string + self.version_string = u'%s-bzr%s' % (tag, latest) + self.version_tag = tag version_file = open(os.path.join(self.dist_path, u'.version'), u'w') - version_file.write(version_string) + version_file.write(self.version_string) version_file.close() def copy_plugins(self): @@ -450,8 +452,14 @@ class MacosxBuilder(object): raise Exception(u'No option named "username" found.') if not self.config.has_option('transifex', 'password'): raise Exception(u'No option named "password" found.') - username = self.config.get(u'transifex', u'username') - password = self.config.get(u'transifex', u'password') + if self.args.transifex_user: + username = self.args.transifex_user + else: + username = self.config.get(u'transifex', u'username') + if self.args.transifex_pass: + password = self.args.transifex_pass + else: + password = self.config.get(u'transifex', u'password') os.chdir(os.path.split(self.i18n_utils)[0]) translation_utils = Popen([self.python, self.i18n_utils, u'-qdpu', u'-U', username, u'-P', password]) @@ -513,7 +521,12 @@ class MacosxBuilder(object): """ self._print(u'Creating dmg file...') - dmg_name = 'OpenLP-' + self.version_string + '.dmg' + # Release version does not contain revision in .dmg name. + if self.args.devel: + dmg_name = 'OpenLP-' + self.version_string + '.dmg' + else: + dmg_name = 'OpenLP-' + self.version_tag + '.dmg' + dmg_file = os.path.join(self.branch_path, 'build', dmg_name) # Remove dmg if it exists. if os.path.exists(dmg_file): @@ -548,13 +561,33 @@ class MacosxBuilder(object): u'Could not copy app bundle, dmg creation failed.' ) - self._print('... Copying the background image.') - os.mkdir(os.path.join(dmg_volume_path, '.background')) - self._run_command(['cp', self.dmg_background_img, - os.path.join(dmg_volume_path, - '.background/installer-background.png')], - u'Could not copy the background image, dmg creation failed.' + # Set icon for dmg file. + # http://endrift.com/blog/2010/06/14/dmg-files-volume-icons-cli/ + self._print('... Setting the dmg icon.') + dmg_icon = os.path.join(dmg_volume_path, '.VolumeIcon.icns') + self._run_command(['cp', self.mac_icon, dmg_icon], + u'Could not copy the dmg icon file, dmg creation failed.' ) + # Set proper dmg icon attributes. + self._run_command(['SetFile', '-c', 'icnC', dmg_icon], + 'Could not set dmg icon attributes.') + # Ensures dmg icon will be used while mounted. + self._run_command(['SetFile', '-a', 'C', dmg_volume_path], + 'Could not set dmg icon attributes.') + + # Set dmg background. Requires running Mac OS X gui. + # TODO: better formatting and code refactoring + if not self.args.devel: + self._print('... Setting the background image.') + + os.mkdir(os.path.join(dmg_volume_path, '.background')) + self._run_command(['cp', self.dmg_background_img, + os.path.join(dmg_volume_path, + '.background/installer-background.png')], + u'Could not copy the background image, dmg creation failed.' + ) + + self.adjust_dmg_view(os.path.basename(dmg_volume_path)) # Unmount dmg file. self._print('... unmounting the dmg.') @@ -590,10 +623,23 @@ class MacosxBuilder(object): self._print('Finished creating dmg file, resulting file: %s' % compressed_dmg) - # TODO Reimplement following actions. - #adjust_package_view(settings, adjustview_scriptname) - #compress_view(settings, seticon_scriptname, dmg_file) + self.dmg_file = compressed_dmg + def adjust_dmg_view(self, dmg_volume_name): + try: + # TODO: Use only one applescript file. Remove one for osx 10.5. + f = open(os.path.join(self.script_path, + 'applescript-adjust-dmg-view.master')) + p = Popen([self.osascript], stdin=PIPE) + p.communicate(f.read() % (dmg_volume_name, 'OpenLP')) + f.close() + result = p.returncode + if (result != 0): + self._print('Adjusting dmg view failed.') + sys.exit(1) + except (IOError, OSError): + self._print('Adjusting dmg view failed.') + sys.exit(1) def main(self): """ @@ -607,7 +653,7 @@ class MacosxBuilder(object): self._print_verbose(u'Source path: .............%s', self.source_path) self._print_verbose(u'"dist.app" path: .........%s', self.dist_app_path) self._print_verbose(u'"dist" path: .............%s', self.dist_path) - self._print_verbose(u'"hooks" path: .............%s', self.hooks_path) + self._print_verbose(u'"hooks" path: ............%s', self.hooks_path) self._print_verbose(u'PyInstaller: .............%s', self.pyinstaller) self._print_verbose(u'Documentation branch path:%s', self.docs_path) self._print_verbose(u'') @@ -639,76 +685,3 @@ class MacosxBuilder(object): if __name__ == u'__main__': MacosxBuilder().main() - - - -# TODO reimplement following options. They arenecessary for release builds. -def compress_view(settings, seticon_scriptname, dmg_file): - logging.info('[%s] setting icon of the dmg file...', script_name) - try: - f = open(seticon_scriptname) - p = subp.Popen(["osascript"], stdin=subp.PIPE) - p.communicate(f.read() % ((os.getcwd() + '/' + - settings['openlp_dmg_icon_file']), dmg_file)) - f.close() - result = p.returncode - if (result != 0): - logging.error('[%s] could not set the icon to the dmg file, \ - dmg creation failed!', script_name) - sys.exit(1) - except IOError, e: - logging.error('[%s] could not adjust the view (%s), dmg creation \ - failed!', script_name, e) - sys.exit(1) - except OSError, e: - logging.error('[%s] could not set the icon to the dmg file(%s), \ - dmg creation failed!', script_name, e) - sys.exit(1) - -def adjust_package_view(settings, adjustview_scriptname): - logging.info('[%s] making adjustments to the view...', script_name) - try: - f = open(adjustview_scriptname) - p = subp.Popen(["osascript"], stdin=subp.PIPE) - p.communicate(f.read() % ((os.getcwd() + '/' + \ - settings['openlp_dmg_icon_file']), - settings['openlp_appname'], - settings['openlp_appname'], - settings['openlp_appname'])) - f.close() - result = p.returncode - if (result != 0): - logging.error('[%s] could not adjust the view, dmg creation \ - failed!', script_name) - sys.exit(1) - except IOError, e: - logging.error('[%s] could not adjust the view (%s), dmg creation \ - failed!', script_name, e) - sys.exit(1) - except OSError, e: - logging.error('[%s] could not adjust the view (%s), dmg creation \ - failed!', script_name, e) - sys.exit(1) - -def old_main(): - - version = platform.mac_ver()[0] - # we only need the differenciation between leopard and snow leopard - if version.startswith("10.6") or version.startswith("10.7"): - SNOWLEOPARD = True - logging.info('[%s] using snow leopard scripts (version = %s)', - script_name, version) - adjustview_scriptname = "applescript-adjustview-10-6.master" - seticon_scriptname = "applescript-seticon-10-6.master" - else: - SNOWLEOPARD = False - logging.info('[%s] using leopard scripts (version = %s)', script_name, - version) - adjustview_scriptname = "applescript-adjustview-10-5.master" - seticon_scriptname = "applescript-seticon-10-5.master" - - if not os.path.isfile(adjustview_scriptname) \ - or not os.path.isfile(seticon_scriptname): - logging.error('[%s] could not find apple scripts for given OS X ' - + 'version %s', script_name, version) - sys.exit(1)