aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/requirements.txt3
-rw-r--r--python/servo/package_commands.py122
2 files changed, 124 insertions, 1 deletions
diff --git a/python/requirements.txt b/python/requirements.txt
index 41b25ccdb5a..b96c4741b05 100644
--- a/python/requirements.txt
+++ b/python/requirements.txt
@@ -24,4 +24,7 @@ ply == 3.8
# For Cross-platform colored terminal text
colorama == 0.3.7
+# For package uploading
+boto3 == 1.4.4
+
-e python/tidy
diff --git a/python/servo/package_commands.py b/python/servo/package_commands.py
index ad842c9258a..57294f00763 100644
--- a/python/servo/package_commands.py
+++ b/python/servo/package_commands.py
@@ -7,13 +7,17 @@
# option. This file may not be copied, modified, or distributed
# except according to those terms.
-from __future__ import print_function, unicode_literals
+from __future__ import absolute_import, print_function, unicode_literals
+from datetime import datetime
+import hashlib
import json
import os
import os.path as path
import shutil
import subprocess
+import sys
+import tempfile
from mach.decorators import (
CommandArgument,
@@ -35,6 +39,26 @@ from servo.command_base import (
from servo.util import delete
+PACKAGES = {
+ 'android': [
+ 'target/arm-linux-androideabi/release/servo.apk',
+ ],
+ 'linux': [
+ 'target/release/servo-tech-demo.tar.gz',
+ ],
+ 'mac': [
+ 'target/release/servo-tech-demo.dmg',
+ ],
+ 'macbrew': [
+ 'target/release/brew/servo.tar.gz',
+ ],
+ 'windows-msvc': [
+ r'target\release\msi\Servo.msi',
+ r'target\release\msi\Servo.zip',
+ ],
+}
+
+
def otool(s):
o = subprocess.Popen(['/usr/bin/otool', '-L', s], stdout=subprocess.PIPE)
for l in o.stdout:
@@ -374,3 +398,99 @@ class PackageCommands(CommandBase):
print(" ".join(exec_command))
return subprocess.call(exec_command, env=self.build_env())
+
+ @Command('upload-nightly',
+ description='Upload Servo nightly to S3',
+ category='package')
+ @CommandArgument('platform',
+ choices=PACKAGES.keys(),
+ help='Package platform type to upload')
+ def upload_nightly(self, platform):
+ import boto3
+
+ def nightly_filename(package, timestamp):
+ return '{}-{}'.format(
+ timestamp.isoformat() + 'Z', # The `Z` denotes UTC
+ path.basename(package)
+ )
+
+ def upload_to_s3(platform, package, timestamp):
+ s3 = boto3.client('s3')
+ BUCKET = 'servo-builds'
+
+ nightly_dir = 'nightly/{}'.format(platform)
+ filename = nightly_filename(package, timestamp)
+ package_upload_key = '{}/{}'.format(nightly_dir, filename)
+ extension = path.basename(package).partition('.')[2]
+ latest_upload_key = '{}/servo-latest.{}'.format(nightly_dir, extension)
+
+ s3.upload_file(package, BUCKET, package_upload_key)
+ copy_source = {
+ 'Bucket': BUCKET,
+ 'Key': package_upload_key,
+ }
+ s3.copy(copy_source, BUCKET, latest_upload_key)
+
+ def update_brew(package, timestamp):
+ print("Updating brew formula")
+
+ package_url = 'https://download.servo.org/nightly/macbrew/{}'.format(
+ nightly_filename(package, timestamp)
+ )
+ with open(package) as p:
+ digest = hashlib.sha256(p.read()).hexdigest()
+
+ brew_version = timestamp.strftime('%Y.%m.%d')
+
+ with tempfile.TemporaryDirectory(prefix='homebrew-servo') as tmp_dir:
+ def call_git(cmd, **kwargs):
+ subprocess.check_call(
+ ['git', '-C', tmp_dir] + cmd,
+ **kwargs
+ )
+
+ call_git([
+ 'clone',
+ 'https://github.com/servo/homebrew-servo.git',
+ '.',
+ ])
+
+ script_dir = path.dirname(path.realpath(__file__))
+ with open(path.join(script_dir, 'servo-binary-formula.rb.in')) as f:
+ formula = f.read()
+ formula = formula.replace('PACKAGEURL', package_url)
+ formula = formula.replace('SHA', digest)
+ formula = formula.replace('VERSION', brew_version)
+ with open(path.join(tmp_dir, 'Formula', 'servo-bin.rb')) as f:
+ f.write(formula)
+
+ call_git(['add', path.join('.', 'Formula', 'servo-bin.rb')])
+ call_git([
+ '-c', 'user.name=Tom Servo',
+ '-c', 'user.email=servo@servo.org',
+ 'commit',
+ '--message=Version Bump: {}'.format(brew_version),
+ ])
+
+ token = os.environ['GITHUB_HOMEBREW_TOKEN']
+ call_git([
+ 'push',
+ '-qf',
+ 'https://{}@github.com/servo/homebrew-servo.git'.format(token),
+ 'master',
+ ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
+
+ timestamp = datetime.utcnow().replace(microsecond=0)
+ for package in PACKAGES[platform]:
+ if not path.isfile(package):
+ print("Could not find package for {} at {}".format(
+ platform,
+ package
+ ), file=sys.stderr)
+ return 1
+ upload_to_s3(platform, package, timestamp)
+
+ if platform == 'macbrew':
+ update_brew(package, timestamp)
+
+ return 0