mbox series

[bug#50296,0/2] Add 'guix home' command.

Message ID 874kb6j718.fsf@trop.in
Headers show
Series Add 'guix home' command. | expand

Message

Andrew Tropin Aug. 31, 2021, 9:28 a.m. UTC
Command and subbcommands allowing to manage home environment with guix.

Andrew Tropin (2):
  scripts: Add 'guix home'.
  scripts: home: Add import subcommand.

 Makefile.am                  |   3 +
 guix/scripts/home.scm        | 512 +++++++++++++++++++++++++++++++++++
 guix/scripts/home/import.scm | 241 +++++++++++++++++
 3 files changed, 756 insertions(+)
 create mode 100644 guix/scripts/home.scm
 create mode 100644 guix/scripts/home/import.scm

Comments

Simon Tournier Aug. 31, 2021, 10:46 a.m. UTC | #1
Hi Andrew,

On Tue, 31 Aug 2021 at 12:28, Andrew Tropin <andrew@trop.in> wrote:
> Command and subbcommands allowing to manage home environment with guix.
>
> Andrew Tropin (2):
>   scripts: Add 'guix home'.
>   scripts: home: Add import subcommand.

Raghav recently asked [1] an interesting question about consistency of
command line commands, i.e., compare for instance:

  guix system roll-back
  guix pull --roll-back
  guix package --roll-back

I do not have an opinion but is it a conscientious or discussed choice
for subcommands? 


All the best,
simon


1: <https://yhetil.org/guix/fdb27bc6-875e-d0e7-8d8e-4c21331b06c4@raghavgururajan.name>
Oleg Pykhalov Aug. 31, 2021, 11:13 a.m. UTC | #2
Hi Andrew,

Andrew Tropin <andrew@trop.in> writes:

> Command and subbcommands allowing to manage home environment with guix.
>
> Andrew Tropin (2):
>   scripts: Add 'guix home'.
>   scripts: home: Add import subcommand.
>
>  Makefile.am                  |   3 +
>  guix/scripts/home.scm        | 512 +++++++++++++++++++++++++++++++++++
>  guix/scripts/home/import.scm | 241 +++++++++++++++++
>  3 files changed, 756 insertions(+)
>  create mode 100644 guix/scripts/home.scm
>  create mode 100644 guix/scripts/home/import.scm

I applied your patches and also fixed a typo in
gnu/home-services/xdg.scm file, which I noticed during Geiser entering
(guix scripts home) module about missing ‘home-services-utils’, which
should be ‘home-services utils’.

Pushed to wip-guix-home.

Also, I tried to use guix home for the first time as documented at site
[1], and got an error:
--8<---------------cut here---------------start------------->8---
(string-append #f "/" "profile/share/fonts")
In procedure string-append: Wrong type (expecting string): #f
--8<---------------cut here---------------end--------------->8---

[1] https://guix-home.trop.in/Declaring-the-Home-Environment.html


The following text in the message is only about the error.

oleg@guixsd ~/src/guix-wip-guix-home$ mkdir /tmp/guix

oleg@guixsd ~/src/guix-wip-guix-home$ guix pull --url=file:///home/oleg/src/guix-wip-guix-home --branch=wip-guix-home -p /tmp/guix/guix

~/.local/share/chezmoi/dotfiles/guixsd/home.scm:
--8<---------------cut here---------------start------------->8---
(use-modules (gnu home)
	     (gnu home-services)
	     ;; (gnu home-services ssh)
	     (gnu home-services shells)
	     ;; (gnu home-services files)
	     (gnu services)
	     (gnu packages admin)
             (guix gexp)

             (ice-9 rdelim))

(define %home
  (and=> (getenv "HOME")
         (lambda (home)
           home)))

(define .bash_profile
  (string-append %home "/.local/share/chezmoi/dot_bash_profile"))

(home-environment

 ;; (packages (list htop))

 (services
  (list

   (service home-bash-service-type
            (home-bash-configuration
             (guix-defaults? #t)
             (bash-profile
              (list
               (with-input-from-file .bash_profile read-string)))))

   ;; XXX: missing home-files-service-type
   ;; (simple-service 'test-config
   ;;                 home-files-service-type
   ;;                 (list `("config/test.conf"
   ;;                         ,(plain-file "tmp-file.txt"
   ;;                                      "the content of ~/.config/test.conf"))))
   
   ;; XXX: missing home-ssh-configuration
   ;; (service home-ssh-service-type
   ;;          (home-ssh-configuration
   ;;           (extra-config
   ;;            (list
   ;;             (ssh-host "savannah"
   ;;      		 '((compression . #f)))))))

   )))
--8<---------------cut here---------------end--------------->8---

My first guix home reconfigure launch:
--8<---------------cut here---------------start------------->8---
oleg@guixsd ~/src/guix-wip-guix-home$ /tmp/guix/guix/bin/guix home reconfigure ~/.local/share/chezmoi/dotfiles/guixsd/home.scm
/gnu/store/xl4igqm0jjy7gfbganz9061ivdgzfpdk-home
New symlinks to home-environment will be created soon.
All conflicting files will go to /home/oleg/1630407324-guix-home-legacy-configs-backup.

Skipping   /home/oleg/.config (directory already exists)... done
Creating   /home/oleg/.config/fontconfig... done
Symlinking /home/oleg/.config/fontconfig/fonts.conf -> /gnu/store/phj2z2iiqdhryfy7mqral0b9qz3hlva6-fonts.conf... done
Backing up /home/oleg/.bashrc... done
Symlinking /home/oleg/.bashrc -> /gnu/store/513j2xkszmcmv7fiawh59mr0i1fmin55-bashrc... done
Symlinking /home/oleg/.profile -> /gnu/store/fxbppk3pqzdi3zzy0xl5vg1ir6c5jzq5-shell-profile... done
Backing up /home/oleg/.bash_profile... done
Symlinking /home/oleg/.bash_profile -> /gnu/store/2c3yva8vj5ikb0gspmjvzw0r9g9i1cxc-bash_profile... done
 done
Finished updating symlinks.

Backtrace:
In guix/ui.scm:
   2185:7 19 (run-guix . _)
  2148:10 18 (run-guix-command _ . _)
In ice-9/boot-9.scm:
  1752:10 17 (with-exception-handler _ _ #:unwind? _ # _)
In guix/status.scm:
    820:3 16 (_)
    800:4 15 (call-with-status-report _ _)
In guix/scripts/home.scm:
    214:4 14 (_)
In ice-9/boot-9.scm:
  1752:10 13 (with-exception-handler _ _ #:unwind? _ # _)
In guix/store.scm:
   658:37 12 (thunk)
   1320:8 11 (call-with-build-handler _ _)
   1320:8 10 (call-with-build-handler #<procedure 7f5d757319c0 at g…> …)
  2108:24  9 (run-with-store #<store-connection 256.99 7f5d77fb3550> …)
In guix/scripts/home.scm:
   169:15  8 (_ _)
In unknown file:
           7 (primitive-load "/gnu/store/xl4igqm0jjy7gfbganz9061ivdg…")
In ice-9/eval.scm:
    619:8  6 (_ #(#(#(#(#(#(#(#(#(#(#<…> …) …) …) …) …) …) …) …) …) …))
   626:19  5 (_ #(#(#(#(#(#(#(#(#(#(#<…> …) …) …) …) …) …) …) …) …) …))
In srfi/srfi-1.scm:
   586:17  4 (map1 (("profile/share/fonts" (system* "/gnu/stor…" …))))
In ice-9/eval.scm:
   293:34  3 (_ #(#(#<directory (guile-user) 7f5d87ca3c80> #<va…>) #))
In unknown file:
           2 (string-append #f "/" "profile/share/fonts")
In ice-9/boot-9.scm:
  1685:16  1 (raise-exception _ #:continuable? _)
  1685:16  0 (raise-exception _ #:continuable? _)

ice-9/boot-9.scm:1685:16: In procedure raise-exception:
In procedure string-append: Wrong type (expecting string): #f
--8<---------------cut here---------------end--------------->8---

I skipped the error and tried to configure Bash more:
--8<---------------cut here---------------start------------->8---
(define .bashrc
  (string-append %home "/.local/share/chezmoi/dot_bashrc"))

;; ...

            (home-bash-configuration
             ;; ...
             (bashrc
              (list
               (with-input-from-file .bashrc read-string))))
--8<---------------cut here---------------end--------------->8---

Another launch, no errors this time:
--8<---------------cut here---------------start------------->8---
oleg@guixsd ~/src/guix-wip-guix-home$ /tmp/guix/guix/bin/guix home reconfigure ~/.local/share/chezmoi/dotfiles/guixsd/home.scm
substitute: updating substitutes from 'https://ci.guix.gnu.org'... 100.0%
substitute: updating substitutes from 'https://bordeaux.guix.gnu.org'... 100.0%
The following derivations will be built:
   /gnu/store/fn1hzpyic1k32pamyf45vwa0x3lw046g-home.drv
   /gnu/store/akdwz30lx0widqvyqmnkya45cb78f74d-files.drv
   /gnu/store/xcvi7n1l0fvsm099x2vyg6xci0qkayzp-bashrc.drv
   /gnu/store/pm1gw2xakkqj0zxsbbq0jnwgv3v95ajj-provenance.drv
building /gnu/store/pm1gw2xakkqj0zxsbbq0jnwgv3v95ajj-provenance.drv...
successfully built /gnu/store/pm1gw2xakkqj0zxsbbq0jnwgv3v95ajj-provenance.drv
building /gnu/store/xcvi7n1l0fvsm099x2vyg6xci0qkayzp-bashrc.drv...
successfully built /gnu/store/xcvi7n1l0fvsm099x2vyg6xci0qkayzp-bashrc.drv
building /gnu/store/akdwz30lx0widqvyqmnkya45cb78f74d-files.drv...
successfully built /gnu/store/akdwz30lx0widqvyqmnkya45cb78f74d-files.drv
building /gnu/store/fn1hzpyic1k32pamyf45vwa0x3lw046g-home.drv...
successfully built /gnu/store/fn1hzpyic1k32pamyf45vwa0x3lw046g-home.drv
/gnu/store/1y84hzz1m1c3jw03n2g8hn9wwyxngab3-home
Cleaning up symlinks from previous home-environment.

Removing /home/oleg/.config/fontconfig/fonts.conf... done
Removing /home/oleg/.config/fontconfig... done
Skipping /home/oleg/.config (not an empty directory)... done
Removing /home/oleg/.bashrc... done
Removing /home/oleg/.profile... done
Removing /home/oleg/.bash_profile... done
Cleanup finished.

New symlinks to home-environment will be created soon.
All conflicting files will go to /home/oleg/1630407412-guix-home-legacy-configs-backup.

Skipping   /home/oleg/.config (directory already exists)... done
Creating   /home/oleg/.config/fontconfig... done
Symlinking /home/oleg/.config/fontconfig/fonts.conf -> /gnu/store/phj2z2iiqdhryfy7mqral0b9qz3hlva6-fonts.conf... done
Symlinking /home/oleg/.bashrc -> /gnu/store/lf51wflmvx91m2jx8hx3j34qs9x1k153-bashrc... done
Symlinking /home/oleg/.profile -> /gnu/store/fxbppk3pqzdi3zzy0xl5vg1ir6c5jzq5-shell-profile... done
Symlinking /home/oleg/.bash_profile -> /gnu/store/2c3yva8vj5ikb0gspmjvzw0r9g9i1cxc-bash_profile... done
 done
Finished updating symlinks.

Comparing /gnu/store/xl4igqm0jjy7gfbganz9061ivdgzfpdk-home/profile/share/fonts and
          /gnu/store/1y84hzz1m1c3jw03n2g8hn9wwyxngab3-home/profile/share/fonts... done (same)
Evaling on-change gexps.

On-change gexps evaluation finished.
--8<---------------cut here---------------end--------------->8---

Oleg.
Andrew Tropin Aug. 31, 2021, 11:46 a.m. UTC | #3
On 2021-08-31 14:13, Oleg Pykhalov wrote:

> Hi Andrew,
>
> Andrew Tropin <andrew@trop.in> writes:
>
>> Command and subbcommands allowing to manage home environment with guix.
>>
>> Andrew Tropin (2):
>>   scripts: Add 'guix home'.
>>   scripts: home: Add import subcommand.
>>
>>  Makefile.am                  |   3 +
>>  guix/scripts/home.scm        | 512 +++++++++++++++++++++++++++++++++++
>>  guix/scripts/home/import.scm | 241 +++++++++++++++++
>>  3 files changed, 756 insertions(+)
>>  create mode 100644 guix/scripts/home.scm
>>  create mode 100644 guix/scripts/home/import.scm
>
> I applied your patches and also fixed a typo in
> gnu/home-services/xdg.scm file, which I noticed during Geiser entering
> (guix scripts home) module about missing ‘home-services-utils’, which
> should be ‘home-services utils’.
>

In rde we have home-services-utils, during recent refactoring I took
parts of it and split into home-services utils and home-services
configure modules.  For some reason I missed that xdg still uses it and
I didn't get rid of this import, I'll update xdg module and send patches
for it, thank you for noticing the issue.

> 
> Pushed to wip-guix-home.
>
> Also, I tried to use guix home for the first time as documented at site
> [1], and got an error:
> --8<---------------cut here---------------start------------->8---
> (string-append #f "/" "profile/share/fonts")
> In procedure string-append: Wrong type (expecting string): #f
> --8<---------------cut here---------------end--------------->8---
>
> [1] https://guix-home.trop.in/Declaring-the-Home-Environment.html
>
>
> The following text in the message is only about the error.
>
> oleg@guixsd ~/src/guix-wip-guix-home$ mkdir /tmp/guix
>
> oleg@guixsd ~/src/guix-wip-guix-home$ guix pull --url=file:///home/oleg/src/guix-wip-guix-home --branch=wip-guix-home -p /tmp/guix/guix
>
> ~/.local/share/chezmoi/dotfiles/guixsd/home.scm:
> --8<---------------cut here---------------start------------->8---
> (use-modules (gnu home)
> 	     (gnu home-services)
> 	     ;; (gnu home-services ssh)
> 	     (gnu home-services shells)
> 	     ;; (gnu home-services files)
> 	     (gnu services)
> 	     (gnu packages admin)
>              (guix gexp)
>
>              (ice-9 rdelim))
>
> (define %home
>   (and=> (getenv "HOME")
>          (lambda (home)
>            home)))
>
> (define .bash_profile
>   (string-append %home "/.local/share/chezmoi/dot_bash_profile"))
>
> (home-environment
>
>  ;; (packages (list htop))
>
>  (services
>   (list
>
>    (service home-bash-service-type
>             (home-bash-configuration
>              (guix-defaults? #t)
>              (bash-profile
>               (list
>                (with-input-from-file .bash_profile read-string)))))
>
>    ;; XXX: missing home-files-service-type
>    ;; (simple-service 'test-config
>    ;;                 home-files-service-type
>    ;;                 (list `("config/test.conf"
>    ;;                         ,(plain-file "tmp-file.txt"
>    ;;                                      "the content of ~/.config/test.conf"))))
>    
>    ;; XXX: missing home-ssh-configuration
>    ;; (service home-ssh-service-type
>    ;;          (home-ssh-configuration
>    ;;           (extra-config
>    ;;            (list
>    ;;             (ssh-host "savannah"
>    ;;      		 '((compression . #f)))))))
>
>    )))
> --8<---------------cut here---------------end--------------->8---
>
> My first guix home reconfigure launch:
> --8<---------------cut here---------------start------------->8---
> oleg@guixsd ~/src/guix-wip-guix-home$ /tmp/guix/guix/bin/guix home reconfigure ~/.local/share/chezmoi/dotfiles/guixsd/home.scm
> /gnu/store/xl4igqm0jjy7gfbganz9061ivdgzfpdk-home
> New symlinks to home-environment will be created soon.
> All conflicting files will go to /home/oleg/1630407324-guix-home-legacy-configs-backup.
>
> Skipping   /home/oleg/.config (directory already exists)... done
> Creating   /home/oleg/.config/fontconfig... done
> Symlinking /home/oleg/.config/fontconfig/fonts.conf -> /gnu/store/phj2z2iiqdhryfy7mqral0b9qz3hlva6-fonts.conf... done
> Backing up /home/oleg/.bashrc... done
> Symlinking /home/oleg/.bashrc -> /gnu/store/513j2xkszmcmv7fiawh59mr0i1fmin55-bashrc... done
> Symlinking /home/oleg/.profile -> /gnu/store/fxbppk3pqzdi3zzy0xl5vg1ir6c5jzq5-shell-profile... done
> Backing up /home/oleg/.bash_profile... done
> Symlinking /home/oleg/.bash_profile -> /gnu/store/2c3yva8vj5ikb0gspmjvzw0r9g9i1cxc-bash_profile... done
>  done
> Finished updating symlinks.
>
> Backtrace:
> In guix/ui.scm:
>    2185:7 19 (run-guix . _)
>   2148:10 18 (run-guix-command _ . _)
> In ice-9/boot-9.scm:
>   1752:10 17 (with-exception-handler _ _ #:unwind? _ # _)
> In guix/status.scm:
>     820:3 16 (_)
>     800:4 15 (call-with-status-report _ _)
> In guix/scripts/home.scm:
>     214:4 14 (_)
> In ice-9/boot-9.scm:
>   1752:10 13 (with-exception-handler _ _ #:unwind? _ # _)
> In guix/store.scm:
>    658:37 12 (thunk)
>    1320:8 11 (call-with-build-handler _ _)
>    1320:8 10 (call-with-build-handler #<procedure 7f5d757319c0 at g…> …)
>   2108:24  9 (run-with-store #<store-connection 256.99 7f5d77fb3550> …)
> In guix/scripts/home.scm:
>    169:15  8 (_ _)
> In unknown file:
>            7 (primitive-load "/gnu/store/xl4igqm0jjy7gfbganz9061ivdg…")
> In ice-9/eval.scm:
>     619:8  6 (_ #(#(#(#(#(#(#(#(#(#(#<…> …) …) …) …) …) …) …) …) …) …))
>    626:19  5 (_ #(#(#(#(#(#(#(#(#(#(#<…> …) …) …) …) …) …) …) …) …) …))
> In srfi/srfi-1.scm:
>    586:17  4 (map1 (("profile/share/fonts" (system* "/gnu/stor…" …))))
> In ice-9/eval.scm:
>    293:34  3 (_ #(#(#<directory (guile-user) 7f5d87ca3c80> #<va…>) #))
> In unknown file:
>            2 (string-append #f "/" "profile/share/fonts")
> In ice-9/boot-9.scm:
>   1685:16  1 (raise-exception _ #:continuable? _)
>   1685:16  0 (raise-exception _ #:continuable? _)
>
> ice-9/boot-9.scm:1685:16: In procedure raise-exception:
> In procedure string-append: Wrong type (expecting string): #f

run-on-change service doesn't handle the case, where the previous
generation doesn't exists.  Fix should be pretty simple, will send a
patch once it done.  Thank you for catching this)

> --8<---------------cut here---------------end--------------->8---
>
> I skipped the error and tried to configure Bash more:
> --8<---------------cut here---------------start------------->8---
> (define .bashrc
>   (string-append %home "/.local/share/chezmoi/dot_bashrc"))
>
> ;; ...
>
>             (home-bash-configuration
>              ;; ...
>              (bashrc
>               (list
>                (with-input-from-file .bashrc read-string))))
> --8<---------------cut here---------------end--------------->8---
>
> Another launch, no errors this time:
> --8<---------------cut here---------------start------------->8---
> oleg@guixsd ~/src/guix-wip-guix-home$ /tmp/guix/guix/bin/guix home reconfigure ~/.local/share/chezmoi/dotfiles/guixsd/home.scm
> substitute: updating substitutes from 'https://ci.guix.gnu.org'... 100.0%
> substitute: updating substitutes from 'https://bordeaux.guix.gnu.org'... 100.0%
> The following derivations will be built:
>    /gnu/store/fn1hzpyic1k32pamyf45vwa0x3lw046g-home.drv
>    /gnu/store/akdwz30lx0widqvyqmnkya45cb78f74d-files.drv
>    /gnu/store/xcvi7n1l0fvsm099x2vyg6xci0qkayzp-bashrc.drv
>    /gnu/store/pm1gw2xakkqj0zxsbbq0jnwgv3v95ajj-provenance.drv
> building /gnu/store/pm1gw2xakkqj0zxsbbq0jnwgv3v95ajj-provenance.drv...
> successfully built /gnu/store/pm1gw2xakkqj0zxsbbq0jnwgv3v95ajj-provenance.drv
> building /gnu/store/xcvi7n1l0fvsm099x2vyg6xci0qkayzp-bashrc.drv...
> successfully built /gnu/store/xcvi7n1l0fvsm099x2vyg6xci0qkayzp-bashrc.drv
> building /gnu/store/akdwz30lx0widqvyqmnkya45cb78f74d-files.drv...
> successfully built /gnu/store/akdwz30lx0widqvyqmnkya45cb78f74d-files.drv
> building /gnu/store/fn1hzpyic1k32pamyf45vwa0x3lw046g-home.drv...
> successfully built /gnu/store/fn1hzpyic1k32pamyf45vwa0x3lw046g-home.drv
> /gnu/store/1y84hzz1m1c3jw03n2g8hn9wwyxngab3-home
> Cleaning up symlinks from previous home-environment.
>
> Removing /home/oleg/.config/fontconfig/fonts.conf... done
> Removing /home/oleg/.config/fontconfig... done
> Skipping /home/oleg/.config (not an empty directory)... done
> Removing /home/oleg/.bashrc... done
> Removing /home/oleg/.profile... done
> Removing /home/oleg/.bash_profile... done
> Cleanup finished.
>
> New symlinks to home-environment will be created soon.
> All conflicting files will go to /home/oleg/1630407412-guix-home-legacy-configs-backup.
>
> Skipping   /home/oleg/.config (directory already exists)... done
> Creating   /home/oleg/.config/fontconfig... done
> Symlinking /home/oleg/.config/fontconfig/fonts.conf -> /gnu/store/phj2z2iiqdhryfy7mqral0b9qz3hlva6-fonts.conf... done
> Symlinking /home/oleg/.bashrc -> /gnu/store/lf51wflmvx91m2jx8hx3j34qs9x1k153-bashrc... done
> Symlinking /home/oleg/.profile -> /gnu/store/fxbppk3pqzdi3zzy0xl5vg1ir6c5jzq5-shell-profile... done
> Symlinking /home/oleg/.bash_profile -> /gnu/store/2c3yva8vj5ikb0gspmjvzw0r9g9i1cxc-bash_profile... done
>  done
> Finished updating symlinks.
>
> Comparing /gnu/store/xl4igqm0jjy7gfbganz9061ivdgzfpdk-home/profile/share/fonts and
>           /gnu/store/1y84hzz1m1c3jw03n2g8hn9wwyxngab3-home/profile/share/fonts... done (same)
> Evaling on-change gexps.
>
> On-change gexps evaluation finished.
> --8<---------------cut here---------------end--------------->8---
>
> Oleg.
Andrew Tropin Aug. 31, 2021, 12:03 p.m. UTC | #4
On 2021-08-31 12:46, zimoun wrote:

> Hi Andrew,
>
> On Tue, 31 Aug 2021 at 12:28, Andrew Tropin <andrew@trop.in> wrote:
>> Command and subbcommands allowing to manage home environment with guix.
>>
>> Andrew Tropin (2):
>>   scripts: Add 'guix home'.
>>   scripts: home: Add import subcommand.
>
> Raghav recently asked [1] an interesting question about consistency of
> command line commands, i.e., compare for instance:
>
>   guix system roll-back
>   guix pull --roll-back
>   guix package --roll-back
>
> I do not have an opinion but is it a conscientious or discussed choice
> for subcommands? 
>

Yeah, I also mentioned this inconsistency, but I decided to stick to the
'guix system' approach and use subcommands.  I'm not sure, which one is
better, I would like to have pull, package and system to work the same
way, but it seems that such refactoring will berak people setups.
Anyway, I will be keeping the "compatibility" with 'guix system', so if
we decide to change its interface, 'guix home's interface will be
changed too.

>
>
> All the best,
> simon
>
>
> 1: <https://yhetil.org/guix/fdb27bc6-875e-d0e7-8d8e-4c21331b06c4@raghavgururajan.name>