diff options
Diffstat (limited to 'lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/scripts/runner.py')
-rw-r--r-- | lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/scripts/runner.py | 731 |
1 files changed, 0 insertions, 731 deletions
diff --git a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/scripts/runner.py b/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/scripts/runner.py deleted file mode 100644 index 89254c2a..00000000 --- a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/scripts/runner.py +++ /dev/null @@ -1,731 +0,0 @@ -# This file is part of Buildbot. Buildbot is free software: you can -# redistribute it and/or modify it under the terms of the GNU General Public -# License as published by the Free Software Foundation, version 2. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. -# -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 51 -# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Copyright Buildbot Team Members - -from __future__ import with_statement - -# N.B.: don't import anything that might pull in a reactor yet. Some of our -# subcommands want to load modules that need the gtk reactor. -# -# Also don't forget to mirror your changes on command-line options in manual -# pages and texinfo documentation. - -from twisted.python import usage, reflect -import re -import sys - -from buildbot.scripts import base - -# Note that the terms 'options' and 'config' are used interchangeably here - in -# fact, they are interchanged several times. Caveat legator. - -def validateMasterOption(master): - """ - Validate master (-m, --master) command line option. - - Checks that option is a string of the 'hostname:port' form, otherwise - raises an UsageError exception. - - @type master: string - @param master: master option - - @raise usage.UsageError: on invalid master option - """ - try: - hostname, port = master.split(":") - port = int(port) - except: - raise usage.UsageError("master must have the form 'hostname:port'") - - -class UpgradeMasterOptions(base.BasedirMixin, base.SubcommandOptions): - subcommandFunction = "buildbot.scripts.upgrade_master.upgradeMaster" - optFlags = [ - ["quiet", "q", "Do not emit the commands being run"], - ["replace", "r", "Replace any modified files without confirmation."], - ] - optParameters = [ - ] - - def getSynopsis(self): - return "Usage: buildbot upgrade-master [options] [<basedir>]" - - longdesc = """ - This command takes an existing buildmaster working directory and - adds/modifies the files there to work with the current version of - buildbot. When this command is finished, the buildmaster directory should - look much like a brand-new one created by the 'create-master' command. - - Use this after you've upgraded your buildbot installation and before you - restart the buildmaster to use the new version. - - If you have modified the files in your working directory, this command - will leave them untouched, but will put the new recommended contents in a - .new file (for example, if index.html has been modified, this command - will create index.html.new). You can then look at the new version and - decide how to merge its contents into your modified file. - - When upgrading from a pre-0.8.0 release (which did not use a database), - this command will create the given database and migrate data from the old - pickle files into it, then move the pickle files out of the way (e.g. to - changes.pck.old). - - When upgrading the database, this command uses the database specified in - the master configuration file. If you wish to use a database other than - the default (sqlite), be sure to set that parameter before upgrading. - """ - - -class CreateMasterOptions(base.BasedirMixin, base.SubcommandOptions): - subcommandFunction = "buildbot.scripts.create_master.createMaster" - optFlags = [ - ["quiet", "q", "Do not emit the commands being run"], - ["force", "f", - "Re-use an existing directory (will not overwrite master.cfg file)"], - ["relocatable", "r", - "Create a relocatable buildbot.tac"], - ["no-logrotate", "n", - "Do not permit buildmaster rotate logs by itself"] - ] - optParameters = [ - ["config", "c", "master.cfg", "name of the buildmaster config file"], - ["log-size", "s", "10000000", - "size at which to rotate twisted log files"], - ["log-count", "l", "10", - "limit the number of kept old twisted log files"], - ["db", None, "sqlite:///state.sqlite", - "which DB to use for scheduler/status state. See below for syntax."], - ] - def getSynopsis(self): - return "Usage: buildbot create-master [options] [<basedir>]" - - longdesc = """ - This command creates a buildmaster working directory and buildbot.tac file. - The master will live in <dir> and create various files there. If - --relocatable is given, then the resulting buildbot.tac file will be - written such that its containing directory is assumed to be the basedir. - This is generally a good idea. - - At runtime, the master will read a configuration file (named - 'master.cfg' by default) in its basedir. This file should contain python - code which eventually defines a dictionary named 'BuildmasterConfig'. - The elements of this dictionary are used to configure the Buildmaster. - See doc/config.xhtml for details about what can be controlled through - this interface. - - The --db string is evaluated to build the DB object, which specifies - which database the buildmaster should use to hold scheduler state and - status information. The default (which creates an SQLite database in - BASEDIR/state.sqlite) is equivalent to: - - --db='sqlite:///state.sqlite' - - To use a remote MySQL database instead, use something like: - - --db='mysql://bbuser:bbpasswd@dbhost/bbdb' - The --db string is stored verbatim in the buildbot.tac file, and - evaluated as 'buildbot start' time to pass a DBConnector instance into - the newly-created BuildMaster object. - """ - - def postOptions(self): - base.BasedirMixin.postOptions(self) - if not re.match('^\d+$', self['log-size']): - raise usage.UsageError("log-size parameter needs to be an int") - if not re.match('^\d+$', self['log-count']) and \ - self['log-count'] != 'None': - raise usage.UsageError("log-count parameter needs to be an int "+ - " or None") - - -class StopOptions(base.BasedirMixin, base.SubcommandOptions): - subcommandFunction = "buildbot.scripts.stop.stop" - optFlags = [ - ["quiet", "q", "Do not emit the commands being run"], - ["clean", "c", "Clean shutdown master"], - ] - def getSynopsis(self): - return "Usage: buildbot stop [<basedir>]" - - -class RestartOptions(base.BasedirMixin, base.SubcommandOptions): - subcommandFunction = "buildbot.scripts.restart.restart" - optFlags = [ - ['quiet', 'q', "Don't display startup log messages"], - ['nodaemon', None, "Don't daemonize (stay in foreground)"], - ["clean", "c", "Clean shutdown master"], - ] - def getSynopsis(self): - return "Usage: buildbot restart [<basedir>]" - - -class StartOptions(base.BasedirMixin, base.SubcommandOptions): - subcommandFunction = "buildbot.scripts.start.start" - optFlags = [ - ['quiet', 'q', "Don't display startup log messages"], - ['nodaemon', None, "Don't daemonize (stay in foreground)"], - ] - def getSynopsis(self): - return "Usage: buildbot start [<basedir>]" - - -class ReconfigOptions(base.BasedirMixin, base.SubcommandOptions): - subcommandFunction = "buildbot.scripts.reconfig.reconfig" - optFlags = [ - ['quiet', 'q', "Don't display log messages about reconfiguration"], - ] - def getSynopsis(self): - return "Usage: buildbot reconfig [<basedir>]" - - -class DebugClientOptions(base.SubcommandOptions): - subcommandFunction = "buildbot.scripts.debugclient.debugclient" - optParameters = [ - ["master", "m", None, - "Location of the buildmaster's slaveport (host:port)"], - ["passwd", "p", None, "Debug password to use"], - ] - buildbotOptions = [ - [ 'master', 'master' ], - [ 'debugMaster', 'master' ], - ] - requiredOptions = [ 'master', 'passwd' ] - - def getSynopsis(self): - return "Usage: buildbot debugclient [options]" - - def parseArgs(self, *args): - if len(args) > 0: - self['master'] = args[0] - if len(args) > 1: - self['passwd'] = args[1] - if len(args) > 2: - raise usage.UsageError("I wasn't expecting so many arguments") - - def postOptions(self): - base.SubcommandOptions.postOptions(self) - validateMasterOption(self.get('master')) - - -class BaseStatusClientOptions(base.SubcommandOptions): - optFlags = [ - ['help', 'h', "Display this message"], - ] - optParameters = [ - ["master", "m", None, - "Location of the buildmaster's status port (host:port)"], - ["username", "u", "statusClient", "Username performing the trial build"], - ["passwd", 'p', "clientpw", "password for PB authentication"], - ] - buildbotOptions = [ - [ 'master', 'master' ], - [ 'masterstatus', 'master' ], - ] - requiredOptions = [ 'master' ] - - def parseArgs(self, *args): - if len(args) > 0: - self['master'] = args[0] - if len(args) > 1: - raise usage.UsageError("I wasn't expecting so many arguments") - - def postOptions(self): - base.SubcommandOptions.postOptions(self) - validateMasterOption(self.get('master')) - - - -class StatusLogOptions(BaseStatusClientOptions): - subcommandFunction = "buildbot.scripts.statuslog.statuslog" - def getSynopsis(self): - return "Usage: buildbot statuslog [options]" - - -class StatusGuiOptions(BaseStatusClientOptions): - subcommandFunction = "buildbot.scripts.statusgui.statusgui" - def getSynopsis(self): - return "Usage: buildbot statusgui [options]" - - -class SendChangeOptions(base.SubcommandOptions): - subcommandFunction = "buildbot.scripts.sendchange.sendchange" - def __init__(self): - base.SubcommandOptions.__init__(self) - self['properties'] = {} - - optParameters = [ - ("master", "m", None, - "Location of the buildmaster's PBListener (host:port)"), - # deprecated in 0.8.3; remove in 0.8.5 (bug #1711) - ("auth", "a", 'change:changepw', - "Authentication token - username:password, or prompt for password"), - ("who", "W", None, "Author of the commit"), - ("repository", "R", '', "Repository specifier"), - ("vc", "s", None, "The VC system in use, one of: cvs, svn, darcs, hg, " - "bzr, git, mtn, p4"), - ("project", "P", '', "Project specifier"), - ("branch", "b", None, "Branch specifier"), - ("category", "C", None, "Category of repository"), - ("codebase", None, None, - "Codebase this change is in (requires 0.8.7 master or later)"), - ("revision", "r", None, "Revision specifier"), - ("revision_file", None, None, "Filename containing revision spec"), - ("property", "p", None, - "A property for the change, in the format: name:value"), - ("comments", "c", None, "log message"), - ("logfile", "F", None, - "Read the log messages from this file (- for stdin)"), - ("when", "w", None, "timestamp to use as the change time"), - ("revlink", "l", '', "Revision link (revlink)"), - ("encoding", "e", 'utf8', - "Encoding of other parameters (default utf8)"), - ] - - buildbotOptions = [ - [ 'master', 'master' ], - [ 'who', 'who' ], - [ 'branch', 'branch' ], - [ 'category', 'category' ], - [ 'vc', 'vc' ], - ] - - requiredOptions = [ 'who', 'master' ] - - def getSynopsis(self): - return "Usage: buildbot sendchange [options] filenames.." - - def parseArgs(self, *args): - self['files'] = args - - def opt_property(self, property): - name,value = property.split(':', 1) - self['properties'][name] = value - - def postOptions(self): - base.SubcommandOptions.postOptions(self) - - if self.get("revision_file"): - with open(self["revision_file"],"r") as f: - self['revision'] = f.read() - - if self.get('when'): - try: - self['when'] = float(self['when']) - except: - raise usage.UsageError('invalid "when" value %s' - % (self['when'],)) - else: - self['when'] = None - - if not self.get('comments') and self.get('logfile'): - if self['logfile'] == "-": - self['comments'] = sys.stdin.read() - else: - with open(self['logfile'], "rt") as f: - self['comments'] = f.read() - if self.get('comments') is None: - self['comments'] = "" - - # fix up the auth with a password if none was given - auth = self.get('auth') - if ':' not in auth: - import getpass - pw = getpass.getpass("Enter password for '%s': " % auth) - auth = "%s:%s" % (auth, pw) - self['auth'] = tuple(auth.split(':', 1)) - - vcs = ['cvs', 'svn', 'darcs', 'hg', 'bzr', 'git', 'mtn', 'p4'] - if self.get('vc') and self.get('vc') not in vcs: - raise usage.UsageError("vc must be one of %s" % (', '.join(vcs))) - - validateMasterOption(self.get('master')) - -class TryOptions(base.SubcommandOptions): - subcommandFunction = "buildbot.scripts.trycmd.trycmd" - optParameters = [ - ["connect", "c", None, - "How to reach the buildmaster, either 'ssh' or 'pb'"], - # for ssh, use --host, --username, and --jobdir - ["host", None, None, - "Hostname (used by ssh) for the buildmaster"], - ["jobdir", None, None, - "Directory (on the buildmaster host) where try jobs are deposited"], - ["username", "u", None, - "Username performing the try build"], - # for PB, use --master, --username, and --passwd - ["master", "m", None, - "Location of the buildmaster's PBListener (host:port)"], - ["passwd", None, None, - "Password for PB authentication"], - ["who", "w", None, - "Who is responsible for the try build"], - ["comment", "C", None, - "A comment which can be used in notifications for this build"], - - # for ssh to accommodate running in a virtualenv on the buildmaster - ["buildbotbin", None, "buildbot", - "buildbot binary to use on the buildmaster host"], - - ["diff", None, None, - "Filename of a patch to use instead of scanning a local tree. " - "Use '-' for stdin."], - ["patchlevel", "p", 0, - "Number of slashes to remove from patch pathnames, " - "like the -p option to 'patch'"], - - ["baserev", None, None, - "Base revision to use instead of scanning a local tree."], - - ["vc", None, None, - "The VC system in use, one of: bzr, cvs, darcs, git, hg, " - "mtn, p4, svn"], - ["branch", None, None, - "The branch in use, for VC systems that can't figure it out " - "themselves"], - ["repository", None, None, - "Repository to use, instead of path to working directory."], - - ["builder", "b", None, - "Run the trial build on this Builder. Can be used multiple times."], - ["properties", None, None, - "A set of properties made available in the build environment, " - "format is --properties=prop1=value1,prop2=value2,.. " - "option can be specified multiple times."], - ["property", None, None, - "A property made available in the build environment, " - "format:prop=value. Can be used multiple times."], - - ["topfile", None, None, - "Name of a file at the top of the tree, used to find the top. " - "Only needed for SVN and CVS."], - ["topdir", None, None, - "Path to the top of the working copy. Only needed for SVN and CVS."], - ] - - optFlags = [ - ["wait", None, - "wait until the builds have finished"], - ["dryrun", 'n', - "Gather info, but don't actually submit."], - ["get-builder-names", None, - "Get the names of available builders. Doesn't submit anything. " - "Only supported for 'pb' connections."], - ["quiet", "q", - "Don't print status of current builds while waiting."], - ] - - # Mapping of .buildbot/options names to command-line options - buildbotOptions = [ - [ 'try_connect', 'connect' ], - #[ 'try_builders', 'builders' ], <-- handled in postOptions - [ 'try_vc', 'vc' ], - [ 'try_branch', 'branch' ], - [ 'try_repository', 'repository' ], - [ 'try_topdir', 'topdir' ], - [ 'try_topfile', 'topfile' ], - [ 'try_host', 'host' ], - [ 'try_username', 'username' ], - [ 'try_jobdir', 'jobdir' ], - [ 'try_buildbotbin', 'buildbotbin' ], - [ 'try_passwd', 'passwd' ], - [ 'try_master', 'master' ], - [ 'try_who', 'who' ], - [ 'try_comment', 'comment' ], - #[ 'try_wait', 'wait' ], <-- handled in postOptions - #[ 'try_quiet', 'quiet' ], <-- handled in postOptions - - # Deprecated command mappings from the quirky old days: - [ 'try_masterstatus', 'master' ], - [ 'try_dir', 'jobdir' ], - [ 'try_password', 'passwd' ], - ] - - def __init__(self): - base.SubcommandOptions.__init__(self) - self['builders'] = [] - self['properties'] = {} - - def opt_builder(self, option): - self['builders'].append(option) - - def opt_properties(self, option): - # We need to split the value of this option into a dictionary of properties - propertylist = option.split(",") - for i in range(0,len(propertylist)): - splitproperty = propertylist[i].split("=", 1) - self['properties'][splitproperty[0]] = splitproperty[1] - - def opt_property(self, option): - name, _, value = option.partition("=") - self['properties'][name] = value - - def opt_patchlevel(self, option): - self['patchlevel'] = int(option) - - def getSynopsis(self): - return "Usage: buildbot try [options]" - - def postOptions(self): - base.SubcommandOptions.postOptions(self) - opts = self.optionsFile - if not self['builders']: - self['builders'] = opts.get('try_builders', []) - if opts.get('try_wait', False): - self['wait'] = True - if opts.get('try_quiet', False): - self['quiet'] = True - # get the global 'masterstatus' option if it's set and no master - # was specified otherwise - if not self['master']: - self['master'] = opts.get('masterstatus', None) - - if self['connect'] == 'pb': - if not self['master']: - raise usage.UsageError("master location must be specified" \ - "for 'pb' connections") - validateMasterOption(self['master']) - - -class TryServerOptions(base.SubcommandOptions): - subcommandFunction = "buildbot.scripts.tryserver.tryserver" - optParameters = [ - ["jobdir", None, None, "the jobdir (maildir) for submitting jobs"], - ] - requiredOptions = [ 'jobdir' ] - - def getSynopsis(self): - return "Usage: buildbot tryserver [options]" - - def postOptions(self): - if not self['jobdir']: - raise usage.UsageError('jobdir is required') - - -class CheckConfigOptions(base.SubcommandOptions): - subcommandFunction = "buildbot.scripts.checkconfig.checkconfig" - optFlags = [ - ['quiet', 'q', "Don't display error messages or tracebacks"], - ] - - def getSynopsis(self): - return "Usage: buildbot checkconfig [configFile]\n" + \ - " If not specified, 'master.cfg' will be used as 'configFile'" - - def parseArgs(self, *args): - if len(args) >= 1: - self['configFile'] = args[0] - else: - self['configFile'] = 'master.cfg' - - -class UserOptions(base.SubcommandOptions): - subcommandFunction = "buildbot.scripts.user.user" - optParameters = [ - ["master", "m", None, - "Location of the buildmaster's PBListener (host:port)"], - ["username", "u", None, - "Username for PB authentication"], - ["passwd", "p", None, - "Password for PB authentication"], - ["op", None, None, - "User management operation: add, remove, update, get"], - ["bb_username", None, None, - "Username to set for a given user. Only availabe on 'update', " - "and bb_password must be given as well."], - ["bb_password", None, None, - "Password to set for a given user. Only availabe on 'update', " - "and bb_username must be given as well."], - ["ids", None, None, - "User's identifiers, used to find users in 'remove' and 'get' " - "Can be specified multiple times (--ids=id1,id2,id3)"], - ["info", None, None, - "User information in the form: --info=type=value,type=value,.. " - "Used in 'add' and 'update', can be specified multiple times. " - "Note that 'update' requires --info=id:type=value..."] - ] - buildbotOptions = [ - [ 'master', 'master' ], - [ 'user_master', 'master' ], - [ 'user_username', 'username' ], - [ 'user_passwd', 'passwd' ], - ] - requiredOptions = [ 'master' ] - - longdesc = """ - Currently implemented types for --info= are:\n - git, svn, hg, cvs, darcs, bzr, email - """ - - def __init__(self): - base.SubcommandOptions.__init__(self) - self['ids'] = [] - self['info'] = [] - - def opt_ids(self, option): - id_list = option.split(",") - self['ids'].extend(id_list) - - def opt_info(self, option): - # splits info into type/value dictionary, appends to info - info_list = option.split(",") - info_elem = {} - - if len(info_list) == 1 and '=' not in info_list[0]: - info_elem["identifier"] = info_list[0] - self['info'].append(info_elem) - else: - for i in range(0, len(info_list)): - split_info = info_list[i].split("=", 1) - - # pull identifier from update --info - if ":" in split_info[0]: - split_id = split_info[0].split(":") - info_elem["identifier"] = split_id[0] - split_info[0] = split_id[1] - - info_elem[split_info[0]] = split_info[1] - self['info'].append(info_elem) - - def getSynopsis(self): - return "Usage: buildbot user [options]" - - def _checkValidTypes(self, info): - from buildbot.process.users import users - valid = set(['identifier', 'email'] + users.srcs) - - for user in info: - for attr_type in user: - if attr_type not in valid: - raise usage.UsageError( - "Type not a valid attr_type, must be in: %s" - % ', '.join(valid)) - - def postOptions(self): - base.SubcommandOptions.postOptions(self) - - validateMasterOption(self.get('master')) - - op = self.get('op') - if not op: - raise usage.UsageError("you must specify an operation: add, " - "remove, update, get") - if op not in ['add', 'remove', 'update', 'get']: - raise usage.UsageError("bad op %r, use 'add', 'remove', 'update', " - "or 'get'" % op) - - if not self.get('username') or not self.get('passwd'): - raise usage.UsageError("A username and password must be given") - - bb_username = self.get('bb_username') - bb_password = self.get('bb_password') - if bb_username or bb_password: - if op != 'update': - raise usage.UsageError("bb_username and bb_password only work " - "with update") - if not bb_username or not bb_password: - raise usage.UsageError("Must specify both bb_username and " - "bb_password or neither.") - - info = self.get('info') - ids = self.get('ids') - - # check for erroneous args - if not info and not ids: - raise usage.UsageError("must specify either --ids or --info") - - if op == 'add' or op == 'update': - if ids: - raise usage.UsageError("cannot use --ids with 'add' or " - "'update'") - self._checkValidTypes(info) - if op == 'update': - for user in info: - if 'identifier' not in user: - raise usage.UsageError("no ids found in update info; " - "use: --info=id:type=value,type=value,..") - if op == 'add': - for user in info: - if 'identifier' in user: - raise usage.UsageError("identifier found in add info, " - "use: --info=type=value,type=value,..") - if op == 'remove' or op == 'get': - if info: - raise usage.UsageError("cannot use --info with 'remove' " - "or 'get'") - - -class Options(usage.Options): - synopsis = "Usage: buildbot <command> [command options]" - - subCommands = [ - ['create-master', None, CreateMasterOptions, - "Create and populate a directory for a new buildmaster"], - ['upgrade-master', None, UpgradeMasterOptions, - "Upgrade an existing buildmaster directory for the current version"], - ['start', None, StartOptions, - "Start a buildmaster"], - ['stop', None, StopOptions, - "Stop a buildmaster"], - ['restart', None, RestartOptions, - "Restart a buildmaster"], - ['reconfig', None, ReconfigOptions, - "SIGHUP a buildmaster to make it re-read the config file"], - ['sighup', None, ReconfigOptions, - "SIGHUP a buildmaster to make it re-read the config file"], - ['sendchange', None, SendChangeOptions, - "Send a change to the buildmaster"], - ['debugclient', None, DebugClientOptions, - "Launch a small debug panel GUI"], - ['statuslog', None, StatusLogOptions, - "Emit current builder status to stdout"], - ['statusgui', None, StatusGuiOptions, - "Display a small window showing current builder status"], - ['try', None, TryOptions, - "Run a build with your local changes"], - ['tryserver', None, TryServerOptions, - "buildmaster-side 'try' support function, not for users"], - ['checkconfig', None, CheckConfigOptions, - "test the validity of a master.cfg config file"], - ['user', None, UserOptions, - "Manage users in buildbot's database"] - ] - - def opt_version(self): - import buildbot - print "Buildbot version: %s" % buildbot.version - usage.Options.opt_version(self) - - def opt_verbose(self): - from twisted.python import log - log.startLogging(sys.stderr) - - def postOptions(self): - if not hasattr(self, 'subOptions'): - raise usage.UsageError("must specify a command") - - -def run(): - config = Options() - try: - config.parseOptions(sys.argv[1:]) - except usage.error, e: - print "%s: %s" % (sys.argv[0], e) - print - c = getattr(config, 'subOptions', config) - print str(c) - sys.exit(1) - - subconfig = config.subOptions - subcommandFunction = reflect.namedObject(subconfig.subcommandFunction) - sys.exit(subcommandFunction(subconfig)) |