diff options
author | Raphael Moll <ralf@android.com> | 2012-05-04 10:58:21 -0700 |
---|---|---|
committer | Raphael Moll <ralf@android.com> | 2012-05-04 13:04:25 -0700 |
commit | d113f3dc4354ac56cc51cf698610807b5bad914c (patch) | |
tree | 264b7dc2dcc03e675265a97aac289502b199bf70 /sdkmanager/libs/sdklib | |
parent | ba6bbd023bcb9e5c8fb3515a159aa8a374704ce2 (diff) | |
download | sdk-d113f3dc4354ac56cc51cf698610807b5bad914c.zip sdk-d113f3dc4354ac56cc51cf698610807b5bad914c.tar.gz sdk-d113f3dc4354ac56cc51cf698610807b5bad914c.tar.bz2 |
SDK Manager change format of revision property.
Instead of storing the full revision as 4 separate
properties, this stores it using the legacy
"Pkg.Revision" property with the "1.2.3 rc4"
format. It reduces the number of properties to
maintain, it's more human-readable and it's
easier when we want to have min-tools-rev be
a full revision in the next CL (otherwise it
means 4 more properties, etc.)
Change-Id: I94ebc4786e83c5b565a6d3a33d11efdfda6f72c5
Diffstat (limited to 'sdkmanager/libs/sdklib')
10 files changed, 229 insertions, 39 deletions
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkManager.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkManager.java index a786728..8284054 100644 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkManager.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkManager.java @@ -463,7 +463,7 @@ public class SdkManager { int revision = 1; LayoutlibVersion layoutlibVersion = null; try { - revision = Integer.parseInt(platformProp.get(PkgProps.PKG_MAJOR_REV)); + revision = Integer.parseInt(platformProp.get(PkgProps.PKG_REVISION)); } catch (NumberFormatException e) { // do nothing, we'll keep the default value of 1. } diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevision.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevision.java index a90fa0a..40235c2 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevision.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevision.java @@ -16,6 +16,11 @@ package com.android.sdklib.internal.repository.packages;
+import com.android.annotations.NonNull;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
/**
* Package multi-part revision number composed of a tuple
@@ -32,6 +37,10 @@ public class FullRevision implements Comparable<FullRevision> { public static final int IMPLICIT_MICRO_REV = 0;
public static final int NOT_A_PREVIEW = 0;
+ private final static Pattern FULL_REVISION_PATTERN =
+ // 1=major 2=minor 3=micro 4=preview
+ Pattern.compile("\\s*([0-9]+)(?:\\.([0-9]+)(?:\\.([0-9]+))?)?\\s*(?:rc([0-9]+))?\\s*");
+
private final int mMajor;
private final int mMinor;
private final int mMicro;
@@ -73,6 +82,52 @@ public class FullRevision implements Comparable<FullRevision> { }
/**
+ * Parses a string of format "major.minor.micro rcPreview" and returns
+ * a new {@link FullRevision} for it. All the fields except major are
+ * optional.
+ * <p/>
+ * The parsing is equivalent to the pseudo-BNF/regexp:
+ * <pre>
+ * Major/Minor/Micro/Preview := [0-9]+
+ * Revision := Major ('.' Minor ('.' Micro)? )? \s* ('rc'Preview)?
+ * </pre>
+ *
+ * @param revision A non-null revision to parse.
+ * @return A new non-null {@link FullRevision}.
+ * @throws NumberFormatException if the parsing failed.
+ */
+ public static @NonNull FullRevision parseRevision(@NonNull String revision)
+ throws NumberFormatException {
+
+ if (revision == null) {
+ throw new NumberFormatException("revision is <null>"); //$NON-NLS-1$
+ }
+
+ Throwable cause = null;
+ try {
+ Matcher m = FULL_REVISION_PATTERN.matcher(revision);
+ if (m != null && m.matches()) {
+ int major = Integer.parseInt(m.group(1));
+ String s = m.group(2);
+ int minor = s == null ? IMPLICIT_MINOR_REV : Integer.parseInt(s);
+ s = m.group(3);
+ int micro = s == null ? IMPLICIT_MICRO_REV : Integer.parseInt(s);
+ s = m.group(4);
+ int preview = s == null ? NOT_A_PREVIEW : Integer.parseInt(s);
+
+ return new FullRevision(major, minor, micro, preview);
+ }
+ } catch (Throwable t) {
+ cause = t;
+ }
+
+ NumberFormatException n = new NumberFormatException(
+ "Invalid full revision: " + revision); //$NON-NLS-1$
+ n.initCause(cause);
+ throw n;
+ }
+
+ /**
* Returns the version in a fixed format major.minor.micro
* with an optional "rc preview#". For example it would
* return "18.0.0", "18.1.0" or "18.1.2 rc5".
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevisionPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevisionPackage.java index 10c4ce0..6028873 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevisionPackage.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevisionPackage.java @@ -102,12 +102,19 @@ public abstract class FullRevisionPackage extends Package super(source, props, revision, license, description, descUrl,
archiveOs, archiveArch, archiveOsPath);
- int major = getPropertyInt(props, PkgProps.PKG_MAJOR_REV,revision);
- int minor = getPropertyInt(props, PkgProps.PKG_MINOR_REV, FullRevision.IMPLICIT_MINOR_REV);
- int micro = getPropertyInt(props, PkgProps.PKG_MICRO_REV, FullRevision.IMPLICIT_MINOR_REV);
- int preview = getPropertyInt(props, PkgProps.PKG_PREVIEW_REV, FullRevision.NOT_A_PREVIEW);
+ String revStr = getProperty(props, PkgProps.PKG_REVISION, null);
- mPreviewVersion = new FullRevision(major, minor, micro, preview);
+ FullRevision rev = null;
+ if (revStr != null) {
+ try {
+ rev = FullRevision.parseRevision(revStr);
+ } catch (NumberFormatException ignore) {}
+ }
+ if (rev == null) {
+ rev = new FullRevision(revision);
+ }
+
+ mPreviewVersion = rev;
}
@Override
@@ -118,11 +125,7 @@ public abstract class FullRevisionPackage extends Package @Override
public void saveProperties(Properties props) {
super.saveProperties(props);
-
- props.setProperty(PkgProps.PKG_MAJOR_REV, Integer.toString(mPreviewVersion.getMajor()));
- props.setProperty(PkgProps.PKG_MINOR_REV, Integer.toString(mPreviewVersion.getMinor()));
- props.setProperty(PkgProps.PKG_MICRO_REV, Integer.toString(mPreviewVersion.getMicro()));
- props.setProperty(PkgProps.PKG_PREVIEW_REV, Integer.toString(mPreviewVersion.getPreview()));
+ props.setProperty(PkgProps.PKG_REVISION, mPreviewVersion.toString());
}
@Override
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MajorRevision.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MajorRevision.java index 2678b1f..9ca9e22 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MajorRevision.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MajorRevision.java @@ -16,6 +16,8 @@ package com.android.sdklib.internal.repository.packages;
+import com.android.annotations.NonNull;
+
/**
* Package revision number composed of a <em>single</em> major revision.
@@ -34,4 +36,21 @@ public class MajorRevision extends FullRevision { public String toString() {
return super.toShortString();
}
+
+ /**
+ * Parses a single-integer string and returns a new {@link MajorRevision} for it.
+ *
+ * @param revision A non-null revision to parse.
+ * @return A new non-null {@link MajorRevision}.
+ * @throws NumberFormatException if the parsing failed.
+ */
+ public static @NonNull MajorRevision parseRevision(@NonNull String revision)
+ throws NumberFormatException {
+
+ if (revision == null) {
+ throw new NumberFormatException("revision is <null>"); //$NON-NLS-1$
+ }
+
+ return new MajorRevision(Integer.parseInt(revision.trim()));
+ }
}
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MajorRevisionPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MajorRevisionPackage.java index 7e61e5f..1348bb9 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MajorRevisionPackage.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MajorRevisionPackage.java @@ -77,7 +77,19 @@ public abstract class MajorRevisionPackage extends Package { super(source, props, revision, license, description, descUrl,
archiveOs, archiveArch, archiveOsPath);
- mRevision = new MajorRevision(getPropertyInt(props, PkgProps.PKG_MAJOR_REV, revision));
+ String revStr = getProperty(props, PkgProps.PKG_REVISION, null);
+
+ MajorRevision rev = null;
+ if (revStr != null) {
+ try {
+ rev = MajorRevision.parseRevision(revStr);
+ } catch (NumberFormatException ignore) {}
+ }
+ if (rev == null) {
+ rev = new MajorRevision(revision);
+ }
+
+ mRevision = rev;
}
/**
@@ -93,7 +105,7 @@ public abstract class MajorRevisionPackage extends Package { @Override
public void saveProperties(Properties props) {
super.saveProperties(props);
- props.setProperty(PkgProps.PKG_MAJOR_REV, Integer.toString(mRevision.getMajor()));
+ props.setProperty(PkgProps.PKG_REVISION, mRevision.toString());
}
@Override
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/PkgProps.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/PkgProps.java index 4406b42..571a4a6 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/PkgProps.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/PkgProps.java @@ -29,6 +29,7 @@ package com.android.sdklib.repository; public class PkgProps {
// Base Package
+ public static final String PKG_REVISION = "Pkg.Revision"; //$NON-NLS-1$
public static final String PKG_LICENSE = "Pkg.License"; //$NON-NLS-1$
public static final String PKG_DESC = "Pkg.Desc"; //$NON-NLS-1$
public static final String PKG_DESC_URL = "Pkg.DescUrl"; //$NON-NLS-1$
@@ -37,13 +38,6 @@ public class PkgProps { public static final String PKG_SOURCE_URL = "Pkg.SourceUrl"; //$NON-NLS-1$
public static final String PKG_OBSOLETE = "Pkg.Obsolete"; //$NON-NLS-1$
- // FullRevision
- // Note that MajorRev keeps the legacy "Pkg.Revision" property name for legacy compatibility.
- public static final String PKG_MAJOR_REV = "Pkg.Revision"; //$NON-NLS-1$
- public static final String PKG_MINOR_REV = "Pkg.MinorRev"; //$NON-NLS-1$
- public static final String PKG_MICRO_REV = "Pkg.MicroRev"; //$NON-NLS-1$
- public static final String PKG_PREVIEW_REV = "Pkg.PreviewRev"; //$NON-NLS-1$
-
// AndroidVersion
public static final String VERSION_API_LEVEL = "AndroidVersion.ApiLevel";//$NON-NLS-1$
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/FullRevisionPackageTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/FullRevisionPackageTest.java index d816256..9bf2703 100755 --- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/FullRevisionPackageTest.java +++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/FullRevisionPackageTest.java @@ -34,14 +34,7 @@ public class FullRevisionPackageTest extends TestCase { public static Properties createProps(FullRevision revision) { Properties props = new Properties(); if (revision != null) { - props.setProperty(PkgProps.PKG_MAJOR_REV, - Integer.toString(revision.getMajor())); - props.setProperty(PkgProps.PKG_MINOR_REV, - Integer.toString(revision.getMinor())); - props.setProperty(PkgProps.PKG_MICRO_REV, - Integer.toString(revision.getMicro())); - props.setProperty(PkgProps.PKG_PREVIEW_REV, - Integer.toString(revision.getPreview())); + props.setProperty(PkgProps.PKG_REVISION, revision.toString()); } return props; } diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/FullRevisionTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/FullRevisionTest.java index 97e76bb..d072d05 100755 --- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/FullRevisionTest.java +++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/FullRevisionTest.java @@ -20,16 +20,6 @@ import junit.framework.TestCase; public class FullRevisionTest extends TestCase { - @Override - protected void setUp() throws Exception { - super.setUp(); - } - - @Override - protected void tearDown() throws Exception { - super.tearDown(); - } - public final void testFullRevision() { FullRevision p = new FullRevision(5); assertEquals(5, p.getMajor()); @@ -38,7 +28,9 @@ public class FullRevisionTest extends TestCase { assertEquals(FullRevision.NOT_A_PREVIEW, p.getPreview()); assertFalse (p.isPreview()); assertEquals("5", p.toShortString()); + assertEquals(p, FullRevision.parseRevision("5")); assertEquals("5.0.0", p.toString()); + assertEquals(p, FullRevision.parseRevision("5.0.0")); p = new FullRevision(5, 0, 0, 6); assertEquals(5, p.getMajor()); @@ -47,7 +39,9 @@ public class FullRevisionTest extends TestCase { assertEquals(6, p.getPreview()); assertTrue (p.isPreview()); assertEquals("5 rc6", p.toShortString()); + assertEquals(p, FullRevision.parseRevision("5 rc6")); assertEquals("5.0.0 rc6", p.toString()); + assertEquals(p, FullRevision.parseRevision("5.0.0 rc6")); p = new FullRevision(6, 7, 0); assertEquals(6, p.getMajor()); @@ -56,7 +50,9 @@ public class FullRevisionTest extends TestCase { assertEquals(0, p.getPreview()); assertFalse (p.isPreview()); assertEquals("6.7", p.toShortString()); + assertEquals(p, FullRevision.parseRevision("6.7")); assertEquals("6.7.0", p.toString()); + assertEquals(p, FullRevision.parseRevision("6.7.0")); p = new FullRevision(10, 11, 12, FullRevision.NOT_A_PREVIEW); assertEquals(10, p.getMajor()); @@ -66,6 +62,7 @@ public class FullRevisionTest extends TestCase { assertFalse (p.isPreview()); assertEquals("10.11.12", p.toShortString()); assertEquals("10.11.12", p.toString()); + assertEquals(p, FullRevision.parseRevision("10.11.12")); p = new FullRevision(10, 11, 12, 13); assertEquals(10, p.getMajor()); @@ -75,6 +72,48 @@ public class FullRevisionTest extends TestCase { assertTrue (p.isPreview()); assertEquals("10.11.12 rc13", p.toShortString()); assertEquals("10.11.12 rc13", p.toString()); + assertEquals(p, FullRevision.parseRevision("10.11.12 rc13")); + assertEquals(p, FullRevision.parseRevision(" 10.11.12 rc13")); + assertEquals(p, FullRevision.parseRevision("10.11.12 rc13 ")); + assertEquals(p, FullRevision.parseRevision(" 10.11.12 rc13 ")); + } + + public final void testParseError() { + String errorMsg = null; + try { + FullRevision.parseRevision("not a number"); + fail("FullRevision.parseRevision should thrown NumberFormatException"); + } catch (NumberFormatException e) { + errorMsg = e.getMessage(); + } + assertEquals("Invalid full revision: not a number", errorMsg); + + errorMsg = null; + try { + FullRevision.parseRevision("5 .6 .7"); + fail("FullRevision.parseRevision should thrown NumberFormatException"); + } catch (NumberFormatException e) { + errorMsg = e.getMessage(); + } + assertEquals("Invalid full revision: 5 .6 .7", errorMsg); + + errorMsg = null; + try { + FullRevision.parseRevision("5.0.0 preview 1"); + fail("FullRevision.parseRevision should thrown NumberFormatException"); + } catch (NumberFormatException e) { + errorMsg = e.getMessage(); + } + assertEquals("Invalid full revision: 5.0.0 preview 1", errorMsg); + + errorMsg = null; + try { + FullRevision.parseRevision(" 5.1.2 rc 42 "); + fail("FullRevision.parseRevision should thrown NumberFormatException"); + } catch (NumberFormatException e) { + errorMsg = e.getMessage(); + } + assertEquals("Invalid full revision: 5.1.2 rc 42 ", errorMsg); } public final void testCompareTo() { diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MajorRevisionTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MajorRevisionTest.java new file mode 100755 index 0000000..b77caad --- /dev/null +++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MajorRevisionTest.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.sdklib.internal.repository.packages; + +import junit.framework.TestCase; + +public class MajorRevisionTest extends TestCase { + + public final void testMajorRevision() { + MajorRevision p = new MajorRevision(5); + assertEquals(5, p.getMajor()); + assertEquals(FullRevision.IMPLICIT_MINOR_REV, p.getMinor()); + assertEquals(FullRevision.IMPLICIT_MICRO_REV, p.getMicro()); + assertEquals(FullRevision.NOT_A_PREVIEW, p.getPreview()); + assertFalse (p.isPreview()); + assertEquals("5", p.toShortString()); + assertEquals(p, MajorRevision.parseRevision("5")); + assertEquals("5", p.toString()); + + assertEquals(new FullRevision(5, 0, 0, 0), p); + } + + public final void testParseError() { + String errorMsg = null; + try { + MajorRevision.parseRevision("5.0.0"); + fail("MajorRevision.parseRevision should thrown NumberFormatException"); + } catch (NumberFormatException e) { + errorMsg = e.getMessage(); + } + assertEquals("For input string: \"5.0.0\"", errorMsg); + } + + public final void testCompareTo() { + MajorRevision s4 = new MajorRevision(4); + MajorRevision i4 = new MajorRevision(4); + FullRevision g5 = new FullRevision (5, 1, 0, 6); + MajorRevision y5 = new MajorRevision(5); + FullRevision c5 = new FullRevision (5, 1, 0, 6); + FullRevision o5 = new FullRevision (5, 0, 0, 7); + FullRevision p5 = new FullRevision (5, 1, 0, 0); + + assertEquals(s4, i4); // 4.0.0-0 == 4.0.0-0 + assertEquals(g5, c5); // 5.1.0-6 == 5.1.0-6 + + assertFalse(y5.equals(p5)); // 5.0.0-0 != 5.1.0-0 + assertFalse(g5.equals(p5)); // 5.1.0-6 != 5.1.0-0 + assertTrue (s4.compareTo(i4) == 0); // 4.0.0-0 == 4.0.0-0 + assertTrue (s4.compareTo(y5) < 0); // 4.0.0-0 < 5.0.0-0 + assertTrue (y5.compareTo(y5) == 0); // 5.0.0-0 == 5.0.0-0 + assertTrue (y5.compareTo(p5) < 0); // 5.0.0-0 < 5.1.0-0 + assertTrue (o5.compareTo(y5) < 0); // 5.0.0-7 < 5.0.0-0 + assertTrue (p5.compareTo(p5) == 0); // 5.1.0-0 == 5.1.0-0 + assertTrue (c5.compareTo(p5) < 0); // 5.1.0-6 < 5.1.0-0 + assertTrue (p5.compareTo(c5) > 0); // 5.1.0-0 > 5.1.0-6 + assertTrue (p5.compareTo(o5) > 0); // 5.1.0-0 > 5.0.0-7 + assertTrue (c5.compareTo(o5) > 0); // 5.1.0-6 > 5.0.0-7 + assertTrue (o5.compareTo(o5) == 0); // 5.0.0-7 > 5.0.0-7 + } + +} diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/PackageTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/PackageTest.java index 6023b5a..f4d7b56 100755 --- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/PackageTest.java +++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/PackageTest.java @@ -136,7 +136,7 @@ public class PackageTest extends TestCase { Properties props = new Properties(); // Package properties - props.setProperty(PkgProps.PKG_MAJOR_REV, "42"); + props.setProperty(PkgProps.PKG_REVISION, "42"); props.setProperty(PkgProps.PKG_LICENSE, "The License"); props.setProperty(PkgProps.PKG_DESC, "Some description."); props.setProperty(PkgProps.PKG_DESC_URL, "http://description/url"); |