Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(995)

Unified Diff: devserver.py

Issue 6305004: Modify devserver and gmerge to be friendlier (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/dev-util.git@master
Patch Set: Actually implement --use Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | gmerge » ('j') | gmerge » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: devserver.py
diff --git a/devserver.py b/devserver.py
index 7d744c59f3aeb6d44201ccd6d1b777ee152e426d..7de95fa8b423946145cda55a11ad08170f98cc74 100755
--- a/devserver.py
+++ b/devserver.py
@@ -9,6 +9,7 @@
import cherrypy
import optparse
import os
+import subprocess
import sys
import autoupdate
@@ -69,7 +70,85 @@ def _PrepareToServeUpdatesOnly(image_dir):
'DEVSERVER')
-class DevServerRoot:
+def _OutputOf(command):
+ """Runs command, a list of arguments beginning with an executable.
+
+ If the executable begins with "scripts/", the path is adjusted to
+ the scripts directory of this chroot.
+
+ Args:
+ A list of arguments, beginning with the executable
+ Returns:
+ A list of lines returned by the command
+"""
+
sosa 2011/01/14 23:03:54 Don't need this extra line
rochberg 2011/01/15 06:16:48 Done.
+ scripts = 'scripts/'
+ if command[0].find(scripts) == 0:
+ command[0] = command[0].replace(scripts, '../../' + scripts)
+ cherrypy.log('Executing: ' + ' '.join(command), 'BUILD')
+ output_blob = subprocess.Popen(command,
+ stdout=subprocess.PIPE).communicate()[0]
+ return [line.rstrip() for line in output_blob.split('\n')]
+
sosa 2011/01/14 23:03:54 2 lines between top level defs
+def _IsIn(needle, haystack_list):
sosa 2011/01/14 23:03:54 Isn't this equivalent to needle in haystick_list?
rochberg 2011/01/15 06:16:48 The way the code is structured now, the relevant t
+ for line in haystack_list:
+ if needle in line:
+ return True
+ return False
+
sosa 2011/01/14 23:03:54 2 lines between top level defs
rochberg 2011/01/15 06:16:48 Done.
+class Builder(object):
sosa 2011/01/14 23:03:54 Should probably move this into its own module.
rochberg 2011/01/15 06:16:48 Done.
+ def _ShouldBeWorkedOn(self, board, pkg):
+ """Is pkg a package that could be worked on, but is not?"""
+ if _IsIn(pkg, _OutputOf([
+ 'scripts/cros_workon', '--board=' + board, 'list'])):
+ return False
+
+ # If it's in the list of possible workon targets, we should be working on it
+ return _IsIn(pkg, _OutputOf([
+ 'scripts/cros_workon', '--board=' + board, 'list', '--all']))
+
+ def SetError(self, text):
+ cherrypy.response.status = 500
+ cherrypy.log(text, 'BUILD')
+ return text
+
+ def Build(self, board, pkg, additional_args):
+ cherrypy.log('Additional build request arguments: '+ str(additional_args),
+ 'BUILD')
+
+ original_use = os.environ.get('USE', '')
+ if 'use' in additional_args:
+ os.environ['USE'] = original_use + ' ' + additional_args['use']
+ cherrypy.log("USE flags modified to " + os.environ['USE'], 'BUILD')
+
+ try:
+ if (self._ShouldBeWorkedOn(board, pkg) and
+ not additional_args.get('accept_stable')):
+ return self.SetError(
+ 'Package is not cros_workon\'d on the devserver machine.\n'
+ 'Either start working on the package or pass --accept_stable '
+ 'to gmerge')
+
+ rc = subprocess.call(['emerge-%s' % board, pkg])
+ if rc != 0:
+ return self.SetError('Could not emerge ' + pkg)
+
+ cherrypy.log('ecleaning %s' % pkg, 'BUILD')
+ rc = subprocess.call(['eclean-' + board, '-d', 'packages'])
+ if rc != 0:
+ return self.SetError('eclean failed')
+
+ cherrypy.log('eclean complete %s' % pkg, 'BUILD')
+ return 'Success\n'
+
+ except OSError, e:
+ return self.SetError('Could not execute build command: ' + str(e))
+
+ finally:
+ os.environ['USE'] = original_use
+
+
+class DevServerRoot(object):
"""The Root Class for the Dev Server.
CherryPy works as follows:
@@ -81,17 +160,12 @@ class DevServerRoot:
cherrypy uses the update method and puts the extra paths in args.
"""
- def build(self, board, pkg):
+ def __init__(self):
+ self._builder = Builder()
+
+ def build(self, board, pkg, **kwargs):
"""Builds the package specified."""
- cherrypy.log('emerging %s' % pkg, 'BUILD')
- emerge_command = 'emerge-%s %s' % (board, pkg)
- err = os.system(emerge_command)
- if err != 0:
- raise Exception('failed to execute %s' % emerge_command)
- eclean_command = 'eclean-%s -d packages' % board
- err = os.system(eclean_command)
- if err != 0:
- raise Exception('failed to execute %s' % emerge_command)
+ return self._builder.Build(board, pkg, kwargs)
def index(self):
return 'Welcome to the Dev Server!'
« no previous file with comments | « no previous file | gmerge » ('j') | gmerge » ('J')

Powered by Google App Engine
This is Rietveld 408576698