From 43672700e747c3f95b64871b125129c152b9fa20 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Wed, 21 Jun 2017 17:34:05 +0100 Subject: [PATCH] Add --match option for `jgit describe` to CLI This adds --match option for glob(7) matchers on git tags to jgit describe in CLI. Bug: 518377 Change-Id: I745988d565dd4391e8b3e5a91bbfbae575333819 Signed-off-by: Oliver Lockwood --- .../org/eclipse/jgit/pgm/DescribeTest.java | 52 +++++++++++++++++-- .../jgit/pgm/internal/CLIText.properties | 2 + .../src/org/eclipse/jgit/pgm/Describe.java | 7 +++ .../eclipse/jgit/pgm/internal/CLIText.java | 1 + 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/DescribeTest.java b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/DescribeTest.java index 086e72e9a..e97762d8d 100644 --- a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/DescribeTest.java +++ b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/DescribeTest.java @@ -46,6 +46,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.util.Arrays; @@ -71,6 +72,12 @@ private void initialCommitAndTag() throws Exception { git.tag().setName("v1.0").call(); } + private void secondCommit() throws Exception { + writeTrashFile("greeting", "Hello, world!"); + git.add().addFilepattern("greeting").call(); + git.commit().setMessage("2nd commit").call(); + } + @Test public void testNoHead() throws Exception { assertEquals(CLIText.fatalError(CLIText.get().noNamesFound), @@ -94,9 +101,7 @@ public void testDescribeTag() throws Exception { @Test public void testDescribeCommit() throws Exception { initialCommitAndTag(); - writeTrashFile("greeting", "Hello, world!"); - git.add().addFilepattern("greeting").call(); - git.commit().setMessage("2nd commit").call(); + secondCommit(); assertArrayEquals(new String[] { "v1.0-1-g56f6ceb", "" }, execute("git describe")); } @@ -108,6 +113,47 @@ public void testDescribeTagLong() throws Exception { execute("git describe --long HEAD")); } + @Test + public void testDescribeCommitMatch() throws Exception { + initialCommitAndTag(); + secondCommit(); + assertArrayEquals(new String[] { "v1.0-1-g56f6ceb", "" }, + execute("git describe --match v1.*")); + } + + @Test + public void testDescribeCommitMatch2() throws Exception { + initialCommitAndTag(); + secondCommit(); + git.tag().setName("v2.0").call(); + assertArrayEquals(new String[] { "v1.0-1-g56f6ceb", "" }, + execute("git describe --match v1.*")); + } + + @Test + public void testDescribeCommitMultiMatch() throws Exception { + initialCommitAndTag(); + secondCommit(); + git.tag().setName("v2.0.0").call(); + git.tag().setName("v2.1.1").call(); + assertArrayEquals("git yields v2.0.0", new String[] { "v2.0.0", "" }, + execute("git describe --match v2.0* --match v2.1.*")); + } + + @Test + public void testDescribeCommitNoMatch() throws Exception { + initialCommitAndTag(); + writeTrashFile("greeting", "Hello, world!"); + secondCommit(); + try { + execute("git describe --match 1.*"); + fail("git describe should not find any tag matching 1.*"); + } catch (Die e) { + assertEquals("No names found, cannot describe anything.", + e.getMessage()); + } + } + @Test public void testHelpArgumentBeforeUnknown() throws Exception { String[] output = execute("git describe -h -XYZ"); diff --git a/org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/internal/CLIText.properties b/org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/internal/CLIText.properties index c3d7c685f..8666c3429 100644 --- a/org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/internal/CLIText.properties +++ b/org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/internal/CLIText.properties @@ -129,6 +129,7 @@ metaVar_op=OP metaVar_pass=PASS metaVar_path=path metaVar_paths=path ... +metaVar_pattern=pattern metaVar_port=PORT metaVar_ref=REF metaVar_refs=REFS @@ -248,6 +249,7 @@ usage_lsRemoteHeads=Show only refs starting with refs/heads usage_lsRemoteTags=Show only refs starting with refs/tags usage_LsTree=List the contents of a tree object usage_MakeCacheTree=Show the current cache tree structure +usage_Match=Only consider tags matching the given glob(7) pattern or patterns, excluding the "refs/tags/" prefix. usage_MergeBase=Find as good common ancestors as possible for a merge usage_MergesTwoDevelopmentHistories=Merges two development histories usage_PreserveOldPacks=Preserve old pack files by moving them into the preserved subdirectory instead of deleting them after repacking diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Describe.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Describe.java index ec000f388..eba5a43be 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Describe.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Describe.java @@ -50,6 +50,9 @@ import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Option; +import java.util.ArrayList; +import java.util.List; + @Command(common = true, usage = "usage_Describe") class Describe extends TextBuiltin { @@ -59,6 +62,9 @@ class Describe extends TextBuiltin { @Option(name = "--long", usage = "usage_LongFormat") private boolean longDesc; + @Option(name = "--match", multiValued = true, usage = "usage_Match", metaVar = "metaVar_pattern") + private List patterns = new ArrayList<>(); + @Override protected void run() throws Exception { try (Git git = new Git(db)) { @@ -66,6 +72,7 @@ protected void run() throws Exception { if (tree != null) cmd.setTarget(tree); cmd.setLong(longDesc); + cmd.setMatch(patterns.toArray(new String[patterns.size()])); String result = null; try { result = cmd.call(); diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java index e012372b9..1424dab05 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java @@ -196,6 +196,7 @@ public static String fatalError(String message) { /***/ public String metaVar_pass; /***/ public String metaVar_path; /***/ public String metaVar_paths; + /***/ public String metaVar_pattern; /***/ public String metaVar_port; /***/ public String metaVar_ref; /***/ public String metaVar_refs;