def main():
    if len(sys.argv) < 3:
        raise RuntimeError(__doc__)

    try:
        before = StrictVersion(sys.argv[1])
    except ValueError:
        before = sys.argv[1]
    else:
        if before < StrictVersion('14.0'):
            before = OLD_VERSION.format(version=before)
        else:
            before = KGS_VERSION.format(version=before)

    try:
        after = StrictVersion(sys.argv[2])
    except ValueError:
        after = sys.argv[2]
    else:
        if after < StrictVersion('14.0'):
            after = OLD_VERSION.format(version=after)
        else:
            after = KGS_VERSION.format(version=after)

    if after == 'master':
        after = KGS_VERSION.format(version=after)

    format = sys.argv[3].lower() if len(sys.argv) > 3 else ''
    if format == 'json':
        out = StringIO()
    else:
        out = sys.stdout

    before = pullVersions(before)
    after = pullVersions(after)
    sources = pullSources(SOURCES)

    before = dict(before)
    sources = dict(sources)
    for package, version in after:
        previous = before.get(package, StrictVersion('0.0'))
        if version <= previous:
            continue

        change = "\n## %s: %s ~ %s" % (package, previous, version)
        print(change, file=out)

        source = sources.get(package, None)
        if not source:
            continue

        response = None
        for structure in [
                "raw/develop/docs/HISTORY.txt", "raw/develop/HISTORY.txt",
                "raw/develop/CHANGES.txt"
                "raw/develop/docs/CHANGES.txt", "raw/master/docs/HISTORY.txt",
                "raw/master/HISTORY.txt", "raw/master/CHANGES.txt"
                "raw/master/docs/CHANGES.txt", "docs/HISTORY.txt",
                "docs/CHANGES.txt", "CHANGES.txt", "HISTORY.txt"
        ]:

            try:
                response = urllib2.urlopen("%s/%s" % (source, structure))
            except urllib2.HTTPError:
                continue
            else:
                break

        if not response:
            continue

        logtext = response.read()
        tree = publish_doctree(logtext)

        def isValidVersionSection(x):
            if x.tagname == "section":
                try:
                    logVersion = StrictVersion(x['names'][0].split()[0])
                except Exception:
                    pass
                else:
                    return logVersion > previous and logVersion <= version
            return False

        foundSections = tree.traverse(condition=isValidVersionSection)
        if foundSections:
            for s in foundSections:
                s.children[-1]
                childlist = s.children[-1]
                bullet = "- "
                for child in childlist.children:
                    text = child.astext()
                    text = text.replace("\n", "\n" + " " * len(bullet))
                    print("* {text}".format(text=text), file=out)
        else:
            print("* https://pypi.org/project/{package}#changelog".format(
                package=package),
                  file=out)

    if format == 'json':
        out.seek(0)
        print(json.dumps(out.read()))