xref: /aosp_15_r20/external/cronet/build/copy_test_data_ios.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6777b538SAndroid Build Coastguard Worker# Copyright 2012 The Chromium Authors
3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
5*6777b538SAndroid Build Coastguard Worker
6*6777b538SAndroid Build Coastguard Worker"""Copies test data files or directories into a given output directory."""
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Workerimport optparse
10*6777b538SAndroid Build Coastguard Workerimport os
11*6777b538SAndroid Build Coastguard Workerimport shutil
12*6777b538SAndroid Build Coastguard Workerimport sys
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Workerclass WrongNumberOfArgumentsException(Exception):
15*6777b538SAndroid Build Coastguard Worker  pass
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Workerdef EscapePath(path):
18*6777b538SAndroid Build Coastguard Worker  """Returns a path with spaces escaped."""
19*6777b538SAndroid Build Coastguard Worker  return path.replace(" ", "\\ ")
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Workerdef ListFilesForPath(path):
22*6777b538SAndroid Build Coastguard Worker  """Returns a list of all the files under a given path."""
23*6777b538SAndroid Build Coastguard Worker  output = []
24*6777b538SAndroid Build Coastguard Worker  # Ignore revision control metadata directories.
25*6777b538SAndroid Build Coastguard Worker  if (os.path.basename(path).startswith('.git') or
26*6777b538SAndroid Build Coastguard Worker      os.path.basename(path).startswith('.svn')):
27*6777b538SAndroid Build Coastguard Worker    return output
28*6777b538SAndroid Build Coastguard Worker
29*6777b538SAndroid Build Coastguard Worker  # Files get returned without modification.
30*6777b538SAndroid Build Coastguard Worker  if not os.path.isdir(path):
31*6777b538SAndroid Build Coastguard Worker    output.append(path)
32*6777b538SAndroid Build Coastguard Worker    return output
33*6777b538SAndroid Build Coastguard Worker
34*6777b538SAndroid Build Coastguard Worker  # Directories get recursively expanded.
35*6777b538SAndroid Build Coastguard Worker  contents = os.listdir(path)
36*6777b538SAndroid Build Coastguard Worker  for item in contents:
37*6777b538SAndroid Build Coastguard Worker    full_path = os.path.join(path, item)
38*6777b538SAndroid Build Coastguard Worker    output.extend(ListFilesForPath(full_path))
39*6777b538SAndroid Build Coastguard Worker  return output
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Workerdef CalcInputs(inputs):
42*6777b538SAndroid Build Coastguard Worker  """Computes the full list of input files for a set of command-line arguments.
43*6777b538SAndroid Build Coastguard Worker  """
44*6777b538SAndroid Build Coastguard Worker  # |inputs| is a list of paths, which may be directories.
45*6777b538SAndroid Build Coastguard Worker  output = []
46*6777b538SAndroid Build Coastguard Worker  for input in inputs:
47*6777b538SAndroid Build Coastguard Worker    output.extend(ListFilesForPath(input))
48*6777b538SAndroid Build Coastguard Worker  return output
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Workerdef CopyFiles(relative_filenames, output_basedir):
51*6777b538SAndroid Build Coastguard Worker  """Copies files to the given output directory."""
52*6777b538SAndroid Build Coastguard Worker  for file in relative_filenames:
53*6777b538SAndroid Build Coastguard Worker    relative_dirname = os.path.dirname(file)
54*6777b538SAndroid Build Coastguard Worker    output_dir = os.path.join(output_basedir, relative_dirname)
55*6777b538SAndroid Build Coastguard Worker    output_filename = os.path.join(output_basedir, file)
56*6777b538SAndroid Build Coastguard Worker
57*6777b538SAndroid Build Coastguard Worker    # In cases where a directory has turned into a file or vice versa, delete it
58*6777b538SAndroid Build Coastguard Worker    # before copying it below.
59*6777b538SAndroid Build Coastguard Worker    if os.path.exists(output_dir) and not os.path.isdir(output_dir):
60*6777b538SAndroid Build Coastguard Worker      os.remove(output_dir)
61*6777b538SAndroid Build Coastguard Worker    if os.path.exists(output_filename) and os.path.isdir(output_filename):
62*6777b538SAndroid Build Coastguard Worker      shutil.rmtree(output_filename)
63*6777b538SAndroid Build Coastguard Worker
64*6777b538SAndroid Build Coastguard Worker    if not os.path.exists(output_dir):
65*6777b538SAndroid Build Coastguard Worker      os.makedirs(output_dir)
66*6777b538SAndroid Build Coastguard Worker    shutil.copy(file, output_filename)
67*6777b538SAndroid Build Coastguard Worker
68*6777b538SAndroid Build Coastguard Workerdef DoMain(argv):
69*6777b538SAndroid Build Coastguard Worker  parser = optparse.OptionParser()
70*6777b538SAndroid Build Coastguard Worker  usage = 'Usage: %prog -o <output_dir> [--inputs] [--outputs] <input_files>'
71*6777b538SAndroid Build Coastguard Worker  parser.set_usage(usage)
72*6777b538SAndroid Build Coastguard Worker  parser.add_option('-o', dest='output_dir')
73*6777b538SAndroid Build Coastguard Worker  parser.add_option('--inputs', action='store_true', dest='list_inputs')
74*6777b538SAndroid Build Coastguard Worker  parser.add_option('--outputs', action='store_true', dest='list_outputs')
75*6777b538SAndroid Build Coastguard Worker  options, arglist = parser.parse_args(argv)
76*6777b538SAndroid Build Coastguard Worker
77*6777b538SAndroid Build Coastguard Worker  if len(arglist) == 0:
78*6777b538SAndroid Build Coastguard Worker    raise WrongNumberOfArgumentsException('<input_files> required.')
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker  files_to_copy = CalcInputs(arglist)
81*6777b538SAndroid Build Coastguard Worker  escaped_files = [EscapePath(x) for x in CalcInputs(arglist)]
82*6777b538SAndroid Build Coastguard Worker  if options.list_inputs:
83*6777b538SAndroid Build Coastguard Worker    return '\n'.join(escaped_files)
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Worker  if not options.output_dir:
86*6777b538SAndroid Build Coastguard Worker    raise WrongNumberOfArgumentsException('-o required.')
87*6777b538SAndroid Build Coastguard Worker
88*6777b538SAndroid Build Coastguard Worker  if options.list_outputs:
89*6777b538SAndroid Build Coastguard Worker    outputs = [os.path.join(options.output_dir, x) for x in escaped_files]
90*6777b538SAndroid Build Coastguard Worker    return '\n'.join(outputs)
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker  CopyFiles(files_to_copy, options.output_dir)
93*6777b538SAndroid Build Coastguard Worker  return
94*6777b538SAndroid Build Coastguard Worker
95*6777b538SAndroid Build Coastguard Workerdef main(argv):
96*6777b538SAndroid Build Coastguard Worker  try:
97*6777b538SAndroid Build Coastguard Worker    result = DoMain(argv[1:])
98*6777b538SAndroid Build Coastguard Worker  except WrongNumberOfArgumentsException as e:
99*6777b538SAndroid Build Coastguard Worker    print(e, file=sys.stderr)
100*6777b538SAndroid Build Coastguard Worker    return 1
101*6777b538SAndroid Build Coastguard Worker  if result:
102*6777b538SAndroid Build Coastguard Worker    print(result)
103*6777b538SAndroid Build Coastguard Worker  return 0
104*6777b538SAndroid Build Coastguard Worker
105*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__':
106*6777b538SAndroid Build Coastguard Worker  sys.exit(main(sys.argv))
107