]> source.dussan.org Git - jgit.git/commitdiff
Fix bad checkout behaviour when a file is removed 58/4358/4
authorRobin Rosenberg <robin.rosenberg@dewire.com>
Mon, 17 Oct 2011 06:28:19 +0000 (08:28 +0200)
committerRobin Rosenberg <robin.rosenberg@dewire.com>
Tue, 18 Oct 2011 20:32:47 +0000 (22:32 +0200)
We deleted the entry if there was a file and an index
entry, but not when there was just an index entry. Now
delete the file in both cases since the missing file
just means our worktree is dirty. This affected the
implementation of reset --hard.

Bug: 347574
Change-Id: Ie66fa61303472422830f5e33614e93ad65094e5d

org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/DirCacheCheckoutTest.java
org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java

index 9fb4b3e17df89dbe839b17e3b0ba331c665833f7..8c3f6f37c3c852dd67b7eae6f37761956259b8bc 100644 (file)
@@ -47,6 +47,7 @@ import java.util.Map;
 
 import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.MergeResult.MergeStatus;
+import org.eclipse.jgit.api.ResetCommand.ResetType;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.api.errors.NoFilepatternException;
 import org.eclipse.jgit.dircache.DirCache;
@@ -147,6 +148,35 @@ public class DirCacheCheckoutTest extends ReadTreeTest {
                                "h()", "untracked", "untracked"));
        }
 
+       /**
+        * Reset hard from unclean condition.
+        * <p>
+        * WorkDir: Empty <br/>
+        * Index: f/g <br/>
+        * Merge: x
+        *
+        * @throws Exception
+        */
+       @Test
+       public void testResetHardFromIndexEntryWithoutFileToTreeWithoutFile()
+                       throws Exception {
+               Git git = new Git(db);
+               writeTrashFile("x", "x");
+               git.add().addFilepattern("x").call();
+               RevCommit id1 = git.commit().setMessage("c1").call();
+
+               writeTrashFile("f/g", "f/g");
+               git.rm().addFilepattern("x").call();
+               git.add().addFilepattern("f/g").call();
+               git.commit().setMessage("c2").call();
+               deleteTrashFile("f/g");
+               deleteTrashFile("f");
+
+               // The actual test
+               git.reset().setMode(ResetType.HARD).setRef(id1.getName()).call();
+               assertIndex(mkmap("x", "x"));
+       }
+
        private DirCacheCheckout resetHard(RevCommit commit)
                        throws NoWorkTreeException,
                        CorruptObjectException, IOException {
index 68a53dfa8794d10a7e5f08e8aaf2365832f7026c..465f01ada95dda9649fc401de1aed7dce5d74dec 100644 (file)
@@ -352,12 +352,10 @@ public class DirCacheCheckout {
                                        }
                                }
                        } else {
-                               // There is no file/folder for that path in the working tree.
-                               // The only entry we have is the index entry. If that entry is a
-                               // conflict simply remove it. Otherwise keep that entry in the
-                               // index
-                               if (i.getDirCacheEntry().getStage() == 0)
-                                       keep(i.getDirCacheEntry());
+                               // There is no file/folder for that path in the working tree,
+                               // nor in the merge head.
+                               // The only entry we have is the index entry. Like the case
+                               // where there is a file with the same name, remove it,
                        }
                }
        }