diff --git a/Makefile.am b/Makefile.am index fd368d7493..3113e6b042 100644 --- a/Makefile.am +++ b/Makefile.am @@ -557,6 +557,7 @@ EXTRA_DIST += \ build-aux/cuirass/guix-modular.scm \ build-aux/cuirass/hydra-to-cuirass.scm \ build-aux/check-final-inputs-self-contained.scm \ + build-aux/check-channel-news.scm \ build-aux/compile-as-derivation.scm \ build-aux/generate-authors.scm \ build-aux/git-authenticate.scm \ @@ -885,6 +886,11 @@ assert-final-inputs-self-contained: $(GOBJECTS) $(AM_V_at)$(top_builddir)/pre-inst-env "$(GUILE)" \ "$(top_srcdir)/build-aux/check-final-inputs-self-contained.scm" +# Validate channel news. +check-channel-news: $(GOBJECTS) + $(AM_V_at)$(top_builddir)/pre-inst-env "$(GUILE)" \ + "$(top_srcdir)/build-aux/check-channel-news.scm" + # Compute the Hydra jobs and write them in the target file. hydra-jobs.scm: $(GOBJECTS) $(AM_V_at)$(MKDIR_P) "`dirname "$@"`" @@ -904,7 +910,7 @@ cuirass-jobs.scm: $(GOBJECTS) .PHONY: gen-ChangeLog gen-AUTHORS gen-tarball-version .PHONY: assert-no-store-file-names assert-binaries-available -.PHONY: assert-final-inputs-self-contained +.PHONY: assert-final-inputs-self-contained check-channel-news .PHONY: clean-go make-go as-derivation authenticate .PHONY: update-guix-package update-NEWS release diff --git a/build-aux/check-channel-news.scm b/build-aux/check-channel-news.scm new file mode 100644 index 0000000000..eb7b89e437 --- /dev/null +++ b/build-aux/check-channel-news.scm @@ -0,0 +1,82 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2020 Ludovic Courtès +;;; +;;; 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 . + +;;; +;;; Validate 'etc/news.scm'. +;;; + +(use-modules (git) + (guix git) + (guix ui) + (guix channels) + (srfi srfi-26) + (ice-9 match)) + +;; XXX: These two things are currently private. +(define read-channel-news (@@ (guix channels) read-channel-news)) +(define channel-news-entries (cut struct-ref <> 0)) + +(define (all-the-news directory) + "Return the read from DIRECTORY, a checkout of the 'guix' +channel." + (call-with-input-file (string-append directory "/etc/news.scm") + read-channel-news)) + +(define (validate-texinfo str type language) + "Parse STR as a Texinfo fragment and raise an error if that fails." + (catch #t + (lambda () + (texi->plain-text str)) + (lambda (key . args) + (print-exception (current-error-port) #f key args) + (report-error (G_ "the Texinfo snippet below is invalid (~a, ~a):~%") + type language) + (display str (current-error-port)) + (exit 1)))) + +(define (validate-news-entry repository entry) + "Validate ENTRY, a , making sure it refers to an +existent commit of REPOSITORY and contains only valid Texinfo." + (catch 'git-error + (lambda () + (let ((commit (commit-lookup repository + (string->oid + (channel-news-entry-commit entry))))) + (for-each (match-lambda + ((language . title) + (validate-texinfo title 'title language))) + (channel-news-entry-title entry)) + (for-each (match-lambda + ((language . body) + (validate-texinfo body 'body language))) + (channel-news-entry-body entry)))) + (lambda (key error . rest) + (if (= GIT_ENOTFOUND (git-error-code error)) + (leave (G_ "commit '~a' of entry '~a' does not exist~%") + (channel-news-entry-commit entry) + (channel-news-entry-title entry)) + (apply throw key error rest))))) + +(let* ((this-directory (dirname (current-filename))) + (top-directory (string-append this-directory "/..")) + (entries (channel-news-entries (all-the-news top-directory)))) + (with-repository top-directory repository + (for-each (cut validate-news-entry repository <>) + entries) + (info (G_ "All ~a channel news entries are valid.~%") + (length entries)))) diff --git a/doc/contributing.texi b/doc/contributing.texi index 44bec00236..7b1f7e7c94 100644 --- a/doc/contributing.texi +++ b/doc/contributing.texi @@ -1278,6 +1278,14 @@ When pushing a commit on behalf of somebody else, please add a with @command{git am --signoff}. This improves tracking of who did what. +When adding channel news entries (@pxref{Channels, Writing Channel +News}), make sure they are well-formed by running the following command +right before pushing: + +@example +make check-channel-news +@end example + For anything else, please post to @email{guix-patches@@gnu.org} and leave time for a review, without committing anything (@pxref{Submitting Patches}). If you didn’t receive any reply after two weeks, and if