Skip to content

Commit

Permalink
Fixed JENKINS-24284
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrius Ordojan committed Aug 15, 2014
1 parent 9bdbb3a commit 7d0bf3c
Showing 1 changed file with 39 additions and 36 deletions.
Expand Up @@ -12,29 +12,26 @@
import hudson.model.BuildListener; import hudson.model.BuildListener;
import hudson.plugins.git.Branch; import hudson.plugins.git.Branch;
import hudson.plugins.git.util.BuildData; import hudson.plugins.git.util.BuildData;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jenkinsci.plugins.gitclient.Git; import org.jenkinsci.plugins.gitclient.Git;
import org.jenkinsci.plugins.gitclient.GitClient; import org.jenkinsci.plugins.gitclient.GitClient;
import org.jenkinsci.plugins.pretestedintegration.AbstractSCMBridge; import org.jenkinsci.plugins.pretestedintegration.*;
import org.jenkinsci.plugins.pretestedintegration.Commit;
import org.jenkinsci.plugins.pretestedintegration.exceptions.IntegationFailedExeception; import org.jenkinsci.plugins.pretestedintegration.exceptions.IntegationFailedExeception;
import org.jenkinsci.plugins.pretestedintegration.IntegrationStrategy;
import org.jenkinsci.plugins.pretestedintegration.IntegrationStrategyDescriptor;
import org.jenkinsci.plugins.pretestedintegration.PretestedIntegrationAction;
import org.jenkinsci.plugins.pretestedintegration.exceptions.NothingToDoException; import org.jenkinsci.plugins.pretestedintegration.exceptions.NothingToDoException;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
/** /**
* *
* @author Mads * @author Mads
*/ */
public class SquashCommitStrategy extends IntegrationStrategy { public class SquashCommitStrategy extends IntegrationStrategy {

private static final String B_NAME = "Squashed commit"; private static final String B_NAME = "Squashed commit";
private static final Logger logger = Logger.getLogger(SquashCommitStrategy.class.getName()); private static final Logger logger = Logger.getLogger(SquashCommitStrategy.class.getName());

@DataBoundConstructor @DataBoundConstructor
public SquashCommitStrategy() { } public SquashCommitStrategy() { }


Expand All @@ -43,21 +40,21 @@ public void integrate(AbstractBuild<?,?> build, Launcher launcher, BuildListener
int exitCode = -999; int exitCode = -999;
int exitCodeCommit = -999; int exitCodeCommit = -999;
GitBridge gitbridge = (GitBridge)bridge; GitBridge gitbridge = (GitBridge)bridge;

ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();
BuildData gitBuildData = build.getAction(BuildData.class); BuildData gitBuildData = build.getAction(BuildData.class);
Branch gitDataBranch = gitBuildData.lastBuild.revision.getBranches().iterator().next(); Branch gitDataBranch = gitBuildData.lastBuild.revision.getBranches().iterator().next();

String integrationSHA = "Not specified"; String integrationSHA = "Not specified";
try { try {
integrationSHA = (String)build.getAction(PretestedIntegrationAction.class).getCurrentIntegrationTip().getId(); integrationSHA = (String)build.getAction(PretestedIntegrationAction.class).getCurrentIntegrationTip().getId();
} catch (Exception ex) { } catch (Exception ex) {}


} listener.getLogger().println( String.format( "Preparing to merge changes in commit %s to integration branch %s(%s)", gitDataBranch.getSHA1String(), bridge.getBranch(), integrationSHA) );
listener.getLogger().println( String.format( "Preparing to merge changes in commit %s to integration branch %s(%s)", gitDataBranch.getSHA1String(), bridge.getBranch(), integrationSHA) );
boolean found = false; boolean found = false;
try { try {
GitClient client = Git.with(listener, build.getEnvironment(listener)).in(build.getWorkspace()).getClient(); GitClient client = Git.with(listener, build.getEnvironment(listener)).in(build.getWorkspace()).getClient();

for(Branch b : client.getRemoteBranches()) { for(Branch b : client.getRemoteBranches()) {
if(b.getName().equals(gitDataBranch.getName())) { if(b.getName().equals(gitDataBranch.getName())) {
found = true; found = true;
Expand All @@ -68,38 +65,44 @@ public void integrate(AbstractBuild<?,?> build, Launcher launcher, BuildListener
logger.log(Level.SEVERE, "GitClient error", ex); logger.log(Level.SEVERE, "GitClient error", ex);
throw new IntegationFailedExeception("Unspecified GitClient error",ex); throw new IntegationFailedExeception("Unspecified GitClient error",ex);
} }

if(!found) { if(!found) {
try { try {
build.setDescription(String.format("Noting to do")); build.setDescription(String.format("Noting to do"));
} catch (IOException ex) { } catch (IOException ex) {
logger.log(Level.FINE, "Failed to update description", ex); logger.log(Level.FINE, "Failed to update description", ex);
} }
throw new NothingToDoException(); throw new NothingToDoException();
} }

try { try {

String[] split = gitDataBranch.getName().split("/");
String branchNameWithNoRemote = "";
for (int i = 1; i < split.length; i++) {
branchNameWithNoRemote += split[i] + "/";
}
branchNameWithNoRemote = branchNameWithNoRemote.substring(0, branchNameWithNoRemote.length() - 1);


exitCode = gitbridge.git(build, launcher, listener, out, "merge", "--squash", gitDataBranch.getName()); exitCode = gitbridge.git(build, launcher, listener, out, "merge", "--squash", gitDataBranch.getName());
exitCodeCommit = gitbridge.git(build, launcher, listener, out, "commit", "-m", String.format("Integrated %s", gitDataBranch.getName())); exitCodeCommit = gitbridge.git(build, launcher, listener, out, "commit", "-m", String.format("Integrated %s", branchNameWithNoRemote));

} catch (Exception ex) { /*Handled below */ } } catch (Exception ex) { /*Handled below */ }

if (exitCode != 0) { if (exitCode != 0) {
listener.getLogger().println("Failed to merge changes. Error message below"); listener.getLogger().println("Failed to merge changes. Error message below");
listener.getLogger().println(out.toString()); listener.getLogger().println(out.toString());
try { try {
build.setDescription(String.format("Merge conflict")); build.setDescription(String.format("Merge conflict"));
} catch (IOException ex) { } catch (IOException ex) {
logger.log(Level.FINE, "Failed to update description", ex); logger.log(Level.FINE, "Failed to update description", ex);
} }
throw new IntegationFailedExeception(); throw new IntegationFailedExeception();
} }

if (exitCodeCommit != 0 && exitCodeCommit != -999 ) { if (exitCodeCommit != 0 && exitCodeCommit != -999 ) {
listener.getLogger().println("Failed to commit merged changes. Error message below"); listener.getLogger().println("Failed to commit merged changes. Error message below");
listener.getLogger().println(out.toString()); listener.getLogger().println(out.toString());

try { try {
if(out.toString().contains("nothing to commit")) { if(out.toString().contains("nothing to commit")) {
build.setDescription(String.format("Nothing to do")); build.setDescription(String.format("Nothing to do"));
Expand All @@ -109,11 +112,11 @@ public void integrate(AbstractBuild<?,?> build, Launcher launcher, BuildListener
} catch (IOException ex ) { } catch (IOException ex ) {
logger.log(Level.FINE, "Failed to update description", ex); logger.log(Level.FINE, "Failed to update description", ex);
} }

if(out.toString().contains("nothing to commit")) { if(out.toString().contains("nothing to commit")) {
throw new NothingToDoException(); throw new NothingToDoException();
} }

throw new IntegationFailedExeception("Could commit merges. Git output: " + out.toString()); throw new IntegationFailedExeception("Could commit merges. Git output: " + out.toString());
} }
} }
Expand All @@ -124,15 +127,15 @@ public static final class DescriptorImpl extends IntegrationStrategyDescriptor<S
public DescriptorImpl() { public DescriptorImpl() {
load(); load();
} }

public String getDisplayName() { public String getDisplayName() {
return B_NAME; return B_NAME;
} }


@Override @Override
public boolean isApplicable(Class<? extends AbstractSCMBridge> bridge) { public boolean isApplicable(Class<? extends AbstractSCMBridge> bridge) {
return GitBridge.class.equals(bridge); return GitBridge.class.equals(bridge);
} }
} }

} }

0 comments on commit 7d0bf3c

Please sign in to comment.