[PATCH 0/5] Update mcron to latest commit

  • Done
  • quality assurance status badge
Details
2 participants
  • Ludovic Courtès
  • Maxim Cournoyer
Owner
unassigned
Submitted by
Maxim Cournoyer
Severity
normal
M
M
Maxim Cournoyer wrote on 29 Oct 2022 05:47
(address . guix-patches@gnu.org)(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
20221029034716.11125-1-maxim.cournoyer@gmail.com
Hi,

This update mcrons to its latest commit, which includes these changes:

Toggle snippet (13 lines)
5fd0ccd * origin/master tests: Check (mcron vixie-specification)
d1a3e83 * vixie-time: Remove calls to 'pk' debugging facility
19ba0a8 * Lose hope of running against guile 2.2 or earlier.
e2ecb80 * Give mcron --log option to turn logging on.
a7a456c * base: Annotate output with job information.
9e99490 * Revert "Minor cosmetic simplification of case logic after previous patch."
d5c021e * documentation: extensive editing of info manual after a note from Paul Vixie.
99a26e5 * Minor cosmetic simplification of case logic after previous patch.
8b27157 * base: Handle nonexistent user home directories.
271b1f2 * Clarify an error message
172f70e * documentation: Bug fix in a simple example.

The one "base: Annotate output with job information." one gives us better logging capability,
such as when a job is started and when it finishes, and its completion status:

Toggle snippet (10 lines)
2022-10-28 22:55:00 5185 duckdns-update: completed in 0.349s
2022-10-28 23:00:00 6547 duckdns-update: running...
2022-10-28 23:00:00 6548 btrbk: running...
2022-10-28 23:00:00 6547 duckdns-update: completed in 0.350s
2022-10-28 23:05:01 7764 duckdns-update: running...
2022-10-28 23:05:01 7764 duckdns-update: completed in 0.417s
2022-10-28 23:10:00 8315 duckdns-update: running...
2022-10-28 23:10:00 8315 duckdns-update: completed in 0.454s

We now see the pid, job name and some message about the current status
(running/completed/failed).

I hope you like it!

Maxim Cournoyer (5):
services: configuration: Re-order generated record fields.
services: mcron: Add log? and log-format fields to mcron-configuration.
gnu: mcron: Use gexps and strip trailing #t.
gnu: Remove guile2.2-mcron.
gnu: mcron: Update to 1.2.1-0.5fd0ccd.

doc/guix.texi | 45 +++++++++++++----
gnu/home/services/mcron.scm | 47 +++++++++++++----
gnu/packages/guile-xyz.scm | 92 +++++++++++++++++-----------------
gnu/services/configuration.scm | 10 ++--
gnu/services/mcron.scm | 47 +++++++++++++----
gnu/services/monitoring.scm | 4 +-
6 files changed, 162 insertions(+), 83 deletions(-)

--
2.37.3
M
M
Maxim Cournoyer wrote on 29 Oct 2022 06:16
[PATCH 1/5] services: configuration: Re-order generated record fields.
(address . 58855@debbugs.gnu.org)(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
20221029041649.12144-1-maxim.cournoyer@gmail.com
This is so that the first field of the generated record matches the first one
declared, which makes 'define-configuration' record API compatible with
define-record-type* ones.

* gnu/services/configuration.scm (define-configuration-helper): Move the
%location field below the ones declared by the user.
* gnu/services/monitoring.scm (zabbix-front-end-config): Adjust match pattern
accordingly.
---
gnu/services/configuration.scm | 10 +++++-----
gnu/services/monitoring.scm | 4 ++--
2 files changed, 7 insertions(+), 7 deletions(-)

Toggle diff (44 lines)
diff --git a/gnu/services/configuration.scm b/gnu/services/configuration.scm
index 636c49ccba..dacfc52ba9 100644
--- a/gnu/services/configuration.scm
+++ b/gnu/services/configuration.scm
@@ -242,17 +242,17 @@ (define-record-type* #,(id #'stem #'< #'stem #'>)
stem
#,(id #'stem #'make- #'stem)
#,(id #'stem #'stem #'?)
- (%location #,(id #'stem #'stem #'-location)
- (default (and=> (current-source-location)
- source-properties->location))
- (innate))
#,@(map (lambda (name getter def)
#`(#,name #,getter (default #,def)
(sanitize
#,(id #'stem #'validate- #'stem #'- name))))
#'(field ...)
#'(field-getter ...)
- #'(field-default ...)))
+ #'(field-default ...))
+ (%location #,(id #'stem #'stem #'-location)
+ (default (and=> (current-source-location)
+ source-properties->location))
+ (innate)))
(define #,(id #'stem #'stem #'-fields)
(list (configuration-field
diff --git a/gnu/services/monitoring.scm b/gnu/services/monitoring.scm
index 9c8704092c..b19c6c9f18 100644
--- a/gnu/services/monitoring.scm
+++ b/gnu/services/monitoring.scm
@@ -622,8 +622,8 @@ (define-configuration zabbix-front-end-configuration
(define (zabbix-front-end-config config)
(match-record config <zabbix-front-end-configuration>
- (%location db-host db-port db-name db-user db-password db-secret-file
- zabbix-host zabbix-port)
+ (db-host db-port db-name db-user db-password db-secret-file
+ zabbix-host zabbix-port %location)
(mixed-text-file "zabbix.conf.php"
"\
<?php
--
2.37.3
M
M
Maxim Cournoyer wrote on 29 Oct 2022 06:16
[PATCH 2/5] services: mcron: Add log? and log-format fields to mcron-configuration.
(address . 58855@debbugs.gnu.org)(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
20221029041649.12144-2-maxim.cournoyer@gmail.com
* gnu/services/mcron.scm (list-of-gexps?): New predicate.
(mcron-configuration): Rewrite using define-configuration.
[log?, log-format]: New fields.
(mcron-shepherd-services): Invoke mcron with the --log and --log-format
arguments when log? is #t,
(generate-doc): New procedure.
* doc/guix.texi (Scheduled Job Execution): Update doc.
(Mcron Home Service): Likewise.
* gnu/home/services/mcron.scm: Keep in sync with the above changes to
gnu/services/mcron.scm.
---
doc/guix.texi | 45 ++++++++++++++++++++++++++++-------
gnu/home/services/mcron.scm | 47 ++++++++++++++++++++++++++++---------
gnu/services/mcron.scm | 47 ++++++++++++++++++++++++++++---------
3 files changed, 108 insertions(+), 31 deletions(-)

Toggle diff (283 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index 80fb3bc47f..aadd16dd53 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -18994,20 +18994,33 @@ words, it is possible to define services that provide additional mcron
jobs to run.
@end defvr
+@c Generated via (generate-documentation) at the bottom of (gnu services
+@c mcron).
+@c %start of fragment
@deftp {Data Type} mcron-configuration
-Data type representing the configuration of mcron.
+Available @code{mcron-configuration} fields are:
@table @asis
-@item @code{mcron} (default: @var{mcron})
+@item @code{mcron} (default: @code{mcron}) (type: file-like)
The mcron package to use.
-@item @code{jobs}
+@item @code{jobs} (default: @code{()}) (type: list-of-gexps)
This is a list of gexps (@pxref{G-Expressions}), where each gexp
corresponds to an mcron job specification (@pxref{Syntax, mcron job
-specifications,, mcron, GNU@tie{}mcron}).
+specifications,, mcron,GNU@tie{}mcron}).
+
+@item @code{log?} (default: @code{#t}) (type: boolean)
+Log messages to standard output.
+
+@item @code{log-format} (default: @code{"~1@@*~a ~a: ~a~%"}) (type: string)
+@code{(ice-9 format)} format string for log messages. The default value
+produces messages like "@samp{@var{pid} @var{name}: @var{message}"}
+(@pxref{Invoking mcron, Invoking,, mcron,GNU@tie{}mcron}). Each message
+is also prefixed by a timestamp by GNU Shepherd.
+
@end table
@end deftp
-
+@c %end of fragment
@node Log Rotation
@subsection Log Rotation
@@ -41015,18 +41028,32 @@ jobs to run.
@end defvr
@deftp {Data Type} home-mcron-configuration
-Data type representing the configuration of mcron.
+Available @code{home-mcron-configuration} fields are:
+@c Auto-generated with (gnu home services mcron)'s
+@c generate-documentation procedure.
+@c %start of fragment
@table @asis
-@item @code{mcron} (default: @var{mcron})
+@item @code{mcron} (default: @code{mcron}) (type: file-like)
The mcron package to use.
-@item @code{jobs}
+@item @code{jobs} (default: @code{()}) (type: list-of-gexps)
This is a list of gexps (@pxref{G-Expressions}), where each gexp
corresponds to an mcron job specification (@pxref{Syntax, mcron job
-specifications,, mcron, GNU@tie{}mcron}).
+specifications,, mcron,GNU@tie{}mcron}).
+
+@item @code{log?} (default: @code{#t}) (type: boolean)
+Log messages to standard output.
+
+@item @code{log-format} (default: @code{"~1@@*~a ~a: ~a~%"}) (type: string)
+@code{(ice-9 format)} format string for log messages. The default value
+produces messages like "@samp{@var{pid} @var{name}: @var{message}"}
+(@pxref{Invoking mcron, Invoking,, mcron,GNU@tie{}mcron}). Each message
+is also prefixed by a timestamp by GNU Shepherd.
+
@end table
@end deftp
+@c %end of fragment
@node Power Management Home Services
@subsection Power Management Home Services
diff --git a/gnu/home/services/mcron.scm b/gnu/home/services/mcron.scm
index 0b3dbb810b..1d294a997c 100644
--- a/gnu/home/services/mcron.scm
+++ b/gnu/home/services/mcron.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2021 Andrew Tropin <andrew@trop.in>
;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
+;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -20,6 +21,7 @@
(define-module (gnu home services mcron)
#:use-module (gnu packages guile-xyz)
#:use-module (gnu home services)
+ #:use-module (gnu services configuration)
#:use-module (gnu services shepherd)
#:use-module (gnu home services shepherd)
#:use-module (guix records)
@@ -53,13 +55,23 @@ (define-module (gnu home services mcron)
;;
;;; Code:
-(define-record-type* <home-mcron-configuration> home-mcron-configuration
- make-home-mcron-configuration
- home-mcron-configuration?
- (package home-mcron-configuration-package ; package
- (default mcron))
- (jobs home-mcron-configuration-jobs ; list of jobs
- (default '())))
+(define list-of-gexps?
+ (list-of gexp?))
+
+(define-configuration/no-serialization home-mcron-configuration
+ (mcron (file-like mcron) "The mcron package to use.")
+ (jobs
+ (list-of-gexps '())
+ "This is a list of gexps (@pxref{G-Expressions}), where each gexp
+corresponds to an mcron job specification (@pxref{Syntax, mcron job
+specifications,, mcron, GNU@tie{}mcron}).")
+ (log? (boolean #t) "Log messages to standard output.")
+ (log-format
+ (string "~1@*~a ~a: ~a~%")
+ "@code{(ice-9 format)} format string for log messages. The default value
+produces messages like \"@samp{@var{pid} @var{name}:
+@var{message}\"} (@pxref{Invoking mcron, Invoking,, mcron, GNU@tie{}mcron}).
+Each message is also prefixed by a timestamp by GNU Shepherd."))
(define job-files (@@ (gnu services mcron) job-files))
(define shepherd-schedule-action
@@ -69,19 +81,23 @@ (define home-mcron-shepherd-services
(match-lambda
(($ <home-mcron-configuration> mcron '()) ; no jobs to run
'())
- (($ <home-mcron-configuration> mcron jobs)
+ (($ <home-mcron-configuration> mcron jobs log? log-format)
(let ((files (job-files mcron jobs)))
(list (shepherd-service
(documentation "User cron jobs.")
(provision '(mcron))
(modules `((srfi srfi-1)
(srfi srfi-26)
- (ice-9 popen) ; for the 'schedule' action
+ (ice-9 popen) ; for the 'schedule' action
(ice-9 rdelim)
(ice-9 match)
,@%default-modules))
(start #~(make-forkexec-constructor
- (list #$(file-append mcron "/bin/mcron") #$@files)
+ (list (string-append #$mcron "/bin/mcron")
+ #$@(if log?
+ #~("--log" "--log-format" #$log-format)
+ #~())
+ #$@files)
#:log-file (string-append
(or (getenv "XDG_LOG_HOME")
(format #f "~a/.local/var/log"
@@ -91,7 +107,7 @@ (define home-mcron-shepherd-services
(actions
(list (shepherd-schedule-action mcron files)))))))))
-(define home-mcron-profile (compose list home-mcron-configuration-package))
+(define home-mcron-profile (compose list home-mcron-configuration-mcron))
(define (home-mcron-extend config jobs)
(home-mcron-configuration
@@ -113,3 +129,12 @@ (define home-mcron-service-type
(default-value (home-mcron-configuration))
(description
"Install and configure the GNU mcron cron job manager.")))
+
+
+;;;
+;;; Generate documentation.
+;;;
+(define (generate-doc)
+ (configuration->documentation 'home-mcron-configuration))
+
+;;; mcron.scm ends here
diff --git a/gnu/services/mcron.scm b/gnu/services/mcron.scm
index 23760ebda4..52332d6123 100644
--- a/gnu/services/mcron.scm
+++ b/gnu/services/mcron.scm
@@ -1,5 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016, 2017, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -18,6 +19,7 @@
(define-module (gnu services mcron)
#:use-module (gnu services)
+ #:use-module (gnu services configuration)
#:use-module (gnu services shepherd)
#:use-module (gnu packages guile-xyz)
#:use-module (guix deprecation)
@@ -30,6 +32,8 @@ (define-module (gnu services mcron)
mcron-configuration?
mcron-configuration-mcron
mcron-configuration-jobs
+ mcron-configuration-log?
+ mcron-configuration-log-format
mcron-service-type))
@@ -48,13 +52,23 @@ (define-module (gnu services mcron)
;;;
;;; Code:
-(define-record-type* <mcron-configuration> mcron-configuration
- make-mcron-configuration
- mcron-configuration?
- (mcron mcron-configuration-mcron ;file-like
- (default mcron))
- (jobs mcron-configuration-jobs ;list of <mcron-job>
- (default '())))
+(define list-of-gexps?
+ (list-of gexp?))
+
+(define-configuration/no-serialization mcron-configuration
+ (mcron (file-like mcron) "The mcron package to use.")
+ (jobs
+ (list-of-gexps '())
+ "This is a list of gexps (@pxref{G-Expressions}), where each gexp
+corresponds to an mcron job specification (@pxref{Syntax, mcron job
+specifications,, mcron, GNU@tie{}mcron}).")
+ (log? (boolean #t) "Log messages to standard output.")
+ (log-format
+ (string "~1@*~a ~a: ~a~%")
+ "@code{(ice-9 format)} format string for log messages. The default value
+produces messages like \"@samp{@var{pid} @var{name}:
+@var{message}\"} (@pxref{Invoking mcron, Invoking,, mcron, GNU@tie{}mcron}).
+Each message is also prefixed by a timestamp by GNU Shepherd."))
(define (job-files mcron jobs)
"Return a list of file-like object for JOBS, a list of gexps."
@@ -124,21 +138,25 @@ (define (shepherd-schedule-action mcron files)
(define mcron-shepherd-services
(match-lambda
- (($ <mcron-configuration> mcron ()) ;nothing to do!
+ (($ <mcron-configuration> mcron ()) ;nothing to do!
'())
- (($ <mcron-configuration> mcron jobs)
+ (($ <mcron-configuration> mcron jobs log? log-format)
(let ((files (job-files mcron jobs)))
(list (shepherd-service
(provision '(mcron))
(requirement '(user-processes))
(modules `((srfi srfi-1)
(srfi srfi-26)
- (ice-9 popen) ;for the 'schedule' action
+ (ice-9 popen) ;for the 'schedule' action
(ice-9 rdelim)
(ice-9 match)
,@%default-modules))
(start #~(make-forkexec-constructor
- (list (string-append #$mcron "/bin/mcron") #$@files)
+ (list (string-append #$mcron "/bin/mcron")
+ #$@(if log?
+ #~("--log" "--log-format" #$log-format)
+ #~())
+ #$@files)
;; Disable auto-compilation of the job files and set a
;; sane value for 'PATH'.
@@ -172,4 +190,11 @@ (define mcron-service-type
jobs)))))
(default-value (mcron-configuration)))) ;empty job list
+
+;;;
+;;; Generate documentation.
+;;;
+(define (generate-doc)
+ (configuration->documentation 'mcron-configuration))
+
;;; mcron.scm ends here
--
2.37.3
M
M
Maxim Cournoyer wrote on 29 Oct 2022 06:16
[PATCH 3/5] gnu: mcron: Use gexps and strip trailing #t.
(address . 58855@debbugs.gnu.org)(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
20221029041649.12144-3-maxim.cournoyer@gmail.com
* gnu/packages/guile-xyz.scm (mcron)
[phases]: Use gexps and strip trailing #t.
---
gnu/packages/guile-xyz.scm | 41 +++++++++++++++++++-------------------
1 file changed, 20 insertions(+), 21 deletions(-)

Toggle diff (54 lines)
diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm
index 209ba694d7..1b41eb24af 100644
--- a/gnu/packages/guile-xyz.scm
+++ b/gnu/packages/guile-xyz.scm
@@ -2667,27 +2667,26 @@ (define-public mcron
"0bkn235g2ia4f7ispr9d55c7bc18282r3qd8ldhh5q2kiin75zi0"))))
(build-system gnu-build-system)
(arguments
- '(#:phases (modify-phases %standard-phases
- (add-before 'check 'adjust-tests
- (lambda _
- (substitute* "tests/job-specifier.scm"
- ;; (getpw) fails with "entry not found" in the build
- ;; environment, so pass an argument.
- (("\\(getpw\\)")
- "(getpwnam (getuid))")
- ;; The build environment lacks an entry for root in
- ;; /etc/passwd.
- (("\\(getpw 0\\)")
- "(getpwnam \"nobody\")")
-
- ;; FIXME: Skip the 4 faulty tests (see above).
- (("\\(test-equal \"next-year\"" all)
- (string-append "(test-skip 4)\n" all)))
- #t)))))
- (native-inputs `(("pkg-config" ,pkg-config)
- ("tzdata" ,tzdata-for-tests)
- ("guile-native" ;for 'guild compile'
- ,@(assoc-ref (package-inputs this-package) "guile"))))
+ (list
+ #:phases #~(modify-phases %standard-phases
+ (add-before 'check 'adjust-tests
+ (lambda _
+ (substitute* "tests/job-specifier.scm"
+ ;; (getpw) fails with "entry not found" in the build
+ ;; environment, so pass an argument.
+ (("\\(getpw\\)")
+ "(getpwnam (getuid))")
+ ;; The build environment lacks an entry for root in
+ ;; /etc/passwd.
+ (("\\(getpw 0\\)")
+ "(getpwnam \"nobody\")")
+ ;; FIXME: Skip the 4 faulty tests (see above).
+ (("\\(test-equal \"next-year\"" all)
+ (string-append "(test-skip 4)\n" all))))))))
+ (native-inputs (list guile-3.0 ;for 'guild compile'
+ pkg-config
+ tzdata-for-tests))
+
(inputs (list guile-3.0))
(home-page "https://www.gnu.org/software/mcron/")
(synopsis "Run jobs at scheduled times")
--
2.37.3
M
M
Maxim Cournoyer wrote on 29 Oct 2022 06:16
[PATCH 4/5] gnu: Remove guile2.2-mcron.
(address . 58855@debbugs.gnu.org)(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
20221029041649.12144-4-maxim.cournoyer@gmail.com
* gnu/packages/guile-xyz.scm (guile2.2-mcron): Delete variable.
---
gnu/packages/guile-xyz.scm | 6 ------
1 file changed, 6 deletions(-)

Toggle diff (19 lines)
diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm
index 1b41eb24af..41f93df155 100644
--- a/gnu/packages/guile-xyz.scm
+++ b/gnu/packages/guile-xyz.scm
@@ -2697,12 +2697,6 @@ (define-public mcron
format is also supported.")
(license license:gpl3+)))
-(define-public guile2.2-mcron
- (package
- (inherit mcron)
- (name "guile2.2-mcron")
- (inputs (list guile-2.2))))
-
(define-public guile-picture-language
(let ((commit "a1322bf11945465241ca5b742a70893f24156d12")
(revision "5"))
--
2.37.3
M
M
Maxim Cournoyer wrote on 29 Oct 2022 06:16
[PATCH 5/5] gnu: mcron: Update to 1.2.1-0.5fd0ccd.
(address . 58855@debbugs.gnu.org)(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
20221029041649.12144-5-maxim.cournoyer@gmail.com
* gnu/packages/guile-xyz.scm (mcron): Update to 1.2.1-0.5fd0ccd.
[native-inputs]: Add autoconf, automake, help2man, and texinfo.
---
gnu/packages/guile-xyz.scm | 85 +++++++++++++++++++++-----------------
1 file changed, 47 insertions(+), 38 deletions(-)

Toggle diff (101 lines)
diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm
index 41f93df155..fd2a26d3a5 100644
--- a/gnu/packages/guile-xyz.scm
+++ b/gnu/packages/guile-xyz.scm
@@ -2655,47 +2655,56 @@ (define-public guile2.0-commonmark
(inputs (list guile-2.0))))
(define-public mcron
- (package
- (name "mcron")
- (version "1.2.1")
- (source (origin
- (method url-fetch)
- (uri (string-append "mirror://gnu/mcron/mcron-"
- version ".tar.gz"))
- (sha256
- (base32
- "0bkn235g2ia4f7ispr9d55c7bc18282r3qd8ldhh5q2kiin75zi0"))))
- (build-system gnu-build-system)
- (arguments
- (list
- #:phases #~(modify-phases %standard-phases
- (add-before 'check 'adjust-tests
- (lambda _
- (substitute* "tests/job-specifier.scm"
- ;; (getpw) fails with "entry not found" in the build
- ;; environment, so pass an argument.
- (("\\(getpw\\)")
- "(getpwnam (getuid))")
- ;; The build environment lacks an entry for root in
- ;; /etc/passwd.
- (("\\(getpw 0\\)")
- "(getpwnam \"nobody\")")
- ;; FIXME: Skip the 4 faulty tests (see above).
- (("\\(test-equal \"next-year\"" all)
- (string-append "(test-skip 4)\n" all))))))))
- (native-inputs (list guile-3.0 ;for 'guild compile'
- pkg-config
- tzdata-for-tests))
-
- (inputs (list guile-3.0))
- (home-page "https://www.gnu.org/software/mcron/")
- (synopsis "Run jobs at scheduled times")
- (description
- "GNU Mcron is a complete replacement for Vixie cron. It is used to run
+ ;; Use the latest commits, as interesting changes haven't been released yet,
+ ;; such as improved logging.
+ (let ((revision "0")
+ (commit "5fd0ccde5a4cff70299999f988e6b5166584814d"))
+ (package
+ (name "mcron")
+ (version (git-version "1.2.1" revision commit))
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://git.savannah.gnu.org/git/mcron.git")
+ (commit commit)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0jl2w67a5hkphzssdzq3q4jcwv2b174b11d3w5i3khxq2vhzd6kk"))))
+ (build-system gnu-build-system)
+ (arguments
+ (list
+ #:phases #~(modify-phases %standard-phases
+ (add-before 'check 'adjust-tests
+ (lambda _
+ (substitute* "tests/job-specifier.scm"
+ ;; (getpw) fails with "entry not found" in the build
+ ;; environment, so pass an argument.
+ (("\\(getpw\\)")
+ "(getpwnam (getuid))")
+ ;; The build environment lacks an entry for root in
+ ;; /etc/passwd.
+ (("\\(getpw 0\\)")
+ "(getpwnam \"nobody\")")
+ ;; FIXME: Skip the 4 faulty tests (see above).
+ (("\\(test-equal \"next-year\"" all)
+ (string-append "(test-skip 4)\n" all))))))))
+ (native-inputs (list autoconf
+ automake
+ guile-3.0 ;for 'guild compile'
+ help2man
+ pkg-config
+ tzdata-for-tests
+ texinfo))
+ (inputs (list guile-3.0))
+ (home-page "https://www.gnu.org/software/mcron/")
+ (synopsis "Run jobs at scheduled times")
+ (description
+ "GNU Mcron is a complete replacement for Vixie cron. It is used to run
tasks on a schedule, such as every hour or every Monday. Mcron is written in
Guile, so its configuration can be written in Scheme; the original cron
format is also supported.")
- (license license:gpl3+)))
+ (license license:gpl3+))))
(define-public guile-picture-language
(let ((commit "a1322bf11945465241ca5b742a70893f24156d12")
--
2.37.3
M
M
Maxim Cournoyer wrote on 16 Nov 2022 01:50
control message for bug #58855
(address . control@debbugs.gnu.org)
87v8nflo3m.fsf@gmail.com
close 58855
quit
L
L
Ludovic Courtès wrote on 17 Nov 2022 23:37
Layout of ‘define-configuration’ records
(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)
87zgcpdx6q.fsf_-_@gnu.org
Hi,

Maxim Cournoyer <maxim.cournoyer@gmail.com> skribis:

Toggle quote (9 lines)
> This is so that the first field of the generated record matches the first one
> declared, which makes 'define-configuration' record API compatible with
> define-record-type* ones.
>
> * gnu/services/configuration.scm (define-configuration-helper): Move the
> %location field below the ones declared by the user.
> * gnu/services/monitoring.scm (zabbix-front-end-config): Adjust match pattern
> accordingly.

[...]

Toggle quote (22 lines)
> +++ b/gnu/services/configuration.scm
> @@ -242,17 +242,17 @@ (define-record-type* #,(id #'stem #'< #'stem #'>)
> stem
> #,(id #'stem #'make- #'stem)
> #,(id #'stem #'stem #'?)
> - (%location #,(id #'stem #'stem #'-location)
> - (default (and=> (current-source-location)
> - source-properties->location))
> - (innate))
> #,@(map (lambda (name getter def)
> #`(#,name #,getter (default #,def)
> (sanitize
> #,(id #'stem #'validate- #'stem #'- name))))
> #'(field ...)
> #'(field-getter ...)
> - #'(field-default ...)))
> + #'(field-default ...))
> + (%location #,(id #'stem #'stem #'-location)
> + (default (and=> (current-source-location)
> + source-properties->location))
> + (innate)))

Moving the field last is problematic as we’ve seen for any user that
uses ‘match’ on records—something that’s not recommended but still used
a lot.

Toggle quote (7 lines)
> (define (zabbix-front-end-config config)
> (match-record config <zabbix-front-end-configuration>
> - (%location db-host db-port db-name db-user db-password db-secret-file
> - zabbix-host zabbix-port)
> + (db-host db-port db-name db-user db-password db-secret-file
> + zabbix-host zabbix-port %location)

This change has no effect because ‘match-record’ matches fields by name,
precisely to avoid problems when changing the layout of record types.

I’m not sure what was meant by “compatible” in the commit log; how
fields are laid out is something user code should not be aware of.

The only thing to keep in mind is that records must not be matched with
‘match’ because then the code silently breaks when the record type
layout is changed. This is why ‘match-record’ was introduced:


One last thing: placing ‘%location’ first can let us implement:

(define (configuration-location config)
(struct-ref config 0))

As if there were type inheritance. I didn’t see any indication that
this is actually done anywhere, but it could have been the case (it’s
not an unusual pattern) and it’s still something we might want to do.

Does that make sense?

Thanks,
Ludo’.
?