diff options
Diffstat (limited to 'devtools/p4submit.py')
| -rw-r--r-- | devtools/p4submit.py | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/devtools/p4submit.py b/devtools/p4submit.py new file mode 100644 index 0000000..a575bce --- /dev/null +++ b/devtools/p4submit.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python + +import getopt +import os +import re +import sys +import subprocess + +import pdb + +def usage(): + print >> sys.stderr, 'checks in all open files in the default changelist, aggregating change comments from the provided list' + print >> sys.stderr, '' + print >> sys.stderr, 'usage:' + print >> sys.stderr, sys.argv[0] + ' [-c p4client] [-p p4port] [-u p4user] [-d changelog (prefix)] [--changes "list of change numbers"]' + print >> sys.stderr, '' + print >> sys.stderr, 'the list of changes must either be the last argument, or be quoted, so ' + print >> sys.stderr, sys.argv[0] + ' ... --changes 1 2 3 [ok] ' + print >> sys.stderr, sys.argv[0] + ' ... --changes "1 2 3" ... [ok]' + print >> sys.stderr, sys.argv[0] + ' ... -changes 1 2 3 ... [bad]' + +def main(): + try: + opts, args = getopt.getopt( sys.argv[1:], "c:p:u:d:", [ "changes=" ] ) + except getopt.GetoptError, err: + print >> sys.stderr, str(err) + usage() + sys.exit(-1) + + p4user = None + p4client = None + p4port = None + changelog = None + changes = [] + p4cmdbase = [ "p4" ] + for opt, arg in opts: + if opt == "-c": + p4cmdbase.extend( [ opt, arg ] ) + p4client = arg + elif opt == "-p": + p4cmdbase.extend( [ opt, arg ] ) + p4port = arg + elif opt == "-u": + p4cmdbase.extend( [ opt, arg ] ) + p4user = arg + elif opt == "-d": + # eat this one, we'll build our own changespec + changelog = arg + elif opt == "--changes": + # and these are the change #'s to include descriptions of + changes = arg.split() + if args is not None: + changes.extend( args ) + + if p4user is None: + p4user = os.getenv( "P4USER" ) + if p4client is None: + p4client = os.getenv( "P4CLIENT" ) + if p4port is None: + p4port = os.getenv( "P4PORT" ) + + if p4user is None or p4client is None or p4port is None: + print >> sys.stderr, "one or more p4 environment variables (p4user, p4client, p4port) aren't set." + usage() + sys.exit(-1) + + + # get the list of opened files + openFiles = [] + stdout = subprocess.Popen( " ".join( p4cmdbase ) + " opened -c default", shell=True, stdout=subprocess.PIPE ).stdout + lines = stdout.readlines() + stdout.close() + + filere = re.compile( "(.*)#.*\n" ) + for line in lines: + m = filere.match( line ) + if m is not None: + openFiles += [ m.groups()[ 0 ] ] + + if openFiles == []: + sys.stderr.write( "no files to submit from the default changelist" ) + sys.exit(0) + + # get the changenotes from the specified changes + changeLines = [] + for change in changes: + stdout = subprocess.Popen( " ".join( p4cmdbase ) + " describe -s " + change, shell=True, stdout=subprocess.PIPE ).stdout + lines = stdout.readlines() + stdout.close() + + stopre = re.compile( "Affected files ..." ) + for line in lines: + if stopre.match( line ): + break + changeLines += [ line.strip() ] + + change_spec = '' + change_spec += 'Change: new\n' + change_spec += 'Client: %s\n' % p4client + change_spec += 'User: %s\n' % p4user + change_spec += 'Description:\n' + + # if they supplied a changelog line, prepend that to the list of changes + if changelog is not None: + change_spec += '\t%s\n\n' % changelog + # and now each line from all the changelists + if changeLines != []: + change_spec += '\t%s\n\n' % "Changes included in this submit:" + for changeLine in changeLines: + change_spec += '\t%s\n' % changeLine + + change_spec += 'Files:\n' + for file in openFiles: + change_spec += '\t%s\n' % file + + p = subprocess.Popen( " ".join( p4cmdbase ) + " submit -i", shell=True, stdin=subprocess.PIPE, stdout=sys.stdout, stderr=sys.stderr ) + p.communicate( change_spec ) + sys.exit( p.returncode ) + +if __name__ == '__main__': + main() |