[PATCH] home: Add home-snuik-service.

  • Done
  • quality assurance status badge
Details
3 participants
  • Janneke Nieuwenhuizen
  • Ludovic Courtès
  • Maxim Cournoyer
Owner
unassigned
Submitted by
Janneke Nieuwenhuizen
Severity
normal

Debbugs page

J
J
Janneke Nieuwenhuizen wrote on 11 Mar 14:54 -0700
(address . guix-patches@gnu.org)
7f43764f98a45b92cce1be2e7d352e3c791cebf8.1741729617.git.janneke@gnu.org
* gnu/home/services/messaging.scm (<home-snuik-configuration>): New type.
(home-snuik-services, home-snuik-service-type): New procedures.
* doc/guix.texi (Messaging Home Services): Document it.

Change-Id: I1e278e7d8ed04efcb1a2ce9e12e69cb6a31a9fa4
---
doc/guix.texi | 58 ++++++++++++++++++++++++-
gnu/home/services/messaging.scm | 77 ++++++++++++++++++++++++++++++++-
2 files changed, 132 insertions(+), 3 deletions(-)

Toggle diff (182 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index d109877a32..f35e156376 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -36,7 +36,7 @@
Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Efraim Flashner@*
Copyright @copyright{} 2016 John Darrington@*
Copyright @copyright{} 2016, 2017 Nikita Gillmann@*
-Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 Janneke Nieuwenhuizen@*
+Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Janneke Nieuwenhuizen@*
Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021 Julien Lepiller@*
Copyright @copyright{} 2016 Alex ter Weele@*
Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021 Christopher Baines@*
@@ -49714,6 +49714,62 @@ Messaging Home Services
@end table
@end deftp
+@cindex snuik
+The @uref{https://gitlab.com/janneke/snuik, Snuik IRC bot} can be run as
+a daemon to aid talking to users that are currently off-line. With the
+@code{(gnu home services messaging)} service, you can configure Snuik to
+run upon login.
+
+Here is an example of a service and its configuration that you could add
+to the @code{services} field of your @code{home-environment}:
+
+@lisp
+(service home-snuik-service-type
+ (home-snuik-configuration
+ (password-file ".password.snuik")
+ (channels '("#bootstrappable"
+ "#dezyne"
+ "#guix-risc-v"
+ "#lilypond"))))
+@end lisp
+
+@defvar home-snuik-service-type
+This is the type of the Snuik home service, whose value is a
+@code{home-snuik-configuration} object.
+@end defvar
+
+@deftp {Data Type} home-snuik-configuration
+Available @code{home-snuik-configuration} fields are:
+
+@table @asis
+@item @code{snuik} (default: @code{snuik}) (type: file-like)
+The Snuik package to use.
+
+@item @code{server} (default: @code{"irc.libera.chat"})
+The IRC server to connect to.
+
+@item @code{port} (default: @code{6665})
+Port number used by the IRC server.
+
+@item @code{nick} (default: @code{"snuik"})
+The nickname for snuik to use.
+
+@item @code{password} (default: @code{#f})
+The password to use when logging in.
+
+@item @code{password-file} (default: @code{".password.<nick>})
+The file to read the password from to use when logging in.
+
+@item @code{channels} (default: @code{'("##botchat")})
+The channels for snuik to join, a list of strings.
+
+@item @code{extra-options} (default: @code{'()})
+Extra options will be passed to @command{snuik}, please run
+@command{snuik --help } for more information.
+
+@end table
+@end deftp
+
@node Media Home Services
@subsection Media Home Services
diff --git a/gnu/home/services/messaging.scm b/gnu/home/services/messaging.scm
index bd2f1bb23f..be2a3436ba 100644
--- a/gnu/home/services/messaging.scm
+++ b/gnu/home/services/messaging.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2023 Janneke Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2023, 2025 Janneke Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -20,12 +20,15 @@ (define-module (gnu home services messaging)
#:use-module (srfi srfi-26)
#:use-module (gnu home services)
#:use-module (gnu home services shepherd)
+ #:use-module (gnu packages irc)
#:use-module (gnu packages messaging)
#:use-module (gnu services configuration)
#:use-module (gnu services shepherd)
#:use-module (guix records)
#:use-module (guix gexp)
- #:export (home-znc-configuration
+ #:export (home-snuik-configuration
+ home-snuik-service-type
+ home-znc-configuration
home-znc-service-type))
;;;
@@ -64,3 +67,73 @@ (define home-znc-service-type
(description
"Install and configure @command{znc}, an @acronym{IRC, Internet Relay
Chat} bouncer, as a Shepherd service.")))
+
+
+;;;
+;;; Snuik.
+;;;
+(define-record-type* <home-snuik-configuration>
+ home-snuik-configuration make-home-snuik-configuration
+ home-snuik-configuration?
+ (snuik home-snuik-snuik ;file-like
+ (default snuik))
+ (server home-snuik-server ;string
+ (default #f))
+ (port home-snuik-port ;integer
+ (default #f))
+ (nick home-snuik-nick ;string
+ (default #f))
+ (password home-snuik-password ;string
+ (default #f))
+ (password-file home-snuik-password-file ;string
+ (default #f))
+ (channels home-snuik-channels ;list of string
+ (default '()))
+ (extra-options home-snuik-extra-options ;list of string
+ (default '())))
+
+(define (home-snuik-services config)
+ "Return a <shepherd-service> for snuik with CONFIG."
+ (match-record config
+ <home-snuik-configuration>
+ (snuik server port nick password password-file channels extra-options)
+ (let* ((snuik (file-append snuik "/bin/snuik"))
+ (command #~'(#$snuik
+ #$@(if server
+ #~("--server" #$server)
+ #~())
+ #$@(if port
+ #~("--port" (number->string port))
+ #~())
+ #$@(if nick
+ #~("--nick" nick)
+ #~())
+ #$@(if password
+ #~("--password" password)
+ #~())
+ #$@(if password-file
+ #~("--password-file" password-file)
+ #~())
+ #$@(if (pair? channels)
+ #~("--channels" (string-join channels ","))
+ #~())
+ #$@extra-options))
+ (log-file #~(string-append %user-log-dir "/snuik.log")))
+ (list (shepherd-service
+ (documentation "Run the snuik IRC bot.")
+ (provision '(snuik))
+ (modules '((shepherd support))) ;for '%user-log-dir'
+ (start #~(make-forkexec-constructor #$command
+ #:log-file #$log-file))
+ (stop #~(make-kill-destructor)))))))
+
+(define home-snuik-service-type
+ (service-type
+ (name 'home-snuik)
+ (default-value (home-snuik-configuration))
+ (extensions
+ (list (service-extension home-shepherd-service-type
+ home-snuik-services)))
+ (description
+ "Install and configure the Snuik IRC bot so that it runs as a Shepherd
+service.")))

base-commit: d685a45edf0f89e5876ffc9d880068d8610e5f8a
--
2.47.1
M
M
Maxim Cournoyer wrote on 12 Mar 05:47 -0700
(name . Janneke Nieuwenhuizen)(address . janneke@gnu.org)
877c4ufmag.fsf@gmail.com
Hi Janneke!

Janneke Nieuwenhuizen <janneke@gnu.org> writes:

Toggle quote (9 lines)
> * gnu/home/services/messaging.scm (<home-snuik-configuration>): New type.
> (home-snuik-services, home-snuik-service-type): New procedures.
> * doc/guix.texi (Messaging Home Services): Document it.
>
> Change-Id: I1e278e7d8ed04efcb1a2ce9e12e69cb6a31a9fa4
> ---
> doc/guix.texi | 58 ++++++++++++++++++++++++-
> gnu/home/services/messaging.scm | 77 ++++++++++++++++++++++++++++++++-

Wouldn't such a service be a more natural match for a system service?
It seems like something I'd like running on a headless server.

Toggle quote (13 lines)
> 2 files changed, 132 insertions(+), 3 deletions(-)
>
> diff --git a/doc/guix.texi b/doc/guix.texi
> index d109877a32..f35e156376 100644
> --- a/doc/guix.texi
> +++ b/doc/guix.texi
> @@ -36,7 +36,7 @@
> Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Efraim Flashner@*
> Copyright @copyright{} 2016 John Darrington@*
> Copyright @copyright{} 2016, 2017 Nikita Gillmann@*
> -Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 Janneke Nieuwenhuizen@*
> +Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Janneke Nieuwenhuizen@*

Maybe use 2016-2025 :-).

Toggle quote (13 lines)
> Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021 Julien Lepiller@*
> Copyright @copyright{} 2016 Alex ter Weele@*
> Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021 Christopher Baines@*
> @@ -49714,6 +49714,62 @@ Messaging Home Services
> @end table
> @end deftp
>
> +@cindex snuik
> +The @uref{https://gitlab.com/janneke/snuik, Snuik IRC bot} can be run as
> +a daemon to aid talking to users that are currently off-line. With the
> +@code{(gnu home services messaging)} service, you can configure Snuik to
> +run upon login.

nitpick: I've only ever seen 'offline' spelled as a single word.

[...]

Toggle quote (24 lines)
> +
> +;;;
> +;;; Snuik.
> +;;;
> +(define-record-type* <home-snuik-configuration>
> + home-snuik-configuration make-home-snuik-configuration
> + home-snuik-configuration?
> + (snuik home-snuik-snuik ;file-like
> + (default snuik))
> + (server home-snuik-server ;string
> + (default #f))
> + (port home-snuik-port ;integer
> + (default #f))
> + (nick home-snuik-nick ;string
> + (default #f))
> + (password home-snuik-password ;string
> + (default #f))
> + (password-file home-snuik-password-file ;string
> + (default #f))
> + (channels home-snuik-channels ;list of string
> + (default '()))
> + (extra-options home-snuik-extra-options ;list of string
> + (default '())))

I'd use define-configuration/no-serialization from (gnu services configuration), which
will type-check the field values and produce useful errors in case of a
mistake, which is more useful than a comment in the source file :-).

Toggle quote (35 lines)
> +(define (home-snuik-services config)
> + "Return a <shepherd-service> for snuik with CONFIG."
> + (match-record config
> + <home-snuik-configuration>
> + (snuik server port nick password password-file channels extra-options)
> + (let* ((snuik (file-append snuik "/bin/snuik"))
> + (command #~'(#$snuik
> + #$@(if server
> + #~("--server" #$server)
> + #~())
> + #$@(if port
> + #~("--port" (number->string port))
> + #~())
> + #$@(if nick
> + #~("--nick" nick)
> + #~())
> + #$@(if password
> + #~("--password" password)
> + #~())
> + #$@(if password-file
> + #~("--password-file" password-file)
> + #~())
> + #$@(if (pair? channels)
> + #~("--channels" (string-join channels ","))
> + #~())
> + #$@extra-options))
> + (log-file #~(string-append %user-log-dir "/snuik.log")))
> + (list (shepherd-service
> + (documentation "Run the snuik IRC bot.")
> + (provision '(snuik))
> + (modules '((shepherd support))) ;for '%user-log-dir'
> + (start #~(make-forkexec-constructor #$command
> + #:log-file #$log-file))
> + (stop #~(make-kill-destructor)))))))

Can home services use the least-authority-wrapper to containerize the
processes? If yes, that'd be nice to use it.

--
Thanks,
Maxim
J
J
Janneke Nieuwenhuizen wrote on 12 Mar 08:40 -0700
(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
87ikoel0jb.fsf@gnu.org
Maxim Cournoyer writes:

Hi Maxim,

Toggle quote (14 lines)
> Janneke Nieuwenhuizen <janneke@gnu.org> writes:
>
>> * gnu/home/services/messaging.scm (<home-snuik-configuration>): New type.
>> (home-snuik-services, home-snuik-service-type): New procedures.
>> * doc/guix.texi (Messaging Home Services): Document it.
>>
>> Change-Id: I1e278e7d8ed04efcb1a2ce9e12e69cb6a31a9fa4
>> ---
>> doc/guix.texi | 58 ++++++++++++++++++++++++-
>> gnu/home/services/messaging.scm | 77 ++++++++++++++++++++++++++++++++-
>
> Wouldn't such a service be a more natural match for a system service?
> It seems like something I'd like running on a headless server.

I suppose you're right. I've been thinking about that but am not too
thrilled of running snuik v0.2 as root. I'll make it a system service
and use (for-home ...) to provide a home service. Using the
least-authority-wrapper should (thanks for mentioning that, I wasn't
aware of this feature!) address my concerns about taking this route.

Toggle quote (15 lines)
>> 2 files changed, 132 insertions(+), 3 deletions(-)
>>
>> diff --git a/doc/guix.texi b/doc/guix.texi
>> index d109877a32..f35e156376 100644
>> --- a/doc/guix.texi
>> +++ b/doc/guix.texi
>> @@ -36,7 +36,7 @@
>> Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Efraim Flashner@*
>> Copyright @copyright{} 2016 John Darrington@*
>> Copyright @copyright{} 2016, 2017 Nikita Gillmann@*
>> -Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 Janneke Nieuwenhuizen@*
>> +Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Janneke Nieuwenhuizen@*
>
> Maybe use 2016-2025 :-).

Hmm. I thought you needed to have a special exception in the README to
be able for that to hold up in court. I've been postponing to look into
this mess (I used to be too heavily into copyright in my LilyPond years).
However, it seems today is the day :)


Toggle snippet (7 lines)
You can use a range (‘2008-2010’) instead of listing individual years
(‘2008, 2009, 2010’) if and only if: 1) every year in the range,
inclusive, really is a “copyrightable” year that would be listed
individually; and 2) you make an explicit statement in a README file
about this usage.

Sadly, the manual does not seem to give a template to use for this, and
I have learnt to stay away from authoring legal texts. I just asked
gnu-prog-discuss about this.

I cannot find such a statement in the Guix README? Ludo'?

Toggle quote (7 lines)
>> +The @uref{https://gitlab.com/janneke/snuik,Snuik IRC bot} can be run as
>> +a daemon to aid talking to users that are currently off-line. With the
>> +@code{(gnu home services messaging)} service, you can configure Snuik to
>> +run upon login.
>
> nitpick: I've only ever seen 'offline' spelled as a single word.

The numbers

Toggle snippet (8 lines)
15:53:37 janneke@glimdal:~/src/guix/core-packages-team
$ git grep off-line |wc -l
39
15:54:23 janneke@glimdal:~/src/guix/core-packages-team
$ git grep offline |wc -l
448

are overwhelmingly in your favor, so I'll take your suggestion, thanks :)
Toggle quote (9 lines)
>> +
>> +;;;
>> +;;; Snuik.
>> +;;;
>> +(define-record-type* <home-snuik-configuration>
>> + home-snuik-configuration make-home-snuik-configuration
>> + home-snuik-configuration?
>> + (snuik home-snuik-snuik ;file-like
>> + (default snuik))
[..]

Toggle quote (4 lines)
> I'd use define-configuration/no-serialization from (gnu services configuration), which
> will type-check the field values and produce useful errors in case of a
> mistake, which is more useful than a comment in the source file :-).

Ok.

Toggle quote (1 lines)
>> +(define (home-snuik-services config)
[..]
Toggle quote (7 lines)
>> + (start #~(make-forkexec-constructor #$command
>> + #:log-file #$log-file))
>> + (stop #~(make-kill-destructor)))))))
>
> Can home services use the least-authority-wrapper to containerize the
> processes? If yes, that'd be nice to use it.

Looking at dicod-shepherd-service, it has (if home-service?...) and uses
the least-authority-wrapper. I'm wondering how this works for read
access to the password-file and read/write access to snuik's database
store directory but I'll look into this.

Thanks for your very useful comments, I've got some homework! :)

I intend to send a v2 with system+home service and
least-authority-wrapper...but I need to learn a few things about bothe
these things and then also do some testing.

Greetings,
Janneke

--
Janneke Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond https://LilyPond.org
Freelance IT https://www.JoyOfSource.com| Avatar® https://AvatarAcademy.com
J
J
Janneke Nieuwenhuizen wrote on 12 Mar 12:14 -0700
(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
87cyemgiyk.fsf@gnu.org
Janneke Nieuwenhuizen writes:

[..]
Toggle quote (32 lines)
>>> diff --git a/doc/guix.texi b/doc/guix.texi
>>> index d109877a32..f35e156376 100644
>>> --- a/doc/guix.texi
>>> +++ b/doc/guix.texi
>>> @@ -36,7 +36,7 @@
>>> Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Efraim Flashner@*
>>> Copyright @copyright{} 2016 John Darrington@*
>>> Copyright @copyright{} 2016, 2017 Nikita Gillmann@*
>>> -Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 Janneke Nieuwenhuizen@*
>>> +Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Janneke Nieuwenhuizen@*
>>
>> Maybe use 2016-2025 :-).
>
> Hmm. I thought you needed to have a special exception in the README to
> be able for that to hold up in court. I've been postponing to look into
> this mess (I used to be too heavily into copyright in my LilyPond years).
> However, it seems today is the day :)
>
> From <https://www.gnu.org/prep/maintain/html_node/Copyright-Notices.html>
>
> You can use a range (‘2008-2010’) instead of listing individual years
> (‘2008, 2009, 2010’) if and only if: 1) every year in the range,
> inclusive, really is a “copyrightable” year that would be listed
> individually; and 2) you make an explicit statement in a README file
> about this usage.
>
> Sadly, the manual does not seem to give a template to use for this, and
> I have learnt to stay away from authoring legal texts. I just asked
> gnu-prog-discuss about this.
>
> I cannot find such a statement in the Guix README? Ludo'?

Emacs uses

Toggle snippet (6 lines)
In copyright notices where the copyright holder is the Free Software
Foundation, then where a range of years appears, this is an inclusive
range that applies to every year in the range. For example: 2005-2008
represents the years 2005, 2006, 2007, and 2008.

so I propose the attached patch.

WDYT?

Greetings,
Janneke
From 571705169251caeb5cdacc9418dc5665880f9008 Mon Sep 17 00:00:00 2001
Message-ID: <571705169251caeb5cdacc9418dc5665880f9008.1741806833.git.janneke@gnu.org>
From: Janneke Nieuwenhuizen <janneke@gnu.org>
Date: Wed, 12 Mar 2025 19:48:26 +0100
Subject: [PATCH] doc: Add note on copyright ranges to README.

* README (Note On Copyright Years): New section.

Change-Id: I1b2f8ed544dc83c38479e944ae6e08ddbcafdf35
---
README | 6 ++++++
1 file changed, 6 insertions(+)

Toggle diff (20 lines)
diff --git a/README b/README
index b9f36f8344..edf1215704 100644
--- a/README
+++ b/README
@@ -108,3 +108,9 @@ but exposes all the API as Scheme.
- The [[https://www.gnu.org/s/gsrc/][GNU Source Release Collection]] (GSRC) is a user-land software
distribution; unlike Guix, it relies on core tools available on the
host system
+
+* Note On Copyright Years
+
+In copyright notices where a range of years appears, this is an inclusive
+range that applies to every year in the range. For example: 2005-2008
+represents the years 2005, 2006, 2007, and 2008.

base-commit: dec40dd50f3490d5b96d19d98d54782ee2fb02a9
prerequisite-patch-id: d6040718f85c458c1ec6e7e7b1292fdd5b4a32d4
prerequisite-patch-id: 0b629b0cc9b64ddf9d00974018855b6f4f0d57b1
--
2.47.1
--
Janneke Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond https://LilyPond.org
Freelance IT https://www.JoyOfSource.com| Avatar® https://AvatarAcademy.com
J
J
Janneke Nieuwenhuizen wrote on 12 Mar 12:38 -0700
(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
87msdqf3a1.fsf@gnu.org
Janneke Nieuwenhuizen writes:

Toggle quote (46 lines)
> Janneke Nieuwenhuizen writes:
>
> [..]
>>>> diff --git a/doc/guix.texi b/doc/guix.texi
>>>> index d109877a32..f35e156376 100644
>>>> --- a/doc/guix.texi
>>>> +++ b/doc/guix.texi
>>>> @@ -36,7 +36,7 @@
>>>> Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Efraim Flashner@*
>>>> Copyright @copyright{} 2016 John Darrington@*
>>>> Copyright @copyright{} 2016, 2017 Nikita Gillmann@*
>>>> -Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 Janneke Nieuwenhuizen@*
>>>> +Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Janneke Nieuwenhuizen@*
>>>
>>> Maybe use 2016-2025 :-).
>>
>> Hmm. I thought you needed to have a special exception in the README to
>> be able for that to hold up in court. I've been postponing to look into
>> this mess (I used to be too heavily into copyright in my LilyPond years).
>> However, it seems today is the day :)
>>
>> From <https://www.gnu.org/prep/maintain/html_node/Copyright-Notices.html>
>>
>> You can use a range (‘2008-2010’) instead of listing individual years
>> (‘2008, 2009, 2010’) if and only if: 1) every year in the range,
>> inclusive, really is a “copyrightable” year that would be listed
>> individually; and 2) you make an explicit statement in a README file
>> about this usage.
>>
>> Sadly, the manual does not seem to give a template to use for this, and
>> I have learnt to stay away from authoring legal texts. I just asked
>> gnu-prog-discuss about this.
>>
>> I cannot find such a statement in the Guix README? Ludo'?
>
> Emacs uses
>
> In copyright notices where the copyright holder is the Free Software
> Foundation, then where a range of years appears, this is an inclusive
> range that applies to every year in the range. For example: 2005-2008
> represents the years 2005, 2006, 2007, and 2008.
>
> so I propose the attached patch.
>
> WDYT?

Sorry, spoke too soon. The story continues (this is why I shied away
from (looking into) using ranges).

On gru-prog-discuss, Eli Zaretskii writes (in response to my suggestion)

Toggle snippet (9 lines)
I think the idea is that you can only vouch for this interpretation
when you are the copyright holder. So I think you'd need to mention
someone else there instead of the FSF, not just leave it empty.
Because for an arbitrary copyright holder, who's to say what they mean
by a range of years?

But this is just my understanding; IANAL.

...TBC

Greetings,
Janneke

--
Janneke Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond https://LilyPond.org
Freelance IT https://www.JoyOfSource.com| Avatar® https://AvatarAcademy.com
J
J
Janneke Nieuwenhuizen wrote on 13 Mar 12:11 -0700
[PATCH v2 1/2] services: Add snuik-service-type.
(address . 76963@debbugs.gnu.org)
f1b5282432aed6357a76223c12fe2c15f78c1943.1741893001.git.janneke@gnu.org
* gnu/services/messaging.scm (snuik-configuration): New type.
(snuik-services): New procedure.
(snuik-activation, %snuik-accounts, snuik-service-type): New variables.
* doc/guix.texi (Messaging Services): Document it.

Change-Id: I0c52b4804948876dc1b4d3b5ac660af848a13f25
---
doc/guix.texi | 59 ++++++++++++++++++-
gnu/services/messaging.scm | 114 ++++++++++++++++++++++++++++++++++++-
2 files changed, 171 insertions(+), 2 deletions(-)

Toggle diff (210 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index d109877a32c..083e561e48c 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -36,7 +36,7 @@
Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Efraim Flashner@*
Copyright @copyright{} 2016 John Darrington@*
Copyright @copyright{} 2016, 2017 Nikita Gillmann@*
-Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 Janneke Nieuwenhuizen@*
+Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Janneke Nieuwenhuizen@*
Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021 Julien Lepiller@*
Copyright @copyright{} 2016 Alex ter Weele@*
Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021 Christopher Baines@*
@@ -30208,6 +30208,63 @@ Messaging Services
@end table
@end deftp
+@cindex irc-bot
+@cindex snuik
+The @uref{https://gitlab.com/janneke/snuik, Snuik IRC bot} can be run as
+a daemon to aid talking to users that are currently offline. With the
+@code{(gnu services messaging)} service, you can configure it by adding
+a @code{snuik-service-type} service to the @code{services} field of your
+operating system declaration.
+
+@defvar snuik-service-type
+This is the type of the Snuik service, whose value is a
+@code{snuik-configuration} object.
+@end defvar
+
+Here is an example of a service and its configuration:
+
+@lisp
+(service snuik-service-type
+ (snuik-configuration
+ (password-file "/var/run/snuik/.password.snuik")
+ (channels '("#bootstrappable"
+ "#dezyne"
+ "#guix-risc-v"
+ "#lilypond"))))
+@end lisp
+
+@deftp {Data Type} snuik-configuration
+Available @code{snuik-configuration} fields are:
+
+@table @asis
+@item @code{snuik} (default: @code{snuik}) (type: package)
+The Snuik package to use.
+
+@item @code{server} (default: @code{"irc.libera.chat"})
+The IRC server to connect to.
+
+@item @code{port} (default: @code{6665}) (type: integer)
+Port number used by the IRC server.
+
+@item @code{nick} (default: @code{"snuik"}) (type: string)
+The nickname for snuik to use.
+
+@item @code{password} (default: @code{#f}) (type: string)
+The password to use when logging in.
+
+@item @code{password-file} (default: @code{".password.<nick>})
+The file to read the password from to use when logging in.
+
+@item @code{channels} (default: @code{'("##botchat")})
+The channels for snuik to join, a list of strings.
+
+@item @code{extra-options} (default: @code{'()})
+Extra options will be passed to @command{snuik}, please run
+@command{snuik --help } for more information.
+
+@end table
+@end deftp
+
@node Telephony Services
@subsection Telephony Services
diff --git a/gnu/services/messaging.scm b/gnu/services/messaging.scm
index a914d0f89ec..9bfeabacf45 100644
--- a/gnu/services/messaging.scm
+++ b/gnu/services/messaging.scm
@@ -59,7 +59,10 @@ (define-module (gnu services messaging)
bitlbee-service-type
quassel-configuration
- quassel-service-type))
+ quassel-service-type
+
+ snuik-configuration
+ snuik-service-type))
;;; Commentary:
;;;
@@ -1002,3 +1005,112 @@ (define quassel-service-type
"Run @url{https://quassel-irc.org/,quasselcore}, the backend
for the distributed IRC client quassel, which allows you to connect from
multiple machines simultaneously.")))
+
+
+;;;
+;;; Snuik.
+;;;
+(define-maybe integer (no-serialization))
+(define-configuration/no-serialization snuik-configuration
+ (snuik (package snuik) "The snuik package to use.")
+ (server maybe-string "The IRC server to connect to.")
+ (port maybe-integer "The port used by the IRC server.")
+ (nick maybe-string "The nickname for snuik to use.")
+ (password maybe-string "The password to use when logging in.")
+ (password-file maybe-string "The file to read the password from.")
+ (channels (list-of-strings '()) "The channels for snuik to join.")
+ (extra-options (list-of-strings '()) "Extra options to be passed to snuik.")
+ (home-service? (boolean for-home?) "Running as home service?"))
+
+(define (snuik-services config)
+ "Return a <shepherd-service> for snuik with CONFIG."
+ (match-record config
+ <snuik-configuration>
+ (snuik server port nick password password-file channels extra-options
+ home-service?)
+ (let* ((password-file (snuik-configuration-password-file config))
+ (mappings `(,@(if home-service?
+ '()
+ `(,(file-system-mapping
+ (source "/var/run/snuik")
+ (target source)
+ (writable? #t))
+ ,@(if password-file
+ (list (file-system-mapping
+ (source password-file)
+ (target source)))
+ '())))))
+ (snuik (least-authority-wrapper
+ (file-append snuik "/bin/snuik")
+ #:name "snuik"
+ #:mappings mappings
+ #:namespaces (delq 'net %namespaces)))
+ (command
+ #~'(#$snuik
+ #$@(if (and server (not (eq? server %unset-value)))
+ (list (string-append "--server=" server))
+ #~())
+ #$@(if (and port (not (eq? port %unset-value)))
+ (list (string-append "--port=" (number->string port)))
+ #~())
+ #$@(if (and nick (not (eq? nick %unset-value)))
+ (list (string-append "--nick=" nick))
+ #~())
+ #$@(if (and password (not (eq? password %unset-value)))
+ (list (string-append "--password=" password))
+ #~())
+ #$@(if (and password-file (not (eq? password-file %unset-value)))
+ (list (string-append "--password-file=" password-file))
+ #~())
+ #$@(if (pair? channels)
+ (list (string-append "--channels=" (string-join channels ",")))
+ #~())
+ #$@extra-options))
+ (log-file #~(string-append
+ #$(if home-service? #~%user-log-dir "/var/log")
+ "/snuik.log")))
+ (list (shepherd-service
+ (documentation "Run the snuik IRC bot.")
+ (provision '(snuik))
+ (requirement (if home-service? '() '(user-processes networking)))
+ (modules (if home-service?
+ '((shepherd support)) ;for '%user-log-dir'
+ '()))
+ (start #~(make-forkexec-constructor
+ #$command
+ #:log-file #$log-file
+ #:user #$(and (not home-service?) "snuik")
+ #:group #$(and (not home-service?) "snuik")))
+ (stop #~(make-kill-destructor)))))))
+
+(define snuik-activation
+ (with-imported-modules '((guix build utils))
+ #~(begin
+ (use-modules (guix build utils))
+ (let* ((user (getpw "snuik"))
+ (directory "/var/run/snuik"))
+ (mkdir-p directory)
+ (chown directory (passwd:uid user) (passwd:gid user))))))
+
+(define %snuik-accounts
+ (list (user-group (name "snuik") (system? #t))
+ (user-account
+ (name "snuik")
+ (group "snuik")
+ (system? #t)
+ (comment "Snuik IRC bot user")
+ (home-directory "/var/run/snuik")
+ (shell (file-append shadow "/sbin/nologin")))))
+
+(define snuik-service-type
+ (service-type
+ (name 'home-snuik)
+ (description "Run the Snuik IRC bot.")
+ (default-value (snuik-configuration))
+ (extensions
+ (list (service-extension activation-service-type
+ (const snuik-activation))
+ (service-extension account-service-type
+ (const %snuik-accounts))
+ (service-extension shepherd-root-service-type
+ snuik-services)))))

base-commit: 678b3dddfe442e643fe5cff7730d4f9690c3e2c2
--
2.47.1
J
J
Janneke Nieuwenhuizen wrote on 13 Mar 12:11 -0700
[PATCH v2 2/2] home: Add home-snuik-service.
(address . 76963@debbugs.gnu.org)
590a719c16fa369898b4c8bb99a303e5f4324341.1741893001.git.janneke@gnu.org
* gnu/home/services/messaging.scm (home-snuik-service-type): New variable.
* doc/guix.texi (Messaging Home Services): Document it.

Change-Id: I1e278e7d8ed04efcb1a2ce9e12e69cb6a31a9fa4
---
doc/guix.texi | 28 ++++++++++++++++++++++++++++
gnu/home/services/messaging.scm | 21 +++++++++++++++++++--
2 files changed, 47 insertions(+), 2 deletions(-)

Toggle diff (87 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index 083e561e48c..54e63902fa1 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -49771,6 +49771,34 @@ Messaging Home Services
@end table
@end deftp
+@cindex irc-bot
+@cindex snuik
+The @uref{https://gitlab.com/janneke/snuik, Snuik IRC bot} can be run as
+a daemon to aid talking to users that are currently offline. With the
+@code{(gnu home services messaging)} service, you can configure Snuik to
+run upon login.
+
+@defvar home-snuik-service-type
+This is the type of the Snuik home service, whose value is a
+@code{home-snuik-configuration} object.
+@end defvar
+
+You may specify a custom configuration by providing a
+@code{snuik-configuration} record, exactly like for
+@code{snuik-service-type} and wrapping it in @code{for-home}. Here is
+an example of a service and its configuration that you could add to the
+@code{services} field of your @code{home-environment}:
+
+@lisp
+(service home-snuik-service-type
+ (for-home
+ (snuik-configuration
+ (server "irc.oftc.net")
+ (nick "sneek")
+ (password "snuik is sneeky")
+ (channels '("#reproducible-builds"))))
+@end lisp
+
@node Media Home Services
@subsection Media Home Services
diff --git a/gnu/home/services/messaging.scm b/gnu/home/services/messaging.scm
index bd2f1bb23f5..c871869d452 100644
--- a/gnu/home/services/messaging.scm
+++ b/gnu/home/services/messaging.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2023 Janneke Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2023, 2025 Janneke Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -20,12 +20,17 @@ (define-module (gnu home services messaging)
#:use-module (srfi srfi-26)
#:use-module (gnu home services)
#:use-module (gnu home services shepherd)
+ #:use-module (gnu packages irc)
#:use-module (gnu packages messaging)
+ #:use-module (gnu services)
#:use-module (gnu services configuration)
#:use-module (gnu services shepherd)
+ #:use-module (gnu services messaging)
+ #:use-module ((gnu system shadow) #:select (account-service-type))
#:use-module (guix records)
#:use-module (guix gexp)
- #:export (home-znc-configuration
+ #:export (home-snuik-service-type
+ home-znc-configuration
home-znc-service-type))
;;;
@@ -64,3 +69,15 @@ (define home-znc-service-type
(description
"Install and configure @command{znc}, an @acronym{IRC, Internet Relay
Chat} bouncer, as a Shepherd service.")))
+
+
+;;;
+;;; Snuik.
+;;;
+(define home-snuik-service-type
+ (service-type
+ (inherit (system->home-service-type
+ (remove-service-extensions snuik-service-type
+ (list account-service-type
+ activation-service-type))))
+ (default-value (for-home (snuik-configuration)))))
--
2.47.1
J
J
Janneke Nieuwenhuizen wrote on 13 Mar 13:31 -0700
Copyright ranges and Copyright holders in README [WAS Re: [bug#76963] [PATCH] home: Add home-snuik-service.]
(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
874izwr7u9.fsf_-_@gnu.org
Janneke Nieuwenhuizen writes:

Hi,

Toggle quote (63 lines)
> Janneke Nieuwenhuizen writes:
>
>> Janneke Nieuwenhuizen writes:
>>
>> [..]
>>>>> diff --git a/doc/guix.texi b/doc/guix.texi
>>>>> index d109877a32..f35e156376 100644
>>>>> --- a/doc/guix.texi
>>>>> +++ b/doc/guix.texi
>>>>> @@ -36,7 +36,7 @@
>>>>> Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Efraim Flashner@*
>>>>> Copyright @copyright{} 2016 John Darrington@*
>>>>> Copyright @copyright{} 2016, 2017 Nikita Gillmann@*
>>>>> -Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 Janneke Nieuwenhuizen@*
>>>>> +Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Janneke Nieuwenhuizen@*
>>>>
>>>> Maybe use 2016-2025 :-).
>>>
>>> Hmm. I thought you needed to have a special exception in the README to
>>> be able for that to hold up in court. I've been postponing to look into
>>> this mess (I used to be too heavily into copyright in my LilyPond years).
>>> However, it seems today is the day :)
>>>
>>> From <https://www.gnu.org/prep/maintain/html_node/Copyright-Notices.html>
>>>
>>> You can use a range (‘2008-2010’) instead of listing individual years
>>> (‘2008, 2009, 2010’) if and only if: 1) every year in the range,
>>> inclusive, really is a “copyrightable” year that would be listed
>>> individually; and 2) you make an explicit statement in a README file
>>> about this usage.
>>>
>>> Sadly, the manual does not seem to give a template to use for this, and
>>> I have learnt to stay away from authoring legal texts. I just asked
>>> gnu-prog-discuss about this.
>>>
>>> I cannot find such a statement in the Guix README? Ludo'?
>>
>> Emacs uses
>>
>> In copyright notices where the copyright holder is the Free Software
>> Foundation, then where a range of years appears, this is an inclusive
>> range that applies to every year in the range. For example: 2005-2008
>> represents the years 2005, 2006, 2007, and 2008.
>>
>> so I propose the attached patch.
>>
>> WDYT?
>
> Sorry, spoke too soon. The story continues (this is why I shied away
> from (looking into) using ranges).
>
> On gru-prog-discuss, Eli Zaretskii writes (in response to my suggestion)
>
> I think the idea is that you can only vouch for this interpretation
> when you are the copyright holder. So I think you'd need to mention
> someone else there instead of the FSF, not just leave it empty.
> Because for an arbitrary copyright holder, who's to say what they mean
> by a range of years?
>
> But this is just my understanding; IANAL.
>
> ...TBC

I haven't heard back from the fsf (laywers) yet, so I'm tentatively
proposing the attached patch. It's really beyond me how 58(!) people
managed to use ranges in copyright years where per GNU documentation (am
I the only one actually reading that?) that is quite posssibly not
legally valid. I mean, I don't really care about legalese all that
much, let's drop all silly headers with all the rebase conflicts, the
metadata is in git right?...but if we are to try to cater for this legal
foo-ness, we should probably be [super] strict, no?

Next to the attached patch, there should probably be something about
"add your name to the README" in the Contributing section of the manual.

Greetings,
Janneke
From 045d76823e98933a6a99aaff23ea7ee450ac8fea Mon Sep 17 00:00:00 2001
Message-ID: <045d76823e98933a6a99aaff23ea7ee450ac8fea.1741897687.git.janneke@gnu.org>
From: Janneke Nieuwenhuizen <janneke@gnu.org>
Date: Wed, 12 Mar 2025 19:48:26 +0100
Subject: [PATCH] doc: Add note on copyright ranges to README.

* README (Note On Copyright Years): New section.

Change-Id: I1b2f8ed544dc83c38479e944ae6e08ddbcafdf35
---
README | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 67 insertions(+)

Toggle diff (79 lines)
diff --git a/README b/README
index b9f36f8344f..1d9cea1ea54 100644
--- a/README
+++ b/README
@@ -108,3 +108,70 @@ but exposes all the API as Scheme.
- The [[https://www.gnu.org/s/gsrc/][GNU Source Release Collection]] (GSRC) is a user-land software
distribution; unlike Guix, it relies on core tools available on the
host system
+
+* Note On Copyright Years
+
+ In copyright notices where a the copyright holder is one of
+
+ Adam Faiz
+ André A. Gomes
+ Andrew Tropin
+ Andy Wingo
+ Artyom V. Poptsov
+ Arun Isaac
+ Brice Waegeneire
+ Bruno Victal
+ Danial Behzadi
+ David Elsing
+ Denis 'GNUtoo' Carikli
+ Efraim Flashner
+ Eraim Flashner
+ Eric Bavier
+ Evgeny Pisemsky
+ Feross Aboukhadijeh
+ Giacomo Leidi
+ Greg Hogan
+ Guillaume Le Vaillant
+ Hartmut Goebel
+ Herman Rimm
+ Igor Pavlov.
+ Iliya Tikhonenko
+ James Smith
+ Janneke Nieuwenhuizen
+ jgart
+ John Kehayias
+ Jonathan Brielmaier
+ J. Schilling.
+ Julien Lepiller
+ Lennart Regebro
+ Leo Famulari
+ Liam Hupfer
+ Liliana Marie Prikler
+ Ludovic Courtès
+ Mădălin Ionel Patrașcu
+ Marius Bakke
+ Mark H Weaver
+ Martin Becze
+ Maxim Cournoyer
+ Maxime Devos
+ Mike Bostock
+ Navid Afkhami
+ Nicolas Goaziou
+ Paul A. Patience
+ Philip McGrath
+ Remco van 't Veer
+ Ricardo Wurmus
+ Robert Lougher
+ Rocky Bernstein
+ Sharlatan Hellseher
+ Simon Josefsson
+ Suhail Singh
+ Tibor Koleszar
+ Université Bordeaux
+ Vinicius Monego
+ Zheng Junjie
+ Zhu Zihao
+
+ then where a range of years appears, this is an inclusive range that applies
+ to every year in the range. For example: 2012-2015 represents the years 2012,
+ 2013, 2014, and 2015.

base-commit: 678b3dddfe442e643fe5cff7730d4f9690c3e2c2
--
2.47.1
--
Janneke Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond https://LilyPond.org
Freelance IT https://www.JoyOfSource.com| Avatar® https://AvatarAcademy.com
J
J
Janneke Nieuwenhuizen wrote on 13 Mar 23:24 -0700
(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
87tt7wp1tl.fsf@gnu.org
Janneke Nieuwenhuizen writes:

Toggle quote (2 lines)
> I haven't heard back from the fsf (laywers) yet, so I'm tentatively
> proposing the attached patch.
[..]
Toggle quote (2 lines)
> if we are to try to cater for legalese we should probably be strict?

Ouch, that didn't come out quite the way I intended it. Sorry much too
much emotion. I just wanted to say, well, something like this.

Toggle quote (3 lines)
> Next to the attached patch, there should probably be something about
> "add your name to the README" in the Contributing section of the manual.

Greetings,
Janneke

--
Janneke Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond https://LilyPond.org
Freelance IT https://www.JoyOfSource.com| Avatar® https://AvatarAcademy.com
L
L
Ludovic Courtès wrote on 18 Mar 03:42 -0700
Re: [bug#76963] [PATCH v2 1/2] services: Add snuik-service-type.
(name . Janneke Nieuwenhuizen)(address . janneke@gnu.org)
878qp2k4ck.fsf@gnu.org
Hello,

FWIW v2 looks great to me. :-)

Thanks,
Ludo’.
M
M
Maxim Cournoyer wrote on 20 Mar 01:00 -0700
Re: [bug#76963] Copyright ranges and Copyright holders in README [WAS Re: [bug#76963] [PATCH] home: Add home-snuik-service.], [PATCH] doc: Add note on copyright ranges to README.
(name . Ludovic Courtès)(address . ludo@gnu.org)
87ecysnnbz.fsf_-_@gmail.com
Hi Ludo,

What do you think of Janneke's proposed addition to clarify our usage of
ranges for copyright notices? I think it's a good idea, as I remember
briefly discussing 3 years ago [0]. The only downside I can see is that
I'm sure we'll be forgetting adding entries to new people using ranges
as they start doing so, and it'll get out of date quick.


--
Thanks,
Maxim
J
J
Janneke Nieuwenhuizen wrote on 20 Mar 01:25 -0700
(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
87iko42jna.fsf@gnu.org
Maxim Cournoyer writes:

Hello, Maxim, Ludo, and others,

Toggle quote (8 lines)
> What do you think of Janneke's proposed addition to clarify our usage of
> ranges for copyright notices? I think it's a good idea, as I remember
> briefly discussing 3 years ago [0]. The only downside I can see is that
> I'm sure we'll be forgetting adding entries to new people using ranges
> as they start doing so, and it'll get out of date quick.
>
> [0] https://lists.gnu.org/archive/html/guix-devel/2022-03/msg00164.html

It seems the gnu-prog-discuss has reached consensus in advising to add
this bit

+For any copyright year range specified as YYYY-ZZZZ in this package
+note that the range specifies every single year in that closed
+interval.

to the manual, so my proposal would be to add the attached patch.

Greetings,
Janneke
From 5fe8383947b8647ff6fab16971eeaf6d5eda2aa5 Mon Sep 17 00:00:00 2001
Message-ID: <5fe8383947b8647ff6fab16971eeaf6d5eda2aa5.1742459122.git.janneke@gnu.org>
From: Janneke Nieuwenhuizen <janneke@gnu.org>
Date: Wed, 12 Mar 2025 19:48:26 +0100
Subject: [PATCH] doc: Add note on copyright ranges to README.

* README (Note On Copyright Years): New section.

Change-Id: I1b2f8ed544dc83c38479e944ae6e08ddbcafdf35
---
README | 5 +++++
1 file changed, 5 insertions(+)

Toggle diff (18 lines)
diff --git a/README b/README
index b9f36f8344f..95886b3b5d9 100644
--- a/README
+++ b/README
@@ -108,3 +108,8 @@ but exposes all the API as Scheme.
- The [[https://www.gnu.org/s/gsrc/][GNU Source Release Collection]] (GSRC) is a user-land software
distribution; unlike Guix, it relies on core tools available on the
host system
+
+* Note On Copyright Years
+
+For any copyright year range specified as YYYY-ZZZZ in this package note that
+the range specifies every single year in that closed interval.

base-commit: 77ff73a920759437639e8eb77601e51409fefefa
prerequisite-patch-id: 50cbd365e2d8c64b6e4bd0c4fe447f75aa5fd2e3
--
2.48.1
--
Janneke Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond https://LilyPond.org
Freelance IT https://www.JoyOfSource.com| Avatar® https://AvatarAcademy.com
J
J
Janneke Nieuwenhuizen wrote on 20 Mar 01:33 -0700
Re: [bug#76963] [PATCH v2 1/2] services: Add snuik-service-type.
(name . Ludovic Courtès)(address . ludo@gnu.org)
87cyec2ja5.fsf@gnu.org
Ludovic Courtès writes:

Toggle quote (2 lines)
> FWIW v2 looks great to me. :-)

Thanks, pushed to master as 18f956467a7e3e35e21a9b5616025bf33f307ad7.

Greetings,
Janneke

--
Janneke Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond https://LilyPond.org
Freelance IT https://www.JoyOfSource.com| Avatar® https://AvatarAcademy.com
Closed
M
M
Maxim Cournoyer wrote on 20 Mar 05:52 -0700
Re: [bug#76963] Copyright ranges and Copyright holders in README [WAS Re: [bug#76963] [PATCH] home: Add home-snuik-service.], [PATCH] doc: Add note on copyright ranges to README., [PATCH] doc: Add note on copyright ranges to README.
(name . Janneke Nieuwenhuizen)(address . janneke@gnu.org)
87zfhfn9sz.fsf_-_@gmail.com
Hi,

Janneke Nieuwenhuizen <janneke@gnu.org> writes:

[...]

Toggle quote (9 lines)
> It seems the gnu-prog-discuss has reached consensus in advising to add
> this bit
>
> +For any copyright year range specified as YYYY-ZZZZ in this package
> +note that the range specifies every single year in that closed
> +interval.
>
> to the manual, so my proposal would be to add the attached patch.

I had come up with this variant, and thought I had already shared it,
but it seems not. Anyway, I think this variant should be useful for
newcomers as it provides an actual template and documents that
contributors copyrights are retained, and cross-references the GNU
Standards manual for more reading:
From b9156eb3ea44c64fb82b9e983593e477e0e3100f Mon Sep 17 00:00:00 2001
Message-ID: <b9156eb3ea44c64fb82b9e983593e477e0e3100f.1742474885.git.maxim.cournoyer@gmail.com>
From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Date: Thu, 13 Mar 2025 21:42:34 +0900
Subject: [PATCH] README: Mention ranges are OK in copyright notices.

Change-Id: I8495c84f9ab462bcc64dae39acca5a8460c4b200
---
README | 15 +++++++++++++++
1 file changed, 15 insertions(+)

Toggle diff (27 lines)
diff --git a/README b/README
index b9f36f8344..5c0e0e20f5 100644
--- a/README
+++ b/README
@@ -108,3 +108,18 @@ but exposes all the API as Scheme.
- The [[https://www.gnu.org/s/gsrc/][GNU Source Release Collection]] (GSRC) is a user-land software
distribution; unlike Guix, it relies on core tools available on the
host system
+
+* Copyright Notices
+
+GNU Guix is made available under the GNU GPL version 3 or later license, and
+authors retain their copyright. For copyright notices, we adhere to the
+guidance documented in (info "(maintain) Copyright Notices"), and explicitly
+allow ranges instead of individual years. Here's an example of the preferred
+style used for copyright notices in source file headers:
+
+#+begin_comment
+Copyright © 2019-2023, 2025 Your Name <your@email.com>
+#+end_comment
+
+Meaning there were copyright-able changes made for the years 2019, 2020, 2021,
+2022, 2023 and 2025.

base-commit: 77ff73a920759437639e8eb77601e51409fefefa
--
2.48.1
What do you think?

--
Thanks,
Maxim
?
Your comment

Commenting via the web interface is currently disabled.

To comment on this conversation send an email to 76963@patchwise.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 76963
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch