From 1556ca740b75661a2670ddcb581dafced3010bae Mon Sep 17 00:00:00 2001 From: Stefan Beller Date: Thu, 21 Jul 2016 14:21:57 -0700 Subject: [PATCH] RefSpec: reject refs ending in '/' We had a case in Gerrits superproject subscriptions where 'refs/heads/' was configured with the intention to mean 'refs/heads/*'. The first expression lacks the '*', which is why it is not considered a wildcard but it was considered valid and so was not found early to be a typo. Refs are not allowed to end with '/' anyway, so add a check for that. Change-Id: I3ffdd9002146382acafb4fbc310a64af4cc1b7a9 Signed-off-by: Stefan Beller --- .../tst/org/eclipse/jgit/transport/RefSpecTest.java | 10 ++++++++++ .../src/org/eclipse/jgit/transport/RefSpec.java | 2 ++ 2 files changed, 12 insertions(+) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/RefSpecTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/RefSpecTest.java index 4f833509d..b14b0b334 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/RefSpecTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/RefSpecTest.java @@ -408,6 +408,16 @@ public void testWildcardAtStart() { assertEquals("foo/head", c.getSource()); } + @Test(expected = IllegalArgumentException.class) + public void invalidWhenSourceEndsWithSlash() { + assertNotNull(new RefSpec("refs/heads/")); + } + + @Test(expected = IllegalArgumentException.class) + public void invalidWhenDestinationEndsWithSlash() { + assertNotNull(new RefSpec("refs/heads/master:refs/heads/")); + } + @Test(expected = IllegalArgumentException.class) public void invalidWhenSourceOnlyAndWildcard() { assertNotNull(new RefSpec("refs/heads/*")); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefSpec.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefSpec.java index 0e803bdaf..cbc6cc021 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefSpec.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefSpec.java @@ -453,6 +453,8 @@ private static boolean isValid(final String s) { return false; if (s.contains("//")) //$NON-NLS-1$ return false; + if (s.endsWith("/")) //$NON-NLS-1$ + return false; int i = s.indexOf('*'); if (i != -1) { if (s.indexOf('*', i + 1) > i)