Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1167)

Unified Diff: download_from_google_storage.py

Issue 126893002: Adds --auto_platform to download_from_google_storage. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: optparse fix Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tests/download_from_google_storage_unittests.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: download_from_google_storage.py
diff --git a/download_from_google_storage.py b/download_from_google_storage.py
index bfb1b3c1ccc80013cf96c3cf9daaf8a0b9f962bf..8370515e6a15879c3ddf5c1e8693efeb595a8ccd 100755
--- a/download_from_google_storage.py
+++ b/download_from_google_storage.py
@@ -22,6 +22,13 @@ import subprocess2
GSUTIL_DEFAULT_PATH = os.path.join(
os.path.dirname(os.path.abspath(__file__)),
'third_party', 'gsutil', 'gsutil')
+# Maps sys.platform to what we actually want to call them.
+PLATFORM_MAPPING = {
+ 'cygwin': 'win',
+ 'darwin': 'mac',
+ 'linux2': 'linux',
+ 'win32': 'win',
+}
class FileNotFoundError(IOError):
@@ -32,6 +39,10 @@ class InvalidFileError(IOError):
pass
+class InvalidPlatformError(Exception):
+ pass
+
+
def GetNormalizedPlatform():
"""Returns the result of sys.platform accounting for cygwin.
Under cygwin, this will always return "win32" like the native Python."""
@@ -116,6 +127,17 @@ def check_bucket_permissions(bucket, gsutil):
return (base_url, code)
+def check_platform(target):
+ """Checks if any parent directory of target matches (win|mac|linux)."""
+ assert os.path.isabs(target)
+ root, target_name = os.path.split(target)
+ if not target_name:
+ return None
+ if target_name in ('linux', 'mac', 'win'):
+ return target_name
+ return check_platform(root)
+
+
def get_sha1(filename):
sha1 = hashlib.sha1()
with open(filename, 'rb') as f:
@@ -131,7 +153,8 @@ def get_sha1(filename):
# Download-specific code starts here
def enumerate_work_queue(input_filename, work_queue, directory,
- recursive, ignore_errors, output, sha1_file):
+ recursive, ignore_errors, output, sha1_file,
+ auto_platform):
if sha1_file:
if not os.path.exists(input_filename):
if not ignore_errors:
@@ -164,6 +187,20 @@ def enumerate_work_queue(input_filename, work_queue, directory,
for filename in files:
full_path = os.path.join(root, filename)
if full_path.endswith('.sha1'):
+ if auto_platform:
+ # Skip if the platform does not match.
+ target_platform = check_platform(os.path.abspath(full_path))
+ if not target_platform:
+ err = ('--auto_platform passed in but no platform name found in '
+ 'the path of %s' % full_path)
+ if not ignore_errors:
+ raise InvalidFileError(err)
+ print >> sys.stderr, err
+ continue
+ current_platform = PLATFORM_MAPPING[sys.platform]
+ if current_platform != target_platform:
+ continue
+
with open(full_path, 'rb') as f:
sha1_match = re.match('^([A-Za-z0-9]{40})$', f.read(1024).rstrip())
if sha1_match:
@@ -240,7 +277,7 @@ def printer_worker(output_queue):
def download_from_google_storage(
input_filename, base_url, gsutil, num_threads, directory, recursive,
- force, output, ignore_errors, sha1_file, verbose):
+ force, output, ignore_errors, sha1_file, verbose, auto_platform):
# Start up all the worker threads.
all_threads = []
download_start = time.time()
@@ -263,7 +300,7 @@ def download_from_google_storage(
# Enumerate our work queue.
work_queue_size = enumerate_work_queue(
input_filename, work_queue, directory, recursive,
- ignore_errors, output, sha1_file)
+ ignore_errors, output, sha1_file, auto_platform)
for _ in all_threads:
work_queue.put((None, None)) # Used to tell worker threads to stop.
@@ -334,6 +371,12 @@ def main(args):
help='A regular expression that is compared against '
'Python\'s sys.platform. If this option is specified, '
'the download will happen only if there is a match.')
+ parser.add_option('-a', '--auto_platform',
+ action='store_true',
+ help='Detects if any parent folder of the target matches '
+ '(linux|mac|win). If so, the script will only '
+ 'process files that are in the paths that '
+ 'that matches the current platform.')
parser.add_option('-v', '--verbose', action='store_true',
help='Output extra diagnostic and progress information.')
@@ -341,6 +384,8 @@ def main(args):
# Make sure we should run at all based on platform matching.
if options.platform:
+ if options.auto_platform:
+ parser.error('--platform can not be specified with --auto_platform')
if not re.match(options.platform, GetNormalizedPlatform()):
if options.verbose:
print('The current platform doesn\'t match "%s", skipping.' %
@@ -378,6 +423,11 @@ def main(args):
parser.error('--recursive specified but --directory not specified.')
if options.output and options.directory:
parser.error('--directory is specified, so --output has no effect.')
+ if (not (options.sha1_file or options.directory)
+ and options.auto_platform):
+ parser.error('--auto_platform must be specified with either '
+ '--sha1_file or --directory')
+
input_filename = args[0]
# Set output filename if not specified.
@@ -410,7 +460,7 @@ def main(args):
return download_from_google_storage(
input_filename, base_url, gsutil, options.num_threads, options.directory,
options.recursive, options.force, options.output, options.ignore_errors,
- options.sha1_file, options.verbose)
+ options.sha1_file, options.verbose, options.auto_platform)
if __name__ == '__main__':
« no previous file with comments | « no previous file | tests/download_from_google_storage_unittests.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698