com.atlassian.maven.plugins.jgitflow.helper.DefaultJGitFlowSetupHelper Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jgitflow-maven-plugin Show documentation
Show all versions of jgitflow-maven-plugin Show documentation
A maven plugin to support doing git-flow releases
The newest version!
package com.atlassian.maven.plugins.jgitflow.helper;
import java.io.IOException;
import com.atlassian.jgitflow.core.JGitFlow;
import com.atlassian.jgitflow.core.JGitFlowReporter;
import com.atlassian.jgitflow.core.exception.JGitFlowException;
import com.atlassian.maven.plugins.jgitflow.PrettyPrompter;
import com.atlassian.maven.plugins.jgitflow.ReleaseContext;
import com.atlassian.maven.plugins.jgitflow.exception.MavenJGitFlowException;
import com.atlassian.maven.plugins.jgitflow.provider.ContextProvider;
import com.atlassian.maven.plugins.jgitflow.provider.JGitFlowProvider;
import com.atlassian.maven.plugins.jgitflow.util.ConsoleCredentialsProvider;
import com.atlassian.maven.plugins.jgitflow.util.SshCredentialsProvider;
import com.google.common.base.Strings;
import org.apache.maven.execution.RuntimeInformation;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.CoreConfig;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.transport.CredentialsProvider;
import org.eclipse.jgit.transport.SshSessionFactory;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
@Component(role = JGitFlowSetupHelper.class)
public class DefaultJGitFlowSetupHelper extends AbstractLogEnabled implements JGitFlowSetupHelper
{
private static String OS = System.getProperty("os.name").toLowerCase();
private static boolean isWindows = (OS.indexOf("win") >= 0);
private static boolean isCygwin = (isWindows && !Strings.isNullOrEmpty(System.getenv("TERM")));
private boolean sshAgentConfigured = false;
private boolean sshConsoleInstalled = false;
private boolean headerWritten = false;
@Requirement
private RuntimeInformation runtimeInformation;
@Requirement
private PrettyPrompter prompter;
@Requirement
private ContextProvider contextProvider;
@Requirement
private JGitFlowProvider jGitFlowProvider;
@Override
public void runCommonSetup() throws MavenJGitFlowException
{
try
{
fixCygwinIfNeeded();
writeReportHeader();
warnCoreAutoCrlf();
}
catch (Exception e)
{
throw new MavenJGitFlowException("Error running common setup tasks", e);
}
}
public void warnCoreAutoCrlf() throws MavenJGitFlowException
{
try
{
JGitFlow flow = jGitFlowProvider.gitFlow();
StoredConfig config = flow.git().getRepository().getConfig();
CoreConfig.AutoCRLF autoCRLF = config.getEnum(ConfigConstants.CONFIG_CORE_SECTION, null, ConfigConstants.CONFIG_KEY_AUTOCRLF, CoreConfig.AutoCRLF.FALSE);
if (autoCRLF.TRUE.equals(autoCRLF))
{
getLogger().warn("..oo00 ---- WARNING ---- 00oo..");
getLogger().warn("core.autocrlf is set to true but is NOT supported by JGit or JGitFlow!");
getLogger().warn("00oo.. you have been warned 00oo..");
}
}
catch (Exception e)
{
throw new MavenJGitFlowException("Error checking for core.autocrlf", e);
}
}
@Override
public void fixCygwinIfNeeded() throws MavenJGitFlowException
{
if (isCygwin)
{
getLogger().info("detected cygwin:");
try
{
getLogger().info(" - turning off filemode...");
StoredConfig config = jGitFlowProvider.gitFlow().git().getRepository().getConfig();
config.setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null, ConfigConstants.CONFIG_KEY_FILEMODE, false);
config.save();
config.load();
}
catch (IOException e)
{
throw new MavenJGitFlowException("error configuring filemode for cygwin", e);
}
catch (ConfigInvalidException e)
{
throw new MavenJGitFlowException("error configuring filemode for cygwin", e);
}
catch (JGitFlowException e)
{
throw new MavenJGitFlowException("error configuring filemode for cygwin", e);
}
getLogger().info(" - fixing maven prompter...");
prompter.setCygwinTerminal();
}
}
@Override
public void setupCredentialProviders() throws JGitFlowException
{
ReleaseContext ctx = contextProvider.getContext();
if (!ctx.isRemoteAllowed())
{
return;
}
if (!sshConsoleInstalled)
{
sshConsoleInstalled = setupUserPasswordCredentialsProvider();
}
if (!sshAgentConfigured)
{
sshAgentConfigured = setupSshCredentialsProvider();
}
}
protected void writeReportHeader() throws JGitFlowException
{
ReleaseContext ctx = contextProvider.getContext();
if (!headerWritten)
{
String mvnVersion = runtimeInformation.getApplicationVersion().toString();
Package mvnFlowPkg = getClass().getPackage();
String mvnFlowVersion = mvnFlowPkg.getImplementationVersion();
String shortName = getClass().getSimpleName();
JGitFlowReporter.get().debugText(shortName, "# Maven JGitFlow Plugin")
.debugText(shortName, JGitFlowReporter.P)
.debugText(shortName, " ## Configuration")
.debugText(shortName, JGitFlowReporter.EOL)
.debugText(shortName, " Maven Version: " + mvnVersion)
.debugText(shortName, JGitFlowReporter.EOL)
.debugText(shortName, " Maven JGitFlow Plugin Version: " + mvnFlowVersion)
.debugText(shortName, JGitFlowReporter.EOL)
.debugText(shortName, " args: " + ctx.getArgs())
.debugText(shortName, " base dir: " + ctx.getBaseDir().getAbsolutePath())
.debugText(shortName, " default development version: " + ctx.getDefaultDevelopmentVersion())
.debugText(shortName, " default feature name: " + ctx.getDefaultFeatureName())
.debugText(shortName, " default release version: " + ctx.getDefaultReleaseVersion())
.debugText(shortName, " release branch version suffix: " + ctx.getReleaseBranchVersionSuffix())
.debugText(shortName, " tag message: " + ctx.getTagMessage())
.debugText(shortName, " allow snapshots: " + ctx.isAllowSnapshots())
.debugText(shortName, " auto version submodules: " + ctx.isAutoVersionSubmodules())
.debugText(shortName, " enable feature versions: " + ctx.isEnableFeatureVersions())
.debugText(shortName, " enable ssh agent: " + ctx.isEnableSshAgent())
.debugText(shortName, " feature rebase: " + ctx.isFeatureRebase())
.debugText(shortName, " interactive: " + ctx.isInteractive())
.debugText(shortName, " keep branch: " + ctx.isKeepBranch())
.debugText(shortName, " no build: " + ctx.isNoBuild())
.debugText(shortName, " no deploy: " + ctx.isNoDeploy())
.debugText(shortName, " no tag: " + ctx.isNoTag())
.debugText(shortName, " pushFeatures: " + ctx.isPushFeatures())
.debugText(shortName, " pushReleases: " + ctx.isPushReleases())
.debugText(shortName, " pushHotfixes: " + ctx.isPushHotfixes())
.debugText(shortName, " squash: " + ctx.isSquash())
.debugText(shortName, " update dependencies: " + ctx.isUpdateDependencies())
.debugText(shortName, " use release profile: " + ctx.isUseReleaseProfile())
.debugText(shortName, JGitFlowReporter.HR);
JGitFlowReporter.get().flush();
this.headerWritten = true;
}
}
private boolean setupUserPasswordCredentialsProvider() throws JGitFlowException
{
ReleaseContext ctx = contextProvider.getContext();
if (!Strings.isNullOrEmpty(ctx.getPassword()) && !Strings.isNullOrEmpty(ctx.getUsername()))
{
JGitFlowReporter.get().debugText(getClass().getSimpleName(), "using provided username and password");
CredentialsProvider.setDefault(new UsernamePasswordCredentialsProvider(ctx.getUsername(), ctx.getPassword()));
}
else if (null != System.console())
{
JGitFlowReporter.get().debugText(getClass().getSimpleName(), "installing ssh console credentials provider");
CredentialsProvider.setDefault(new ConsoleCredentialsProvider(prompter));
return true;
}
return false;
}
private boolean setupSshCredentialsProvider() throws JGitFlowException
{
ReleaseContext ctx = contextProvider.getContext();
if (ctx.isEnableSshAgent())
{
JGitFlowReporter.get().debugText(getClass().getSimpleName(), "installing ssh-agent credentials provider");
SshSessionFactory.setInstance(new SshCredentialsProvider(prompter, getLogger()));
return true;
}
return false;
}
}