diff options
author | Kohsuke Kawaguchi <kk@kohsuke.org> | 2013-07-25 10:42:22 -0700 |
---|---|---|
committer | Matthias Sohn <matthias.sohn@sap.com> | 2013-09-27 12:37:36 +0200 |
commit | f045a68a78f251af836c6b0a18a22a6d9e5f55a0 (patch) | |
tree | ae3f07d6114a1f141b838fde878aad7e613707de /org.eclipse.jgit.test/tst | |
parent | 570bba5e7acb08df827655c31045bfe9cde9d856 (diff) | |
download | jgit-f045a68a78f251af836c6b0a18a22a6d9e5f55a0.tar.gz jgit-f045a68a78f251af836c6b0a18a22a6d9e5f55a0.zip |
Added the git-describe implementation
CQ: 7609
Bug: 339246
Change-Id: I689bc0578ce3a430b9800ad84122e221c69829f4
Signed-off-by: Kohsuke Kawaguchi <kk@kohsuke.org>
Also-By: Robin Stocker<robin@nibor.org>
Also-By: Matthias Sohn <matthias.sohn@sap.com>
Also-By: Christian Halstrick <christian.halstrick@sap.com>
Diffstat (limited to 'org.eclipse.jgit.test/tst')
-rw-r--r-- | org.eclipse.jgit.test/tst/org/eclipse/jgit/api/DescribeCommandTest.java | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/DescribeCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/DescribeCommandTest.java new file mode 100644 index 0000000000..88f6108926 --- /dev/null +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/DescribeCommandTest.java @@ -0,0 +1,242 @@ +/* + * Copyright (C) 2013, CloudBees, Inc. + * 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 org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.junit.RepositoryTestCase; +import org.eclipse.jgit.lib.ObjectId; +import org.junit.Test; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +import static org.junit.Assert.*; + +public class DescribeCommandTest extends RepositoryTestCase { + + private Git git; + + @Override + public void setUp() throws Exception { + super.setUp(); + git = new Git(db); + } + + @Test(expected = IllegalArgumentException.class) + public void noTargetSet() throws Exception { + git.describe().call(); + } + + @Test + public void testDescribe() throws Exception { + ObjectId c1 = modify("aaa"); + + ObjectId c2 = modify("bbb"); + tag("t1"); + + ObjectId c3 = modify("ccc"); + tag("t2"); + + ObjectId c4 = modify("ddd"); + + assertNull(describe(c1)); + assertEquals("t1", describe(c2)); + assertEquals("t2", describe(c3)); + + assertNameStartsWith(c4, "3e563c5"); + // the value verified with git-describe(1) + assertEquals("t2-1-g3e563c5", describe(c4)); + } + + /** + * Make sure it finds a tag when not all ancestries include a tag. + * + * <pre> + * c1 -+-> T - + * | | + * +-> c3 -+-> c4 + * </pre> + * + * @throws Exception + */ + @Test + public void testDescribeBranch() throws Exception { + ObjectId c1 = modify("aaa"); + + ObjectId c2 = modify("bbb"); + tag("t"); + + branch("b", c1); + + ObjectId c3 = modify("ccc"); + + ObjectId c4 = merge(c2); + + assertNameStartsWith(c4, "119892b"); + assertEquals("t-2-g119892b", describe(c4)); // 2 commits: c4 and c3 + assertNull(describe(c3)); + } + + private void branch(String name, ObjectId base) throws GitAPIException { + git.checkout().setCreateBranch(true).setName(name) + .setStartPoint(base.name()).call(); + } + + /** + * When t2 dominates t1, it's clearly preferable to describe by using t2. + * + * <pre> + * t1 -+-> t2 - + * | | + * +-> c3 -+-> c4 + * </pre> + * + * @throws Exception + */ + @Test + public void t1DominatesT2() throws Exception { + ObjectId c1 = modify("aaa"); + tag("t1"); + + ObjectId c2 = modify("bbb"); + tag("t2"); + + branch("b", c1); + + ObjectId c3 = modify("ccc"); + + ObjectId c4 = merge(c2); + + assertNameStartsWith(c4, "119892b"); + assertEquals("t2-2-g119892b", describe(c4)); // 2 commits: c4 and c3 + + assertNameStartsWith(c3, "0244e7f"); + assertEquals("t1-1-g0244e7f", describe(c3)); + } + + /** + * When t1 is nearer than t2, t2 should be found + * + * <pre> + * c1 -+-> c2 -> t1 -+ + * | | + * +-> t2 -> c3 -+-> c4 + * </pre> + * + * @throws Exception + */ + @Test + public void t1nearerT2() throws Exception { + ObjectId c1 = modify("aaa"); + modify("bbb"); + ObjectId t1 = modify("ccc"); + tag("t1"); + + branch("b", c1); + modify("ddd"); + tag("t2"); + modify("eee"); + ObjectId c4 = merge(t1); + + assertNameStartsWith(c4, "bb389a4"); + assertEquals("t1-3-gbb389a4", describe(c4)); + } + + /** + * When t1 and t2 have same depth native git seems to add the depths of both + * paths + * + * <pre> + * c1 -+-> t1 -> c2 -+ + * | | + * +-> t2 -> c3 -+-> c4 + * </pre> + * + * @throws Exception + */ + @Test + public void t1sameDepthT2() throws Exception { + ObjectId c1 = modify("aaa"); + modify("bbb"); + tag("t1"); + ObjectId c2 = modify("ccc"); + + branch("b", c1); + modify("ddd"); + tag("t2"); + modify("eee"); + ObjectId c4 = merge(c2); + + assertNameStartsWith(c4, "bb389a4"); + assertEquals("t2-4-gbb389a4", describe(c4)); + } + + private ObjectId merge(ObjectId c2) throws GitAPIException { + return git.merge().include(c2).call().getNewHead(); + } + + private ObjectId modify(String content) throws Exception { + File a = new File(db.getWorkTree(), "a.txt"); + touch(a, content); + return git.commit().setAll(true).setMessage(content).call().getId(); + } + + private void tag(String tag) throws GitAPIException { + git.tag().setName(tag).setMessage(tag).call(); + } + + private static void touch(File f, String contents) throws Exception { + FileWriter w = new FileWriter(f); + w.write(contents); + w.close(); + } + + private String describe(ObjectId c1) throws GitAPIException, IOException { + return git.describe().setTarget(c1).call(); + } + + private static void assertNameStartsWith(ObjectId c4, String prefix) { + assertTrue(c4.name(), c4.name().startsWith(prefix)); + } +} |