}
catch (IOException e)
{
reporter.errorText(SHORT_NAME, e.getMessage());
reporter.endCommand();
throw new JGitFlowIOException(e);
}
catch (GitAPIException e)
{
reporter.errorText(SHORT_NAME, e.getMessage());
reporter.endCommand();
throw new JGitFlowGitAPIException(e);
}
Repository repo = git.getRepository();
GitFlowConfiguration gfConfig = new GitFlowConfiguration(git);
RevWalk walk = null;
try
{
String currentBranch = repo.getBranch();
StoredConfig gitConfig = git.getRepository().getConfig();
String originUrl = gitConfig.getString(ConfigConstants.CONFIG_REMOTE_SECTION, Constants.DEFAULT_REMOTE_NAME, "url");
String finalOriginUrl = setupOriginIfNeeded(git,gitConfig,originUrl);
if(allowRemote && ! Strings.isNullOrEmpty(finalOriginUrl))
{
git.fetch().setRemote(Constants.DEFAULT_REMOTE_NAME).call();
}
if (!force && gfConfig.gitFlowIsInitialized())
{
reporter.errorText(SHORT_NAME, "git flow is already initialized and force flag is false");
reporter.endCommand();
throw new AlreadyInitializedException("Already initialized for git flow.");
}
//First setup master
if (gfConfig.hasMasterConfigured() && !force)
{
context.setMaster(gfConfig.getMaster());
}
//TODO: we should set an allowFetch flag and do a complete fetch before the local/remote checks if needed.
//if no local master exists, but a remote does, check it out
if (!GitHelper.localBranchExists(git, context.getMaster()) && GitHelper.remoteBranchExists(git, context.getMaster(), reporter))
{
reporter.debugText(SHORT_NAME, "creating new local '" + context.getMaster() + "' branch from origin '" + context.getMaster() + "'");
git.branchCreate()
.setName(context.getMaster())
.setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.SET_UPSTREAM)
.setStartPoint("origin/" + context.getMaster())
.call();
}
gfConfig.setMaster(context.getMaster());
if(allowRemote && pullMaster && GitHelper.remoteBranchExists(git, context.getMaster(), reporter))
{
reporter.debugText("JgitFlowInitCommand", "pulling '" + context.getMaster());
reporter.flush();
git.checkout().setName(context.getMaster()).call();
git.pull().call();
}
//now setup develop
if (gfConfig.hasDevelopConfigured() && !force)
{
context.setDevelop(gfConfig.getDevelop());
}
if (context.getDevelop().equals(context.getMaster()))
{
reporter.errorText(SHORT_NAME, "master and develop branches configured with the same name: [" + context.getMaster() + "]");
reporter.endCommand();
throw new SameBranchException("master and develop branches cannot be the same: [" + context.getMaster() + "]");
}
reporter.infoText(SHORT_NAME, "setting develop in config to '" + context.getDevelop() + "'");
gfConfig.setDevelop(context.getDevelop());
setupRemotesInConfig(gitConfig,finalOriginUrl);
//Creation of HEAD
walk = new RevWalk(repo);
ObjectId masterBranch = repo.resolve(Constants.R_HEADS + context.getMaster());
RevCommit masterCommit = null;
if (null != masterBranch)
{
try
{
masterCommit = walk.parseCommit(masterBranch);
}
catch (MissingObjectException e)
{
//ignore
}
catch (IncorrectObjectTypeException e)
{
//ignore
}
}
if (null == masterCommit)
{
reporter.debugText(SHORT_NAME, "no commits found on '" + context.getMaster() + "'. creating initial commit.");
RefUpdate refUpdate = repo.getRefDatabase().newUpdate(Constants.HEAD, false);
refUpdate.setForceUpdate(true);
refUpdate.link(Constants.R_HEADS + context.getMaster());
git.commit().setMessage("Initial Commit").call();
}
//creation of develop
if (!GitHelper.localBranchExists(git, context.getDevelop()))
{
if (GitHelper.remoteBranchExists(git, context.getDevelop(), reporter))
{
reporter.debugText(SHORT_NAME, "creating new local '" + context.getDevelop() + "' branch from origin '" + context.getDevelop() + "'");
git.branchCreate()
.setName(context.getDevelop())
.setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.SET_UPSTREAM)
.setStartPoint("origin/" + context.getDevelop())
.call();
}
else
{
reporter.debugText(SHORT_NAME, "creating new local '" + context.getDevelop() + "' branch without origin");
git.branchCreate()
.setName(context.getDevelop())
.setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.NOTRACK)
.call();
}
}
if(allowRemote && pullDevelop && GitHelper.remoteBranchExists(git, context.getDevelop(), reporter))
{
reporter.debugText("JgitFlowInitCommand", "pulling '" + context.getDevelop());
reporter.flush();
git.checkout().setName(context.getDevelop()).call();
git.pull().call();
}
//setup prefixes
for (String prefixName : gfConfig.getPrefixNames())
{
if (gfConfig.hasPrefixConfigured(prefixName) && !force)
{
context.setPrefix(prefixName, gfConfig.getPrefixValue(prefixName));
}
gfConfig.setPrefix(prefixName, context.getPrefix(prefixName));
}
if (!Strings.isNullOrEmpty(currentBranch) && !currentBranch.equals(repo.getBranch()) && (GitHelper.localBranchExists(git, currentBranch) || GitHelper.remoteBranchExists(git, currentBranch, reporter)))
{
git.checkout().setName(currentBranch).call();
}
}
catch (IOException e)
{
reporter.errorText(SHORT_NAME, e.getMessage());
reporter.flush();
throw new JGitFlowIOException(e);
}
catch (GitAPIException e)
{
reporter.errorText(SHORT_NAME, e.getMessage());
reporter.flush();