Bug 44980 - Add properties that reference the default target and the target(s) specified on the command line
Add properties that reference the default target and the target(s) specified ...
Status: RESOLVED FIXED
Product: Ant
Classification: Unclassified
Component: Core
1.7.0
PC All
: P2 enhancement (vote)
: ---
Assigned To: Ant Notifications List
http://mail-archives.apache.org/mod_m...
:
Depends on:
Blocks:
  Show dependency tree
 
Reported: 2008-05-12 16:55 UTC by Colm Smyth
Modified: 2008-06-04 04:00 UTC (History)
0 users



Attachments
Ant Recursion Patch (2.10 KB, patch)
2008-05-12 16:55 UTC, Colm Smyth
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Colm Smyth 2008-05-12 16:55:07 UTC
Created attachment 21953 [details]
Ant Recursion Patch

Ant has some support for recursing a target down a build hierarchy in the form of the following:
- fileset can specify a list of directories or build files
- antcontrib:for can do iteration

However each target has to handle recursion itself.

I have developed a patch (roughly 30 extra lines of code across 6 files) adds two new
*dynamic* properties to Ant:
 1) ant.project.target - the default target of the current project
 2) ant.current.target - a comma-separated list of the actual targets
that were invoked on the current project

These properties are updated automatically, similar to ant.file or
ant.project.name.

The "recurse" macro uses the antcontrib:for task to iterate over
multiple targets (btw, the currnet antcontrib jar is missing the "for" task in its properties). The macro can accept an explicit list of
targets, but I also wanted to be able to recurse on the targets that
were actually invoked.

Here's how you would use it:

 <!-- define the "recurse" macro -->
 <typedef file="recurse.xml"/>

 <!-- "subdirs" is the ordered list of sub-folders that "recurse" uses -->
 <filelist dir="." id="subdirs" files="x1,x2"/>

 <!-- invokes the macro on the current target(s), which may be the
ones specified or falls back to the default target -->
 <recurse/>

Alternatively:
 <!-- invoke the macro on the specified targets -->
 <recurse targets="this,that,other"/>

I've attached the patch. The "recurse" macro is trivial using the new properties:
<?xml version="1.0"?>
<antlib xmlns:antcontrib="antlib:net.sf.antcontrib">
    <macrodef name="recurse">
        <attribute name="targets" default="${ant.current.target}"/>
        <sequential>
            <condition property="recurseTargets" value="${ant.project.target}" else="@{targets}">
              <equals arg1="@{targets}" arg2="" />
            </condition>
            <antcontrib:for list="${recurseTargets}" param="target">
                <sequential>
                    <subant target="@{target}">
                        <filelist refid="subdirs"/>
                    </subant>
                </sequential>
            </antcontrib:for>
        </sequential>
    </macrodef>
</antlib>
Comment 1 Stefan Bodewig 2008-05-30 01:07:31 UTC
personally I don't see any problems with adding the two properties you suggested, will start a dedicated thread on the dev list.

I might disagree with minor details of the patch, in particular I'd probably move the listTo... method into oata.util.CollectionUtils.

Even though the patch looks trivial, I'd appreciate tests ;-)

Those details can and will be hashed out within minutes once we agree that the feature itself is desirable.
Comment 2 Stefan Bodewig 2008-06-04 04:00:06 UTC
http://svn.apache.org/viewvc?rev=663051&view=rev
http://svn.apache.org/viewvc?rev=663061&view=rev

By changing Project rather than Main to set the list of invoked targets no longer was necessary to modify <*ant*> at all. 

Thanks