diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/TagTest.java b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/TagTest.java index 0fe25f550..03391a0fb 100644 --- a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/TagTest.java +++ b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/TagTest.java @@ -46,6 +46,7 @@ import static org.junit.Assert.assertEquals; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.lib.CLIRepositoryTestCase; +import org.eclipse.jgit.lib.Ref; import org.junit.Before; import org.junit.Test; @@ -70,4 +71,26 @@ public class TagTest extends CLIRepositoryTestCase { assertEquals("fatal: tag 'test' already exists", executeUnchecked("git tag test")[0]); } + + @Test + public void testTagDelete() throws Exception { + git.tag().setName("test").call(); + + Ref ref = git.getRepository().getTags().get("test"); + assertEquals("refs/tags/test", ref.getName()); + + assertEquals("", executeUnchecked("git tag -d test")[0]); + Ref deletedRef = git.getRepository().getTags().get("test"); + assertEquals(null, deletedRef); + } + + @Test + public void testTagDeleteFail() throws Exception { + try { + assertEquals("fatal: error: tag 'test' not found.", + executeUnchecked("git tag -d test")[0]); + } catch (Die e) { + assertEquals("fatal: error: tag 'test' not found", e.getMessage()); + } + } } 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 69905593e..f3a42c385 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 @@ -200,6 +200,7 @@ switchedToNewBranch=Switched to a new branch ''{0}'' switchedToBranch=Switched to branch ''{0}'' tagAlreadyExists=tag ''{0}'' already exists tagLabel=tag +tagNotFound=error: tag ''{0}'' not found. taggerInfo=Tagger: {0} <{1}> timeInMilliSeconds={0} ms treeIsRequired=argument tree is required @@ -386,6 +387,7 @@ usage_srcPrefix=show the source prefix instead of "a/" usage_symbolicVersionForTheProject=Symbolic version for the project usage_tags=fetch all tags usage_notags=do not fetch tags +usage_tagDelete=delete tag usage_tagMessage=tag message usage_untrackedFilesMode=show untracked files usage_updateRef=reference to update diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Tag.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Tag.java index 45fceb570..dc4b037cf 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Tag.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Tag.java @@ -68,6 +68,9 @@ class Tag extends TextBuiltin { @Option(name = "-f", usage = "usage_forceReplacingAnExistingTag") private boolean force; + @Option(name = "-d", usage = "usage_tagDelete") + private boolean delete; + @Option(name = "-m", metaVar = "metaVar_message", usage = "usage_tagMessage") private String message = ""; //$NON-NLS-1$ @@ -81,19 +84,28 @@ class Tag extends TextBuiltin { protected void run() throws Exception { try (Git git = new Git(db)) { if (tagName != null) { - TagCommand command = git.tag().setForceUpdate(force) - .setMessage(message).setName(tagName); + if (delete) { + List deletedTags = git.tagDelete().setTags(tagName) + .call(); + if (deletedTags.isEmpty()) { + throw die(MessageFormat + .format(CLIText.get().tagNotFound, tagName)); + } + } else { + TagCommand command = git.tag().setForceUpdate(force) + .setMessage(message).setName(tagName); - if (object != null) { - try (RevWalk walk = new RevWalk(db)) { - command.setObjectId(walk.parseAny(object)); + if (object != null) { + try (RevWalk walk = new RevWalk(db)) { + command.setObjectId(walk.parseAny(object)); + } + } + try { + command.call(); + } catch (RefAlreadyExistsException e) { + throw die(MessageFormat.format( + CLIText.get().tagAlreadyExists, tagName)); } - } - try { - command.call(); - } catch (RefAlreadyExistsException e) { - throw die(MessageFormat.format(CLIText.get().tagAlreadyExists, - tagName)); } } else { ListTagCommand command = git.tagList(); 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 4148cf65d..90c03e99b 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 @@ -269,6 +269,7 @@ public class CLIText extends TranslationBundle { /***/ public String switchedToBranch; /***/ public String tagAlreadyExists; /***/ public String tagLabel; + /***/ public String tagNotFound; /***/ public String taggerInfo; /***/ public String timeInMilliSeconds; /***/ public String tooManyRefsGiven;