Git hook prepare-commit-msg para evitar fusionar ramas prohibidas – traducir Ruby a Bash
Estoy tratando de implementar un gancho de Git para evitar que los usuarios fusionen nuestras ramas de entorno (que no sean la principal) en las ramas de tickets. Este gancho es exactamente lo que necesito, excepto que está escrito en Ruby. Necesito que mi gancho esté en bash o shell para que sea fácil para todos nuestros desarrolladores adoptarlo sin tener que modificar sus máquinas. El problema es que estoy luchando por descubrir cómo traducirlo ya que no tengo experiencia en scripting de bash para Git.
Aquí está el script en Ruby:
#!/usr/bin/env ruby
FORBIDDEN_BRANCHES = ["uat", "support"]
def merge?
ARGV[1] == "merge"
end
def merge_msg
@msg ||= `cat .git/MERGE_MSG`
end
def from_branch
@from_branch = merge_msg.match(/Merge branch '(.*?)'/)[1]
end
def from_forbidden_branch?
FORBIDDEN_BRANCHES.include?(from_branch)
end
if merge? && from_forbidden_branch?
out = `git reset --merge`
puts
puts "¡DETENGAN LAS PRENSAS!"
puts "Estás intentando fusionar #{from_branch} en tu rama."
puts "Seguramente no te refieres a eso, ¿verdad?"
puts
puts "ejecuta el siguiente comando ahora para descartar los cambios en tu árbol de trabajo:"
puts
puts "git reset --merge"
puts
exit 1
end
Esto es lo que tengo hasta ahora… He descubierto cómo establecer la matriz FORBIDDEN_BRANCHES y verificar si la acción actual que se está ejecutando es una fusión. Lo que me falta es cómo obtener la verdadera FROM_BRANCH (actualmente está codificado como “support”).
#!/bin/bash
FORBIDDEN_BRANCHES=("uat" "support" "develop")
FROM_BRANCH="support"
FROM_FORBIDDEN=0
for i in ${!FORBIDDEN_BRANCHES[@]}; do
if test ${FORBIDDEN_BRANCHES[$i]} = $FROM_BRANCH
then
echo "Fusionar desde $FROM_BRANCH está prohibido"
FROM_FORBIDDEN=1
fi
done
echo $FROM_FORBIDDEN
if test "$2" = "merge"
then
if test $FROM_FORBIDDEN = 1
then
echo "¡DETÉNGANSE!"
exit 1
else
echo "FROM_FORBIDDEN != 1, continuando"
fi
else
echo "No fusionando"
fi
echo "Llegué al final sin errores..."
davy.ai
Solución usando Bash
El siguiente script es una versión en Bash del script original en Ruby que evita que los usuarios fusionen ramas de entorno (distintas a
main
) en ramas de tickets.Aquí se explica cómo funciona:
FORBIDDEN_BRANCHES
con las ramas prohibidas.main
.Este script se puede guardar como un gancho pre-commit en el directorio
.git/hooks
con el nombrepre-merge-commit
. Una vez guardado, se llamará automáticamente cada vez que un usuario intente fusionar una rama prohibida en una rama de ticket.