Bug 32804 - check version of Ant
Summary: check version of Ant
Status: CLOSED FIXED
Alias: None
Product: Ant
Classification: Unclassified
Component: Core tasks (show other bugs)
Version: 1.6.2
Hardware: All All
: P2 enhancement (vote)
Target Milestone: 1.7.0
Assignee: Ant Notifications List
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2004-12-22 18:15 UTC by Tomasz Bech
Modified: 2008-11-14 06:45 UTC (History)
1 user (show)



Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Tomasz Bech 2004-12-22 18:15:56 UTC
It would be nice to have possibility to check version of Ant in build.xml script
(that is needed when there is uneducated customer which is ignoring requirements
of ant/java versions described in document - so we have to put 'fail' in ant
script to stop doing stupid thing by the customer)
Currently there are used too tricks (what I found):
- based on checking if pointed class exists (like MacroDef from 1.6);
- using contains + ${ant.version}
But both have cause (or can) some problems, for example class can be moved in
future versions.
Below is small proposal of checkVersion task:
<checkVersion name="ant.version.number" value="- + = += -=(means less greater
equal, greater equal) version here, i.e. +=1.6.1" property="property name to set
when condition not met"/>

Idea is that it can be used for any version checking which follows standard
pattern: number.number.number. Additional needed extension is
'ant.version.number' which returns just the number.
Comment 1 Jesse Glick 2004-12-22 21:53:21 UTC
Would indeed be useful. Should probably be a condition, e.g.

<fail message="Sorry, this script requires Ant 1.7+.">
    <condition>
        <not>
            <antversion atleast="1.7"/>
        </not>
    </condition>
</fail>

Here the proposed condition would just support two (mutually exclusive) attrs,
'atleast' and 'exactly', with 'atleast' doing a lexicographic-numeric check I guess.
Comment 2 Jan Mat 2004-12-23 08:01:12 UTC
Not the "cleanest" way, but I wrote two *def´s for handling with that:

<project name="common-define-checkAnt">
    <scriptdef name="checkAnt" language="javascript">
        <![CDATA[
            importClass(java.text.SimpleDateFormat);
            importClass(java.util.Locale);

            // String evaluation of 'ant.version' string
            // e.g: 'Apache Ant version 1.6beta3 compiled on December 5 2003'
            string   = project.getProperty("ant.version");
            version  = string.substring(string.indexOf("Ant version")+12, 
string.indexOf("compiled on")-1);
            compiled = string.substring(string.indexOf("compiled on")+12);

            // Get the compiled date: 'December 5 2003'
            dateParser = new SimpleDateFormat("MMM d yyyy", Locale.US);
            compiledDate = dateParser.parse(compiled);

            compiledYear  = (new SimpleDateFormat("yyyy")).format(compiledDate);
            compiledMonth = (new SimpleDateFormat("M")   ).format(compiledDate);
            compiledDay   = (new SimpleDateFormat("d")   ).format(compiledDate);

            project.setNewProperty("ant.version.number", version);
            project.setNewProperty("ant.version.compiled", compiled);
            project.setNewProperty("ant.version.compiled.year", compiledYear);
            project.setNewProperty("ant.version.compiled.month", compiledMonth);
            project.setNewProperty("ant.version.compiled.day", compiledDay);
        ]]>
    </scriptdef>
</project>


<project name="common-define-needAnt">
    <scriptdef name="needAnt" language="javascript">
        <attribute name="version"/>
        <![CDATA[
            needed = attributes.get("version");

            string = project.getProperty("ant.version");
            actual = string.substring(string.indexOf("Ant version")+12, 
string.indexOf("compiled on")-1);

            neededInt = getInt(needed);
            actualInt = getInt(actual);

            verbose("Needed: " + needed + " --> " + neededInt);
            verbose("Actual: " + actual + " --> " + actualInt);

            check = false;
            if (actualInt >= neededInt) check = true;

            if (!check) {
                java.lang.System.out.println(" -- abbruch --");
                fail = project.createTask("fail");
                fail.setMessage("Needed Ant-Version (" + needed + ") not 
available. Was: " + actual);
                fail.perform();
            }

            // convert the version string to int value for easier comparison
            function getInt(string) {
                if (string.equals("1.1"))   return 11;
                if (string.equals("1.2"))   return 12;
                if (string.equals("1.3"))   return 13;
                if (string.equals("1.4"))   return 14;
                if (string.equals("1.4.1")) return 14.1;
                if (string.equals("1.5"))   return 15;
                if (string.equals("1.5.1")) return 15.1;
                if (string.equals("1.5.2")) return 15.2;
                if (string.equals("1.5.3")) return 15.3;
                if (string.equals("1.5.4")) return 15.4;
                if (string.equals("1.5alpha"))  return 15.880;
                if (string.equals("1.6beta1"))  return 15.991;
                if (string.equals("1.6beta2"))  return 15.992;
                if (string.equals("1.6beta3"))  return 15.993;
                if (string.equals("1.6"))       return 16;
                if (string.equals("1.6.0")  )   return 16;
                if (string.equals("1.6.1")  )   return 16.1;
                if (string.equals("1.6.2")  )   return 16.2;
                if (string.equals("1.6.3")  )   return 16.3;
                if (string.equals("1.7alpha"))  return 16.880;
                if (string.equals("1.7beta"))   return 16.990;
                if (string.equals("1.7"))       return 17;
                if (string.equals("1.7.0"))     return 17;
                if (string.equals("1.7.1"))     return 17.1;
                if (string.equals("1.7.2"))     return 17.2;
                return 0;
            }

            // log-message
            function verbose(msg) {
                project.log("[needAnt]  " + msg, project.MSG_VERBOSE);
            }
        ]]>
    </scriptdef>
</project>
Comment 3 Jesse Glick 2006-06-01 20:03:29 UTC
So this is now FIXED with target milestone 1.7, right? Needs mention in WHATSNEW
I guess.

Unfortunate that you can't use this condition in any pre-1.7 scripts, which
means it will only really be useful far into the future when 1.6.5 is a distant
memory.
Comment 4 Peter Reilly 2006-11-13 12:50:19 UTC
It is in ant 1.7, I have added a manual entry for it.
Comment 5 Jesse Glick 2006-11-13 13:32:44 UTC
Seems to work:

    <fail message="too old">
        <condition>
            <not>
                <antversion atleast="1.7.0"/>
            </not>
        </condition>
    </fail>

Ant 1.6.5 fails, although with an unhelpful message:

Class org.apache.tools.ant.taskdefs.condition.Not doesn't support the nested
"antversion" element.