From 8faad79e3972525fe8a5600f562cac92392686fd Mon Sep 17 00:00:00 2001 From: Sergii Pechenizkyi Date: Wed, 18 Nov 2015 12:26:32 +0200 Subject: [PATCH] Find indirect dependencies. Perfoms dependency tree scan to find if any of the top level dependencies listed at the build.gradle file depends on support library and though android m2repository needs to be downloaded. NOTE: establishing network connection and downloading dependency pom are required to analyze if dependency has childrens. Implementation is inspired by official gradle "dependency" task which prints dependency tree https://github.com/gradle/gradle/blob/master/subprojects/diagnostics/src/main/groovy/org/gradle/api/tasks/diagnostics/AbstractDependencyReportTask.java#L58 --- .../internal/PackageResolver.groovy | 28 ++++++---- .../grid/library/1.0.5/library-1.0.5.aar | 0 .../grid/library/1.0.5/library-1.0.5.pom | 17 ++++++ .../grid/library/1.0.5/library-1.0.5.aar | 0 .../grid/library/1.0.5/library-1.0.5.pom | 17 ++++++ .../grid/library/1.0.5/library-1.0.5.aar | 0 .../grid/library/1.0.5/library-1.0.5.pom | 17 ++++++ .../internal/PackageResolverTest.groovy | 54 +++++++++++++++++++ 8 files changed, 124 insertions(+), 9 deletions(-) create mode 100644 src/test/fixtures/missing-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.aar create mode 100644 src/test/fixtures/missing-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.pom create mode 100644 src/test/fixtures/outdated-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.aar create mode 100644 src/test/fixtures/outdated-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.pom create mode 100644 src/test/fixtures/up-to-date-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.aar create mode 100644 src/test/fixtures/up-to-date-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.pom diff --git a/src/main/groovy/com/jakewharton/sdkmanager/internal/PackageResolver.groovy b/src/main/groovy/com/jakewharton/sdkmanager/internal/PackageResolver.groovy index 9d60eb3..a79b372 100644 --- a/src/main/groovy/com/jakewharton/sdkmanager/internal/PackageResolver.groovy +++ b/src/main/groovy/com/jakewharton/sdkmanager/internal/PackageResolver.groovy @@ -4,6 +4,14 @@ import com.android.sdklib.repository.FullRevision import org.gradle.api.Project import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Dependency +import org.gradle.api.artifacts.DependencySet +import org.gradle.api.artifacts.LenientConfiguration +import org.gradle.api.artifacts.UnresolvedDependency +import org.gradle.api.artifacts.result.DependencyResult +import org.gradle.api.artifacts.result.ResolutionResult +import org.gradle.api.artifacts.result.ResolvedDependencyResult +import org.gradle.api.artifacts.result.UnresolvedDependencyResult +import org.gradle.api.internal.artifacts.result.DefaultResolvedDependencyResult import org.gradle.api.logging.Logger import org.gradle.api.logging.Logging import org.gradle.api.tasks.StopExecutionException @@ -134,6 +142,11 @@ class PackageResolver { } def resolveSupportLibraryRepository() { + + project.repositories.maven { + url = androidRepositoryDir + } + def supportDeps = findDependenciesStartingWith 'com.android.support' if (supportDeps.isEmpty()) { @@ -143,15 +156,11 @@ class PackageResolver { log.debug "Found support library dependencies: $supportDeps" - project.repositories.maven { - url = androidRepositoryDir - } - def needsDownload = false; if (!folderExists(androidRepositoryDir)) { needsDownload = true log.lifecycle 'Support library repository missing. Downloading...' - } else if (!dependenciesAvailable(supportDeps)) { + } else if (supportDeps.count { it instanceof UnresolvedDependencyResult } > 0) { needsDownload = true log.lifecycle 'Support library repository outdated. Downloading update...' } @@ -279,11 +288,12 @@ class PackageResolver { } def findDependenciesStartingWith(String prefix) { - def deps = [] + def deps = new HashSet() for (Configuration configuration : project.configurations) { - for (Dependency dependency : configuration.dependencies) { - if (dependency.group != null && dependency.group.startsWith(prefix)) { - deps.add dependency + ResolutionResult result = configuration.getIncoming().getResolutionResult() + result.allDependencies { dependency -> + if (dependency.requested.displayName.startsWith(prefix)) { + deps << dependency } } } diff --git a/src/test/fixtures/missing-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.aar b/src/test/fixtures/missing-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.aar new file mode 100644 index 0000000..e69de29 diff --git a/src/test/fixtures/missing-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.pom b/src/test/fixtures/missing-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.pom new file mode 100644 index 0000000..1cadce2 --- /dev/null +++ b/src/test/fixtures/missing-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.pom @@ -0,0 +1,17 @@ + + + 4.0.0 + com.etsy.android.grid + library + 1.0.5 + aar + + + com.android.support + support-v4 + 19.1.0 + compile + + + diff --git a/src/test/fixtures/outdated-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.aar b/src/test/fixtures/outdated-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.aar new file mode 100644 index 0000000..e69de29 diff --git a/src/test/fixtures/outdated-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.pom b/src/test/fixtures/outdated-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.pom new file mode 100644 index 0000000..1cadce2 --- /dev/null +++ b/src/test/fixtures/outdated-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.pom @@ -0,0 +1,17 @@ + + + 4.0.0 + com.etsy.android.grid + library + 1.0.5 + aar + + + com.android.support + support-v4 + 19.1.0 + compile + + + diff --git a/src/test/fixtures/up-to-date-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.aar b/src/test/fixtures/up-to-date-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.aar new file mode 100644 index 0000000..e69de29 diff --git a/src/test/fixtures/up-to-date-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.pom b/src/test/fixtures/up-to-date-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.pom new file mode 100644 index 0000000..1cadce2 --- /dev/null +++ b/src/test/fixtures/up-to-date-android-m2repository/localMaven/com/etsy/android/grid/library/1.0.5/library-1.0.5.pom @@ -0,0 +1,17 @@ + + + 4.0.0 + com.etsy.android.grid + library + 1.0.5 + aar + + + com.android.support + support-v4 + 19.1.0 + compile + + + diff --git a/src/test/groovy/com/jakewharton/sdkmanager/internal/PackageResolverTest.groovy b/src/test/groovy/com/jakewharton/sdkmanager/internal/PackageResolverTest.groovy index fc0c6e5..71c9d2e 100644 --- a/src/test/groovy/com/jakewharton/sdkmanager/internal/PackageResolverTest.groovy +++ b/src/test/groovy/com/jakewharton/sdkmanager/internal/PackageResolverTest.groovy @@ -195,6 +195,24 @@ class PackageResolverTest { assertThat(androidCommand).isEmpty() } + @FixtureName("up-to-date-android-m2repository") + @Test public void upToDateIndirectSupportLibraryRepositoryRecognized() { + project.apply plugin: 'com.android.application' + + def localMaven = new File(fixture.getRoot(), "localMaven") + assertThat(localMaven).exists() + project.repositories.maven { + url = localMaven + } + + project.dependencies { + compile 'com.etsy.android.grid:library:1.0.5' + } + + packageResolver.resolveSupportLibraryRepository() + assertThat(androidCommand).isEmpty() + } + @FixtureName("missing-android-m2repository") @Test public void missingSupportLibraryRepositoryIsDownloaded() { project.apply plugin: 'com.android.application' @@ -206,6 +224,24 @@ class PackageResolverTest { assertThat(androidCommand).containsExactly('update extra-android-m2repository') } + @FixtureName("missing-android-m2repository") + @Test public void missingIndirectSupportLibraryRepositoryIsDownloaded() { + project.apply plugin: 'com.android.application' + + def localMaven = new File(fixture.getRoot(), "localMaven") + assertThat(localMaven).exists() + project.repositories.maven { + url = localMaven + } + + project.dependencies { + compile 'com.etsy.android.grid:library:1.0.5' + } + + packageResolver.resolveSupportLibraryRepository() + assertThat(androidCommand).containsExactly('update extra-android-m2repository') + } + @FixtureName("missing-android-m2repository") @Test public void missingSupportTestingRepositoryIsDownloaded() { project.apply plugin: 'com.android.application' @@ -228,6 +264,24 @@ class PackageResolverTest { assertThat(androidCommand).containsExactly('update extra-android-m2repository') } + @FixtureName("outdated-android-m2repository") + @Test public void outdatedIndirectSupportLibraryRepositoryIsDownloaded() { + project.apply plugin: 'com.android.application' + + def localMaven = new File(fixture.getRoot(), "localMaven") + assertThat(localMaven).exists() + project.repositories.maven { + url = localMaven + } + + project.dependencies { + compile 'com.etsy.android.grid:library:1.0.5' + } + + packageResolver.resolveSupportLibraryRepository() + assertThat(androidCommand).containsExactly('update extra-android-m2repository') + } + @FixtureName("outdated-android-m2repository") @Test public void outdatedSupportTestingRepositoryIsDownloaded() { project.apply plugin: 'com.android.application'