diff --git a/Scripts/git_hooks/README.md b/Scripts/git_hooks/README.md new file mode 100644 index 000000000..146c2df48 --- /dev/null +++ b/Scripts/git_hooks/README.md @@ -0,0 +1 @@ +Copy these git hooks into .git/hooks diff --git a/Scripts/git_hooks/post-commit b/Scripts/git_hooks/post-commit new file mode 100755 index 000000000..ed392f169 --- /dev/null +++ b/Scripts/git_hooks/post-commit @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +Scripts/reverse_integration_check.py diff --git a/Scripts/git_hooks/pre-commit b/Scripts/git_hooks/pre-commit new file mode 100755 index 000000000..89a316307 --- /dev/null +++ b/Scripts/git_hooks/pre-commit @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +Scripts/precommit.py diff --git a/SignalServiceKit/Utilities/precommit.py b/Scripts/precommit.py similarity index 100% rename from SignalServiceKit/Utilities/precommit.py rename to Scripts/precommit.py diff --git a/Scripts/reverse_integration_check.py b/Scripts/reverse_integration_check.py new file mode 100755 index 000000000..c366354ba --- /dev/null +++ b/Scripts/reverse_integration_check.py @@ -0,0 +1,45 @@ +#!/usr/bin/python + +# 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 = [unmerged_tag for unmerged_tag in unmerged_tags if LooseVersion(unmerged_tag) > LooseVersion(epoch_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() diff --git a/SignalServiceKit/Utilities/post-commit b/SignalServiceKit/Utilities/post-commit deleted file mode 100755 index 8ce81df92..000000000 --- a/SignalServiceKit/Utilities/post-commit +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -git log -1 HEAD | grep -i FREEBIE > /dev/null - -if [[ $? -ne 0 ]] -then - cat <