You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@maven.apache.org by "Sascha Retter (JIRA)" <ji...@apache.org> on 2017/03/15 12:33:41 UTC

[jira] [Commented] (MRELEASE-939) release:perform uses incorrect ReleaseDescriptor.scmRelativePathProjectDirectory in nested multi-module project

    [ https://issues.apache.org/jira/browse/MRELEASE-939?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15926055#comment-15926055 ] 

Sascha Retter commented on MRELEASE-939:
----------------------------------------

This issue is still open and I have analyzed the problem. Here are the results.

The problem only appears with GIT and the problem only if the (parent) pom is not located in the project-root directory. So if possible just move the (parent) pom to the project root. 
Another workaround is to use GIT specific syntax in developerConnection in your pom. 
{code}
<developerConnection>scm:git:[push=]https://gitlab.com/gitlab-org/java-project-template-single-scm.git[fetch=]https://gitlab.com/gitlab-org/java-project-template-single-scm.git</developerConnection>      
{code}

I also had a look into the code and did some debugging. The original problem is that in ScmTagPhase class of maven-release-manager there is some code to basedir align the url. This is probably needed for SCMs like subversion were tagging is dependent on directory structure. It is definitely not needed for SCMs like GIT. Quite the opposite for GIT it is causing the problematic behavior. 

With this comment I also want to start on how to resolve the problem. Correct way in my point of view would be to move the behavior out of the SCM-generic maven-release-manager and put it in some specific abstract class for such SCMs like SVN or finally put it in the maven svn provider. 

But unfortunately this would cause changes in all SCM-Providers and is there for not very practical. 

Currently the best idea I have in mind is to add some method needsBaseDirAlignment in interface ScmProvider and add some default implemenation in AbstractScmProvider that returns true. In AbstractGitScmProvider it can be overridden and return false. Never the less this would cause some ugly code in ScmTagPhase like:

{code}
 repository =
                scmRepositoryConfigurator.getConfiguredRepository( basedirAlignedReleaseDescriptor.getScmSourceUrl(),
                                                                   releaseDescriptor,
                                                                   releaseEnvironment.getSettings() );

            repository.getProviderRepository().setPushChanges( releaseDescriptor.isPushChanges() );
            
            provider = scmRepositoryConfigurator.getRepositoryProvider( repository );
            
            if(!provider.needsBaseDirAlignment()){
                repository = scmRepositoryConfigurator.getConfiguredRepository( releaseDescriptor.getScmSourceUrl(),
                        releaseDescriptor,
                        releaseEnvironment.getSettings() );
                repository.getProviderRepository().setPushChanges( releaseDescriptor.isPushChanges() );
                provider = scmRepositoryConfigurator.getRepositoryProvider( repository );
            }
{code}

It would be nice if someone who knows the implementation of maven-release-plugin and maven-release-manager better than me comes with a better solution. 

> release:perform uses incorrect ReleaseDescriptor.scmRelativePathProjectDirectory in nested multi-module project
> ---------------------------------------------------------------------------------------------------------------
>
>                 Key: MRELEASE-939
>                 URL: https://issues.apache.org/jira/browse/MRELEASE-939
>             Project: Maven Release Plugin
>          Issue Type: Bug
>          Components: perform
>    Affects Versions: 2.5.3
>            Reporter: Jürgen
>         Attachments: GitperformReleaseMojo.java
>
>
> I recently migrated from svn to git
> I have the same issues as described in MRELEASE-927. I use the "pushChanges=false" workaround mentioned in MRELEASE-767.
> I also have an additional problem with an incorrectly determined ReleaseDescriptor.scmRelativePathProjectDirectory in release:perform
> Details:
> {code}
> project.git/maven-dir/aggregator/pom.xml
> project.git/maven-dir/module-a/pom.xml
> project.git/maven-dir/module-b/pom.xml
> {code}
> the main issue is the existence of /maven-dir, so the all the maven project dirs don't live in the repos root, but in a sub-folder.
> on release:perform of aggregator/pom.xml, a checkout happens into target/checkout
> {code}
> (cd /workspace/project.git/maven-dir/aggregator ; mvn release:perform)
> checkout into /workspace/project.git/maven-dir/aggregator/target/checkout/maven-dir/aggregator
> {code}
> org.apache.maven.shared.release.config.ReleaseDescriptor.setScmRelativePathProjectDirectory(String) determines scmRelativePathProjectDirectory incorrectly:
> {code}
> scmResult.getRelativePathProjectDirectory is null
> basedir = ReleaseUtil.getCommonBasedir( reactorProjects ) results in:
> basedir=/workspace/project.git/maven-dir
> rootProjectBasedir = rootProject.getBasedir().getAbsolutePath() results in:
> rootProjectBasedir=/workspace/project.git/maven-dir/aggregator
> scmRelativePathProjectDirectory = rootProjectBasedir.substring( basedir.length() + 1 ); results in:
> scmRelativePathProjectDirectory=/aggregator
> due to the full repos git checkout, it should be:
> scmRelativePathProjectDirectory=/maven-dir/aggregator
> {code}
> existing code worked with svn, because unlike git, release:prepare would tag only the maven-dir substructure of the svn repos, while in git, it tags the whole repos?
> so release:perform with svn checkout of the tag would result in only the /maven-dir/ being checked out into /target/checkout, leading to e.g.:
> /workspace/project.git/maven-dir/aggregator/target/checkout/aggregator
> for git, release:perform checkout of tag pulls the whole repos, so its:
> /workspace/project.git/maven-dir/aggregator/target/checkout/maven-dir/aggregator
> code to determine scmRelativePathProjectDirectory does not account for that.
> suggestion: let me define a relative project location for full-repos scm's like git, either in project/scm or in release-plugin configuration
> like
> <scmRelativePathProjectDirectory>maven-dir</scmRelativePathProjectDirectory>
> I also attaching my current workaround. I made a custom built of maven-release-plugin based on 2.5.3
> I added org.apache.maven.plugins.release.GitperformReleaseMojo
> * add a scmRelativePathProjectDirectory configuration param
> * set ReleaseDescriptor.scmRelativePathProjectDirectory to param value shortly before its needed, by injecting a custom CheckoutProjectFromScm phase
> * simply setting ReleaseDescriptor.scmRelativePathProjectDirectory in GitperformReleaseMojo.execute() doesn't work, because ReleaseDescriptor gets constructed/partly-copied/merged/overwritten later (awful!)...
> * prevent wrong ReleaseDescriptor.setScmRelativePathProjectDirectory in CheckoutProjectFromScm.performCheckout using a ReleaseDescriptor delegate
> its not a solution, but it demonstrates what I want to achieve: properly setting ReleaseDescriptor.scmRelativePathProjectDirectory and not having it overwritten later with wrong value



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)