From 8af457ab057bb648fd02f14231f9a2874bcc8b1d Mon Sep 17 00:00:00 2001 From: Konstantin Demin Date: Mon, 12 Feb 2024 12:07:41 +0300 Subject: [PATCH] zsh: update git functions --- .config/zsh/alias/git.zsh | 40 ++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/.config/zsh/alias/git.zsh b/.config/zsh/alias/git.zsh index 1663d7a..1e36d8d 100644 --- a/.config/zsh/alias/git.zsh +++ b/.config/zsh/alias/git.zsh @@ -1,25 +1,31 @@ #!/bin/zsh git-dir-usage() { - local d x p - d=$(__z_git rev-parse --git-dir) || return $? - x=$(__z_git rev-parse --path-format=absolute 2>/dev/null) + local gitdir x topdir + gitdir=$(__z_git rev-parse --git-dir) || return $? + x=$(__z_git rev-parse --path-format=absolute 2>/dev/null) || return $? if [ -n "$x" ] ; then ## older git version which does not support "--path-format=absolute" - : + : TODO else - d=$(__z_git rev-parse --path-format=absolute --git-dir) + gitdir=$(__z_git rev-parse --path-format=absolute --git-dir) || return $? fi - case "$d" in - */* ) p=${d%/*} ; d=${d:t} ;; + case "${gitdir}" in + */* ) topdir=${gitdir:h} ; gitdir=${gitdir:t} ;; esac - ## ${p:+ env -C "$p" } du -d2 "$d" - if [ -n "$p" ] ; then - env -C "$p" du -d2 "$d" + local -a subdirs + subdirs+="${gitdir}/logs/refs" + subdirs+="${gitdir}/objects/info" + subdirs+="${gitdir}/objects/pack" + + if [ -n "${topdir}" ] ; then + env -C "${topdir}" du -d1 "${gitdir}" + env -C "${topdir}" du -d1 "${subdirs[@]}" else - du -d2 "$d" + du -d1 "${gitdir}" + du -d1 "${subdirs[@]}" fi | grep -Ev '^[0-9]\s' | sort -Vk2 } @@ -33,4 +39,16 @@ git-gc() { git-gc-force() { git-gc --aggressive --force +} + +git-archive-ref() { + local name ver gitref topdir c_hash c_time out + name="${1:?}" ver="${2:?}" gitref="${3:?}" + topdir=$(__z_git rev-parse --show-toplevel) || return $? + c_hash=$(__z_git log -n 1 --format='%h' --abbrev=8 "${gitref}") || return $? + c_time=$(__z_git log -n 1 --format='%cd' --date='format:%Y%m%d.%H%M%S' "${gitref}") || return $? + out="${name}_${ver}+git.${c_time}.${c_hash}.tar" + topdir=${topdir:h} + git archive --format=tar -o "${topdir}/${out}" --prefix="${name}-${ver}-git.${c_hash}/" "${gitref}" || return $? + echo "archived to ${out} in ${topdir}/" >&2 } \ No newline at end of file