Index: tools/rebaseline.py |
=================================================================== |
--- tools/rebaseline.py (revision 9318) |
+++ tools/rebaseline.py (working copy) |
@@ -13,6 +13,7 @@ |
checkout, the files will be added to the staging area for commit. |
''' |
+import argparse |
import os |
import subprocess |
import sys |
@@ -21,7 +22,7 @@ |
# Mapping of gm-expectations subdir (under |
# https://skia.googlecode.com/svn/gm-expected/ ) |
# to builder name (see list at http://108.170.217.252:10117/builders ) |
-subdir_mapping = { |
+SUBDIR_MAPPING = { |
'base-shuttle-win7-intel-float': |
'Test-Win7-ShuttleA-HD2000-x86-Release', |
'base-shuttle-win7-intel-angle': |
@@ -46,63 +47,126 @@ |
'Test-Android-Nexus10-MaliT604-Arm7-Release', |
} |
-IS_SVN_CHECKOUT = (os.path.exists('.svn') or |
- os.path.exists(os.path.join('..', '.svn'))) |
-IS_GIT_CHECKOUT = (os.path.exists('.git') or |
- os.path.exists(os.path.join('..', '.git'))) |
+class Rebaseliner(object): |
-# Rebaseline a single file. |
-def RebaselineOneFile(expectations_subdir, builder_name, |
- infilename, outfilename): |
- url = ('http://skia-autogen.googlecode.com/svn/gm-actual/' + |
- expectations_subdir + '/' + builder_name + '/' + |
- expectations_subdir + '/' + infilename) |
- cmd = [ 'curl', '--fail', '--silent', url ] |
- temp = tempfile.NamedTemporaryFile() |
- ret = subprocess.call(cmd, stdout=temp) |
- if ret != 0: |
- print 'Couldn\'t fetch ' + url |
- return |
- cmd = [ 'cp', temp.name, outfilename ] |
- subprocess.call(cmd); |
- if IS_SVN_CHECKOUT: |
- cmd = [ 'svn', 'add', '--quiet', outfilename ] |
- subprocess.call(cmd) |
- cmd = [ 'svn', 'propset', '--quiet', 'svn:mime-type', 'image/png', |
- outfilename ]; |
- subprocess.call(cmd) |
- elif IS_GIT_CHECKOUT: |
- cmd = [ 'git', 'add', outfilename ] |
- subprocess.call(cmd) |
+ # params: |
+ # tests: list of tests to rebaseline |
+ # configs: which configs to run for each test |
+ # subdirs: which platform subdirectories to rebaseline; if an empty list, |
+ # rebaseline all platform subdirectories |
+ # dry_run: if True, instead of actually downloading files or adding |
+ # files to checkout, display a list of operations that |
+ # we would normally perform |
+ def __init__(self, tests, configs=[], subdirs=[], dry_run=False): |
+ if not tests: |
+ raise Exception('at least one test must be specified') |
+ self._tests = tests |
+ self._configs = configs |
+ if not subdirs: |
+ self._subdirs = sorted(SUBDIR_MAPPING.keys()) |
+ else: |
+ self._subdirs = subdirs |
+ self._dry_run = dry_run |
+ self._is_svn_checkout = ( |
+ os.path.exists('.svn') or |
+ os.path.exists(os.path.join(os.pardir, '.svn'))) |
+ self._is_git_checkout = ( |
+ os.path.exists('.git') or |
+ os.path.exists(os.path.join(os.pardir, '.git'))) |
+ # Execute subprocess.call(), unless dry_run is True |
+ def _Call(self, cmd, stdout=None): |
+ if self._dry_run: |
+ print '%s' % ' '.join(cmd) |
+ return 0 |
+ if stdout: |
+ return subprocess.call(cmd, stdout=stdout) |
+ else: |
+ return subprocess.call(cmd) |
-# Rebaseline all testtypes for a single test. |
-def RebaselineOneTest(expectations_subdir, builder_name, testname): |
- if (expectations_subdir == 'base-shuttle-win7-intel-angle'): |
- testtypes = [ 'angle', 'anglemsaa16' ] |
- else: |
- testtypes = [ '565', '8888', 'gpu', 'pdf', 'mesa', 'msaa16', 'msaa4' ] |
- print expectations_subdir + ':' |
- for testtype in testtypes: |
- infilename = testname + '_' + testtype + '.png' |
- print infilename |
- outfilename = os.path.join(expectations_subdir, infilename); |
- RebaselineOneFile(expectations_subdir=expectations_subdir, |
- builder_name=builder_name, |
- infilename=infilename, |
- outfilename=outfilename) |
+ # Rebaseline a single file. |
+ def _RebaselineOneFile(self, expectations_subdir, builder_name, |
+ infilename, outfilename): |
+ url = ('http://skia-autogen.googlecode.com/svn/gm-actual/' + |
+ expectations_subdir + '/' + builder_name + '/' + |
+ expectations_subdir + '/' + infilename) |
+ cmd = [ 'curl', '--fail', '--silent', url ] |
+ temp = tempfile.NamedTemporaryFile() |
+ ret = self._Call(cmd, stdout=temp) |
+ if ret != 0: |
+ print '# Couldn\'t fetch ' + url |
+ return |
+ cmd = [ 'cp', temp.name, outfilename ] |
+ self._Call(cmd); |
+ if self._is_svn_checkout: |
+ cmd = [ 'svn', 'add', '--quiet', outfilename ] |
+ self._Call(cmd) |
+ cmd = [ 'svn', 'propset', '--quiet', 'svn:mime-type', 'image/png', |
+ outfilename ]; |
+ self._Call(cmd) |
+ elif self._is_git_checkout: |
+ cmd = [ 'git', 'add', outfilename ] |
+ self._Call(cmd) |
+ # Rebaseline the given configs for a single test. |
+ # |
+ # params: |
+ # expectations_subdir |
+ # builder_name |
+ # test: a single test to rebaseline |
+ def _RebaselineOneTest(self, expectations_subdir, builder_name, test): |
+ if self._configs: |
+ configs = self._configs |
+ else: |
+ if (expectations_subdir == 'base-shuttle-win7-intel-angle'): |
+ configs = [ 'angle', 'anglemsaa16' ] |
+ else: |
+ configs = [ '565', '8888', 'gpu', 'pdf', 'mesa', 'msaa16', |
+ 'msaa4' ] |
+ print '# ' + expectations_subdir + ':' |
+ for config in configs: |
+ infilename = test + '_' + config + '.png' |
+ print '# ' + infilename |
+ outfilename = os.path.join(expectations_subdir, infilename); |
+ self._RebaselineOneFile(expectations_subdir=expectations_subdir, |
+ builder_name=builder_name, |
+ infilename=infilename, |
+ outfilename=outfilename) |
+ # Rebaseline all platforms/tests/types we specified in the constructor. |
+ def RebaselineAll(self): |
+ for test in self._tests: |
+ for subdir in self._subdirs: |
+ if not subdir in SUBDIR_MAPPING.keys(): |
+ raise Exception(('unrecognized platform subdir "%s"; ' + |
+ 'should be one of %s') % ( |
+ subdir, SUBDIR_MAPPING.keys())) |
+ builder_name = SUBDIR_MAPPING[subdir] |
+ self._RebaselineOneTest(expectations_subdir=subdir, |
+ builder_name=builder_name, |
+ test=test) |
-if len(sys.argv) < 2: |
- print ('Usage: ' + os.path.basename(sys.argv[0]) + |
- ' <testname> [ <testname> ... ]') |
- exit(1) |
-for testname in sys.argv[1:]: |
- for expectations_subdir in sorted(subdir_mapping.keys()): |
- builder_name = subdir_mapping[expectations_subdir] |
- RebaselineOneTest(expectations_subdir=expectations_subdir, |
- builder_name=builder_name, |
- testname=testname) |
+# main... |
+ |
+parser = argparse.ArgumentParser() |
+parser.add_argument('--configs', metavar='CONFIG', nargs='+', |
epoger
2013/05/30 15:39:28
This means: if "--configs" is given, it MUST be fo
|
+ help='which configurations to rebaseline, e.g. ' + |
+ '"--configs 565 8888"; if unspecified, run a default ' + |
+ 'set of configs') |
+parser.add_argument('--dry_run', action='store_true', |
+ help='instead of actually downloading files or adding ' + |
+ 'files to checkout, display a list of operations that ' + |
+ 'we would normally perform') |
+parser.add_argument('--subdirs', metavar='SUBDIR', nargs='+', |
+ help='which platform subdirectories to rebaseline; ' + |
+ 'if unspecified, rebaseline all subdirs, same as ' + |
+ '"--subdirs %s"' % ' '.join(sorted(SUBDIR_MAPPING.keys()))) |
+parser.add_argument('--tests', metavar='TEST', nargs='+', required=True, |
+ help='which tests to rebaseline, e.g. ' + |
+ '"--tests aaclip bigmatrix"') |
+args = parser.parse_args() |
+rebaseliner = Rebaseliner(tests=args.tests, configs=args.configs, |
+ subdirs=args.subdirs, dry_run=args.dry_run) |
+rebaseliner.RebaselineAll() |