text: #!/usr/bin/python
  # Copyright 2018 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.
  
  # Build and push the {vers}/all/ssl_error_assistant.pb file to GCS so
  # that the component update system will pick it up and push it to users.
  # See README.md before running this.
  #
  # Requires ninja and gsutil to be in the user's path.
  
  import optparse
  import os
  import shutil
  import subprocess
  import sys
  
  
  DEST_BUCKET = 'gs://chrome-components-ssl-error-assistant'
  RESOURCE_SUBDIR = 'components/resources/ssl/ssl_error_assistant'
  
  # Subdirectory to be copied to Google Cloud Storage. Contains a copy of the
  # generated proto under a versioned directory.
  GS_COPY_DIR = "gs_copy"
  
  # TODO(meacer): This is pretty much a duplicate of
  #               chrome/browser/safe_browsing/push_file_type_proto.py. Consider
  #               refactoring and reusing code.
  def main():
    parser = optparse.OptionParser()
    parser.add_option('-d', '--dir',
                      help='An up-to-date GN/Ninja build directory, '
                      'such as ./out/Debug')
  
    (opts, _) = parser.parse_args()
    if opts.dir is None:
      parser.print_help()
      return 1
  
    # Clear out the target dir before we build so we can be sure we've got
    # the freshest version.
    target_dir = os.path.join(opts.dir, "gen", RESOURCE_SUBDIR)
    if os.path.isdir(target_dir):
      shutil.rmtree(target_dir)
  
    gn_command = ['ninja',
                  '-C', opts.dir,
                  RESOURCE_SUBDIR + ':make_ssl_error_assistant_protobuf']
    print "Running the following"
    print "   " + (' '.join(gn_command))
    if subprocess.call(gn_command):
      print "Ninja failed."
      return 1
  
    # Use the versioned files under the copy directory to push to the GCS bucket.
    copy_dir = os.path.join(target_dir, GS_COPY_DIR)
    os.chdir(copy_dir)
  
    # Sanity check that there is a versioned copy under the directory.
    dirs = os.listdir('.')
    assert len(dirs) == 1 and dirs[0].isdigit(), (
        "There must be a single versioned dir under " + copy_dir)
  
    # Push the files with their directories, in the form
    #   {vers}/{platform}/download_file_types.pb
    # Don't overwrite existing files, in case we forgot to increment the
    # version.
    version_dir = dirs[0]
    command = ['gsutil', 'cp', '-Rn', version_dir, DEST_BUCKET]
  
    print '\nGoing to run the following command'
    print '   ', ' '.join(command)
    print '\nIn directory'
    print '   ', copy_dir
    print '\nWhich should push the following files'
    expected_files = [os.path.join(dp, f) for dp, _, fn in
                      os.walk(version_dir) for f in fn]
    for f in expected_files:
      print '   ', f
  
    shall = raw_input('\nAre you sure (y/N) ').lower() == 'y'
    if not shall:
      print 'aborting'
      return 1
    return subprocess.call(command)
  
  
  if __name__ == '__main__':
    sys.exit(main())
  