Skip to content

Commit

Permalink
Support signed tags
Browse files Browse the repository at this point in the history
JGit's TagCommand has learned to sign tags. Add a checkbox to the
CreateTagDialog where the user can specify whether the new tag shall
be signed. Information for signing is taken from the git config. The
checkbox is added only if signing is possible at all -- if we can't
find a signing key, tags will never be signed, and the checkbox is
not shown at all.

A signed tag is always an annotated tag, even if the message is empty.

Rewrite TagOperation to make use of JGit's TagCommand, and hide the
complexities of setting the correct parameters for TagCommand. Adapt
all users of TagOperation to use the new interface.

Change-Id: I78162dc5a1c51cc345eaab9d801e21011a1a3f52
Signed-off-by: Thomas Wolf <[email protected]>
  • Loading branch information
Thomas Wolf authored and msohn committed Dec 11, 2020
1 parent 6c96b1d commit e43bd23
Show file tree
Hide file tree
Showing 14 changed files with 626 additions and 323 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,10 @@
import org.eclipse.egit.core.test.TestUtils;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefUpdate;
import org.eclipse.jgit.lib.TagBuilder;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevTag;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.util.RawParseUtils;
Expand Down Expand Up @@ -68,97 +69,92 @@ public void tearDown() throws Exception {

@Test
public void addTag() throws Exception {
assertTrue("Tags should be empty", repository1.getRepository()
.getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
TagBuilder newTag = new TagBuilder();
newTag.setTag("TheNewTag");
newTag.setMessage("Well, I'm the tag");
newTag.setTagger(RawParseUtils.parsePersonIdent(TestUtils.AUTHOR));
newTag.setObjectId(repository1.getRepository()
.resolve("refs/heads/master"), Constants.OBJ_COMMIT);
TagOperation top = new TagOperation(repository1.getRepository(),
newTag, false);
Repository repo = repository1.getRepository();
assertTrue("Tags should be empty", repo.getRefDatabase()
.getRefsByPrefix(Constants.R_TAGS).isEmpty());
PersonIdent author = RawParseUtils.parsePersonIdent(TestUtils.AUTHOR);
TagOperation top = new TagOperation(repo)
.setAnnotated(true)
.setForce(false).setName("TheNewTag")
.setMessage("Well, I'm the tag")
.setTagger(author)
.setTarget(repo.parseCommit(repo.resolve("refs/heads/master")));
top.execute(new NullProgressMonitor());
assertFalse("Tags should not be empty", repository1.getRepository()
.getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
assertFalse("Tags should not be empty", repo.getRefDatabase()
.getRefsByPrefix(Constants.R_TAGS).isEmpty());

// Execute it again: should create an identical tag object with the same
// hash and be allowed
top.execute(null);
assertEquals(top.getResult(), RefUpdate.Result.NO_CHANGE);

top = new TagOperation(repository1.getRepository(), newTag, true);

// Set the force flag and re-execute; should also be allowed.
top.setForce(true);
top.execute(null);
assertEquals(top.getResult(), RefUpdate.Result.NO_CHANGE);

try (RevWalk walk = new RevWalk(repository1.getRepository())) {
RevTag tag = walk.parseTag(repository1.getRepository().resolve(
Constants.R_TAGS + "TheNewTag"));
// Change the message (force flag is still set)
try (RevWalk walk = new RevWalk(repo)) {
RevTag tag = walk
.parseTag(repo.resolve(Constants.R_TAGS + "TheNewTag"));

newTag.setMessage("Another message");
top.setMessage("Another message");
assertFalse("Messages should differ",
tag.getFullMessage().equals(newTag.getMessage()));
tag.getFullMessage().equals(top.getMessage()));
top.execute(null);
tag = walk.parseTag(repository1.getRepository().resolve(
Constants.R_TAGS + "TheNewTag"));
tag = walk.parseTag(repo.resolve(Constants.R_TAGS + "TheNewTag"));
assertTrue("Messages be same",
tag.getFullMessage().equals(newTag.getMessage()));
walk.dispose();
tag.getFullMessage().equals(top.getMessage()));
}
}

@Test
public void addEmptyAnnotatedTag() throws Exception {
assertTrue("Tags should be empty", repository1.getRepository()
.getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
TagBuilder newTag = new TagBuilder();
newTag.setTag("TheNewTag");
newTag.setMessage("");
newTag.setTagger(RawParseUtils.parsePersonIdent(TestUtils.AUTHOR));
ObjectId headCommit = repository1.getRepository()
.resolve("refs/heads/master");
newTag.setObjectId(headCommit, Constants.OBJ_COMMIT);
TagOperation top = new TagOperation(repository1.getRepository(), newTag,
false, true);
Repository repo = repository1.getRepository();
assertTrue("Tags should be empty", repo.getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
RevCommit commit = repo.parseCommit(repo.resolve("refs/heads/master"));
TagOperation top = new TagOperation(repo)
.setName("TheNewTag")
.setAnnotated(true)
.setMessage("")
.setTagger(RawParseUtils.parsePersonIdent(TestUtils.AUTHOR))
.setTarget(repo.parseCommit(repo.resolve("refs/heads/master")));
top.execute(new NullProgressMonitor());
assertFalse("Tags should not be empty", repository1.getRepository()
.getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
assertIsAnnotated("TheNewTag", headCommit, "");
assertFalse("Tags should not be empty", repo.getRefDatabase()
.getRefsByPrefix(Constants.R_TAGS).isEmpty());
assertIsAnnotated("TheNewTag", commit, "");
}

@Test
public void addNullAnnotatedTag() throws Exception {
assertTrue("Tags should be empty", repository1.getRepository()
.getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
TagBuilder newTag = new TagBuilder();
newTag.setTag("TheNewTag");
newTag.setTagger(RawParseUtils.parsePersonIdent(TestUtils.AUTHOR));
ObjectId headCommit = repository1.getRepository()
.resolve("refs/heads/master");
newTag.setObjectId(headCommit, Constants.OBJ_COMMIT);
TagOperation top = new TagOperation(repository1.getRepository(), newTag,
false, true);
Repository repo = repository1.getRepository();
assertTrue("Tags should be empty", repo.getRefDatabase()
.getRefsByPrefix(Constants.R_TAGS).isEmpty());
RevCommit commit = repo.parseCommit(repo.resolve("refs/heads/master"));
TagOperation top = new TagOperation(repo)
.setName("TheNewTag")
.setAnnotated(true)
.setTagger(RawParseUtils.parsePersonIdent(TestUtils.AUTHOR))
.setTarget(repo.parseCommit(repo.resolve("refs/heads/master")));
top.execute(new NullProgressMonitor());
assertFalse("Tags should not be empty", repository1.getRepository()
.getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
assertIsAnnotated("TheNewTag", headCommit, null);
assertFalse("Tags should not be empty", repo.getRefDatabase()
.getRefsByPrefix(Constants.R_TAGS).isEmpty());
assertIsAnnotated("TheNewTag", commit, "");
}

@Test
public void addLightweightTag() throws Exception {
assertTrue("Tags should be empty", repository1.getRepository()
.getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
TagBuilder newTag = new TagBuilder();
newTag.setTag("TheNewTag");
newTag.setTagger(RawParseUtils.parsePersonIdent(TestUtils.AUTHOR));
ObjectId headCommit = repository1.getRepository()
.resolve("refs/heads/master");
newTag.setObjectId(headCommit, Constants.OBJ_COMMIT);
TagOperation top = new TagOperation(repository1.getRepository(), newTag,
false, false);
Repository repo = repository1.getRepository();
assertTrue("Tags should be empty", repo.getRefDatabase()
.getRefsByPrefix(Constants.R_TAGS).isEmpty());
RevCommit commit = repo.parseCommit(repo.resolve("refs/heads/master"));
TagOperation top = new TagOperation(repo)
.setName("TheNewTag")
.setAnnotated(false)
.setTagger(RawParseUtils.parsePersonIdent(TestUtils.AUTHOR))
.setTarget(repo.parseCommit(repo.resolve("refs/heads/master")));
top.execute(new NullProgressMonitor());
assertFalse("Tags should not be empty", repository1.getRepository()
.getRefDatabase().getRefsByPrefix(Constants.R_TAGS).isEmpty());
assertIsLightweight("TheNewTag", headCommit);
assertFalse("Tags should not be empty", repo.getRefDatabase()
.getRefsByPrefix(Constants.R_TAGS).isEmpty());
assertIsLightweight("TheNewTag", commit);
}

private void assertIsAnnotated(String tag, ObjectId target, String message)
Expand Down
Loading

0 comments on commit e43bd23

Please sign in to comment.