blob: d7333bb5f9e02ffc661e8eabe2f20313dde685cf [file] [log] [blame]
#!/usr/bin/env python3
# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import sys
import optparse
import os
from typing import Iterator
for path in os.environ['PATH'].split(os.path.pathsep):
if path.endswith('depot_tools') and path not in sys.path:
sys.path.insert(0, path)
import upload_to_google_storage
import common
def main():
parser = optparse.OptionParser(upload_to_google_storage.USAGE_STRING)
parser.add_option('-b',
'--bucket',
default='chromium-website-lob-storage',
help='Google Storage bucket to upload to.')
parser.add_option('-e', '--boto', help='Specify a custom boto file.')
parser.add_option('-f',
'--force',
action='store_true',
help='Force upload even if remote file exists.')
parser.add_option('-g',
'--gsutil_path',
default=upload_to_google_storage.GSUTIL_DEFAULT_PATH,
help='Path to the gsutil script.')
parser.add_option('-m',
'--use_md5',
action='store_true',
help='Generate MD5 files when scanning, and don\'t check '
'the MD5 checksum if a .md5 file is found.')
parser.add_option('-t',
'--num_threads',
default=1,
type='int',
help='Number of uploader threads to run.')
parser.add_option('-s',
'--skip_hashing',
action='store_true',
help='Skip hashing if .sha1 file exists.')
parser.add_option('-0',
'--use_null_terminator',
action='store_true',
help='Use \\0 instead of \\n when parsing '
'the file list from stdin. This is useful if the input '
'is coming from "find ... -print0".')
parser.add_option('-z',
'--gzip',
metavar='ext',
help='Gzip files which end in ext. '
'ext is a comma-separated list')
parser.add_option('-d', '--directory', help='The target is a directory. ')
parser.add_option('-r',
'--remove',
action='store_true',
help='Removes the file that was uploaded to storage. ')
(options, args) = parser.parse_args()
if options.directory:
input_filenames = get_lobs_from_dir(options.directory)
if len(input_filenames) == 0:
print("No LOB files found in directory to upload")
return 0
else:
# Enumerate our inputs.
input_filenames = upload_to_google_storage.get_targets(
args, parser, options.use_null_terminator)
# Make sure we can find a working instance of gsutil.
if os.path.exists(upload_to_google_storage.GSUTIL_DEFAULT_PATH):
gsutil = upload_to_google_storage.Gsutil(
upload_to_google_storage.GSUTIL_DEFAULT_PATH,
boto_path=options.boto)
else:
parser.error('gsutil not found in %s, bad depot_tools checkout?' %
upload_to_google_storage.GSUTIL_DEFAULT_PATH)
base_url = 'gs://%s' % options.bucket
upload_status = upload_to_google_storage.upload_to_google_storage(
input_filenames, base_url, gsutil, options.force, options.use_md5,
options.num_threads, options.skip_hashing, options.gzip)
if upload_status:
return upload_status
if options.remove:
remove_lobs(input_filenames)
return 0
def remove_lobs(lob_files):
for lob_file in lob_files:
if os.path.exists(lob_file):
os.remove(lob_file)
def get_lob_extensions() -> Iterator[str]:
"""Get the list of known LOB extensions."""
with open(common.SITE_DIR + '/.gitignore', encoding='utf-8') as fp:
for line in fp:
if line.rstrip() != '# start_lob_ignore':
continue
for line in fp:
line = line.rstrip()
if line == '# end_lob_ignore':
return
if line and not line.startswith('#'):
assert line.startswith('*')
yield line[1:]
def get_lobs_from_dir(directory):
lobs = []
for (dirpath, _, filenames) in os.walk(directory):
for filename in filenames:
absolute_filename = os.path.join(dirpath, filename)
if os.path.isfile(absolute_filename):
for ext in get_lob_extensions():
if filename.endswith(ext):
lobs.append(absolute_filename)
break
return lobs
if __name__ == '__main__':
try:
sys.exit(main())
except KeyboardInterrupt:
sys.stderr.write('interrupted\n')
sys.exit(1)