Java Getriebe

Java und NetBeans

Automatische „Implementation Version“ für Module

Vor ein paar Jahren hatte ich schon mal einen Blogartikel „Subversion Revision als Implementation Version verwenden“ erstellt in dem ich die Nummer des letzten Subversion-Commits automatisch als Implementation Version des Moduls eingetragen habe. An der grundsätzlichen Vorgehensweise hat sich seit dem eigentlich nichts geändert. Bei uns werden auf diese Art und Weise immer noch die Module versioniert. In diesem Beitrag möchte ich einfach nur eine aktueller Version des Skriptes vorstellen, die zum einen ohne temporäre Datei auskommt und auch mit aktuellen Subversion-Versionen kompatibel ist:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?xml version="1.0" encoding="UTF-8"?>
<project name="svnversion" default="svnversion" basedir=".."
 xmlns:unless="ant:unless">
  <!--
    (c) 2010-2015 Jens Hofschröer, http://blog.nigjo.de/
    (CC BY-SA 4.0 http://creativecommons.org/licenses/by-sa/4.0/)

    for current Version see:
    http://blog.nigjo.de/netbeans/go/svnversion
   -->
  <description>Helperscript to set the implementation version to latest svn commit revision.</description>
  <!--
   copy this file to your nbproject folder of your suite project
   (or to modules' nbproject for stand-alone modules)

   add these lines to your modules build.xml:
   ~~~ 8< ~~~~~~~~~~ 8< ~~~~~~~~~~ 8< ~~~~~~~~~~ 8< ~~~~~~~~~~ 8< ~~~~~~~
   <import file="${suite.dir}/nbproject/svnversion.xml"/>
   <target name="build-init" depends="svnversion.update-impl-version,harness.build-init"/>
   ~~~ 8< ~~~~~~~~~~ 8< ~~~~~~~~~~ 8< ~~~~~~~~~~ 8< ~~~~~~~~~~ 8< ~~~~~~~
   (remove "${suite.dir}/" for stand-alone modules)

   set "Append Implementation Versions Automatically" in module settings.

   See current version of this file at
   http://blog.nigjo.de/netbeans/go/svnversion
  -->

  <!--
   Used properties:

   svnversion.revision:
       Found Revision for current module. Falls back to "0" if not a dir
       controlled by subversion.

   svnversion.dir:
       Directory to check commit revision. Falls back to ${basedir}.

   svnversion.executable:
       Full path to "svnversion"-CLI-Tool. Should not be set if svn-cli is in
       system search path.

   svnversion.disable:
       To disable the auto replacement set this to "true"

 -->

  <target name="update-impl-version" depends="-init-svnversion" if="svn.available">
    <!-- redirect used manifest -->
    <property name="manifest.mf.source" location="manifest.mf"/>
    <property name="manifest.mf" location="build/manifest-svn.mf"/>

    <property name="svnversion.dir" location="${basedir}"/>
    <property name="svnversion.dir.resolved" location="${svnversion.dir}"/>

    <!-- check module project settings -->
    <property file="${manifest.mf.source}" prefix="svnmf"/>
    <fail if="svnmf.OpenIDE-Module-Specification-Version"
    message="Please enable 'Append Implementation Versions automaticaly'"/>

    <svnversion property="svnversion.revision" dir="${svnversion.dir.resolved}"/>
    <!-- fallback -->
    <echo unless:set="svnversion.revision" level="warn">Unversioned directory &quot;@{dir}&quot;.</echo>
    <property name="svnversion.revision" value="0"/>

    <mkdir dir="build"/>
    <copy file="${manifest.mf.source}" tofile="${manifest.mf}"/>
    <manifest file="${manifest.mf}" mode="update">
      <attribute name="OpenIDE-Module-Implementation-Version"
                value="${svnversion.revision}"/>
    </manifest>
  </target>
  <target name="-init-svnversion">
    <condition property="svnversion.executable" value="svnversion.exe">
      <os family="windows"/>
    </condition>
    <property name="svnversion.executable" value="svnversion"/>

    <condition property="svn.available">
      <and>
        <or>
          <available file="${svnversion.executable}"/>
          <available file="${svnversion.executable}" filepath="${java.library.path}"/>
          <!-- replacement can be disabled in modules project.properties -->
        </or>
        <not><istrue value="${svnversion.disable}"/></not>
      </and>
    </condition>

    <macrodef name="svnversion">
      <attribute name="property"/>
      <attribute name="dir"/>
      <sequential>
        <!-- replace implementation version by svn revision. -->
        <exec executable="${svnversion.executable}" outputproperty="@{property}.raw"
             failifexecutionfails="true">
          <arg value="-c"/>
          <arg value="-q"/>
          <arg value="@{dir}"/>
        </exec>
        <!-- moeglich sind z.B.: "2", "2M", "16094:16095M" -->
        <script language="javascript"><![CDATA[
           var raw = project.getProperty("@{property}.raw");
           if(raw.matches("(\\d+:)?(\\d+)([MSP]+)?")) {
             var rev = raw.replaceFirst("(\\d+:)?(\\d+)([MSP]+)?", "$2");
             project.setNewProperty("@{property}", rev);
           }
         ]]></script>
      </sequential>
    </macrodef>

  </target>
</project>

Auch in dieser Version wird eine eigene Manifest-Datei erzeugt, die dann die „neue“ Implementation Version beinhaltet. Allerdings wird nicht mehr der Befehl „svn info“ verwendet sondern das Tool „svnversion„. Das Tool hat den Vorteil, dass ich deutlich einfacher an die gewünschte Information zur Commit Revision kommen und zusätzlich den Vorteil habe keine temporäre Datei zu benötigen. Die Ausgabe wird von ein paar Zeilen JavaScript ergänzt um den interessanten Teil herauszufiltern.

Das Skript kann unverändert in das nbproject Verzeichnis eines „Stand-alone“-Moduls kopiert werden. Für Suite-Projekte sollte das Skript nicht in den Modulen selbst liegen sondern im Suiteprojekt. Die beiden Zeilen, die in die build.xml Dateien der Module eingetragen werden muss sind oben im Skript selbst beschrieben.

Creative Commons Lizenzvertrag
Das Skript ist lizenziert unter einer Creative Commons Namensnennung – Weitergabe unter gleichen Bedingungen 4.0 International Lizenz.

One Response to Automatische „Implementation Version“ für Module

  1. Pingback: Automatische „Implementation Version“ für Module mit Git |