| #!/usr/bin/python | 
 | # Copyright (C) 2013 The Android Open Source Project | 
 | # | 
 | # 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 | 
 | # | 
 | # http://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. | 
 | # | 
 | # TODO(sop): Be more detailed: version, link to Maven Central | 
 |  | 
 | from __future__ import print_function | 
 |  | 
 | from collections import defaultdict, deque | 
 | import re | 
 | from shutil import copyfileobj | 
 | from subprocess import Popen, PIPE | 
 | from sys import stdout | 
 |  | 
 | MAIN = ['//gerrit-pgm:pgm', '//gerrit-gwtui:ui_module'] | 
 |  | 
 | def parse_graph(): | 
 |   graph = defaultdict(list) | 
 |   p = Popen( | 
 |     ['buck', 'audit', 'classpath', '--dot'] + MAIN, | 
 |     stdout = PIPE) | 
 |   for line in p.stdout: | 
 |     m = re.search(r'"(//.*?)" -> "(//.*?)";', line) | 
 |     if not m: | 
 |       continue | 
 |     target, dep = m.group(1), m.group(2) | 
 |     if not target.endswith('__compile'): | 
 |       graph[target].append(dep) | 
 |   r = p.wait() | 
 |   if r != 0: | 
 |     exit(r) | 
 |   return graph | 
 |  | 
 | graph = parse_graph() | 
 | licenses = defaultdict(set) | 
 |  | 
 | queue = deque(MAIN) | 
 | while queue: | 
 |   target = queue.popleft() | 
 |   for dep in graph[target]: | 
 |     if not dep.startswith('//lib:LICENSE-'): | 
 |       continue | 
 |     licenses[dep].add(target) | 
 |   queue.extend(graph[target]) | 
 | used = sorted(licenses.keys()) | 
 |  | 
 | print("""\ | 
 | Gerrit Code Review - Licenses | 
 | ============================= | 
 |  | 
 | Gerrit open source software is licensed under the <<Apache2_0,Apache | 
 | License 2.0>>.  Executable distributions also include other software | 
 | components that are provided under additional licenses. | 
 |  | 
 | [[cryptography]] | 
 | Cryptography Notice | 
 | ------------------- | 
 |  | 
 | This distribution includes cryptographic software.  The country | 
 | in which you currently reside may have restrictions on the import, | 
 | possession, use, and/or re-export to another country, of encryption | 
 | software.  BEFORE using any encryption software, please check | 
 | your country's laws, regulations and policies concerning the | 
 | import, possession, or use, and re-export of encryption software, | 
 | to see if this is permitted.  See the | 
 | link:http://www.wassenaar.org/[Wassenaar Arrangement] | 
 | for more information. | 
 |  | 
 | The U.S. Government Department of Commerce, Bureau of Industry | 
 | and Security (BIS), has classified this software as Export | 
 | Commodity Control Number (ECCN) 5D002.C.1, which includes | 
 | information security software using or performing cryptographic | 
 | functions with asymmetric algorithms.  The form and manner of | 
 | this distribution makes it eligible for export under the License | 
 | Exception ENC Technology Software Unrestricted (TSU) exception | 
 | (see the BIS Export Administration Regulations, Section 740.13) | 
 | for both object code and source code. | 
 |  | 
 | Gerrit includes an SSH daemon (Apache SSHD), to support authenticated | 
 | uploads of changes directly from `git push` command line clients. | 
 |  | 
 | Gerrit includes an SSH client (JSch), to support authenticated | 
 | replication of changes to remote systems, such as for automatic | 
 | updates of mirror servers, or realtime backups. | 
 |  | 
 | For either feature to function, Gerrit requires the | 
 | link:http://java.sun.com/javase/technologies/security/[Java Cryptography extensions] | 
 | and/or the | 
 | link:http://www.bouncycastle.org/java.html[Bouncy Castle Crypto API] | 
 | to be installed by the end-user. | 
 |  | 
 | Licenses | 
 | -------- | 
 | """) | 
 |  | 
 | for n in used: | 
 |   libs = sorted(licenses[n]) | 
 |   name = n[len('//lib:LICENSE-'):] | 
 |   print() | 
 |   print('[[%s]]' % name.replace('.', '_')) | 
 |   print(name) | 
 |   print('~' * len(name)) | 
 |   print() | 
 |   for d in libs: | 
 |     if d.startswith('//lib:') or d.startswith('//lib/'): | 
 |       p = d[len('//lib:'):] | 
 |     else: | 
 |       p = d[d.index(':')+1:].lower() | 
 |     print('* ' + p) | 
 |   print() | 
 |   print('----') | 
 |   with open(n[2:].replace(':', '/')) as fd: | 
 |     copyfileobj(fd, stdout) | 
 |   print('----') | 
 |  | 
 | print(""" | 
 | GERRIT | 
 | ------ | 
 | Part of link:index.html[Gerrit Code Review] | 
 | """) |