nixos/doc/manual: print context on failing xmllint validation
Previously only the line numbers of a giant, internally generated XML file were printed, without any kind of debuggability. Now at least the mentioned lines are printed with a little bit of surrounding context (to have something to grep for). ``` manual-combined.xml:4863: element para: Relax-NG validity error : Did not expect element para there 4859 <chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude" version="5.0" xml:id="sec-writing-modules"> 4860 4861 <title>Writing NixOS Modules</title> 4862 4863 <para>NixOS has a modular system for declarative configuration. This 4864 system combines multiple <emphasis>modules</emphasis> to produce the 4865 full system configuration. One of the modules that constitute the ```
This commit is contained in:
parent
7381a197f4
commit
f09f49d483
@ -106,13 +106,43 @@ let
|
|||||||
xmllint --xinclude --noxincludenode \
|
xmllint --xinclude --noxincludenode \
|
||||||
--output ./man-pages-combined.xml ./man-pages.xml
|
--output ./man-pages-combined.xml ./man-pages.xml
|
||||||
|
|
||||||
xmllint --debug --noout --nonet \
|
# outputs the context of an xmllint error output
|
||||||
--relaxng ${docbook5}/xml/rng/docbook/docbook.rng \
|
# LEN lines around the failing line are printed
|
||||||
manual-combined.xml
|
function context {
|
||||||
xmllint --debug --noout --nonet \
|
# length of context
|
||||||
--relaxng ${docbook5}/xml/rng/docbook/docbook.rng \
|
local LEN=6
|
||||||
man-pages-combined.xml
|
# lines to print before error line
|
||||||
|
local BEFORE=4
|
||||||
|
|
||||||
|
# xmllint output lines are:
|
||||||
|
# file.xml:1234: there was an error on line 1234
|
||||||
|
while IFS=':' read -r file line rest; do
|
||||||
|
echo
|
||||||
|
if [[ -n "$rest" ]]; then
|
||||||
|
echo "$file:$line:$rest"
|
||||||
|
local FROM=$(($line>$BEFORE ? $line - $BEFORE : 1))
|
||||||
|
# number lines & filter context
|
||||||
|
nl --body-numbering=a "$file" | sed -n "$FROM,+$LEN p"
|
||||||
|
else
|
||||||
|
if [[ -n "$line" ]]; then
|
||||||
|
echo "$file:$line"
|
||||||
|
else
|
||||||
|
echo "$file"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function lintrng {
|
||||||
|
xmllint --debug --noout --nonet \
|
||||||
|
--relaxng ${docbook5}/xml/rng/docbook/docbook.rng \
|
||||||
|
"$1" \
|
||||||
|
2>&1 | context 1>&2
|
||||||
|
# ^ redirect assumes xmllint doesn’t print to stdout
|
||||||
|
}
|
||||||
|
|
||||||
|
lintrng manual-combined.xml
|
||||||
|
lintrng man-pages-combined.xml
|
||||||
|
|
||||||
mkdir $out
|
mkdir $out
|
||||||
cp manual-combined.xml $out/
|
cp manual-combined.xml $out/
|
||||||
|
Loading…
Reference in New Issue
Block a user