all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Feng Shu <tumashu@163.com>
To: paul <goodoldpaul@autistici.org>
Cc: 60521@debbugs.gnu.org
Subject: [bug#60521] [60521] Add home-dotfiles-service-type - Rebased on master
Date: Wed, 24 Jan 2024 19:58:08 +0800	[thread overview]
Message-ID: <871qa7kkof.fsf@163.com> (raw)
In-Reply-To: <2882eccf-000b-3db4-b2da-2dcb5c68e8ff@autistici.org> (paul's message of "Sun, 21 Jan 2024 18:06:19 +0100")

paul <goodoldpaul@autistici.org> writes:

> Hello Feng Shu,
>
> Apologies for the delay. I fixed the bug you pointed out for symlinks and spaces in file names. Thank you for
> catching them!
>
> About templating I would suggest you to use mixed-text-file or computed file from (guix gexp) and pass them
> directly to them home-files-service-type. It is possible to use it together with home-dotfiles-service-type.

At the moment, I use the below code, seem to work well:


(service
      home-dotfiles-service-type
      (home-dotfiles-configuration
       (directories
        (list (string-append
               (current-source-directory)
               "/dotfiles")))
       (template-config
        '((".home-dotfiles-template"
           ("var1" . "hello")
           ("var2" . "world"))))))


----------------------------------------------------------


(define-module (gee home services)
  #:use-module (gnu home services)
  #:use-module (guix build utils)
  #:use-module (guix gexp)
  #:use-module (guix records)
  #:use-module (srfi srfi-1)
  #:use-module (ice-9 ftw)
  #:use-module (ice-9 regex)
  #:use-module (ice-9 string-fun)
  #:use-module (ice-9 textual-ports)

  #:export (home-dotfiles-service-type
            home-dotfiles-configuration
            home-dotfiles-configuration?
            home-dotfiles-configuration-directories
            home-dotfiles-configuration-excluded))

(define %home-dotfiles-excluded
  '(".*~"
    ".*\\.swp"
    "\\.git"
    "\\.gitignore"))

(define-record-type* <home-dotfiles-configuration>
  home-dotfiles-configuration make-home-dotfiles-configuration
  home-dotfiles-configuration?
  (directories       home-dotfiles-configuration-directories       ;list of strings
                     (default '()))
  (excluded          home-dotfiles-configuration-excluded          ;list of strings
                     (default %home-dotfiles-excluded))
  (template-config   home-dotfiles-configuration-template-config
                     (default '())))

(define* (import-dotfiles directory excluded template-config)
  "Return a list of objects compatible with @code{home-files-service-type}'s
value.  Each object is a pair where the first element is the relative path
of a file and the second is a gexp representing the file content.  Objects are
generated by recursively visiting DIRECTORY and mapping its contents to the
user's home directory, excluding files that match any of the patterns in EXCLUDED."
  (define filtered
    (find-files directory
                (lambda (file stat)
                  (not (string-match
                        (string-append
                         "^.*(" (string-join excluded "|") ")$") file)))))
  (define (strip file)
    (string-drop file (+ 1 (string-length directory))))
  (define (resolve file)
    (if (eq? 'symlink (stat:type (lstat file)))
        (let ((resolved (readlink file)))
          (with-directory-excursion (dirname file)
            (canonicalize-path resolved)))
        file))
  (define (format file)
    (let* ((without-spaces
            (string-replace-substring file " " "_"))
           (without-slashes-and-spaces
            (string-replace-substring without-spaces "/" "-")))
      (string-append "home-dotfiles-" without-slashes-and-spaces)))

  (map (lambda (file)
         (let* ((stripped (strip file))
                (template-vars (assoc-ref template-config stripped)))
           (list stripped
                 (if template-vars
                     (plain-file (format stripped)
                                 (template-generate (resolve file) template-vars))
                     (local-file (resolve file) (format stripped))))))
       filtered))

(define (template-generate template-file template-variables)
  (let ((string (call-with-input-file template-file get-string-all)))
    (map (lambda (x)
           (let ((var (string-append "{{{" (car x) "}}}"))
                 (value (cdr x)))
             (set! string (string-replace-substring string var value))))
         template-variables)
    string))

(define (home-dotfiles-configuration->files config)
  "Return a list of objects compatible with @code{home-files-service-type}'s
value, generated following GNU Stow's algorithm for each of the
directories in CONFIG, excluding files that match any of the patterns configured."
  (define (directory-contents directories)
    (append-map
     (lambda (directory)
       (map
        (lambda (content)
          (with-directory-excursion directory
            (canonicalize-path content)))
        (scandir directory
                 (lambda (name)
                   (not (member name '("." "..")))))))
     directories))
  (append-map
   (lambda (app)
     (import-dotfiles
      app
      (home-dotfiles-configuration-excluded config)
      (home-dotfiles-configuration-template-config config)))
   (directory-contents
    (home-dotfiles-configuration-directories config))))

(define-public home-dotfiles-service-type
  (service-type (name 'home-dotfiles)
                (extensions
                 (list (service-extension home-files-service-type
                                          home-dotfiles-configuration->files)))
                (default-value (home-dotfiles-configuration))
                (description "Files that will be put in the user's home directory
following GNU Stow's algorithm, and further processed during activation.")))




>
> giacomo

-- 





  parent reply	other threads:[~2024-01-24 11:59 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-03 16:51 [bug#60521] [PATCH] home: Add home-stow-migration-service goodoldpaul--- via Guix-patches via
2023-01-03 16:55 ` Giacomo Leidi via Guix-patches via
2023-01-17 13:09   ` Ludovic Courtès
2023-01-17 15:21     ` Andrew Tropin
2023-01-23 10:23       ` Ludovic Courtès
2023-01-25  6:32         ` Andrew Tropin
2023-01-17 17:09   ` Bruno Victal
2023-02-12 17:36 ` goodoldpaul--- via Guix-patches via
2023-04-12 20:31   ` goodoldpaul--- via Guix-patches via
2023-02-12 17:36 ` [bug#60521] [v2] home: Add home-dotfiles-service Giacomo Leidi via Guix-patches via
2023-04-12 20:32 ` [bug#60521] [v3] " Giacomo Leidi via Guix-patches via
2023-04-24 20:33   ` [bug#60521] [PATCH] home: Add home-stow-migration-service Ludovic Courtès
2023-06-24 15:47 ` paul via Guix-patches via
2023-08-26  9:34   ` goodoldpaul--- via Guix-patches via
2023-09-22 12:59     ` paul via Guix-patches via
2023-06-24 16:01 ` [bug#60521] [PATCH-v4] home: Add home-dotfiles-service Giacomo Leidi via Guix-patches via
2023-08-26  9:39 ` Giacomo Leidi via Guix-patches via
2023-09-22 13:01 ` [bug#60521] [PATCH] " Giacomo Leidi via Guix-patches via
2023-10-02  2:19 ` [bug#60521] Nicolas Odermatt-Lemay
2023-10-06 21:17 ` [bug#60521] [PATCH] home: Add home-dotfiles-service paul via Guix-patches via
2023-10-06 21:22 ` Giacomo Leidi via Guix-patches via
2023-10-29 12:58 ` [bug#60521] [60521] Add home-dotfiles-service-type - Rebased on master paul via Guix-patches via
2024-01-21 17:06   ` paul via Guix-patches via
2024-01-22  0:16     ` [bug#60521] " tumashu
2024-01-22  8:12       ` Giacomo via Guix-patches via
2024-01-22 12:36     ` [bug#60521] " Feng Shu
2024-01-22 16:45       ` paul via Guix-patches via
2024-01-23 12:14         ` Feng Shu
2024-01-24 11:58     ` Feng Shu [this message]
2024-01-26 17:47       ` paul via Guix-patches via
2024-01-27  2:54         ` Feng Shu
2024-01-21 17:07   ` paul via Guix-patches via
2023-10-29 12:59 ` [bug#60521] [PATCH v4] home: Add home-dotfiles-service Giacomo Leidi via Guix-patches via
2023-11-06  0:55 ` [bug#60521] [PATCH] home: Add home-stow-migration-service Feng Shu
2023-11-07  8:58 ` Feng Shu
2023-11-09  0:59 ` Feng Shu
2024-01-21 17:08 ` [bug#60521] [PATCH v5] home: Add home-dotfiles-service Giacomo Leidi via Guix-patches via
2024-01-26 17:48 ` [bug#60521] [PATCH v6] " Giacomo Leidi via Guix-patches via
2024-01-27 22:56   ` Ludovic Courtès
2024-01-28 15:36     ` paul via Guix-patches via
2024-01-27 20:21 ` [bug#60521] [PATCH] home: Add home-stow-migration-service Sergey Trofimov
2024-01-27 20:21 ` Sergey Trofimov
2024-01-29 13:20   ` Ludovic Courtès
2024-01-29 13:40     ` Sergey Trofimov
2024-01-29 14:23       ` Giacomo via Guix-patches via
2024-01-29 15:19         ` Sergey Trofimov
2024-01-29 16:09           ` Giacomo via Guix-patches via
2024-01-29 18:34             ` Sergey Trofimov
2024-02-07 22:17         ` [bug#60521] Dot file layout for ‘home-dotfiles-service’ Ludovic Courtès
2024-02-09  0:44           ` paul via Guix-patches via
2024-02-09  0:45             ` paul via Guix-patches via
2024-02-10 10:03             ` Ludovic Courtès
2024-02-10 10:47               ` Janneke Nieuwenhuizen
2024-01-29 16:10       ` [bug#60521] [PATCH] home: Add home-stow-migration-service Ludovic Courtès
2024-01-28 15:37 ` [bug#60521] [PATCH v7] home: Add home-dotfiles-service Giacomo Leidi via Guix-patches via
2024-01-28 21:02   ` bug#60521: " Ludovic Courtès
2024-01-28 21:14     ` [bug#60521] " paul via Guix-patches via
2024-01-28 21:22       ` paul via Guix-patches via

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=871qa7kkof.fsf@163.com \
    --to=tumashu@163.com \
    --cc=60521@debbugs.gnu.org \
    --cc=goodoldpaul@autistici.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.