You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by de...@apache.org on 2015/09/25 08:59:45 UTC
svn commit: r1705226 - in
/maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven:
plugin/changelog/ scm/ scm/provider/ scm/provider/svn/
scm/provider/svn/svnexe/ scm/provider/svn/svnexe/command/
scm/provider/svn/svnexe/command/info/
Author: dennisl
Date: Fri Sep 25 06:59:45 2015
New Revision: 1705226
URL: http://svn.apache.org/viewvc?rev=1705226&view=rev
Log:
[MCHANGELOG-79] Add support for "tag" type report of Subversion.
Submitted by: Jerome Lacoste and Samuel Van Reeth
Reviewed by: Dennis Lundberg
After removing all the whitespace changed I applied the patch from Samuel, which was based in part on the one from Jerome. I also added some error handling in case you configure a non-existing tag.
Added:
maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/scm/
maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/scm/provider/
maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/scm/provider/svn/
maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/scm/provider/svn/svnexe/
maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/
maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/info/
maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/info/SvnInfoCommandExpanded.java (with props)
Modified:
maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java
Modified: maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java?rev=1705226&r1=1705225&r2=1705226&view=diff
==============================================================================
--- maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java (original)
+++ maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/plugin/changelog/ChangeLogReport.java Fri Sep 25 06:59:45 2015
@@ -38,11 +38,15 @@ import org.apache.maven.scm.ScmResult;
import org.apache.maven.scm.ScmRevision;
import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
import org.apache.maven.scm.command.changelog.ChangeLogSet;
+import org.apache.maven.scm.command.info.InfoItem;
+import org.apache.maven.scm.command.info.InfoScmResult;
+import org.apache.maven.scm.log.DefaultLog;
import org.apache.maven.scm.manager.ScmManager;
import org.apache.maven.scm.provider.ScmProvider;
import org.apache.maven.scm.provider.ScmProviderRepository;
import org.apache.maven.scm.provider.ScmProviderRepositoryWithHost;
import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
+import org.apache.maven.scm.provider.svn.svnexe.command.info.SvnInfoCommandExpanded;
import org.apache.maven.scm.repository.ScmRepository;
import org.apache.maven.settings.Server;
import org.apache.maven.settings.Settings;
@@ -654,10 +658,6 @@ public class ChangeLogReport
}
else if ( "tag".equals( type ) )
{
- if ( repository.getProvider().equals( "svn" ) )
- {
- throw new MavenReportException( "The type '" + type + "' isn't supported for svn." );
- }
Iterator<String> tagsIter = tags.iterator();
@@ -669,11 +669,15 @@ public class ChangeLogReport
while ( tagsIter.hasNext() )
{
endTag = tagsIter.next();
-
- result = provider.changeLog( repository, new ScmFileSet( basedir ), new ScmRevision( startTag ),
- new ScmRevision( endTag ) );
+ String endRevision = getRevisionForTag( endTag, repository, provider );
+ String startRevision = getRevisionForTag( startTag, repository, provider );
+ result = provider.changeLog( repository, new ScmFileSet( basedir ),
+ new ScmRevision( startRevision ),
+ new ScmRevision( endRevision ) );
checkResult( result );
+ result.getChangeLog().setStartVersion( new ScmRevision( startTag ) );
+ result.getChangeLog().setEndVersion( new ScmRevision( endTag ) );
changeSets.add( result.getChangeLog() );
@@ -682,11 +686,15 @@ public class ChangeLogReport
}
else
{
- result = provider.changeLog( repository, new ScmFileSet( basedir ), new ScmRevision( startTag ),
- new ScmRevision( endTag ) );
+ String startRevision = getRevisionForTag( startTag, repository, provider );
+ String endRevision = getRevisionForTag( endTag, repository, provider );
+ result = provider.changeLog( repository, new ScmFileSet( basedir ),
+ new ScmRevision( startRevision ),
+ new ScmRevision( endRevision ) );
checkResult( result );
-
+ result.getChangeLog().setStartVersion( new ScmRevision( startTag ) );
+ result.getChangeLog().setEndVersion( null );
changeSets.add( result.getChangeLog() );
}
}
@@ -742,6 +750,42 @@ public class ChangeLogReport
}
/**
+ * Resolves the given tag to the revision number.
+ *
+ * @param tag
+ * @param repository
+ * @param provider
+ * @return
+ * @throws ScmException
+ */
+ private String getRevisionForTag( final String tag, final ScmRepository repository, final ScmProvider provider )
+ throws ScmException
+ {
+ if ( repository.getProvider().equals( "svn" ) )
+ {
+ if ( tag == null )
+ {
+ return "HEAD";
+ }
+ SvnInfoCommandExpanded infoCommand = new SvnInfoCommandExpanded();
+ infoCommand.setLogger( new DefaultLog() );
+
+ InfoScmResult infoScmResult =
+ infoCommand.executeInfoTagCommand( (SvnScmProviderRepository) repository.getProviderRepository(),
+ new ScmFileSet( basedir ), tag, null, false, null );
+ if ( infoScmResult.getInfoItems().size() == 0 )
+ {
+ throw new ScmException( "There is no tag named '" + tag + "' in the Subversion repository." );
+ }
+ InfoItem infoItem = infoScmResult.getInfoItems().get( 0 );
+ String revision = infoItem.getLastChangedRevision();
+ getLog().info( String.format( "Resolved tag '%s' to revision '%s'", tag, revision ) );
+ return revision;
+ }
+ return tag;
+ }
+
+ /**
* filters out unwanted files from the changesets
*/
private void filter( List<ChangeLogSet> changeSets )
Added: maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/info/SvnInfoCommandExpanded.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/info/SvnInfoCommandExpanded.java?rev=1705226&view=auto
==============================================================================
--- maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/info/SvnInfoCommandExpanded.java (added)
+++ maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/info/SvnInfoCommandExpanded.java Fri Sep 25 06:59:45 2015
@@ -0,0 +1,200 @@
+package org.apache.maven.scm.provider.svn.svnexe.command.info;
+
+/*
+ * 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 java.io.File;
+import java.util.Iterator;
+
+import org.apache.maven.scm.CommandParameters;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.ScmTag;
+import org.apache.maven.scm.command.AbstractCommand;
+import org.apache.maven.scm.command.info.InfoScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.svn.SvnCommandUtils;
+import org.apache.maven.scm.provider.svn.SvnTagBranchUtils;
+import org.apache.maven.scm.provider.svn.command.SvnCommand;
+import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
+import org.apache.maven.scm.provider.svn.svnexe.command.SvnCommandLineUtils;
+import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.cli.CommandLineException;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+
+/**
+ * variation of SvnInfoCommand to work for branches. Taken from 1.7 release of maven-scm-providers
+ *
+ * @author <a href="mailto:kenney@apache.org">Kenney Westerhof</a>
+ */
+public class SvnInfoCommandExpanded
+ extends AbstractCommand
+ implements SvnCommand
+{
+
+ /** {@inheritDoc} */
+ @Override
+ protected ScmResult executeCommand( final ScmProviderRepository repository, final ScmFileSet fileSet,
+ final CommandParameters parameters )
+ throws ScmException
+ {
+ return executeInfoCommand( (SvnScmProviderRepository) repository, fileSet, parameters, false, null );
+ }
+
+ public InfoScmResult executeInfoCommand( final SvnScmProviderRepository repository, final ScmFileSet fileSet,
+ final CommandParameters parameters, final boolean recursive,
+ final String revision )
+ throws ScmException
+ {
+ Commandline cl = createCommandLine( repository, fileSet, recursive, revision );
+ return executeInfoCommand( cl );
+ }
+
+ public InfoScmResult executeInfoTagCommand( final SvnScmProviderRepository repository, final ScmFileSet fileSet,
+ final String tag, final CommandParameters parameters,
+ final boolean recursive, final String revision )
+ throws ScmException
+ {
+ Commandline cl = createTagCommandLine( repository, fileSet, tag, recursive, revision );
+ return executeInfoCommand( cl );
+ }
+
+ private InfoScmResult executeInfoCommand( final Commandline cl )
+ throws ScmException
+ {
+
+ SvnInfoConsumer consumer = new SvnInfoConsumer();
+
+ CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+ if ( getLogger().isInfoEnabled() )
+ {
+ getLogger().info( "Executing: " + SvnCommandLineUtils.cryptPassword( cl ) );
+ getLogger().info( "Working directory: " + cl.getWorkingDirectory().getAbsolutePath() );
+ }
+
+ int exitCode;
+ try
+ {
+ exitCode = SvnCommandLineUtils.execute( cl, consumer, stderr, getLogger() );
+ }
+ catch ( CommandLineException ex )
+ {
+ throw new ScmException( "Error while executing command.", ex );
+ }
+
+ if ( exitCode != 0 )
+ {
+ return new InfoScmResult( cl.toString(), "The svn command failed.", stderr.getOutput(), false );
+ }
+
+ return new InfoScmResult( cl.toString(), consumer.getInfoItems() );
+ }
+
+ // set scope to protected to allow test to call it directly
+ protected static Commandline createCommandLine( final SvnScmProviderRepository repository,
+ final ScmFileSet fileSet, final boolean recursive,
+ final String revision )
+ {
+ Commandline cl = SvnCommandLineUtils.getBaseSvnCommandLine( fileSet.getBasedir(), repository );
+
+ cl.createArg().setValue( "info" );
+
+ if ( recursive )
+ {
+ cl.createArg().setValue( "--recursive" );
+ }
+
+ if ( StringUtils.isNotEmpty( revision ) )
+ {
+ cl.createArg().setValue( "-r" );
+ cl.createArg().setValue( revision );
+ }
+
+ Iterator<File> it = fileSet.getFileList().iterator();
+
+ while ( it.hasNext() )
+ {
+ File file = it.next();
+ if ( repository == null )
+ {
+ cl.createArg().setValue( file.getPath() );
+ }
+ else
+ {
+ cl.createArg().setValue( repository.getUrl() + "/" + file.getPath().replace( '\\', '/' ) );
+ }
+ }
+
+ return cl;
+ }
+
+ // set scope to protected to allow test to call it directly
+ protected static Commandline createTagCommandLine( final SvnScmProviderRepository repository,
+ final ScmFileSet fileSet, final String tag,
+ final boolean recursive, final String revision )
+ {
+ Commandline cl = SvnCommandLineUtils.getBaseSvnCommandLine( fileSet.getBasedir(), repository );
+
+ cl.createArg().setValue( "info" );
+
+ if ( recursive )
+ {
+ cl.createArg().setValue( "--recursive" );
+ }
+
+ if ( StringUtils.isNotEmpty( revision ) )
+ {
+ cl.createArg().setValue( "-r" );
+ cl.createArg().setValue( revision );
+ }
+
+ Iterator<File> it = fileSet.getFileList().iterator();
+
+ if ( !it.hasNext() )
+ {
+ String tagUrl = SvnTagBranchUtils.resolveTagUrl( repository, new ScmTag( tag ) );
+ cl.createArg().setValue( SvnCommandUtils.fixUrl( tagUrl, repository.getUser() ) );
+ }
+ else
+ {
+ while ( it.hasNext() )
+ {
+ File file = it.next();
+
+ if ( repository == null )
+ {
+ cl.createArg().setValue( file.getPath() );
+ }
+ else
+ {
+ // Note: this currently assumes you have the tag base checked out too
+ String tagUrl =
+ SvnTagBranchUtils.resolveTagUrl( repository, new ScmTag( tag ) ) + "/"
+ + file.getPath().replace( '\\', '/' );
+ cl.createArg().setValue( SvnCommandUtils.fixUrl( tagUrl, repository.getUser() ) );
+ }
+ }
+ }
+
+ return cl;
+ }
+
+}
Propchange: maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/info/SvnInfoCommandExpanded.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/plugins/trunk/maven-changelog-plugin/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/info/SvnInfoCommandExpanded.java
------------------------------------------------------------------------------
svn:keywords = Date Revision Author Id