comparison bug-list.xsl @ 4:f8f966388b68

xslt: bugzilla -> taskjuggler
author cin
date Mon, 24 Aug 2015 20:50:23 +0300
parents 36ae3ec94442
children d2efec56373f
comparison
equal deleted inserted replaced
3:36ae3ec94442 4:f8f966388b68
1 <?xml version="1.0" encoding="UTF-8"?> 1 <?xml version="1.0" encoding="UTF-8"?>
2 <xsl:stylesheet version="1.0" 2 <xsl:stylesheet version="1.0"
3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common"> 3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common"
4 <xsl:output method="xml" indent="yes" /> 4 extension-element-prefixes="exsl">
5 <xsl:output method="text" indent="yes" />
6
7 <xsl:variable name="resources"
8 select="document('resources.xml')/resources/resource" />
9
5 <xsl:variable name="bugs" select="/bugzilla/bug" /> 10 <xsl:variable name="bugs" select="/bugzilla/bug" />
11
6 <xsl:key name="bugid" match="/bugzilla/bug" use="string(bug_id)" /> 12 <xsl:key name="bugid" match="/bugzilla/bug" use="string(bug_id)" />
7 <xsl:variable name="roots" 13
8 select="$bugs[not(blocked[key('bugid',.)])]" /> 14 <xsl:variable name="roots" select="$bugs[not(blocked[key('bugid',.)])]" />
9 15
10 <!-- BUILD BUG TREE --> 16 <!-- BUILD BUG TREE -->
11 <xsl:variable name="tree"> 17 <xsl:variable name="tree">
12 <xsl:apply-templates mode="tree" select="$roots" /> 18 <xsl:apply-templates mode="tree" select="$roots" />
13 </xsl:variable> 19 </xsl:variable>
42 <xsl:variable name="bugid" select="@id" /> 48 <xsl:variable name="bugid" select="@id" />
43 <xsl:variable name="path" select="ancestor::bug" /> 49 <xsl:variable name="path" select="ancestor::bug" />
44 <xsl:variable name="level" select="count($path)" /> 50 <xsl:variable name="level" select="count($path)" />
45 <xsl:for-each select="$path[@product]"> 51 <xsl:for-each select="$path[@product]">
46 <xsl:variable name="pos" select="position()" /> 52 <xsl:variable name="pos" select="position()" />
47 <xsl:variable name="rank" select="$level - position()" /> 53 <xsl:variable name="rank" select="$level - $pos" />
48 <rel container="{@id}" rank="{$rank}" level="{$level}"> 54 <rel container="{@id}" rank="{$rank}" level="{$level}">
49 <xsl:for-each select="$path[position() >= $pos]"> 55 <xsl:for-each select="$path[position() >= $pos and @product]">
50 <bug id="{@id}" /> 56 <bug id="{@id}" />
51 </xsl:for-each> 57 </xsl:for-each>
52 </rel> 58 </rel>
53 </xsl:for-each> 59 </xsl:for-each>
54 </xsl:template> 60 </xsl:template>
90 </depends> 96 </depends>
91 </xsl:if> 97 </xsl:if>
92 </bug> 98 </bug>
93 </xsl:template> 99 </xsl:template>
94 100
95 <!-- --> 101 <!-- output -->
96 <xsl:template match="/"> 102 <xsl:template match="/">
97 <root> 103 <xsl:apply-templates select="exsl:node-set($structure)/bug">
98 <xsl:copy-of select="$tree" /> 104 <xsl:with-param name="indent" select="0" />
99 <xsl:copy-of select="$relations" /> 105 </xsl:apply-templates>
100 <xsl:copy-of select="$parents" />
101 <xsl:copy-of select="$structure" />
102 </root>
103 </xsl:template> 106 </xsl:template>
104 107
105 <xsl:template match="bug"> 108 <xsl:template match="bug">
106 <xsl:value-of select="bug_id" /> 109 <xsl:param name="indent" select="0" />
107 <xsl:text>&#xa;</xsl:text> 110 <xsl:variable name="id" select="@id" />
108 </xsl:template> 111 <xsl:variable name="details" select="$bugs[bug_id = $id]" />
109 112 <xsl:call-template name="start-task">
110 <xsl:template match="bug[component = 'product']"> 113 <xsl:with-param name="indent" select="$indent" />
111 <xsl:value-of select="bug_id" /> 114 <xsl:with-param name="id" select="@id" />
112 <xsl:text>:&#xa;</xsl:text> 115 <xsl:with-param name="desc" select="$details/short_desc" />
113 <xsl:for-each select="dependson"> 116 </xsl:call-template>
114 <xsl:apply-templates select="key('bugid', .)" /> 117
118 <xsl:for-each select="$details/*">
119 <xsl:variable name="directive">
120 <xsl:apply-templates select="." mode="task-details" />
121 </xsl:variable>
122 <xsl:if test="string($directive)">
123 <xsl:call-template name="begin-line">
124 <xsl:with-param name="indent" select="$indent + 1" />
125 </xsl:call-template>
126 <xsl:value-of select="$directive" />
127 <xsl:call-template name="end-line" />
128 </xsl:if>
115 </xsl:for-each> 129 </xsl:for-each>
116 <xsl:text>---END---&#xa;</xsl:text> 130
117 </xsl:template> 131 <xsl:apply-templates>
132 <xsl:with-param name="indent" select="$indent + 1" />
133 </xsl:apply-templates>
134
135 <xsl:call-template name="end-task">
136 <xsl:with-param name="indent" select="$indent" />
137 </xsl:call-template>
138 </xsl:template>
139
140 <xsl:template match="estimated_time" mode="task-details">
141 <xsl:if test="number(.)">
142 <xsl:value-of select="concat('effort ', .,'h')" />
143 </xsl:if>
144 </xsl:template>
145
146 <xsl:template match="assigned_to" mode="task-details">
147 <xsl:variable name="email" select="string(.)" />
148 <xsl:variable name="resource" select="$resources[@email = $email]/@id" />
149 <xsl:if test="$resource">
150 <xsl:value-of select="concat('allocate ', $resource)" />
151 </xsl:if>
152 </xsl:template>
153 <xsl:template match="text()" mode="task-details">
154 </xsl:template>
155
156 <xsl:template match="depends">
157 <xsl:param name="indent" select="0" />
158 <xsl:call-template name="begin-line">
159 <xsl:with-param name="indent" select="$indent" />
160 </xsl:call-template>
161 <xsl:text>depends </xsl:text>
162 <xsl:apply-templates>
163 <xsl:with-param name="referer" select=".." />
164 </xsl:apply-templates>
165 <xsl:call-template name="end-line" />
166 </xsl:template>
167
168 <xsl:template match="depends/bug">
169 <xsl:param name="referer" />
170 <xsl:call-template name="bug-reference">
171 <xsl:with-param name="id" select="@id" />
172 <xsl:with-param name="referer" select="$referer" />
173 </xsl:call-template>
174 <xsl:if test="position() != last()">
175 <xsl:text>, </xsl:text>
176 </xsl:if>
177 </xsl:template>
178
118 179
119 <xsl:template match="text()" /> 180 <xsl:template match="text()" />
120 181
121 <xsl:template name="bug-template"> 182
122 <xsl:param name="indent" select="0" /> 183
123 <xsl:variable name="isOrganizing" select="component = 'product'"></xsl:variable> 184 <xsl:template name="bug-local-name">
124 185 <xsl:param name="id" />
125 <xsl:call-template name="start-task"> 186 <xsl:value-of select="concat('bug',$id)" />
126 <xsl:with-param name="indent" select="$indent" /> 187 </xsl:template>
127 </xsl:call-template> 188
128 189
129 <xsl:if test="$isOrganizing"> 190 <xsl:template name="bug-reference">
130 191 <xsl:param name="id" />
131 </xsl:if> 192 <xsl:param name="referer" />
132 193
133 <xsl:choose> 194 <xsl:variable name="refererPathFragment">
134 <xsl:when test="$isOrganizing"> 195 <bug id="#root" />
135 <xsl:for-each select="dependson"> 196 <xsl:for-each select="$referer/ancestor-or-self::bug">
136 <xsl:for-each select="key('bugs-key', .)"> 197 <bug id="{@id}" />
137 <xsl:call-template name="bug-template"> 198 </xsl:for-each>
138 <xsl:with-param name="indent" select="$indent + 1" /> 199 </xsl:variable>
139 </xsl:call-template> 200 <xsl:variable name="targetPathFragment">
140 </xsl:for-each> 201 <bug id="#root" />
141 </xsl:for-each> 202 <xsl:for-each
142 </xsl:when> 203 select="exsl:node-set($structure)//bug[local-name(..) != 'depends' and @id = $id]/ancestor-or-self::bug">
143 <xsl:otherwise> 204 <bug id="{@id}" />
144 <xsl:if test="number(estimated_time)"> 205 </xsl:for-each>
145 <xsl:call-template name="begin-line"> 206 </xsl:variable>
146 <xsl:with-param name="indent" select="$indent + 1" /> 207 <xsl:variable name="path"
147 </xsl:call-template> 208 select="exsl:node-set($refererPathFragment)/bug" />
148 <xsl:value-of select="concat('effort ', estimated_time, 'h')" /> 209 <xsl:variable name="targetPath"
149 <xsl:call-template name="end-line" /> 210 select="exsl:node-set($targetPathFragment)/bug" />
150 </xsl:if> 211
151 </xsl:otherwise> 212 <!-- find closest shared container id -->
152 </xsl:choose> 213 <xsl:variable name="join"
153 214 select="($path[@id = $targetPath/@id])[position() = last() ]/@id" />
154 <xsl:call-template name="end-task"> 215
155 <xsl:with-param name="indent" select="$indent" /> 216 <!-- how many levels we need to up -->
156 </xsl:call-template> 217 <xsl:variable name="depth"
157 </xsl:template> 218 select="count($path[@id = $join]/following-sibling::node())" />
158 219
159 <xsl:template name="make-bug-id"> 220 <!-- DEBUG -->
160 <xsl:param name="id"></xsl:param> 221 <!-- <xsl:value-of select="concat('id=', $id, ',referer=', $referer/@id)"
161 <xsl:value-of select="concat('bug', $id)"></xsl:value-of> 222 /> <xsl:text>, path=</xsl:text> <xsl:for-each select="$targetPath"> <xsl:value-of
223 select="concat(name(),@id)" /> <xsl:if test="position() != last()"> <xsl:text>-</xsl:text>
224 </xsl:if> </xsl:for-each> -->
225 <!-- DEBUG -->
226 <!-- <xsl:value-of select="concat(', join=', $join,', depth=', $depth,'
227 ')" /> -->
228
229 <!-- PRINT REFERENCE -->
230 <xsl:call-template name="repeat">
231 <xsl:with-param name="value" select="'!'" />
232 <xsl:with-param name="count" select="$depth" />
233 </xsl:call-template>
234 <xsl:for-each select="$targetPath[@id = $join]/following-sibling::node()">
235 <xsl:call-template name="bug-local-name">
236 <xsl:with-param name="id" select="@id" />
237 </xsl:call-template>
238 <xsl:if test="position() != last()">
239 <xsl:text>.</xsl:text>
240 </xsl:if>
241 </xsl:for-each>
242
162 </xsl:template> 243 </xsl:template>
163 244
164 <xsl:template name="start-task"> 245 <xsl:template name="start-task">
165 <xsl:param name="indent" /> 246 <xsl:param name="indent" />
247 <xsl:param name="id" />
248 <xsl:param name="desc" />
166 <xsl:call-template name="begin-line"> 249 <xsl:call-template name="begin-line">
167 <xsl:with-param name="indent" select="$indent" /> 250 <xsl:with-param name="indent" select="$indent" />
168 </xsl:call-template> 251 </xsl:call-template>
169 <xsl:text>task </xsl:text> 252 <xsl:text>task </xsl:text>
170 <xsl:call-template name="make-bug-id"> 253 <xsl:call-template name="bug-local-name">
171 <xsl:with-param name="id" select="bug_id" /> 254 <xsl:with-param name="id" select="$id" />
172 </xsl:call-template> 255 </xsl:call-template>
173 <xsl:value-of select="concat(' &quot;',short_desc,'&quot; {')" /> 256 <xsl:value-of select="concat(' &quot;',$desc,'&quot; {')" />
174 <xsl:call-template name="end-line" /> 257 <xsl:call-template name="end-line" />
175 </xsl:template> 258 </xsl:template>
176 259
177 <xsl:template name="end-task"> 260 <xsl:template name="end-task">
178 <xsl:param name="indent" /> 261 <xsl:param name="indent" />
193 </xsl:if> 276 </xsl:if>
194 </xsl:template> 277 </xsl:template>
195 <xsl:template name="end-line"> 278 <xsl:template name="end-line">
196 <xsl:text>&#xa;</xsl:text> 279 <xsl:text>&#xa;</xsl:text>
197 </xsl:template> 280 </xsl:template>
281
282 <xsl:template name="repeat">
283 <xsl:param name="value" />
284 <xsl:param name="count" select="0" />
285
286 <xsl:if test="number($count)">
287 <xsl:copy-of select="$value" />
288 <xsl:call-template name="repeat">
289 <xsl:with-param name="value" select="$value" />
290 <xsl:with-param name="count" select="$count - 1" />
291 </xsl:call-template>
292 </xsl:if>
293 </xsl:template>
198 </xsl:stylesheet> 294 </xsl:stylesheet>