[pgm] Implement git tag --contains option

Change-Id: I390bcd2c2c563d4b27e1369f09548be59ba7c111
This commit is contained in:
Matthias Sohn 2023-04-09 22:49:58 +02:00
parent 060dcf1cca
commit 0e9708803f
3 changed files with 52 additions and 1 deletions

View File

@ -9,24 +9,30 @@
*/
package org.eclipse.jgit.pgm;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.CLIRepositoryTestCase;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Before;
import org.junit.Test;
public class TagTest extends CLIRepositoryTestCase {
private Git git;
private RevCommit initialCommit;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
git = new Git(db);
git.commit().setMessage("initial commit").call();
initialCommit = git.commit().setMessage("initial commit").call();
}
@Test
@ -57,4 +63,39 @@ public void testTagDeleteFail() throws Exception {
assertEquals("fatal: error: tag 'test' not found", e.getMessage());
}
}
@Test
public void testContains() throws Exception {
/* c3
* |
* v2 - c2 b2 - v1
* | |
* c1 b1
* \ /
* a
*/
try (TestRepository<Repository> r = new TestRepository<>(
db)) {
RevCommit b1 = r.commit(initialCommit);
RevCommit b2 = r.commit(b1);
RevCommit c1 = r.commit(initialCommit);
RevCommit c2 = r.commit(c1);
RevCommit c3 = r.commit(c2);
r.update("refs/tags/v1", r.tag("v1", b2));
r.update("refs/tags/v2", r.tag("v1.1", c2));
assertArrayEquals(
new String[] { "v1", "v2", "" },
execute("git tag --contains " + initialCommit.name()));
assertArrayEquals(new String[] { "v1", "" },
execute("git tag --contains " + b1.name()));
assertArrayEquals(new String[] { "v2", "" },
execute("git tag --contains " + c1.name()));
assertArrayEquals(new String[] { "" },
execute("git tag --contains " + c3.name()));
}
}
}

View File

@ -469,6 +469,7 @@ usage_trustExitCode=git-difftool invokes a diff tool individually on each file.
usage_noTrustExitCode=This option can be used to override --trust-exit-code setting.
usage_notags=do not fetch tags
usage_tagAnnotated=create an annotated tag, unsigned unless -s or -u are given, or config tag.gpgSign is true
usage_tagContains=Only list tags which contain the specified commit
usage_tagDelete=delete tag
usage_tagLocalUser=create a signed annotated tag using the specified GPG key ID
usage_tagMessage=create an annotated tag with the given message, unsigned unless -s or -u are given, or config tag.gpgSign is true, or tar.forceSignAnnotated is true and -a is not given

View File

@ -33,6 +33,7 @@
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.pgm.internal.CLIText;
import org.eclipse.jgit.pgm.internal.VerificationUtils;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevTag;
import org.eclipse.jgit.revwalk.RevWalk;
import org.kohsuke.args4j.Argument;
@ -76,6 +77,11 @@ class Tag extends TextBuiltin {
"--local-user" }, usage = "usage_tagVerify")
private boolean verify;
@Option(name = "--contains", forbids = { "--delete", "--force",
"--annotate", "-m", "--sign", "--no-sign",
"--local-user" }, metaVar = "metaVar_commitish", usage = "usage_tagContains")
private RevCommit contains;
@Argument(index = 0, metaVar = "metaVar_name")
private String tagName;
@ -142,6 +148,9 @@ protected void run() {
}
} else {
ListTagCommand command = git.tagList();
if (contains != null) {
command.setContains(contains);
}
List<Ref> list = command.call();
for (Ref ref : list) {
outw.println(Repository.shortenRefName(ref.getName()));