Force a Git branch to remain merged with master
At my workplace, we decided we should have two branches that are automatically rolled out on development and production servers respectively, and so I set out to ascertain that developers first make sure the master branch works; I thought the end-result would be useful to others so here it is:
#!/usr/bin/env python2.6 # assert that updating refs/heads/dev or refs/heads/prod is not possible # without first putting that commit into the ancestry of refs/heads/master. import sys import subprocess master_ref = "refs/heads/master" checked_refs = ("refs/heads/dev", "refs/heads/prod") def git_merge_base(a, b): "find the earliest common ancestor of a, b" args = ["git", "merge-base", a, b] p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=sys.stderr) if p.wait() != 0: sys.stderr.write("git-merge-base exited %d\n" % p.returncode) sys.exit(128) return p.stdout.read().strip() def check(cid): base = git_merge_base(cid, master_ref) if base != new: sys.stderr.write("%s is not an ancestor of %s\n" "%s diverges at %s\n" % (cid, master_ref, new, base)) sys.exit(1) return True if __name__ == "__main__": for line in sys.stdin: (old, new, refname) = line.strip().split(" ", 2) if refname in checked_refs: check(new)
Comments
