Mercurial > pub > buggler
diff bug-list.xsl @ 4:f8f966388b68
xslt: bugzilla -> taskjuggler
author | cin |
---|---|
date | Mon, 24 Aug 2015 20:50:23 +0300 |
parents | 36ae3ec94442 |
children | d2efec56373f |
line wrap: on
line diff
--- a/bug-list.xsl Mon Aug 24 10:16:41 2015 +0300 +++ b/bug-list.xsl Mon Aug 24 20:50:23 2015 +0300 @@ -1,11 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" - xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common"> - <xsl:output method="xml" indent="yes" /> + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" + extension-element-prefixes="exsl"> + <xsl:output method="text" indent="yes" /> + + <xsl:variable name="resources" + select="document('resources.xml')/resources/resource" /> + <xsl:variable name="bugs" select="/bugzilla/bug" /> + <xsl:key name="bugid" match="/bugzilla/bug" use="string(bug_id)" /> - <xsl:variable name="roots" - select="$bugs[not(blocked[key('bugid',.)])]" /> + + <xsl:variable name="roots" select="$bugs[not(blocked[key('bugid',.)])]" /> <!-- BUILD BUG TREE --> <xsl:variable name="tree"> @@ -44,9 +50,9 @@ <xsl:variable name="level" select="count($path)" /> <xsl:for-each select="$path[@product]"> <xsl:variable name="pos" select="position()" /> - <xsl:variable name="rank" select="$level - position()" /> + <xsl:variable name="rank" select="$level - $pos" /> <rel container="{@id}" rank="{$rank}" level="{$level}"> - <xsl:for-each select="$path[position() >= $pos]"> + <xsl:for-each select="$path[position() >= $pos and @product]"> <bug id="{@id}" /> </xsl:for-each> </rel> @@ -92,85 +98,162 @@ </bug> </xsl:template> - <!-- --> + <!-- output --> <xsl:template match="/"> - <root> - <xsl:copy-of select="$tree" /> - <xsl:copy-of select="$relations" /> - <xsl:copy-of select="$parents" /> - <xsl:copy-of select="$structure" /> - </root> + <xsl:apply-templates select="exsl:node-set($structure)/bug"> + <xsl:with-param name="indent" select="0" /> + </xsl:apply-templates> </xsl:template> <xsl:template match="bug"> - <xsl:value-of select="bug_id" /> - <xsl:text>
</xsl:text> - </xsl:template> - - <xsl:template match="bug[component = 'product']"> - <xsl:value-of select="bug_id" /> - <xsl:text>:
</xsl:text> - <xsl:for-each select="dependson"> - <xsl:apply-templates select="key('bugid', .)" /> - </xsl:for-each> - <xsl:text>---END---
</xsl:text> - </xsl:template> - - <xsl:template match="text()" /> - - <xsl:template name="bug-template"> <xsl:param name="indent" select="0" /> - <xsl:variable name="isOrganizing" select="component = 'product'"></xsl:variable> - + <xsl:variable name="id" select="@id" /> + <xsl:variable name="details" select="$bugs[bug_id = $id]" /> <xsl:call-template name="start-task"> <xsl:with-param name="indent" select="$indent" /> + <xsl:with-param name="id" select="@id" /> + <xsl:with-param name="desc" select="$details/short_desc" /> </xsl:call-template> - <xsl:if test="$isOrganizing"> - - </xsl:if> + <xsl:for-each select="$details/*"> + <xsl:variable name="directive"> + <xsl:apply-templates select="." mode="task-details" /> + </xsl:variable> + <xsl:if test="string($directive)"> + <xsl:call-template name="begin-line"> + <xsl:with-param name="indent" select="$indent + 1" /> + </xsl:call-template> + <xsl:value-of select="$directive" /> + <xsl:call-template name="end-line" /> + </xsl:if> + </xsl:for-each> - <xsl:choose> - <xsl:when test="$isOrganizing"> - <xsl:for-each select="dependson"> - <xsl:for-each select="key('bugs-key', .)"> - <xsl:call-template name="bug-template"> - <xsl:with-param name="indent" select="$indent + 1" /> - </xsl:call-template> - </xsl:for-each> - </xsl:for-each> - </xsl:when> - <xsl:otherwise> - <xsl:if test="number(estimated_time)"> - <xsl:call-template name="begin-line"> - <xsl:with-param name="indent" select="$indent + 1" /> - </xsl:call-template> - <xsl:value-of select="concat('effort ', estimated_time, 'h')" /> - <xsl:call-template name="end-line" /> - </xsl:if> - </xsl:otherwise> - </xsl:choose> + <xsl:apply-templates> + <xsl:with-param name="indent" select="$indent + 1" /> + </xsl:apply-templates> <xsl:call-template name="end-task"> <xsl:with-param name="indent" select="$indent" /> </xsl:call-template> </xsl:template> - <xsl:template name="make-bug-id"> - <xsl:param name="id"></xsl:param> - <xsl:value-of select="concat('bug', $id)"></xsl:value-of> + <xsl:template match="estimated_time" mode="task-details"> + <xsl:if test="number(.)"> + <xsl:value-of select="concat('effort ', .,'h')" /> + </xsl:if> + </xsl:template> + + <xsl:template match="assigned_to" mode="task-details"> + <xsl:variable name="email" select="string(.)" /> + <xsl:variable name="resource" select="$resources[@email = $email]/@id" /> + <xsl:if test="$resource"> + <xsl:value-of select="concat('allocate ', $resource)" /> + </xsl:if> + </xsl:template> + <xsl:template match="text()" mode="task-details"> + </xsl:template> + + <xsl:template match="depends"> + <xsl:param name="indent" select="0" /> + <xsl:call-template name="begin-line"> + <xsl:with-param name="indent" select="$indent" /> + </xsl:call-template> + <xsl:text>depends </xsl:text> + <xsl:apply-templates> + <xsl:with-param name="referer" select=".." /> + </xsl:apply-templates> + <xsl:call-template name="end-line" /> + </xsl:template> + + <xsl:template match="depends/bug"> + <xsl:param name="referer" /> + <xsl:call-template name="bug-reference"> + <xsl:with-param name="id" select="@id" /> + <xsl:with-param name="referer" select="$referer" /> + </xsl:call-template> + <xsl:if test="position() != last()"> + <xsl:text>, </xsl:text> + </xsl:if> + </xsl:template> + + + <xsl:template match="text()" /> + + + + <xsl:template name="bug-local-name"> + <xsl:param name="id" /> + <xsl:value-of select="concat('bug',$id)" /> + </xsl:template> + + + <xsl:template name="bug-reference"> + <xsl:param name="id" /> + <xsl:param name="referer" /> + + <xsl:variable name="refererPathFragment"> + <bug id="#root" /> + <xsl:for-each select="$referer/ancestor-or-self::bug"> + <bug id="{@id}" /> + </xsl:for-each> + </xsl:variable> + <xsl:variable name="targetPathFragment"> + <bug id="#root" /> + <xsl:for-each + select="exsl:node-set($structure)//bug[local-name(..) != 'depends' and @id = $id]/ancestor-or-self::bug"> + <bug id="{@id}" /> + </xsl:for-each> + </xsl:variable> + <xsl:variable name="path" + select="exsl:node-set($refererPathFragment)/bug" /> + <xsl:variable name="targetPath" + select="exsl:node-set($targetPathFragment)/bug" /> + + <!-- find closest shared container id --> + <xsl:variable name="join" + select="($path[@id = $targetPath/@id])[position() = last() ]/@id" /> + + <!-- how many levels we need to up --> + <xsl:variable name="depth" + select="count($path[@id = $join]/following-sibling::node())" /> + + <!-- DEBUG --> + <!-- <xsl:value-of select="concat('id=', $id, ',referer=', $referer/@id)" + /> <xsl:text>, path=</xsl:text> <xsl:for-each select="$targetPath"> <xsl:value-of + select="concat(name(),@id)" /> <xsl:if test="position() != last()"> <xsl:text>-</xsl:text> + </xsl:if> </xsl:for-each> --> + <!-- DEBUG --> + <!-- <xsl:value-of select="concat(', join=', $join,', depth=', $depth,' + ')" /> --> + + <!-- PRINT REFERENCE --> + <xsl:call-template name="repeat"> + <xsl:with-param name="value" select="'!'" /> + <xsl:with-param name="count" select="$depth" /> + </xsl:call-template> + <xsl:for-each select="$targetPath[@id = $join]/following-sibling::node()"> + <xsl:call-template name="bug-local-name"> + <xsl:with-param name="id" select="@id" /> + </xsl:call-template> + <xsl:if test="position() != last()"> + <xsl:text>.</xsl:text> + </xsl:if> + </xsl:for-each> + </xsl:template> <xsl:template name="start-task"> <xsl:param name="indent" /> + <xsl:param name="id" /> + <xsl:param name="desc" /> <xsl:call-template name="begin-line"> <xsl:with-param name="indent" select="$indent" /> </xsl:call-template> <xsl:text>task </xsl:text> - <xsl:call-template name="make-bug-id"> - <xsl:with-param name="id" select="bug_id" /> + <xsl:call-template name="bug-local-name"> + <xsl:with-param name="id" select="$id" /> </xsl:call-template> - <xsl:value-of select="concat(' "',short_desc,'" {')" /> + <xsl:value-of select="concat(' "',$desc,'" {')" /> <xsl:call-template name="end-line" /> </xsl:template> @@ -195,4 +278,17 @@ <xsl:template name="end-line"> <xsl:text>
</xsl:text> </xsl:template> + + <xsl:template name="repeat"> + <xsl:param name="value" /> + <xsl:param name="count" select="0" /> + + <xsl:if test="number($count)"> + <xsl:copy-of select="$value" /> + <xsl:call-template name="repeat"> + <xsl:with-param name="value" select="$value" /> + <xsl:with-param name="count" select="$count - 1" /> + </xsl:call-template> + </xsl:if> + </xsl:template> </xsl:stylesheet> \ No newline at end of file