aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2026-07-22 10:35:51 +0530
committerAkshay Nair <phenax5@gmail.com>2026-07-22 10:44:04 +0530
commitd40ab7a488e0b53b9541652e588b62879bc69bba (patch)
treef73227d9117773969828ce43d30d4de5934e14c6
parent4c142d2a977a2c377ea3bef30fa986010056ba3e (diff)
downloadbacchus-remote-main.tar.gz
bacchus-remote-main.zip
Refactor git shell commandsHEADmain
Diffstat (limited to '')
-rw-r--r--README.md1
-rw-r--r--cgit/ssh/git-shell-commands/_utils/input.sh27
-rwxr-xr-xcgit/ssh/git-shell-commands/fork18
-rwxr-xr-xcgit/ssh/git-shell-commands/list26
-rwxr-xr-xcgit/ssh/git-shell-commands/new18
-rwxr-xr-xcgit/ssh/git-shell-commands/set-category15
-rwxr-xr-xcgit/ssh/git-shell-commands/set-description19
-rw-r--r--justfile8
8 files changed, 78 insertions, 54 deletions
diff --git a/README.md b/README.md
index 8640f80..3e38366 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,6 @@
## Tasks
- [ ] Anubis
- [ ] add toc links for readme headers
-- [ ] Back up cmd (+ periodic pulls?)
- [ ] Add health checks
- [ ] Add safe service restart
- [ ] auth/private repos (https://github.com/zx2c4/cgit/blob/master/filters/simple-authentication.lua)
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 <phenax5@gmail.com>"
-if [ $# -lt 2 ]; then
- echo "Usage: fork <name> <url>" 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 <phenax5@gmail.com>"
-if [ $# -lt 2 ]; then
- echo "Usage: new <name> <...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 <name> [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 <name> <...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"
diff --git a/justfile b/justfile
index a1abce4..2f8d997 100644
--- a/justfile
+++ b/justfile
@@ -9,13 +9,13 @@ ssh *args:
shell: ssh
copy *args:
- rsync -ravh --delete --exclude '.git' --exclude 'tmp' -e "ssh -p $SSH_PORT" "$@"
+ rsync -ravh --delete -e "ssh -p $SSH_PORT" "$@"
df:
just ssh 'df -ah /'
upload:
- just copy . "${SSH_USER}@${SSH_HOST}:{{TARGET_DIR}}"
+ just copy --exclude '.git' --exclude 'tmp' . "${SSH_USER}@${SSH_HOST}:{{TARGET_DIR}}"
setup *args:
just ssh "{{TARGET_DIR}}/setup.sh" "$@"
@@ -27,5 +27,9 @@ local-setup *args:
SEND_UPLOADS_ROOT="$PWD/tmp/uploads" SEND_USER="$(id -u):$(id -g)" \
./setup.sh "$@"
+backup-git:
+ mkdir -p ./tmp/backup
+ just copy "${SSH_USER}@${SSH_HOST}:/git" ./tmp/backup
+
# TODO: pull /git for backup
# TODO: Add service on home server to backup automatically?