Mercurial > mozilla > hg > MozillaTry
comparison mozillatry.py @ 0:df6a8049e9a4
initial port from http://k0s.org/mozilla/try.py
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Fri, 30 Nov 2012 15:51:06 -0800 |
parents | |
children | 0f8e4a3b4e1c |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:df6a8049e9a4 |
---|---|
1 #!/usr/bin/env python | |
2 | |
3 """ | |
4 push patches to try | |
5 """ | |
6 | |
7 import optparse | |
8 import os | |
9 import sys | |
10 | |
11 from subprocess import check_call as call | |
12 | |
13 def config(filename): | |
14 """read .mozutils.ini config file""" | |
15 # XXX stub; this should really use | |
16 # e.g. http://k0s.org/mozilla/hg/configuration/ | |
17 from ConfigParser import ConfigParser | |
18 parser = ConfigParser() | |
19 parser.read(filename) | |
20 return os.path.expanduser(parser.get('hg', 'mozilla-central')) | |
21 | |
22 def reset(directory): | |
23 """reset an hg directory to a good state""" | |
24 assert os.path.exists(directory) and os.path.isdir(directory) | |
25 hg_dir = os.path.join(directory, '.hg') | |
26 assert os.path.exists(hg_dir) and os.path.isdir(hg_dir) | |
27 call(['hg', 'revert', '--no-backup', '--all'], cwd=directory) | |
28 call(['hg', 'qpop', '--all'], cwd=directory) | |
29 try: | |
30 shutil.rmtree(os.path.join(hg_dir, 'patches')) # remove patches | |
31 except: | |
32 pass | |
33 | |
34 def update(directory): | |
35 """update a mozilla-central checkout""" | |
36 assert os.path.exists(directory) and os.path.isdir(directory) | |
37 reset(directory) | |
38 call(['hg', 'pull'], cwd=directory) | |
39 call(['hg', 'update'], cwd=directory) | |
40 call(['hg', 'qinit'], cwd=directory) | |
41 | |
42 def push_to_try(patches, repo, commit, _try='ssh://hg.mozilla.org/try/'): | |
43 """push a series of patches to try repository""" | |
44 | |
45 # ensure the repo is in a good state | |
46 update(repo) | |
47 | |
48 try: | |
49 # apply patches | |
50 for patch in patches: | |
51 call(['hg', 'qimport', patch], cwd=repo) | |
52 call(['hg', 'qpush', '--all'], cwd=repo) | |
53 call(['hg', 'qseries', '-v'], cwd=repo) | |
54 | |
55 # push to try | |
56 call(['hg', 'qref', '--message', commit], cwd=repo) | |
57 call(['hg', 'push', '-f', _try], cwd=repo) | |
58 finally: | |
59 reset(repo) | |
60 | |
61 def try_syntax(opt=True, debug=True, unittests=('all'), talos=('all'), bug=None): | |
62 """ | |
63 return try syntax; see also: | |
64 - https://github.com/pbiggar/trychooser | |
65 - http://trychooser.pub.build.mozilla.org/ | |
66 """ | |
67 | |
68 assert opt or debug | |
69 message = ['try:'] | |
70 message += ['-b', '%s%s' % (('d' if debug else ''), ('o' if opt else ''))] | |
71 message += ['-u', (','.join(unittests) if unittests else 'none')] | |
72 message += ['-t', (','.join(talos) if talos else 'none')] | |
73 if bug: | |
74 message += ['--post-to-bugzilla', str(bug)] | |
75 return ' '.join(message) | |
76 | |
77 def main(args=sys.argv[1:]): | |
78 | |
79 # parse command line arguments | |
80 usage = '%prog [options] patch <patch2> <...>' | |
81 class PlainDescriptionFormatter(optparse.IndentedHelpFormatter): | |
82 """description formatter""" | |
83 def format_description(self, description): | |
84 description = description.strip() | |
85 if description: | |
86 return description + '\n' | |
87 else: | |
88 return '' | |
89 parser = optparse.OptionParser(usage=usage, description=__doc__, formatter=PlainDescriptionFormatter()) | |
90 parser.add_option('--no-opt', dest='opt', | |
91 action='store_false', default=True, | |
92 help='no opt builds') | |
93 parser.add_option('--no-debug', dest='debug', | |
94 action='store_false', default=True, | |
95 help='no debug builds') | |
96 parser.add_option('-u', dest='unittests', action='append', | |
97 help='unittests') | |
98 parser.add_option('-t', dest='talos', action='append', | |
99 help='talos tests') | |
100 parser.add_option('--bug', dest='bug', type='int', | |
101 help='post to bugzilla bug #') | |
102 parser.add_option('-c', '--config', dest='config', | |
103 default=os.path.join(os.environ['HOME'], '.mozutils.ini'), | |
104 help='location of config file') | |
105 options, args = parser.parse_args(args) | |
106 if not args: | |
107 parser.print_help() | |
108 parser.exit() | |
109 if (not options.opt) and (not options.debug): | |
110 parser.error("Must enable opt or debug builds") | |
111 | |
112 # get mozilla-central repository directory | |
113 config_file = options.__dict__.pop('config') | |
114 if not os.path.exists(config_file): | |
115 parser.error("You need a config file at ~/.mozutils.ini") | |
116 try_directory = config(config_file) # XXX temporary hack | |
117 if not os.path.exists(try_directory): | |
118 parser.error("mozilla-central try directory does not exist: %s" % try_directory) | |
119 | |
120 # build try syntax | |
121 commit = try_syntax(**options.__dict__) | |
122 print commit | |
123 | |
124 # push to try | |
125 push_to_try(patches=args, repo=try_directory, commit=commit) | |
126 | |
127 if __name__ == '__main__': | |
128 main() | |
129 |