diff --git a/xml/Makefile.am b/xml/Makefile.am
index 5db32a6de5..e05166a546 100644
--- a/xml/Makefile.am
+++ b/xml/Makefile.am
@@ -1,147 +1,171 @@
#
# Copyright (C) 2004 Andrew Beekhof
#
# This program 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 2
# of the License, or (at your option) any later version.
#
# This program 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 this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
MAINTAINERCLEANFILES = Makefile.in
dtddir = $(CRM_DTD_DIRECTORY)
dtd_SCRIPTS = crm.dtd crm-transitional.dtd
xsltdir = $(dtddir)
xslt_SCRIPTS = upgrade06.xsl upgrade-*.xsl
RNGdir = $(dtddir)
# See Readme.md for details on updating schema files
# Sorted list of available numeric RNG versions,
# extracted from filenames like NAME-MAJOR[.MINOR][.MINOR-MINOR].rng
RNG_numeric_versions = $(shell ls -1 *.rng \
| sed -E -n -e 's/^.*-([0-9.]+).rng$$/\1/p' \
| sort -u -t. -k 1,1n -k 2,2n -k 3,3n)
# The highest numeric version
RNG_max ?= $(lastword $(RNG_numeric_versions))
-# The previous numeric version before $(RNG_max)
-RNG_last ?= $(shell ls -1 *.rng \
- | sed -n -e 's/^.*-\([0-9.]\+\).rng$$/\1/p' \
- | sort -u -t. -k 1,1nr -k 2,2nr -k 3,3nr \
- | head -n 2 | tail -n 1)
-
# A sorted list of all RNG versions (numeric and "next")
RNG_versions = next $(RNG_numeric_versions)
RNG_version_pairs = $(join \
${RNG_numeric_versions},$(addprefix \
-,$(wordlist \
2,$(words ${RNG_numeric_versions}),${RNG_numeric_versions} \
) next \
) \
)
+RNG_version_pairs_cnt = $(words ${RNG_version_pairs})
+RNG_version_pairs_last = $(wordlist \
+ $(words \
+ $(wordlist \
+ 2,${RNG_version_pairs_cnt},${RNG_version_pairs} \
+ ) \
+ ),${RNG_version_pairs_cnt},${RNG_version_pairs} \
+ )
RNG_generated = pacemaker.rng $(foreach base,$(RNG_versions),pacemaker-$(base).rng) versions.rng
RNG_cfg_base = options nodes resources constraints fencing acls tags
RNG_base = cib $(RNG_cfg_base) status score rule nvset
RNG_files = $(foreach base,$(RNG_base),$(wildcard $(base)*.rng))
# List of non-Pacemaker RNGs
RNG_extra = crm_mon.rng
RNG_SCRIPTS = $(RNG_files) $(RNG_generated) $(RNG_extra)
EXTRA_DIST = best-match.sh
-best_match = $(shell $(top_srcdir)/xml/best-match.sh $(1) $(2))
-
versions:
echo "Max: $(RNG_max)"
echo "Available: $(RNG_versions)"
versions.rng: Makefile.am
echo " RNG $@"
echo "" > $@
echo "" >> $@
echo " " >> $@
echo " " >> $@
echo " " >> $@
echo " " >> $@
echo " " >> $@
echo " none" >> $@
echo " pacemaker-0.6" >> $@
echo " transitional-0.6" >> $@
echo " pacemaker-0.7" >> $@
echo " pacemaker-1.1" >> $@
for rng in $(RNG_versions); do echo " pacemaker-$$rng" >> $@; done
echo " " >> $@
echo " " >> $@
echo " " >> $@
echo " " >> $@
echo " " >> $@
echo " " >> $@
echo " " >> $@
echo " " >> $@
echo "" >> $@
pacemaker.rng: pacemaker-$(RNG_max).rng
echo " RNG $@"
cp $(top_builddir)/xml/$< $@
pacemaker-%.rng: $(RNG_files) best-match.sh Makefile.am
echo " RNG $@"
echo "" > $@
echo "" >> $@
echo " " >> $@
echo " " >> $@
- $(top_srcdir)/xml/best-match.sh cib $(*) $(@) " "
+ ./best-match.sh cib $(*) $(@) " "
echo " " >> $@
echo " " >> $@
- for rng in $(RNG_cfg_base); do $(top_srcdir)/xml/best-match.sh $$rng $(*) $(@) " "; done
+ for rng in $(RNG_cfg_base); do ./best-match.sh $$rng $(*) $(@) " " || :; done
echo " " >> $@
echo " " >> $@
echo " " >> $@
- $(top_srcdir)/xml/best-match.sh status $(*) $(@) " "
+ ./best-match.sh status $(*) $(@) " "
echo " " >> $@
echo " " >> $@
echo " " >> $@
echo "" >> $@
-files_next = $(shell echo $(wildcard *-next.rng) | sed 's/-next.rng//g')
-files_max = $(shell echo $(wildcard *-$(RNG_max).rng) | sed 's/-[0-9][0-9.]*.rng//g')
-
-diff:
- echo "# Comparing changes in: $(RNG_max)"
- -for rng in $(files_max); do echo "### $${rng}"; diff -u `$(top_srcdir)/xml/best-match.sh $${rng} $(RNG_last)` $${rng}-$(RNG_max).rng; done
- echo -e "\n\n\n# Comparing changes since: $(RNG_max)"
- -for rng in $(files_next); do echo "### $${rng}"; diff -u `$(top_srcdir)/xml/best-match.sh $${rng} $(RNG_max)` $${rng}-next.rng; done
-
-# diff fails with ec=2 if no predecessor is found
-fulldiff:
+# diff fails with ec=2 if no predecessor is found;
+# this uses '=' GNU extension to sed, if that's not available,
+# one can use: hline=`echo "$${p}" | grep -Fn "$${hunk}" | cut -d: -f1`;
+# XXX: use line information from hunk to avoid "not detected" for ambiguity
+version_diff = \
+ @for p in $(1); do \
+ set `echo "$${p}" | tr '-' ' '`; \
+ echo "\#\#\# *-$$2.rng vs. predecessor"; \
+ for v in *-$$2.rng; do \
+ echo "\#\#\#\# $${v} vs. predecessor"; b=`echo "$${v}" | cut -d- -f1`; \
+ old=`./best-match.sh $${b} $$1`; \
+ p=`diff -u "$${old}" "$${v}" 2>/dev/null`; \
+ case $$? in \
+ 1) echo "$${p}" | sed -n -e '/^@@ /!d;=;p' \
+ -e ':l;n;/^\([- ]\|+.*<[^ />]\+\([^/>]\+="ID\|>$$\)\)/bl;s/^[+ ]\(.*\)/\1/p' \
+ | while read hline; do \
+ read h && read i || break; \
+ iline=`grep -Fn "$${i}" "$${v}" | cut -d: -f1`; \
+ ctxt="(not detected)"; \
+ if test `echo "$${iline}" | wc -l` -eq 1; then \
+ ctxt=`{ sed -n -e "1,$$(($${iline}-1))p" "$${v}"; \
+ echo "$${i}"; \
+ sed -n -e "$$(($${iline}+1)),$$ p" "$${v}"; \
+ } | $(XSLTPROC) --param skip 1 context-of.xsl -`; \
+ fi; \
+ echo "$${p}" | sed -n -e "$$(($${hline}-2)),$${hline}!d" \
+ -e '/^\(+++\|---\)/p'; \
+ echo "$${h} context: $${ctxt}"; \
+ echo "$${p}" | sed -n -e "1,$${hline}d" \
+ -e '/^\(---\|@@ \)/be;p;d;:e;n;be'; \
+ done; \
+ ;; \
+ 2) echo "\#\#\#\#\# $${v} has no predecessor";; \
+ esac; \
+ done; \
+ done
+
+diff: best-match.sh
+ @echo "# Comparing changes in + since $(RNG_max)"
+ $(call version_diff,${RNG_version_pairs_last})
+
+fulldiff: best-match.sh
@echo "# Comparing all changes across all the subsequent increments"
- @for p in ${RNG_version_pairs}; do \
- set `echo "$$p" | tr '-' ' '`; echo "### *-$$1.rng vs. predecessor"; \
- for v in *-$$2.rng; do \
- echo "#### $${v} vs. predecessor"; b=`echo "$${v}" | cut -d'-' -f1`; \
- diff -u `$(top_srcdir)/xml/best-match.sh $${b} $$1` "$${v}" 2>/dev/null; \
- test $$? -le 1 || echo "##### $${v} has no predecessor"; \
- done; \
- done
+ $(call version_diff,${RNG_version_pairs})
sync:
git rm -f $(wildcard *-next.rng)
make pacemaker-next.rng
CLEANFILES = $(RNG_generated)
diff --git a/xml/Readme.md b/xml/Readme.md
index 30e7934f08..b78e13d26b 100644
--- a/xml/Readme.md
+++ b/xml/Readme.md
@@ -1,51 +1,53 @@
# Updating schema files #
## Experimental features ##
Experimental features go into `${base}-next.rng`
Create from the most recent `${base}-${X}.${Y}.rng` if it does not already exist
## Stable features ##
The current stable version is determined at runtime when
__xml_build_schema_list() interrogates the CRM_DTD_DIRECTORY.
It will have the form `pacemaker-${X}.${Y}` and the highest
`${X}.${Y}` wins.
### Simple Additions
When the new syntax is a simple addition to the previous one, create a
new entry with `${Y} = ${Yold} + 1`
### Feature Removal or otherwise Incompatible Changes
When the new syntax is not a simple addition to the previous one,
create a new entry with `${X} = ${Xold} + 1` and `${Y} = 0`.
An XSLT file is also required that converts an old syntax to the new
one and must be named `upgrade-${Xold}.${Yold}.xsl`.
See `xml/upgrade06.xsl` for an example.
### General Proceedure
1. Copy the most recent version of `${base}-*.rng` to `${base}-${X}.${Y}.rng`
1. Commit the copy, eg. `"Clone the latest ${base} schema in preparation for changes"`.
This way the actual change will be obvious in the commit history.
1. Modify `${base}-${X}.${Y}.rng` as required
1. Add an XSLT file if required and update `xslt_SCRIPTS` in `xml/Makefile.am`
1. Commit
## Admin Tasks
New features will not be available until the admin
1. Updates all the nodes
1. Runs the equivalent of `cibadmin --upgrade`
## Random Notes
From the source directory, run `make -C xml diff` to see the changes
in the current schema (compared to the previous ones) and also the
pending changes in `pacemaker-next`.
+Alternatively, if the intention is to grok the overall historical schema
+evolution, use `make -C xml fulldiff`.
diff --git a/xml/best-match.sh b/xml/best-match.sh
index 6d9ffb7219..2ba062532e 100755
--- a/xml/best-match.sh
+++ b/xml/best-match.sh
@@ -1,46 +1,58 @@
#!/bin/sh
base=$1; shift
target=$1; shift
destination=$1; shift
prefix=$1; shift
best="0.0"
-candidates=$(ls -1 ${base}-*.rng 2>/dev/null)
-for rng in $candidates; do
- case $rng in
- ${base}-${target}.rng)
- best=${target}
- break
- ;;
- *next*)
- : skipping $rng
- ;;
- *)
- v=$(echo $rng | sed -e "s/${base}-//" -e 's/.rng//')
- : comparing $v with $target
+candidates=$(ls -1 "${base}.rng" "${base}"-*.rng 2>/dev/null)
+for rng in ${candidates}; do
+ case ${rng} in
+ ${base}-${target}.rng)
+ best=${target}
+ break
+ ;;
+ *next*)
+ : skipping ${rng}
+ ;;
+ *)
+ if [ "${rng}" = "${base}.rng" ]; then
+ # special case for nvset.rng, no -0.1 around anyway
+ v=0.1
+ else
+ v=$(echo ${rng} | sed -e "s/${base}-//" -e 's/.rng//')
+ fi
+ : comparing ${v} with ${target}
- echo | awk -v n1="$v" -v n2="${best}" '{if (n1>n2) printf ("true"); else printf ("false");}' | grep -q "true"
- if [ $? -eq 0 ]; then
- : $v beats the previous ${best} for $target
- if [ ${target} = next ]; then
- best=$v
- else
- echo | awk -v n1="$v" -v n2="${target}" '{if (n1n2) printf ("true"); else printf ("false");}' | grep -q "true"
+ if [ $? -eq 0 ]; then
+ : ${v} beats the previous ${best} for ${target}
+ if [ "${target}" = "next" ]; then
+ best=${v}
+ else
+ echo | awk -v n1="${v}" -v n2="${target}" '{if (n1" >> ${destination}
+ found=${base}-${best}.rng
+ fi
+ if [ "x${destination}" = "x" ]; then
+ echo "${found}"
+ else
+ echo "${prefix}" >> "${destination}"
fi
fi
+ret () { return $1; }; ret ${ec}
diff --git a/xml/context-of.xsl b/xml/context-of.xsl
new file mode 100644
index 0000000000..96b8c17332
--- /dev/null
+++ b/xml/context-of.xsl
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+ NOTFOUND
+
+
+
+
+
+
+
+
+
+
+
+
+ BADSTYLE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+