From 13f0db25f272e29b607c5b0e01a3b0d612731794 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 15 Jul 2016 00:13:01 +0200 Subject: [PATCH] Enhance ResetCommand to allow disabling reflog update This will be used by EGit for implementing commit amend in the staging view (see Idcd1efeeee8b3065bae36e285bfc0af24ab1e88f). Change-Id: Ice9ebbb1c0c3314c679f4db40cdd3664f61c27c3 Signed-off-by: Matthias Sohn --- .../eclipse/jgit/api/ResetCommandTest.java | 40 +++++++++++++++++++ .../org/eclipse/jgit/api/ResetCommand.java | 30 +++++++++++++- 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java index a4a699ef2..ba51881ff 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ResetCommandTest.java @@ -156,6 +156,28 @@ public class ResetCommandTest extends RepositoryTestCase { assertEquals(prevHead, db.readOrigHead()); } + @Test + public void testHardResetReflogDisabled() throws Exception { + setupRepository(); + ObjectId prevHead = db.resolve(Constants.HEAD); + ResetCommand reset = git.reset(); + assertSameAsHead(reset.setMode(ResetType.HARD) + .setRef(initialCommit.getName()).disableRefLog(true).call()); + assertTrue("reflog should be disabled", reset.isReflogDisabled()); + // check if HEAD points to initial commit now + ObjectId head = db.resolve(Constants.HEAD); + assertEquals(initialCommit, head); + // check if files were removed + assertFalse(indexFile.exists()); + assertTrue(untrackedFile.exists()); + // fileInIndex must no longer be in HEAD and in the index + String fileInIndexPath = indexFile.getAbsolutePath(); + assertFalse(inHead(fileInIndexPath)); + assertFalse(inIndex(indexFile.getName())); + assertReflogDisabled(head); + assertEquals(prevHead, db.readOrigHead()); + } + @Test public void testHardResetWithConflicts_DoOverWriteUntrackedFile() throws JGitInternalException, @@ -562,6 +584,24 @@ public class ResetCommandTest extends RepositoryTestCase { .getName()); } + private void assertReflogDisabled(ObjectId head) + throws IOException { + // Check the reflog for HEAD + String actualHeadMessage = db.getReflogReader(Constants.HEAD) + .getLastEntry().getComment(); + String expectedHeadMessage = "commit: adding a.txt and dir/b.txt"; + assertEquals(expectedHeadMessage, actualHeadMessage); + assertEquals(head.getName(), db.getReflogReader(Constants.HEAD) + .getLastEntry().getOldId().getName()); + + // The reflog for master contains the same as the one for HEAD + String actualMasterMessage = db.getReflogReader("refs/heads/master") + .getLastEntry().getComment(); + String expectedMasterMessage = "commit: adding a.txt and dir/b.txt"; + assertEquals(expectedMasterMessage, actualMasterMessage); + assertEquals(head.getName(), db.getReflogReader(Constants.HEAD) + .getLastEntry().getOldId().getName()); + } /** * Checks if a file with the given path exists in the HEAD tree * diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java index e385a5d17..3ceff843a 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java @@ -123,6 +123,8 @@ public class ResetCommand extends GitCommand { private Collection filepaths = new LinkedList(); + private boolean isReflogDisabled; + /** * * @param repo @@ -181,8 +183,12 @@ public class ResetCommand extends GitCommand { ru.setNewObjectId(commitId); String refName = Repository.shortenRefName(getRefOrHEAD()); - String message = refName + ": updating " + Constants.HEAD; //$NON-NLS-1$ - ru.setRefLogMessage(message, false); + if (isReflogDisabled) { + ru.disableRefLog(); + } else { + String message = refName + ": updating " + Constants.HEAD; //$NON-NLS-1$ + ru.setRefLogMessage(message, false); + } if (ru.forceUpdate() == RefUpdate.Result.LOCK_FAILURE) throw new JGitInternalException(MessageFormat.format( JGitText.get().cannotLock, ru.getName())); @@ -289,6 +295,26 @@ public class ResetCommand extends GitCommand { return this; } + /** + * @param disable + * if {@code true} disables writing a reflog entry for this reset + * command + * @return this instance + * @since 4.5 + */ + public ResetCommand disableRefLog(boolean disable) { + this.isReflogDisabled = disable; + return this; + } + + /** + * @return {@code true} if writing reflog is disabled for this reset command + * @since 4.5 + */ + public boolean isReflogDisabled() { + return this.isReflogDisabled; + } + private String getRefOrHEAD() { if (ref != null) return ref;