CommitCommand already provided a method to set the comment which should be written into the reflog. The underlying RefUpdate class supported to skip writing a reflog entry. But through the CommitCommand API it was not possible to prevent writing a reflog entry. Fix this and allow creating commits which don't occur in the reflog. Change-Id: I193c53de71fb5958ea749c4bfa8360a51acc9b58tags/v4.4.0.201605041135-m1
import org.eclipse.jgit.lib.PersonIdent; | import org.eclipse.jgit.lib.PersonIdent; | ||||
import org.eclipse.jgit.lib.RefUpdate; | import org.eclipse.jgit.lib.RefUpdate; | ||||
import org.eclipse.jgit.lib.RefUpdate.Result; | import org.eclipse.jgit.lib.RefUpdate.Result; | ||||
import org.eclipse.jgit.lib.ReflogEntry; | |||||
import org.eclipse.jgit.lib.Repository; | import org.eclipse.jgit.lib.Repository; | ||||
import org.eclipse.jgit.lib.StoredConfig; | import org.eclipse.jgit.lib.StoredConfig; | ||||
import org.eclipse.jgit.revwalk.RevCommit; | import org.eclipse.jgit.revwalk.RevCommit; | ||||
} | } | ||||
} | } | ||||
@Test | |||||
public void testReflogs() throws Exception { | |||||
try (Git git = new Git(db)) { | |||||
writeTrashFile("f", "1"); | |||||
git.add().addFilepattern("f").call(); | |||||
git.commit().setMessage("c1").call(); | |||||
writeTrashFile("f", "2"); | |||||
git.commit().setMessage("c2").setAll(true).setReflogComment(null) | |||||
.call(); | |||||
writeTrashFile("f", "3"); | |||||
git.commit().setMessage("c3").setAll(true) | |||||
.setReflogComment("testRl").call(); | |||||
db.getReflogReader(Constants.HEAD).getReverseEntries(); | |||||
assertEquals("testRl;commit (initial): c1;", reflogComments( | |||||
db.getReflogReader(Constants.HEAD).getReverseEntries())); | |||||
assertEquals("testRl;commit (initial): c1;", reflogComments( | |||||
db.getReflogReader(db.getBranch()).getReverseEntries())); | |||||
} | |||||
} | |||||
private static String reflogComments(List<ReflogEntry> entries) { | |||||
StringBuffer b = new StringBuffer(); | |||||
for (ReflogEntry e : entries) { | |||||
b.append(e.getComment()).append(";"); | |||||
} | |||||
return b.toString(); | |||||
} | |||||
@Test(expected = WrongRepositoryStateException.class) | @Test(expected = WrongRepositoryStateException.class) | ||||
public void commitAmendOnInitialShouldFail() throws Exception { | public void commitAmendOnInitialShouldFail() throws Exception { | ||||
try (Git git = new Git(db)) { | try (Git git = new Git(db)) { |
private String reflogComment; | private String reflogComment; | ||||
private boolean useDefaultReflogMessage = true; | |||||
/** | /** | ||||
* Setting this option bypasses the pre-commit and commit-msg hooks. | * Setting this option bypasses the pre-commit and commit-msg hooks. | ||||
*/ | */ | ||||
RevCommit revCommit = rw.parseCommit(commitId); | RevCommit revCommit = rw.parseCommit(commitId); | ||||
RefUpdate ru = repo.updateRef(Constants.HEAD); | RefUpdate ru = repo.updateRef(Constants.HEAD); | ||||
ru.setNewObjectId(commitId); | ru.setNewObjectId(commitId); | ||||
if (reflogComment != null) { | |||||
if (!useDefaultReflogMessage) { | |||||
ru.setRefLogMessage(reflogComment, false); | ru.setRefLogMessage(reflogComment, false); | ||||
} else { | } else { | ||||
String prefix = amend ? "commit (amend): " //$NON-NLS-1$ | String prefix = amend ? "commit (amend): " //$NON-NLS-1$ | ||||
* Override the message written to the reflog | * Override the message written to the reflog | ||||
* | * | ||||
* @param reflogComment | * @param reflogComment | ||||
* the comment to be written into the reflog or <code>null</code> | |||||
* to specify that no reflog should be written | |||||
* @return {@code this} | * @return {@code this} | ||||
*/ | */ | ||||
public CommitCommand setReflogComment(String reflogComment) { | public CommitCommand setReflogComment(String reflogComment) { | ||||
this.reflogComment = reflogComment; | this.reflogComment = reflogComment; | ||||
useDefaultReflogMessage = false; | |||||
return this; | return this; | ||||
} | } | ||||