|
#!/usr/bin/python |
|
## |
|
# Author: Nicolas Martinez V. <mailto:[email protected]> |
|
# Description: Git Hook (server-side) allowing to prevent merge from some branches to anothers |
|
# based on the hook created by Bertrand Benoit <mailto:[email protected]> |
|
## Version: 0.9 |
|
|
|
import sys |
|
import subprocess |
|
import re |
|
|
|
class branches: |
|
def __init__(self, origin, destination): |
|
self.origin = origin |
|
self.destination = destination |
|
|
|
def getOrigin(self): |
|
return self.origin |
|
|
|
def getDestination(self): |
|
return self.destination |
|
|
|
branchesList = [] |
|
|
|
# add branches here |
|
branchesList.append(branches('develop', 'testing')) |
|
branchesList.append(branches('testing', 'master')) |
|
|
|
# Considers only merge commit. |
|
if not (len(sys.argv) >= 2 and sys.argv[2] == 'merge'): |
|
sys.exit(0) |
|
|
|
with open(sys.argv[1], 'r') as f: |
|
mergeMessage = f.readline() |
|
mergeBranchExtract = re.compile("Merge branch '([^']*)'.*$").search(mergeMessage) |
|
|
|
if not mergeBranchExtract: |
|
print('Unable to extract branch to merge from message: ', mergeMessage) |
|
sys.exit(0) # Ensures normal merge as failback |
|
|
|
mergeBranch = mergeBranchExtract.group(1) |
|
|
|
currentBranchFullName = subprocess.check_output(['git', 'symbolic-ref', 'HEAD']) |
|
currentBranchExtract = re.compile("^.*/([^/]*)\n$").search(currentBranchFullName) |
|
|
|
if not currentBranchExtract: |
|
print('Unable to extract current branch from: ', currentBranchFullName) |
|
sys.exit(1) # Ensures normal merge as failback |
|
|
|
currentBranch = currentBranchExtract.group(1) |
|
|
|
for item in branchesList: |
|
if currentBranch == item.getDestination() and mergeBranch != item.getOrigin(): |
|
print( |
|
"FORBIDDEN: Merging from '", |
|
mergeBranch, |
|
"' to '", |
|
currentBranch, |
|
"' is NOT allowed. Contact your administrator.", |
|
"Now, you should use git merge --abort and keep on your work.") |
|
sys.exit(1) # This is exactly the situation which is forbidden |
|
sys.exit(0) |