Index: tools/telemetry/catapult_base/dependency_manager/archive_info.py |
diff --git a/tools/telemetry/catapult_base/dependency_manager/archive_info.py b/tools/telemetry/catapult_base/dependency_manager/archive_info.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6d3361679b99e85c0bf4e5abd03b073978582f6b |
--- /dev/null |
+++ b/tools/telemetry/catapult_base/dependency_manager/archive_info.py |
@@ -0,0 +1,69 @@ |
+# Copyright 2015 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import os |
+ |
+from catapult_base.dependency_manager import exceptions |
+from catapult_base.dependency_manager import dependency_manager_util |
+ |
+ |
+class ArchiveInfo(object): |
+ |
+ def __init__(self, archive_file, unzip_path, path_within_archive): |
+ """ Container for the information needed to unzip a downloaded archive. |
+ |
+ Args: |
+ archive_path: Path to the archive file. |
+ unzip_path: Path to unzip the archive into. Assumes that this path |
+ is unique for the archive. |
+ path_within_archive: Specify if and how to handle zip archives |
+ downloaded from cloud_storage. Expected values: |
+ None: Do not unzip the file downloaded from cloud_storage. |
+ '.': Unzip the file downloaded from cloud_storage. The |
+ unzipped file/folder is the expected dependency. |
+ file_path: Unzip the file downloaded from cloud_storage. |
+ |file_path| is the path to the expected dependency, |
+ relative to the unzipped archive path. |
+ """ |
+ self._archive_file = archive_file |
+ self._unzip_path = unzip_path |
+ self._path_within_archive = path_within_archive |
+ self._dependency_path = os.path.join( |
+ self._unzip_path, self._path_within_archive) |
+ if not self._has_minimum_data: |
+ raise ValueError( |
+ 'Not enough information specified to initialize an archive info.' |
+ ' %s' % self) |
+ |
+ def GetUnzippedPath(self): |
+ if self.ShouldUnzipArchive(): |
+ # TODO(aiolos): Replace UnzipFile with zipfile.extractall once python |
+ # version 2.7.4 or later can safely be assumed. |
+ dependency_manager_util.UnzipArchive( |
+ self._archive_file, self._unzip_path) |
+ if self.ShouldUnzipArchive(): |
+ raise exceptions.ArchiveError( |
+ "Expected path '%s' was not extracted from archive '%s'." % |
+ (self._dependency_path, self._archive_file)) |
+ return self._dependency_path |
+ |
+ def ShouldUnzipArchive(self): |
+ if not self._has_minimum_data: |
+ raise exceptions.ArchiveError( |
+ 'Missing needed info to unzip archive. Known data: %s', |
+ self.data_string) |
+ return not os.path.exists(self._dependency_path) |
+ |
+ @property |
+ def _has_minimum_data(self): |
+ return all([self._archive_file, self._unzip_path, |
+ self._dependency_path]) |
+ |
+ def __repr__(self): |
+ return ( |
+ 'ArchiveInfo(archive_file=%s, unzip_path=%s, path_within_archive=%s, ' |
+ 'dependency_path =%s)' % ( |
+ self._archive_file, self._unzip_path, self._path_within_archive, |
+ self._dependency_path)) |
+ |