[ant] property waarde geven als ie niet bestaat

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • 2playgames
  • Registratie: Februari 2005
  • Laatst online: 01-06 15:19
In mijn Ant-buildscript probeer ik een mechanisme te maken om automatisch een versienummer mee te geven. Dit doe ik door het command "svnversion" aan te roepen.

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
    <target name="getversion" description="Get the SVN revision number">
        
        <echo>Getting version</echo>
        
        <exec executable="svnversion" dir="."
            outputproperty="version"
            failifexecutionfails="true"
            failonerror="true">
        </exec>
        
        <echo message="Version is: ${version}" />
        
    </target>


dit werkt op zich goed. nu zou ik willen dat $version de waarde "Unknown" bevat als svnversion niet aangeroepen kan worden (bijvoorbeeld omdat het niet bestaat). Ik dacht dit zo op te lossen:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    <target name="getversion" description="Get the SVN revision number">
        
        <echo>Getting version</echo>

<!-- eerst unknown maken -->
        <property name="version" value="Unknown" />
        
        <exec executable="svnversion" dir="."
            outputproperty="version"
            failifexecutionfails="true"
            failonerror="true">
        </exec>
        
        <echo message="Version is: ${version}" />
        
    </target>


Dat geeft niet het goede resultaat. Het blijkt namelijk dat de property, als ie eenmaal is gezet, niet meer overschreven wordt door het exec-commando.

Hoe kan ik dit anders oplossen? Ik heb al gekeken naar de Condition-task maar daarin kan ik geen conditie vinden die lijkt op "als $version nog niet bestaat".

Dit is mijn script zoals in SVN

Acties:
  • 0 Henk 'm!

  • 2playgames
  • Registratie: Februari 2005
  • Laatst online: 01-06 15:19
Hoewel ik nog geen oplossing weet, heb ik voor dit geval een workaround bedacht. Ik heb een programmatje gemaakt dat svnversion uitvoert en een goede output teruggeeft. Deze roep ik dan aan in Ant (met de java-task).

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    public static void main(final String[] args) {
        
        String version = "";
        
        try {
            final Process p = Runtime.getRuntime().exec(new String[]{"svnversion"}, null, null);
            p.waitFor();
            
            if (p.exitValue() != 0) {
                throw new RuntimeException();
            }
            
            final BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
            version = r.readLine();
            if (version.startsWith("exported")) {
                version = "N/A";
            }
        } catch (Exception e) {
            // svnversion not available, interrupted or returned error
            version = "N/A";
        }
        
        System.out.println(version);

    }

Acties:
  • 0 Henk 'm!

  • bomberboy
  • Registratie: Mei 2007
  • Laatst online: 01:33

bomberboy

BOEM!

XML:
1
2
3
4
5
6
7
8
9
10
11
<target name="getversion" description="Get the SVN revision number">
  <echo>Getting version</echo>  
  <exec executable="svnversion" dir="."
            outputproperty="version"
            failifexecutionfails="false"
            failonerror="false">
  </exec>
  <!-- pas later unknown maken -->
  <property name="version" value="Unknown" />
  <echo message="Version is: ${version}" />
</target>


Als svnversion niet kan uitgevoerd worden om een of andere manier dan zal de property version nog niet gezet zijn en krijgt deze na die exec de waarde Unknown. Kan die wel uitgevoerd worden, dan wordt de waarde gewoon ingevuld.
Uiteraard mag je dan niet failen, want dan stopt het helemaal natuurlijk.

Wat mogelijks wel nog een probleem is hiermee is dat die version mogelijks niet de juist waarde krijgt als svnversion wel kan uitgevoerd worden, maar niet de gewenste output geeft. Bijvoorbeeld wanneer svnversion een of andere errormelding geeft. Dan komt de output daarvan in je version property te zitten.

Om dat te controleren kan je eventueel de exit-code van svnversion checken (resultproperty) en op basis daarvan zo'n conditional gebruiken. Maar dat is meestal enkel nuttig als die svnversion zou crashen. Indien iets "fout loopt" bv een argument dat ontbreekt ofzo krijg je typisch gewoon exit code 0. (het programma kon immers correct afgesloten worden)

Acties:
  • 0 Henk 'm!

  • 2playgames
  • Registratie: Februari 2005
  • Laatst online: 01-06 15:19
argh, so simpel, waarom bedenk ik dat zelf niet :p
maar goed, de oplossing die ik nu heb is uiteindelijk beter. het is niet handig om te veel logica in ant te stoppen