| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 | 2 |
| 3 """ | 3 """ |
| 4 Copyright 2014 Google Inc. | 4 Copyright 2014 Google Inc. |
| 5 | 5 |
| 6 Use of this source code is governed by a BSD-style license that can be | 6 Use of this source code is governed by a BSD-style license that can be |
| 7 found in the LICENSE file. | 7 found in the LICENSE file. |
| 8 | 8 |
| 9 Compare results of two render_pictures runs. | 9 Compare results of two render_pictures runs. |
| 10 | 10 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 gm_json.JSONKEY_ACTUALRESULTS, | 78 gm_json.JSONKEY_ACTUALRESULTS, |
| 79 gm_json.JSONKEY_EXPECTEDRESULTS, | 79 gm_json.JSONKEY_EXPECTEDRESULTS, |
| 80 ] | 80 ] |
| 81 | 81 |
| 82 | 82 |
| 83 class RenderedPicturesComparisons(results.BaseComparisons): | 83 class RenderedPicturesComparisons(results.BaseComparisons): |
| 84 """Loads results from multiple render_pictures runs into an ImagePairSet. | 84 """Loads results from multiple render_pictures runs into an ImagePairSet. |
| 85 """ | 85 """ |
| 86 | 86 |
| 87 def __init__(self, | 87 def __init__(self, |
| 88 setA_dirs, setB_dirs, | 88 setA_dir, setB_dir, |
| 89 setA_section, setB_section, | 89 setA_section, setB_section, |
| 90 image_diff_db, | 90 image_diff_db, |
| 91 image_base_gs_url=DEFAULT_IMAGE_BASE_GS_URL, diff_base_url=None, | 91 image_base_gs_url=DEFAULT_IMAGE_BASE_GS_URL, diff_base_url=None, |
| 92 setA_label=None, setB_label=None, | 92 setA_label=None, setB_label=None, |
| 93 gs=None, truncate_results=False, prefetch_only=False, | 93 gs=None, truncate_results=False, prefetch_only=False, |
| 94 download_all_images=False): | 94 download_all_images=False): |
| 95 """Constructor: downloads images and generates diffs. | 95 """Constructor: downloads images and generates diffs. |
| 96 | 96 |
| 97 Once the object has been created (which may take a while), you can call its | 97 Once the object has been created (which may take a while), you can call its |
| 98 get_packaged_results_of_type() method to quickly retrieve the results... | 98 get_packaged_results_of_type() method to quickly retrieve the results... |
| 99 unless you have set prefetch_only to True, in which case we will | 99 unless you have set prefetch_only to True, in which case we will |
| 100 asynchronously warm up the ImageDiffDB cache but not fill in self._results. | 100 asynchronously warm up the ImageDiffDB cache but not fill in self._results. |
| 101 | 101 |
| 102 Args: | 102 Args: |
| 103 setA_dirs: list of root directories to copy all JSON summaries from, | 103 setA_dir: root directory to copy all JSON summaries from, and to use as |
| 104 and to use as setA within the comparisons. These directories may be | 104 setA within the comparisons. This directory may be specified as a |
| 105 gs:// URLs, special "repo:" URLs, or local filepaths. | 105 gs:// URL, special "repo:" URL, or local filepath. |
| 106 setB_dirs: list of root directories to copy all JSON summaries from, | 106 setB_dir: root directory to copy all JSON summaries from, and to use as |
| 107 and to use as setB within the comparisons. These directories may be | 107 setB within the comparisons. This directory may be specified as a |
| 108 gs:// URLs, special "repo:" URLs, or local filepaths. | 108 gs:// URL, special "repo:" URL, or local filepath. |
| 109 setA_section: which section within setA to examine; must be one of | 109 setA_section: which section within setA to examine; must be one of |
| 110 ALLOWED_SECTION_NAMES | 110 ALLOWED_SECTION_NAMES |
| 111 setB_section: which section within setB to examine; must be one of | 111 setB_section: which section within setB to examine; must be one of |
| 112 ALLOWED_SECTION_NAMES | 112 ALLOWED_SECTION_NAMES |
| 113 image_diff_db: ImageDiffDB instance | 113 image_diff_db: ImageDiffDB instance |
| 114 image_base_gs_url: "gs://" URL pointing at the Google Storage bucket/dir | 114 image_base_gs_url: "gs://" URL pointing at the Google Storage bucket/dir |
| 115 under which all render_pictures result images can | 115 under which all render_pictures result images can |
| 116 be found; this will be used to read images for comparison within | 116 be found; this will be used to read images for comparison within |
| 117 this code, and included in the ImagePairSet (as an HTTP URL) so its | 117 this code, and included in the ImagePairSet (as an HTTP URL) so its |
| 118 consumers know where to download the images from | 118 consumers know where to download the images from |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 self._setA_label = setA_label or setA_section | 152 self._setA_label = setA_label or setA_section |
| 153 self._setB_label = setB_label or setB_section | 153 self._setB_label = setB_label or setB_section |
| 154 else: | 154 else: |
| 155 self._setA_label = setA_label or 'setA' | 155 self._setA_label = setA_label or 'setA' |
| 156 self._setB_label = setB_label or 'setB' | 156 self._setB_label = setB_label or 'setB' |
| 157 | 157 |
| 158 tempdir = tempfile.mkdtemp() | 158 tempdir = tempfile.mkdtemp() |
| 159 try: | 159 try: |
| 160 setA_root = os.path.join(tempdir, 'setA') | 160 setA_root = os.path.join(tempdir, 'setA') |
| 161 setB_root = os.path.join(tempdir, 'setB') | 161 setB_root = os.path.join(tempdir, 'setB') |
| 162 setA_repo_revision = None | 162 # TODO(stephana): There is a potential race condition here... we copy |
| 163 setB_repo_revision = None | 163 # the contents out of the source_dir, and THEN we get the commithash |
| 164 for source_dir in setA_dirs: | 164 # of source_dir. If source_dir points at a git checkout, and that |
| 165 self._copy_dir_contents(source_dir=source_dir, dest_dir=setA_root) | 165 # checkout is updated (by a different thread/process) during this |
| 166 # TODO(stephana): There is a potential race condition here... we copy | 166 # operation, then the contents and commithash will be out of sync. |
| 167 # the contents out of the source_dir, and THEN we get the commithash | 167 self._copy_dir_contents(source_dir=setA_dir, dest_dir=setA_root) |
| 168 # of source_dir. If source_dir points at a git checkout, and that | 168 setA_repo_revision = self._get_repo_revision(source_dir=setA_dir) |
| 169 # checkout is updated (by a different thread/process) during this | 169 self._copy_dir_contents(source_dir=setB_dir, dest_dir=setB_root) |
| 170 # operation, then the contents and commithash will be out of sync. | 170 setB_repo_revision = self._get_repo_revision(source_dir=setB_dir) |
| 171 setA_repo_revision = self._get_repo_revision( | |
| 172 source_dir=source_dir, assert_if_not=setA_repo_revision) | |
| 173 for source_dir in setB_dirs: | |
| 174 self._copy_dir_contents(source_dir=source_dir, dest_dir=setB_root) | |
| 175 setB_repo_revision = self._get_repo_revision( | |
| 176 source_dir=source_dir, assert_if_not=setB_repo_revision) | |
| 177 | 171 |
| 178 self._setA_descriptions = { | 172 self._setA_descriptions = { |
| 179 results.KEY__SET_DESCRIPTIONS__DIR: setA_dirs, | 173 results.KEY__SET_DESCRIPTIONS__DIR: setA_dir, |
| 180 results.KEY__SET_DESCRIPTIONS__REPO_REVISION: setA_repo_revision, | 174 results.KEY__SET_DESCRIPTIONS__REPO_REVISION: setA_repo_revision, |
| 181 results.KEY__SET_DESCRIPTIONS__SECTION: setA_section, | 175 results.KEY__SET_DESCRIPTIONS__SECTION: setA_section, |
| 182 } | 176 } |
| 183 self._setB_descriptions = { | 177 self._setB_descriptions = { |
| 184 results.KEY__SET_DESCRIPTIONS__DIR: setB_dirs, | 178 results.KEY__SET_DESCRIPTIONS__DIR: setB_dir, |
| 185 results.KEY__SET_DESCRIPTIONS__REPO_REVISION: setB_repo_revision, | 179 results.KEY__SET_DESCRIPTIONS__REPO_REVISION: setB_repo_revision, |
| 186 results.KEY__SET_DESCRIPTIONS__SECTION: setB_section, | 180 results.KEY__SET_DESCRIPTIONS__SECTION: setB_section, |
| 187 } | 181 } |
| 188 | 182 |
| 189 time_start = int(time.time()) | 183 time_start = int(time.time()) |
| 190 self._results = self._load_result_pairs( | 184 self._results = self._load_result_pairs( |
| 191 setA_root=setA_root, setB_root=setB_root, | 185 setA_root=setA_root, setB_root=setB_root, |
| 192 setA_section=setA_section, setB_section=setB_section) | 186 setA_section=setA_section, setB_section=setB_section) |
| 193 if self._results: | 187 if self._results: |
| 194 self._timestamp = int(time.time()) | 188 self._timestamp = int(time.time()) |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 461 if gs_utils.GSUtils.is_gs_url(source_dir): | 455 if gs_utils.GSUtils.is_gs_url(source_dir): |
| 462 (bucket, path) = gs_utils.GSUtils.split_gs_url(source_dir) | 456 (bucket, path) = gs_utils.GSUtils.split_gs_url(source_dir) |
| 463 self._gs.download_dir_contents(source_bucket=bucket, source_dir=path, | 457 self._gs.download_dir_contents(source_bucket=bucket, source_dir=path, |
| 464 dest_dir=dest_dir) | 458 dest_dir=dest_dir) |
| 465 elif source_dir.lower().startswith(REPO_URL_PREFIX): | 459 elif source_dir.lower().startswith(REPO_URL_PREFIX): |
| 466 repo_dir = os.path.join(REPO_BASEPATH, source_dir[len(REPO_URL_PREFIX):]) | 460 repo_dir = os.path.join(REPO_BASEPATH, source_dir[len(REPO_URL_PREFIX):]) |
| 467 shutil.copytree(repo_dir, dest_dir) | 461 shutil.copytree(repo_dir, dest_dir) |
| 468 else: | 462 else: |
| 469 shutil.copytree(source_dir, dest_dir) | 463 shutil.copytree(source_dir, dest_dir) |
| 470 | 464 |
| 471 def _get_repo_revision(self, source_dir, assert_if_not=None): | 465 def _get_repo_revision(self, source_dir): |
| 472 """Get the commit hash of source_dir, IF it refers to a git checkout. | 466 """Get the commit hash of source_dir, IF it refers to a git checkout. |
| 473 | 467 |
| 474 Args: | 468 Args: |
| 475 source_dir: path to source dir (GS URL, local filepath, or a special | 469 source_dir: path to source dir (GS URL, local filepath, or a special |
| 476 "repo:" URL type that points at a file within our Skia checkout; | 470 "repo:" URL type that points at a file within our Skia checkout; |
| 477 only the "repo:" URL type will have a commit hash. | 471 only the "repo:" URL type will have a commit hash. |
| 478 assert_if_not: if not None, raise an Exception if source_dir has a | |
| 479 commit hash and that hash is not equal to this | |
| 480 """ | 472 """ |
| 481 if source_dir.lower().startswith(REPO_URL_PREFIX): | 473 if source_dir.lower().startswith(REPO_URL_PREFIX): |
| 482 repo_dir = os.path.join(REPO_BASEPATH, source_dir[len(REPO_URL_PREFIX):]) | 474 repo_dir = os.path.join(REPO_BASEPATH, source_dir[len(REPO_URL_PREFIX):]) |
| 483 revision = subprocess.check_output( | 475 return subprocess.check_output( |
| 484 args=[git_utils.GIT, 'rev-parse', 'HEAD'], cwd=repo_dir).strip() | 476 args=[git_utils.GIT, 'rev-parse', 'HEAD'], cwd=repo_dir).strip() |
| 485 if assert_if_not and revision != assert_if_not: | |
| 486 raise Exception('found revision %s that did not match %s' % ( | |
| 487 revision, assert_if_not)) | |
| 488 return revision | |
| 489 else: | 477 else: |
| 490 return None | 478 return None |
| OLD | NEW |