blob: c6b97ac57526caecc670d41085d0c53b73ca8611 [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Uploads debug symbols to the symbols server."""
import argparse
import os
import subprocess
import sys
import tempfile
## Path to the engine root checkout. This is used to calculate absolute
## paths if relative ones are passed to the script.
BUILD_ROOT_DIR = os.path.abspath(os.path.join(os.path.realpath(__file__), '..', '..', '..', '..'))
FUCHSIA_ARTIFACTS_DEBUG_NAMESPACE = 'debug'
FUCHSIA_ARTIFACTS_BUCKET_NAME = 'fuchsia-artifacts-release'
def remote_filename(exec_path):
# An example of exec_path is:
# out/fuchsia_debug_x64/flutter-fuchsia-x64/d4/917f5976.debug
# In the above example "d4917f5976" is the elf BuildID for the
# executable. First 2 characters are used as the directory name
# and the rest of the string is the name of the unstripped executable.
parts = exec_path.split('/')
# We want d4917f5976.debug as the result.
return ''.join(parts[-2:])
def exists_remotely(remote_path):
gsutil = os.path.join(os.environ['DEPOT_TOOLS'], 'gsutil.py')
command = ['python3', gsutil, '--', 'stat', remote_path]
process = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
stdout, stderr = process.communicate()
return_code = process.wait()
if return_code == 0:
print('%s exists - skipping copy' % remote_path)
return return_code == 0
def process_symbols(should_upload, symbol_dir):
full_path = os.path.join(BUILD_ROOT_DIR, symbol_dir)
files = []
for (dirpath, dirnames, filenames) in os.walk(full_path):
files.extend([os.path.join(dirpath, f) for f in filenames])
print('List of files to upload')
print('\n'.join(files))
# Remove dbg_files
files = [f for f in files if 'dbg_success' not in f]
for file in files:
remote_path = 'gs://%s/%s/%s' % (
FUCHSIA_ARTIFACTS_BUCKET_NAME, FUCHSIA_ARTIFACTS_DEBUG_NAMESPACE, remote_filename(file)
)
if should_upload and not exists_remotely(remote_path):
gsutil = os.path.join(os.environ['DEPOT_TOOLS'], 'gsutil.py')
command = ['python3', gsutil, '--', 'cp', file, remote_path]
subprocess.check_call(command)
else:
print(remote_path)
def main():
parser = argparse.ArgumentParser()
parser.add_argument(
'--symbol-dir', required=True, help='Directory that contain the debug symbols.'
)
parser.add_argument('--engine-version', required=True, help='Specifies the flutter engine SHA.')
parser.add_argument(
'--upload', default=False, action='store_true', help='If set, uploads symbols to the server.'
)
args = parser.parse_args()
should_upload = args.upload
engine_version = args.engine_version
if not engine_version:
engine_version = 'HEAD'
should_upload = False
process_symbols(should_upload, args.symbol_dir)
return 0
if __name__ == '__main__':
sys.exit(main())