OSDN Git Service

SDK Manager: fix handling of source URLs. Do not merge.
authorRaphael <raphael@google.com>
Wed, 5 Oct 2011 20:36:29 +0000 (13:36 -0700)
committerRaphael Moll <raphael@google.com>
Wed, 5 Oct 2011 20:54:41 +0000 (13:54 -0700)
This changes how source URLs are handled. Packages
from different sources were previously treated as
separate if the packages were the same (e.g. same
platform API) but the source URLs were different.

Instead this checks the hostname+domain name of the URL
is different, as well as the type of the source (that
is a sdk repository vs addon repository).

(cherry picked from commit d66d4b7804ce5585bed335168a0c7f3f178a11b0)

Change-Id: Ic127c4111e5028d467ad89c987c5f39cb8f8e8d7

sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackagesDiffLogic.java
sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/sdkman2/PackagesDiffLogicTest.java

index ab2d439..3a70294 100755 (executable)
@@ -19,14 +19,15 @@ package com.android.sdkuilib.internal.repository.sdkman2;
 import com.android.sdklib.IAndroidTarget;
 import com.android.sdklib.internal.repository.IPackageVersion;
 import com.android.sdklib.internal.repository.Package;
-import com.android.sdklib.internal.repository.Package.UpdateInfo;
 import com.android.sdklib.internal.repository.PlatformPackage;
 import com.android.sdklib.internal.repository.PlatformToolPackage;
 import com.android.sdklib.internal.repository.SdkSource;
 import com.android.sdklib.internal.repository.ToolPackage;
+import com.android.sdklib.internal.repository.Package.UpdateInfo;
 import com.android.sdkuilib.internal.repository.UpdaterData;
 import com.android.sdkuilib.internal.repository.sdkman2.PkgItem.PkgState;
 
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -562,9 +563,14 @@ class PackagesDiffLogic {
 
         // Only process items matching the current source.
         if (currentSource == newItemSource) {
-            // Same source. accept it.
+            // Object identity, so definitely the same source. Accept it.
             return true;
 
+        } else if (currentSource != null && newItemSource != null &&
+                !currentSource.getClass().equals(newItemSource.getClass())) {
+            // Both sources don't have the same type (e.g. sdk repository versus add-on repository)
+            return false;
+
         } else if (currentSource != null && currentSource.equals(newItemSource)) {
             // Same source. Accept it.
             return true;
@@ -576,7 +582,7 @@ class PackagesDiffLogic {
             return true;
 
         } else if (currentSource != null && currentSource.getUrl().startsWith("file://")) {
-            // Probably a manual local install. Accept it.
+            // Heuristic: Probably a manual local install. Accept it.
             return true;
 
         } else {
@@ -584,6 +590,21 @@ class PackagesDiffLogic {
             // have similar packages, we don't want to merge them together and have
             // one hide the other. This is a design error from the repository owners
             // and we want the case to be blatant so that we can get it fixed.
+
+            if (currentSource != null && newItemSource != null) {
+                try {
+                    URL url1 = new URL(currentSource.getUrl());
+                    URL url2 = new URL(newItemSource.getUrl());
+
+                    // Make an exception if both URLs have the same host name & domain name.
+                    if (url1.sameFile(url2) || url1.getHost().equals(url2.getHost())) {
+                        return true;
+                    }
+                } catch (Exception ignore) {
+                    // Ignore MalformedURLException or other exceptions
+                }
+            }
+
             return false;
         }
     }
index 5444dff..eeec341 100755 (executable)
@@ -339,8 +339,8 @@ public class PackagesDiffLogicTest extends TestCase {
     }
 
     public void testSortByApi_CompleteUpdate() {
-        SdkSource src1 = new SdkRepoSource("http://example.com/url1", "repo1");
-        SdkSource src2 = new SdkRepoSource("http://example.com/url2", "repo2");
+        SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1");
+        SdkSource src2 = new SdkRepoSource("http://2.example.com/url2", "repo2");
 
         // Resulting categories are sorted by Tools, descending platform API and finally Extras.
         // Addons are sorted by name within their API.
@@ -675,8 +675,8 @@ public class PackagesDiffLogicTest extends TestCase {
     }
 
     public void testSortBySource_CompleteUpdate() {
-        SdkSource src1 = new SdkRepoSource("http://example.com/url1", "repo1");
-        SdkSource src2 = new SdkRepoSource("http://example.com/url2", "repo2");
+        SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1");
+        SdkSource src2 = new SdkRepoSource("http://2.example.com/url2", "repo2");
 
         // First update has the typical tools and a couple extras
         m.updateStart();
@@ -695,7 +695,7 @@ public class PackagesDiffLogicTest extends TestCase {
         assertTrue(m.updateEnd(false /*sortByApi*/));
 
         assertEquals(
-                "PkgCategorySource <source=repo1 (example.com), #items=4>\n" +
+                "PkgCategorySource <source=repo1 (1.example.com), #items=4>\n" +
                 "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" +
                 "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" +
                 "-- <INSTALLED, pkg:Android USB Driver package, revision 4, updated by:Android USB Driver package, revision 5>\n" +
@@ -735,7 +735,7 @@ public class PackagesDiffLogicTest extends TestCase {
         assertTrue(m.updateEnd(false /*sortByApi*/));
 
         assertEquals(
-                "PkgCategorySource <source=repo1 (example.com), #items=7>\n" +
+                "PkgCategorySource <source=repo1 (1.example.com), #items=7>\n" +
                 "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" +
                 "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" +
                 "-- <INSTALLED, pkg:SDK Platform Android android-3, API 3, revision 6>\n" +
@@ -743,7 +743,7 @@ public class PackagesDiffLogicTest extends TestCase {
                 "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
                 "-- <INSTALLED, pkg:Android USB Driver package, revision 4, updated by:Android USB Driver package, revision 5>\n" +
                 "-- <NEW, pkg:Carrier Custom Rom package, revision 1>\n" +
-                "PkgCategorySource <source=repo2 (example.com), #items=3>\n" +
+                "PkgCategorySource <source=repo2 (2.example.com), #items=3>\n" +
                 "-- <NEW, pkg:addon B by vendor 2, Android API 2, revision 7, updated by:addon B by vendor 2, Android API 2, revision 9>\n" +
                 "-- <NEW, pkg:addon C by vendor 2, Android API 2, revision 9>\n" +
                 "-- <INSTALLED, pkg:addon A by vendor 1, Android API 1, revision 5, updated by:addon A by vendor 1, Android API 1, revision 6>\n",
@@ -783,7 +783,7 @@ public class PackagesDiffLogicTest extends TestCase {
         assertTrue(m.updateEnd(false /*sortByApi*/));
 
         assertEquals(
-                "PkgCategorySource <source=repo1 (example.com), #items=7>\n" +
+                "PkgCategorySource <source=repo1 (1.example.com), #items=7>\n" +
                 "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" +
                 "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" +
                 "-- <INSTALLED, pkg:SDK Platform Android android-3, API 3, revision 6>\n" +
@@ -791,7 +791,7 @@ public class PackagesDiffLogicTest extends TestCase {
                 "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
                 "-- <INSTALLED, pkg:Android USB Driver package, revision 4, updated by:Android USB Driver package, revision 5>\n" +
                 "-- <NEW, pkg:Carrier Custom Rom package, revision 1>\n" +
-                "PkgCategorySource <source=repo2 (example.com), #items=3>\n" +
+                "PkgCategorySource <source=repo2 (2.example.com), #items=3>\n" +
                 "-- <NEW, pkg:addon B by vendor 2, Android API 2, revision 7, updated by:addon B by vendor 2, Android API 2, revision 9>\n" +
                 "-- <NEW, pkg:addon C by vendor 2, Android API 2, revision 9>\n" +
                 "-- <INSTALLED, pkg:addon A by vendor 1, Android API 1, revision 5, updated by:addon A by vendor 1, Android API 1, revision 6>\n",
@@ -857,8 +857,8 @@ public class PackagesDiffLogicTest extends TestCase {
         // Populate the list with typical items: tools, platforms tools, extras, 2 platforms.
         // With nothing installed, this should pick the tools, extras and the top platform.
 
-        SdkSource src1 = new SdkRepoSource("http://example.com/url1", "repo1");
-        SdkSource src2 = new SdkRepoSource("http://example.com/url2", "repo2");
+        SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1");
+        SdkSource src2 = new SdkRepoSource("http://2.example.com/url2", "repo2");
 
         m.updateStart();
         MockPlatformPackage p1;
@@ -895,13 +895,13 @@ public class PackagesDiffLogicTest extends TestCase {
                 "-- < * NEW, pkg:Carrier Custom Rom package, revision 1>\n",
                 getTree(m, true /*displaySortByApi*/));
         assertEquals(
-                "PkgCategorySource <source=repo1 (example.com), #items=5>\n" +
+                "PkgCategorySource <source=repo1 (1.example.com), #items=5>\n" +
                 "-- < * NEW, pkg:Android SDK Tools, revision 10>\n" +
                 "-- < * NEW, pkg:Android SDK Platform-tools, revision 3>\n" +
                 "-- < * NEW, pkg:SDK Platform Android android-2, API 2, revision 4>\n" +
                 "-- <NEW, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
                 "-- < * NEW, pkg:Android USB Driver package, revision 5>\n" +
-                "PkgCategorySource <source=repo2 (example.com), #items=3>\n" +
+                "PkgCategorySource <source=repo2 (2.example.com), #items=3>\n" +
                 "-- < * NEW, pkg:addon B by vendor 2, Android API 2, revision 7>\n" +
                 "-- <NEW, pkg:addon A by vendor 1, Android API 1, revision 5>\n" +
                 "-- < * NEW, pkg:Carrier Custom Rom package, revision 1>\n",
@@ -947,13 +947,13 @@ public class PackagesDiffLogicTest extends TestCase {
                 "-- < * NEW, pkg:Carrier Custom Rom package, revision 1>\n",
                 getTree(m, true /*displaySortByApi*/));
         assertEquals(
-                "PkgCategorySource <source=repo1 (example.com), #items=5>\n" +
+                "PkgCategorySource <source=repo1 (1.example.com), #items=5>\n" +
                 "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" +
                 "-- < * NEW, pkg:Android SDK Platform-tools, revision 3>\n" +
                 "-- < * NEW, pkg:SDK Platform Android android-2, API 2, revision 4>\n" +
                 "-- < * NEW, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
                 "-- < * NEW, pkg:Android USB Driver package, revision 5>\n" +
-                "PkgCategorySource <source=repo2 (example.com), #items=3>\n" +
+                "PkgCategorySource <source=repo2 (2.example.com), #items=3>\n" +
                 "-- < * NEW, pkg:addon B by vendor 2, Android API 2, revision 7>\n" +
                 "-- <INSTALLED, pkg:addon A by vendor 1, Android API 1, revision 5>\n" +
                 "-- < * NEW, pkg:Carrier Custom Rom package, revision 1>\n",
@@ -1084,11 +1084,14 @@ public class PackagesDiffLogicTest extends TestCase {
     public void testSourceDups() {
         // This tests an edge case were 2 remote repositories are giving the
         // same kind of packages. We don't want to merge them together or treat
-        // them as upgrades to each other.
+        // them as upgrades to each other, unless they have the same hostname.
 
+        // repo1, 2 and 3 have the same hostname so redundancy is ok
         SdkSource src1 = new SdkRepoSource("http://example.com/url1", "repo1");
         SdkSource src2 = new SdkRepoSource("http://example.com/url2", "repo2");
         SdkSource src3 = new SdkRepoSource("http://example.com/url3", "repo3");
+        // repo4 has a different hostname so its packages won't hide the ones from the other repos
+        SdkSource src4 = new SdkRepoSource("http://4.example.com/url4", "repo4");
         MockPlatformPackage p1 = null;
 
         m.updateStart();
@@ -1105,6 +1108,10 @@ public class PackagesDiffLogicTest extends TestCase {
                 new MockAddonPackage(src3, "addon A", p1, 5), // same as  addon A rev 5 from src2
                 new MockAddonPackage(src3, "addon B", p1, 7), // upgrades addon B rev 6 from src2
         });
+        m.updateSourcePackages(true /*sortByApi*/, src4, new Package[] {
+                new MockAddonPackage(src4, "addon A", p1, 5), // same as  addon A rev 5 from src2
+                new MockAddonPackage(src4, "addon B", p1, 7), // upgrades addon B rev 6 from src2
+        });
         m.updateEnd(true /*sortByApi*/);
 
         // The remote packages in rev 3 are hidden by the local packages in rev 5
@@ -1114,10 +1121,10 @@ public class PackagesDiffLogicTest extends TestCase {
                 "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" +
                 "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=5>\n" +
                 "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
-                "-- <NEW, pkg:addon A by vendor 1, Android API 1, revision 5>\n" +
-                "-- <NEW, pkg:addon A by vendor 1, Android API 1, revision 5>\n" +
-                "-- <NEW, pkg:addon B by vendor 1, Android API 1, revision 6>\n" +
-                "-- <NEW, pkg:addon B by vendor 1, Android API 1, revision 7>\n" +
+                "-- <NEW, pkg:addon A by vendor 1, Android API 1, revision 5>\n" + // from src2+3
+                "-- <NEW, pkg:addon A by vendor 1, Android API 1, revision 5>\n" + // from scr4
+                "-- <NEW, pkg:addon B by vendor 1, Android API 1, revision 7>\n" + // from src2+3
+                "-- <NEW, pkg:addon B by vendor 1, Android API 1, revision 7>\n" + // from src4
                 "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
                 getTree(m, true /*displaySortByApi*/));
         assertEquals(
@@ -1125,10 +1132,11 @@ public class PackagesDiffLogicTest extends TestCase {
                 "-- <INSTALLED, pkg:Android SDK Tools, revision 3>\n" +
                 "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" +
                 "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
-                "PkgCategorySource <source=repo2 (example.com), #items=2>\n" +
+                "PkgCategorySource <source=repo2 (example.com), #items=1>\n" +
                 "-- <NEW, pkg:addon A by vendor 1, Android API 1, revision 5>\n" +
-                "-- <NEW, pkg:addon B by vendor 1, Android API 1, revision 6>\n" +
-                "PkgCategorySource <source=repo3 (example.com), #items=2>\n" +
+                "PkgCategorySource <source=repo3 (example.com), #items=1>\n" +
+                "-- <NEW, pkg:addon B by vendor 1, Android API 1, revision 7>\n" +
+                "PkgCategorySource <source=repo4 (4.example.com), #items=2>\n" +
                 "-- <NEW, pkg:addon A by vendor 1, Android API 1, revision 5>\n" +
                 "-- <NEW, pkg:addon B by vendor 1, Android API 1, revision 7>\n",
                 getTree(m, false /*displaySortByApi*/));
@@ -1193,8 +1201,8 @@ public class PackagesDiffLogicTest extends TestCase {
 
     public void testBrokenAddon() {
 
-        SdkSource src1 = new SdkRepoSource("http://example.com/url1", "repo1");
-        SdkSource src2 = new SdkRepoSource("http://example.com/url2", "repo2");
+        SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1");
+        SdkSource src2 = new SdkRepoSource("http://2.example.com/url2", "repo2");
 
         MockPlatformPackage p1 = null;
         MockAddonPackage a1 = null;
@@ -1220,9 +1228,9 @@ public class PackagesDiffLogicTest extends TestCase {
                 "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
                 getTree(m, true /*displaySortByApi*/));
         assertEquals(
-                "PkgCategorySource <source=repo1 (example.com), #items=1>\n" +
+                "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" +
                 "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
-                "PkgCategorySource <source=repo2 (example.com), #items=1>\n" +
+                "PkgCategorySource <source=repo2 (2.example.com), #items=1>\n" +
                 "-- <INSTALLED, pkg:addon A by vendor 1, Android API 1, revision 4>\n",
                 getTree(m, false /*displaySortByApi*/));
 
@@ -1248,9 +1256,9 @@ public class PackagesDiffLogicTest extends TestCase {
                 "-- <INSTALLED, pkg:Broken package for API 1>\n",
                 getTree(m, true /*displaySortByApi*/));
         assertEquals(
-                "PkgCategorySource <source=repo1 (example.com), #items=1>\n" +
+                "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" +
                 "-- <NEW, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
-                "PkgCategorySource <source=repo2 (example.com), #items=1>\n" +
+                "PkgCategorySource <source=repo2 (2.example.com), #items=1>\n" +
                 "-- <NEW, pkg:addon A by vendor 1, Android API 1, revision 4>\n" +
                 "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" +
                 "-- <INSTALLED, pkg:Broken package for API 1>\n",
@@ -1277,9 +1285,9 @@ public class PackagesDiffLogicTest extends TestCase {
                 "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
                 getTree(m, true /*displaySortByApi*/));
         assertEquals(
-                "PkgCategorySource <source=repo1 (example.com), #items=1>\n" +
+                "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" +
                 "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
-                "PkgCategorySource <source=repo2 (example.com), #items=1>\n" +
+                "PkgCategorySource <source=repo2 (2.example.com), #items=1>\n" +
                 "-- <INSTALLED, pkg:addon A by vendor 1, Android API 1, revision 4>\n",
                 getTree(m, false /*displaySortByApi*/));
     }