Fix bad checkout behaviour when a file is removed

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
This commit is contained in:
Robin Rosenberg 2011-10-17 08:28:19 +02:00
parent 86e96b41e2
commit 2e43dcd645
2 changed files with 34 additions and 6 deletions

View File

@ -47,6 +47,7 @@
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 void testResetHard() throws IOException, NoFilepatternException,
"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 {

View File

@ -352,12 +352,10 @@ void processEntry(CanonicalTreeParser m, DirCacheBuildIterator i,
}
}
} 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,
}
}
}