From 6abbb77a95976acc5cedf5df2616ff97b5b01df5 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Thu, 12 Feb 2009 15:54:37 -0800 Subject: [PATCH] Add RefSpec.expandFromDestination for reverse mappings This makes it easy to loop through the destination's refs and see if any match up to a source name which doesn't actually exist in the set of available source refs. In such cases, we may want to delete the destination ref. Signed-off-by: Shawn O. Pearce Signed-off-by: Robin Rosenberg --- .../spearce/jgit/transport/RefSpecTestCase.java | 22 +++++++ .../src/org/spearce/jgit/transport/RefSpec.java | 73 ++++++++++++++++------ 2 files changed, 75 insertions(+), 20 deletions(-) diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/transport/RefSpecTestCase.java b/org.spearce.jgit.test/tst/org/spearce/jgit/transport/RefSpecTestCase.java index 341b4a48..11e7cdbe 100644 --- a/org.spearce.jgit.test/tst/org/spearce/jgit/transport/RefSpecTestCase.java +++ b/org.spearce.jgit.test/tst/org/spearce/jgit/transport/RefSpecTestCase.java @@ -232,4 +232,26 @@ public class RefSpecTestCase extends TestCase { assertEquals("HEAD", a.toString()); assertEquals("refs/heads/*:refs/remotes/origin/*", b.toString()); } + + public void testExpandFromDestination_NonWildcard() { + final String src = "refs/heads/master"; + final String dst = "refs/remotes/origin/master"; + final RefSpec a = new RefSpec(src + ":" + dst); + final RefSpec r = a.expandFromDestination(dst); + assertSame(a, r); + assertFalse(r.isWildcard()); + assertEquals(src, r.getSource()); + assertEquals(dst, r.getDestination()); + } + + public void testExpandFromDestination_Wildcard() { + final String src = "refs/heads/master"; + final String dst = "refs/remotes/origin/master"; + final RefSpec a = new RefSpec("refs/heads/*:refs/remotes/origin/*"); + final RefSpec r = a.expandFromDestination(dst); + assertNotSame(a, r); + assertFalse(r.isWildcard()); + assertEquals(src, r.getSource()); + assertEquals(dst, r.getDestination()); + } } diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/RefSpec.java b/org.spearce.jgit/src/org/spearce/jgit/transport/RefSpec.java index 521110b4..e75b272f 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/transport/RefSpec.java +++ b/org.spearce.jgit/src/org/spearce/jgit/transport/RefSpec.java @@ -135,24 +135,6 @@ public class RefSpec { } } - /** - * Expand a wildcard specification. - * - * @param p - * the wildcard specification we should base ourselves on. - * @param name - * actual name that matched the source of p. - */ - protected RefSpec(final RefSpec p, final String name) { - final String pdst = p.getDestination(); - if (p.getSource() == null || pdst == null) - throw new IllegalArgumentException("Cannot expand from " + p); - force = p.isForceUpdate(); - srcName = name; - dstName = pdst.substring(0, pdst.length() - 1) - + name.substring(p.getSource().length() - 1); - } - private RefSpec(final RefSpec p) { force = p.isForceUpdate(); wildcard = p.isWildcard(); @@ -349,7 +331,16 @@ public class RefSpec { * wildcard. */ public RefSpec expandFromSource(final String r) { - return isWildcard() ? new RefSpec(this, r) : this; + return isWildcard() ? new RefSpec(this).expandFromSourceImp(r) : this; + } + + private RefSpec expandFromSourceImp(final String name) { + final String psrc = srcName, pdst = dstName; + wildcard = false; + srcName = name; + dstName = pdst.substring(0, pdst.length() - 1) + + name.substring(psrc.length() - 1); + return this; } /** @@ -366,7 +357,49 @@ public class RefSpec { * wildcard. */ public RefSpec expandFromSource(final Ref r) { - return isWildcard() ? new RefSpec(this, r.getName()) : this; + return expandFromSource(r.getName()); + } + + /** + * Expand this specification to exactly match a ref name. + *

+ * Callers must first verify the passed ref name matches this specification, + * otherwise expansion results may be unpredictable. + * + * @param r + * a ref name that matched our destination specification. Could + * be a wildcard also. + * @return a new specification expanded from provided ref name. Result + * specification is wildcard if and only if provided ref name is + * wildcard. + */ + public RefSpec expandFromDestination(final String r) { + return isWildcard() ? new RefSpec(this).expandFromDstImp(r) : this; + } + + private RefSpec expandFromDstImp(final String name) { + final String psrc = srcName, pdst = dstName; + wildcard = false; + srcName = psrc.substring(0, psrc.length() - 1) + + name.substring(pdst.length() - 1); + dstName = name; + return this; + } + + /** + * Expand this specification to exactly match a ref. + *

+ * Callers must first verify the passed ref matches this specification, + * otherwise expansion results may be unpredictable. + * + * @param r + * a ref that matched our destination specification. + * @return a new specification expanded from provided ref name. Result + * specification is wildcard if and only if provided ref name is + * wildcard. + */ + public RefSpec expandFromDestination(final Ref r) { + return expandFromDestination(r.getName()); } private boolean match(final String refName, final String s) { -- 2.11.4.GIT