aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomasz Zarna2011-08-17 09:12:07 (EDT)
committerChris Aniszczyk2011-08-21 16:18:52 (EDT)
commit5f787bfd628cab29e262a67da821579b420466f8 (patch)
tree30069c3bd6b66d02f08a82561e816847e8f25cef
parent148595fb54265265a5409339d168ee2b8e2bfed1 (diff)
downloadjgit-5f787bfd628cab29e262a67da821579b420466f8.zip
jgit-5f787bfd628cab29e262a67da821579b420466f8.tar.gz
jgit-5f787bfd628cab29e262a67da821579b420466f8.tar.bz2
Add DeleteTagCommand to JGit APIrefs/changes/20/4020/2
Bug: 353226 Change-Id: I54ae237cab792742333a249eb5a774d5e1775af8 Signed-off-by: Chris Aniszczyk <caniszczyk@gmail.com>
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/api/TagCommandTest.java69
-rw-r--r--org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties1
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java1
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/api/DeleteTagCommand.java140
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java9
5 files changed, 220 insertions, 0 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/TagCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/TagCommandTest.java
index d4da87a..1db0381 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/TagCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/TagCommandTest.java
@@ -45,6 +45,8 @@ package org.eclipse.jgit.api;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
+import java.util.List;
+
import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
import org.eclipse.jgit.api.errors.InvalidTagNameException;
import org.eclipse.jgit.api.errors.JGitInternalException;
@@ -52,6 +54,8 @@ import org.eclipse.jgit.api.errors.NoHeadException;
import org.eclipse.jgit.api.errors.NoMessageException;
import org.eclipse.jgit.api.errors.WrongRepositoryStateException;
import org.eclipse.jgit.errors.UnmergedPathException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryTestCase;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevTag;
@@ -128,4 +132,69 @@ public class TagCommandTest extends RepositoryTestCase {
}
}
+ @Test
+ public void testDelete() throws Exception {
+ Git git = new Git(db);
+ git.commit().setMessage("initial commit").call();
+ RevTag tag = git.tag().setName("tag").call();
+ assertEquals(1, db.getTags().size());
+
+ List<String> deleted = git.tagDelete().setTags(tag.getTagName())
+ .call();
+ assertEquals(1, deleted.size());
+ assertEquals(tag.getTagName(),
+ Repository.shortenRefName(deleted.get(0)));
+ assertEquals(0, db.getTags().size());
+
+ RevTag tag1 = git.tag().setName("tag1").call();
+ RevTag tag2 = git.tag().setName("tag2").call();
+ assertEquals(2, db.getTags().size());
+ deleted = git.tagDelete()
+ .setTags(tag1.getTagName(), tag2.getTagName()).call();
+ assertEquals(2, deleted.size());
+ assertEquals(0, db.getTags().size());
+ }
+
+ @Test
+ public void testDeleteFullName() throws Exception {
+ Git git = new Git(db);
+ git.commit().setMessage("initial commit").call();
+ RevTag tag = git.tag().setName("tag").call();
+ assertEquals(1, db.getTags().size());
+
+ List<String> deleted = git.tagDelete()
+ .setTags(Constants.R_TAGS + tag.getTagName()).call();
+ assertEquals(1, deleted.size());
+ assertEquals(Constants.R_TAGS + tag.getTagName(), deleted.get(0));
+ assertEquals(0, db.getTags().size());
+ }
+
+ @Test
+ public void testDeleteEmptyTagNames() throws Exception {
+ Git git = new Git(db);
+ git.commit().setMessage("initial commit").call();
+
+ List<String> deleted = git.tagDelete().setTags().call();
+ assertEquals(0, deleted.size());
+ }
+
+ @Test
+ public void testDeleteNonExisting() throws Exception {
+ Git git = new Git(db);
+ git.commit().setMessage("initial commit").call();
+
+ List<String> deleted = git.tagDelete().setTags("tag").call();
+ assertEquals(0, deleted.size());
+ }
+
+ @Test
+ public void testDeleteBadName() throws Exception {
+ Git git = new Git(db);
+ git.commit().setMessage("initial commit").call();
+
+ List<String> deleted = git.tagDelete().setTags("bad~tag~name")
+ .call();
+ assertEquals(0, deleted.size());
+ }
+
}
diff --git a/org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties b/org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties
index 9cc0e02..480a659 100644
--- a/org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties
+++ b/org.eclipse.jgit/resources/org/eclipse/jgit/JGitText.properties
@@ -141,6 +141,7 @@ daemonAlreadyRunning=Daemon already running
daysAgo={0} days ago
deleteBranchUnexpectedResult=Delete branch returned unexpected result {0}
deleteFileFailed=Could not delete file {0}
+deleteTagUnexpectedResult=Delete tag returned unexpected result {0}
deletingNotSupported=Deleting {0} not supported.
destinationIsNotAWildcard=Destination is not a wildcard.
detachedHeadDetected=HEAD is detached
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java
index 3b645e8..8496c7e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/JGitText.java
@@ -201,6 +201,7 @@ public class JGitText extends TranslationBundle {
/***/ public String daysAgo;
/***/ public String deleteBranchUnexpectedResult;
/***/ public String deleteFileFailed;
+ /***/ public String deleteTagUnexpectedResult;
/***/ public String deletingNotSupported;
/***/ public String destinationIsNotAWildcard;
/***/ public String detachedHeadDetected;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/DeleteTagCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/DeleteTagCommand.java
new file mode 100644
index 0000000..1aae638
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/DeleteTagCommand.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2011, Tomasz Zarna <Tomasz.Zarna@pl.ibm.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ * names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.api;
+
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jgit.JGitText;
+import org.eclipse.jgit.api.errors.JGitInternalException;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.RefUpdate.Result;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Used to delete one or several tags.
+ *
+ * The result of {@link #call()} is a list with the (full) names of the deleted
+ * tags.
+ *
+ * @see <a href="http://www.kernel.org/pub/software/scm/git/docs/git-tag.html"
+ * >Git documentation about Tag</a>
+ */
+public class DeleteTagCommand extends GitCommand<List<String>> {
+
+ private final Set<String> tags = new HashSet<String>();
+
+ /**
+ * @param repo
+ */
+ protected DeleteTagCommand(Repository repo) {
+ super(repo);
+ }
+
+ /**
+ * @throws JGitInternalException
+ * when trying to delete a tag that doesn't exist
+ *
+ * @return the list with the full names of the deleted tags
+ */
+ public List<String> call() throws JGitInternalException {
+ checkCallable();
+ List<String> result = new ArrayList<String>();
+ if (tags.isEmpty())
+ return result;
+ try {
+ setCallable(false);
+ for (String tagName : tags) {
+ if (tagName == null)
+ continue;
+ Ref currentRef = repo.getRef(tagName);
+ if (currentRef == null)
+ continue;
+ String fullName = currentRef.getName();
+ RefUpdate update = repo.updateRef(fullName);
+ update.setForceUpdate(true);
+ Result deleteResult = update.delete();
+
+ boolean ok = true;
+ switch (deleteResult) {
+ case IO_FAILURE:
+ case LOCK_FAILURE:
+ case REJECTED:
+ ok = false;
+ break;
+ default:
+ break;
+ }
+
+ if (ok) {
+ result.add(fullName);
+ } else
+ throw new JGitInternalException(MessageFormat.format(
+ JGitText.get().deleteTagUnexpectedResult,
+ deleteResult.name()));
+ }
+ return result;
+ } catch (IOException ioe) {
+ throw new JGitInternalException(ioe.getMessage(), ioe);
+ }
+ }
+
+ /**
+ * @param tags
+ * the names of the tags to delete; if not set, this will do
+ * nothing; invalid tag names will simply be ignored
+ * @return this instance
+ */
+ public DeleteTagCommand setTags(String... tags) {
+ checkCallable();
+ this.tags.clear();
+ for (String tagName : tags)
+ this.tags.add(tagName);
+ return this;
+ }
+}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java
index 9a522c1..6149bfe 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java
@@ -495,6 +495,15 @@ public class Git {
}
/**
+ * Returns a command object used to delete tags
+ *
+ * @return a {@link DeleteBranchCommand}
+ */
+ public DeleteTagCommand tagDelete() {
+ return new DeleteTagCommand(repo);
+ }
+
+ /**
* @return the git repository this class is interacting with
*/
public Repository getRepository() {