Skip to content

Commit

Permalink
Prune during AbstractGitSCMSource fetch
Browse files Browse the repository at this point in the history
Need for separate prune is removed by switching from deprecated fetch()
method to fetch_() method.

[Fix JENKINS-37727] CliGit leaves deleted branches in multi-branch jobs
  • Loading branch information
MarkEWaite committed Aug 27, 2016
1 parent 006d28e commit 0197c85
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 10 deletions.
18 changes: 8 additions & 10 deletions src/main/java/jenkins/plugins/git/AbstractGitSCMSource.java
Expand Up @@ -69,7 +69,6 @@
import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.transport.RefSpec;
import org.eclipse.jgit.transport.RemoteConfig;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.jenkinsci.plugins.gitclient.Git;
import org.jenkinsci.plugins.gitclient.GitClient;
Expand All @@ -90,6 +89,7 @@
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import org.eclipse.jgit.transport.URIish;

/**
* @author Stephen Connolly
Expand Down Expand Up @@ -277,18 +277,16 @@ protected void retrieve(@NonNull final SCMHeadObserver observer,
String remoteName = getRemoteName();
listener.getLogger().println("Setting " + remoteName + " to " + getRemote());
client.setRemoteUrl(remoteName, getRemote());
listener.getLogger().println("Fetching " + remoteName + "...");
listener.getLogger().println("Fetching & pruning " + remoteName + "...");
List<RefSpec> refSpecs = getRefSpecs();
client.fetch(remoteName, refSpecs.toArray(new RefSpec[refSpecs.size()]));
listener.getLogger().println("Pruning stale remotes...");
final Repository repository = client.getRepository();
URIish remoteURI = null;
try {
client.prune(new RemoteConfig(repository.getConfig(), remoteName));
} catch (UnsupportedOperationException e) {
e.printStackTrace(listener.error("Could not prune stale remotes"));
} catch (URISyntaxException e) {
e.printStackTrace(listener.error("Could not prune stale remotes"));
remoteURI = new URIish(remoteName);
} catch (URISyntaxException ex) {
listener.getLogger().println("URI syntax exception for '" + remoteName + "' " + ex);
}
client.fetch_().prune().from(remoteURI, getRefSpecs()).execute();
final Repository repository = client.getRepository();
listener.getLogger().println("Getting remote branches...");
SCMSourceCriteria branchCriteria = getCriteria();
RevWalk walk = new RevWalk(repository);
Expand Down
40 changes: 40 additions & 0 deletions src/test/java/jenkins/plugins/git/AbstractGitSCMSourceTest.java
Expand Up @@ -2,6 +2,7 @@

import hudson.model.TaskListener;
import hudson.util.StreamTaskListener;
import java.util.UUID;
import jenkins.scm.api.SCMSource;
import org.junit.Rule;
import org.junit.Test;
Expand Down Expand Up @@ -77,4 +78,43 @@ public void retrieveHeads() throws Exception {
assertEquals("[SCMHead{'dev'}, SCMHead{'dev2'}, SCMHead{'master'}]", source.fetch(listener).toString());
}

@Issue("JENKINS-37727")
@Test
public void pruneRemovesDeletedBranches() throws Exception {
sampleRepo.init();

/* Write a file to the master branch */
sampleRepo.write("master-file", "master-content-" + UUID.randomUUID().toString());
sampleRepo.git("add", "master-file");
sampleRepo.git("commit", "--message=master-branch-commit-message");

/* Write a file to the dev branch */
sampleRepo.git("checkout", "-b", "dev");
sampleRepo.write("dev-file", "dev-content-" + UUID.randomUUID().toString());
sampleRepo.git("add", "dev-file");
sampleRepo.git("commit", "--message=dev-branch-commit-message");

/* Fetch from sampleRepo */
GitSCMSource source = new GitSCMSource(null, sampleRepo.toString(), "", "*", "", true);
TaskListener listener = StreamTaskListener.fromStderr();
// SCMHeadObserver.Collector.result is a TreeMap so order is predictable:
assertEquals("[SCMHead{'dev'}, SCMHead{'master'}]", source.fetch(listener).toString());
// And reuse cache:
assertEquals("[SCMHead{'dev'}, SCMHead{'master'}]", source.fetch(listener).toString());

/* Create dev2 branch and write a file to it */
sampleRepo.git("checkout", "-b", "dev2", "master");
sampleRepo.write("dev2-file", "dev2-content-" + UUID.randomUUID().toString());
sampleRepo.git("add", "dev2-file");
sampleRepo.git("commit", "--message=dev2-branch-commit-message");

// Verify new branch is visible
assertEquals("[SCMHead{'dev'}, SCMHead{'dev2'}, SCMHead{'master'}]", source.fetch(listener).toString());

/* Delete the dev branch */
sampleRepo.git("branch", "-D", "dev");

/* Fetch and confirm dev branch was pruned */
assertEquals("[SCMHead{'dev2'}, SCMHead{'master'}]", source.fetch(listener).toString());
}
}

0 comments on commit 0197c85

Please sign in to comment.