summaryrefslogtreecommitdiff
path: root/tw
diff options
context:
space:
mode:
authorTimo Wilken2023-07-24 13:12:11 +0200
committerTimo Wilken2023-08-02 20:28:10 +0200
commit506d9e9f98ac498389f6c2428c760bf0819c32d7 (patch)
tree004695763037a429ea3b1d530b3f53e102f0a51f /tw
parent9db8734147731fe810ffcec9952d51ca60b69b5f (diff)
Fix git work identity config
The work gitconfig wasn't getting applied. Explicitly include it in the main gitconfig in an extensible way.
Diffstat (limited to 'tw')
-rw-r--r--tw/home.scm42
-rw-r--r--tw/home/cern.scm3
-rw-r--r--tw/home/lap.scm5
3 files changed, 40 insertions, 10 deletions
diff --git a/tw/home.scm b/tw/home.scm
index 754fb008..584907ae 100644
--- a/tw/home.scm
+++ b/tw/home.scm
@@ -1,4 +1,5 @@
(define-module (tw home)
+ #:use-module (ice-9 match)
#:use-module (ice-9 string-fun)
#:use-module (gnu)
#:use-module (gnu home services)
@@ -571,13 +572,44 @@ auto-expand-secmem
(gnupg-services #:gui-pinentry? #t)))
-(define-public (gitconfig email signing-key)
- (mixed-text-file "gitconfig" "\
+(define gitconfig-includes
+ (match-lambda
+ (() '())
+ (((name path _ _) rest ...)
+ ;; The relative path is relative to the gitconfig file.
+ (cons (format #f "[includeIf \"gitdir:~a/**\"]\n\tpath = ~aconfig"
+ (string-trim-right path #\/) name)
+ (gitconfig-includes rest)))
+ ((id rest ...)
+ (cons (format #f "# warning: ignored malformed identity: ~s" id)
+ (gitconfig-includes rest)))))
+
+(define gitconfig-otherfiles
+ (match-lambda
+ (() '())
+ (((name _ email signing-key) rest ...)
+ `((,(string-append "git/" name "config")
+ ,(plain-file (string-append "git" name "config")
+ (string-append
+ "[user]\n"
+ (if email (string-append "\temail = " email "\n") "")
+ (if signing-key (string-append "\tsigningkey = " signing-key "\n") ""))))
+ ,@(gitconfig-otherfiles rest)))
+ ((id rest ...)
+ (format (current-error-port) "warning: ignored malformed gitconfig identity: ~s~%" id)
+ (gitconfig-otherfiles rest))))
+
+(export gitconfig)
+(define* (gitconfig default-email default-signing-key #:rest identities)
+ (simple-service 'gitconfig home-xdg-configuration-files-service-type
+ `(,@(gitconfig-otherfiles identities)
+ ("git/config" ,(mixed-text-file "gitconfig" "\
# This is Git's per-user configuration file.
[user]
name = Timo Wilken
- email = " email "
- signingkey = " signing-key "
+ email = " default-email "
+ signingkey = " default-signing-key
+ (string-join (gitconfig-includes identities) "\n" 'prefix) "
[commit]
gpgsign = true
[url \"ssh://git@gitlab.cern.ch:7999/\"]
@@ -615,4 +647,4 @@ auto-expand-secmem
cmd = " kitty "/bin/kitty +kitten diff $LOCAL $REMOTE
[difftool \"kitty.gui\"]
cmd = " kitty "/bin/kitty " kitty "/bin/kitty +kitten diff $LOCAL $REMOTE
-"))
+")))))
diff --git a/tw/home/cern.scm b/tw/home/cern.scm
index e7b4124d..71da61fa 100644
--- a/tw/home/cern.scm
+++ b/tw/home/cern.scm
@@ -128,8 +128,7 @@
"/X11/ridge-view.jpg")))))))
;; On my work machine, Git must always use my work PGP key.
- (simple-service 'gitconfig home-xdg-configuration-files-service-type
- `(("git/config" ,(gitconfig "timo.wilken@cern.ch" "C2249BBE5E8761C943A0CFA1B7B3914BF63ACD7C"))))
+ (gitconfig "timo.wilken@cern.ch" "C2249BBE5E8761C943A0CFA1B7B3914BF63ACD7C")
(openssh-service #f)
diff --git a/tw/home/lap.scm b/tw/home/lap.scm
index 547715f1..7a6af2d4 100644
--- a/tw/home/lap.scm
+++ b/tw/home/lap.scm
@@ -196,9 +196,8 @@
;; On my private machine, I want to use my private PGP key normally, and
;; my work key only for work repositories.
- (simple-service 'gitconfig home-xdg-configuration-files-service-type
- `(("git/config" ,(gitconfig "git@twilken.net" "53EC3C06856883DD92355BC22FC78504681F69B0"))
- ("src/alice/.gitconfig" ,(local-file "files/gitconfig-cern"))))
+ (gitconfig "git@twilken.net" "53EC3C06856883DD92355BC22FC78504681F69B0"
+ '("cern" "~/src/alice" "timo.wilken@cern.ch" "C2249BBE5E8761C943A0CFA1B7B3914BF63ACD7C"))
(openssh-service #t)