Index: sitescripts/extensions/bin/createNightlies.py |
=================================================================== |
--- a/sitescripts/extensions/bin/createNightlies.py |
+++ b/sitescripts/extensions/bin/createNightlies.py |
@@ -15,8 +15,9 @@ |
""" |
import sys, os, os.path, subprocess, ConfigParser, traceback, json, hashlib |
-import tempfile, re, shutil, urlparse |
+import tempfile, re, shutil, urlparse, pipes |
from datetime import datetime |
+from xml.dom.minidom import parse as parseXml |
from sitescripts.utils import get_config, setupStderr, get_template |
from sitescripts.extensions.utils import compareVersions, Configuration |
import buildtools.packager as packager |
@@ -117,6 +118,24 @@ |
minVersion, maxVersion = metadata.get('compat', key).split('/') |
self.compat.append({'id': value, 'minVersion': minVersion, 'maxVersion': maxVersion}) |
+ def readAndroidMetadata(self): |
+ """ |
+ Read Android-specific metadata from AndroidManifest.xml file. |
+ """ |
+ manifestFile = open(os.path.join(self.tempdir, 'AndroidManifest.xml'), 'r') |
+ manifest = parseXml(manifestFile) |
+ manifestFile.close() |
+ |
+ root = manifest.documentElement |
+ self.version = root.attributes["android:versionName"].value |
+ while self.version.count('.') < 2: |
+ self.version += '.0' |
+ self.version = '%s.%s' % (self.version, self.revision) |
+ |
+ usesSdk = manifest.getElementsByTagName('uses-sdk')[0] |
+ self.minSdkVersion = usesSdk.attributes["android:minSdkVersion"].value |
+ self.basename = os.path.basename(self.config.repository) |
+ |
def readChromeMetadata(self): |
""" |
Read Chrome-specific metadata from manifest.json file. It will also |
@@ -157,12 +176,15 @@ |
baseDir = os.path.join(self.config.nightliesDirectory, self.basename) |
if not os.path.exists(baseDir): |
os.makedirs(baseDir) |
- if self.config.type != 'chrome': |
+ if self.config.type == 'chrome': |
+ manifestPath = os.path.join(baseDir, "updates.xml") |
+ templateName = 'chromeUpdateManifest' |
+ elif self.config.type == 'android': |
+ manifestPath = os.path.join(baseDir, "updates.xml") |
+ templateName = 'androidUpdateManifest' |
+ else: |
manifestPath = os.path.join(baseDir, "update.rdf") |
templateName = 'geckoUpdateManifest' |
- else: |
- manifestPath = os.path.join(baseDir, "updates.xml") |
- templateName = 'chromeUpdateManifest' |
template = get_template(get_config().get('extensions', templateName)) |
template.stream({'extensions': [self]}).dump(manifestPath) |
@@ -178,13 +200,29 @@ |
outputPath = os.path.join(baseDir, outputFile) |
self.updateURL = urlparse.urljoin(self.config.nightliesURL, self.basename + '/' + outputFile + '?update') |
- if self.config.type != 'chrome': |
- packager.createBuild(self.tempdir, outFile=outputPath, buildNum=self.revision, keyFile=self.config.keyFile) |
- else: |
+ if self.config.type == 'android': |
+ apkFile = open(outputPath, 'wb') |
+ try: |
+ port = get_config().get('extensions', 'androidBuildPort') |
+ except ConfigParser.NoOptionError: |
+ port = '22' |
+ buildCommand = ['ssh', '-p', port, get_config().get('extensions', 'androidBuildHost')] |
+ buildCommand += map(pipes.quote, ['/home/android/bin/makedebugbuild.py', '--revision', self.revision, '--version', self.version, '--stdout']) |
+ process = subprocess.Popen(buildCommand, stdout=apkFile, stderr=None) |
+ status = process.wait() |
+ apkFile.close() |
+ if status: |
+ # clear broken output if any |
+ # exception will be raised later |
+ if os.path.exists(outputPath): |
+ os.remove(outputPath) |
+ elif self.config.type == 'chrome': |
buildCommand = ['python', os.path.join(self.tempdir, 'build.py'), '-k', self.config.keyFile, '-b', self.revision, outputPath] |
if self.config.experimental: |
buildCommand[-1:0] = ['--experimental'] |
subprocess.Popen(buildCommand, stdout=subprocess.PIPE).communicate() |
+ else: |
+ packager.createBuild(self.tempdir, outFile=outputPath, buildNum=self.revision, keyFile=self.config.keyFile) |
if not os.path.exists(outputPath): |
raise Exception("Build failed, output file hasn't been created") |
@@ -275,10 +313,12 @@ |
self.copyRepository() |
# get meta data from the repository |
- if self.config.type != 'chrome': |
+ if self.config.type == 'android': |
+ self.readAndroidMetadata() |
+ elif self.config.type == 'chrome': |
+ self.readChromeMetadata() |
+ else: |
self.readMetadata() |
- else: |
- self.readChromeMetadata() |
# create development build |
self.build() |