From 03ca259c4c3e2909d4e8c87ede2c4a087ce645b8 Mon Sep 17 00:00:00 2001 From: fatalerrors Date: Thu, 9 Jul 2026 16:29:09 +0200 Subject: [PATCH] remove english based git output dependencies --- profile.d/git.sh | 47 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/profile.d/git.sh b/profile.d/git.sh index 90752a5..b1e922f 100644 --- a/profile.d/git.sh +++ b/profile.d/git.sh @@ -115,6 +115,14 @@ gst() done local target="${1:-.}" + if ! command -v git >/dev/null 2>&1; then + disp E "git command not found." + return 1 + fi + if ! git -C "$target" rev-parse --is-inside-work-tree >/dev/null 2>&1; then + disp E "'$target' is not inside a git repository." + return 1 + fi git -C "$target" status --short --branch } export -f gst @@ -241,7 +249,10 @@ gacp() fi eval set -- "$PARSED" - local msg="" auto_add="$GIT_GACP_AUTO_ADD" + local msg="" auto_add=0 + case "${GIT_GACP_AUTO_ADD,,}" in + 1|true|yes|on) auto_add=1 ;; + esac while true; do case "$1" in -h|--help) @@ -411,16 +422,26 @@ greset() if ! git diff --quiet || ! git diff --cached --quiet || [[ -n $(git ls-files --others --exclude-standard) ]]; then stash_msg="greset:${branch}:$(date +'%Y-%m-%d %H:%M:%S')" disp I "Stashing local changes as '$stash_msg'..." + local stash_before stash_after + stash_before=$(git rev-parse --quiet --verify refs/stash 2>/dev/null) || true stash_out=$(git stash push -u -m "$stash_msg" 2>&1) || { disp E "Failed to stash local changes." printf "%s\n" "$stash_out" return 1 } - [[ $stash_out != "No local changes to save"* ]] && stash_created=1 + stash_after=$(git rev-parse --quiet --verify refs/stash 2>/dev/null) || true + # A new stash means the top refs/stash sha changed (locale-independent). + [[ -n $stash_after && $stash_after != "$stash_before" ]] && stash_created=1 fi - disp I "Fetching from $remote..." - git fetch --prune "$remote" || return 1 + # Only fetch when the derived remote is an actual configured remote; a bare + # tag or local-branch target has no remote to update from. + if git remote get-url "$remote" >/dev/null 2>&1; then + disp I "Fetching from $remote..." + git fetch --prune "$remote" || return 1 + else + disp I "Target '$target' is not a remote ref; skipping fetch." + fi if ! git rev-parse --verify --quiet "$target" >/dev/null; then disp E "Target '$target' does not exist." @@ -562,7 +583,7 @@ gprune() [[ $b == "master" || $b == "main" || $b == "develop" || $b == "dev" ]] && continue git branch -d "$b" >/dev/null 2>&1 && { printf "Deleted (merged): %s\n" "$b" - ((deleted++)) + deleted=$((deleted+1)) } done < <(git branch --merged "$base" | sed -E 's/^\*?\s*//') @@ -571,22 +592,24 @@ gprune() disp I "Deep mode: pruning remote-tracking refs, then checking for gone branches..." git fetch --prune --quiet + local upstream sha while IFS= read -r b; do [[ -z $b ]] && continue [[ $b == "$current" ]] && continue [[ $b == "$base" ]] && continue [[ $b == "master" || $b == "main" || $b == "develop" || $b == "dev" ]] && continue - # Verify the upstream is truly gone (not just unset). - local upstream - upstream=$(git rev-parse --abbrev-ref "${b}@{upstream}" 2>/dev/null) + # Detect a gone upstream without relying on localized "gone]" text: + # resolve the branch's upstream, then check its remote-tracking ref. + upstream=$(git rev-parse --abbrev-ref "${b}@{upstream}" 2>/dev/null) || true [[ -z "$upstream" ]] && continue # no tracking branch at all — skip - # If the remote ref still exists, skip (not deleted upstream). + # If the remote-tracking ref still exists, the upstream is not gone. git show-ref --verify --quiet "refs/remotes/$upstream" 2>/dev/null && continue + sha=$(git rev-parse --short "$b" 2>/dev/null) git branch -D "$b" >/dev/null 2>&1 && { - printf "Deleted (gone upstream): %s\n" "$b" - ((deleted++)) + printf "Deleted (gone upstream): %s (%s)\n" "$b" "$sha" + deleted=$((deleted+1)) } - done < <(git branch -vv | sed -E 's/^\*?\s*//' | awk '/: gone]/ {print $1}') + done < <(git for-each-ref --format='%(refname:short)' refs/heads/) fi (( deleted == 0 )) && disp I "No branches to delete."