Author: dfabulich
Date: Sat Nov  6 05:24:16 2010
New Revision: 1031961

URL: http://svn.apache.org/viewvc?rev=1031961&view=rev
Log:
Ignore changes in random subdirectory; allow configurable baseDir

Modified:
    
maven/sandbox/trunk/shared/scm-changes-maven-extension/src/main/java/org/apache/maven/shared/scmchanges/MakeScmChanges.java
    
maven/sandbox/trunk/shared/scm-changes-maven-extension/src/test/java/org/apache/maven/shared/scmchanges/MakeScmChangesTest.java

Modified: 
maven/sandbox/trunk/shared/scm-changes-maven-extension/src/main/java/org/apache/maven/shared/scmchanges/MakeScmChanges.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/shared/scm-changes-maven-extension/src/main/java/org/apache/maven/shared/scmchanges/MakeScmChanges.java?rev=1031961&r1=1031960&r2=1031961&view=diff
==============================================================================
--- 
maven/sandbox/trunk/shared/scm-changes-maven-extension/src/main/java/org/apache/maven/shared/scmchanges/MakeScmChanges.java
 (original)
+++ 
maven/sandbox/trunk/shared/scm-changes-maven-extension/src/main/java/org/apache/maven/shared/scmchanges/MakeScmChanges.java
 Sat Nov  6 05:24:16 2010
@@ -66,9 +66,9 @@ public class MakeScmChanges
 
     /** Disabled by default; activate via -Dmake.scmChanges=true */
     boolean enabled = false;
-
-    // TODO configurable baseDir
-    // TODO Don't just build from the root because we can't figure out what to 
do
+    
+    /** make.baseDir: Search SCM for modified files in this directory.  
Defaults to ${project.baseDir} for the root project. */
+    File baseDir;
     
     public void afterProjectsRead( MavenSession session )
         throws MavenExecutionException
@@ -82,10 +82,11 @@ public class MakeScmChanges
         }
             
 
-        List<ScmFile> changedFiles = getChangedFilesFromScm( 
session.getTopLevelProject().getBasedir() );
+        List<ScmFile> changedFiles = getChangedFilesFromScm( baseDir );
 
         List<String> includedProjects = new ArrayList<String>();
 
+        MavenProject topLevelProject = session.getTopLevelProject();
         for ( ScmFile changedScmFile : changedFiles )
         {
             logger.debug( changedScmFile.toString() );
@@ -101,9 +102,9 @@ public class MakeScmChanges
                 continue;
             }
 
-            File changedFile = new File( changedScmFile.getPath() );
+            File changedFile = new File( changedScmFile.getPath() 
).getAbsoluteFile();
             
-            if ( ignoreRootPom && 
session.getTopLevelProject().getFile().getAbsoluteFile().equals( 
changedFile.getAbsoluteFile() ) )
+            if ( ignoreRootPom && 
topLevelProject.getFile().getAbsoluteFile().equals( changedFile) )
             {
                 continue;
             }
@@ -115,6 +116,31 @@ public class MakeScmChanges
                 File projectDirectory = project.getFile().getParentFile();
                 if ( changedFile.getAbsolutePath().startsWith( 
projectDirectory.getAbsolutePath() + File.separator ) )
                 {
+                    if (topLevelProject.equals( project )) {
+                        // If we include the top level project, then we'll 
build everything.
+                        // We have to be very careful before allowing that to 
happen.
+                        
+                        // In particular, if the modified file is in a 
subdirectory X that is not itself
+                        // a Maven project, we don't want that one file to 
cause a full build. 
+                        // i.e. we ignore changes that are in a random 
subdirectory.
+                        
+                        // Is the top level project actually in the baseDir?
+                        // Sometimes people have sibling child projects, e.g.
+                        // <module>../child-project</module>
+                        // If the top level project isn't the baseDir, then 
running the whole build may be rational.
+                        if 
(baseDir.equals(projectDirectory.getAbsoluteFile())) {
+                            
+                            // is the changed file the baseDir or one of its 
immediate descendants?
+                            // That should probably provoke a rebuild.
+                            if (!(baseDir.equals( changedFile ) || 
baseDir.equals( changedFile.getParentFile() ))) {
+                                // OK, so the changed file is in some random 
subdirectory of the baseDir.
+                                // Skip it.
+                                logger.debug( "Not considering top level 
project for " + changedFile +
+                                              " because that would trigger a 
full rebuild." );
+                                continue;
+                            }
+                        }
+                    }
                     if ( !includedProjects.contains( project ) )
                     {
                         logger.debug( "Including " + project );
@@ -132,7 +158,7 @@ public class MakeScmChanges
 
         if ( includedProjects.isEmpty() )
             throw new MavenExecutionException( "No SCM changes detected; 
nothing to do!",
-                                               
session.getTopLevelProject().getFile() );
+                                               topLevelProject.getFile() );
 
         MavenExecutionRequest request = session.getRequest();
         String makeBehavior = request.getMakeBehavior();
@@ -171,6 +197,13 @@ public class MakeScmChanges
         enabled = Boolean.parseBoolean( sessionProps.getProperty( 
"make.scmChanges", "false" ) );
         ignoreUnknown = Boolean.parseBoolean( sessionProps.getProperty( 
"make.ignoreUnknown", "true" ) );
         ignoreRootPom = Boolean.parseBoolean( sessionProps.getProperty( 
"make.ignoreRootPom", "false" ) );
+        
+        String basePath = sessionProps.getProperty( "make.baseDir" );
+        if (basePath != null) {
+            baseDir = new File(basePath).getAbsoluteFile();
+        } else {
+            baseDir = 
session.getTopLevelProject().getBasedir().getAbsoluteFile();
+        }
     }
 
     @SuppressWarnings( "unchecked" )

Modified: 
maven/sandbox/trunk/shared/scm-changes-maven-extension/src/test/java/org/apache/maven/shared/scmchanges/MakeScmChangesTest.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/shared/scm-changes-maven-extension/src/test/java/org/apache/maven/shared/scmchanges/MakeScmChangesTest.java?rev=1031961&r1=1031960&r2=1031961&view=diff
==============================================================================
--- 
maven/sandbox/trunk/shared/scm-changes-maven-extension/src/test/java/org/apache/maven/shared/scmchanges/MakeScmChangesTest.java
 (original)
+++ 
maven/sandbox/trunk/shared/scm-changes-maven-extension/src/test/java/org/apache/maven/shared/scmchanges/MakeScmChangesTest.java
 Sat Nov  6 05:24:16 2010
@@ -1,5 +1,25 @@
 package org.apache.maven.shared.scmchanges;
 
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+
 import static org.hamcrest.core.Is.*;
 import static org.junit.Assert.*;
 import static org.mockito.Matchers.*;
@@ -38,6 +58,7 @@ public class MakeScmChangesTest
     public void setUp()
     {
         msc = new MakeScmChanges();
+        msc.baseDir = new File("").getAbsoluteFile();
         msc.logger = mock(Logger.class);
     }
 
@@ -64,8 +85,9 @@ public class MakeScmChangesTest
         String scmConnection = "foo";
         when( scm.getConnection() ).thenReturn( scmConnection );
 
-        MavenProject project = mock( MavenProject.class );
-        when( project.getScm() ).thenReturn( scm );
+        MavenProject project = new MavenProject();
+        project.setScm( scm );
+        project.setFile( new File("").getAbsoluteFile() );
 
         when( session.getTopLevelProject() ).thenReturn( project );
 
@@ -284,4 +306,32 @@ public class MakeScmChangesTest
         
     }
     
+    @Test(expected = MavenExecutionException.class)
+    public void nothingToDoBecauseIgnoringRandomSubdirectory() throws 
MavenExecutionException {
+        MavenSession session = mock(MavenSession.class);
+        
+        msc.enabled = true;
+        
+        msc = PowerMockito.spy( msc );
+        
+        PowerMockito.doNothing().when( msc ).readParameters( (MavenSession) 
any() );
+        
+        ScmFile changedFile = new ScmFile("foo/pom.xml", 
ScmFileStatus.MODIFIED);
+        
+        List<ScmFile> changedFiles = Arrays.asList( changedFile );
+        
+        PowerMockito.doReturn( changedFiles ).when( msc 
).getChangedFilesFromScm( (File) any() );
+        
+        MavenProject project = new MavenProject();
+        
+        project.setFile( new File("pom.xml").getAbsoluteFile() );
+        
+        when ( session.getTopLevelProject() ).thenReturn( project);
+        
+        when ( session.getProjects() ).thenReturn( Arrays.asList( project ));
+        
+        msc.afterProjectsRead( session );
+        
+    }
+    
 }


Reply via email to