diff options
Diffstat (limited to 'Mac/scripts')
-rw-r--r-- | Mac/scripts/BuildApplet.icns | bin | 120107 -> 0 bytes | |||
-rw-r--r-- | Mac/scripts/BuildApplet.plist | 55 | ||||
-rw-r--r-- | Mac/scripts/BuildApplet.py | 149 | ||||
-rw-r--r-- | Mac/scripts/BuildApplet.rsrc | bin | 3169 -> 0 bytes | |||
-rw-r--r-- | Mac/scripts/buildpkg.py | 484 | ||||
-rw-r--r-- | Mac/scripts/zappycfiles.py | 36 |
6 files changed, 0 insertions, 724 deletions
diff --git a/Mac/scripts/BuildApplet.icns b/Mac/scripts/BuildApplet.icns Binary files differdeleted file mode 100644 index ea0214c..0000000 --- a/Mac/scripts/BuildApplet.icns +++ /dev/null diff --git a/Mac/scripts/BuildApplet.plist b/Mac/scripts/BuildApplet.plist deleted file mode 100644 index 0f142c9..0000000 --- a/Mac/scripts/BuildApplet.plist +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>CFBundleDevelopmentRegion</key> - <string>English</string> - <key>CFBundleDocumentTypes</key> - <array> - <dict> - <key>CFBundleTypeExtensions</key> - <array> - <string>py</string> - </array> - <key>CFBundleTypeIconFile</key> - <string>PythonSource.icns</string> - <key>CFBundleTypeName</key> - <string>Python Module</string> - <key>CFBundleTypeOSTypes</key> - <array> - <string>TEXT</string> - </array> - <key>CFBundleTypeRole</key> - <string>Viewer</string> - </dict> - </array> - <key>CFBundleExecutable</key> - <string>BuildApplet</string> - <key>CFBundleGetInfoString</key> - <string>2.5alpha0, (c) 2004 Python Software Foundation.</string> - <key>CFBundleIconFile</key> - <string>BuildApplet.icns</string> - <key>CFBundleIdentifier</key> - <string>org.python.buildapplet</string> - <key>CFBundleInfoDictionaryVersion</key> - <string>6.0</string> - <key>CFBundleLongVersionString</key> - <string>2.5alpha0, (c) 2004 Python Software Foundation.</string> - <key>CFBundleName</key> - <string>PythonIDE</string> - <key>CFBundlePackageType</key> - <string>APPL</string> - <key>CFBundleShortVersionString</key> - <string>2.5alpha0</string> - <key>CFBundleSignature</key> - <string>Pide</string> - <key>CFBundleVersion</key> - <string>2.5alpha0</string> - <key>CSResourcesFileMapped</key> - <true/> - <key>LSRequiresCarbon</key> - <true/> - <key>NSHumanReadableCopyright</key> - <string>(c) 2004 Python Software Foundation.</string> -</dict> -</plist> diff --git a/Mac/scripts/BuildApplet.py b/Mac/scripts/BuildApplet.py deleted file mode 100644 index e1f9ea1..0000000 --- a/Mac/scripts/BuildApplet.py +++ /dev/null @@ -1,149 +0,0 @@ -"""Create an applet from a Python script. - -This puts up a dialog asking for a Python source file ('TEXT'). -The output is a file with the same name but its ".py" suffix dropped. -It is created by copying an applet template and then adding a 'PYC ' -resource named __main__ containing the compiled, marshalled script. -""" - - -import sys -sys.stdout = sys.stderr - -import os -import MacOS -import EasyDialogs -import buildtools -import getopt - -if not sys.executable.startswith(sys.exec_prefix): - # Oh, the joys of using a python script to bootstrap applicatin bundles - # sys.executable points inside the current application bundle. Because this - # path contains blanks (two of them actually) this path isn't usable on - # #! lines. Reset sys.executable to point to the embedded python interpreter - sys.executable = os.path.join(sys.prefix, - 'Resources/Python.app/Contents/MacOS/Python') - - # Just in case we're not in a framework: - if not os.path.exists(sys.executable): - sys.executable = os.path.join(sys.exec_prefix, 'bin/python') - -def main(): - try: - buildapplet() - except buildtools.BuildError as detail: - EasyDialogs.Message(detail) - - -def buildapplet(): - buildtools.DEBUG=1 - - # Find the template - # (there's no point in proceeding if we can't find it) - - template = buildtools.findtemplate() - - # Ask for source text if not specified in sys.argv[1:] - - if not sys.argv[1:]: - filename = EasyDialogs.AskFileForOpen(message='Select Python source or applet:', - typeList=('TEXT', 'APPL')) - if not filename: - return - tp, tf = os.path.split(filename) - if tf[-3:] == '.py': - tf = tf[:-3] - else: - tf = tf + '.applet' - dstfilename = EasyDialogs.AskFileForSave(message='Save application as:', - savedFileName=tf) - if not dstfilename: return - cr, tp = MacOS.GetCreatorAndType(filename) - if tp == 'APPL': - buildtools.update(template, filename, dstfilename) - else: - buildtools.process(template, filename, dstfilename, 1) - else: - - SHORTOPTS = "o:r:ne:v?PR" - LONGOPTS=("output=", "resource=", "noargv", "extra=", "verbose", "help", "python=", "destroot=") - try: - options, args = getopt.getopt(sys.argv[1:], SHORTOPTS, LONGOPTS) - except getopt.error: - usage() - if options and len(args) > 1: - sys.stderr.write("Cannot use options when specifying multiple input files") - sys.exit(1) - dstfilename = None - rsrcfilename = None - raw = 0 - extras = [] - verbose = None - destroot = '' - for opt, arg in options: - if opt in ('-o', '--output'): - dstfilename = arg - elif opt in ('-r', '--resource'): - rsrcfilename = arg - elif opt in ('-n', '--noargv'): - raw = 1 - elif opt in ('-e', '--extra'): - if ':' in arg: - arg = arg.split(':') - extras.append(arg) - elif opt in ('-P', '--python'): - # This is a very dirty trick. We set sys.executable - # so that bundlebuilder will use this in the #! line - # for the applet bootstrap. - sys.executable = arg - elif opt in ('-v', '--verbose'): - verbose = Verbose() - elif opt in ('-?', '--help'): - usage() - elif opt in ('-d', '--destroot'): - destroot = arg - # On OS9 always be verbose - if sys.platform == 'mac' and not verbose: - verbose = 'default' - # Loop over all files to be processed - for filename in args: - cr, tp = MacOS.GetCreatorAndType(filename) - if tp == 'APPL': - buildtools.update(template, filename, dstfilename) - else: - buildtools.process(template, filename, dstfilename, 1, - rsrcname=rsrcfilename, others=extras, raw=raw, - progress=verbose, destroot=destroot) - -def usage(): - print("BuildApplet creates an application from a Python source file") - print("Usage:") - print(" BuildApplet interactive, single file, no options") - print(" BuildApplet src1.py src2.py ... non-interactive multiple file") - print(" BuildApplet [options] src.py non-interactive single file") - print("Options:") - print(" --output o Output file; default based on source filename, short -o") - print(" --resource r Resource file; default based on source filename, short -r") - print(" --noargv Build applet without drag-and-drop sys.argv emulation, short -n, OSX only") - print(" --extra src[:dst] Extra file to put in .app bundle, short -e, OSX only") - print(" --verbose Verbose, short -v") - print(" --help This message, short -?") - sys.exit(1) - -class Verbose: - """This class mimics EasyDialogs.ProgressBar but prints to stderr""" - def __init__(self, *args): - if args and args[0]: - self.label(args[0]) - - def set(self, *args): - pass - - def inc(self, *args): - pass - - def label(self, str): - sys.stderr.write(str+'\n') - -if __name__ == '__main__': - main() diff --git a/Mac/scripts/BuildApplet.rsrc b/Mac/scripts/BuildApplet.rsrc Binary files differdeleted file mode 100644 index edabc61..0000000 --- a/Mac/scripts/BuildApplet.rsrc +++ /dev/null diff --git a/Mac/scripts/buildpkg.py b/Mac/scripts/buildpkg.py deleted file mode 100644 index c592588..0000000 --- a/Mac/scripts/buildpkg.py +++ /dev/null @@ -1,484 +0,0 @@ -#!/usr/bin/env python - -"""buildpkg.py -- Build OS X packages for Apple's Installer.app. - -This is an experimental command-line tool for building packages to be -installed with the Mac OS X Installer.app application. - -It is much inspired by Apple's GUI tool called PackageMaker.app, that -seems to be part of the OS X developer tools installed in the folder -/Developer/Applications. But apparently there are other free tools to -do the same thing which are also named PackageMaker like Brian Hill's -one: - - http://personalpages.tds.net/~brian_hill/packagemaker.html - -Beware of the multi-package features of Installer.app (which are not -yet supported here) that can potentially screw-up your installation -and are discussed in these articles on Stepwise: - - http://www.stepwise.com/Articles/Technical/Packages/InstallerWoes.html - http://www.stepwise.com/Articles/Technical/Packages/InstallerOnX.html - -Beside using the PackageMaker class directly, by importing it inside -another module, say, there are additional ways of using this module: -the top-level buildPackage() function provides a shortcut to the same -feature and is also called when using this module from the command- -line. - - **************************************************************** - NOTE: For now you should be able to run this even on a non-OS X - system and get something similar to a package, but without - the real archive (needs pax) and bom files (needs mkbom) - inside! This is only for providing a chance for testing to - folks without OS X. - **************************************************************** - -TODO: - - test pre-process and post-process scripts (Python ones?) - - handle multi-volume packages (?) - - integrate into distutils (?) - -Dinu C. Gherman, -gherman@europemail.com -November 2001 - -!! USE AT YOUR OWN RISK !! -""" - -__version__ = 0.2 -__license__ = "FreeBSD" - - -import os, sys, glob, fnmatch, shutil, string, copy, getopt -from os.path import basename, dirname, join, islink, isdir, isfile - -Error = "buildpkg.Error" - -PKG_INFO_FIELDS = """\ -Title -Version -Description -DefaultLocation -DeleteWarning -NeedsAuthorization -DisableStop -UseUserMask -Application -Relocatable -Required -InstallOnly -RequiresReboot -RootVolumeOnly -LongFilenames -LibrarySubdirectory -AllowBackRev -OverwritePermissions -InstallFat\ -""" - -###################################################################### -# Helpers -###################################################################### - -# Convenience class, as suggested by /F. - -class GlobDirectoryWalker: - "A forward iterator that traverses files in a directory tree." - - def __init__(self, directory, pattern="*"): - self.stack = [directory] - self.pattern = pattern - self.files = [] - self.index = 0 - - - def __getitem__(self, index): - while 1: - try: - file = self.files[self.index] - self.index = self.index + 1 - except IndexError: - # pop next directory from stack - self.directory = self.stack.pop() - self.files = os.listdir(self.directory) - self.index = 0 - else: - # got a filename - fullname = join(self.directory, file) - if isdir(fullname) and not islink(fullname): - self.stack.append(fullname) - if fnmatch.fnmatch(file, self.pattern): - return fullname - - -###################################################################### -# The real thing -###################################################################### - -class PackageMaker: - """A class to generate packages for Mac OS X. - - This is intended to create OS X packages (with extension .pkg) - containing archives of arbitrary files that the Installer.app - will be able to handle. - - As of now, PackageMaker instances need to be created with the - title, version and description of the package to be built. - The package is built after calling the instance method - build(root, **options). It has the same name as the constructor's - title argument plus a '.pkg' extension and is located in the same - parent folder that contains the root folder. - - E.g. this will create a package folder /my/space/distutils.pkg/: - - pm = PackageMaker("distutils", "1.0.2", "Python distutils.") - pm.build("/my/space/distutils") - """ - - packageInfoDefaults = { - 'Title': None, - 'Version': None, - 'Description': '', - 'DefaultLocation': '/', - 'DeleteWarning': '', - 'NeedsAuthorization': 'NO', - 'DisableStop': 'NO', - 'UseUserMask': 'YES', - 'Application': 'NO', - 'Relocatable': 'YES', - 'Required': 'NO', - 'InstallOnly': 'NO', - 'RequiresReboot': 'NO', - 'RootVolumeOnly' : 'NO', - 'InstallFat': 'NO', - 'LongFilenames': 'YES', - 'LibrarySubdirectory': 'Standard', - 'AllowBackRev': 'YES', - 'OverwritePermissions': 'NO', - } - - - def __init__(self, title, version, desc): - "Init. with mandatory title/version/description arguments." - - info = {"Title": title, "Version": version, "Description": desc} - self.packageInfo = copy.deepcopy(self.packageInfoDefaults) - self.packageInfo.update(info) - - # variables set later - self.packageRootFolder = None - self.packageResourceFolder = None - self.sourceFolder = None - self.resourceFolder = None - - - def build(self, root, resources=None, **options): - """Create a package for some given root folder. - - With no 'resources' argument set it is assumed to be the same - as the root directory. Option items replace the default ones - in the package info. - """ - - # set folder attributes - self.sourceFolder = root - if resources is None: - self.resourceFolder = root - else: - self.resourceFolder = resources - - # replace default option settings with user ones if provided - fields = self. packageInfoDefaults.keys() - for k, v in options.items(): - if k in fields: - self.packageInfo[k] = v - elif not k in ["OutputDir"]: - raise Error("Unknown package option: %s" % k) - - # Check where we should leave the output. Default is current directory - outputdir = options.get("OutputDir", os.getcwd()) - packageName = self.packageInfo["Title"] - self.PackageRootFolder = os.path.join(outputdir, packageName + ".pkg") - - # do what needs to be done - self._makeFolders() - self._addInfo() - self._addBom() - self._addArchive() - self._addResources() - self._addSizes() - self._addLoc() - - - def _makeFolders(self): - "Create package folder structure." - - # Not sure if the package name should contain the version or not... - # packageName = "%s-%s" % (self.packageInfo["Title"], - # self.packageInfo["Version"]) # ?? - - contFolder = join(self.PackageRootFolder, "Contents") - self.packageResourceFolder = join(contFolder, "Resources") - os.mkdir(self.PackageRootFolder) - os.mkdir(contFolder) - os.mkdir(self.packageResourceFolder) - - def _addInfo(self): - "Write .info file containing installing options." - - # Not sure if options in PKG_INFO_FIELDS are complete... - - info = "" - for f in string.split(PKG_INFO_FIELDS, "\n"): - if self.packageInfo.has_key(f): - info = info + "%s %%(%s)s\n" % (f, f) - info = info % self.packageInfo - base = self.packageInfo["Title"] + ".info" - path = join(self.packageResourceFolder, base) - f = open(path, "w") - f.write(info) - - - def _addBom(self): - "Write .bom file containing 'Bill of Materials'." - - # Currently ignores if the 'mkbom' tool is not available. - - try: - base = self.packageInfo["Title"] + ".bom" - bomPath = join(self.packageResourceFolder, base) - cmd = "mkbom %s %s" % (self.sourceFolder, bomPath) - res = os.system(cmd) - except: - pass - - - def _addArchive(self): - "Write .pax.gz file, a compressed archive using pax/gzip." - - # Currently ignores if the 'pax' tool is not available. - - cwd = os.getcwd() - - # create archive - os.chdir(self.sourceFolder) - base = basename(self.packageInfo["Title"]) + ".pax" - self.archPath = join(self.packageResourceFolder, base) - cmd = "pax -w -f %s %s" % (self.archPath, ".") - res = os.system(cmd) - - # compress archive - cmd = "gzip %s" % self.archPath - res = os.system(cmd) - os.chdir(cwd) - - - def _addResources(self): - "Add Welcome/ReadMe/License files, .lproj folders and scripts." - - # Currently we just copy everything that matches the allowed - # filenames. So, it's left to Installer.app to deal with the - # same file available in multiple formats... - - if not self.resourceFolder: - return - - # find candidate resource files (txt html rtf rtfd/ or lproj/) - allFiles = [] - for pat in string.split("*.txt *.html *.rtf *.rtfd *.lproj", " "): - pattern = join(self.resourceFolder, pat) - allFiles = allFiles + glob.glob(pattern) - - # find pre-process and post-process scripts - # naming convention: packageName.{pre,post}_{upgrade,install} - # Alternatively the filenames can be {pre,post}_{upgrade,install} - # in which case we prepend the package name - packageName = self.packageInfo["Title"] - for pat in ("*upgrade", "*install", "*flight"): - pattern = join(self.resourceFolder, packageName + pat) - pattern2 = join(self.resourceFolder, pat) - allFiles = allFiles + glob.glob(pattern) - allFiles = allFiles + glob.glob(pattern2) - - # check name patterns - files = [] - for f in allFiles: - for s in ("Welcome", "License", "ReadMe"): - if string.find(basename(f), s) == 0: - files.append((f, f)) - if f[-6:] == ".lproj": - files.append((f, f)) - elif basename(f) in ["pre_upgrade", "pre_install", "post_upgrade", "post_install"]: - files.append((f, packageName+"."+basename(f))) - elif basename(f) in ["preflight", "postflight"]: - files.append((f, f)) - elif f[-8:] == "_upgrade": - files.append((f,f)) - elif f[-8:] == "_install": - files.append((f,f)) - - # copy files - for src, dst in files: - src = basename(src) - dst = basename(dst) - f = join(self.resourceFolder, src) - if isfile(f): - shutil.copy(f, os.path.join(self.packageResourceFolder, dst)) - elif isdir(f): - # special case for .rtfd and .lproj folders... - d = join(self.packageResourceFolder, dst) - os.mkdir(d) - files = GlobDirectoryWalker(f) - for file in files: - shutil.copy(file, d) - - - def _addSizes(self): - "Write .sizes file with info about number and size of files." - - # Not sure if this is correct, but 'installedSize' and - # 'zippedSize' are now in Bytes. Maybe blocks are needed? - # Well, Installer.app doesn't seem to care anyway, saying - # the installation needs 100+ MB... - - numFiles = 0 - installedSize = 0 - zippedSize = 0 - - files = GlobDirectoryWalker(self.sourceFolder) - for f in files: - numFiles = numFiles + 1 - installedSize = installedSize + os.lstat(f)[6] - - try: - zippedSize = os.stat(self.archPath+ ".gz")[6] - except OSError: # ignore error - pass - base = self.packageInfo["Title"] + ".sizes" - f = open(join(self.packageResourceFolder, base), "w") - format = "NumFiles %d\nInstalledSize %d\nCompressedSize %d\n" - f.write(format % (numFiles, installedSize, zippedSize)) - - def _addLoc(self): - "Write .loc file." - base = self.packageInfo["Title"] + ".loc" - f = open(join(self.packageResourceFolder, base), "w") - f.write('/') - -# Shortcut function interface - -def buildPackage(*args, **options): - "A Shortcut function for building a package." - - o = options - title, version, desc = o["Title"], o["Version"], o["Description"] - pm = PackageMaker(title, version, desc) - pm.build(*args, **options) - - -###################################################################### -# Tests -###################################################################### - -def test0(): - "Vanilla test for the distutils distribution." - - pm = PackageMaker("distutils2", "1.0.2", "Python distutils package.") - pm.build("/Users/dinu/Desktop/distutils2") - - -def test1(): - "Test for the reportlab distribution with modified options." - - pm = PackageMaker("reportlab", "1.10", - "ReportLab's Open Source PDF toolkit.") - pm.build(root="/Users/dinu/Desktop/reportlab", - DefaultLocation="/Applications/ReportLab", - Relocatable="YES") - -def test2(): - "Shortcut test for the reportlab distribution with modified options." - - buildPackage( - "/Users/dinu/Desktop/reportlab", - Title="reportlab", - Version="1.10", - Description="ReportLab's Open Source PDF toolkit.", - DefaultLocation="/Applications/ReportLab", - Relocatable="YES") - - -###################################################################### -# Command-line interface -###################################################################### - -def printUsage(): - "Print usage message." - - format = "Usage: %s <opts1> [<opts2>] <root> [<resources>]" - print(format % basename(sys.argv[0])) - print() - print(" with arguments:") - print(" (mandatory) root: the package root folder") - print(" (optional) resources: the package resources folder") - print() - print(" and options:") - print(" (mandatory) opts1:") - mandatoryKeys = string.split("Title Version Description", " ") - for k in mandatoryKeys: - print(" --%s" % k) - print(" (optional) opts2: (with default values)") - - pmDefaults = PackageMaker.packageInfoDefaults - optionalKeys = pmDefaults.keys() - for k in mandatoryKeys: - optionalKeys.remove(k) - optionalKeys.sort() - maxKeyLen = max(map(len, optionalKeys)) - for k in optionalKeys: - format = " --%%s:%s %%s" - format = format % (" " * (maxKeyLen-len(k))) - print(format % (k, repr(pmDefaults[k]))) - - -def main(): - "Command-line interface." - - shortOpts = "" - keys = PackageMaker.packageInfoDefaults.keys() - longOpts = map(lambda k: k+"=", keys) - - try: - opts, args = getopt.getopt(sys.argv[1:], shortOpts, longOpts) - except getopt.GetoptError as details: - print(details) - printUsage() - return - - optsDict = {} - for k, v in opts: - optsDict[k[2:]] = v - - ok = optsDict.keys() - if not (1 <= len(args) <= 2): - print("No argument given!") - elif not ("Title" in ok and \ - "Version" in ok and \ - "Description" in ok): - print("Missing mandatory option!") - else: - buildPackage(*args, **optsDict) - return - - printUsage() - - # sample use: - # buildpkg.py --Title=distutils \ - # --Version=1.0.2 \ - # --Description="Python distutils package." \ - # /Users/dinu/Desktop/distutils - - -if __name__ == "__main__": - main() diff --git a/Mac/scripts/zappycfiles.py b/Mac/scripts/zappycfiles.py deleted file mode 100644 index b377e0d..0000000 --- a/Mac/scripts/zappycfiles.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/local/bin/python -"""Recursively zap all .pyc and .pyo files""" -import os -import sys - -# set doit true to actually delete files -# set doit false to just print what would be deleted -doit = 1 - -def main(): - if not sys.argv[1:]: - if os.name == 'mac': - import EasyDialogs - dir = EasyDialogs.AskFolder(message='Directory to zap pyc files in') - if not dir: - sys.exit(0) - zappyc(dir) - else: - print('Usage: zappyc dir ...') - sys.exit(1) - for dir in sys.argv[1:]: - zappyc(dir) - -def zappyc(dir): - os.walk(dir, walker, None) - -def walker(dummy, top, names): - for name in names: - if name[-4:] in ('.pyc', '.pyo'): - path = os.path.join(top, name) - print('Zapping', path) - if doit: - os.unlink(path) - -if __name__ == '__main__': - main() |