update.rdf files

This commit is contained in:
David Rose 2009-11-21 19:06:07 +00:00
parent a0c7fe7a81
commit 82f49bb352
2 changed files with 63 additions and 10 deletions

View File

@ -9,6 +9,11 @@ import zipfile
from optparse import OptionParser
import subprocess
try:
from hashlib import sha1 as sha
except ImportError:
from sha import sha
usage = """
This command creates a graphical installer for the
Panda3D plugin and runtime environment.
@ -60,8 +65,8 @@ parser.add_option('', '--mssdk', dest = 'mssdk',
default = None)
parser.add_option('-i', '--plugin_root', dest = 'plugin_root',
help = 'The root of a directory hierarchy in which the Firefox plugins for various platforms can be found, to build a Firefox xpi file. This is normally the same as the staging directory populated by the -i parameter to ppackage. This directory should contain a directory called "plugin", which contains in turn a number of directories named for the platform, by the Panda plugin convention, e.g. linux_i386, osx_ppc, and so on. Each platform directory should contain a Firefox plugin, e.g. nppanda3d.so.')
parser.add_option('', '--update_url', dest = 'update_url',
help = "The URL for the Firefox XPI file's updateURL specification. Optional.")
parser.add_option('', '--host_url', dest = 'host_url',
help = "The URL at which plugin_root will be hosted. This is used to construct the update URL for the xpi file. This is required if you specify --plugin_root.")
(options, args) = parser.parse_args()
@ -101,15 +106,47 @@ install_rdf = """<?xml version="1.0"?>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>3.0</em:minVersion>
<em:maxVersion>3.*</em:maxVersion>
<em:maxVersion>*</em:maxVersion>
</Description>
</em:targetApplication>
<em:homepageURL>http://www.panda3d.org/</em:homepageURL>
%(updateURL)s
<em:updateURL>%(host_url)s/plugin/firefox/nppanda3d.rdf</em:updateURL>
</Description>
</RDF>
"""
##############################################################################
#
# This update.rdf file is used when building a Firefox XPI file.
#
##############################################################################
update_rdf = """<?xml version="1.0"?>
<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<RDF:Description about="urn:mozilla:item:%(package_id)s">
<em:updates>
<RDF:Seq>
<RDF:li>
<RDF:Description>
<em:version>%(version)s</em:version>
<em:targetApplication>
<RDF:Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>3.0</em:minVersion>
<em:maxVersion>*</em:maxVersion>
<em:updateLink>%(host_url)s/plugin/firefox/nppanda3d.xpi</em:updateLink>
<em:updateHash>sha1:%(xpi_hash)s</em:updateHash>
</em:targetApplication>
</RDF:Description>
</RDF:li>
</RDF:Seq>
</em:updates>
</RDF:Description>
</RDF:RDF>
"""
##############################################################################
#
# This Info.plist file is used only for the OSX 10.4 version of packagemaker.
@ -344,6 +381,10 @@ def makeXpiFile():
""" Creates a Firefox XPI file, based on the various platform
version files. """
if not options.host_url:
print "Cannot generate xpi file without --host-url."
sys.exit(1)
print "Generating xpi file"
root = options.plugin_root
if os.path.isdir(os.path.join(root, 'plugin')):
@ -353,16 +394,12 @@ def makeXpiFile():
package_id = 'runtime@panda3d.org' #TODO: maybe more customizable?
updateURL = ''
if options.update_url:
updateURL = '<em:updateURL>%s</em:updateURL>' % (options.update_url)
tempFile = tempfile.mktemp('.txt', 'p3d_')
rdf = open(tempFile, 'w')
rdf.write(install_rdf % {
'package_id' : package_id,
'version' : options.version,
'updateURL' : updateURL,
'host_url' : options.host_url,
})
rdf.close()
xpi.write(tempFile, 'install.rdf')
@ -386,6 +423,21 @@ def makeXpiFile():
addZipTree(xpi, os.path.join(path, pluginFilename),
pluginsXpiDir + '/' + pluginFilename)
xpi.close()
# Now that we've generated the xpi file, get its hash.
data = open('nppanda3d.xpi', 'rb').read()
xpi_hash = sha(data).hexdigest()
# And now we can generate the update.rdf file.
update = open('update.rdf', 'w')
update.write(update_rdf % {
'package_id' : package_id,
'version' : options.version,
'host_url' : options.host_url,
'xpi_hash' : xpi_hash,
})
update.close()
def addZipTree(zip, sourceFile, zipName):
""" Adds the sourceFile to the zip archive at the indicated name.

View File

@ -44,7 +44,8 @@ def makeBundle(startDir):
# Generate the bundle directory structure
rootFilename = Filename(fstartDir)
bundleFilename = Filename(rootFilename, 'Panda3D.app')
shutil.rmtree(bundleFilename.toOsSpecific())
if os.path.exists(bundleFilename.toOsSpecific()):
shutil.rmtree(bundleFilename.toOsSpecific())
plistFilename = Filename(bundleFilename, 'Contents/Info.plist')
plistFilename.makeDir()