106 lines
2.9 KiB
Python
106 lines
2.9 KiB
Python
#! /usr/bin/env python
|
|
|
|
usageText = """
|
|
|
|
This script can be used to merge together the contents of two or more
|
|
separately-built stage directories, built independently via ppackage,
|
|
or via Packager.py. This script also verifies the hash, file size,
|
|
and timestamp values in the stage directory as it runs, so it can be
|
|
run on a single standalone directory just to perform this validation.
|
|
|
|
This script is actually a wrapper around Panda's PackageMerger.py.
|
|
|
|
Usage:
|
|
|
|
%(prog)s [opts] [inputdir1 .. inputdirN]
|
|
|
|
Parameters:
|
|
|
|
inputdir1 .. inputdirN
|
|
Specify the full path to the input directories you wish to merge.
|
|
These are the directories specified by -i on the previous
|
|
invocations of ppackage. The order is mostly unimportant.
|
|
|
|
Options:
|
|
|
|
-i install_dir
|
|
The full path to the final install directory. This may also
|
|
contain some pre-existing contents; if so, it is merged with all
|
|
of the input directories as well. The contents of this directory
|
|
are checked for self-consistency with regards to hashes and
|
|
timestamps.
|
|
|
|
-p packageName[,packageName...]
|
|
Specifies one or more particular packages by name that are to be
|
|
included from the input directories. Any packages not in this
|
|
list are left unchanged in the install directory, even if there
|
|
is a newer version in one of the input directories. If no
|
|
packages are named, all packages are involved. This option may
|
|
be repeated.
|
|
|
|
-h
|
|
Display this help
|
|
|
|
"""
|
|
|
|
import sys
|
|
import getopt
|
|
import os
|
|
|
|
from direct.p3d import PackageMerger
|
|
from panda3d.core import Filename
|
|
|
|
def usage(code, msg = ''):
|
|
sys.stderr.write(usageText % {'prog' : os.path.split(sys.argv[0])[1]})
|
|
sys.stderr.write(msg + '\n')
|
|
sys.exit(code)
|
|
|
|
try:
|
|
opts, args = getopt.getopt(sys.argv[1:], 'i:p:h')
|
|
except getopt.error as msg:
|
|
usage(1, msg)
|
|
|
|
installDir = None
|
|
packageNames = []
|
|
for opt, arg in opts:
|
|
if opt == '-i':
|
|
installDir = Filename.fromOsSpecific(arg)
|
|
elif opt == '-p':
|
|
packageNames += arg.split(',')
|
|
|
|
elif opt == '-h':
|
|
usage(0)
|
|
else:
|
|
print('illegal option: ' + arg)
|
|
sys.exit(1)
|
|
|
|
if not packageNames:
|
|
# No package names means allow all packages.
|
|
packageNames = None
|
|
|
|
inputDirs = []
|
|
for arg in args:
|
|
inputDirs.append(Filename.fromOsSpecific(arg))
|
|
|
|
# It's now legal to have no input files if you only want to verify
|
|
# timestamps and hashes.
|
|
## if not inputDirs:
|
|
## print "no input directories specified."
|
|
## sys.exit(1)
|
|
|
|
try:
|
|
pm = PackageMerger.PackageMerger(installDir)
|
|
for dir in inputDirs:
|
|
pm.merge(dir, packageNames = packageNames)
|
|
pm.close()
|
|
|
|
except PackageMerger.PackageMergerError:
|
|
# Just print the error message and exit gracefully.
|
|
inst = sys.exc_info()[1]
|
|
print(inst.args[0])
|
|
sys.exit(1)
|
|
|
|
|
|
# An explicit call to exit() is required to exit the program, when
|
|
# this module is packaged in a p3d file.
|
|
sys.exit(0)
|