]> source.dussan.org Git - jgit.git/commitdiff
StashCreateCommand: Abort in case of unmerged paths 97/8297/2
authorRobin Stocker <robin@nibor.org>
Mon, 22 Oct 2012 09:14:40 +0000 (11:14 +0200)
committerRobin Stocker <robin@nibor.org>
Mon, 22 Oct 2012 09:14:40 +0000 (11:14 +0200)
Bug: 391861
Change-Id: I5f8ffe072c08c8ca2ca6be6b6afa67c8e16a63b6

org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StashCreateCommandTest.java
org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java
org.eclipse.jgit/src/org/eclipse/jgit/api/StashCreateCommand.java
org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEntry.java

index 2b01b60cb2647beb979f62863ebe5aaf27cbfb0d..d481390e6860b00506638c4fd0fc50025a6b6f45 100644 (file)
@@ -52,6 +52,7 @@ import java.io.File;
 import java.io.IOException;
 import java.util.List;
 
+import org.eclipse.jgit.api.errors.UnmergedPathsException;
 import org.eclipse.jgit.diff.DiffEntry;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
@@ -417,4 +418,14 @@ public class StashCreateCommandTest extends RepositoryTestCase {
                assertEquals(who, entry.getWho());
                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();
+       }
 }
index dd03427f9cdc3d0d16a034d5b7687ce17d8fe130..60b9462a05148d72c63335fa136ff8dd8ae7eb82 100644 (file)
@@ -58,6 +58,8 @@ import java.io.Reader;
 import java.util.Map;
 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.DirCacheBuilder;
 import org.eclipse.jgit.dircache.DirCacheCheckout;
@@ -436,4 +438,37 @@ public abstract class RepositoryTestCase extends LocalDiskRepositoryTestCase {
                                        }
                                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);
+               }
+       }
 }
index 4c7ae6ade2010f283f9716bf1c093a23093a874c..375dee05c5633b606be511ad7bdd1ccfb6d426fd 100644 (file)
@@ -52,12 +52,14 @@ import org.eclipse.jgit.api.ResetCommand.ResetType;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.api.errors.JGitInternalException;
 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.DirCacheEditor;
 import org.eclipse.jgit.dircache.DirCacheEditor.DeletePath;
 import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
 import org.eclipse.jgit.dircache.DirCacheEntry;
 import org.eclipse.jgit.dircache.DirCacheIterator;
+import org.eclipse.jgit.errors.UnmergedPathException;
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.lib.CommitBuilder;
 import org.eclipse.jgit.lib.Constants;
@@ -247,6 +249,10 @@ public class StashCreateCommand extends GitCommand<RevCommit> {
                                        WorkingTreeIterator wtIter = treeWalk.getTree(2,
                                                        WorkingTreeIterator.class);
                                        if (headIter != null && indexIter != null && wtIter != null) {
+                                               if (!indexIter.getDirCacheEntry().isMerged())
+                                                       throw new UnmergedPathsException(
+                                                                       new UnmergedPathException(
+                                                                                       indexIter.getDirCacheEntry()));
                                                if (wtIter.idEqual(indexIter)
                                                                || wtIter.idEqual(headIter))
                                                        continue;
index 00af0657d0238d3532dccfc3459de31e85b3ee17..0b269b0d7c382d02a8eb3266d4f7e4d91cc9bd4c 100644 (file)
@@ -446,6 +446,15 @@ public class DirCacheEntry {
                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.
         *