MRELEASE-985 Override snapshot dependencies from command line

diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java
index 2eb77d6..375861b 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java
@@ -108,22 +108,36 @@
 
         // Create a config containing values from the session properties (ie command line properties with cli).
         ReleaseUtils.copyPropertiesToReleaseDescriptor( prepareRequest.getUserProperties(),
-                                        new ReleaseDescriptorBuilder()
-                                        {
-                                            public ReleaseDescriptorBuilder addDevelopmentVersion( String key,
-                                                                                                   String value )
-                                            {
-                                                builder.addDevelopmentVersion( key, value );
-                                                return this;
-                                            }
+                new ReleaseDescriptorBuilder()
+                {
+                    public ReleaseDescriptorBuilder addDevelopmentVersion( String key,
+                                                                           String value )
+                    {
+                        builder.addDevelopmentVersion( key, value );
+                        return this;
+                    }
 
-                                            public ReleaseDescriptorBuilder addReleaseVersion( String key,
-                                                                                               String value )
-                                            {
-                                                builder.addReleaseVersion( key, value );
-                                                return this;
-                                            };
-                                        } );
+                    public ReleaseDescriptorBuilder addReleaseVersion( String key,
+                                                                       String value )
+                    {
+                        builder.addReleaseVersion( key, value );
+                        return this;
+                    }
+
+                    public ReleaseDescriptorBuilder addDependencyReleaseVersion( String dependencyKey,
+                                                                                String version )
+                    {
+                        builder.addDependencyReleaseVersion( dependencyKey, version );
+                        return this;
+                    }
+
+                    public ReleaseDescriptorBuilder addDependencyDevelopmentVersion( String dependencyKey,
+                                                                                    String version )
+                    {
+                        builder.addDependencyDevelopmentVersion( dependencyKey, version );
+                        return this;
+                    }
+                } );
 
         BuilderReleaseDescriptor config;
         if ( BooleanUtils.isNotFalse( prepareRequest.getResume() ) )
@@ -132,7 +146,7 @@
         }
         else
         {
-            config = ReleaseUtils.buildReleaseDescriptor( prepareRequest.getReleaseDescriptorBuilder() );
+            config = ReleaseUtils.buildReleaseDescriptor( builder );
         }
 
         Strategy releaseStrategy = getStrategy( config.getReleaseStrategyId() );
@@ -667,4 +681,4 @@
 
         result.setResultCode( ReleaseResult.ERROR );
     }
-}
\ No newline at end of file
+}
diff --git a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java
index 4dd43b7..37603d1 100644
--- a/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java
+++ b/maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhase.java
@@ -305,20 +305,25 @@
     private static boolean checkArtifact( Artifact artifact, ReleaseDescriptor releaseDescriptor )
     {
         String versionlessKey = ArtifactUtils.versionlessKey( artifact.getGroupId(), artifact.getArtifactId() );
+        String releaseDescriptorResolvedVersion = releaseDescriptor.getDependencyReleaseVersion( versionlessKey );
+
+        boolean releaseDescriptorResolvedVersionIsSnapshot = releaseDescriptorResolvedVersion == null
+                        || releaseDescriptorResolvedVersion.contains( Artifact.SNAPSHOT_VERSION );
         
         // We are only looking at dependencies external to the project - ignore anything found in the reactor as
         // it's version will be updated
-        boolean result = artifact.isSnapshot()
-                && !artifact.getBaseVersion().equals( releaseDescriptor.getProjectOriginalVersion( versionlessKey ) );
+        boolean bannedVersion = artifact.isSnapshot()
+                && !artifact.getBaseVersion().equals( releaseDescriptor.getProjectOriginalVersion( versionlessKey ) )
+                        && releaseDescriptorResolvedVersionIsSnapshot;
 
         // If we have a snapshot but allowTimestampedSnapshots is true, accept the artifact if the version
         // indicates that it is a timestamped snapshot.
-        if ( result && releaseDescriptor.isAllowTimestampedSnapshots() )
+        if ( bannedVersion && releaseDescriptor.isAllowTimestampedSnapshots() )
         {
-            result = artifact.getVersion().indexOf( Artifact.SNAPSHOT_VERSION ) >= 0;
+            bannedVersion = artifact.getVersion().indexOf( Artifact.SNAPSHOT_VERSION ) >= 0;
         }
 
-        return result;
+        return bannedVersion;
     }
 
     @Override
@@ -456,4 +461,4 @@
             releaseDescriptor.addDependencyDevelopmentVersion( versionlessKey, result );
         }
     }
-}
\ No newline at end of file
+}
diff --git a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhaseTest.java b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhaseTest.java
index 2b0edf6..2b0dff2 100644
--- a/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhaseTest.java
+++ b/maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/CheckDependencySnapshotsPhaseTest.java
@@ -30,7 +30,9 @@
 
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 import org.apache.maven.project.MavenProject;
@@ -108,6 +110,35 @@
         assertTrue( true );
     }
 
+    // MRELEASE-985
+    @Test
+    public void testSnapshotDependenciesInProjectAndResolveFromCommandLine() throws Exception {
+        List<MavenProject> reactorProjects = createDescriptorFromProjects( "internal-snapshot-dependencies-no-reactor" );
+        ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder( reactorProjects );
+        builder.addDependencyReleaseVersion("groupId:test", "1.0");
+        builder.addDependencyDevelopmentVersion("groupId:test", "1.1");
+
+        try
+        {
+            phase.execute( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
+            assertTrue( true );
+        }
+        catch ( ReleaseFailureException e )
+        {
+            fail( "There should be no failed execution" );
+        }
+
+        try
+        {
+            phase.simulate( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
+            assertTrue( true );
+        }
+        catch ( ReleaseFailureException e )
+        {
+            fail( "There should be no failed execution" );
+        }
+    }
+
     @Test
     public void testSnapshotDependenciesInProjectOnly()
         throws Exception
@@ -498,10 +529,10 @@
                                                new VersionPair( "1.0", "1.0" ) ) );
 
         phase.execute( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
- 
+
         // validate
         ReleaseDescriptor descriptor = ReleaseUtils.buildReleaseDescriptor( builder );
-        
+
         assertEquals( "1.0", descriptor.getDependencyReleaseVersion( "external:artifactId" ) );
         assertEquals( "1.1-SNAPSHOT", descriptor.getDependencyDevelopmentVersion( "external:artifactId" ) );
 
diff --git a/maven-release-manager/src/test/resources/projects/check-dependencies/internal-snapshot-dependencies-no-reactor/pom.xml b/maven-release-manager/src/test/resources/projects/check-dependencies/internal-snapshot-dependencies-no-reactor/pom.xml
new file mode 100644
index 0000000..c62fbfa
--- /dev/null
+++ b/maven-release-manager/src/test/resources/projects/check-dependencies/internal-snapshot-dependencies-no-reactor/pom.xml
@@ -0,0 +1,31 @@
+<!--
+  ~ Copyright 2005-2006 The Apache Software Foundation.
+  ~
+  ~ 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.
+  -->
+
+<project>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>groupId</groupId>
+    <artifactId>artifactId</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>groupId</groupId>
+            <artifactId>test</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+</project>