justfiles for automating various tasks on my workstation

Compare changes

Choose any two refs to compare.

+61 -59
blogging.just
···
-
# New gemlog entry
-
[group('blogging')]
-
newgemlog slug:
-
#!/usr/bin/env bash
-
GEMLOG_DIR="${HOME}/nextcloud/sites/gemini/hyperreal.coffee/gemlog"
-
FILENAME_DATE=$(date '+%Y-%m-%d')
-
FILENAME="${FILENAME_DATE}-{{ slug }}.gmi"
-
cat <<EOF >"${GEMLOG_DIR}/${FILENAME}"
-
# Title
-
-
## END
-
Last updated: "$FILENAME_DATE"
-
-
=> ../gemlog Gemlog archive
-
=> ../ hyperreal.coffee
-
EOF
-
nvim "${GEMLOG_DIR}/${FILENAME}"
-
-
# Edit gemlog atom feed
-
[group('blogging')]
-
edit-gemlog-atom:
-
#!/usr/bin/env bash
-
nvim "${HOME}/nextcloud/sites/gemini/hyperreal.coffee/gemlog/atom.xml"
-
-
# Edit gemlog index
-
[group('blogging')]
-
edit-gemlog-index:
-
#!/usr/bin/env bash
-
nvim "${HOME}/nextcloud/sites/gemini/hyperreal.coffee/gemlog/index.gmi"
-
-
# Publish changes to capsule
-
[group('blogging')]
-
publish-gemini:
-
#!/usr/bin/env bash
-
ssh jas@hyperreal.carp-wyvern.ts.net \
-
-- \
-
rm -rf /home/jas/public/gemini/hyperreal.coffee
-
rsync \
-
-aAXP \
-
"${HOME}/nextcloud/sites/gemini/hyperreal.coffee" \
-
jas@hyperreal.carp-wyvern.ts.net:/home/jas/public/gemini
-
ssh jas@hyperreal.carp-wyvern.ts.net \
-
-- \
-
tree /home/jas/public/gemini
-
echo
-
echo "Gemini capsule published successfully."
-
# New blog entry
[group('blogging')]
newblog slug:
#!/usr/bin/env bash
-
BLOG_DIR="${HOME}/repos/tildegit.org/hyperreal/hyperreal.coffee"
FILENAME_DATE=$(date '+%Y-%m-%d')
POST_DATE=$(date '+%Y-%m-%d %H:%M:%S')
FILENAME="${FILENAME_DATE}-{{ slug }}.md"
···
EOF
nvim "${BLOG_DIR}/content/posts/${FILENAME}"
# New feelslog entry
[group('blogging')]
···
#!/usr/bin/env bash
DATE=$(date '+%Y-%m-%d')
TAGS="$@"
-
FEELSDIR="${HOME}/nextcloud/sites/feels.hyperreal.coffee"
PREV_ENTRY=$(find "$FEELSDIR/src" -name "*.md" -exec basename {} \; | sort | tail -1 | cut -c 18-21)
NEXT_ENTRY="00$(echo "$PREV_ENTRY" + "1" | bc)"
NEXT_ENTRY_FILENAME="${FEELSDIR}/src/${DATE}-entry-${NEXT_ENTRY}.md"
···
if [ ! -d "$BSSG_DIR" ]; then
mkdir -p "${HOME}/repos/brew.bsd.cafe/stefano"
git clone https://brew.bsd.cafe/stefano/BSSG.git "$BSSG_DIR"
fi
-
FEELS_CONFIG="${HOME}/nextcloud/sites/feels.hyperreal.coffee/config.sh.local"
-
OUTPUT_DIR="${HOME}/nextcloud/sites/feels.hyperreal.coffee/output"
-
SITE_URL="https://feels.hyperreal.coffee"
-
REMOTE_USER="jas"
-
REMOTE_HOST="hyperreal.carp-wyvern.ts.net"
-
REMOTE_PATH="/home/jas/public/feels"
-
cd "$BSSG_DIR"
"${BSSG_DIR}/bssg.sh" build --config "$FEELS_CONFIG"
-
rsync -az --delete "$OUTPUT_DIR"/ "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}"
-
echo
-
echo "Site deployed successfully"
# vim: ts=4 sts=4 sw=4 et ft=just
···
# New blog entry
[group('blogging')]
newblog slug:
#!/usr/bin/env bash
+
BLOG_DIR="${HOME}/repos/knot.moonshadow.dev/hyperreal.coffee/http"
FILENAME_DATE=$(date '+%Y-%m-%d')
POST_DATE=$(date '+%Y-%m-%d %H:%M:%S')
FILENAME="${FILENAME_DATE}-{{ slug }}.md"
···
EOF
nvim "${BLOG_DIR}/content/posts/${FILENAME}"
+
echo "To convert to gemlog:"
+
echo "blog2gemlog ${BLOG_DIR}/content/posts/${FILENAME} \"Blog title\""
+
+
# Convert website page changes to gemtext and send to capsule
+
[group('blogging')]
+
board-capsule:
+
#!/usr/bin/env bash
+
WEBSITE_DIR="${HOME}/repos/knot.moonshadow.dev/hyperreal.coffee/http"
+
CAPSULE_DIR="${HOME}/repos/knot.moonshadow.dev/hyperreal.coffee/gemini"
+
+
find "${WEBSITE_DIR}/content" \
+
-maxdepth 1 \
+
-type f \
+
-not -name "_index.md" \
+
-exec md2gemini -w -d "$CAPSULE_DIR" -f -m {} \;
+
+
echo "To push and deploy changes, run push-deploy"
+
+
# Push hyperreal.coffee changes to git and deploy website and capsule
+
[group('blogging')]
+
push-deploy:
+
#!/usr/bin/env bash
+
set -euo pipefail
+
+
HC_DIR="${HOME}/repos/knot.moonshadow.dev/hyperreal.coffee"
+
cd "$HC_DIR"
+
msg_info="$(( $(git rev-list --count HEAD) + 1)) $(date '+%Y-%m-%d %H:%M:%S')"
+
git add .
+
git commit -m "Update: ${msg_info}"
+
git push -u origin main
+
+
WEBSITE_DIR="${HC_DIR}/http"
+
CAPSULE_DIR="${HC_DIR}/gemini"
+
PUBLIC_DIR="${HOME}/public_html"
+
+
rm -rf "${PUBLIC_DIR}/"*
+
hugo --gc --minify -d "${PUBLIC_DIR}" -s "$WEBSITE_DIR"
+
rsync \
+
-az \
+
--delete \
+
"${PUBLIC_DIR}"/ \
+
hyperreal@hyperreal.carp-wyvern.ts.net:/home/hyperreal/staging/html
+
ssh hyperreal@hyperreal.carp-wyvern.ts.net \
+
-- doas rsync -a --chown root:daemon --delete /home/hyperreal/staging/html/ /var/www/htdocs/hyperreal.coffee
+
+
rsync \
+
-avz \
+
--delete \
+
"$CAPSULE_DIR"/ \
+
hyperreal@hyperreal.carp-wyvern.ts.net:/home/hyperreal/staging/gemini
+
ssh hyperreal@hyperreal.carp-wyvern.ts.net \
+
-- doas -u _gmid rsync -a --delete /home/hyperreal/staging/gemini/ /var/gemini/hyperreal.coffee
+
+
echo
+
echo "Website and capsule successfully deployed"
# New feelslog entry
[group('blogging')]
···
#!/usr/bin/env bash
DATE=$(date '+%Y-%m-%d')
TAGS="$@"
+
FEELSDIR="${HOME}/repos/tildegit.org/hyperreal/feelslog"
PREV_ENTRY=$(find "$FEELSDIR/src" -name "*.md" -exec basename {} \; | sort | tail -1 | cut -c 18-21)
NEXT_ENTRY="00$(echo "$PREV_ENTRY" + "1" | bc)"
NEXT_ENTRY_FILENAME="${FEELSDIR}/src/${DATE}-entry-${NEXT_ENTRY}.md"
···
if [ ! -d "$BSSG_DIR" ]; then
mkdir -p "${HOME}/repos/brew.bsd.cafe/stefano"
git clone https://brew.bsd.cafe/stefano/BSSG.git "$BSSG_DIR"
+
else
+
cd "$BSSG_DIR" || exit 1
+
git pull
fi
+
FEELS_CONFIG="${HOME}/repos/tildegit.org/hyperreal/feelslog/config.sh.local"
"${BSSG_DIR}/bssg.sh" build --config "$FEELS_CONFIG"
# vim: ts=4 sts=4 sw=4 et ft=just
+13 -17
install.just
···
#!/usr/bin/env bash
pipx list --short | awk '{print $1}' | xargs pipx upgrade
-
# Ensure formatters are installed
[group('install')]
-
ensure-formatters:
#!/usr/bin/env bash
-
cargo install --git https://github.com/nushell/nufmt
go install github.com/reteps/dockerfmt@latest
go install github.com/google/yamlfmt/cmd/yamlfmt@latest
sudo npm install -g markdownlint-cli2
pipx install ansible-lint
pipx install black
pipx install isort
pipx install nginxfmt
echo "Install shellcheck shfmt jq with your distro's package manager"
-
-
# Install todo.txt
-
[group('install')]
-
install-todotxt:
-
#!/usr/bin/env bash
-
URL=$(curl --silent https://api.github.com/repos/todotxt/todo.txt-cli/releases/latest | jq -r '.assets[] | select(.name| test(".*.tar.gz$")).browser_download_url')
-
FILENAME=$(basename "$URL")
-
DIRNAME=$(basename "$URL" .tar.gz)
-
TEMP_DIR=$(mktemp -d)
-
wget "$URL" -O "${TEMP_DIR}/${FILENAME}"
-
tar -zxvf "${TEMP_DIR}/${FILENAME}" -C "${TEMP_DIR}"
-
sudo cp -fv "${TEMP_DIR}/${DIRNAME}/todo.sh" /usr/local/bin/
-
rm -rf "$TEMP_DIR"
-
echo "todo.sh successfully installed to /usr/local/bin/"
# Install Go tools
[group('install')]
···
#!/usr/bin/env bash
pipx list --short | awk '{print $1}' | xargs pipx upgrade
+
# Ensure lsps and formatters are installed
[group('install')]
+
ensure-lsp:
#!/usr/bin/env bash
go install github.com/reteps/dockerfmt@latest
go install github.com/google/yamlfmt/cmd/yamlfmt@latest
+
go install github.com/wader/jq-lsp@latest
sudo npm install -g markdownlint-cli2
+
sudo npm install -g ansible-language-server
+
sudo npm install -g bash-language-server
+
sudo npm install -g vscode-langservers-extracted
+
sudo npm install -g dockerfile-language-server-nodejs
+
command -v cargo-binstall || cargo install cargo-binstall
+
cargo-binstall -y just-lsp
+
cargo-binstall -y taplo-cli
+
cargo-binstall -y kdlfmt
+
cargo-binstall -y systemd-lsp
pipx install ansible-lint
+
pipx install basedpyright
pipx install black
pipx install isort
pipx install nginxfmt
echo "Install shellcheck shfmt jq with your distro's package manager"
# Install Go tools
[group('install')]
+19 -11
setup.just
···
"atopacct.service"
"atop-rotate.timer"
"firewalld.service"
-
"prometheus-node-exporter.service"
"snapper-cleanup.timer"
"snapper-timeline.timer"
"tailscaled.service"
···
cat <<EOF | sudo tee /etc/xdg/user-dirs.defaults
DESKTOP=desktop
DOWNLOAD=downloads
-
TEMPLATES=templates
PUBLICSHARE=nextcloud
DOCUMENTS=documents
MUSIC=
···
fi
echo "Preparing local git directories..."
mkdir -p "${HOME}/repos/tildegit.org/hyperreal"
-
echo "Cloning repos from tildegit.org/hyperreal..."
-
hyperreal_repos=(
"ansible-homelab"
"dotfiles"
"hyperreal.coffee"
-
"podman-services"
-
"qbt-helper"
)
-
for repo in "${hyperreal_repos[@]}"; do
-
if [ -d "${HOME}/repos/tildegit.org/hyperreal/${repo}" ]; then
-
rm -rf "${HOME}/repos/tildegit.org/hyperreal/${repo}"
fi
-
git clone "git@tildegit.org:hyperreal/${repo}.git" "${HOME}/repos/tildegit.org/hyperreal/${repo}"
done
# Setup hyperreal configs
···
#!/usr/bin/env bash
set -euo pipefail
-
DOTFILES_DIR="${HOME}/repos/tildegit.org/hyperreal/dotfiles"
if [ ! -d "$DOTFILES_DIR" ]; then
echo "${DOTFILES_DIR} not found."
exit 1
···
"atopacct.service"
"atop-rotate.timer"
"firewalld.service"
"snapper-cleanup.timer"
"snapper-timeline.timer"
"tailscaled.service"
···
cat <<EOF | sudo tee /etc/xdg/user-dirs.defaults
DESKTOP=desktop
DOWNLOAD=downloads
+
TEMPLATES=
PUBLICSHARE=nextcloud
DOCUMENTS=documents
MUSIC=
···
fi
echo "Preparing local git directories..."
+
mkdir -p "${HOME}/repos/knot.moonshadow.dev"
mkdir -p "${HOME}/repos/tildegit.org/hyperreal"
+
echo "Cloning repos from knot.moonshadow.dev..."
+
tangled_repos=(
"ansible-homelab"
"dotfiles"
"hyperreal.coffee"
)
+
for repo in "${tangled_repos[@]}"; do
+
if [ -d "${HOME}/repos/knot.moonshadow.dev/${repo}" ]; then
+
rm -rf "${HOME}/repos/knot.moonshadow.dev/${repo}"
fi
+
git clone "git@knot.moonshadow.dev:hyperreal.bsky.moonshadow.dev/${repo}" "${HOME}/repos/knot.moonshadow.dev/${repo}"
+
done
+
echo "Cloning repos from tildegit.org/hyperreal..."
+
tildegit_repos=(
+
"feelslog"
+
)
+
for repo in "${tildegit_repos[@]}"; do
+
if [ -d "${HOME}/repos/tildegit.org/hyperreal/${repo}" ]; then
+
rm -rf "${HOME}/repos/tildegit.org/hyperreal/${repo}"
+
fi
+
git clone "git@tildegit.org:hyperreal/${repo}" "${HOME}/repos/tildegit.org/hyperreal/${repo}"
done
# Setup hyperreal configs
···
#!/usr/bin/env bash
set -euo pipefail
+
DOTFILES_DIR="${HOME}/repos/knot.moonshadow.dev/dotfiles"
if [ ! -d "$DOTFILES_DIR" ]; then
echo "${DOTFILES_DIR} not found."
exit 1
+11
utilities.just
···
set unstable := true
set script-interpreter := ["uv", "run", "--script"]
# List systemd services
[group('utilities')]
lssvc:
···
set unstable := true
set script-interpreter := ["uv", "run", "--script"]
+
# Zellij sessions
+
[group('utilities')]
+
zellij-new:
+
#!/usr/bin/env bash
+
selection=$(ls "${HOME}/.config/zellij/layouts" | xargs -I _ basename -s .kdl _ | gum choose)
+
if zellij list-sessions | grep "$selection"; then
+
zellij attach "$selection"
+
else
+
zellij -n "$selection" -s "$selection"
+
fi
+
# List systemd services
[group('utilities')]
lssvc: