From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp10.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms5.migadu.com with LMTPS id MDHzCtwj6WMxAAAAbAwnHQ (envelope-from ) for ; Sun, 12 Feb 2023 18:37:32 +0100 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp10.migadu.com with LMTPS id cJ7sCdwj6WNzZAAAG6o9tA (envelope-from ) for ; Sun, 12 Feb 2023 18:37:32 +0100 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id CDED1E099 for ; Sun, 12 Feb 2023 18:37:31 +0100 (CET) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pRGHh-00028H-GO; Sun, 12 Feb 2023 12:37:05 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pRGHf-00025N-I2 for guix-patches@gnu.org; Sun, 12 Feb 2023 12:37:03 -0500 Received: from debbugs.gnu.org ([209.51.188.43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pRGHe-0007R5-U3 for guix-patches@gnu.org; Sun, 12 Feb 2023 12:37:02 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1pRGHe-0002kl-Pv for guix-patches@gnu.org; Sun, 12 Feb 2023 12:37:02 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#60521] [v2] home: Add home-dotfiles-service. References: <0a8d7bce31856292baa06a08260494c0@autistici.org> In-Reply-To: <0a8d7bce31856292baa06a08260494c0@autistici.org> Resent-From: Giacomo Leidi Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sun, 12 Feb 2023 17:37:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 60521 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: moreinfo patch To: 60521@debbugs.gnu.org Cc: Giacomo Leidi Received: via spool by 60521-submit@debbugs.gnu.org id=B60521.167622341710563 (code B ref 60521); Sun, 12 Feb 2023 17:37:02 +0000 Received: (at 60521) by debbugs.gnu.org; 12 Feb 2023 17:36:57 +0000 Received: from localhost ([127.0.0.1]:46579 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pRGHY-0002kJ-P5 for submit@debbugs.gnu.org; Sun, 12 Feb 2023 12:36:57 -0500 Received: from confino.investici.org ([93.190.126.19]:30931) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pRGHW-0002k9-N2 for 60521@debbugs.gnu.org; Sun, 12 Feb 2023 12:36:55 -0500 Received: from mx1.investici.org (unknown [127.0.0.1]) by confino.investici.org (Postfix) with ESMTP id 4PFF5c6Rz3z113v; Sun, 12 Feb 2023 17:36:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=autistici.org; s=stigmate; t=1676223412; bh=pjFLRUJxeST84XDtguyufI547qrQWVMshaZR6ULOKN0=; h=From:To:Cc:Subject:Date:From; b=g5WmcbgJ7SRZOrele3Sb/80IRcdF2CG3HG7Kox6/aFLEUYRml6f0/W4OWSbXQzHKr Gz6rfJCUUsQH8fOdXA7o3ldof+ew0g46x8ikgsafwNPm/mWup2mVICJvOBcwj23E14 ZDRzDJaERjRCNYSrx9ZUX5Gkf7agvj6AHXcV0Mqo= Received: from [93.190.126.19] (mx1.investici.org [93.190.126.19]) (Authenticated sender: goodoldpaul@autistici.org) by localhost (Postfix) with ESMTPSA id 4PFF5c5vfHz113q; Sun, 12 Feb 2023 17:36:52 +0000 (UTC) Date: Sun, 12 Feb 2023 18:36:40 +0100 Message-Id: <20230212173640.12008-1-goodoldpaul@autistici.org> X-Mailer: git-send-email 2.39.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: Giacomo Leidi X-ACL-Warn: , Giacomo Leidi via Guix-patches From: Giacomo Leidi via Guix-patches via Errors-To: guix-patches-bounces+larch=yhetil.org@gnu.org Sender: guix-patches-bounces+larch=yhetil.org@gnu.org X-Migadu-Flow: FLOW_IN X-Migadu-Country: US ARC-Seal: i=1; s=key1; d=yhetil.org; t=1676223451; a=rsa-sha256; cv=none; b=fm3bBG6EoEx3XR8Mwk4B7VDPSHoRWTkOBGDvvE1ub1iweDoB1xGOEHP4cHJcHe00kI3ryD wuvY+j4WNk+nso28TGa8UgwTKTn6fuhNaGv77Izf7FacYSjAvy5RW+UAy6U5wNrJfLTCT+ dhxXkaSoU5NKBNielwIH0heTTsJHsG4scVyX/6PZ7j2MCl+cylms77+TmFiGOHLu081gGt dDQJ7B/1Omc8qwTHI2qxZQkr0jSDQ0gyWU8zw6oK9LJIrFTjzO8M7/kLNNX0+KJAQFAqiw vuhhShxz/T2iEpNr3LInE0S81m/nm74/cWstLzsIHuz8lFtvLaDvdqyo1QSsRw== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=autistici.org header.s=stigmate header.b=g5WmcbgJ; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org"; dmarc=pass (policy=none) header.from=gnu.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1676223451; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding:resent-cc: resent-from:resent-sender:resent-message-id:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post:dkim-signature; bh=pjFLRUJxeST84XDtguyufI547qrQWVMshaZR6ULOKN0=; b=YuKBnB/GNtrweIjp/gWQ7FUOVgtsoLOGGY/QwYiF5ZW1VMf7AuDRflGjZQXu7PTH+3zlrP lYcs0tfRXuqHDD0++MtXGQs8CFZRCzcDrROqmQXNrLV2cnuMJAkb58pqy/yTe7qrozGp7V xBpk7rZ/mZFClshwu+WvJ+vxdCRluxCV+cW4i2vhEf4gRo4uHIbeXdoGrVirQkcewoAW7e KO6YOdZkdZV8eTjPNYpeUgPKoGkjHwox8O89TuCOAFRBbfFcrw16Mz6Fnj2uifh+BxtHzu rn04XeEwRJ1THXT30Bez9matXbQ9NHgNmHo2cz2DzocnTp5I6oubw3ouC0oHKg== X-Migadu-Spam-Score: -3.62 X-Spam-Score: -3.62 X-Migadu-Queue-Id: CDED1E099 X-Migadu-Scanner: scn1.migadu.com Authentication-Results: aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=autistici.org header.s=stigmate header.b=g5WmcbgJ; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org"; dmarc=pass (policy=none) header.from=gnu.org X-TUID: 1V6jef0BAtnu * gnu/home/services.scm (dotfiles-for-app): New variable; (home-dotfiles-configuration): new variable; (home-dotfiles-service-type): new variable. * doc/guix.texi: Document it. --- doc/guix.texi | 85 ++++++++++++++++++++++++++++++++++++++++++- gnu/home/services.scm | 54 +++++++++++++++++++++++++++ 2 files changed, 138 insertions(+), 1 deletion(-) diff --git a/doc/guix.texi b/doc/guix.texi index 44e2165a82..a6223d69eb 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -111,9 +111,9 @@ Copyright @copyright{} 2022 (@* Copyright @copyright{} 2022 John Kehayias@* Copyright @copyright{} 2022 Bruno Victal@* Copyright @copyright{} 2022 Ivan Vilata-i-Balaguer@* -Copyright @copyright{} 2023 Giacomo Leidi@* Copyright @copyright{} 2022 Antero Mejr@* Copyright @copyright{} 2023 Bruno Victal@* +Copyright @copyright{} 2023 Giacomo Leidi@* Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or @@ -41620,6 +41620,89 @@ to use alternative services to implement more advanced use cases like read-only home. Feel free to experiment and share your results. @end defvar +It is often the case that Guix Home users already have a setup for versioning +their user configuration files (also known as @emph{dotfiles}) in a single +directory, and some way of automatically deploy changes to their user home. + +The @code{home-dotfiles-service-type} is designed to ease the way into using +Guix Home for this kind of users, allowing them to point the service to their +dotfiles directory (which must follow +@uref{https://www.gnu.org/software/stow/, GNU Stow}'s layout) and have their +dotfiles automatically deployed to their user home, without migrating them to +Guix native configurations. + +The dotfiles directory layout is expected to be structured as follows: + +@example +~$ tree -a .dotfiles/ +.dotfiles/ +├── git +│ └── .gitconfig +├── gpg +│ └── .gnupg +│ ├── gpg-agent.conf +│ └── gpg.conf +├── guile +│ └── .guile +├── guix +│ └── .config +│ └── guix +│ └── channels.scm +├── nix +│ ├── .config +│ │ └── nixpkgs +│ │ └── config.nix +│ └── .nix-channels +├── tmux +│ └── .tmux.conf +└── vim + └── .vimrc + +13 directories, 10 files +@end example + +For a more formal specification please refer to the +@pxref{Top,,, stow, GNU Stow Manual}. It is advisable to keep your dotfiles +directories under version control, for example in the same repository where +you'd track your Guix Home configuration. A suitable configuration would then +be: + +@lisp + (simple-service 'home-dotfiles + home-dotfiles-service-type + (list (string-append (getcwd) + "/.dotfiles"))) +@end lisp + +The expected home directory state would be: + +@example +. +├── .config +│ ├── guix +│ │ └── channels.scm +│ └── nixpkgs +│ └── config.nix +├── .gitconfig +├── .gnupg +│ ├── gpg-agent.conf +│ └── gpg.conf +├── .guile +├── .nix-channels +├── .tmux.conf +└── .vimrc +@end example + +@defvar home-dotfiles-service-type +Return a service which is very similiar to @code{home-files-service-type} +(and actually extends it), but designed to ease the way into using Guix +Home for users that already track their dotfiles under some kind of version +control. This service allows users to point Guix Home to their dotfiles +directory and have their file automatically deployed to their home directory +just like Stow would, without migrating all of their dotfiles to Guix native +configurations. +@end defvar + @defvar home-xdg-configuration-files-service-type The service is very similiar to @code{home-files-service-type} (and actually extends it), but used for defining files, which will go to diff --git a/gnu/home/services.scm b/gnu/home/services.scm index b17a34d19d..c45b8cbe24 100644 --- a/gnu/home/services.scm +++ b/gnu/home/services.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2021-2023 Andrew Tropin ;;; Copyright © 2021 Xinglu Chen ;;; Copyright © 2022-2023 Ludovic Courtès +;;; Copyright © 2023 Giacomo Leidi ;;; ;;; This file is part of GNU Guix. ;;; @@ -22,6 +23,7 @@ (define-module (gnu home services) #:use-module (gnu services) #:use-module ((gnu packages package-management) #:select (guix)) #:use-module ((gnu packages base) #:select (coreutils)) + #:use-module (guix build utils) #:use-module (guix channels) #:use-module (guix monads) #:use-module (guix store) @@ -35,13 +37,17 @@ (define-module (gnu home services) #:use-module (guix modules) #:use-module (srfi srfi-1) #:use-module (srfi srfi-9) + #:use-module (ice-9 ftw) #:use-module (ice-9 match) + #:use-module (ice-9 string-fun) #:use-module (ice-9 vlist) #:export (home-service-type home-profile-service-type home-environment-variables-service-type home-files-service-type + home-dotfiles-service-type + home-dotfiles-configuration home-xdg-configuration-files-service-type home-xdg-data-files-service-type home-run-on-first-login-service-type @@ -341,6 +347,54 @@ (define home-files-service-type (description "Files that will be put in @file{~/.guix-home/files}, and further processed during activation."))) +(define (dotfiles-for-app directory) + "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." + (map (lambda (file) + (let ((file-relative-path + (string-drop file (1+ (string-length directory))))) + (list file-relative-path + (local-file file + (string-append "home-dotfiles-" + (string-replace-substring + file-relative-path + "/" "-")))))) + (find-files directory))) + +(define-public (home-dotfiles-configuration dotfiles-directories) + "Return a list of objects compatible with @code{home-files-service-type}'s +value, generated following GNU Stow's algorithm for each of the +DOTFILES-DIRECTORIES." + (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 + dotfiles-for-app + (directory-contents dotfiles-directories))) + +(define-public home-dotfiles-service-type + (service-type (name 'home-dotfiles) + (extensions + (list (service-extension home-files-service-type + home-dotfiles-configuration))) + (default-value '()) + (extend append) + (compose concatenate) + (description "Files contained is these directories will be put +in the user's home directory according to GNU Stow's algorithm, and further +processed during activation."))) + (define xdg-configuration-files-directory ".config") (define (xdg-configuration-files files) base-commit: 2b1383c0a2f79117103b142440c64f6a751d545d -- 2.39.1