Files
fn_registry/bash/functions/shell/git_repo_status.sh
T
egutierrez 8f45b40528 feat: add bash shell utility functions
12 funciones Bash del dominio shell: utilidades de scripting (bash_log,
bash_colors, bash_check_deps, bash_confirm, bash_handle_error, bash_safe_run),
manipulacion de texto (convert_text_case), estructura de proyectos
(create_project_structure), y operaciones git (git_clean_branches,
git_log_visual, git_push_all_remotes, git_repo_status). Cada una con su
.sh y .md de frontmatter.
2026-04-12 13:54:15 +02:00

96 lines
2.7 KiB
Bash

#!/usr/bin/env bash
# git_repo_status
# ---------------
# Muestra el estado completo de un repositorio Git: rama actual, upstream,
# cambios pendientes, stash, remotes y últimos commits.
# Sale con exit code 1 si el directorio actual no es un repositorio Git.
#
# USO:
# source git_repo_status.sh
# git_repo_status
#
# O como script directo:
# bash git_repo_status.sh
git_repo_status() {
if ! git rev-parse --is-inside-work-tree &>/dev/null; then
echo "git_repo_status: el directorio actual no es un repositorio Git" >&2
return 1
fi
local branch
branch="$(git rev-parse --abbrev-ref HEAD 2>/dev/null)"
# Upstream
local upstream
upstream="$(git rev-parse --abbrev-ref "${branch}@{upstream}" 2>/dev/null || echo "")"
local upstream_info
if [[ -z "$upstream" ]]; then
upstream_info="sin upstream"
else
local ahead behind
ahead="$(git rev-list "${upstream}..HEAD" --count 2>/dev/null || echo 0)"
behind="$(git rev-list "HEAD..${upstream}" --count 2>/dev/null || echo 0)"
upstream_info="${ahead}${behind} (${upstream})"
fi
echo "=== Rama & Upstream ==="
echo " Rama actual: ${branch}"
echo " Upstream: ${upstream_info}"
echo ""
# Cambios
echo "=== Cambios ==="
local changes
changes="$(git status --short 2>/dev/null)"
if [[ -z "$changes" ]]; then
echo " Directorio de trabajo limpio"
else
echo " Cambios pendientes:"
echo "$changes" | while IFS= read -r line; do
echo " ${line}"
done
fi
echo ""
# Stash
echo "=== Stash ==="
local stash_count
stash_count="$(git stash list 2>/dev/null | wc -l | tr -d ' ')"
if [[ "$stash_count" -eq 0 ]]; then
echo " Sin entradas en stash"
else
echo " ${stash_count} entrada(s) en stash:"
git stash list | head -5 | while IFS= read -r line; do
echo " ${line}"
done
fi
echo ""
# Remotes
echo "=== Remotes ==="
local remotes
remotes="$(git remote -v 2>/dev/null | grep '(fetch)' || true)"
if [[ -z "$remotes" ]]; then
echo " Sin remotes configurados"
else
echo "$remotes" | while IFS= read -r line; do
local name url
name="$(echo "$line" | awk '{print $1}')"
url="$(echo "$line" | awk '{print $2}')"
echo " ${name}${url}"
done
fi
echo ""
# Últimos commits
echo "=== Últimos commits ==="
git log --oneline --decorate --color=always -8 2>/dev/null || true
echo ""
}
# Ejecutar si se invoca directamente
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
git_repo_status "$@"
fi