From 24ca8407d1b18da0a992a6fc8221d33a3743dc3c Mon Sep 17 00:00:00 2001 From: Eli Shvartsman Date: Thu, 7 Jul 2016 11:02:53 +0300 Subject: [PATCH] fix SCM-835 collision --- .../command/checkin/GitCheckInCommand.java | 2 +- .../command/status/GitStatusConsumer.java | 72 ++++++++++++++++++- .../checkin/GitCheckInCommandTest.java | 32 +++++++++ .../command/status/GitStatusConsumerTest.java | 34 +++++++++ 4 files changed, 138 insertions(+), 2 deletions(-) diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java index 30d6c70ea..d97048542 100644 --- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java +++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java @@ -129,7 +129,7 @@ protected CheckInScmResult executeCheckInCommand( ScmProviderRepository repo, Sc Commandline clStatus = GitStatusCommand.createCommandLine( repository, fileSet ); GitStatusConsumer statusConsumer = - new GitStatusConsumer( getLogger(), fileSet.getBasedir(), relativeRepositoryPath ); + new GitStatusConsumer( getLogger(), fileSet.getBasedir(), relativeRepositoryPath, fileSet ); exitCode = GitCommandLineUtils.execute( clStatus, statusConsumer, stderr, getLogger() ); if ( exitCode != 0 ) { diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumer.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumer.java index 00a1ef38b..633bc8f7a 100644 --- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumer.java +++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumer.java @@ -31,6 +31,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.maven.scm.ScmFile; import org.apache.maven.scm.ScmFileStatus; +import org.apache.maven.scm.ScmFileSet; import org.apache.maven.scm.log.ScmLogger; import org.codehaus.plexus.util.cli.StreamConsumer; @@ -65,6 +66,8 @@ public class GitStatusConsumer private File workingDirectory; + private ScmFileSet scmFileSet; + /** * Entries are relative to working directory, not to the repositoryroot */ @@ -107,6 +110,45 @@ public GitStatusConsumer( ScmLogger logger, File workingDirectory, URI relativeR this.relativeRepositoryPath = relativeRepositoryPath; } + /** + * Assuming that you have to discover the repositoryRoot, this is how you can get the + * relativeRepositoryPath + *
+     * URI.create( repositoryRoot ).relativize( fileSet.getBasedir().toURI() )
+     * 
+ * + * @param logger the logger + * @param workingDirectory the working directory + * @param scmFileSet fileset with includes and excludes + * @since 1.9 + * @see GitStatusCommand#createRevparseShowToplevelCommand(org.apache.maven.scm.ScmFileSet) + */ + public GitStatusConsumer( ScmLogger logger, File workingDirectory, ScmFileSet scmFileSet ) + { + this( logger, workingDirectory ); + this.scmFileSet = scmFileSet; + } + + /** + * Assuming that you have to discover the repositoryRoot, this is how you can get the + * relativeRepositoryPath + *
+     * URI.create( repositoryRoot ).relativize( fileSet.getBasedir().toURI() )
+     * 
+ * + * @param logger the logger + * @param workingDirectory the working directory + * @param relativeRepositoryPath the working directory relative to the repository root + * @param scmFileSet fileset with includes and excludes + * @since 1.9 + * @see GitStatusCommand#createRevparseShowToplevelCommand(org.apache.maven.scm.ScmFileSet) + */ + public GitStatusConsumer( ScmLogger logger, File workingDirectory, URI relativeRepositoryPath, ScmFileSet scmFileSet ) + { + this( logger, workingDirectory, scmFileSet ); + this.relativeRepositoryPath = relativeRepositoryPath; + } + // ---------------------------------------------------------------------- // StreamConsumer Implementation // ---------------------------------------------------------------------- @@ -205,9 +247,37 @@ else if ( status == ScmFileStatus.DELETED ) for ( String file : files ) { - changedFiles.add( new ScmFile( file, status ) ); + if ( this.scmFileSet != null && !isFileNameInFileList( this.scmFileSet.getFileList(), file ) ) + { + // skip adding this file + } + else + { + changedFiles.add( new ScmFile( file, status ) ); + } + } + } + } + + private boolean isFileNameInFileList( List fileList, String fileName ) + { + if ( relativeRepositoryPath == null ) + { + return fileList.contains( new File( fileName ) ); + } + else + { + for ( File f : fileList ) + { + File file = new File( relativeRepositoryPath.getPath(), fileName ); + if ( file.getPath().endsWith( f.getName() ) ) + { + return true; + } } + return fileList.isEmpty(); } + } private boolean isFile( String file ) diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommandTest.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommandTest.java index d30e4b19c..5f3aa33d9 100644 --- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommandTest.java +++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommandTest.java @@ -132,6 +132,38 @@ public void testCheckinAfterRename() throws Exception { assertTrue("Renamed file has not been commited !", checkInScmResult.getCheckedInFiles().size() != 0); } + // Test FileSet in configuration + public void testCheckinWithFileSet() throws Exception { + File repo = getRepositoryRoot(); + File checkedOutRepo = getWorkingCopy(); + + GitScmTestUtils.initRepo("src/test/resources/repository/", getRepositoryRoot(), getWorkingDirectory()); + + ScmRepository scmRepository = getScmManager().makeScmRepository( "scm:git:file://" + repo.getAbsolutePath() ); + checkoutRepoInto(checkedOutRepo, scmRepository); + + // Creating beer.xml and whiskey.xml + File beerFile = new File(checkedOutRepo.getAbsolutePath() + File.separator + "beer.xml"); + FileUtils.fileWrite( beerFile.getAbsolutePath(), "1/2 litre" ); + File whiskeyFile = new File(checkedOutRepo.getAbsolutePath() + File.separator + "whiskey.xml"); + FileUtils.fileWrite( whiskeyFile.getAbsolutePath(), "700 ml" ); + + + // Adding and commiting beer and whiskey + AddScmResult addResult = getScmManager().add( scmRepository, new ScmFileSet( checkedOutRepo, "beer.xml,whiskey.xml" ) ); + assertResultIsSuccess( addResult ); + CheckInScmResult checkInScmResult = getScmManager().checkIn(scmRepository, new ScmFileSet(checkedOutRepo, "beer.xml,whiskey.xml" ), "Created beer file"); + assertResultIsSuccess( checkInScmResult ); + + // Editing beer and commiting whiskey, should commit nothing but succeed + FileUtils.fileWrite( beerFile.getAbsolutePath(), "1 litre" ); + + addResult = getScmManager().add( scmRepository, new ScmFileSet( checkedOutRepo, "whiskey.xml" ) ); + assertResultIsSuccess( addResult ); + checkInScmResult = getScmManager().checkIn(scmRepository, new ScmFileSet(checkedOutRepo, "whiskey.xml" ), "Checking beer file"); + assertResultIsSuccess( checkInScmResult ); + } + // ---------------------------------------------------------------------- // // ---------------------------------------------------------------------- diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumerTest.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumerTest.java index 512d2efb3..03d212312 100644 --- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumerTest.java +++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumerTest.java @@ -30,6 +30,7 @@ import org.apache.commons.io.IOUtils; import org.apache.maven.scm.ScmFile; import org.apache.maven.scm.ScmFileStatus; +import org.apache.maven.scm.ScmFileSet; import org.apache.maven.scm.log.DefaultLog; import org.codehaus.plexus.PlexusTestCase; @@ -88,6 +89,15 @@ private List getChangedFiles( String line, File workingDirectory, URI r return consumer.getChangedFiles(); } + private List getChangedFiles(String line, File workingDirectory, URI relativeRepoPath, ScmFileSet scmFileSet ) + { + GitStatusConsumer consumer = new GitStatusConsumer( new DefaultLog(), workingDirectory, relativeRepoPath, scmFileSet ); + + consumer.consumeLine( line ); + + return consumer.getChangedFiles(); + } + public void testConsumerUntrackedFile() { List changedFiles = getChangedFiles( "?? project.xml", null ); @@ -195,6 +205,30 @@ public void testURI() assertEquals( path, u.getPath() ); } + public void testConsumerWithFileSet() + throws IOException + { + File dir = createTempDirectory(); + FileUtils.write( new File( dir, "project.xml" ), "data" ); + FileUtils.write( new File( dir, "pom.xml" ), "more data" ); + File subdir = new File( dir.getAbsolutePath() + "/subDir/" ); + subdir.mkdir(); + FileUtils.write( new File( subdir, "something.xml" ), "data" ); + + + ScmFileSet scmFileSet = new ScmFileSet(dir, null, "project.xml"); + List changedFiles = getChangedFiles("M project.xml", dir, null, scmFileSet); + assertEquals( 0, changedFiles.size() ); + + scmFileSet = new ScmFileSet(dir, "pom.xml"); + changedFiles = getChangedFiles("M pom.xml", dir, null, scmFileSet); + assertEquals( 1, changedFiles.size() ); + + scmFileSet = new ScmFileSet(subdir, "something.xml", "pom.xml"); + changedFiles = getChangedFiles("M subDir/something.xml", dir, dir.toURI(), scmFileSet); + assertEquals( 1, changedFiles.size() ); + } + // SCM-740 public void testConsumerModifiedFileInComplexDirectorySetup() throws IOException {