es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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..."
Tags:  , , , ,

Answer

  1. Avatar for 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.

    #!/bin/bash
    
    # establece las ramas prohibidas
    FORBIDDEN_BRANCHES=("uat" "support")
    
    # obtén la rama que se está fusionando desde
    rama=$(git rev-parse --abbrev-ref HEAD)
    desde_rama=$(git rev-parse --abbrev-ref $1)
    
    # verifica si se está fusionando desde una rama prohibida
    if [[ " ${FORBIDDEN_BRANCHES[@]} " =~ " ${desde_rama} " && $rama != "main" ]]; then
      echo "¡DETENGAN LA PRENSA!"
      echo "Estás intentando fusionar desde una rama prohibida ($desde_rama) en tu rama."
      echo "Por favor, fusiona solo desde la rama principal."
      exit 1
    fi
    

    Aquí se explica cómo funciona:

    • Primero, establecemos el array FORBIDDEN_BRANCHES con las ramas prohibidas.
    • Luego, obtenemos la rama actual y la rama que se está fusionando desde.
    • Después, verificamos si la rama que se está fusionando desde es una de las ramas prohibidas, y también verificamos que la rama actual no sea main.
    • Si la fusión viola las condiciones, imprimimos un mensaje de error y salimos con estado 1.

    Este script se puede guardar como un gancho pre-commit en el directorio .git/hooks con el nombre pre-merge-commit. Una vez guardado, se llamará automáticamente cada vez que un usuario intente fusionar una rama prohibida en una rama de ticket.

Comments are closed.