-
Bug
-
Resolution: Fixed
-
High
-
3.11.6, 5.3.1, 4.14.9
-
Severity 2 - Major
-
When a repository has a submodule in a nested directory, as opposed to directly in the project root, pull request diffs cannot be displayed correctly.
- For Bitbucket Server 4.10 or newer, the UI will display a message indicating the merge diff could not be created
- For older versions, the UI will indicate the pull request has conflicts but none will be shown
In the logs, this manifests with an error similar to the following:
2017-08-30 12:12:12,121 INFO [http-nio-7990-exec-1] user @3J8EQFx370x444444x4 2zzzzz2 1.1.1.1 "GET /rest/api/latest/projects/KEY/repos/slug/pull-requests/1/merge HTTP/1.1" c.a.s.i.s.g.p.DefaultPullRequestAutoMergeStrategy KEY/slug[1]: Pull request 1@1 failed automatic merging com.atlassian.bitbucket.scm.MergeException: The merge could not be completed automatically. Please clone 'KEY/slug', checkout 'master' and merge 'submodule-branch' (or commit '3b0b26edc4b62877663ab1fe5d04069d00319771') manually, resolving any conflicts, and push the result. at com.atlassian.stash.internal.scm.git.merge.MergeCommand.newMergeException(MergeCommand.java:172) at com.atlassian.stash.internal.scm.git.merge.MergeCommand.doWithWorkTree(MergeCommand.java:166) at com.atlassian.stash.internal.scm.git.merge.MergeCommand.call(MergeCommand.java:68) at com.atlassian.stash.internal.scm.git.pull.DefaultPullRequestAutoMergeStrategy.doMerge(DefaultPullRequestAutoMergeStrategy.java:104) at com.atlassian.stash.internal.scm.git.pull.DefaultPullRequestAutoMergeStrategy.merge(DefaultPullRequestAutoMergeStrategy.java:72) at com.atlassian.stash.internal.scm.git.pull.CompositePullRequestAutoMergeStrategy.merge(CompositePullRequestAutoMergeStrategy.java:22) at com.atlassian.stash.internal.scm.git.pull.CachingPullRequestAutoMergeStrategy.merge(CachingPullRequestAutoMergeStrategy.java:49) at com.atlassian.stash.internal.scm.git.pull.CompositePullRequestAutoMergeStrategy.merge(CompositePullRequestAutoMergeStrategy.java:22) at com.atlassian.stash.internal.scm.git.pull.DefaultPullRequestRefHelper.resolveNewEffectiveDiff(DefaultPullRequestRefHelper.java:425) at com.atlassian.stash.internal.scm.git.pull.DefaultPullRequestRefHelper.access$500(DefaultPullRequestRefHelper.java:53) at com.atlassian.stash.internal.scm.git.pull.DefaultPullRequestRefHelper$EffectiveDiffOperation.perform(DefaultPullRequestRefHelper.java:545) at com.atlassian.stash.internal.scm.git.pull.DefaultPullRequestRefHelper$EffectiveDiffOperation.perform(DefaultPullRequestRefHelper.java:510) at com.atlassian.stash.internal.scm.git.pull.DefaultPullRequestRefHelper$AbstractOperation.perform(DefaultPullRequestRefHelper.java:476) at com.atlassian.stash.internal.concurrent.ClusterMappedLock.withLock(ClusterMappedLock.java:49) at com.atlassian.stash.internal.concurrent.ClusterPullRequestLock.withLock(ClusterPullRequestLock.java:25) at com.atlassian.stash.internal.scm.git.pull.DefaultPullRequestRefHelper.withLock(DefaultPullRequestRefHelper.java:458) at com.atlassian.stash.internal.scm.git.pull.DefaultPullRequestRefHelper.access$300(DefaultPullRequestRefHelper.java:53) at com.atlassian.stash.internal.scm.git.pull.DefaultPullRequestRefHelper$EffectiveDiffOperation.call(DefaultPullRequestRefHelper.java:522) at com.atlassian.stash.internal.scm.git.pull.DefaultPullRequestRefHelper$EffectiveDiffOperation.call(DefaultPullRequestRefHelper.java:510) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at com.atlassian.util.concurrent.ConcurrentOperationMapImpl$CallerRunsFuture.get(ConcurrentOperationMapImpl.java:63) at com.atlassian.util.concurrent.ConcurrentOperationMapImpl.runOperation(ConcurrentOperationMapImpl.java:51) at com.atlassian.stash.internal.scm.git.pull.DefaultPullRequestRefHelper.resolveEffectiveDiff(DefaultPullRequestRefHelper.java:132) at com.atlassian.stash.internal.scm.git.DefaultGitPullRequestCommandFactory$2.call(DefaultGitPullRequestCommandFactory.java:181) at com.atlassian.stash.internal.scm.git.DefaultGitPullRequestCommandFactory$2.call(DefaultGitPullRequestCommandFactory.java:177) at com.atlassian.stash.internal.pull.DefaultMergeRequestCheckService.tryMerge(DefaultMergeRequestCheckService.java:70) at com.atlassian.stash.internal.pull.DefaultMergeRequestCheckService.checkMergeability(DefaultMergeRequestCheckService.java:47) at com.atlassian.stash.internal.pull.DefaultPullRequestService.canMerge(DefaultPullRequestService.java:246) at com.atlassian.plugin.util.ContextClassLoaderSettingInvocationHandler.invoke(ContextClassLoaderSettingInvocationHandler.java:26) at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:56) at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:60) at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:70) at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:53) at org.eclipse.gemini.blueprint.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:57) at com.atlassian.stash.internal.rest.pull.PullRequestResource.canMerge(PullRequestResource.java:480) at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) at com.atlassian.analytics.client.filter.UniversalAnalyticsFilter.doFilter(UniversalAnalyticsFilter.java:92) at com.atlassian.analytics.client.filter.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:39) at com.atlassian.stash.internal.spring.lifecycle.LifecycleJohnsonServletFilterModuleContainerFilter.doFilter(LifecycleJohnsonServletFilterModuleContainerFilter.java:42) at com.atlassian.plugin.connect.plugin.auth.scope.ApiScopingFilter.doFilter(ApiScopingFilter.java:81) at com.atlassian.stash.internal.spring.lifecycle.LifecycleJohnsonServletFilterModuleContainerFilter.doFilter(LifecycleJohnsonServletFilterModuleContainerFilter.java:42) at com.atlassian.stash.internal.spring.security.StashAuthenticationFilter.doFilter(StashAuthenticationFilter.java:88) at com.atlassian.stash.internal.web.auth.BeforeLoginPluginAuthenticationFilter.doInsideSpringSecurityChain(BeforeLoginPluginAuthenticationFilter.java:112) at com.atlassian.stash.internal.web.auth.BeforeLoginPluginAuthenticationFilter.doFilter(BeforeLoginPluginAuthenticationFilter.java:75) at com.atlassian.security.auth.trustedapps.filter.TrustedApplicationsFilter.doFilter(TrustedApplicationsFilter.java:94) at com.atlassian.oauth.serviceprovider.internal.servlet.OAuthFilter.doFilter(OAuthFilter.java:67) at com.atlassian.stash.internal.spring.lifecycle.LifecycleJohnsonServletFilterModuleContainerFilter.doFilter(LifecycleJohnsonServletFilterModuleContainerFilter.java:42) at com.atlassian.plugin.connect.plugin.auth.user.ThreeLeggedAuthFilter.doFilter(ThreeLeggedAuthFilter.java:109) at com.atlassian.jwt.internal.servlet.JwtAuthFilter.doFilter(JwtAuthFilter.java:32) at com.atlassian.analytics.client.filter.DefaultAnalyticsFilter.doFilter(DefaultAnalyticsFilter.java:38) at com.atlassian.analytics.client.filter.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:39) at com.atlassian.stash.internal.spring.lifecycle.LifecycleJohnsonServletFilterModuleContainerFilter.doFilter(LifecycleJohnsonServletFilterModuleContainerFilter.java:42) at com.atlassian.stash.internal.web.auth.BeforeLoginPluginAuthenticationFilter.doBeforeBeforeLoginFilters(BeforeLoginPluginAuthenticationFilter.java:90) at com.atlassian.stash.internal.web.auth.BeforeLoginPluginAuthenticationFilter.doFilter(BeforeLoginPluginAuthenticationFilter.java:73) at com.atlassian.stash.internal.request.DefaultRequestManager.doAsRequest(DefaultRequestManager.java:89) at com.atlassian.stash.internal.hazelcast.ConfigurableWebFilter.doFilter(ConfigurableWebFilter.java:38) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.lang.Thread.run(Thread.java:745) ... 307 frames trimmed Caused by: java.lang.IllegalStateException: Could not create conflict file for submodule in path: path/to/submodule at com.atlassian.stash.internal.scm.git.pull.MergeConflictHandler.visit(MergeConflictHandler.java:219) at com.atlassian.bitbucket.scm.git.command.merge.conflict.SubmoduleGitMergeConflict.accept(SubmoduleGitMergeConflict.java:19) at com.atlassian.stash.internal.scm.git.pull.PullRequestAutoMergeCommand.handleConflicts(PullRequestAutoMergeCommand.java:190) at com.atlassian.stash.internal.scm.git.pull.PullRequestAutoMergeCommand.commitConflicts(PullRequestAutoMergeCommand.java:128) at com.atlassian.stash.internal.scm.git.pull.PullRequestAutoMergeCommand.doMerge(PullRequestAutoMergeCommand.java:106) at com.atlassian.stash.internal.scm.git.merge.MergeCommand.doWithWorkTree(MergeCommand.java:126) ... 61 common frames omitted