[
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)