]> git.saurik.com Git - wxWidgets.git/blob - build/buildbot/config/include/defs.xml
fix preprocessor expression, closes #12822
[wxWidgets.git] / build / buildbot / config / include / defs.xml
1 <?xml version="1.0" encoding="utf-8"?>
2
3 <!--
4 Name: include/defs.xml
5 Purpose: Common declarations for buildbot
6 Author: Mike Wetherell
7 RCS-ID: $Id$
8 Copyright: (c) 2007 Mike Wetherell
9 Licence: wxWindows licence
10 -->
11
12 <bot xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
13 xmlns:exsl="http://exslt.org/common"
14 xmlns:func="http://exslt.org/functions"
15 xmlns:get="local"
16 xsl:extension-element-prefixes="func"
17 xsl:version="1.0">
18
19 <!--
20 Constants
21 -->
22 <xsl:template name="SVN_URL">http://svn.wxwidgets.org/svn/wx/wxWidgets/</xsl:template>
23 <xsl:template name="STABLE_BRANCH">branches/WX_2_8_BRANCH</xsl:template>
24 <xsl:variable name="STABLE_BRANCH"><STABLE_BRANCH/></xsl:variable>
25 <xsl:template name="RELEASE_BRANCH">branches/WX_2_9_0_BRANCH</xsl:template>
26 <xsl:variable name="RELEASE_BRANCH"><RELEASE_BRANCH/></xsl:variable>
27 <xsl:template name="SNAPSHOT_URL">http://biolpc22.york.ac.uk/pub</xsl:template>
28
29 <!--
30 checkout - build step for source checkout.
31
32 Usage: as <svn> with defaults for <baseURL> and <defaultBranch>
33
34 Typically just:
35 <checkout/>
36 for the trunk, or:
37 <checkout branch="branches/WX_2_8_BRANCH"/>
38 to checkout a branch.
39 -->
40 <xsl:template name="checkout">
41 <xsl:param name="content"/>
42 <xsl:param name="branch" select="'trunk'"/>
43 <xsl:variable name="nodes" select="exsl:node-set($content)"/>
44 <svn>
45 <xsl:if test="not($nodes/svnurl)">
46 <xsl:if test="not($nodes/baseURL)">
47 <baseURL><SVN_URL/></baseURL>
48 </xsl:if>
49 <xsl:if test="not($nodes/defaultBranch)">
50 <defaultBranch><xsl:value-of select="$branch"/></defaultBranch>
51 </xsl:if>
52 </xsl:if>
53 <xsl:copy-of select="$content"/>
54 </svn>
55 </xsl:template>
56
57 <!--
58 configure - add the options attribute to <configure>
59
60 Usage: <configure options="-with-foobar"/>
61 -->
62 <xsl:template name="configure">
63 <xsl:param name="content"/>
64 <xsl:param name="options"/>
65 <configure>
66 <copy-with-defaults content="{$content}">
67 <command>./configure <xsl:value-of select="normalize-space($options)"/></command>
68 </copy-with-defaults>
69 </configure>
70 </xsl:template>
71
72 <!--
73 make - specify the make command.
74
75 Usage: <make>nmake -f makefile.vc SHARED=1</make>
76
77 Used as a child of <build> to specify the make command used by the
78 <compile> elements below, if omitted 'make' is used.
79 -->
80 <xsl:template name="make"/>
81
82 <!--
83 compile - modifiy <compile> to default to the command given by <make>
84
85 Usage: as <compile>
86
87 The <make> element of <build> spcecifies the make command used by all
88 compile build steps in the build. If <make> is not given 'make' is used.
89
90 The command for a particular compile build step can be further overridden
91 using its <command> element:
92 <compile>
93 <command>myscript</command>
94 </compile>
95 -->
96 <xsl:template name="compile">
97 <xsl:param name="content"/>
98 <compile>
99 <copy-with-defaults content="{$content}">
100 <command><get name="make" default="make"/></command>
101 </copy-with-defaults>
102 </compile>
103 </xsl:template>
104
105 <!--
106 Adds build steps to compile the library and the usual subdirectories.
107
108 Usage: as <compile> with the additional attributes below.
109
110 Usually the attributes default to suitable values, so typical usage
111 is just <compile-all/>.
112
113 <compile-all [ gui = 'true'|'false' ]
114 [ msw = 'true'|'false' ]
115 [ wx = 'true'|'false' ]
116 [ samples = 'true'|'false' ]
117 [ utils = 'true'|'false' ]
118 [ demos = 'true'|'false' ]
119 [ contrib = 'true'|'false' ]
120 [ tests = 'true'|'false' ] />
121
122 gui - if 'true' then build fully the subdirectories specified,
123 otherwise only the wxBase subset of the directories are built.
124 msw - if 'true' then build the directory 'build/msw' when building the
125 library instead of the root.
126 wx - build the library itself.
127 samples, utils, demos, contrib, tests
128 - build subdirectories.
129 -->
130 <xsl:template name="compile-all">
131 <xsl:param name="content"/>
132
133 <xsl:param name="gui"><is-gui/></xsl:param>
134 <xsl:param name="msw"><is-msw/></xsl:param>
135
136 <xsl:param name="wx" select="'true'"/>
137 <xsl:param name="samples" select="'true'"/>
138 <xsl:param name="utils" select="'true'"/>
139 <xsl:param name="demos" select="$gui"/>
140 <xsl:param name="contrib"><has-contrib/></xsl:param>
141 <xsl:param name="tests"><has-tests/></xsl:param>
142
143 <xsl:param name="wx-dirs">
144 <get-dirs wx="{$wx}" gui="{$gui}" msw="{$msw}"/>
145 </xsl:param>
146 <xsl:param name="sample-dirs">
147 <get-dirs samples="{$samples}" gui="{$gui}" msw="{$msw}"/>
148 </xsl:param>
149 <xsl:param name="util-dirs">
150 <get-dirs utils="{$utils}" gui="{$gui}" msw="{$msw}"/>
151 </xsl:param>
152 <xsl:param name="demo-dirs">
153 <get-dirs demos="{$demos}" gui="{$gui}" msw="{$msw}"/>
154 </xsl:param>
155 <xsl:param name="contrib-dirs">
156 <get-dirs contrib="{$contrib}" gui="{$gui}" msw="{$msw}"/>
157 </xsl:param>
158 <xsl:param name="test-dirs">
159 <get-dirs tests="{$tests}" gui="{$gui}" msw="{$msw}"/>
160 </xsl:param>
161
162 <compile-subdirs dirs="{$wx-dirs}" halt="true">
163 <xsl:copy-of select="$content"/>
164 </compile-subdirs>
165 <compile-subdirs name="samples" dirs="{$sample-dirs}">
166 <xsl:copy-of select="$content"/>
167 </compile-subdirs>
168 <compile-subdirs name="utils" dirs="{$util-dirs}">
169 <xsl:copy-of select="$content"/>
170 </compile-subdirs>
171 <compile-subdirs name="demos" dirs="{$demo-dirs}">
172 <xsl:copy-of select="$content"/>
173 </compile-subdirs>
174 <compile-subdirs name="contrib" dirs="{$contrib-dirs}">
175 <xsl:copy-of select="$content"/>
176 </compile-subdirs>
177 <compile-subdirs name="tests" dirs="{$test-dirs}" halt="true">
178 <xsl:copy-of select="$content"/>
179 </compile-subdirs>
180 </xsl:template>
181
182 <!--
183 Helper for compile-all.
184 Returns the directories that need to be built for the various components:
185 wx (the library itself), samples, utils, demos, contrib and tests.
186 -->
187 <xsl:template name="get-dirs">
188 <xsl:param name="contents"/>
189
190 <xsl:param name="gui"/>
191 <xsl:param name="msw"/>
192
193 <xsl:param name="wx"/>
194 <xsl:param name="samples"/>
195 <xsl:param name="utils"/>
196 <xsl:param name="demos"/>
197 <xsl:param name="contrib"/>
198 <xsl:param name="tests"/>
199
200 <xsl:if test="$wx = 'true'">
201 <xsl:choose>
202 <xsl:when test="$msw = 'true'">build/msw</xsl:when>
203 <xsl:otherwise>.</xsl:otherwise>
204 </xsl:choose>
205 <xsl:text> </xsl:text>
206 </xsl:if>
207
208 <xsl:if test="$samples = 'true'">
209 <xsl:choose>
210 <xsl:when test="$gui = 'true'">samples</xsl:when>
211 <xsl:otherwise>samples/console</xsl:otherwise>
212 </xsl:choose>
213 <xsl:text> </xsl:text>
214 </xsl:if>
215
216 <xsl:if test="$utils = 'true'">
217 <xsl:choose>
218 <xsl:when test="$gui = 'true'">utils</xsl:when>
219 <xsl:otherwise>utils/tex2rtf/src ../../HelpGen/src</xsl:otherwise>
220 </xsl:choose>
221 <xsl:text> </xsl:text>
222 </xsl:if>
223
224 <xsl:if test="$demos = 'true' and $gui = 'true'">demos </xsl:if>
225
226 <xsl:if test="$contrib = 'true' and $gui = 'true'">contrib </xsl:if>
227
228 <xsl:if test="$tests = 'true'">tests</xsl:if>
229 </xsl:template>
230
231 <!--
232 compile-subdir - build step to compile a subdirectory.
233
234 Usage: as <compile> plus the following attributes,
235 <compile-subdir dir="foobar" [ halt="true" ]/>
236
237 Compiles the named subdirectory 'foobar'. Continues with the next build
238 step on failure, unless the optional attibute 'halt="true"' is given.
239 The make command used is as described for the compile step above.
240 -->
241 <xsl:template name="compile-subdir">
242 <xsl:param name="content"/>
243 <xsl:param name="dir"/>
244 <xsl:param name="halt" select="'false'"/>
245 <compile-subdirs name="{$dir}" dirs="{$dir}" halt="{$halt}">
246 <xsl:copy-of select="$content"/>
247 </compile-subdirs>
248 </xsl:template>
249
250 <!--
251 compile-subdirs - adds a compile build step for each directory in a list.
252
253 Usage: as <compile> plus the following attributes,
254 <compile-subdir dirs="foobar1 foobar2"
255 [ name="foobars" ]
256 [ sep=" " ]
257 [ halt="true" ]/>
258
259 Compiles the named subdirectories. Continues with the next build
260 step on failure, unless the optional attibute 'halt="true"' is given.
261 The make command used is as described for the compile step above.
262 The 'name' attribute can be used to give a collective name for the
263 subdirectories, and the 'sep' attibute can be used to specify the
264 separator in the 'dirs' list (defaults to space).
265 -->
266 <xsl:template name="compile-subdirs">
267 <xsl:param name="content"/>
268 <xsl:param name="name"/>
269 <xsl:param name="dirs"/>
270 <xsl:param name="sep" select="' '"/>
271 <xsl:param name="halt" select="'false'"/>
272 <xsl:if test="translate($dirs, $sep, '')">
273 <compile>
274 <defaults content="{$content}">
275 <name>
276 <xsl:value-of select="normalize-space(concat('compile ', $name))"/>
277 </name>
278 <description>
279 <xsl:value-of select="normalize-space(concat('compiling ', $name))"/>
280 </description>
281 <descriptionDone>
282 <xsl:value-of select="normalize-space(concat('compile ', $name))"/>
283 </descriptionDone>
284 <haltOnFailure>
285 <xsl:value-of select="$halt"/>
286 </haltOnFailure>
287 <warnOnFailure/>
288 </defaults>
289 <copy-with-defaults content="{$content}">
290 <command>
291 <compile-subdirs-cmd dirs="{$dirs}" sep="{$sep}"/>
292 </command>
293 </copy-with-defaults>
294 </compile>
295 </xsl:if>
296 </xsl:template>
297
298 <xsl:template name="compile-subdirs-cmd">
299 <xsl:param name="content"/>
300 <xsl:param name="dirs"/>
301 <xsl:param name="sep"/>
302 <xsl:choose>
303 <xsl:when test="contains($dirs, $sep)">
304 <xsl:variable name="before" select="substring-before($dirs, $sep)"/>
305 <xsl:variable name="after" select="substring-after($dirs, $sep)"/>
306
307 <xsl:call-template name="compile-subdirs-cmd">
308 <xsl:with-param name="dirs" select="$before"/>
309 <xsl:with-param name="sep" select="$sep"/>
310 </xsl:call-template>
311
312 <xsl:if test="$after and substring($after, 1, 1) != ' '">
313 <xsl:text> &amp;&amp; </xsl:text>
314 </xsl:if>
315
316 <xsl:call-template name="compile-subdirs-cmd">
317 <xsl:with-param name="dirs" select="$after"/>
318 <xsl:with-param name="sep" select="$sep"/>
319 </xsl:call-template>
320 </xsl:when>
321 <xsl:when test="string($dirs)">
322 <xsl:if test="$dirs != '.'">cd <xsl:value-of select="$dirs"/> &amp;&amp; </xsl:if>
323 <get name="make" default="make"/>
324 </xsl:when>
325 </xsl:choose>
326 </xsl:template>
327
328 <!--
329 run-tests - build step to run the test suites.
330
331 Usage: as <test>
332
333 Typically just:
334 <run-tests/>
335 -->
336 <xsl:template name="run-tests">
337 <xsl:param name="content"/>
338 <xsl:param name="options" select="'-t'"/>
339 <xsl:param name="guioptions" select="$options"/>
340 <xsl:param name="msw"><is-msw/></xsl:param>
341 <test>
342 <defaults content="{$content}">
343 <description>running tests</description>
344 <descriptionDone>run tests</descriptionDone>
345 <warnOnFailure/>
346 </defaults>
347 <copy-with-defaults content="{$content}">
348 <command>
349 <xsl:choose>
350 <xsl:when test="$msw = 'true'">
351 <run-tests-win options="{$options}" guioptions="{$guioptions}"/>
352 </xsl:when>
353 <xsl:otherwise>
354 <run-tests-unix options="{$options}" guioptions="{$guioptions}"/>
355 </xsl:otherwise>
356 </xsl:choose>
357 </command>
358 </copy-with-defaults>
359 </test>
360 </xsl:template>
361
362 <xsl:template name="run-tests-win">
363 <xsl:param name="options"/>
364 <xsl:param name="guioptions"/>
365 <normalize-space>
366 cd tests &amp;&amp; runtests.bat
367 </normalize-space>
368 </xsl:template>
369
370 <xsl:template name="run-tests-unix">
371 <xsl:param name="options"/>
372 <xsl:param name="guioptions"/>
373 ERR=0
374 cd tests || exit 0
375 ulimit -c unlimited
376
377 try()
378 {
379 rm -f core
380 echo Running: "$@"
381 "$@" || ERR=$?
382
383 if [ -f core -a -x "`which gdb`" ]; then
384 echo Crashed, attempting to display backtrace:
385 gdb -batch -c core -ex 'set pagination off' -ex bt "$1"
386 fi
387
388 echo
389 }
390
391 try ./test <xsl:value-of select="normalize-space($options)"/>
392
393 test -x test_gui || exit $ERR
394
395 if [ -z "$DISPLAY" ]; then
396 echo '$DISPLAY is not set, skipping GUI tests.'
397 exit $ERR
398 fi
399
400 echo 'Checking window manager:'
401 WINDOW_MANAGER=$(xprop -root 32x '\n$0\n' _NET_SUPPORTING_WM_CHECK | grep ^0x)
402
403 if [ -z "$WINDOW_MANAGER" ]; then
404 echo 'Window manager not present, skipping GUI tests.'
405 exit $ERR
406 fi
407
408 xprop -id $WINDOW_MANAGER 8s _NET_WM_NAME
409 echo
410
411 try ./test_gui <xsl:value-of select="normalize-space($guioptions)"/>
412
413 exit $ERR
414 </xsl:template>
415
416 <!--
417 defaults - supply default content for an element.
418
419 Usage: <defaults content="{$content}">
420 <foo>foo</foo>
421 <bar>bar</bar>
422 </defaults>
423
424 Copies those child elements that do not already exist in $content.
425 -->
426 <xsl:template name="defaults">
427 <xsl:param name="defaults"/>
428 <xsl:param name="content"/>
429
430 <xsl:variable name="def-nodes" select="exsl:node-set($defaults)"/>
431 <xsl:variable name="cont-nodes" select="exsl:node-set($content)"/>
432
433 <xsl:for-each select="$def-nodes/*">
434 <xsl:if test="not($cont-nodes/*[name() = name(current())])">
435 <xsl:copy-of select="."/>
436 </xsl:if>
437 </xsl:for-each>
438 </xsl:template>
439
440 <!--
441 copy-with-defaults - copy elements supplying defaults for any that are
442 missing or empty.
443
444 Usage: <copy-with-defaults content="{$content}">
445 <foo>foo</foo>
446 <bar>bar</bar>
447 </copy-with-defaults>
448
449 Copies $content plus any child elements that do not exist in $content,
450 substituting empty elements in $content with any child elements of the
451 same name.
452 -->
453 <xsl:template name="copy-with-defaults">
454 <xsl:param name="defaults"/>
455 <xsl:param name="content"/>
456
457 <xsl:variable name="def-nodes" select="exsl:node-set($defaults)"/>
458 <xsl:variable name="cont-nodes" select="exsl:node-set($content)"/>
459
460 <xsl:for-each select="$def-nodes/*">
461 <xsl:if test="not($cont-nodes/*[name() = name(current())])">
462 <xsl:copy-of select="."/>
463 </xsl:if>
464 </xsl:for-each>
465
466 <xsl:for-each select="$cont-nodes/*">
467 <xsl:choose>
468 <xsl:when test="not(node())">
469 <xsl:copy-of select="$def-nodes/*[name() = name(current())]"/>
470 </xsl:when>
471 <xsl:otherwise>
472 <xsl:copy-of select="."/>
473 </xsl:otherwise>
474 </xsl:choose>
475 </xsl:for-each>
476 </xsl:template>
477
478 <!--
479 get - gets the text from a child element of the current build.
480
481 Usage: <get name="foobar" [ default="value" ]/>
482
483 Gets the text from the <foobar> element of the current build, or returns
484 $default if there is not such element.
485 -->
486 <xsl:template name="get">
487 <xsl:param name="content"/>
488 <xsl:param name="build" select="get:build()"/>
489 <xsl:param name="name"/>
490 <xsl:param name="default"/>
491 <xsl:variable name="property" select="get:property($name, $build)"/>
492 <strip>
493 <xsl:choose>
494 <xsl:when test="$property">
495 <xsl:apply-templates select="$property/node()"/>
496 </xsl:when>
497 <xsl:otherwise>
498 <xsl:value-of select="$default"/>
499 </xsl:otherwise>
500 </xsl:choose>
501 </strip>
502 </xsl:template>
503
504 <!--
505 Accessors to get builds and their fields. XSLT code should use these
506 instead of traversing the input tree directly.
507 -->
508 <func:function name="get:build">
509 <func:result select="ancestor-or-self::build[last()]"/>
510 </func:function>
511
512 <func:function name="get:all-builds">
513 <func:result select="//build[not(ancestor::*[name() != name(/*)])]"/>
514 </func:function>
515
516 <func:function name="get:preceding-builds">
517 <func:result select="get:build()/preceding-sibling::build"/>
518 </func:function>
519
520 <func:function name="get:property">
521 <xsl:param name="name"/>
522 <xsl:param name="build" select="get:build()"/>
523 <func:result select="$build/*[name() = $name]"/>
524 </func:function>
525
526 <func:function name="get:step">
527 <xsl:param name="name"/>
528 <xsl:param name="build" select="get:build()"/>
529 <func:result select="get:property('steps', $build)/*[name() = $name]"/>
530 </func:function>
531
532 <!--
533 Returns true if this is an msw build.
534 -->
535 <xsl:template name="is-msw">
536 <xsl:param name="content"/>
537 <xsl:param name="build" select="get:build()"/>
538 <xsl:value-of select="not(get:step('configure', $build))"/>
539 </xsl:template>
540
541 <!--
542 Returns true if this a gui build.
543 -->
544 <xsl:template name="is-gui">
545 <xsl:param name="content"/>
546 <xsl:param name="build" select="get:build()"/>
547 <xsl:variable name="make"><get name="make" build="{$build}"/></xsl:variable>
548 <xsl:variable name="configure"><xsl:apply-templates select="get:step('configure', $build)"/></xsl:variable>
549 <xsl:value-of select="not(contains($make, 'USE_GUI=0') or contains($configure, '--disable-gui'))"/>
550 </xsl:template>
551
552 <!--
553 Returns true if the branch we're building has a contrib subdirectory.
554 -->
555 <xsl:template name="has-contrib">
556 <xsl:param name="content"/>
557 <xsl:param name="build" select="get:build()"/>
558 <xsl:variable name="checkout"><xsl:apply-templates select="get:step('checkout', $build)"/></xsl:variable>
559 <xsl:value-of select="contains($checkout, 'WX_2_') and not(contains($checkout, 'WX_2_9_'))"/>
560 </xsl:template>
561
562 <!--
563 Returns true if the build should build the test suite.
564 -->
565 <xsl:template name="has-tests">
566 <xsl:param name="content"/>
567 <xsl:param name="build" select="get:build()"/>
568 <xsl:variable name="configure"><xsl:apply-templates select="get:step('configure', $build)"/></xsl:variable>
569 <xsl:value-of select="get:step('run-tests', $build) or contains($configure, '--host=')"/>
570 </xsl:template>
571
572 <!--
573 strip - strips leading and trailing whitespace
574
575 Usage: <strip>
576 foobar
577 </strip>
578
579 Converts to text and strips leading and trailing whitespace.
580 -->
581 <xsl:template name="strip">
582 <xsl:param name="content"/>
583 <xsl:variable name="len" select="string-length($content)"/>
584 <xsl:variable name="norm" select="normalize-space($content)"/>
585 <xsl:variable name="normlen" select="string-length($norm)"/>
586 <xsl:choose>
587 <xsl:when test="substring($content, 1, 1) != substring($norm, 1, 1)">
588 <xsl:call-template name="strip">
589 <xsl:with-param name="content" select="substring($content, 2)"/>
590 </xsl:call-template>
591 </xsl:when>
592 <xsl:when test="substring($content, $len, 1) != substring($norm, $normlen, 1)">
593 <xsl:call-template name="strip">
594 <xsl:with-param name="content" select="substring($content, 1, $len - 1)"/>
595 </xsl:call-template>
596 </xsl:when>
597 <xsl:otherwise>
598 <xsl:value-of select="$content"/>
599 </xsl:otherwise>
600 </xsl:choose>
601 </xsl:template>
602
603 <!--
604 normalize-space - normalises whitespace.
605
606 Usage: <normalize-space>
607 foobar
608 </normalize-space>
609
610 Converts to text, strips leading and trailing whitespace and replaces
611 sequences of whitespace characters by a single space.
612 -->
613 <xsl:template name="normalize-space">
614 <xsl:param name="content"/>
615 <xsl:value-of select="normalize-space($content)"/>
616 </xsl:template>
617
618 <!--
619 lower-case - converts to lower case.
620
621 Usage: <lower-case>FooBar</lower-case>
622 -->
623 <xsl:template name="lower-case">
624 <xsl:param name="content"/>
625 <xsl:variable name="lower">abcdefghijklmnopqrstuvwxyz</xsl:variable>
626 <xsl:variable name="upper">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
627 <xsl:value-of select="translate($content, $upper, $lower)"/>
628 </xsl:template>
629
630 <!--
631 Helpers to convert between day numbers and names.
632 -->
633 <xsl:template name="day-number">
634 <xsl:param name="content"/>
635 <xsl:param name="name"/>
636 <xsl:choose>
637 <xsl:when test="$name = 'monday'">0</xsl:when>
638 <xsl:when test="$name = 'tuesday'">1</xsl:when>
639 <xsl:when test="$name = 'wednesday'">2</xsl:when>
640 <xsl:when test="$name = 'thursday'">3</xsl:when>
641 <xsl:when test="$name = 'friday'">4</xsl:when>
642 <xsl:when test="$name = 'saturday'">5</xsl:when>
643 <xsl:when test="$name = 'sunday'">6</xsl:when>
644 </xsl:choose>
645 </xsl:template>
646
647 <xsl:template name="day-name">
648 <xsl:param name="content"/>
649 <xsl:param name="number"/>
650 <xsl:choose>
651 <xsl:when test="$number = '0'">monday</xsl:when>
652 <xsl:when test="$number = '1'">tuesday</xsl:when>
653 <xsl:when test="$number = '2'">wednesday</xsl:when>
654 <xsl:when test="$number = '3'">thursday</xsl:when>
655 <xsl:when test="$number = '4'">friday</xsl:when>
656 <xsl:when test="$number = '5'">saturday</xsl:when>
657 <xsl:when test="$number = '6'">sunday</xsl:when>
658 </xsl:choose>
659 </xsl:template>
660
661 <!--
662 Helpers to convert between time in the format 'hhmm' and an integer
663 count of the minutes since midnight.
664 -->
665 <xsl:template name="time-minutes">
666 <xsl:param name="content"/>
667 <xsl:param name="hhmm"/>
668 <xsl:if test="string-length($hhmm) = 4 and format-number($hhmm, '0000') = $hhmm">
669 <xsl:variable name="hour" select="substring($hhmm, 1, 2)"/>
670 <xsl:variable name="min" select="substring($hhmm, 3, 2)"/>
671 <xsl:if test="$hour >= 0 and $hour &lt; 24 and $min >= 0 and $min &lt; 60">
672 <xsl:value-of select="$hour * 60 + $min"/>
673 </xsl:if>
674 </xsl:if>
675 </xsl:template>
676
677 <xsl:template name="time-hhmm">
678 <xsl:param name="content"/>
679 <xsl:param name="minutes"/>
680 <xsl:value-of select="format-number(floor($minutes div 60) * 100 + $minutes mod 60, '0000')"/>
681 </xsl:template>
682
683 <!--
684 Create schedulers.
685 -->
686 <xsl:template name="nightly-schedulers">
687 <xsl:param name="content"/>
688 <xsl:param name="name"/>
689 <xsl:param name="day"><day-number name="{$name}"/></xsl:param>
690 <xsl:param name="hour" select="0"/>
691 <xsl:param name="minute" select="0"/>
692 <xsl:param name="step" select="30"/>
693
694 <xsl:if test="$hour &lt; 24">
695 <nightly>
696 <name>
697 <xsl:value-of select="concat($name, '_', format-number($hour, '00'), format-number($minute, '00'))"/>
698 </name>
699 <hour>
700 <xsl:value-of select="$hour"/>
701 </hour>
702 <minute>
703 <xsl:value-of select="$minute"/>
704 </minute>
705 <xsl:if test="$day != ''">
706 <dayOfWeek>
707 <xsl:value-of select="$day"/>
708 </dayOfWeek>
709 </xsl:if>
710 </nightly>
711 <xsl:variable name="next" select="$hour * 60 + $minute + $step"/>
712 <xsl:call-template name="nightly-schedulers">
713 <xsl:with-param name="name" select="$name"/>
714 <xsl:with-param name="day" select="$day"/>
715 <xsl:with-param name="hour" select="floor($next div 60)"/>
716 <xsl:with-param name="minute" select="$next mod 60"/>
717 <xsl:with-param name="step" select="$step"/>
718 </xsl:call-template>
719 </xsl:if>
720 </xsl:template>
721
722 <!--
723 scheduler - provide default for the <scheduler> build element.
724 -->
725 <xsl:template name="scheduler">
726 <xsl:param name="content"/>
727 <xsl:param name="previous" select="get:property('scheduler', get:preceding-builds()[last()])"/>
728 <xsl:param name="step" select="60"/>
729
730 <xsl:choose>
731 <xsl:when test="exsl:node-set($content)/node()">
732 <scheduler>
733 <xsl:copy-of select="$content"/>
734 </scheduler>
735 </xsl:when>
736 <xsl:otherwise>
737 <xsl:for-each select="$previous">
738 <xsl:variable name="text">
739 <xsl:apply-templates select="."/>
740 </xsl:variable>
741 <scheduler>
742 <scheduler-subst text="{$text}" step="{$step}"/>
743 </scheduler>
744 </xsl:for-each>
745 </xsl:otherwise>
746 </xsl:choose>
747 </xsl:template>
748
749 <xsl:template name="scheduler-subst">
750 <xsl:param name="content"/>
751 <xsl:param name="text"/>
752 <xsl:param name="step"/>
753
754 <xsl:variable name="name" select="substring-before($text, '_')"/>
755 <xsl:variable name="hhmm" select="substring-after($text, '_')"/>
756 <xsl:variable name="day"><day-number name="{$name}"/></xsl:variable>
757 <xsl:variable name="mins"><time-minutes hhmm="{$hhmm}"/></xsl:variable>
758
759 <xsl:choose>
760 <xsl:when test="$mins = ''">
761 <xsl:value-of select="$text"/>
762 </xsl:when>
763 <xsl:when test="$day = ''">
764 <xsl:value-of select="$name"/>
765 <xsl:text>_</xsl:text>
766 <time-hhmm minutes="{$mins + $step}"/>
767 </xsl:when>
768 <xsl:otherwise>
769 <xsl:variable name="day-mins" select="24 * 60"/>
770 <xsl:variable name="week-mins" select="7 * $day-mins"/>
771 <xsl:variable name="tmp" select="($day + 1) * $day-mins + $mins"/>
772 <xsl:variable name="next" select="$tmp mod $week-mins + floor($tmp div $week-mins) * $step"/>
773 <day-name number="{floor($next div $day-mins)}"/>
774 <xsl:text>_</xsl:text>
775 <time-hhmm minutes="{$next mod $day-mins}"/>
776 </xsl:otherwise>
777 </xsl:choose>
778 </xsl:template>
779
780 <!--
781 email - substitute '@' for ' -at- ' in email addresses.
782 -->
783 <xsl:template name="emailfield">
784 <xsl:param name="content"/>
785 <xsl:param name="addr"/>
786 <xsl:variable name="at"> -at- </xsl:variable>
787 <xsl:choose>
788 <xsl:when test="contains($addr, $at)">
789 <xsl:value-of select="substring-before($addr, $at)"/>
790 <xsl:text>@</xsl:text>
791 <xsl:value-of select="substring-after($addr, $at)"/>
792 </xsl:when>
793 <xsl:otherwise>
794 <xsl:value-of select="$addr"/>
795 </xsl:otherwise>
796 </xsl:choose>
797 </xsl:template>
798
799 <xsl:template name="email">
800 <xsl:param name="content"/>
801 <xsl:param name="id"/>
802 <email id="{$id}"><emailfield addr="{$content}"/></email>
803 </xsl:template>
804
805 <xsl:template name="fromaddr">
806 <xsl:param name="content"/>
807 <fromaddr><emailfield addr="{$content}"/></fromaddr>
808 </xsl:template>
809
810 <xsl:template name="extraRecipient">
811 <xsl:param name="content"/>
812 <extraRecipient><emailfield addr="{$content}"/></extraRecipient>
813 </xsl:template>
814
815 <!--
816 mailnotifier - add a default value for <fromaddr> to <mailnotifier>
817 -->
818 <xsl:template name="mailnotifier">
819 <xsl:param name="content"/>
820 <mailnotifier>
821 <defaults content="{$content}">
822 <fromaddr>noreply -at- wxsite.net</fromaddr>
823 </defaults>
824 <xsl:copy-of select="$content"/>
825 </mailnotifier>
826 </xsl:template>
827
828 </bot>