#!/usr/bin/python
# -*- coding: utf-8 -*-

# When we make a hotfix, we need to reverse integrate our hotfix back into
# master. After commiting to master, this script audits that all tags have been
# reverse integrated.
import subprocess
from distutils.version import LooseVersion
import logging

#logging.basicConfig(level=logging.DEBUG)

def is_on_master():
    output = subprocess.check_output(["git", "rev-parse", "--abbrev-ref", "HEAD"]).strip()
    logging.debug("branch output: %s" % output)
    return output == "master"

def main():
    if not is_on_master():
        # Don't interfere while on a feature or hotfix branch
        logging.debug("not on master branch")
        return

    logging.debug("on master branch")

    unmerged_tags_output = subprocess.check_output(["git", "tag", "--no-merged", "master"])
    unmerged_tags = [line.strip() for line in unmerged_tags_output.split("\n") if len(line) > 0]

    logging.debug("All unmerged tags: %s" % unmerged_tags)

    # Before this point we weren't always reverse integrating our tags.  As we
    # audit old tags, we can ratchet this version number back.
    epoch_tag="2.21.0"

    logging.debug("ignoring tags before epoch_tag: %s" % epoch_tag)

    tags_of_concern = [tag for tag in unmerged_tags if LooseVersion(tag) > LooseVersion(epoch_tag)]

    # Don't reverse integrate tags for adhoc builds
    tags_of_concern = [tag for tag in tags_of_concern if "adhoc" not in tag]

    tags_to_ignore = [
        '2.23.3.0',
        '2.23.3.1',
        '2.26.0.6',
        '2.26.0.7',
        '2.26.0.15',
        '2.26.0.16',
        '2.29.0.7',
        '2.29.0.8',
        '2.29.0.9',
        '2.29.0.11',
        '2.30.0.0',
        '2.30.0.1',
        '2.30.2.0',
        '3.0',
        '3.0.1',
        '3.0.2',
        # These tags were from unmerged branches investigating an issue that only reproduced when installed from TF.
        '2.34.0.10', '2.34.0.11', '2.34.0.12', '2.34.0.13', '2.34.0.15', '2.34.0.16', '2.34.0.17', '2.34.0.18', '2.34.0.19', '2.34.0.20', '2.34.0.6', '2.34.0.7', '2.34.0.8', '2.34.0.9',
        '2.37.3.0',
        '2.37.4.0',
        # these were internal release only tags, now we include "-internal" in the tag name to avoid this
        '2.38.0.2.1',
        '2.38.0.3.1',
        '2.38.0.4.1',
        # the work in these tags was moved to the 2.38.1 release instead
        '2.38.0.12',
        '2.38.0.13',
        '2.38.0.14',
        # 
    ]
    tags_of_concern = [tag for tag in tags_of_concern if tag not in tags_to_ignore]

    # Interal Builds
    #
    # If you want to tag a build which is not intended to be reverse
    # integrated, include the text "internal" somewhere in the tag name, such as
    #
    # 1.2.3.4.5-internal
    # 1.2.3.4.5-internal-mkirk
    #
    # NOTE: that if you upload the build to test flight, you still need to give testflight
    # a numeric build number - so tag won't match the build number exactly as they do
    # with production build tags. That's fine.
    #
    # To avoid collision with "production" build numbers, use at least a 5
    # digit build number.
    tags_of_concern = [tag for tag in tags_of_concern if "internal" not in tag]

    if len(tags_of_concern) > 0:
        logging.debug("Found unmerged tags newer than epoch: %s" % tags_of_concern)
        raise RuntimeError("💥 Found unmerged tags: %s" % tags_of_concern)
    else:
        logging.debug("No unmerged tags newer than epoch. All good!")

if __name__ == "__main__":
        main()
