check.sh 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #!/bin/sh
  2. #############################################################################
  3. # Name: check.sh
  4. # Purpose: Offline checker for the buildbot configuration files
  5. # Author: Mike Wetherell
  6. # Copyright: (c) 2007 Mike Wetherell
  7. # Licence: wxWindows licence
  8. #############################################################################
  9. usage() {
  10. echo "Usage: $0 [options] FILE..."
  11. echo "Offline checker for the buildbot configuration files"
  12. echo
  13. echo "Options:"
  14. echo " -g generate xslt"
  15. echo " -h show help"
  16. echo " -l N output only line N"
  17. echo " -p preprocess"
  18. echo " -v validate"
  19. exit 0
  20. }
  21. badopt() {
  22. echo "try '$0 -h' for more information" >&2
  23. exit 1
  24. }
  25. progcheck() {
  26. prog="$1"
  27. $prog --version >/dev/null 2>&1 || {
  28. echo "$0: requires $prog, not found" >&2
  29. exit 1
  30. }
  31. }
  32. GENERATE=1
  33. PREPROCESS=2
  34. VALIDATE=3
  35. MODE=$VALIDATE
  36. FILTER=cat
  37. while getopts ghl:pv opt; do
  38. case "$opt" in
  39. \?) badopt ;;
  40. g) MODE=$GENERATE ;;
  41. h) usage ;;
  42. l) FILTER="sed -ne ${OPTARG}p" ;;
  43. p) MODE=$PREPROCESS ;;
  44. v) MODE=$VALIDATE ;;
  45. esac
  46. done
  47. if [ $OPTIND -gt 1 ]; then
  48. shift `expr $OPTIND - 1`
  49. fi
  50. if [ $# -eq 0 ]; then
  51. usage
  52. fi
  53. XSLTPROC=xsltproc
  54. XMLLINT=xmllint
  55. progcheck $XSLTPROC
  56. progcheck $XMLLINT
  57. DIR="`dirname $0`"
  58. WORKDIR="${TMPDIR:-/tmp}/wx.$$"
  59. mkdir "$WORKDIR" || exit
  60. trap 'rm -rf "$WORKDIR"' EXIT
  61. WORKPAT=`echo "$WORKDIR" | sed 's|[^A-Za-z0-9]/|.|g'`
  62. XSLT="$WORKDIR/XSLT"
  63. PREP="$WORKDIR/PREP"
  64. STDERR="$WORKDIR/STDERR"
  65. ERR=0
  66. # Filter to show lines of genertated XSLT when they are mentioned.
  67. showxslt() {
  68. awk '{
  69. print;
  70. if (sub(/.*generated XSLT line */, "") && sub(/[^0-9].*/, ""))
  71. {
  72. system("sed -ne "$0"p '$XSLT'");
  73. }
  74. }'
  75. }
  76. # Test it works as old version of awk don't have sub or system functions.
  77. if showxslt </dev/null 2>/dev/null; then
  78. SHOWXSLT=showxslt
  79. else
  80. SHOWXSLT=cat
  81. fi
  82. # Change the names of the temporary files in an error message to something
  83. # to something more informative
  84. errout()
  85. {
  86. NAME="$1"
  87. if [ -s "$STDERR" ]; then
  88. sed "s|file ${WORKPAT}|${WORKPAT}|g;\
  89. s|${WORKPAT}/XSLT|generated XSLT|g;\
  90. s|${WORKPAT}/PREP|$NAME (preprocessed)|g" "$STDERR" | $SHOWXSLT
  91. fi
  92. }
  93. output()
  94. {
  95. $FILTER "$1"
  96. }
  97. generate()
  98. {
  99. INPUT="$1"
  100. if $XSLTPROC --xinclude -o "$XSLT" $DIR/embedded.xsl "$INPUT" 2>"$STDERR" &&
  101. test \! -s "$STDERR"
  102. then
  103. if [ $MODE -eq $GENERATE ]; then
  104. output "$XSLT"
  105. fi
  106. else
  107. return 1
  108. fi
  109. }
  110. preprocess()
  111. {
  112. INPUT="$1"
  113. if [ $MODE -lt $PREPROCESS ]; then
  114. return 0
  115. fi
  116. if $XSLTPROC --xinclude -o "$PREP" "$XSLT" "$INPUT" 2>"$STDERR" &&
  117. test \! -s "$STDERR"
  118. then
  119. if [ $MODE -eq $PREPROCESS ]; then
  120. output "$PREP"
  121. fi
  122. else
  123. return 1
  124. fi
  125. }
  126. validate()
  127. {
  128. NAME="$1"
  129. if [ $MODE -lt $VALIDATE ]; then
  130. return 0
  131. fi
  132. if $XMLLINT --noout --schema $DIR/bot.xsd "$PREP" 2>"$STDERR"
  133. then
  134. errout "$NAME"
  135. else
  136. return 1
  137. fi
  138. }
  139. while [ $# -gt 0 ]; do
  140. INPUT="$1"
  141. NAME="`echo \"$INPUT\" | sed 's/[|\]/\\\&/g'`"
  142. {
  143. generate "$INPUT" &&
  144. preprocess "$INPUT" &&
  145. validate "$NAME"
  146. } || {
  147. errout "$NAME" >&2
  148. ERR=1
  149. }
  150. rm -f "$XSLT" "$PREP" "$STDERR"
  151. shift
  152. done
  153. exit $ERR