From dfebe131a6beb13eba0bbf9aed0a92df63b83289 Mon Sep 17 00:00:00 2001 From: Oliver Davies Date: Thu, 10 Jul 2025 08:00:00 +0100 Subject: [PATCH] Move scripts to Nix files Move the scripts I commonly use into Nix files managed by Home Manager. Some, like `mounter` and `unmounter` are desktop-only, but this can be addressed in a future commit to create per-host scripts or desktop/non-desktop scripts. This commit also removes a number of unused scripts that are either included in packages like `git-extras` or aren't used. --- .../cli/scripts/create-script.nix | 21 +++++++++ modules/home-manager/cli/scripts/default.nix | 24 ++++++---- modules/home-manager/cli/scripts/mounter.nix | 45 +++++++++++++++++++ .../cli/scripts/move-firefox-screenshots.nix | 15 +++++++ .../cli/scripts/scripts/create-script | 23 ---------- .../cli/scripts/scripts/git-abort | 20 --------- .../cli/scripts/scripts/git-bare-clone | 34 -------------- .../cli/scripts/scripts/git-continue | 16 ------- .../home-manager/cli/scripts/scripts/git-sync | 8 ---- .../home-manager/cli/scripts/scripts/git-up | 21 --------- .../cli/scripts/scripts/import-gzip-database | 17 ------- .../cli/scripts/scripts/main-or-master-branch | 10 ----- .../home-manager/cli/scripts/scripts/mounter | 36 --------------- .../scripts/scripts/move-firefox-screenshots | 11 ----- .../cli/scripts/scripts/new-drupal-module | 19 -------- .../home-manager/cli/scripts/scripts/setbg | 3 -- .../cli/scripts/scripts/start-traefik | 9 ---- .../scripts/stop-all-docker-containers | 19 -------- .../cli/scripts/scripts/stop-traefik | 7 --- .../cli/scripts/scripts/tag-release | 11 ----- .../cli/scripts/scripts/unmounter | 26 ----------- .../cli/scripts/scripts/update-all-git-repos | 25 ----------- modules/home-manager/cli/scripts/setbg.nix | 11 +++++ .../home-manager/cli/scripts/tag-release.nix | 17 +++++++ .../home-manager/cli/scripts/unmounter.nix | 36 +++++++++++++++ .../cli/scripts/update-all-git-repos.nix | 33 ++++++++++++++ 26 files changed, 194 insertions(+), 323 deletions(-) create mode 100755 modules/home-manager/cli/scripts/create-script.nix create mode 100755 modules/home-manager/cli/scripts/mounter.nix create mode 100755 modules/home-manager/cli/scripts/move-firefox-screenshots.nix delete mode 100755 modules/home-manager/cli/scripts/scripts/create-script delete mode 100755 modules/home-manager/cli/scripts/scripts/git-abort delete mode 100755 modules/home-manager/cli/scripts/scripts/git-bare-clone delete mode 100755 modules/home-manager/cli/scripts/scripts/git-continue delete mode 100755 modules/home-manager/cli/scripts/scripts/git-sync delete mode 100755 modules/home-manager/cli/scripts/scripts/git-up delete mode 100755 modules/home-manager/cli/scripts/scripts/import-gzip-database delete mode 100755 modules/home-manager/cli/scripts/scripts/main-or-master-branch delete mode 100755 modules/home-manager/cli/scripts/scripts/mounter delete mode 100755 modules/home-manager/cli/scripts/scripts/move-firefox-screenshots delete mode 100755 modules/home-manager/cli/scripts/scripts/new-drupal-module delete mode 100755 modules/home-manager/cli/scripts/scripts/setbg delete mode 100755 modules/home-manager/cli/scripts/scripts/start-traefik delete mode 100755 modules/home-manager/cli/scripts/scripts/stop-all-docker-containers delete mode 100755 modules/home-manager/cli/scripts/scripts/stop-traefik delete mode 100755 modules/home-manager/cli/scripts/scripts/tag-release delete mode 100755 modules/home-manager/cli/scripts/scripts/unmounter delete mode 100755 modules/home-manager/cli/scripts/scripts/update-all-git-repos create mode 100644 modules/home-manager/cli/scripts/setbg.nix create mode 100644 modules/home-manager/cli/scripts/tag-release.nix create mode 100755 modules/home-manager/cli/scripts/unmounter.nix create mode 100755 modules/home-manager/cli/scripts/update-all-git-repos.nix diff --git a/modules/home-manager/cli/scripts/create-script.nix b/modules/home-manager/cli/scripts/create-script.nix new file mode 100755 index 00000000..1753e45f --- /dev/null +++ b/modules/home-manager/cli/scripts/create-script.nix @@ -0,0 +1,21 @@ +{ pkgs }: + +pkgs.writeShellApplication { + name = "create-script"; + + text = '' + cat > "$1" << EOF + #!/usr/bin/env bash + + set -o errexit + set -o nounset + set -o pipefail + + + EOF + + chmod +x "$1" + + $EDITOR "$1"; + ''; +} diff --git a/modules/home-manager/cli/scripts/default.nix b/modules/home-manager/cli/scripts/default.nix index 2da9de18..0f95d62d 100644 --- a/modules/home-manager/cli/scripts/default.nix +++ b/modules/home-manager/cli/scripts/default.nix @@ -1,10 +1,18 @@ -{ - home = { - sessionPath = [ "$HOME/.local/bin" ]; +{ pkgs, ... }: - file.".local/bin" = { - source = ./scripts; - recursive = true; - }; - }; +{ + # TODO: separate desktop-only scripts? + home.packages = + let + scriptNames = [ + "create-script" + "mounter" + "move-firefox-screenshots" + "setbg" + "tag-release" + "unmounter" + "update-all-git-repos" + ]; + in + map (name: pkgs.callPackage ./${name}.nix { }) scriptNames; } diff --git a/modules/home-manager/cli/scripts/mounter.nix b/modules/home-manager/cli/scripts/mounter.nix new file mode 100755 index 00000000..df0e0982 --- /dev/null +++ b/modules/home-manager/cli/scripts/mounter.nix @@ -0,0 +1,45 @@ +{ pkgs }: + +pkgs.writeShellApplication { + name = "mounter"; + + runtimeInputs = with pkgs; [ + cryptsetup + dmenu + gawk + libnotify + util-linux + ]; + + text = '' + lsblk_output="$(lsblk -rpo "uuid,name,type,size,label,mountpoint,mountpoints,fstype" | grep "part" | grep -Ev "/(boot|nix/store)")" + partition_names="$(echo "$lsblk_output" | awk '{ printf "%s (%s)\n", $2, $4 }' )"; + + selected=$(echo "$partition_names" | dmenu -p "Select drive:" | awk '{ print $1 }') + test -n "$selected" + mount_device="$selected" + + if sudo cryptsetup isLuks "$selected"; then + luks_name="usb" + + ${"TERMINAL:-st"} -n floatterm -g 60x1 -e sudo cryptsetup open "$selected" "$luks_name" + + mount_device="/dev/mapper/$luks_name" + + test -b "/dev/mapper/$luks_name" + fi + + mount_point=$(echo -e "/mnt\n/media\n/run/media/$USER" | dmenu -p "Select mount point:") + test -n "$mount_point" + + sudo mkdir -p "$mount_point" + + if sudo mount "$mount_device" "$mount_point"; then + notify-send "Device mounted" "Mounted $selected at $mount_point." + else + notify-send "Mount failed" "Failed to mount $selected." + + exit 1 + fi + ''; +} diff --git a/modules/home-manager/cli/scripts/move-firefox-screenshots.nix b/modules/home-manager/cli/scripts/move-firefox-screenshots.nix new file mode 100755 index 00000000..8f544f30 --- /dev/null +++ b/modules/home-manager/cli/scripts/move-firefox-screenshots.nix @@ -0,0 +1,15 @@ +{ pkgs }: + +pkgs.writeShellApplication { + name = "move-firefox-screenshots"; + + runtimeInputs = with pkgs; [ findutils ]; + + text = '' + original_directory="''${HOME}/Downloads" + new_directory="''${HOME}/Pictures/Screenshots" + + find "''${original_directory}" -mindepth 1 -maxdepth 1 -type f -name "Screenshot *" \ + -exec mv {} "''${new_directory}" \; + ''; +} diff --git a/modules/home-manager/cli/scripts/scripts/create-script b/modules/home-manager/cli/scripts/scripts/create-script deleted file mode 100755 index 6d830971..00000000 --- a/modules/home-manager/cli/scripts/scripts/create-script +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env bash - -if [[ "$1" == "" ]]; then - echo "Usage: ${0##*/} "; exit 2 -fi - -set -o errexit -set -o nounset -set -o pipefail - -cat > "$1" << EOF -#!/usr/bin/env bash - -set -o errexit -set -o nounset -set -o pipefail - - -EOF - -chmod +x "$1" - -$EDITOR "$1"; diff --git a/modules/home-manager/cli/scripts/scripts/git-abort b/modules/home-manager/cli/scripts/scripts/git-abort deleted file mode 100755 index cd7e067c..00000000 --- a/modules/home-manager/cli/scripts/scripts/git-abort +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash - -# Abort a rebase, merge, `am`, a cherry-pick or a revert, depending on the situation. - -if [[ -e .git/CHERRY_PICK_HEAD ]] ; then - exec git cherry-pick --abort "$@" -elif [[ -e .git/REVERT_HEAD ]] ; then - exec git revert --abort "$@" -elif [[ -e .git/rebase-apply/applying ]] ; then - exec git am --abort "$@" -elif [[ -e .git/rebase-apply ]] ; then - exec git rebase --abort "$@" -elif [[ -e .git/rebase-merge ]] ; then - exec git rebase --abort "$@" -elif [[ -e .git/MERGE_MODE ]] ; then - exec git merge --abort "$@" -else - echo git-abort: unknown state - exit 1 -fi diff --git a/modules/home-manager/cli/scripts/scripts/git-bare-clone b/modules/home-manager/cli/scripts/scripts/git-bare-clone deleted file mode 100755 index 4db9eaba..00000000 --- a/modules/home-manager/cli/scripts/scripts/git-bare-clone +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash - -# Creates a new bare clone of a repository with the bare files within a `.bare` -# directory. It also sets the origin URL so push and pull work as expected. - -if [[ "$1" == "" ]]; then - echo "Usage: ${0##*/} []" - exit 2 -fi - -set -euo pipefail - -repository_url="${1}" -directory="${2:-}" -location=".bare" - -# If no destination directory is specified, get it from the repository URL - the same as "git clone". -if [ -z "${directory}" ]; then - directory="$(basename -s .git "${repository_url}")" -fi - -# Create the parent directory if needed. -mkdir -pv "${directory}" -cd "${directory}" - -git clone --bare "${repository_url}" "${location}" - -# Adjust origin fetch locations. -cd "${location}" -git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" - -# Set .git file contents. -cd .. -echo "gitdir: ./${location}" > .git diff --git a/modules/home-manager/cli/scripts/scripts/git-continue b/modules/home-manager/cli/scripts/scripts/git-continue deleted file mode 100755 index 9649ec95..00000000 --- a/modules/home-manager/cli/scripts/scripts/git-continue +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash - -# Continue a rebase or cherry-pick in the event of conflicts. - -if [[ -e .git/CHERRY_PICK_HEAD ]] ; then - exec git cherry-pick --continue "$@" -elif [[ -e .git/rebase-apply/applying ]] ; then - exec git rebase --continue "$@" -elif [[ -e .git/rebase-apply ]] ; then - exec git rebase --continue "$@" -elif [[ -e .git/rebase-merge ]] ; then - exec git rebase --continue "$@" -else - echo git-abort: unknown state - exit 1 -fi diff --git a/modules/home-manager/cli/scripts/scripts/git-sync b/modules/home-manager/cli/scripts/scripts/git-sync deleted file mode 100755 index ff3775c5..00000000 --- a/modules/home-manager/cli/scripts/scripts/git-sync +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -git fetch --all -git stash -git pull --rebase -git stash pop diff --git a/modules/home-manager/cli/scripts/scripts/git-up b/modules/home-manager/cli/scripts/scripts/git-up deleted file mode 100755 index 79f36293..00000000 --- a/modules/home-manager/cli/scripts/scripts/git-up +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -# Usage: git up {branch} {remote} - -set -e - -if [[ $# < 1 ]]; then - echo "You must specify a branch name to update" - exit 1 -fi - -BRANCH=$1 -REMOTE=${2:-origin} - -git checkout ${BRANCH} && \ - git fetch ${REMOTE} && \ - echo && \ - git sl ${BRANCH}..${REMOTE}/${BRANCH} && \ - echo && \ - git pull --quiet && \ - git checkout - diff --git a/modules/home-manager/cli/scripts/scripts/import-gzip-database b/modules/home-manager/cli/scripts/scripts/import-gzip-database deleted file mode 100755 index 9a6cf7ef..00000000 --- a/modules/home-manager/cli/scripts/scripts/import-gzip-database +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -if [[ "$1" == "" ]]; then - echo "Usage: ${0##*/} "; exit 2 -fi - -set -euo pipefail - -filename="${1}" -shift 1 - -pv "${filename}" \ - | zcat \ - | docker compose exec -T "${SERVICE_NAME:-database}" mysql \ - -p"${DB_PASSWORD:-app}" \ - -u"${DB_USER:-app}" \ - "${DB_NAME:-app}" diff --git a/modules/home-manager/cli/scripts/scripts/main-or-master-branch b/modules/home-manager/cli/scripts/scripts/main-or-master-branch deleted file mode 100755 index ed9ffbd3..00000000 --- a/modules/home-manager/cli/scripts/scripts/main-or-master-branch +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/zsh - -# Check if we should use the `main` or `master` branch for this repo. -# Prefer `main` to `master`. - -if git show-ref --quiet origin/main || git rev-parse main &>/dev/null; then - echo main -else - echo master -fi \ No newline at end of file diff --git a/modules/home-manager/cli/scripts/scripts/mounter b/modules/home-manager/cli/scripts/scripts/mounter deleted file mode 100755 index 60b828eb..00000000 --- a/modules/home-manager/cli/scripts/scripts/mounter +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env bash - -set -o errexit -set -o nounset -set -o pipefail - -lsblk_output="$(lsblk -rpo "uuid,name,type,size,label,mountpoint,mountpoints,fstype" | grep "part" | grep -Ev "/(boot|nix/store)")" -partition_names="$(echo "$lsblk_output" | awk '{ printf "%s (%s)\n", $2, $4 }' )"; - -selected=$(echo "$partition_names" | dmenu -p "Select drive:" | awk '{ print $1 }') -test -n "$selected" -mount_device="$selected" - -if sudo cryptsetup isLuks "$selected"; then - luks_name="usb" - - ${TERMINAL:-st} -n floatterm -g 60x1 -e sudo cryptsetup open "$selected" "$luks_name" - - mount_device="/dev/mapper/$luks_name" - - test -b "/dev/mapper/$luks_name" -fi - -mount_point=$(echo -e "/mnt\n/media\n/run/media/$USER" | dmenu -p "Select mount point:") -test -n "$mount_point" - -sudo mkdir -p "$mount_point" - -if sudo mount "$mount_device" "$mount_point"; then - notify-send "Device mounted" "Mounted $selected at $mount_point." -else - notify-send "Mount failed" "Failed to mount $selected." - - exit 1 -fi - diff --git a/modules/home-manager/cli/scripts/scripts/move-firefox-screenshots b/modules/home-manager/cli/scripts/scripts/move-firefox-screenshots deleted file mode 100755 index d47e522d..00000000 --- a/modules/home-manager/cli/scripts/scripts/move-firefox-screenshots +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -set -o errexit -set -o nounset -set -o pipefail - -original_directory="${HOME}/Downloads" -new_directory="${HOME}/Pictures/Screenshots" - -find "${original_directory}" -mindepth 1 -maxdepth 1 -type f -name "Screenshot *" \ - -exec mv {} "${new_directory}" \; diff --git a/modules/home-manager/cli/scripts/scripts/new-drupal-module b/modules/home-manager/cli/scripts/scripts/new-drupal-module deleted file mode 100755 index 7eeca36b..00000000 --- a/modules/home-manager/cli/scripts/scripts/new-drupal-module +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -if [[ "$1" == "" || "$2" == "" ]]; then - echo "Usage: ${0##*/} "; exit 2 -fi - -set -euo pipefail - -machine_name=$1 -module_name=$2 - -git clone https://github.com/opdavies/drupal-module-template \ - --depth=1 \ - "${machine_name}" - -pushd "${machine_name}" -just rename "${module_name}" -rm -fr .git .github justfile phpcs.xml.dist -popd diff --git a/modules/home-manager/cli/scripts/scripts/setbg b/modules/home-manager/cli/scripts/scripts/setbg deleted file mode 100755 index 9882de53..00000000 --- a/modules/home-manager/cli/scripts/scripts/setbg +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -xwallpaper --zoom ${XDG_REPOS_DIR}/personal/nix-config/wallpaper/wallpaper.jpg diff --git a/modules/home-manager/cli/scripts/scripts/start-traefik b/modules/home-manager/cli/scripts/scripts/start-traefik deleted file mode 100755 index 6bbdb9d9..00000000 --- a/modules/home-manager/cli/scripts/scripts/start-traefik +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -set -o errexit -set -o nounset - -cd "${XDG_REPOS_DIR}/traefik-development" - -docker compose up --detach -docker container ps diff --git a/modules/home-manager/cli/scripts/scripts/stop-all-docker-containers b/modules/home-manager/cli/scripts/scripts/stop-all-docker-containers deleted file mode 100755 index 69e59a42..00000000 --- a/modules/home-manager/cli/scripts/scripts/stop-all-docker-containers +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -# Stops all running Docker containers except for the global Traefik proxy. - -set -euo pipefail - -# Show the running containers. -docker container ps - -echo "" - -# Stop the running containers and show any that are still running. -docker container ls | - tail -n +2 | - grep -v traefik-development-reverse-proxy-1 | - awk '{print $1}' | - xargs docker container stop -echo "" -docker container ps diff --git a/modules/home-manager/cli/scripts/scripts/stop-traefik b/modules/home-manager/cli/scripts/scripts/stop-traefik deleted file mode 100755 index 813e3c2c..00000000 --- a/modules/home-manager/cli/scripts/scripts/stop-traefik +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -set -o errexit -set -o nounset - -docker container stop traefik-development-reverse-proxy-1 -docker container ps diff --git a/modules/home-manager/cli/scripts/scripts/tag-release b/modules/home-manager/cli/scripts/scripts/tag-release deleted file mode 100755 index c1899930..00000000 --- a/modules/home-manager/cli/scripts/scripts/tag-release +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -commit_sha="${1:-HEAD}" -tag="$(date '+%Y-%m-%d-%H.%M.%S')" - -echo "Tagging commit $(git rev-parse "${commit_sha}") as ${tag}." -echo "" - -git tag "${tag}" "${commit_sha}" diff --git a/modules/home-manager/cli/scripts/scripts/unmounter b/modules/home-manager/cli/scripts/scripts/unmounter deleted file mode 100755 index cc3d5d8b..00000000 --- a/modules/home-manager/cli/scripts/scripts/unmounter +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - -set -o errexit -set -o nounset -set -o pipefail - -lsblk_output="$(lsblk -nrpo "name,type,size,mountpoint")" -mounted_drives="$(echo "$lsblk_output" | awk '($2=="part"||$2="crypt")&&$4!~/\/boot|\/home$|SWAP/&&length($4)>1{printf "%s (%s)\n",$4,$3}')" - -all_unmountable="$(echo "$mounted_drives" | sed "/^$/d;s/ *$//")" -test -n "$all_unmountable" - -selected="$(echo "$all_unmountable" | dmenu -i -p "Unmount which drive?")" -selected="${selected%% *}" -test -n "$selected" - -sudo -A umount -l "/${selected#*/}" -notify-send "Device unmounted" "$selected has been unmounted." - -# Close the selected drive if decrypted. -cryptid="$(echo "$lsblk_output" | grep "/${selected#*/}$")" -cryptid="${cryptid%% *}" -test -b /dev/mapper/"${cryptid##*/}" -sudo -A cryptsetup close "$cryptid" - -notify-send "Device dencryption closed" "Drive is now securely locked again." diff --git a/modules/home-manager/cli/scripts/scripts/update-all-git-repos b/modules/home-manager/cli/scripts/scripts/update-all-git-repos deleted file mode 100755 index b3c4bcd5..00000000 --- a/modules/home-manager/cli/scripts/scripts/update-all-git-repos +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash - -# Update all top-level Git repository clones within my Code directories to their -# latest version. - -set -o errexit -set -o nounset - -dirs=$(find "$XDG_REPOS_DIR" -mindepth 1 -maxdepth 2 -type d -name .git -not -path '*/*.old/*') - -for dir in $dirs; do - repo_path="${dir%/.git}" - - cd "${repo_path}" - - # If the repo is a bare clone, the commands need to be run within the - # worktree directory. - [[ -f .bare/worktrees/main/gitdir && -d main && -f main/.git ]] && cd main - - echo "Updating $(pwd)" - - # Update the repository. - git fetch --all --jobs=4 --progress --prune || true - git pull --rebase || true -done diff --git a/modules/home-manager/cli/scripts/setbg.nix b/modules/home-manager/cli/scripts/setbg.nix new file mode 100644 index 00000000..2b71fd8b --- /dev/null +++ b/modules/home-manager/cli/scripts/setbg.nix @@ -0,0 +1,11 @@ +{ pkgs, writeShellApplication }: + +writeShellApplication { + name = "setbg"; + + runtimeInputs = with pkgs; [ xwallpaper ]; + + text = '' + xwallpaper --zoom "''${XDG_REPOS_DIR}/personal/nix-config/wallpaper/wallpaper.jpg" + ''; +} diff --git a/modules/home-manager/cli/scripts/tag-release.nix b/modules/home-manager/cli/scripts/tag-release.nix new file mode 100644 index 00000000..0bd612b6 --- /dev/null +++ b/modules/home-manager/cli/scripts/tag-release.nix @@ -0,0 +1,17 @@ +{ git, writeShellApplication }: + +writeShellApplication { + name = "tag-release"; + + runtimeInputs = [ git ]; + + text = '' + commit_sha="''${1:-HEAD}" + tag="$(date '+%Y-%m-%d-%H.%M.%S')" + + echo "Tagging commit $(git rev-parse "''${commit_sha}") as ''${tag}." + echo "" + + git tag "''${tag}" "''${commit_sha}" + ''; +} diff --git a/modules/home-manager/cli/scripts/unmounter.nix b/modules/home-manager/cli/scripts/unmounter.nix new file mode 100755 index 00000000..51e5d967 --- /dev/null +++ b/modules/home-manager/cli/scripts/unmounter.nix @@ -0,0 +1,36 @@ +{ pkgs }: + +pkgs.writeShellApplication { + name = "unmounter"; + + runtimeInputs = with pkgs; [ + cryptsetup + dmenu + gawk + libnotify + util-linux + ]; + + text = '' + lsblk_output="$(lsblk -nrpo "name,type,size,mountpoint")" + mounted_drives="$(echo "$lsblk_output" | awk '($2=="part"||$2="crypt")&&$4!~/\/boot|\/home$|SWAP/&&length($4)>1{printf "%s (%s)\n",$4,$3}')" + + all_unmountable="$(echo "$mounted_drives" | sed "/^$/d;s/ *$//")" + test -n "$all_unmountable" + + selected="$(echo "$all_unmountable" | dmenu -i -p "Unmount which drive?")" + selected="''${selected%% *}" + test -n "$selected" + + sudo -A umount -l "/''${selected#*/}" + notify-send "Device unmounted" "$selected has been unmounted." + + # Close the selected drive if decrypted. + cryptid="$(echo "$lsblk_output" | grep "/''${selected#*/}$")" + cryptid="''${cryptid%% *}" + test -b /dev/mapper/"''${cryptid##*/}" + sudo -A cryptsetup close "$cryptid" + + notify-send "Device dencryption closed" "Drive is now securely locked again." + ''; +} diff --git a/modules/home-manager/cli/scripts/update-all-git-repos.nix b/modules/home-manager/cli/scripts/update-all-git-repos.nix new file mode 100755 index 00000000..1ef76bf2 --- /dev/null +++ b/modules/home-manager/cli/scripts/update-all-git-repos.nix @@ -0,0 +1,33 @@ +{ pkgs }: + +pkgs.writeShellApplication { + name = "update-all-git-repos"; + + runtimeInputs = with pkgs; [ + findutils + git + ]; + + text = '' + # Update all top-level Git repository clones within my Code directories to their + # latest version. + + dirs=$(find "$XDG_REPOS_DIR" -mindepth 2 -maxdepth 3 -type d -name .git -not -path '*/*.old/*') + + for dir in $dirs; do + repo_path="''${dir%/.git}" + + cd "''${repo_path}" + + # If the repo is a bare clone, the commands need to be run within the + # worktree directory. + [[ -f .bare/worktrees/main/gitdir && -d main && -f main/.git ]] && cd main + + echo "Updating $(pwd)" + + # Update the repository. + git fetch --all --jobs=4 --progress --prune + git pull --rebase + done + ''; +}