}
+ @Test
+ public void testCloneWithPullMerge() throws Exception {
+ File directory = createTempDirectory("testCloneRepository1");
+ try (Git g = Git.init().setDirectory(directory).setBare(false).call()) {
+ g.remoteAdd().setName(Constants.DEFAULT_REMOTE_NAME)
+ .setUri(new URIish(fileUri())).call();
+ PullResult result = g.pull().setRebase(false).call();
+ assertTrue(result.isSuccessful());
+ assertEquals("refs/heads/master",
+ g.getRepository().getFullBranch());
+ checkFile(new File(directory, "Test.txt"), "Hello world");
+ }
+ }
+
+ @Test
+ public void testCloneWithPullRebase() throws Exception {
+ File directory = createTempDirectory("testCloneRepository1");
+ try (Git g = Git.init().setDirectory(directory).setBare(false).call()) {
+ g.remoteAdd().setName(Constants.DEFAULT_REMOTE_NAME)
+ .setUri(new URIish(fileUri())).call();
+ PullResult result = g.pull().setRebase(true).call();
+ assertTrue(result.isSuccessful());
+ assertEquals("refs/heads/master",
+ g.getRepository().getFullBranch());
+ checkFile(new File(directory, "Test.txt"), "Hello world");
+ }
+ }
+
private String fileUri() {
return "file://" + git.getRepository().getWorkTree().getAbsolutePath();
}
import org.eclipse.jgit.api.errors.RefNotAdvertisedException;
import org.eclipse.jgit.api.errors.RefNotFoundException;
import org.eclipse.jgit.api.errors.WrongRepositoryStateException;
+import org.eclipse.jgit.dircache.DirCacheCheckout;
import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.BranchConfig.BranchRebaseMode;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ProgressMonitor;
import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.RefUpdate.Result;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryState;
import org.eclipse.jgit.lib.SubmoduleConfig.FetchRecurseSubmodulesMode;
import org.eclipse.jgit.merge.MergeStrategy;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.transport.FetchResult;
import org.eclipse.jgit.transport.TagOpt;
PullResult result;
if (pullRebaseMode != BranchRebaseMode.NONE) {
+ try {
+ Ref head = repo.exactRef(Constants.HEAD);
+ if (head == null) {
+ throw new NoHeadException(JGitText
+ .get().commitOnRepoWithoutHEADCurrentlyNotSupported);
+ }
+ ObjectId headId = head.getObjectId();
+ if (headId == null) {
+ // Pull on an unborn branch: checkout
+ try (RevWalk revWalk = new RevWalk(repo)) {
+ RevCommit srcCommit = revWalk
+ .parseCommit(commitToMerge);
+ DirCacheCheckout dco = new DirCacheCheckout(repo,
+ repo.lockDirCache(), srcCommit.getTree());
+ dco.setFailOnConflict(true);
+ dco.setProgressMonitor(monitor);
+ dco.checkout();
+ RefUpdate refUpdate = repo
+ .updateRef(head.getTarget().getName());
+ refUpdate.setNewObjectId(commitToMerge);
+ refUpdate.setExpectedOldObjectId(null);
+ refUpdate.setRefLogMessage("initial pull", false); //$NON-NLS-1$
+ if (refUpdate.update() != Result.NEW) {
+ throw new NoHeadException(JGitText
+ .get().commitOnRepoWithoutHEADCurrentlyNotSupported);
+ }
+ monitor.endTask();
+ return new PullResult(fetchRes, remote,
+ RebaseResult.result(
+ RebaseResult.Status.FAST_FORWARD,
+ srcCommit));
+ }
+ }
+ } catch (NoHeadException e) {
+ throw e;
+ } catch (IOException e) {
+ throw new JGitInternalException(JGitText
+ .get().exceptionCaughtDuringExecutionOfPullCommand, e);
+ }
RebaseCommand rebase = new RebaseCommand(repo);
RebaseResult rebaseRes = rebase.setUpstream(commitToMerge)
.setUpstreamName(upstreamName).setProgressMonitor(monitor)