hghooks/mozhghooks/check/prevent_repolocked_commits.py (33 lines of code) (raw):

# This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. from __future__ import absolute_import from ..checks import ( PreTxnChangegroupCheck, print_banner, ) CROSSREPO_PUSH_DETECTED = b""" Push contains commits locked to another repo. Please ensure there are no commits containing REPO-%s in the title. This repo will only accept such commits containing REPO-%s. """ BAD_FORMATTING_SLASH_DETECTED = b""" Push contains commits intended to be locked to %s but the repo name is badly formatted. '/' is not allowed. This repo will only accept commits containing REPO-%s in the title. """ UNRESTRICTED_REPOS = [b"try"] class RepoLockedCheck(PreTxnChangegroupCheck): """ Prevents commits locked to a certain repo from being pushed to another. A commit is locked to a repo X by having REPO-X in the title. """ @property def name(self): return b"repolocked_check" def relevant(self): return self.repo_metadata[b"path"] not in UNRESTRICTED_REPOS def pre(self, node): pass def check(self, ctx): repo = self.repo_metadata[b"path"].split(b"/")[-1] title = ctx.description().splitlines()[0] locked_to_repos = [ word.split(b"REPO-", 1)[1] for word in title.split(b" ") if b"REPO-" in word ] bad = next((lr for lr in locked_to_repos if b"/" in lr), None) if bad: print_banner(self.ui, b"error", BAD_FORMATTING_SLASH_DETECTED % (bad, repo)) return False if locked_to_repos and not any(lr == repo for lr in locked_to_repos): bad = next(lr for lr in locked_to_repos if lr != repo) print_banner(self.ui, b"error", CROSSREPO_PUSH_DETECTED % (bad, repo)) return False return True def post_check(self): return True