1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#!/usr/bin/python
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved.
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# found in the LICENSE file.
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)"""Generates the contents of an Cronet LICENSE file for the third-party code.
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)It makes use of src/tools/licenses.py and the README.chromium files on which
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)it depends. Based on android_webview/tools/webview_licenses.py.
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)"""
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import optparse
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import os
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import sys
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import textwrap
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)REPOSITORY_ROOT = os.path.abspath(os.path.join(
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    os.path.dirname(__file__), '..', '..', '..'))
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)sys.path.append(os.path.join(REPOSITORY_ROOT, 'tools'))
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import licenses
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)def _ReadFile(path):
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  """Reads a file from disk.
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Args:
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    path: The path of the file to read, relative to the root of the repository.
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Returns:
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    The contents of the file as a string.
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  """
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return open(os.path.join(REPOSITORY_ROOT, path), 'rb').read()
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)def GenerateLicense():
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  """Generates the contents of an Cronet LICENSE file for the third-party code.
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Returns:
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    The contents of the LICENSE file.
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  """
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  # TODO(mef): Generate list of third_party libraries using checkdeps.
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  third_party_dirs = [
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "libevent",
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "ashmem",
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "zlib",
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "modp_b64",
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    "boringssl"
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ]
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  # Start with Chromium's LICENSE file
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content = [_ReadFile('LICENSE')]
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  # Add necessary third_party.
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for directory in sorted(third_party_dirs):
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    metadata = licenses.ParseDir("third_party/" + directory, REPOSITORY_ROOT,
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 require_license_file=True)
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content.append("-" * 20)
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content.append(directory)
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content.append("-" * 20)
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    license_file = metadata['License File']
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if license_file and license_file != licenses.NOT_SHIPPED:
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      content.append(_ReadFile(license_file))
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return '\n'.join(content)
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)def main():
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  class FormatterWithNewLines(optparse.IndentedHelpFormatter):
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    def format_description(self, description):
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      paras = description.split('\n')
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      formatted_paras = [textwrap.fill(para, self.width) for para in paras]
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return '\n'.join(formatted_paras) + '\n'
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  parser = optparse.OptionParser(formatter=FormatterWithNewLines(),
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 usage='%prog command [options]')
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  parser.description = (__doc__ +
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       '\nCommands:\n' \
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       '  license [filename]\n' \
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       '    Generate Cronet LICENSE to filename or stdout.\n')
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  (_, args) = parser.parse_args()
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if not args:
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    parser.print_help()
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return 1
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if args[0] == 'license':
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if len(args) > 1:
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      print 'Saving license to %s' % args[1]
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      f = open(args[1], "w")
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      try:
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        f.write(GenerateLicense())
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      finally:
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        f.close()
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else:
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      print GenerateLicense()
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return 0
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  parser.print_help()
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return 1
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)if __name__ == '__main__':
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  sys.exit(main())
100