From 995cd7f3272d53cb366f3042bc7d548877820cd0 Mon Sep 17 00:00:00 2001 From: sponge <sponge@mail.i2p> Date: Wed, 1 Aug 2012 13:29:14 +0000 Subject: [PATCH] javascript all the buildnumber stuff, new target incrementBuild, use when i2p.i2p source has not changed, but android source has changed. --- AndroidManifest.xml | 4 +- custom_rules.xml | 342 +++++++++++++++++++++++++++++++-- routerjars/AndroidManifest.xml | 4 +- 3 files changed, 335 insertions(+), 15 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 90d0b0dda..27f0a5326 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.i2p.android.router" - android.versionCode="4719076" - android.versionName="0.9.0-30_b37-API8" + android.versionCode="4719075" + android.versionName="0.9.0-30_b4-API8" android:installLocation="preferExternal" > <uses-permission android:name="android.permission.INTERNET" /> diff --git a/custom_rules.xml b/custom_rules.xml index 10689f570..433424ace 100644 --- a/custom_rules.xml +++ b/custom_rules.xml @@ -15,9 +15,334 @@ <echo message="Using I2P source at ${i2pbase}" /> - <buildnumber file="scripts/build.number" /> - <!-- this loads my.version.code and my.version.name --> - <property file="scripts/version.properties" /> + <!-- Utility scripts --> + + <!-- Split a string --> + <scriptdef name="split" language="javascript"> + <attribute name="value"/> + <attribute name="sep"/> + <attribute name="prefix"/> + <![CDATA[ + values = attributes.get("value").split(attributes.get("sep")); + for(i = 0; i < values.length; i++) { + project.setNewProperty(attributes.get("prefix") + "." + i, values[i]); + } + ]]> + </scriptdef> + + <!-- Normalize the core version number --> + <scriptdef name="setcore" language="javascript"> + <attribute name="value"/> + <![CDATA[ + value = attributes.get("value").split("\n")[0]; + values = value.split('\\.'); + dots = values.length - 1; + major = values[0]; + minor = "0"; + release = "0"; + if(dots > 0) { + minor = values[1]; + if(dots > 1) { + release = values[2]; + } + } + project.setNewProperty("CORE", major + "." + minor +"." + release); + project.setNewProperty("CORE.major", major); + project.setNewProperty("CORE.minor", minor); + project.setNewProperty("CORE.release", release); + + ]]> + </scriptdef> + + <!-- Normalize the router build number --> + <scriptdef name="normalizeitem" language="javascript"> + <attribute name="value"/> + <attribute name="name" /> + <![CDATA[ + value = attributes.get("value").split("\n")[0].trim(); + project.setNewProperty(attributes.get("name"), value); + ]]> + </scriptdef> + + <!-- input prefix, major, minor, release, routerbuild, androidbuild, sdk + Assigns a version string and version number --> + <scriptdef name="generateversions" language="javascript"> + <attribute name="prefix"/> + <attribute name="major"/> + <attribute name="minor"/> + <attribute name="release"/> + <attribute name="routerbuild"/> + <attribute name="androidbuild"/> + <attribute name="sdk"/> + <![CDATA[ + Major = attributes.get("major") + "."; + Minor = attributes.get("minor") + "."; + Release = attributes.get("release") +"-"; + Routerbuild = attributes.get("routerbuild") +"_b"; + Androidbuild = attributes.get("androidbuild") +"-API"; + SDK = attributes.get("sdk"); + project.setNewProperty(attributes.get("prefix") + ".full", Major + Minor + Release + Routerbuild + Androidbuild + SDK); + /* + * Android version code is an integer. + * So we have 31 bits. + * MAJOR 4 bits 0-15 + * MINOR 8 bits 0-255 + * RELEASE 8 bits 0-255 + * ROUTERBUILD 7 bits 0-127 + * ANDROIDBUILD 4 bits 0-15 + * + * Note that ANDROIDBUILD is modded % 16, it will wrap, + * beware of that if you release multiple builds using the + * same ROUTERBUILD, or clear it if you update ROUTERBUILD + * Subtract 1 from ANDROIDBUILD since it starts at 1 after distclean. + */ + iMajor = ((parseInt(Major) % 16) << 27); + iMinor = ((parseInt(Minor) % 256) << 19); + iRelease = ((parseInt(Release)% 256) << 11); + iRouterbuild = ((parseInt(Routerbuild) % 128) << 4); + iAndroidbuild = ((parseInt(Androidbuild) - 1) % 16); + itotal = iMajor + iMinor + iRelease + iRouterbuild + iAndroidbuild; + project.setNewProperty(attributes.get("prefix") + ".vercode", itotal); + ]]> + </scriptdef> + + <!-- if file 'condition' != "true" write 'properties' to file 'name' --> + <scriptdef name="ifnotpresent" language="javascript"> + <attribute name="file" /> + <attribute name="condition" /> + <![CDATA[ + importClass(java.io.File); + importClass(java.util.Properties); + importClass(java.io.FileOutputStream); + importClass(java.io.ByteArrayInputStream); + + doit = !attributes.get("condition").equals("true"); + + if(doit) { + props = new Properties(); + props.setProperty("build.number", "1"); + cfg = new File(attributes.get("file")); + fo = new FileOutputStream(cfg); + props.store(fo, "AUTO-GENERATED FILE, DO NOT EDIT!"); + fo.close(); + } + ]]> + </scriptdef> + <!-- increment the build number --> + <scriptdef name="incbuildnumber" language="javascript"> + <attribute name="file" /> + <![CDATA[ + importClass(java.io.File); + importClass(java.util.Properties); + importClass(java.io.FileOutputStream); + importClass(java.io.FileInputStream); + + props = new Properties(); + cfg = new File(attributes.get("file")); + fi = new FileInputStream(cfg); + props.load(fi); + fi.close(); + m = (parseInt(props.getProperty("build.number")) + 1).toString(); + props.setProperty("build.number", m); + fo = new FileOutputStream(cfg); + props.store(fo, "AUTO-GENERATED FILE, DO NOT EDIT!"); + fo.close(); + ]]> + </scriptdef> + + + <!-- Update property and xml files as needed --> + <scriptdef name="propertyfilechecks" language="javascript"> + <attribute name="file" /> + <attribute name="condition" /> + <attribute name="propsdata" /> + <attribute name="buildfile" /> + <attribute name="mainxml" /> + <attribute name="libxml" /> + <![CDATA[ + importClass(java.io.File); + importClass(java.util.Properties); + importClass(java.io.FileOutputStream); + importClass(java.io.FileInputStream); + importClass(java.io.ByteArrayInputStream); + importClass(java.io.InputStream); + importClass(java.util.regex.Matcher); + importClass(java.util.regex.Pattern); + importClass(java.io.BufferedReader); + importClass(java.io.BufferedWriter); + importClass(java.lang.StringBuffer); + importClass(java.io.InputStreamReader); + importClass(java.io.FileWriter); + + doit = !attributes.get("condition").equals("true"); + + props = new Properties(); + str = attributes.get("propsdata").toString(); + is = new ByteArrayInputStream(str.getBytes()); + props.load(is); + cfg = new File(attributes.get("file")); + + if(doit) { + echo = project.createTask("echo"); + echo.setMessage("Creating file='" + attributes.get("file") + "'\n" + props); + echo.perform(); + fo = new FileOutputStream(cfg); + props.store(fo, "AUTO-GENERATED FILE, DO NOT EDIT!"); + fo.close(); + } + + /* load and compare keys that start with 'last." */ + oldprops = new Properties(); + fi = new FileInputStream(cfg); + oldprops.load(fi); + fi.close(); + keys = props.propertyNames(); + ok = true; + while (keys.hasMoreElements()) { + key = keys.nextElement(); + if (!oldprops.containsKey(key)) { + ok = false; + break; + } + if(key.startsWith("last.")) { + if(!oldprops.getProperty(key).equals(props.getProperty(key))) { + ok = false; + break; + } + } + } + if (!ok) { + /* update version.props */ + echo = project.createTask("echo"); + echo.setMessage("Updating file='" + attributes.get("file") + "'\n" + props); + echo.perform(); + fo = new FileOutputStream(cfg); + props.store(fo, "AUTO-GENERATED FILE, DO NOT EDIT!"); + fo.close(); + /* reset build.number */ + bprops = new Properties(); + bprops.setProperty("build.number", "1"); + echo = project.createTask("echo"); + echo.setMessage("Updating file='" + attributes.get("buildfile") + "'\n" + bprops); + echo.perform(); + cfg = new File(attributes.get("buildfile")); + fo = new FileOutputStream(cfg); + bprops.store(fo, "AUTO-GENERATED FILE, DO NOT EDIT!"); + fo.close(); + } + sp1 = 'android.versionCode="[0-9]*"'; + rp1 = 'android.versionCode="' + props.getProperty("my.version.code") + '"'; + sp2 = 'android.versionName="[^"]*"'; + rp2 = 'android.versionName="' + props.getProperty("my.version.name") + '"'; + + /* sed primary manifest */ + cfg = File(attributes.get("mainxml")); + buffer = new StringBuffer(); + fi = new FileInputStream(cfg); + reader = new BufferedReader(new InputStreamReader(fi)); + while((line = reader.readLine()) != null) { + rep = line.replaceAll(sp1, rp1); + newline = rep.replaceAll(sp2, rp2); + buffer.append(newline + "\n"); + } + fi.close(); + out = new BufferedWriter(new FileWriter(attributes.get("mainxml"))); + out.write(buffer.toString()); + out.close(); + /* sed secondary manifest */ + cfg = File(attributes.get("libxml")); + buffer = new StringBuffer(); + fi = new FileInputStream(cfg); + reader = new BufferedReader(new InputStreamReader(fi)); + while((line = reader.readLine()) != null) { + rep = line.replaceAll(sp1, rp1); + newline = rep.replaceAll(sp2, rp2); + buffer.append(newline + "\n"); + } + fi.close(); + out = new BufferedWriter(new FileWriter(attributes.get("libxml"))); + out.write(buffer.toString()); + out.close(); + + ]]> + </scriptdef> + + + <!-- files of interest --> + <property name="MANIFESTfilename" value="AndroidManifest.xml" /> + + <property name="MANIFESTROUTERfilename" value="routerjars/AndroidManifest.xml" /> + + <!-- Get i2p.i2p infos --> + + <property name="COREfilename" value="${i2psrc}/core/java/src/net/i2p/CoreVersion.java"/> + <loadfile srcfile="${COREfilename}" property="COREfile" encoding="UTF-8" > + <filterchain> + <tokenfilter> + <containsregex pattern='^.*public.+final.+static.+String.+VERSION.*"(.*)".*' replace="\1" /> + </tokenfilter> + </filterchain> + </loadfile> + <setcore value="${COREfile}" /> + <echo message="CORE `${CORE}`" /> + + <property name="ROUTERBUILDfilename" value="${i2psrc}/router/java/src/net/i2p/router/RouterVersion.java" /> + <loadfile srcfile="${ROUTERBUILDfilename}" property="ROUTERBUILDfile" encoding="UTF-8" > + <filterchain> + <tokenfilter> + <containsregex pattern='^.*public.+final.+static.+long.+BUILD.*=[^0-9]*([0-9]+)[^0-9]+.*' replace="\1" /> + </tokenfilter> + </filterchain> + </loadfile> + + <normalizeitem name="ROUTERBUILD" value="${ROUTERBUILDfile}" /> + <echo message="ROUTERBUILD `${ROUTERBUILD}`" /> + + + <property name="buildversionfilename" value="scripts/build.number" /> + <available file="${buildversionfilename}" property="buildversionfilename.present" /> + + <!-- if the file isn't there, do buildnumber to create it! --> + <ifnotpresent file="${buildversionfilename}" condition="${buildversionfilename.present}" /> + + <loadfile srcfile="${buildversionfilename}" property="buildversionfile" encoding="UTF-8" > + <filterchain> + <tokenfilter> + <containsregex pattern='^build.number=[^0-9]*([0-9]+)[^0-9]*.*' replace="\1" /> + </tokenfilter> + </filterchain> + </loadfile> + + <normalizeitem name="buildversion" value="${buildversionfile}" /> + <echo message="buildversion `${buildversion}`" /> + + <split value="${target}" sep="-" prefix="gettarget"/> + <echo message="API${gettarget.1}" /> + <!-- generate the version infos that we will want to see --> + <generateversions prefix="zap" major="${CORE.major}" + minor="${CORE.minor}" release="${CORE.release}" + routerbuild="${ROUTERBUILD}" androidbuild="${buildversion}" + sdk="${gettarget.1}"/> + + <echo message="checking for changes in ${zap.full}" /> + + <property name="allversionsfilename" value="scripts/version.properties" /> + <available file="${allversionsfilename}" property="allversionsfilename.present" /> + <!-- if the file is not available, create it with the current infos --> + <propertyfilechecks file="${allversionsfilename}" condition="${allversionsfilename.present}" + propsdata="my.version.name=${zap.full} my.version.code=${zap.vercode} last.CORE=${CORE} last.ROUTERBUILD=${ROUTERBUILD} " + buildfile="${buildversionfile}" + mainxml="${MANIFESTfilename}" + libxml="${MANIFESTROUTERfilename}" + /> + <loadfile srcfile="${allversionsfilename}" property="allversionsfile" encoding="UTF-8"/> + <echo message="${allversionsfile}" /> + + + + <property file="${buildversionfile}" /> + <!-- this loads my.version.code and my.version.name, and performs a copy --> + <property file="${allversionsfilename}" /> <property name="version.code" value="${my.version.code}" /> <property name="version.name" value="${my.version.name}" /> <echo message="version.code '${version.code}', 'version.name '${version.name}', '${my.version.name}'" /> @@ -29,21 +354,16 @@ --> <!-- - You must execute this target manually to increment the build number. + You must execute this target manually to force increment of the build number. Sorry if this is an extra step. - - TO-DO: Move this to js so that it is cross-platform. -*- Sponge --> <target name="incrementBuild" > - <exec executable="sh" osfamily="unix" failonerror="true"> - <arg value="-c" /> - <arg value="scripts/setversion.sh ${i2pbase}" /> - </exec> - + <incbuildnumber file="${buildversionfilename}" /> </target> + <!-- overrides of those in main_rules.xml --> <target name="-pre-build" depends="copy-i2p-resources" > diff --git a/routerjars/AndroidManifest.xml b/routerjars/AndroidManifest.xml index d57bef015..ffb4e3201 100644 --- a/routerjars/AndroidManifest.xml +++ b/routerjars/AndroidManifest.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.i2p.android.router" - android.versionCode="4719076" - android.versionName="0.9.0-30_b37-API8" + android.versionCode="4719075" + android.versionName="0.9.0-30_b4-API8" android:installLocation="preferExternal" > -- GitLab