78 lines
1.8 KiB
Bash
78 lines
1.8 KiB
Bash
#!/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}"
|
|
}
|