#!/usr/bin/env bash # Shared non-destructive Git update helpers for TA-ProxMenu. TAPM_GIT_WORKTREE_DIRTY() { local repository="$1" [[ -n "$(git -C "$repository" status --porcelain --untracked-files=normal 2>/dev/null)" ]] } TAPM_GIT_FETCH_BRANCH() { local repository="$1" local branch="$2" local timeout_seconds="${3:-30}" timeout "$timeout_seconds" git -C "$repository" fetch --prune origin \ "+refs/heads/${branch}:refs/remotes/origin/${branch}" } TAPM_GIT_RELATION() { local repository="$1" local local_ref="$2" local remote_ref="$3" local local_commit local remote_commit local_commit="$(git -C "$repository" rev-parse --verify "${local_ref}^{commit}" 2>/dev/null)" || return 1 remote_commit="$(git -C "$repository" rev-parse --verify "${remote_ref}^{commit}" 2>/dev/null)" || return 1 if [[ "$local_commit" == "$remote_commit" ]]; then printf 'current\n' elif git -C "$repository" merge-base --is-ancestor "$local_commit" "$remote_commit"; then printf 'behind\n' elif git -C "$repository" merge-base --is-ancestor "$remote_commit" "$local_commit"; then printf 'ahead\n' else printf 'diverged\n' fi } TAPM_GIT_BRANCH_STATE() { local repository="$1" local branch="$2" local current_branch [[ -d "${repository}/.git" ]] || { printf 'unavailable\n' return 1 } current_branch="$(git -C "$repository" branch --show-current 2>/dev/null)" if [[ -z "$current_branch" ]]; then printf 'detached\n' return 0 fi if [[ "$current_branch" != "$branch" ]]; then printf 'wrong-branch\n' return 0 fi if TAPM_GIT_WORKTREE_DIRTY "$repository"; then printf 'dirty\n' return 0 fi TAPM_GIT_RELATION "$repository" HEAD "refs/remotes/origin/${branch}" || { printf 'unavailable\n' return 1 } } TAPM_GIT_FAST_FORWARD() { local repository="$1" local branch="$2" git -C "$repository" merge --ff-only "refs/remotes/origin/${branch}" }