#!/usr/bin/env python

# reads bazel query XML files, to join target names with their licenses.

from __future__ import print_function

import argparse
from collections import defaultdict
from shutil import copyfileobj
from sys import stdout, stderr
import xml.etree.ElementTree as ET


DO_NOT_DISTRIBUTE = "//lib:LICENSE-DO_NOT_DISTRIBUTE"

LICENSE_PREFIX = "//lib:LICENSE-"

parser = argparse.ArgumentParser()
parser.add_argument("--asciidoctor", action="store_true")
parser.add_argument("xmls", nargs="+")
args = parser.parse_args()

entries = defaultdict(list)
graph = defaultdict(list)
handled_rules = []

for xml in args.xmls:
  tree = ET.parse(xml)
  root = tree.getroot()

  for child in root:
    rule_name = child.attrib["name"]
    if rule_name in handled_rules:
      # already handled in other xml files
      continue

    handled_rules.append(rule_name)
    for c in child.getchildren():
      if c.tag != "rule-input":
        continue

      license_name = c.attrib["name"]
      if LICENSE_PREFIX in license_name:
        entries[rule_name].append(license_name)
        graph[license_name].append(rule_name)

if len(graph[DO_NOT_DISTRIBUTE]):
  print("DO_NOT_DISTRIBUTE license found in:", file=stderr)
  for target in graph[DO_NOT_DISTRIBUTE]:
    print(target, file=stderr)
  exit(1)

if args.asciidoctor:
  print(
# We don't want any blank line before "= Gerrit Code Review - Licenses"
"""= 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.

== Licenses
""")

for n in sorted(graph.keys()):
  if len(graph[n]) == 0:
    continue

  name = n[len(LICENSE_PREFIX):]
  safename = name.replace(".", "_")
  print()
  print("[[%s]]" % safename)
  print(name)
  print()
  for d in sorted(graph[n]):
    if d.startswith("//lib:") or d.startswith("//lib/"):
      p = d[len("//lib:"):]
    else:
      p = d[d.index(":")+1:].lower()
    if "__" in p:
      p = p[:p.index("__")]
    print("* " + p)
  print()
  print("[[%s_license]]" % safename)
  print("----")
  with open(n[2:].replace(":", "/")) as fd:
    copyfileobj(fd, stdout)
  print()
  print("----")
  print()

if args.asciidoctor:
  print(
"""
GERRIT
------
Part of link:index.html[Gerrit Code Review]
""")
