| Index: tools/compare_baselines.py
|
| ===================================================================
|
| --- tools/compare_baselines.py (revision 10693)
|
| +++ tools/compare_baselines.py (working copy)
|
| @@ -1,209 +0,0 @@
|
| -'''
|
| -Compares the gm results within the local checkout against those already
|
| -committed to the Skia repository.
|
| -
|
| -Launch with --help to see more information.
|
| -
|
| -
|
| -Copyright 2012 Google Inc.
|
| -
|
| -Use of this source code is governed by a BSD-style license that can be
|
| -found in the LICENSE file.
|
| -'''
|
| -
|
| -# common Python modules
|
| -import fnmatch
|
| -import optparse
|
| -import os
|
| -import shutil
|
| -import tempfile
|
| -
|
| -# modules declared within this same directory
|
| -import svn
|
| -
|
| -USAGE_STRING = 'Usage: %s [options]'
|
| -HOWTO_STRING = '''
|
| -To update the checked-in baselines across all platforms, follow these steps:
|
| -
|
| -cd .../trunk
|
| -svn update
|
| -svn stat # and make sure there are no files awaiting svn commit
|
| -make tools BUILDTYPE=Release
|
| -python tools/download_baselines.py
|
| -python tools/compare_baselines.py
|
| -# view compare_baselines output in a browser and make sure it's reasonable
|
| -# upload CL for review
|
| -# validate that the diffs look right in the review tool
|
| -# commit CL
|
| -
|
| -Note that the above instructions will only *update* already-checked-in
|
| -baseline images; if you want to check in new baseline images (ones that the
|
| -bots have been generating but we don't have a golden master for yet), you need
|
| -to use download_baselines.py's --add-new-files option.
|
| -'''
|
| -HELP_STRING = '''
|
| -
|
| -Compares the gm results within the local checkout against those already
|
| -committed to the Skia repository. Relies on skdiff to do the low-level
|
| -comparison.
|
| -
|
| -''' + HOWTO_STRING
|
| -
|
| -TRUNK_PATH = os.path.join(os.path.dirname(__file__), os.pardir)
|
| -
|
| -OPTION_GM_BASEDIR = '--gm-basedir'
|
| -DEFAULT_GM_BASEDIR = os.path.join(TRUNK_PATH, os.pardir, 'gm-expected')
|
| -OPTION_PATH_TO_SKDIFF = '--path-to-skdiff'
|
| -# default PATH_TO_SKDIFF is determined at runtime
|
| -OPTION_SVN_GM_URL = '--svn-gm-url'
|
| -DEFAULT_SVN_GM_URL = 'http://skia.googlecode.com/svn/gm-expected'
|
| -
|
| -def CopyAllFilesAddingPrefix(source_dir, dest_dir, prefix):
|
| - """Copy all files from source_dir into dest_dir, adding prefix to the name
|
| - of each one as we copy it.
|
| - prefixes.
|
| -
|
| - @param source_dir
|
| - @param dest_dir where to save the copied files
|
| - @param prefix prefix to add to each filename when we make the copy
|
| - """
|
| - all_filenames = os.listdir(source_dir)
|
| - for filename in all_filenames:
|
| - source_path = os.path.join(source_dir, filename)
|
| - if os.path.isdir(source_path):
|
| - print 'skipping %s because it is a directory, not a file' % filename
|
| - continue
|
| - dest_path = os.path.join(dest_dir, '%s%s' % (prefix, filename))
|
| - shutil.copyfile(source_path, dest_path)
|
| -
|
| -def Flatten(source_dir, dest_dir, subdirectory_pattern):
|
| - """Copy all files from matching subdirectories under source_dir into
|
| - dest_dir, flattened into a single directory using subdirectory names as
|
| - prefixes.
|
| -
|
| - @param source_dir
|
| - @param dest_dir where to save the copied files
|
| - @param subdirectory_pattern only copy files from subdirectories that match
|
| - this Unix-style filename pattern (e.g., 'base-*')
|
| - """
|
| - all_filenames = os.listdir(source_dir)
|
| - matching_filenames = fnmatch.filter(all_filenames, subdirectory_pattern)
|
| - for filename in matching_filenames:
|
| - source_path = os.path.join(source_dir, filename)
|
| - if not os.path.isdir(source_path):
|
| - print 'skipping %s because it is a file, not a directory' % filename
|
| - continue
|
| - print 'flattening directory %s' % source_path
|
| - CopyAllFilesAddingPrefix(source_dir=source_path, dest_dir=dest_dir,
|
| - prefix='%s_' % filename)
|
| -
|
| -def RunCommand(command):
|
| - """Run a command, raising an exception if it fails.
|
| -
|
| - @param command the command as a single string
|
| - """
|
| - print 'running command [%s]...' % command
|
| - retval = os.system(command)
|
| - #if retval is not 0:
|
| - # raise Exception('command [%s] failed' % command)
|
| -
|
| -def FindPathToSkDiff(user_set_path=None):
|
| - """Return path to an existing skdiff binary, or raise an exception if we
|
| - cannot find one.
|
| -
|
| - @param user_set_path if None, the user did not specify a path, so look in
|
| - some likely places; otherwise, only check at this path
|
| - """
|
| - if user_set_path is not None:
|
| - if os.path.isfile(user_set_path):
|
| - return user_set_path
|
| - raise Exception('unable to find skdiff at user-set path %s' %
|
| - user_set_path)
|
| - trunk_path = os.path.join(os.path.dirname(__file__), os.pardir)
|
| - possible_paths = [os.path.join(trunk_path, 'out', 'Release', 'skdiff'),
|
| - os.path.join(trunk_path, 'out', 'Debug', 'skdiff')]
|
| - for try_path in possible_paths:
|
| - if os.path.isfile(try_path):
|
| - return try_path
|
| - raise Exception('cannot find skdiff in paths %s; maybe you need to '
|
| - 'specify the %s option or build skdiff?' % (
|
| - possible_paths, OPTION_PATH_TO_SKDIFF))
|
| -
|
| -def CompareBaselines(gm_basedir, path_to_skdiff, svn_gm_url):
|
| - """Compare the gm results within gm_basedir against those already
|
| - committed to the Skia repository.
|
| -
|
| - @param gm_basedir
|
| - @param path_to_skdiff
|
| - @param svn_gm_url base URL of Subversion repository where we store the
|
| - expected GM results
|
| - """
|
| - # Validate parameters, filling in default values if necessary and possible.
|
| - if not os.path.isdir(gm_basedir):
|
| - raise Exception('cannot find gm_basedir at %s; maybe you need to '
|
| - 'specify the %s option?' % (
|
| - gm_basedir, OPTION_GM_BASEDIR))
|
| - path_to_skdiff = FindPathToSkDiff(path_to_skdiff)
|
| -
|
| - tempdir_base = tempfile.mkdtemp()
|
| -
|
| - # Download all checked-in baseline images to a temp directory
|
| - checkedin_dir = os.path.join(tempdir_base, 'checkedin')
|
| - os.mkdir(checkedin_dir)
|
| - svn.Svn(checkedin_dir).Checkout(svn_gm_url, '.')
|
| -
|
| - # Flatten those checked-in baseline images into checkedin_flattened_dir
|
| - checkedin_flattened_dir = os.path.join(tempdir_base, 'checkedin_flattened')
|
| - os.mkdir(checkedin_flattened_dir)
|
| - Flatten(source_dir=checkedin_dir, dest_dir=checkedin_flattened_dir,
|
| - subdirectory_pattern='base-*')
|
| -
|
| - # Flatten the local baseline images into local_flattened_dir
|
| - local_flattened_dir = os.path.join(tempdir_base, 'local_flattened')
|
| - os.mkdir(local_flattened_dir)
|
| - Flatten(source_dir=gm_basedir, dest_dir=local_flattened_dir,
|
| - subdirectory_pattern='base-*')
|
| -
|
| - # Run skdiff to compare checkedin_flattened_dir against local_flattened_dir
|
| - diff_dir = os.path.join(tempdir_base, 'diffs')
|
| - os.mkdir(diff_dir)
|
| - RunCommand('%s %s %s %s' % (path_to_skdiff, checkedin_flattened_dir,
|
| - local_flattened_dir, diff_dir))
|
| - print '\nskdiff results are ready in file://%s/index.html' % diff_dir
|
| - # TODO(epoger): delete tempdir_base tree to clean up after ourselves (but
|
| - # not before the user gets a chance to examine the results), and/or
|
| - # allow user to specify a different directory to write into?
|
| -
|
| -def RaiseUsageException():
|
| - raise Exception('%s\nRun with --help for more detail.' % (
|
| - USAGE_STRING % __file__))
|
| -
|
| -def Main(options, args):
|
| - """Allow other scripts to call this script with fake command-line args.
|
| - """
|
| - num_args = len(args)
|
| - if num_args != 0:
|
| - RaiseUsageException()
|
| - CompareBaselines(gm_basedir=options.gm_basedir,
|
| - path_to_skdiff=options.path_to_skdiff,
|
| - svn_gm_url=options.svn_gm_url)
|
| -
|
| -if __name__ == '__main__':
|
| - parser = optparse.OptionParser(USAGE_STRING % '%prog' + HELP_STRING)
|
| - parser.add_option(OPTION_GM_BASEDIR,
|
| - action='store', type='string', default=DEFAULT_GM_BASEDIR,
|
| - help='path to root of locally stored baseline images '
|
| - 'to compare against those checked into the svn repo; '
|
| - 'defaults to "%s"' % DEFAULT_GM_BASEDIR)
|
| - parser.add_option(OPTION_PATH_TO_SKDIFF,
|
| - action='store', type='string', default=None,
|
| - help='path to already-built skdiff tool; if not set, '
|
| - 'will search for it in typical directories near this '
|
| - 'script')
|
| - parser.add_option(OPTION_SVN_GM_URL,
|
| - action='store', type='string', default=DEFAULT_SVN_GM_URL,
|
| - help='URL of SVN repository within which we store the '
|
| - 'expected GM baseline images; defaults to "%s"' %
|
| - DEFAULT_SVN_GM_URL)
|
| - (options, args) = parser.parse_args()
|
| - Main(options, args)
|
|
|