From d40ab7a488e0b53b9541652e588b62879bc69bba Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Wed, 22 Jul 2026 10:35:51 +0530 Subject: Refactor git shell commands --- cgit/ssh/git-shell-commands/_utils/input.sh | 27 +++++++++++++++++++++++++++ cgit/ssh/git-shell-commands/fork | 18 ++++++------------ cgit/ssh/git-shell-commands/list | 26 +++++++++++++++++++++++--- cgit/ssh/git-shell-commands/new | 18 +++++------------- cgit/ssh/git-shell-commands/set-category | 15 +++++---------- cgit/ssh/git-shell-commands/set-description | 19 ++++++------------- 6 files changed, 72 insertions(+), 51 deletions(-) create mode 100644 cgit/ssh/git-shell-commands/_utils/input.sh (limited to 'cgit/ssh/git-shell-commands') diff --git a/cgit/ssh/git-shell-commands/_utils/input.sh b/cgit/ssh/git-shell-commands/_utils/input.sh new file mode 100644 index 0000000..d8842ba --- /dev/null +++ b/cgit/ssh/git-shell-commands/_utils/input.sh @@ -0,0 +1,27 @@ + +input_repo_name() { + repo_name="$(gum input --header "Repo name (alphanumeric + hyphen/dashes)")" + [ -z "$repo_name" ] && echo "Error: empty repo name" 1>&2 && exit 1 + (echo "$repo_name" | grep -q "^[A-Za-z0-9_-]\+$" 2>/dev/null) || (echo "Error: invalid repo name" 1>&2 && exit 1) + echo "$repo_name" +} + +input_repo_description() { + description="$( (cat "$1/description" 2>/dev/null || true) | gum write --header "Repo description")" + [ -z "$description" ] && echo "Error: empty description" 1>&2 && exit 1 + echo "$description" +} + +input_repo_remote_url() { + remote_repo_url="$(gum input --header "Repo url")"; + [ -z "$remote_repo_url" ] && echo "Error: empty repo url" 1>&2 && exit 1 + echo "$remote_repo_url" +} + +select_repo_name() { + ls -1 /git | gum choose --header "Repo" +} + +input_repo_category() { + (git -C "$1" config get gitweb.category 2>/dev/null || true) | gum input --header "Category" +} diff --git a/cgit/ssh/git-shell-commands/fork b/cgit/ssh/git-shell-commands/fork index c2bc799..d09985a 100755 --- a/cgit/ssh/git-shell-commands/fork +++ b/cgit/ssh/git-shell-commands/fork @@ -2,21 +2,12 @@ set -eu +. "$(dirname $0)/_utils/input.sh" + remote_host="git.ediblemonad.dev" owner_info="Akshay Nair " -if [ $# -lt 2 ]; then - echo "Usage: fork " 1>&2 - exit 1 -fi - -repo_name="$1"; shift 1; -[ -z "$repo_name" ] && echo "Error: empty repo name" 1>&2 && exit 1 -(echo "$repo_name" | grep -q "^[A-Za-z0-9_-]\+$" 2>/dev/null) || (echo "Error: invalid repo name" 1>&2 && exit 1) - -remote_repo_url="$1"; shift 1; -[ -z "$remote_repo_url" ] && echo "Error: empty repo url" 1>&2 && exit 1 - +repo_name="$(input_repo_name)"; repo_dir="/git/${repo_name}.git" if [ -d "$repo_dir" ]; then @@ -24,6 +15,9 @@ if [ -d "$repo_dir" ]; then exit 1; fi +description="$(input_repo_description "$repo_dir")" +remote_repo_url="$(input_repo_remote_url)"; + git clone --bare "$remote_repo_url" "$repo_dir" cd "$repo_dir" diff --git a/cgit/ssh/git-shell-commands/list b/cgit/ssh/git-shell-commands/list index 8a924c9..668bfbb 100755 --- a/cgit/ssh/git-shell-commands/list +++ b/cgit/ssh/git-shell-commands/list @@ -1,8 +1,28 @@ #!/usr/bin/env sh +set -eu + +. "$(dirname $0)/_utils/input.sh" + git_dir=/git +remote_host="git.ediblemonad.dev" -ls -1 "$git_dir" | while IPS="" read name; do - echo "$name||||$(cat "${git_dir}/${name}/description" 2>/dev/null)" -done | column -t -d -s "||||" +if (tty -s); then + selected=$(select_repo_name) + if ! [ -z "$selected" ]; then + repo_dir="${git_dir}/${selected}" + echo "# ${selected}" + echo "" + echo "- SSH clone url: git@${remote_host}:${repo_dir}" + echo "- HTTPS clone url: https://${remote_host}/${selected}" + echo "" + echo "- Category: $(git -C "$repo_dir" config get gitweb.category)" + echo "" + echo "- Description: $(cat "${repo_dir}/description" 2>/dev/null)" + fi +else + ls -1 "$git_dir" | while IPS="" read name; do + echo "$name||||$(cat "${git_dir}/${name}/description" 2>/dev/null)" + done | column -t -d -s "||||" +fi diff --git a/cgit/ssh/git-shell-commands/new b/cgit/ssh/git-shell-commands/new index 6b5a03d..4bd550a 100755 --- a/cgit/ssh/git-shell-commands/new +++ b/cgit/ssh/git-shell-commands/new @@ -2,22 +2,12 @@ set -eu +. "$(dirname $0)/_utils/input.sh" + remote_host="git.ediblemonad.dev" owner_info="Akshay Nair " -if [ $# -lt 2 ]; then - echo "Usage: new <...description>" 1>&2 - exit 1 -fi - -repo_name="$1"; shift 1; -[ -z "$repo_name" ] && echo "Error: empty repo name" 1>&2 && exit 1 -(echo "$repo_name" | grep -q "^[A-Za-z0-9_-]\+$" 2>/dev/null) || (echo "Error: invalid repo name" 1>&2 && exit 1) - -# Stupid cmdline parsing means I can't do $1 here for space separated stuff -description="$*" -[ -z "$description" ] && echo "Error: empty description" 1>&2 && exit 1 - +repo_name="$(input_repo_name)"; repo_dir="/git/${repo_name}.git" if [ -d "$repo_dir" ]; then @@ -25,6 +15,8 @@ if [ -d "$repo_dir" ]; then exit 1; fi +description="$(input_repo_description "$repo_dir")" + git --bare init "$repo_dir" cd "$repo_dir" diff --git a/cgit/ssh/git-shell-commands/set-category b/cgit/ssh/git-shell-commands/set-category index 7f74b94..4450ff7 100755 --- a/cgit/ssh/git-shell-commands/set-category +++ b/cgit/ssh/git-shell-commands/set-category @@ -2,23 +2,18 @@ set -eu -if [ $# -lt 1 ]; then - echo "Usage: set-category [category]" 1>&2 - exit 1 -fi - -repo_name="$1"; -[ -z "$repo_name" ] && echo "Error: empty repo name" 1>&2 && exit 1 -(echo "$repo_name" | grep -q "^[A-Za-z0-9_-]\+$" 2>/dev/null) || (echo "Error: invalid repo name" 1>&2 && exit 1) +. "$(dirname $0)/_utils/input.sh" -category="${2:-""}"; -repo_dir="/git/${repo_name}.git" +repo_path="$(select_repo_name)"; +repo_dir="/git/${repo_path}" if ! [ -d "$repo_dir" ]; then echo "Error: $repo_name doesn't exist" 1>&2 exit 1; fi +category="$(input_repo_category "$repo_dir")" + if [ -z "$category" ]; then git -C "$repo_dir" config unset gitweb.category else diff --git a/cgit/ssh/git-shell-commands/set-description b/cgit/ssh/git-shell-commands/set-description index ea0e52e..a0f55e0 100755 --- a/cgit/ssh/git-shell-commands/set-description +++ b/cgit/ssh/git-shell-commands/set-description @@ -2,25 +2,18 @@ set -eu -if [ $# -lt 2 ]; then - echo "Usage: set-description <...description>" 1>&2 - exit 1 -fi - -repo_name="$1"; shift 1; -[ -z "$repo_name" ] && echo "Error: empty repo name" 1>&2 && exit 1 -(echo "$repo_name" | grep -q "^[A-Za-z0-9_-]\+$" 2>/dev/null) || (echo "Error: invalid repo name" 1>&2 && exit 1) +. "$(dirname $0)/_utils/input.sh" -description="$*"; -[ -z "$description" ] && echo "Error: empty description" 1>&2 && exit 1 - -repo_dir="/git/${repo_name}.git" +repo_path="$(select_repo_name)"; +repo_dir="/git/${repo_path}" if ! [ -d "$repo_dir" ]; then - echo "Error: $repo_name doesn't exist" 1>&2 + echo "Error: $repo_path doesn't exist" 1>&2 exit 1; fi +description="$(input_repo_description "$repo_dir")" + echo "$description" > "${repo_dir}/description" echo "Done" -- cgit v1.3.1