//get the hotfix branch
List<Ref> hotfixBranches = GitHelper.listBranchesWithPrefix(flow.git(), flow.getHotfixBranchPrefix());
if (hotfixBranches.isEmpty())
{
throw new JGitFlowReleaseException("Could not find hotfix branch!");
}
//there can be only one
String rheadPrefix = Constants.R_HEADS + flow.getHotfixBranchPrefix();
Ref hotfixBranch = hotfixBranches.get(0);
hotfixLabel = hotfixBranch.getName().substring(hotfixBranch.getName().indexOf(rheadPrefix) + rheadPrefix.length());
String prefixedBranchName = flow.getHotfixBranchPrefix() + hotfixLabel;
//make sure we're on the hotfix branch
flow.git().checkout().setName(prefixedBranchName).call();
//make sure we're not behind remote
if(GitHelper.remoteBranchExists(flow.git(), prefixedBranchName, reporter))
{
if(GitHelper.localBranchBehindRemote(flow.git(),prefixedBranchName,reporter))
{
reporter.errorText("hotfix-finish","local branch '" + prefixedBranchName + "' is behind the remote branch");
reporter.flush();
throw new BranchOutOfDateException("local branch '" + prefixedBranchName + "' is behind the remote branch");
}
}
if(GitHelper.remoteBranchExists(flow.git(), flow.getDevelopBranchName(), flow.getReporter()))
{
if(GitHelper.localBranchBehindRemote(flow.git(),flow.getDevelopBranchName(),flow.getReporter()))
{
reporter.errorText("hotfix-finish","local branch '" + flow.getDevelopBranchName() + "' is behind the remote branch");
reporter.flush();
throw new BranchOutOfDateException("local branch '" + flow.getDevelopBranchName() + "' is behind the remote branch");
}
}
if(GitHelper.remoteBranchExists(flow.git(), flow.getMasterBranchName(), flow.getReporter()))
{
if(GitHelper.localBranchBehindRemote(flow.git(),flow.getMasterBranchName(),flow.getReporter()))
{
reporter.errorText("hotfix-finish","local branch '" + flow.getMasterBranchName() + "' is behind the remote branch");
reporter.flush();
throw new BranchOutOfDateException("local branch '" + flow.getMasterBranchName() + "' is behind the remote branch");
}
}
//get the reactor projects for hotfix
MavenSession hotfixSession = getSessionForBranch(flow, prefixedBranchName, originalProjects, session);
List<MavenProject> hotfixProjects = hotfixSession.getSortedProjects();
updateHotfixPomsWithRelease(hotfixLabel,flow,ctx,config,originalProjects,session);
projectHelper.commitAllPoms(flow.git(), originalProjects, ctx.getScmCommentPrefix() + "updating poms for " + hotfixLabel + " hotfix");
//reload the reactor projects for hotfix
hotfixSession = getSessionForBranch(flow, prefixedBranchName, originalProjects, session);
hotfixProjects = hotfixSession.getSortedProjects();
checkPomForRelease(hotfixProjects);
if (!ctx.isAllowSnapshots())
{
List<String> snapshots = projectHelper.checkForNonReactorSnapshots("hotfix", hotfixProjects);
if (!snapshots.isEmpty())
{
String details = Joiner.on(ls).join(snapshots);
throw new UnresolvedSnapshotsException("Cannot finish a hotfix due to snapshot dependencies:" + ls + details);
}
}
MavenProject rootProject = ReleaseUtil.getRootProject(hotfixProjects);
if (!ctx.isNoBuild())
{
try
{
mavenExecutionHelper.execute(rootProject, ctx, hotfixSession);
}
catch (MavenExecutorException e)
{
throw new JGitFlowReleaseException("Error building: " + e.getMessage(), e);
}
}
Map<String, String> originalVersions = projectHelper.getOriginalVersions("hotfix", hotfixProjects);
//We need to commit the hotfix versioned poms to develop to avoid a merge conflict
//reload the reactor projects for develop
MavenSession developSession = getSessionForBranch(flow, flow.getDevelopBranchName(), originalProjects, session);
List<MavenProject> developProjects = developSession.getSortedProjects();
savePreHotfixDevelopVersions(flow, developProjects, config);
flow.git().checkout().setName(flow.getDevelopBranchName()).call();
updatePomsWithVersionCopy(ctx, developProjects, hotfixProjects);
flow.git().add().addFilepattern(".").call();
flow.git().commit().setMessage(ctx.getScmCommentPrefix() + "updating develop with hotfix versions to avoid merge conflicts").call();
flow.git().checkout().setName(prefixedBranchName);
if (ctx.isPushHotfixes() || !ctx.isNoTag())
{
projectHelper.ensureOrigin(ctx.getDefaultOriginUrl(), flow);
}
getLogger().info("running jgitflow hotfix finish...");
ReleaseMergeResult mergeResult = flow.hotfixFinish(hotfixLabel)
.setPush(ctx.isPushHotfixes())
.setKeepBranch(ctx.isKeepBranch())
.setNoTag(ctx.isNoTag())
.setMessage(ReleaseUtil.interpolate(ctx.getTagMessage(), rootProject.getModel()))
.setAllowUntracked(ctx.isAllowUntracked())
.setScmMessagePrefix(ctx.getScmCommentPrefix())
.call();
if(!mergeResult.wasSuccessful())
{
if(mergeResult.masterHasProblems())
{
getLogger().error("Error merging into " + flow.getMasterBranchName() + ":");
getLogger().error(mergeResult.getMasterResult().toString());
getLogger().error("see .git/jgitflow.log for more info");
}
if(mergeResult.developHasProblems())
{
getLogger().error("Error merging into " + flow.getDevelopBranchName() + ":");
getLogger().error(mergeResult.getDevelopResult().toString());
getLogger().error("see .git/jgitflow.log for more info");
}
throw new JGitFlowReleaseException("Error while merging hotfix!");
}
//make sure we're on develop
flow.git().checkout().setName(flow.getDevelopBranchName()).call();
//reload the reactor projects for develop
developSession = getSessionForBranch(flow, flow.getDevelopBranchName(), originalProjects, session);
developProjects = developSession.getSortedProjects();
updatePomsWithPreviousVersions("hotfix", ctx, developProjects, config);
projectHelper.commitAllPoms(flow.git(), developProjects, ctx.getScmCommentPrefix() + "updating poms for development");
config.setLastReleaseVersions(originalVersions);
configManager.saveConfiguration(config, flow.git());
}
catch (JGitFlowException e)
{
throw new JGitFlowReleaseException("Error releasing: " + e.getMessage(), e);
}
catch (GitAPIException e)
{
throw new JGitFlowReleaseException("Error releasing: " + e.getMessage(), e);
}
catch (ReleaseExecutionException e)
{
throw new JGitFlowReleaseException("Error releasing: " + e.getMessage(), e);
}
catch (IOException e)
{
throw new JGitFlowReleaseException("Error releasing: " + e.getMessage(), e);
}
catch (ReactorReloadException e)
{
throw new JGitFlowReleaseException("Error releasing: " + e.getMessage(), e);
}
}