From 4b59ae9a24e3a8d49d5724e3be38bdf8ed65997b Mon Sep 17 00:00:00 2001 From: Rutherther Date: Fri, 27 Jun 2025 17:15:36 +0200 Subject: [PATCH] feat(home): Add setup_mirrored_repo script --- home/dotfiles/scripts/setup_mirrored_repo | 86 +++++++++++++++++++++++ home/home-configuration.scm | 33 +++++++++ 2 files changed, 119 insertions(+) create mode 100644 home/dotfiles/scripts/setup_mirrored_repo diff --git a/home/dotfiles/scripts/setup_mirrored_repo b/home/dotfiles/scripts/setup_mirrored_repo new file mode 100644 index 0000000000000000000000000000000000000000..4f40a2a8ad29371b82e73eb6fa28307a61e5dcce --- /dev/null +++ b/home/dotfiles/scripts/setup_mirrored_repo @@ -0,0 +1,86 @@ +#!/usr/bin/env bash + +set -euxo pipefail + +inspect_main_repo() +{ + # This script will print information about a repository. + + if [[ $# -ne 1 ]]; then + echo "Usage: $0 repo" + exit 1 + fi + + repo="$1" + + hut git show "$repo" | head -n1 | cut -d' ' -f2 | tr -d '()' +} + +ensure_repo_created_forgejo() +{ + local repo + local instance + local repo_name + local visibility + local args + + repo="$2" + host="$1" + repo_name=$(echo "$repo" | cut -d'/' -f2) + if ! fj --host "$host" repo view "$repo"; then + visibility=$(inspect_main_repo "~ruther/$repo_name") + args="" + if [[ $visibility == "private" ]]; then + args="$args -P" + fi + + fj --host "$host" repo create "$repo_name" $args --description "Mirror of https://git.ditigal.xyz/~ruther/$repo_name" + else + echo "Repo already exists." + fi +} + +ensure_repo_created_srht() +{ + local repo + local instance + local repo_name + local visibility + + repo="$2" + instance="$1" + repo_name=$(echo "$repo" | cut -d'/' -f2) + if ! hut --instance "$instance" git show "~ruther/$repo_name"; then + visibility=$(inspect_main_repo "$repo") + hut --instance "$instance" git create "$repo_name" --visibility "$visibility" --description "Mirror of https://git.ditigal.xyz/$repo" + else + echo "Repo already exists." + fi +} + +# Fails if not repo +git status + +repo="$(git remote get-url origin | awk -F'/' '{ print $NF }')" + +# 1. Get url from remote origin (fetch url), the last part is name of repo +# 2. Ensure created on sr.ht +ensure_repo_created_srht "sr.ht" "$repo" + +# 3. Ensure created on codeberg +# only if not --no-codeberg +ensure_repo_created_forgejo "codeberg.org" "Rutherther/$repo" +# 4. Remove and read push urls + +remotes=( + "git@codeberg.org:Rutherther/$repo" + "git@git.sr.ht:~ruther/$repo" + "git@ditigal.xyz:~ruther/$repo") + +set +e +for remote in "${remotes[@]}"; do + git remote set-url --delete --push origin "$remote" 2>/dev/null + git remote set-url --add --push origin "$remote" +done + +git remote show origin \ No newline at end of file diff --git a/home/home-configuration.scm b/home/home-configuration.scm index 4c11ea862402b9fc4f502bfcc44d7b34377f7819..4e93dab5b25f10a7c1d8a554b0937841b7daec82 100644 --- a/home/home-configuration.scm +++ b/home/home-configuration.scm @@ -25,6 +25,7 @@ (gnu packages man) (guix git-download) (guix build-system gnu) + (guix build-system copy) ((guix licenses) #:prefix license:) (gnu packages fonts) (gnu services) @@ -57,6 +58,33 @@ #~(job '(next-minute (range 0 60 5)) (string-append #$offlineimap "/bin/offlineimap"))) +(define (make-script-package name script-file dependencies) + (package + (name name) + (source script-file) + (build-system copy-build-system) + (version "0") + (inputs + (specifications->packages dependencies)) + (arguments + (list + #:install-plan `'((,name ,(string-append "bin/" name))) + #:phases #~(modify-phases %standard-phases + (add-after 'unpack 'permissions + (lambda _ + (chmod (string-append #$name) #o777))) + (add-after 'install 'wrap + (lambda _ + (wrap-program (string-append #$output "/bin/" #$name) + `("PATH" ":" prefix + ,(map (lambda (folder) (string-append folder "/bin")) + '#$(map (lambda (pkg) (this-package-input pkg)) dependencies))))))))) + + (synopsis #f) + (description #f) + (license #f) + (home-page #f))) + (define-public font-awesome-6 (package/inherit font-awesome (version "6.5.2") @@ -105,6 +133,10 @@ (packages (append (cons* + (make-script-package + "setup_mirrored_repo" + (local-file "dotfiles/scripts/setup_mirrored_repo") + (list "hut" "forgejo-cli" "git-minimal" "bash" "gawk" "coreutils")) dwl-mine font-awesome-6 @@ -141,6 +173,7 @@ ;; Development "git" "openssh" + "hut" "forgejo-cli" ;; Passwords "gnupg" "password-store-wl" "pass-otp"