Index: tools/download_baselines.py |
=================================================================== |
--- tools/download_baselines.py (revision 10693) |
+++ tools/download_baselines.py (working copy) |
@@ -1,235 +0,0 @@ |
-''' |
-Downloads the actual gm results most recently generated by the Skia buildbots, |
-and adds any new ones to SVN control. |
- |
-Launch with --help to see more information. |
- |
- |
-Copyright 2011 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 re |
-import shutil |
-import sys |
-import tempfile |
- |
-# modules declared within this same directory |
-import compare_baselines |
-import svn |
- |
-USAGE_STRING = 'Usage: %s [options] [baseline_subdir]...' |
-HELP_STRING = ''' |
- |
-Downloads the actual gm results most recently generated by the Skia buildbots, |
-and adds any new ones to SVN control. |
- |
-If no baseline_subdir is given, then this tool will download the most-recently |
-generated actual gm results for ALL platforms. |
- |
-''' + compare_baselines.HOWTO_STRING |
- |
-# Base URL of SVN repository where buildbots store actual gm image results. |
-GM_ACTUAL_URL = 'http://skia-autogen.googlecode.com/svn/gm-actual' |
- |
-# GM baseline image URL in regular Skia SVN repository |
-GM_BASELINE_URL = 'https://skia.googlecode.com/svn/gm-expected' |
- |
-GM_EXPECTED_DIR = 'gm-expected' |
- |
-OPTION_ADD_NEW_FILES = '--add-new-files' |
-OPTION_BUILDER_SUFFIX = '--builder-suffix' |
-DEFAULT_BUILDER_SUFFIX = '32' |
-OPTION_IGNORE_LOCAL_MODS = '--ignore-local-mods' |
- |
-def GetLatestResultsSvnUrl(svn, baseline_subdir, builder_suffix): |
- """Return SVN URL from which we can check out the MOST RECENTLY generated images for this |
- baseline type. |
- |
- @param svn an Svn object we can use to call ListSubdirs() |
- @param baseline_subdir indicates which platform we want images for |
- @param builder_suffix if multiple builders uploaded actual GM images for this baseline type, |
- choose the one whose builder_name matches this suffix |
- """ |
- root_url = '%s/%s' % (GM_ACTUAL_URL, baseline_subdir) |
- subdirs = sorted(svn.ListSubdirs(root_url)) |
- num_subdirs = len(subdirs) |
- print('Within actual-results root URL %s, found these %d subdirs (presumably builder_names): %s' |
- % (root_url, num_subdirs, subdirs)) |
- |
- selected_subdir = None |
- if num_subdirs == 0: |
- print 'Found no builder_name subdirs, so reading actual images from the root_url itself.' |
- return root_url |
- elif num_subdirs == 1: |
- selected_subdir = subdirs[0] |
- print 'Found exactly one subdir in actual-results root_url: %s' % selected_subdir |
- else: |
- for possible_subdir in subdirs: |
- if possible_subdir.endswith(builder_suffix): |
- selected_subdir = possible_subdir |
- print 'Selected the first subdir ending in "%s": %s' % ( |
- builder_suffix, selected_subdir) |
- break |
- |
- if selected_subdir: |
- return '%s/%s/%s' % (root_url, selected_subdir, baseline_subdir) |
- else: |
- raise Exception('none of these subdirs of %s ended in "%s": %s' % ( |
- root_url, builder_suffix, subdirs)) |
- |
-def GetBaselineSvnUrl(baseline_subdir): |
- """Return SVN URL from which we can check out the baseline images for this |
- baseline type. |
- |
- @param baseline_subdir indicates which platform we want baselines for |
- """ |
- return '%s/%s' % (GM_BASELINE_URL, baseline_subdir) |
- |
-def CopyMatchingFiles(source_dir, dest_dir, filename_pattern, only_copy_updates=False): |
- """Copy all files from source_dir that match filename_pattern, and save them (with their |
- original filenames) in dest_dir. |
- |
- @param source_dir |
- @param dest_dir where to save the copied files |
- @param filename_pattern only copy files that match this Unix-style filename |
- pattern (e.g., '*.jpg') |
- @param only_copy_updates if True, only copy files that are already present in dest_dir |
- """ |
- all_filenames = os.listdir(source_dir) |
- matching_filenames = fnmatch.filter(all_filenames, filename_pattern) |
- for filename in matching_filenames: |
- source_path = os.path.join(source_dir, filename) |
- dest_path = os.path.join(dest_dir, filename) |
- if only_copy_updates and not os.path.isfile(dest_path): |
- continue |
- shutil.copyfile(source_path, dest_path) |
- |
-def DownloadBaselinesForOnePlatform(baseline_subdir): |
- """Download most recently generated baseline images for a single platform, |
- and add any new ones to SVN control. |
- |
- @param baseline_subdir |
- """ |
- # Create repo_to_modify to handle the SVN repository we will add files to. |
- gm_dir = os.path.join(os.pardir, GM_EXPECTED_DIR) # Shouldn't assume we're in trunk... |
- try: |
- os.makedirs(gm_dir) |
- except: |
- pass |
- repo_to_modify = svn.Svn(gm_dir) |
- repo_to_modify.Checkout(GetBaselineSvnUrl(baseline_subdir), baseline_subdir) |
- |
- # If there are any locally modified files in that directory, exit |
- # (so that we don't risk overwriting the user's previous work). |
- new_and_modified_files = repo_to_modify.GetNewAndModifiedFiles() |
- if not options.ignore_local_mods: |
- if new_and_modified_files: |
- raise Exception('Exiting because there are already new and/or ' |
- 'modified files in %s. To continue in spite of ' |
- 'that, run with %s option.' % ( |
- baseline_subdir, OPTION_IGNORE_LOCAL_MODS)) |
- |
- # Download actual gm images into a separate repo in a temporary directory. |
- actual_dir = tempfile.mkdtemp() |
- actual_repo = svn.Svn(actual_dir) |
- print 'Using %s as a temp dir' % actual_dir |
- actual_url = GetLatestResultsSvnUrl(svn=actual_repo, baseline_subdir=baseline_subdir, |
- builder_suffix=options.builder_suffix) |
- print 'Reading actual buildbot GM results from %s' % actual_url |
- actual_repo.Checkout(actual_url, '.') |
- |
- # Copy any of those files we are interested in into repo_to_modify, |
- # and then delete the temporary directory. |
- CopyMatchingFiles(source_dir=actual_dir, |
- dest_dir=os.path.join(gm_dir, baseline_subdir), |
- filename_pattern='*.png', |
- only_copy_updates=(not options.add_new_files)) |
- shutil.rmtree(actual_dir) |
- actual_repo = None |
- |
- # Add any new files to SVN control (if we are running with add_new_files). |
- if options.add_new_files: |
- new_files = repo_to_modify.GetNewFiles() |
- if new_files: |
- repo_to_modify.AddFiles(sorted(new_files)) |
- |
- # Set the mimetype property on any new/modified image files in |
- # baseline_subdir. (We used to set the mimetype property on *all* image |
- # files in the directory, even those whose content wasn't changing, |
- # but that caused confusion. See |
- # http://code.google.com/p/skia/issues/detail?id=618 .) |
- modified_files = repo_to_modify.GetNewAndModifiedFiles() |
- repo_to_modify.SetProperty(sorted(fnmatch.filter(modified_files, '*.png')), |
- svn.PROPERTY_MIMETYPE, 'image/png') |
- repo_to_modify.SetProperty(sorted(fnmatch.filter(modified_files, '*.pdf')), |
- svn.PROPERTY_MIMETYPE, 'application/pdf') |
- |
-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. |
- """ |
- # If no platforms are specified, do 'em all. |
- num_args = len(args) |
- if num_args == 0: |
- # TODO(epoger): automate the default set of platforms. We want to ensure |
- # that the user gets all of the platforms that the bots are running, |
- # not just whatever subdirectories he happens to have checked out... |
- # See http://code.google.com/p/skia/issues/detail?id=678 |
- # Now that we have added Svn.ListSubdirs(), we should be able to do this |
- # pretty easily... |
- # |
- # For now, I generate this list using these Unix commands: |
- # svn ls http://skia.googlecode.com/svn/gm-expected | grep ^base | sort >/tmp/baselines |
- # svn ls http://skia-autogen.googlecode.com/svn/gm-actual | grep ^base | sort >/tmp/actual |
- # comm -1 -2 /tmp/baselines /tmp/actual |
- args = [ |
- 'base-android-galaxy-nexus', |
- 'base-android-nexus-7', |
- 'base-android-nexus-s', |
- 'base-android-xoom', |
- 'base-macmini', |
- 'base-macmini-lion-float', |
- 'base-shuttle-win7-intel-float', |
- 'base-shuttle_ubuntu12_ati5770', |
- 'base-shuttle-win7-intel-angle', |
- 'base-shuttle-win7-intel-directwrite', |
- ] |
- |
- # Trim all subdir names. |
- baseline_subdirs = [] |
- for arg in args: |
- baseline_subdirs.append(arg.rstrip(os.sep)) |
- |
- # Process the subdirs, one at a time. |
- for baseline_subdir in baseline_subdirs: |
- DownloadBaselinesForOnePlatform(baseline_subdir=baseline_subdir) |
- |
-if __name__ == '__main__': |
- parser = optparse.OptionParser(USAGE_STRING % '%prog' + HELP_STRING) |
- parser.add_option(OPTION_ADD_NEW_FILES, |
- action='store_true', default=False, |
- help='in addition to downloading new versions of ' |
- 'existing baselines, also download baselines that are ' |
- 'not under SVN control yet') |
- parser.add_option(OPTION_BUILDER_SUFFIX, |
- action='store', type='string', default=DEFAULT_BUILDER_SUFFIX, |
- help='if multiple builders have uploaded actual GM images ' |
- 'for this platform, download the images uploaded by the ' |
- 'builder whose name ends in this suffix; defaults to ' |
- '"%s".' % DEFAULT_BUILDER_SUFFIX) |
- parser.add_option(OPTION_IGNORE_LOCAL_MODS, |
- action='store_true', default=False, |
- help='allow tool to run even if there are already ' |
- 'local modifications in the baseline_subdir') |
- (options, args) = parser.parse_args() |
- Main(options, args) |