From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp11.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 qHfRIjhetGMicwEAbAwnHQ (envelope-from ) for ; Tue, 03 Jan 2023 17:56:24 +0100 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp11.migadu.com with LMTPS id eHPTIjhetGNCqAAA9RJhRA (envelope-from ) for ; Tue, 03 Jan 2023 17:56:24 +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 1273013212 for ; Tue, 3 Jan 2023 17:56:23 +0100 (CET) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pCka6-0006p0-4e; Tue, 03 Jan 2023 11:56:06 -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 1pCka4-0006mx-Kh for guix-patches@gnu.org; Tue, 03 Jan 2023 11:56:04 -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 1pCka2-0008PZ-Ar for guix-patches@gnu.org; Tue, 03 Jan 2023 11:56:02 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1pCka2-00030p-5g for guix-patches@gnu.org; Tue, 03 Jan 2023 11:56:02 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#60521] [PATCH] home: Add home-stow-migration-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: Tue, 03 Jan 2023 16:56: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: patch To: 60521@debbugs.gnu.org Cc: Giacomo Leidi Received: via spool by 60521-submit@debbugs.gnu.org id=B60521.167276495511565 (code B ref 60521); Tue, 03 Jan 2023 16:56:02 +0000 Received: (at 60521) by debbugs.gnu.org; 3 Jan 2023 16:55:55 +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 1pCkZs-00030N-6a for submit@debbugs.gnu.org; Tue, 03 Jan 2023 11:55:55 -0500 Received: from confino.investici.org ([93.190.126.19]:54129) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pCkZm-000307-Uw for 60521@debbugs.gnu.org; Tue, 03 Jan 2023 11:55:50 -0500 Received: from mx1.investici.org (unknown [127.0.0.1]) by confino.investici.org (Postfix) with ESMTP id 4Nmf4c3rbnz10yL; Tue, 3 Jan 2023 16:55:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=autistici.org; s=stigmate; t=1672764944; bh=HHRTYOzSXHLJC7/hgUx0v90tti1vOShXOSOCdg+wPAo=; h=From:To:Cc:Subject:Date:From; b=rxxufMmBGAuU1OujTDcGZtP0IQ17dTgqkKuCOfWVVCAXOJg0NbnEWAisDb+I2cSOr M66p4wTE/RjRh3ZvBiMTOICG/RkFBcacCPsg21To2AsYPnzISi/vQQeMwhEKIqd7lR 3/7wSntKej7V6YBykQhGzNG2V8RGthNLYL5AkUY4= Received: from [93.190.126.19] (mx1.investici.org [93.190.126.19]) (Authenticated sender: goodoldpaul@autistici.org) by localhost (Postfix) with ESMTPSA id 4Nmf4c3HDQz10nn; Tue, 3 Jan 2023 16:55:44 +0000 (UTC) Date: Tue, 3 Jan 2023 17:55:34 +0100 Message-Id: <20230103165534.25644-1-goodoldpaul@autistici.org> X-Mailer: git-send-email 2.38.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-Country: US X-Migadu-Flow: FLOW_IN ARC-Seal: i=1; s=key1; d=yhetil.org; t=1672764984; a=rsa-sha256; cv=none; b=RKESuxHVDHIBCItK/mxui1UFAGNIKJKqFqzl/SYa4w5d49k74fVvbuCgp4RYTi6W7Pq7sF i9lQ82O3LCYYhZCq6UPOmXHBiPqxhHfvegSpygtYTQ9eAJ3vXdYoEZauejxSnThA6dSxeM sfZ/3B7K9pLbF9uxC1NoDEw7cyDGHDIsiuob5SzMynHFMpBa7fO2m6j/6ZOTfutongsRa8 M4X1SfxE6VlcIunjoCQb+8468SxtWhSAdxP4W5KkQwEgvvXd67/Rbffsvg5WYHTIRt597b GxOiUDl7iK82Ys0NhSnOKvEBybDGBwHzU4Ud9A0dVpps4MywoWY9w0iUd7nsnw== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=autistici.org header.s=stigmate header.b=rxxufMmB; 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=1672764984; 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=HHRTYOzSXHLJC7/hgUx0v90tti1vOShXOSOCdg+wPAo=; b=GJsb3a56Fw2JaYKQ+sp075fmc2CY+mF52n3awihkXm7gIx/G0O8Id6ne8dp/aWYqvlFyJA 7adNVjVeO486eW4p156rHTrT/nK6TsNMu3pxnRuxEzX9bESr/2MrAcEYUmzu+dMF7AaCMk Z3K38Kg4Jn4UNY7U+BouybMEy2Zx097KIhy1S5rSRRkAb3UPzpEnymV8JugASC2g4ZL+do zhNHQZdhWcTihc8KitMB0ZzNHu6gahgCj+QgUxOAtB/8VhucKNwPwqizUEqqZH98U0S4e7 OqSWMHxXHDryS9wyhGerj1FNNqyE4XyXjOnboglD2vY3tQA0n/fe5m+8Acw5cA== X-Spam-Score: -4.66 X-Migadu-Queue-Id: 1273013212 Authentication-Results: aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=autistici.org header.s=stigmate header.b=rxxufMmB; 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-Migadu-Scanner: scn0.migadu.com X-Migadu-Spam-Score: -4.66 X-TUID: JQTxB24wRzfu * gnu/home/services.scm (dotfiles-for-app): New variable; (home-stow-migration-configuration): new variable; (home-stow-migration-service): new variable. * doc/guix.texi: Document it. --- doc/guix.texi | 50 +++++++++++++++++++++++++++++++++++++++++++ gnu/home/services.scm | 49 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) diff --git a/doc/guix.texi b/doc/guix.texi index 5c85680831..40c36f65c4 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -109,6 +109,7 @@ Copyright @copyright{} 2022 Reily Siegel@* Copyright @copyright{} 2022 Simon Streit@* Copyright @copyright{} 2022 (@* Copyright @copyright{} 2022 John Kehayias@* +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 @@ -41119,6 +41120,55 @@ to use alternative services to implement more advanced use cases like read-only home. Feel free to experiment and share your results. @end defvr +@deffn {Scheme Procedure} home-stow-migration-service +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 GNU Stow users. This service allows users to point Guix Home to +their Stow 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. + +A typical Stow setup consists of a source directory and a target directory. +The source directory must 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 +│ └── .gitignore +├── nix +│ ├── .config +│ │ └── nixpkgs +│ │ └── config.nix +│ └── .nix-channels +├── tmux +│ └── .tmux.conf +└── vim + └── .vimrc + +13 directories, 10 files +@end example + +A suitable configuration would then be: + +@lisp + (home-stow-migration-service + (string-append (getenv "HOME") + "/.dotfiles")) +@end lisp +@end deffn + @defvr {Scheme Variable} 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 99035686f1..996647c592 100644 --- a/gnu/home/services.scm +++ b/gnu/home/services.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2021 Andrew Tropin ;;; Copyright © 2021 Xinglu Chen +;;; Copyright © 2023 Giacomo Leidi ;;; ;;; This file is part of GNU Guix. ;;; @@ -21,6 +22,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) @@ -33,13 +35,16 @@ (define-module (gnu home services) #:use-module (guix i18n) #:use-module (guix modules) #:use-module (srfi srfi-1) + #: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-stow-migration-service home-xdg-configuration-files-service-type home-xdg-data-files-service-type home-run-on-first-login-service-type @@ -49,6 +54,7 @@ (define-module (gnu home services) environment-variable-shell-definitions home-files-directory + home-stow-migration-configuration xdg-configuration-files-directory xdg-data-files-directory @@ -315,6 +321,49 @@ (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 app-dir) + "Return a list of objects compatible with @{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 APP-DIR and mapping its contents to the +user's home directory." + (let ((app-absolute-path (canonicalize-path app-dir))) + (map (lambda (path) + (let ((app-file-relative-path + (string-replace-substring path + (string-append app-absolute-path "/") + ""))) + (list app-file-relative-path + (local-file path + (string-append "home-stow-migration-" + (string-replace-substring + app-file-relative-path + "/" "-")))))) + (find-files app-absolute-path)))) + +(define (home-stow-migration-configuration stow-dir) + "Return a list of objects compatible with @{home-files-service-type}'s +value, generated following GNU Stow's algorithm using STOW-DIR as input +directory." + (define (dir-contents dir) + (scandir dir + (lambda (name) + (not (member name '("." "..")))))) + (fold append + '() + (map (lambda (app-dir) + (dotfiles-for-app + (string-append stow-dir "/" app-dir))) + (dir-contents stow-dir)))) + +(define-public (home-stow-migration-service stow-dir) + "Return a service extending @{home-files-service-type} with files from +STOW-DIR. Files will be put in the user's home directory following GNU +Stow's algorithm, and further processed during activation." + (simple-service 'home-stow-migration-service + home-files-service-type + (home-stow-migration-configuration stow-dir))) + (define xdg-configuration-files-directory ".config") (define (xdg-configuration-files files) base-commit: 473692b812b4ab4267d9bddad0fb27787d2112ff -- 2.38.1