summaryrefslogtreecommitdiffstats
path: root/Mac/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/scripts')
-rw-r--r--Mac/scripts/BuildApplet.icnsbin120107 -> 0 bytes
-rw-r--r--Mac/scripts/BuildApplet.plist55
-rw-r--r--Mac/scripts/BuildApplet.py149
-rw-r--r--Mac/scripts/BuildApplet.rsrcbin3169 -> 0 bytes
-rw-r--r--Mac/scripts/buildpkg.py484
-rw-r--r--Mac/scripts/zappycfiles.py36
6 files changed, 0 insertions, 724 deletions
diff --git a/Mac/scripts/BuildApplet.icns b/Mac/scripts/BuildApplet.icns
deleted file mode 100644
index ea0214c..0000000
--- a/Mac/scripts/BuildApplet.icns
+++ /dev/null
Binary files differ
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
deleted file mode 100644
index edabc61..0000000
--- a/Mac/scripts/BuildApplet.rsrc
+++ /dev/null
Binary files differ
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()