[ 
http://jira.codehaus.org/browse/MRELEASE-516?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mathias Arens updated MRELEASE-516:
-----------------------------------

    Attachment: MRELEASE-516-flat-project-structure-support.txt

Hello,

I have a project with a flat structure as described in the first comment. I was 
a little disappointed that flat structures are not supported.

I tried to fix the problem and in my environment Maven 2.2.1 / Release Plugin 
2.2-SNAPSHOT / CVS it works. I attached a patch file. Unfortunately my eclipse 
formatter formatted the source files so it is difficult to see where the code 
changes are.

Here is a short description of what I had to change:
{code:title=ScmTagPhase.java(SVN-Version 922071)|borderStyle=solid}
[...]
        TagScmResult result = new TagScmResult(null, null, null, true); // 
modified
        try
        {
            // TODO: want includes/excludes?
            String tagName = releaseDescriptor.getScmReleaseLabel();
            ScmTagParameters scmTagParameters =
                new ScmTagParameters( releaseDescriptor.getScmCommentPrefix() + 
" copy for tag " + tagName );
            scmTagParameters.setRemoteTagging( 
releaseDescriptor.isRemoteTagging() );
            scmTagParameters.setScmRevision( 
releaseDescriptor.getScmReleasedPomRevision() );
            if ( getLogger().isDebugEnabled() )
            {
                getLogger().debug(
                        "ScmTagPhase :: scmTagParameters remotingTag " + 
releaseDescriptor.isRemoteTagging() );
                getLogger().debug(
                        "ScmTagPhase :: scmTagParameters scmRevision " + 
releaseDescriptor.getScmReleasedPomRevision() );
            }
            // new code
            if (releaseDescriptor.isCommitByProject()) {
                Iterator reactorProjectsIter = reactorProjects.iterator();
                while (reactorProjectsIter.hasNext() && result.isSuccess()) {
                    MavenProject mavenProject = (MavenProject) 
reactorProjectsIter.next();
                    ScmFileSet fileSet = new ScmFileSet( 
mavenProject.getBasedir() );
                    result = provider.tag( repository, fileSet, tagName, 
scmTagParameters );
                }
            } else {
            // end - new code
                ScmFileSet fileSet = new ScmFileSet( new File( 
basedirAlignedReleaseDescriptor.getWorkingDirectory() ) );
                result = provider.tag( repository, fileSet, tagName, 
scmTagParameters );    
            }
        }
        catch ( ScmException e )
        {
            throw new ReleaseExecutionException( "An error is occurred in the 
tag process: " + e.getMessage(), e );
        }

        if ( result == null || !result.isSuccess() )
        {
            throw new ReleaseScmCommandException( "Unable to tag SCM", result );
        }
[...]
{code}
Basically I iterate over the maven projects and tag each maven project instead 
of the root project only if the commitByProject flag is set to true.
With this change the release:prepare phase already worked. I could run the 
prepare goal with this statement (I included some personal profiles):
{code}
mvn org.apache.maven.plugins:maven-release-plugin:2.2-SNAPSHOT:prepare 
-DautoVersionSubmodules=true -Darguments="-P NOTESTS,PRODUCTION" 
-DcommitByProject=true -Dusername=xxxx -Dpassword=xxxx
{code}
To make the release:perform goal work I had to update the
{code:title=CheckoutProjectFromScm.java(SVN-Version 903713)|borderStyle=solid}
        [...]
        checkoutDirectory.mkdirs();

        CheckOutScmResult scmResult = new CheckOutScmResult(null, null, null, 
true); // modified
        // new code
        if (releaseDescriptor.isCommitByProject()) {
            // flat project structure
            String rootProjectBaseDir = 
ReleaseUtil.getCommonBasedir(reactorProjects);
            Iterator reactorProjectsIter = reactorProjects.iterator();
            while (reactorProjectsIter.hasNext() && scmResult.isSuccess()) {
                MavenProject mavenProject = (MavenProject) 
reactorProjectsIter.next();
                File mavenCheckoutProjectDirectory;
                String mavenProjectBaseDir = 
mavenProject.getBasedir().getAbsolutePath();
                if (mavenProjectBaseDir.length() > rootProjectBaseDir.length()) 
{
                    String relativeProjectDir = 
mavenProjectBaseDir.substring(rootProjectBaseDir
                            .length() + 1);
                    mavenCheckoutProjectDirectory = new File(checkoutDirectory, 
relativeProjectDir);
                } else {
                    mavenCheckoutProjectDirectory = checkoutDirectory;
                }
                
                try {
                    repository = 
scmRepositoryConfigurator.getConfiguredRepository(mavenProject.getScm().getConnection(),
 releaseDescriptor,
                            releaseEnvironment.getSettings());

                    provider = 
scmRepositoryConfigurator.getRepositoryProvider(repository);
                } catch (ScmRepositoryException e) {
                    result.setResultCode(ReleaseResult.ERROR);
                    logError(result, e.getMessage());

                    throw new ReleaseScmRepositoryException(e.getMessage(), 
e.getValidationMessages());
                } catch (NoSuchScmProviderException e) {
                    result.setResultCode(ReleaseResult.ERROR);
                    logError(result, e.getMessage());

                    throw new ReleaseExecutionException("Unable to configure 
SCM repository: "
                            + e.getMessage(), e);
                }
                
                try {
                    scmResult = provider.checkOut(repository, new ScmFileSet(
                            mavenCheckoutProjectDirectory), new 
ScmTag(releaseDescriptor
                            .getScmReleaseLabel()));
                } catch (ScmException e) {
                    result.setResultCode(ReleaseResult.ERROR);
                    logError(result, e.getMessage());

                    throw new ReleaseExecutionException(
                            "An error is occurred in the checkout process: " + 
e.getMessage(), e);
                }
            }
        } else {
            // end - new code
            try {
                repository = 
scmRepositoryConfigurator.getConfiguredRepository(releaseDescriptor,
                        releaseEnvironment.getSettings());

                provider = 
scmRepositoryConfigurator.getRepositoryProvider(repository);
            } catch (ScmRepositoryException e) {
                result.setResultCode(ReleaseResult.ERROR);
                logError(result, e.getMessage());

                throw new ReleaseScmRepositoryException(e.getMessage(), 
e.getValidationMessages());
            } catch (NoSuchScmProviderException e) {
                result.setResultCode(ReleaseResult.ERROR);
                logError(result, e.getMessage());

                throw new ReleaseExecutionException("Unable to configure SCM 
repository: "
                        + e.getMessage(), e);
            }
            
            // standard project structure
            try {
                scmResult = provider.checkOut(repository, new 
ScmFileSet(checkoutDirectory),
                        new ScmTag(releaseDescriptor.getScmReleaseLabel()));
            } catch (ScmException e) {
                result.setResultCode(ReleaseResult.ERROR);
                logError(result, e.getMessage());

                throw new ReleaseExecutionException(
                        "An error is occurred in the checkout process: " + 
e.getMessage(), e);
            }
        }

        String scmRelativePathProjectDirectory = 
scmResult.getRelativePathProjectDirectory();
        if (StringUtils.isEmpty(scmRelativePathProjectDirectory)) {
            String basedir = ReleaseUtil.getCommonBasedir(reactorProjects);
            String rootProjectBasedir = 
rootProject.getBasedir().getAbsolutePath();
            if (rootProjectBasedir.length() > basedir.length()) {
                scmRelativePathProjectDirectory = rootProjectBasedir
                        .substring(basedir.length() + 1);
            }
        }
{code}
Here again I had to iterate over the maven projects to check them out to the 
target/checkout directory. There might be a smarter implementation though 
because I have a little code duplication in the if/else statement.
Basically with these two changes I could support the flat project structure. 
The third but last minor modification was in the PerformReleaseMojo. I had to 
copy the commitByProject attribute from the PrepareReleaseMojo to the 
PerformReleaseMojo but these changes are all contained in the patch file. 

With this command line command I could perform a release:
{code}
mvn org.apache.maven.plugins:maven-release-plugin:2.2-SNAPSHOT:perform 
-DreleaseProfiles="NOTESTS,PRODUCTION" -DcommitByProject=true -Dgoals="clean 
install"
{code}

It would be great if somebody with an svn flat project structure could test the 
code.

> release:prepare should support a nested/flat hybrid SCM structure
> -----------------------------------------------------------------
>
>                 Key: MRELEASE-516
>                 URL: http://jira.codehaus.org/browse/MRELEASE-516
>             Project: Maven 2.x Release Plugin
>          Issue Type: Improvement
>          Components: perform, prepare
>    Affects Versions: 2.0-beta-9
>         Environment: OS X 10.5.8, Windows XP Prof, JDK 1.5.0_12, SVN, GIT, CVS
>            Reporter: Eric Miles
>         Attachments: maven-release-issue.zip, 
> MRELEASE-516-flat-project-structure-support.txt, odd-tags.png
>
>
> This issue is related to MRELEASE-261 in that release prepare is having some 
> difficulty in dealing with certain SCM structures during the prepare goal.  
> Our project structure is flat as you would see in a typical IDE setup:
> {noformat}
> release-workspace\
>         |
>         |--release-parent
>         |    |+pom.xml (modules: ../release-module1, ../release-module2)
>         |
>         |--release-module1
>         |    |+pom.xml (parent: ../release-parent)
>         |
>         |--release-module2
>              |+pom.xml (parent: ../release-parent)
> {noformat}
> Our SCM (svn) structure is as follows:
> {noformat}
> svnroot
> |
> +--release-parent/trunk/pom.xml
> +--release-parent/tags/release-parent-1.0.9/pom.xml
> |
> +--release-module1/trunk/pom.xml
> +--release-module1/tags/release-module1-1.0.9/pom.xml
> |
> +--release-module1/trunk/pom.xml
> +--release-module2/tags/release-module2-1.0.9/pom.xml
> {noformat}
> If we execute release:prepare with no configuration to the release plugin, we 
> get the following error:
> {noformat}
> [INFO] [INFO] 
> ------------------------------------------------------------------------
> [INFO] Checking in modified POMs...
> [INFO] Executing: /bin/sh -c cd 
> /Users/emiles/Projects/release-workspace/release-parent && svn 
> --non-interactive commit --file 
> /var/folders/fH/fHNZYBGdFd0bMMIPiloA2U+++TI/-Tmp-/maven-scm-1253932520.commit 
> --targets 
> /var/folders/fH/fHNZYBGdFd0bMMIPiloA2U+++TI/-Tmp-/maven-scm-4376558781490229966-targets
> [INFO] Working directory: 
> /Users/emiles/Projects/release-workspace/release-parent
> [INFO] 
> ------------------------------------------------------------------------
> [ERROR] BUILD FAILURE
> [INFO] 
> ------------------------------------------------------------------------
> [INFO] Unable to commit files
> Provider message:
> The svn command failed.
> Command output:
> svn: '/Users/emiles/Projects/release-workspace' is not a working copy
> {noformat}
> If we use the 2.0-beta-10-SNAPSHOT with flat project support and provide the 
> -DcommitByProject=true JVM parameter, we do not get any errors, however 
> tagging does not happen as expected.  Rather than having tags for each of the 
> projects, some odd tagging happened at the parent level where an entire 
> structure was created (with branches, tags and trunk under the tag folder).  
> I'm attaching a screen shot for reference.
> Ignoring the fact that the prepare only somewhat worked, when I attempted to 
> perform the release, I get an error:
> {noformat}
> emiles-macbook:release-parent emiles$ mvn release:perform 
> -DcommitByProject=true
> [INFO] Scanning for projects...
> [INFO] Reactor build order: 
> [INFO]   Unnamed - com.captechventures:release-parent:pom:0.0.3-SNAPSHOT
> [INFO]   Unnamed - com.captechventures:release-module1:jar:0.0.3-SNAPSHOT
> [INFO]   Unnamed - com.captechventures:release-module2:jar:0.0.3-SNAPSHOT
> [INFO] 
> ------------------------------------------------------------------------
> [INFO] Building Unnamed - 
> com.captechventures:release-parent:pom:0.0.3-SNAPSHOT
> [INFO]    task-segment: [release:perform] (aggregator-style)
> [INFO] 
> ------------------------------------------------------------------------
> [INFO] [release:perform {execution: default-cli}]
> [INFO] Checking out the project to perform the release ...
> [INFO] Executing: /bin/sh -c cd 
> /Users/emiles/Projects/release-workspace/release-parent/target && svn 
> --non-interactive checkout 
> http://localhost/dev/release-parent/tags/release-parent-0.0.2 
> /Users/emiles/Projects/release-workspace/release-parent/target/checkout
> [INFO] Working directory: 
> /Users/emiles/Projects/release-workspace/release-parent/target
> [INFO] Executing goals 'deploy'...
> [WARNING] Base directory is a file. Using base directory as POM location.
> [WARNING] Maven will be executed in interactive mode, but no input stream has 
> been configured for this MavenInvoker instance.
> [INFO] 
> ------------------------------------------------------------------------
> [ERROR] BUILD ERROR
> [INFO] 
> ------------------------------------------------------------------------
> [INFO] Error executing Maven.
> Working directory 
> "/Users/emiles/Projects/release-workspace/release-parent/target/checkout/Users/emiles/Projects/release-workspace/release-parent"
>  does not exist!
> [INFO] 
> ------------------------------------------------------------------------
> [INFO] For more information, run Maven with the -e switch
> [INFO] 
> ------------------------------------------------------------------------
> [INFO] Total time: 5 seconds
> [INFO] Finished at: Mon Jan 04 12:22:31 EST 2010
> [INFO] Final Memory: 11M/20M
> [INFO] 
> ------------------------------------------------------------------------
> {noformat}
> Although this isn't the flat model as identifed in MRELEASE-261, I feel this 
> flat structure should be supported as all the relevant SCM metadata is 
> included in each POM so the plugin should have no difficulty determining 
> where to check stuff into SCM.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to