Browse Source

StashCreateCommand: Abort in case of unmerged paths

Bug: 391861
Change-Id: I5f8ffe072c08c8ca2ca6be6b6afa67c8e16a63b6
stable-2.2
Robin Stocker 12 years ago
parent
commit
ad52ec5207
  1. 11
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashCreateCommandTest.java
  2. 35
      org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java
  3. 6
      org.eclipse.jgit/src/org/eclipse/jgit/api/StashCreateCommand.java
  4. 9
      org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEntry.java

11
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashCreateCommandTest.java

@ -52,6 +52,7 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import org.eclipse.jgit.api.errors.UnmergedPathsException;
import org.eclipse.jgit.diff.DiffEntry; import org.eclipse.jgit.diff.DiffEntry;
import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectId;
@ -417,4 +418,14 @@ public class StashCreateCommandTest extends RepositoryTestCase {
assertEquals(who, entry.getWho()); assertEquals(who, entry.getWho());
assertEquals(stashed.getFullMessage(), entry.getComment()); assertEquals(stashed.getFullMessage(), entry.getComment());
} }
@Test(expected = UnmergedPathsException.class)
public void unmergedPathsShouldCauseException() throws Exception {
commitFile("file.txt", "master", "base");
RevCommit side = commitFile("file.txt", "side", "side");
commitFile("file.txt", "master", "master");
git.merge().include(side).call();
git.stashCreate().call();
}
} }

35
org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java

@ -58,6 +58,8 @@ import java.io.Reader;
import java.util.Map; import java.util.Map;
import java.util.TreeSet; import java.util.TreeSet;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.dircache.DirCache; import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheBuilder; import org.eclipse.jgit.dircache.DirCacheBuilder;
import org.eclipse.jgit.dircache.DirCacheCheckout; import org.eclipse.jgit.dircache.DirCacheCheckout;
@ -436,4 +438,37 @@ public abstract class RepositoryTestCase extends LocalDiskRepositoryTestCase {
} }
return f; return f;
} }
/**
* Commit a file with the specified contents on the specified branch,
* creating the branch if it didn't exist before.
* <p>
* It switches back to the original branch after the commit if there was
* one.
*
* @param filename
* @param contents
* @param branch
* @return the created commit
*/
protected RevCommit commitFile(String filename, String contents, String branch) {
try {
Git git = new Git(db);
String originalBranch = git.getRepository().getFullBranch();
if (git.getRepository().getRef(branch) == null)
git.branchCreate().setName(branch).call();
git.checkout().setName(branch).call();
writeTrashFile(filename, contents);
git.add().addFilepattern(filename).call();
RevCommit commit = git.commit()
.setMessage(branch + ": " + filename).call();
if (originalBranch != null)
git.checkout().setName(originalBranch).call();
return commit;
} catch (IOException e) {
throw new RuntimeException(e);
} catch (GitAPIException e) {
throw new RuntimeException(e);
}
}
} }

6
org.eclipse.jgit/src/org/eclipse/jgit/api/StashCreateCommand.java

@ -52,12 +52,14 @@ import org.eclipse.jgit.api.ResetCommand.ResetType;
import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException; import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.NoHeadException; import org.eclipse.jgit.api.errors.NoHeadException;
import org.eclipse.jgit.api.errors.UnmergedPathsException;
import org.eclipse.jgit.dircache.DirCache; import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheEditor; import org.eclipse.jgit.dircache.DirCacheEditor;
import org.eclipse.jgit.dircache.DirCacheEditor.DeletePath; import org.eclipse.jgit.dircache.DirCacheEditor.DeletePath;
import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit; import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
import org.eclipse.jgit.dircache.DirCacheEntry; import org.eclipse.jgit.dircache.DirCacheEntry;
import org.eclipse.jgit.dircache.DirCacheIterator; import org.eclipse.jgit.dircache.DirCacheIterator;
import org.eclipse.jgit.errors.UnmergedPathException;
import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.lib.CommitBuilder; import org.eclipse.jgit.lib.CommitBuilder;
import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Constants;
@ -247,6 +249,10 @@ public class StashCreateCommand extends GitCommand<RevCommit> {
WorkingTreeIterator wtIter = treeWalk.getTree(2, WorkingTreeIterator wtIter = treeWalk.getTree(2,
WorkingTreeIterator.class); WorkingTreeIterator.class);
if (headIter != null && indexIter != null && wtIter != null) { if (headIter != null && indexIter != null && wtIter != null) {
if (!indexIter.getDirCacheEntry().isMerged())
throw new UnmergedPathsException(
new UnmergedPathException(
indexIter.getDirCacheEntry()));
if (wtIter.idEqual(indexIter) if (wtIter.idEqual(indexIter)
|| wtIter.idEqual(headIter)) || wtIter.idEqual(headIter))
continue; continue;

9
org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEntry.java vendored

@ -446,6 +446,15 @@ public class DirCacheEntry {
return (getExtendedFlags() & INTENT_TO_ADD) != 0; return (getExtendedFlags() & INTENT_TO_ADD) != 0;
} }
/**
* Returns whether this entry is in the fully-merged stage (0).
*
* @return true if this entry is merged
*/
public boolean isMerged() {
return getStage() == STAGE_0;
}
/** /**
* Obtain the raw {@link FileMode} bits for this entry. * Obtain the raw {@link FileMode} bits for this entry.
* *

Loading…
Cancel
Save