Script to Calculate Contribution Percentage in a Git Repository

Tiempo de lectura: 2 minutos

Introduction

In collaborative software development, understanding each team member’s contribution is essential. This tutorial introduces a Bash script that calculates the percentage of contribution for each author in a Git repository. Let’s see how to use this tool to gather valuable insights into the work done by each person in a project.

Prerequisites

Before you begin, make sure you have the following requirements on your system:

  • Installed Git: You can download it from git-scm.com.
  • Access to the Git repository you want to analyze.

Step 1: Create the Script

Create a new file named contribution.sh with the following content

#!/bin/bash

REPO_PATH=$(pwd)
DESDE_FECHA="2022-01-01"
HASTA_FECHA=$(date +"%Y-%m-%d")

# Obtener la lista de autores y la cantidad de líneas agregadas y eliminadas para cada uno
AUTHORS=$(git log --format='%aN' --since="$DESDE_FECHA" --until="$HASTA_FECHA" | sort -u)

echo "Estadísticas detalladas de contribución desde $DESDE_FECHA hasta $HASTA_FECHA en el repositorio $REPO_PATH:"

# Array para almacenar resumen
SUMMARY=()

# Calcular y mostrar el porcentaje para cada autor basado en líneas agregadas y eliminadas
for AUTHOR in $AUTHORS; do
    AUTHOR_LINES=$(git log --author="$AUTHOR" --since="$DESDE_FECHA" --until="$HASTA_FECHA" --pretty=tformat: --numstat | awk '{if ($1 != "" && $1 != "-") sum += $1; if ($2 != "" && $2 != "-") sum += $2} END {if (sum != "") print sum; else print 0}')
    TOTAL_LINES=$(git log --since="$DESDE_FECHA" --until="$HASTA_FECHA" --pretty=tformat: --numstat | awk '{if ($1 != "" && $1 != "-") sum += $1; if ($2 != "" && $2 != "-") sum += $2} END {if (sum != "") print sum; else print 0}')

    # Salida detallada
    echo "Detalles para $AUTHOR:"
    echo "   Líneas de $AUTHOR: $AUTHOR_LINES"
    echo "   Total de líneas: $TOTAL_LINES"

    # Verificar que el total de líneas no sea cero antes de realizar el cálculo
    if [[ "$TOTAL_LINES" -gt 0 ]]; then
        # Utilizar printf para formatear la salida con tres decimales
        PERCENTAGE=$(printf "%.3f" "$(echo "scale=4; ($AUTHOR_LINES / $TOTAL_LINES) * 100" | bc)")
        echo "   Porcentaje de contribución: $PERCENTAGE%"
        
        # Agregar al resumen
        SUMMARY+=("$AUTHOR: $PERCENTAGE%")
    else
        echo "   No hay contribuciones en el rango de fechas especificado."
        
        # Agregar al resumen con un porcentaje de 0%
        SUMMARY+=("$AUTHOR: 0%")
    fi
    echo "-------------------------"
done

# Resumen general
echo "Resumen general:"
for LINE in "${SUMMARY[@]}"; do
    echo "$LINE"
done

Configure permissions

chmod +x contribucion.sh

Exec the script:

./contribucion.sh

Leave a Comment