| Index: tools/deep_memory_profiler/subcommands/upload.py
|
| diff --git a/tools/deep_memory_profiler/subcommands/upload.py b/tools/deep_memory_profiler/subcommands/upload.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..de34a8a715ea929e38fa77fac7723b25c6190d51
|
| --- /dev/null
|
| +++ b/tools/deep_memory_profiler/subcommands/upload.py
|
| @@ -0,0 +1,79 @@
|
| +# Copyright 2013 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 logging
|
| +import os
|
| +import subprocess
|
| +import tempfile
|
| +import zipfile
|
| +
|
| +from lib.subcommand import SubCommand
|
| +from lib.symbol import SymbolDataSources
|
| +
|
| +
|
| +LOGGER = logging.getLogger('dmprof')
|
| +
|
| +
|
| +class UploadCommand(SubCommand):
|
| + def __init__(self):
|
| + super(UploadCommand, self).__init__(
|
| + 'Usage: %prog upload [--gsutil path/to/gsutil] '
|
| + '<first-dump> <destination-gs-path>')
|
| + self._parser.add_option('--gsutil', default='gsutil',
|
| + help='path to GSUTIL', metavar='GSUTIL')
|
| +
|
| + def do(self, sys_argv):
|
| + options, args = self._parse_args(sys_argv, 2)
|
| + dump_path = args[1]
|
| + gs_path = args[2]
|
| +
|
| + dump_files = SubCommand._find_all_dumps(dump_path)
|
| + bucket_files = SubCommand._find_all_buckets(dump_path)
|
| + prefix = SubCommand._find_prefix(dump_path)
|
| + symbol_data_sources = SymbolDataSources(prefix)
|
| + symbol_data_sources.prepare()
|
| + symbol_path = symbol_data_sources.path()
|
| +
|
| + handle_zip, filename_zip = tempfile.mkstemp('.zip', 'dmprof')
|
| + os.close(handle_zip)
|
| +
|
| + try:
|
| + file_zip = zipfile.ZipFile(filename_zip, 'w', zipfile.ZIP_DEFLATED)
|
| + for filename in dump_files:
|
| + file_zip.write(filename, os.path.basename(os.path.abspath(filename)))
|
| + for filename in bucket_files:
|
| + file_zip.write(filename, os.path.basename(os.path.abspath(filename)))
|
| +
|
| + symbol_basename = os.path.basename(os.path.abspath(symbol_path))
|
| + for filename in os.listdir(symbol_path):
|
| + if not filename.startswith('.'):
|
| + file_zip.write(os.path.join(symbol_path, filename),
|
| + os.path.join(symbol_basename, os.path.basename(
|
| + os.path.abspath(filename))))
|
| + file_zip.close()
|
| +
|
| + returncode = UploadCommand._run_gsutil(
|
| + options.gsutil, 'cp', '-a', 'public-read', filename_zip, gs_path)
|
| + finally:
|
| + os.remove(filename_zip)
|
| +
|
| + return returncode
|
| +
|
| + @staticmethod
|
| + def _run_gsutil(gsutil, *args):
|
| + """Run gsutil as a subprocess.
|
| +
|
| + Args:
|
| + *args: Arguments to pass to gsutil. The first argument should be an
|
| + operation such as ls, cp or cat.
|
| + Returns:
|
| + The return code from the process.
|
| + """
|
| + command = [gsutil] + list(args)
|
| + LOGGER.info("Running: %s", command)
|
| +
|
| + try:
|
| + return subprocess.call(command)
|
| + except OSError, e:
|
| + LOGGER.error('Error to run gsutil: %s', e)
|
|
|