From d68648a43c29f9c2f323df22b1b1347e53014d8d Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Fri, 6 Dec 2024 20:45:22 -0500 Subject: [PATCH] add autocommit tooling, update commits --- channels.scm | 4 +- home/config/zsh/zshrc | 13 +- home/nix/flake.lock | 16 +-- home/nix/flake.nix | 4 +- scripts/reconfigure-system | 3 + scripts/reconfigure-user | 4 + scripts/update-commits | 268 +++++++++++++++++++++++++++++++++++++ 7 files changed, 288 insertions(+), 24 deletions(-) create mode 100755 scripts/reconfigure-system create mode 100755 scripts/reconfigure-user create mode 100755 scripts/update-commits diff --git a/channels.scm b/channels.scm index fa49aab..fa63fed 100644 --- a/channels.scm +++ b/channels.scm @@ -3,7 +3,7 @@ (url "https://git.savannah.gnu.org/git/guix.git") (branch "master") (commit - "d97a67d41de142c0fbdba55e96bfc147482bfae2") + "c56505e399834a3f68cf2b6715b42f12ceea217a") (introduction (make-channel-introduction "9edb3f66fd807b096b48283debdcddccfea34bad" @@ -25,7 +25,7 @@ (url "https://g.freya.cat/freya/sakura") (branch "main") (commit - "e6d80dd95a7fcd205265094c0047d0c2cfd09e15") + "8b7a2148c891bb4b3324d6bd5df95982236c1039") (introduction (make-channel-introduction "8fb2f9c2fa414754c41c1c73665e3e73e12693ab" diff --git a/home/config/zsh/zshrc b/home/config/zsh/zshrc index b7b4423..6f44d62 100644 --- a/home/config/zsh/zshrc +++ b/home/config/zsh/zshrc @@ -15,7 +15,7 @@ then fi PATH=$PATH:$HOME/.cargo/bin -PATH=$PATH:/var/lib/flatpak/exports/bin +PATH=$PATH:$HOME/.config/guix/scripts DOCKER_HOME="$HOME/.docker" # vim mode >:) @@ -30,19 +30,12 @@ else export PS1="$$USER: " fi -# reconfigure aliases -alias reconfigure-system="sudo -E guix system -L $HOME/.config/guix/modules reconfigure $HOME/.config/guix/systems/$(hostname).scm" -alias reconfigure-user="guix home -L $HOME/.config/guix/modules reconfigure $HOME/.config/guix/home/home.scm" -alias reconfigure-nix="home-manager switch" - # aliases -alias neo="pfetch" alias rf="rm -fr" # remove le french hon hon hon alias ls="ls --color=auto" alias ip="ip --color=auto" alias grep="grep --color=auto" alias diff="diff --color=auto" -alias ccat="highlight --out-format=ansi" alias vim="nvim" alias ssh='TERM=xterm-256color ssh' # xterm-kitty bad @@ -87,8 +80,4 @@ bindkey "^F" ranger export GPG_TTY=$(tty) # ricing -export PF_CUSTOM_LOGOS="/home/freya/.config/zsh/pfetch_logos" - pfetch - -PWD="$HOME" diff --git a/home/nix/flake.lock b/home/nix/flake.lock index 55f61f2..d4419e3 100644 --- a/home/nix/flake.lock +++ b/home/nix/flake.lock @@ -22,17 +22,17 @@ ] }, "locked": { - "lastModified": 1732025103, - "narHash": "sha256-qjEI64RKvDxRyEarY0jTzrZMa8ebezh2DEZmJJrpVdo=", + "lastModified": 1733484277, + "narHash": "sha256-i5ay20XsvpW91N4URET/nOc0VQWOAd4c4vbqYtcH8Rc=", "owner": "nix-community", "repo": "home-manager", - "rev": "a46e702093a5c46e192243edbd977d5749e7f294", + "rev": "d00c6f6d0ad16d598bf7e2956f52c1d9d5de3c3a", "type": "github" }, "original": { "owner": "nix-community", "repo": "home-manager", - "rev": "a46e702093a5c46e192243edbd977d5749e7f294", + "rev": "d00c6f6d0ad16d598bf7e2956f52c1d9d5de3c3a", "type": "github" } }, @@ -60,17 +60,17 @@ }, "nixpkgs": { "locked": { - "lastModified": 1732014248, - "narHash": "sha256-y/MEyuJ5oBWrWAic/14LaIr/u5E0wRVzyYsouYY3W6w=", + "lastModified": 1733212471, + "narHash": "sha256-M1+uCoV5igihRfcUKrr1riygbe73/dzNnzPsmaLCmpo=", "owner": "nixos", "repo": "nixpkgs", - "rev": "23e89b7da85c3640bbc2173fe04f4bd114342367", + "rev": "55d15ad12a74eb7d4646254e13638ad0c4128776", "type": "github" }, "original": { "owner": "nixos", "repo": "nixpkgs", - "rev": "23e89b7da85c3640bbc2173fe04f4bd114342367", + "rev": "55d15ad12a74eb7d4646254e13638ad0c4128776", "type": "github" } }, diff --git a/home/nix/flake.nix b/home/nix/flake.nix index 63917a2..15da61c 100644 --- a/home/nix/flake.nix +++ b/home/nix/flake.nix @@ -3,10 +3,10 @@ inputs = { # nixpkgs - nixpkgs.url = "github:nixos/nixpkgs/23e89b7da85c3640bbc2173fe04f4bd114342367"; + nixpkgs.url = "github:nixos/nixpkgs/55d15ad12a74eb7d4646254e13638ad0c4128776"; # home manager - home-manager.url = "github:nix-community/home-manager/a46e702093a5c46e192243edbd977d5749e7f294"; + home-manager.url = "github:nix-community/home-manager/d00c6f6d0ad16d598bf7e2956f52c1d9d5de3c3a"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; # nixgl diff --git a/scripts/reconfigure-system b/scripts/reconfigure-system new file mode 100755 index 0000000..1e38b42 --- /dev/null +++ b/scripts/reconfigure-system @@ -0,0 +1,3 @@ +#!/bin/sh +repo="$HOME/.config/guix" +sudo -E guix system -L "$repo/modules" reconfigure "$repo/systems/$(hostname).scm" diff --git a/scripts/reconfigure-user b/scripts/reconfigure-user new file mode 100755 index 0000000..3a0a602 --- /dev/null +++ b/scripts/reconfigure-user @@ -0,0 +1,4 @@ +#!/bin/sh +repo="$HOME/.config/guix" +guix home -L "$repo/modules" reconfigure "$repo/home/home.scm" +home-manager switch diff --git a/scripts/update-commits b/scripts/update-commits new file mode 100755 index 0000000..9302dcb --- /dev/null +++ b/scripts/update-commits @@ -0,0 +1,268 @@ +#!/run/current-system/profile/bin/guile -s +!# + +(use-modules (guix) + (guix channels) + (guix import json) + (guix git) + (ice-9 popen) + (ice-9 textual-ports) + (ice-9 pretty-print) + (srfi srfi-1)) ;; alist + +;; +;; config +;; + +(define %dotfiles-dir + (string-append + (getenv "HOME") + "/.config/guix")) + +(define %guix-channels-file + (string-append %dotfiles-dir "/channels.scm")) + +(define %nix-flake-file + (string-append %dotfiles-dir "/home/nix/flake.nix")) + +(define %guix-cuirass-servers + (list "https://cuirass.nonguix.org" + "https://cuirass.freya.cat")) + +;; +;; io functions +;; + +(define (invoke . args) + (let* ((command (string-join args " ")) + (err-cons (pipe)) + (port (with-error-to-port (cdr err-cons) + (lambda _ (open-input-pipe command)))) + (_ (setvbuf (car err-cons) 'block + (* 1024 16))) ; 16kib buffer + (result (get-string-all port))) + (close-port (cdr err-cons)) + result)) + +(define (read-file path) + (call-with-input-file path get-string-all)) + +(define (write-file path contents) + (call-with-output-file path (lambda (port) + (put-string port contents)))) + +;; +;; git functions +;; + +(define (git-checkout git-url) + ;; create or update a local bare git checkout from + ;; - clones checkout if it doesnt exist + ;; - fetches newset commits + (let* ((home (getenv "HOME")) + (name (string-append + (string-replace-substring + (last (string-split git-url #\/)) + ".git" + "") + ".git")) + (dir (string-append home + "/.cache/checkouts/" + name))) + (if (not (access? dir F_OK)) + (begin + (format #t "checking out ~a...\n" name) + (invoke "mkdir" "-p" dir) + (invoke "git" "clone" "--bare" git-url dir))) + (invoke "git" "-C" dir "fetch") + dir)) + +(define (git-latest-commit git-url) + (car (string-split + (invoke "git" "ls-remote" git-url "HEAD") + #\tab))) + +(define (commit-timestamp git-url commit) + ; get the unix timestamp of a in git repo + (let* ((dir (git-checkout git-url)) + (timestamp + (invoke "git" "-C" dir "show" "--quiet" "--format=%at" commit))) + (string->number (string-trim-both timestamp #\newline)))) + +;; +;; core functions +;; + +(define (merge-commits local-commits remote-commits) + ;; create a zipped pair of each and commits + ;; - ignores the commit if the remote its older than the local commit + ;; + ;; local commit format: + ;; ('id "git-url" "commit") + ;; + ;; remote commit format: + ;; ('id . "commit") + ;; + ;; return format: + ;; ('id "local-commit" "newest-commit") ;; neweset commit is commit with + ;; ;; newer timestamp + (fold (lambda (local-repo commits) + (let* ((repo-id (car local-repo)) + (git-url (cadr local-repo)) + ; local + (local-commit (caddr local-repo)) + (local-timestamp (commit-timestamp git-url local-commit)) + ; remote + (remote-commit (assoc-ref remote-commits repo-id)) + (remote-timestamp (if (string? remote-commit) + (commit-timestamp git-url remote-commit))) + ; newest + (newest-commit (if (and (number? remote-timestamp) + (> remote-timestamp local-timestamp)) + remote-commit)) + ; result + (result (if (string? newest-commit) + (cons (list repo-id local-commit newest-commit) + commits) + commits))) + result)) + '() + local-commits)) + +(define (update-file local-commits remote-commits path) + (let* ((contents (read-file path)) + (commits (merge-commits local-commits remote-commits)) + (result (fold (lambda (pair contents) + (let ((repo-id (car pair)) + (local-commit (cadr pair)) + (remote-commit (caddr pair))) + (format #t "~s\t~a -> ~a\n" + repo-id + (string-take local-commit 7) + (string-take remote-commit 7)) + (string-replace-substring contents + local-commit + remote-commit))) + (read-file path) + commits))) + (write-file path result))) + +;; +;; guix functions +;; + +(define (cuirass-latest-evaluation cuirass-url) + (json-fetch + (string-append + cuirass-url + "/api/evaluations?nr=1"))) + +(define (guix-local-commits channels) + (map (lambda (channel) + (list (channel-name channel) + (channel-url channel) + (channel-commit channel))) + channels)) + +(define (cuirass-commits cuirass-servers) + (fold (lambda (cuirass-url env) + (let* ((evaluation (cuirass-latest-evaluation cuirass-url)) + (checkouts (vector->list + (assoc-ref + (car (vector->list evaluation)) + "checkouts")))) + (fold (lambda (checkout env) + (let* ((channel (string->symbol + (assoc-ref checkout "channel"))) + (commit (assoc-ref checkout "commit"))) + (if (assoc-ref env channel) + ;; channel already set, skip + env + ;; add commit to env + (assoc-set! env channel commit)))) + env + checkouts))) + '() + cuirass-servers)) + +;; +;; nix functions +;; + +(define (nix-local-commits flake-file) + (let ((lines (filter + (lambda (line) + (string-contains line "github:")) + (string-split (read-file flake-file) + #\newline)))) + (map + ;; valid line, parse out repo-id, git-url, and commit + (lambda (line) + (let* ((trimmed (substring line + (+ (string-index line #\:) 1) + (string-rindex line #\"))) + (pair (string-split trimmed #\/)) + (repo-id (string->symbol (cadr pair))) + (git-url (string-append "https://github.com/" + (car pair) "/" + (cadr pair) ".git")) + (commit (caddr pair))) + (list repo-id git-url commit))) + lines))) + +(define (nix-nixpkgs-commit) + (let ((json (json-fetch + (string-append + "https://raw.githubusercontent.com/" + "nix-community/home-manager" + "/refs/heads/master/flake.lock") + #:timeout 1))) + (fold + (lambda (key json) + (assoc-ref json key)) + json + (list "nodes" + "nixpkgs" + "locked" + "rev")))) + +(define (nix-remote-commits local-commits) + (fold (lambda (pair env) + (let* ((repo-id (car pair)) + (git-url (cadr pair)) + (commit (if (eq? repo-id 'nixpkgs) + (nix-nixpkgs-commit) + (git-latest-commit git-url)))) + (assoc-set! env repo-id commit))) + '() + local-commits)) + +;; +;; update +;; + +(define %guix-local-commits + (guix-local-commits + (load %guix-channels-file))) + +(define %guix-remote-commits + (cuirass-commits %guix-cuirass-servers)) + +(define %nix-local-commits + (nix-local-commits %nix-flake-file)) + +(define %nix-remote-commits + (nix-remote-commits %nix-local-commits)) + +(update-file + %guix-local-commits + %guix-remote-commits + %guix-channels-file) + +(update-file + %nix-local-commits + %nix-remote-commits + %nix-flake-file) + +(system* "guix" "pull" "-C" %guix-channels-file) +(system* "nix" "flake" "lock" (dirname %nix-flake-file))