You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
3.5 KiB
121 lines
3.5 KiB
#!/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()
|
|
|