TagCommand: make -f work with lightweight tags for NO_CHANGE

JGit treated a NO_CHANGE RefUpdate as an error in all cases. But when
updating a lightweight tag, this is a successful result if -f was
specified.

Change-Id: Iddfa6d6a6dc8bf8fed81138a008ebc32d5f960bd
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
This commit is contained in:
Thomas Wolf 2020-12-08 14:52:00 +01:00 committed by Matthias Sohn
parent dc8a927ce4
commit 29e1270768
2 changed files with 29 additions and 0 deletions

View File

@ -12,6 +12,7 @@
import static org.eclipse.jgit.lib.Constants.R_TAGS;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@ -21,6 +22,7 @@
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.InvalidTagNameException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.RefAlreadyExistsException;
import org.eclipse.jgit.junit.RepositoryTestCase;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
@ -121,6 +123,27 @@ public void testUnannotatedTagging() throws GitAPIException,
}
}
@Test
public void testForceNoChangeLightweight() throws GitAPIException {
try (Git git = new Git(db)) {
git.commit().setMessage("initial commit").call();
RevCommit commit = git.commit().setMessage("second commit").call();
git.commit().setMessage("third commit").call();
Ref tagRef = git.tag().setObjectId(commit).setName("tag")
.setAnnotated(false).call();
assertEquals(commit.getId(), tagRef.getObjectId());
// Without force, we want to get a RefAlreadyExistsException
assertThrows(RefAlreadyExistsException.class,
() -> git.tag().setObjectId(commit).setName("tag")
.setAnnotated(false).call());
// With force the call should work
assertEquals(commit.getId(),
git.tag().setObjectId(commit).setName("tag")
.setAnnotated(false).setForceUpdate(true).call()
.getObjectId());
}
}
@Test
public void testEmptyTagName() throws GitAPIException {
try (Git git = new Git(db)) {

View File

@ -175,6 +175,12 @@ private Ref updateTagRef(ObjectId tagId, RevWalk revWalk,
throw new ConcurrentRefUpdateException(
JGitText.get().couldNotLockHEAD, tagRef.getRef(),
updateResult);
case NO_CHANGE:
if (forceUpdate) {
return repo.exactRef(refName);
}
throw new RefAlreadyExistsException(MessageFormat
.format(JGitText.get().tagAlreadyExists, newTagToString));
case REJECTED:
throw new RefAlreadyExistsException(MessageFormat.format(
JGitText.get().tagAlreadyExists, newTagToString));