unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
From: iyzsong@outlook.com
To: 54293@debbugs.gnu.org
Cc: 宋文武 <iyzsong@member.fsf.org>
Subject: [bug#54293] [PATCH v2] home: Add home-git-service-type.
Date: Sat, 12 Mar 2022 10:22:32 +0800	[thread overview]
Message-ID: <TYCP286MB18973CA5D0DD1447744E30FAA30D9@TYCP286MB1897.JPNP286.PROD.OUTLOOK.COM> (raw)
In-Reply-To: <TYCP286MB189799FE00EC37FC1D454CA2A3089@TYCP286MB1897.JPNP286.PROD.OUTLOOK.COM>

* gnu/home/services/git.scm: New file.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add it.
---
 gnu/home/services/git.scm | 214 ++++++++++++++++++++++++++++++++++++++
 gnu/local.mk              |   1 +
 2 files changed, 215 insertions(+)
 create mode 100644 gnu/home/services/git.scm

diff --git a/gnu/home/services/git.scm b/gnu/home/services/git.scm
new file mode 100644
index 0000000000..f39c931c38
--- /dev/null
+++ b/gnu/home/services/git.scm
@@ -0,0 +1,214 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2022 宋文武 <iyzsong@member.fsf.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu home services git)
+  #:use-module (gnu home services)
+  #:use-module (gnu services configuration)
+  #:use-module (gnu packages version-control)
+  #:use-module (guix packages)
+  #:use-module (guix gexp)
+  #:use-module (srfi srfi-1)
+  #:use-module (ice-9 match)
+  #:export (home-git-service-type
+            home-git-configuration))
+
+(define (git-option-value? value)
+  (or (unspecified? value)
+      (string? value)
+      (integer? value)
+      (boolean? value)))
+
+(define (serialize-git-option-value value)
+  (cond
+   ((string? value) (with-output-to-string (lambda () (write value))))
+   ((integer? value) (number->string value))
+   ((boolean? value) (if value "true" "false"))))
+
+(define (git-options? options)
+  "Return #t if OPTIONS is a well-formed sexp for git options."
+  (define git-variable?
+    (match-lambda
+      ((key value) (and (symbol? key) (git-option-value? value)))
+      (_ #f)))
+  (every
+   (match-lambda
+     (((section subsection) variables ..1)
+      (and (symbol? section)
+           (string? subsection)
+           (every git-variable? variables)))
+     ((section variables ..1)
+      (and (symbol? section)
+           (every git-variable? variables)))
+     (_ #f))
+   options))
+
+(define (serialize-git-options options)
+  "Return the @command{git-config} text form for OPTIONS."
+  (define serialize-section
+    (match-lambda
+      ((section variables ..1)
+       (with-output-to-string
+         (lambda ()
+           (match section
+             ((section subsection)
+              (simple-format #t "[~a ~s]~%" section subsection))
+             (_
+              (simple-format #t "[~a]~%" section)))
+           (for-each
+            (match-lambda
+              ((key value)
+               (simple-format #t "\t~a = ~a~%"
+                              key (serialize-git-option-value value))))
+            variables))))))
+  (string-concatenate (map serialize-section options)))
+
+(define-configuration/no-serialization home-git-configuration
+  (package
+   (package git)
+   "The Git package to use.")
+  (enable-send-email?
+   (boolean #t)
+   "Whether to install git email tools from the package's @code{send-email}
+output.")
+  (user.name
+   (git-option-value *unspecified*)
+   "The human-readable name used in the author and committer identity when
+creating commit or tag objects, or when writing reflogs.  If you need the
+author or committer to be different, the @code{author.name} or
+@code{committer.name} can be set.")
+  (user.email
+   (git-option-value *unspecified*)
+   "The email address used in the author and committer identity when creating
+commit or tag objects, or when writing reflogs.  If you need the author or
+committer to be different, the @code{author.email} or @code{committer.email}
+can be set.")
+  (user.signingKey
+   (git-option-value *unspecified*)
+   "If @command{git-tag} or @command{git-commit} is not selecting the key you
+want it to automatically when creating a signed tag or commit, you can
+override the default selection with this variable.  This option is passed
+unchanged to gpg’s @code{--local-user} parameter, so you may specify a key
+using any method that gpg supports.")
+  (author.name
+   (git-option-value *unspecified*)
+   "The human-readable name used in the author identity when creating commit
+or tag objects, or when writing reflogs.")
+  (author.email
+   (git-option-value *unspecified*)
+   "The email address used in the author identity when creating commit or tag
+objects, or when writing reflogs.")
+  (committer.name
+   (git-option-value *unspecified*)
+   "The human-readable name used in the committer identity when creating
+commit or tag objects, or when writing reflogs.")
+  (committer.email
+   (git-option-value *unspecified*)
+   "The email address used in the author identity when creating commit or tag
+objects, or when writing reflogs.")
+  (commit.gpgSign
+   (git-option-value *unspecified*)
+   "A boolean to specify whether all commits should be GPG signed.")
+  (sendemail.smtpServer
+   (git-option-value *unspecified*)
+   "If set, specifies the outgoing SMTP server to
+use (e.g. @code{smtp.example.com} or a raw IP address).  If unspecified, and if
+@var{sendemail.sendmailcmd} is also unspecified, the default is to search for
+@command{sendmail} in $PATH if such a program is available, falling back to
+@code{localhost} otherwise.")
+  (sendemail.smtpServerPort
+   (git-option-value *unspecified*)
+   "Specifies a port different from the default port (SMTP servers typically
+listen to smtp port 25, but may also listen to submission port 587, or the
+common SSL smtp port 465); symbolic port names (e.g. @code{submission} instead
+of 587) are also accepted.")
+  (sendemail.smtpUser
+   (git-option-value *unspecified*)
+   "Username for SMTP-AUTH.  If a username is not specified, then
+authentication is not attempted.")
+  (sendemail.smtpPass
+   (git-option-value *unspecified*)
+   "Password for SMTP-AUTH.  If not specified, then a password is obtained
+using @command{git-credential}.")
+  (sendemail.smtpEncryption
+   (git-option-value *unspecified*)
+   "Specify the encryption to use, either @code{ssl} or @code{tls}.  Any other
+value reverts to plain SMTP.")
+  (sendemail.sendmailcmd
+   (git-option-value *unspecified*)
+   "Specify a command to run to send the email.  The command should be
+sendmail-like; specifically, it must support the @code{-i} option.  The
+command will be executed in the shell if necessary.")
+  (extra-options
+   (git-options '())
+   "Extra configuration options for Git."))
+
+(define (home-git-configuration-final-options config)
+  (let* ((fields
+          (filter
+           (lambda (field)
+             (eq? (configuration-field-type field) 'git-option-value))
+           home-git-configuration-fields))
+         (options
+          (filter
+           (match-lambda
+             ((section (key value)) (not (unspecified? value))))
+           (map (lambda (field)
+                  (let* ((name (configuration-field-name field))
+                         (section+key (map string->symbol
+                                           (string-split (symbol->string name) #\.)))
+                         (value ((configuration-field-getter field) config)))
+                    `(,(car section+key) (,(cadr section+key) ,value))))
+                fields)))
+         (extra-options (home-git-configuration-extra-options config))
+         (merge-options (lambda (options) ;merge options by section
+                          (fold
+                           (lambda (e prev)
+                             (match e
+                               ((section variables ..1)
+                                (begin
+                                  (let ((v (assv-ref prev section)))
+                                   (assv-set! prev section
+                                              (if v (append v variables)
+                                                  variables)))))))
+                           '() options))))
+    (merge-options (append options extra-options))))
+
+(define (home-git-environment-variables config)
+  (let ((gitconfig (serialize-git-options
+                    (home-git-configuration-final-options config))))
+   `(("GIT_CONFIG_SYSTEM" . ,(plain-file "gitconfig" gitconfig)))))
+
+(define (home-git-profile config)
+  (let ((package (home-git-configuration-package config)))
+    (if (home-git-configuration-enable-send-email? config)
+        `(,package (,package "send-email"))
+        `(,package))))
+
+(define home-git-service-type
+  (service-type (name 'home-git)
+                (extensions
+                 (list (service-extension
+                        home-environment-variables-service-type
+                        home-git-environment-variables)
+                       (service-extension
+                        home-profile-service-type
+                        home-git-profile)))
+                (default-value (home-git-configuration))
+                (description
+                 "Install and configure the Git distributed revision control
+system.")))
diff --git a/gnu/local.mk b/gnu/local.mk
index 9bfeede60f..a5ea94b3a1 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -80,6 +80,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/home.scm					\
   %D%/home/services.scm			\
   %D%/home/services/desktop.scm			\
+  %D%/home/services/git.scm			\
   %D%/home/services/symlink-manager.scm		\
   %D%/home/services/fontutils.scm		\
   %D%/home/services/shells.scm			\
-- 
2.34.0





  parent reply	other threads:[~2022-03-12  2:23 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-07 14:51 [bug#54293] [WIP] home: Add home-git-service-type 宋文武
2022-03-07 17:58 ` Maxime Devos
2022-03-09 12:18   ` 宋文武
2022-03-07 18:01 ` Maxime Devos
2022-03-07 18:12   ` Maxime Devos
2022-03-07 18:02 ` Maxime Devos
2022-03-07 18:04 ` Maxime Devos
2022-03-07 18:11 ` Maxime Devos
2022-03-09 12:50   ` 宋文武
2022-03-12 22:27     ` Maxime Devos
2022-03-12  2:22 ` iyzsong [this message]
2022-03-12  9:51   ` [bug#54293] [PATCH v2] " Maxime Devos
2022-03-12  9:54   ` Maxime Devos
2022-03-29 13:56     ` [bug#54293] [WIP] " Ludovic Courtès
2022-03-12  9:58   ` [bug#54293] [PATCH v2] " Maxime Devos
2022-03-12 10:02   ` Maxime Devos
2022-03-12 10:03   ` Maxime Devos
2022-03-12 10:11   ` Maxime Devos
2022-03-12 10:12   ` Maxime Devos
2022-03-12 10:21   ` Maxime Devos
2022-03-12 10:24   ` Maxime Devos
2022-03-12 10:26   ` Maxime Devos
2022-03-12 10:31   ` Maxime Devos
2022-03-12 10:39   ` Maxime Devos
2022-05-21 13:47   ` [bug#54293] [WIP] " Ludovic Courtès

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

  List information: https://guix.gnu.org/

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

  git send-email \
    --in-reply-to=TYCP286MB18973CA5D0DD1447744E30FAA30D9@TYCP286MB1897.JPNP286.PROD.OUTLOOK.COM \
    --to=iyzsong@outlook.com \
    --cc=54293@debbugs.gnu.org \
    --cc=iyzsong@member.fsf.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 public inbox

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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).