Browse Source

Fix ResetCommand to return the resulting ref

ResetCommand was not returning the updated ref as a result of the call()
method. Since the ResetCommand is always updating the same ref (HEAD)
this should always be the HEAD ref.

Bug: 440750
Change-Id: I7974975c3ab05e68c208384e69cf0692ded6e8db
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
tags/v4.2.0.201601211800-r
Christian Halstrick 8 years ago
parent
commit
7182cb2a26

+ 35
- 21
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java View File

import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.treewalk.TreeWalk; import org.eclipse.jgit.treewalk.TreeWalk;
AmbiguousObjectException, IOException, GitAPIException { AmbiguousObjectException, IOException, GitAPIException {
setupRepository(); setupRepository();
ObjectId prevHead = db.resolve(Constants.HEAD); ObjectId prevHead = db.resolve(Constants.HEAD);
git.reset().setMode(ResetType.HARD).setRef(initialCommit.getName())
.call();
assertSameAsHead(git.reset().setMode(ResetType.HARD)
.setRef(initialCommit.getName()).call());
// check if HEAD points to initial commit now // check if HEAD points to initial commit now
ObjectId head = db.resolve(Constants.HEAD); ObjectId head = db.resolve(Constants.HEAD);
assertEquals(initialCommit, head); assertEquals(initialCommit, head);
AmbiguousObjectException, IOException, GitAPIException { AmbiguousObjectException, IOException, GitAPIException {
setupRepository(); setupRepository();
ObjectId prevHead = db.resolve(Constants.HEAD); ObjectId prevHead = db.resolve(Constants.HEAD);
git.reset().setMode(ResetType.SOFT).setRef(initialCommit.getName())
.call();
assertSameAsHead(git.reset().setMode(ResetType.SOFT)
.setRef(initialCommit.getName()).call());
// check if HEAD points to initial commit now // check if HEAD points to initial commit now
ObjectId head = db.resolve(Constants.HEAD); ObjectId head = db.resolve(Constants.HEAD);
assertEquals(initialCommit, head); assertEquals(initialCommit, head);
AmbiguousObjectException, IOException, GitAPIException { AmbiguousObjectException, IOException, GitAPIException {
setupRepository(); setupRepository();
ObjectId prevHead = db.resolve(Constants.HEAD); ObjectId prevHead = db.resolve(Constants.HEAD);
git.reset().setMode(ResetType.MIXED).setRef(initialCommit.getName())
.call();
assertSameAsHead(git.reset().setMode(ResetType.MIXED)
.setRef(initialCommit.getName()).call());
// check if HEAD points to initial commit now // check if HEAD points to initial commit now
ObjectId head = db.resolve(Constants.HEAD); ObjectId head = db.resolve(Constants.HEAD);
assertEquals(initialCommit, head); assertEquals(initialCommit, head);
assertTrue(bEntry.getLength() > 0); assertTrue(bEntry.getLength() > 0);
assertTrue(bEntry.getLastModified() > 0); assertTrue(bEntry.getLastModified() > 0);


git.reset().setMode(ResetType.MIXED).setRef(commit2.getName()).call();
assertSameAsHead(git.reset().setMode(ResetType.MIXED)
.setRef(commit2.getName()).call());


cache = db.readDirCache(); cache = db.readDirCache();


+ "[a.txt, mode:100644, stage:3]", + "[a.txt, mode:100644, stage:3]",
indexState(0)); indexState(0));


git.reset().setMode(ResetType.MIXED).call();
assertSameAsHead(git.reset().setMode(ResetType.MIXED).call());


assertEquals("[a.txt, mode:100644]" + "[b.txt, mode:100644]", assertEquals("[a.txt, mode:100644]" + "[b.txt, mode:100644]",
indexState(0)); indexState(0));


// 'a.txt' has already been modified in setupRepository // 'a.txt' has already been modified in setupRepository
// 'notAddedToIndex.txt' has been added to repository // 'notAddedToIndex.txt' has been added to repository
git.reset().addPath(indexFile.getName())
.addPath(untrackedFile.getName()).call();
assertSameAsHead(git.reset().addPath(indexFile.getName())
.addPath(untrackedFile.getName()).call());


DirCacheEntry postReset = DirCache.read(db.getIndexFile(), db.getFS()) DirCacheEntry postReset = DirCache.read(db.getIndexFile(), db.getFS())
.getEntry(indexFile.getName()); .getEntry(indexFile.getName());
git.add().addFilepattern(untrackedFile.getName()).call(); git.add().addFilepattern(untrackedFile.getName()).call();


// 'dir/b.txt' has already been modified in setupRepository // 'dir/b.txt' has already been modified in setupRepository
git.reset().addPath("dir").call();
assertSameAsHead(git.reset().addPath("dir").call());


DirCacheEntry postReset = DirCache.read(db.getIndexFile(), db.getFS()) DirCacheEntry postReset = DirCache.read(db.getIndexFile(), db.getFS())
.getEntry("dir/b.txt"); .getEntry("dir/b.txt");
// 'a.txt' has already been modified in setupRepository // 'a.txt' has already been modified in setupRepository
// 'notAddedToIndex.txt' has been added to repository // 'notAddedToIndex.txt' has been added to repository
// reset to the inital commit // reset to the inital commit
git.reset().setRef(initialCommit.getName())
.addPath(indexFile.getName())
.addPath(untrackedFile.getName()).call();
assertSameAsHead(git.reset().setRef(initialCommit.getName())
.addPath(indexFile.getName()).addPath(untrackedFile.getName())
.call());


// check that HEAD hasn't moved // check that HEAD hasn't moved
ObjectId head = db.resolve(Constants.HEAD); ObjectId head = db.resolve(Constants.HEAD);
+ "[b.txt, mode:100644]", + "[b.txt, mode:100644]",
indexState(0)); indexState(0));


git.reset().addPath(file).call();
assertSameAsHead(git.reset().addPath(file).call());


assertEquals("[a.txt, mode:100644]" + "[b.txt, mode:100644]", assertEquals("[a.txt, mode:100644]" + "[b.txt, mode:100644]",
indexState(0)); indexState(0));
writeTrashFile("a.txt", "content"); writeTrashFile("a.txt", "content");
git.add().addFilepattern("a.txt").call(); git.add().addFilepattern("a.txt").call();
// Should assume an empty tree, like in C Git 1.8.2 // Should assume an empty tree, like in C Git 1.8.2
git.reset().addPath("a.txt").call();
assertSameAsHead(git.reset().addPath("a.txt").call());


DirCache cache = db.readDirCache(); DirCache cache = db.readDirCache();
DirCacheEntry aEntry = cache.getEntry("a.txt"); DirCacheEntry aEntry = cache.getEntry("a.txt");
git = new Git(db); git = new Git(db);
writeTrashFile("a.txt", "content"); writeTrashFile("a.txt", "content");
git.add().addFilepattern("a.txt").call(); git.add().addFilepattern("a.txt").call();
git.reset().setRef("doesnotexist").addPath("a.txt").call();
assertSameAsHead(
git.reset().setRef("doesnotexist").addPath("a.txt").call());
} }


@Test @Test
git.add().addFilepattern("a.txt").call(); git.add().addFilepattern("a.txt").call();
writeTrashFile("a.txt", "modified"); writeTrashFile("a.txt", "modified");
// should use default mode MIXED // should use default mode MIXED
git.reset().call();
assertSameAsHead(git.reset().call());


DirCache cache = db.readDirCache(); DirCache cache = db.readDirCache();
DirCacheEntry aEntry = cache.getEntry("a.txt"); DirCacheEntry aEntry = cache.getEntry("a.txt");


git.add().addFilepattern(untrackedFile.getName()).call(); git.add().addFilepattern(untrackedFile.getName()).call();


git.reset().setRef(tagName).setMode(HARD).call();
assertSameAsHead(git.reset().setRef(tagName).setMode(HARD).call());


ObjectId head = db.resolve(Constants.HEAD); ObjectId head = db.resolve(Constants.HEAD);
assertEquals(secondCommit, head); assertEquals(secondCommit, head);
result.getMergeStatus()); result.getMergeStatus());
assertNotNull(db.readSquashCommitMsg()); assertNotNull(db.readSquashCommitMsg());


g.reset().setMode(ResetType.HARD).setRef(first.getName()).call();
assertSameAsHead(g.reset().setMode(ResetType.HARD)
.setRef(first.getName()).call());


assertNull(db.readSquashCommitMsg()); assertNull(db.readSquashCommitMsg());
} }
File fileA = writeTrashFile("a.txt", "content"); File fileA = writeTrashFile("a.txt", "content");
git.add().addFilepattern("a.txt").call(); git.add().addFilepattern("a.txt").call();
// Should assume an empty tree, like in C Git 1.8.2 // Should assume an empty tree, like in C Git 1.8.2
git.reset().setMode(ResetType.HARD).call();
assertSameAsHead(git.reset().setMode(ResetType.HARD).call());


DirCache cache = db.readDirCache(); DirCache cache = db.readDirCache();
DirCacheEntry aEntry = cache.getEntry("a.txt"); DirCacheEntry aEntry = cache.getEntry("a.txt");
return dc.getEntry(path) != null; return dc.getEntry(path) != null;
} }


/**
* Asserts that a certain ref is similar to repos HEAD.
* @param ref
* @throws IOException
*/
private void assertSameAsHead(Ref ref) throws IOException {
Ref headRef = db.getRef(Constants.HEAD);
assertEquals(headRef.getName(), ref.getName());
assertEquals(headRef.getObjectId(), ref.getObjectId());
}
} }

+ 1
- 3
org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java View File

ObjectId origHead = ru.getOldObjectId(); ObjectId origHead = ru.getOldObjectId();
if (origHead != null) if (origHead != null)
repo.writeOrigHead(origHead); repo.writeOrigHead(origHead);
result = ru.getRef();
} else {
result = repo.getRef(Constants.HEAD);
} }
result = repo.exactRef(Constants.HEAD);


if (mode == null) if (mode == null)
mode = ResetType.MIXED; mode = ResetType.MIXED;

Loading…
Cancel
Save