[java-sig-commits] [maven] Fix test scope skipping

Stanislav Ochotnicky sochotni at fedoraproject.org
Thu Sep 8 12:34:03 UTC 2011


commit 61f66c0070f0920a1dd964319ee3b6c6ad87045d
Author: Stanislav Ochotnicky <sochotnicky at redhat.com>
Date:   Thu Sep 8 14:31:03 2011 +0200

    Fix test scope skipping

 0001-Add-plugin-api-deps.patch                     |   10 +-
 0002-Use-custom-resolver.patch                     |    8 +-
 0003-Use-utf-8-source-encoding.patch               |    6 +-
 ...-text-scope-skipping-with-maven.test.skip.patch |  156 ++++++++++++++++++++
 SkipTestScopeDependencySelector.java               |   93 ++++++++++++
 maven.spec                                         |    7 +-
 6 files changed, 267 insertions(+), 13 deletions(-)
---
diff --git a/0001-Add-plugin-api-deps.patch b/0001-Add-plugin-api-deps.patch
index 69ebec4..c7e0755 100644
--- a/0001-Add-plugin-api-deps.patch
+++ b/0001-Add-plugin-api-deps.patch
@@ -1,14 +1,14 @@
-From 8ded699d85fd30717fbdd09a9238f309386747db Mon Sep 17 00:00:00 2001
+From 97ddab6cd1a948294176f851e37a48b5bc036c73 Mon Sep 17 00:00:00 2001
 From: Stanislav Ochotnicky <sochotnicky at redhat.com>
-Date: Tue, 12 Oct 2010 16:56:50 +0200
-Subject: [PATCH 1/2] Add plugin-api deps
+Date: Tue, 30 Aug 2011 11:41:39 +0200
+Subject: [PATCH 1/4] Add plugin-api deps
 
 ---
  maven-plugin-api/pom.xml |    5 +++++
  1 files changed, 5 insertions(+), 0 deletions(-)
 
 diff --git a/maven-plugin-api/pom.xml b/maven-plugin-api/pom.xml
-index 621f8d6..ca98242 100644
+index 8967754..0f72aa5 100644
 --- a/maven-plugin-api/pom.xml
 +++ b/maven-plugin-api/pom.xml
 @@ -51,6 +51,11 @@ under the License.
@@ -24,5 +24,5 @@ index 621f8d6..ca98242 100644
  
    <build>
 -- 
-1.7.4
+1.7.6
 
diff --git a/0002-Use-custom-resolver.patch b/0002-Use-custom-resolver.patch
index a846e6a..9ecefbf 100644
--- a/0002-Use-custom-resolver.patch
+++ b/0002-Use-custom-resolver.patch
@@ -1,7 +1,7 @@
-From 2f1e46675a26996103ba9c96ae62d3b5876bdba8 Mon Sep 17 00:00:00 2001
+From e1b80440159b03b397cba740a7949f8be412fef5 Mon Sep 17 00:00:00 2001
 From: Stanislav Ochotnicky <sochotnicky at redhat.com>
-Date: Tue, 18 Jan 2011 11:09:32 +0100
-Subject: [PATCH 2/2] Use custom resolver
+Date: Tue, 30 Aug 2011 11:42:32 +0200
+Subject: [PATCH 2/4] Use custom resolver
 
 WorkspaceReader is used to resolve main dependencies, but we had to
 add this resolve to ProjectModelResolver and DefaultModelResolver as
@@ -220,5 +220,5 @@ index c97095f..ef0edc2 100644
          }
  
 -- 
-1.7.4
+1.7.6
 
diff --git a/0003-Use-utf-8-source-encoding.patch b/0003-Use-utf-8-source-encoding.patch
index 3ab9256..0cf3040 100644
--- a/0003-Use-utf-8-source-encoding.patch
+++ b/0003-Use-utf-8-source-encoding.patch
@@ -1,7 +1,7 @@
-From b84e27c430a321185639096e7a0ca2ab4945bbfa Mon Sep 17 00:00:00 2001
+From 053974e55c21a372e544ba23f5eca6c864cc283c Mon Sep 17 00:00:00 2001
 From: Stanislav Ochotnicky <sochotnicky at redhat.com>
-Date: Mon, 22 Aug 2011 16:11:57 +0200
-Subject: [PATCH] Use utf-8 source encoding
+Date: Tue, 30 Aug 2011 11:43:01 +0200
+Subject: [PATCH 3/4] Use utf-8 source encoding
 
 ---
  pom.xml |    1 +
diff --git a/0004-Fix-text-scope-skipping-with-maven.test.skip.patch b/0004-Fix-text-scope-skipping-with-maven.test.skip.patch
new file mode 100644
index 0000000..28da01c
--- /dev/null
+++ b/0004-Fix-text-scope-skipping-with-maven.test.skip.patch
@@ -0,0 +1,156 @@
+From d3c8d75d197ac8494c87f26ea63733d4f5163c7f Mon Sep 17 00:00:00 2001
+From: Stanislav Ochotnicky <sochotnicky at redhat.com>
+Date: Tue, 30 Aug 2011 11:44:42 +0200
+Subject: [PATCH 4/4] Fix text scope skipping with maven.test.skip
+
+Previously maven put test dependencies into dependency graph even when
+"maven.test.skip" was true, therefore. This patch fixes that with few
+caveats:
+
+maven-compat was changed so plugins using old api work like this as
+well. We removed test deps from "artifacts" Set in
+DefaultArtifactResolver if maven.test.skip system property is found.
+
+We created new DependencySelector. Currently it's in wrong place and
+possibly has other problems (never going to get upstreamed like
+this). But as a hack this works OK.
+
+Main problem: Is using "maven.test.skip" string literally OK? Also,
+literally referencing "test" scope is probably not 100% clean.
+---
+ .../artifact/resolver/DefaultArtifactResolver.java |   17 +++++
+ .../main/java/org/apache/maven/DefaultMaven.java   |    3 +-
+ .../maven/SkipTestScopeDependencySelector.java     |   72 ++++++++++++++++++++
+ 3 files changed, 91 insertions(+), 1 deletions(-)
+ create mode 100644 maven-core/src/main/java/org/apache/maven/SkipTestScopeDependencySelector.java
+
+diff --git a/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java b/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java
+index 2e65979..601ace7 100644
+--- a/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java
++++ b/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java
+@@ -460,6 +460,23 @@ public class DefaultArtifactResolver
+             return result;
+         } 
+ 
++        // When we find maven.test.skip property we remove dependencies
++        // with scope "test" from artifact set. Current implementation
++        // of artifacts doesn't implement "remove" method so create a
++        // new object and copy non-test artifacts there
++        if (System.getProperty("maven.test.skip") != null) {
++            Set<Artifact> newArtifacts = new LinkedHashSet<Artifact>();
++            for (Artifact artifact: artifacts)
++            {
++                String scope = artifact.getScope();
++                if (scope == null  || !scope.equals("test"))
++                {
++                    newArtifacts.add(artifact);
++                }
++            }
++            artifacts = newArtifacts;
++        }
++
+         // After the collection we will have the artifact object in the result but they will not be resolved yet.
+         result =
+             artifactCollector.collect( artifacts, rootArtifact, managedVersions, collectionRequest, source,
+diff --git a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
+index 8fdb6ed..75d1e37 100644
+--- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
++++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
+@@ -31,6 +31,7 @@ import java.util.List;
+ import java.util.Map;
+ import java.util.Properties;
+ 
++import org.apache.maven.SkipTestScopeDependencySelector;
+ import org.apache.maven.artifact.ArtifactUtils;
+ import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
+ import org.apache.maven.eventspy.internal.EventSpyDispatcher;
+@@ -437,7 +438,7 @@ public class DefaultMaven
+ 
+         DependencySelector depFilter =
+             new AndDependencySelector( new ScopeDependencySelector( "test", "provided" ), new OptionalDependencySelector(),
+-                                     new ExclusionDependencySelector() );
++                                     new ExclusionDependencySelector(), new SkipTestScopeDependencySelector() );
+         session.setDependencySelector( depFilter );
+ 
+         DependencyGraphTransformer transformer =
+diff --git a/maven-core/src/main/java/org/apache/maven/SkipTestScopeDependencySelector.java b/maven-core/src/main/java/org/apache/maven/SkipTestScopeDependencySelector.java
+new file mode 100644
+index 0000000..60be724
+--- /dev/null
++++ b/maven-core/src/main/java/org/apache/maven/SkipTestScopeDependencySelector.java
+@@ -0,0 +1,72 @@
++package org.apache.maven;
++
++
++import java.util.Arrays;
++import java.util.Collection;
++import java.util.Collections;
++import java.util.HashSet;
++
++import org.sonatype.aether.collection.DependencyCollectionContext;
++import org.sonatype.aether.collection.DependencySelector;
++import org.sonatype.aether.graph.Dependency;
++import org.sonatype.aether.RepositorySystemSession;
++
++/**
++ * A dependency selector that filters dependencies with scope "test"
++ * when tests are being skipped.
++ *
++ * @author Stanislav Ochotnicky
++ */
++public class SkipTestScopeDependencySelector
++    implements DependencySelector
++{
++
++    private boolean testSkip;
++
++    /**
++     * Creates a new selector
++     */
++    public SkipTestScopeDependencySelector()
++    {
++        testSkip = System.getProperty("maven.test.skip") !=  null ? true : false;
++    }
++
++    public boolean selectDependency( Dependency dependency )
++    {
++        if (testSkip && dependency.getScope().equals("test"))
++        {
++            return false;
++        }
++        else
++        {
++            return true;
++        }
++    }
++
++    public DependencySelector deriveChildSelector( DependencyCollectionContext context )
++    {
++        return this;
++    }
++
++    @Override
++    public boolean equals( Object obj )
++    {
++        if ( this == obj )
++        {
++            return true;
++        }
++        else if ( null == obj || !getClass().equals( obj.getClass() ) )
++        {
++            return false;
++        }
++
++        return true;
++    }
++
++    @Override
++    public int hashCode()
++    {
++        return 42;
++    }
++
++}
+-- 
+1.7.6
+
diff --git a/SkipTestScopeDependencySelector.java b/SkipTestScopeDependencySelector.java
new file mode 100644
index 0000000..7b86781
--- /dev/null
+++ b/SkipTestScopeDependencySelector.java
@@ -0,0 +1,93 @@
+package org.sonatype.aether.util.graph.selector;
+
+/*******************************************************************************
+ * Copyright (c) 2010-2011 Sonatype, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Apache License v2.0 which accompanies this distribution.
+ * The Eclipse Public License is available at
+ *   http://www.eclipse.org/legal/epl-v10.html
+ * The Apache License v2.0 is available at
+ *   http://www.apache.org/licenses/LICENSE-2.0.html
+ * You may elect to redistribute this code under either of these licenses.
+ *******************************************************************************/
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+
+import org.sonatype.aether.collection.DependencyCollectionContext;
+import org.sonatype.aether.collection.DependencySelector;
+import org.sonatype.aether.graph.Dependency;
+
+/**
+ * A dependency selector that filters transitive dependencies based on their scope. Direct dependencies are always
+ * included regardless of their scope. <em>Note:</em> This filter does not assume any relationships between the scopes.
+ * In particular, the filter is not aware of scopes that logically include other scopes.
+ *
+ * @author Benjamin Bentmann
+ * @see Dependency#getScope()
+ */
+public class SkipTestScopeDependencySelector
+    implements DependencySelector
+{
+
+
+    /**
+     * Creates a new selector using the specified includes and excludes.
+     *
+     * @param included The set of scopes to include, may be {@code null} or empty to include any scope.
+     * @param excluded The set of scopes to exclude, may be {@code null} or empty to exclude no scope.
+     */
+    public SkipTestScopeDependencySelector()
+    {
+    }
+
+
+    public boolean selectDependency( Dependency dependency )
+    {
+        String scope = dependency.getScope();
+        if (System.getProperty("maven.test.skip") != null &&
+            scope == "test")
+            return false;
+        else return true;
+    }
+
+    public DependencySelector deriveChildSelector( DependencyCollectionContext context )
+    {
+        if ( this.transitive || context.getDependency() == null )
+        {
+            return this;
+        }
+
+        return new SkipTestScopeDependencySelector( true, included, excluded );
+    }
+
+    @Override
+    public boolean equals( Object obj )
+    {
+        if ( this == obj )
+        {
+            return true;
+        }
+        else if ( null == obj || !getClass().equals( obj.getClass() ) )
+        {
+            return false;
+        }
+
+        SkipTestScopeDependencySelector that = (SkipTestScopeDependencySelector) obj;
+        return transitive == that.transitive && included.equals( that.included ) && excluded.equals( that.excluded );
+    }
+
+    @Override
+    public int hashCode()
+    {
+        int hash = 17;
+        hash = hash * 31 + ( transitive ? 1 : 0 );
+        hash = hash * 31 + included.hashCode();
+        hash = hash * 31 + excluded.hashCode();
+        return hash;
+    }
+
+}
diff --git a/maven.spec b/maven.spec
index 35288d3..c156278 100644
--- a/maven.spec
+++ b/maven.spec
@@ -2,7 +2,7 @@
 
 Name:           maven
 Version:        3.0.3
-Release:        13%{?dist}
+Release:        14%{?dist}
 Summary:        Java project management and project comprehension tool
 
 Group:          Development/Tools
@@ -36,6 +36,7 @@ Patch150:         0001-Add-plugin-api-deps.patch
 Patch151:         0003-Use-utf-8-source-encoding.patch
 # Patch2XX for non-upstreamable patches
 Patch200:       0002-Use-custom-resolver.patch
+Patch201:       0004-Fix-text-scope-skipping-with-maven.test.skip.patch
 
 BuildRequires:  maven
 BuildRequires:  maven-parent
@@ -114,6 +115,7 @@ Requires:       jpackage-utils
 %patch150 -p1
 %patch151 -p1
 %patch200 -p1
+%patch201 -p1
 
 # get custom resolver in place
 mkdir -p maven-aether-provider/src/main/java/org/apache/maven/artifact/resolver \
@@ -332,6 +334,9 @@ install -Dm 644 %{SOURCE1} %{buildroot}%{_sysconfdir}/bash_completion.d/%{name}
 
 
 %changelog
+* Tue Aug 30 2011 Stanislav Ochotnicky <sochotnicky at redhat.com> - 3.0.3-14
+- Fix test scope skipping
+
 * Mon Aug 22 2011 Stanislav Ochotnicky <sochotnicky at redhat.com> - 3.0.3-13
 - Remove unnecessary deps causing problems from lib/
 - Add utf-8 source encoding patch


More information about the java-sig-commits mailing list