diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ValidRefNameTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ValidRefNameTest.java index e9d46bb58..9c85fbe1e 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ValidRefNameTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ValidRefNameTest.java @@ -247,4 +247,86 @@ public void testWindowsReservedNames() { assertValid(true, "refs/heads/conx"); assertValid(true, "refs/heads/xcon"); } + + @Test + public void testNormalizeBranchName() { + + assertEquals(true, Repository.normalizeBranchName("").equals("")); + + assertEquals(true, + Repository.normalizeBranchName("__@#$@#$@$____ _") + .equals("")); + + assertEquals(true, + Repository.normalizeBranchName("~`!@#$%^&*()_+}]{[|\\\";?>.<,/") + .equals("")); + + assertEquals(true, + Repository.normalizeBranchName("Bug 12345 :::: Hello World") + .equals("Bug_12345-Hello_World")); + + assertEquals(true, + Repository.normalizeBranchName("Bug 12345 :::: Hello::: World") + .equals("Bug_12345-Hello-_World")); + + assertEquals(true, + Repository.normalizeBranchName(":::Bug 12345 - Hello World") + .equals("Bug_12345-Hello_World")); + + assertEquals(true, + Repository.normalizeBranchName("---Bug 12345 - Hello World") + .equals("Bug_12345-Hello_World")); + + assertEquals(true, + Repository.normalizeBranchName("Bug 12345 ---- Hello --- World") + .equals("Bug_12345-Hello-World")); + + assertEquals(true, Repository.normalizeBranchName(null) == null); + + assertEquals(true, + Repository.normalizeBranchName("Bug 12345 - Hello World!") + .equals("Bug_12345-Hello_World")); + + assertEquals(true, + Repository.normalizeBranchName("Bug 12345 : Hello World!") + .equals("Bug_12345-Hello_World")); + + assertEquals(true, + Repository.normalizeBranchName("Bug 12345 _ Hello World!") + .equals("Bug_12345_Hello_World")); + + assertEquals(true, + Repository + .normalizeBranchName("Bug 12345 - Hello World!") + .equals("Bug_12345-Hello_World")); + + assertEquals(true, + Repository.normalizeBranchName(" Bug 12345 - Hello World! ") + .equals("Bug_12345-Hello_World")); + + assertEquals(true, + Repository + .normalizeBranchName(" Bug 12345 - Hello World! ") + .equals("Bug_12345-Hello_World")); + + assertEquals(true, + Repository + .normalizeBranchName( + "Bug 12345 - Hello______ World!") + .equals("Bug_12345-Hello_World")); + + assertEquals(true, + Repository.normalizeBranchName("_Bug 12345 - Hello World!") + .equals("Bug_12345-Hello_World")); + + assertEquals(true, + Repository + .normalizeBranchName( + "Bug 12345 - Hello Wo!@#$%^&*(rld {@") + .equals("Bug_12345-Hello_World_")); + + assertEquals(true, + Repository.normalizeBranchName("Bug 1#$ 2345 - Hello World") + .equals("Bug_12345-Hello_World")); + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java index c5b2ef8e5..641262cd5 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java @@ -4,6 +4,7 @@ * Copyright (C) 2006-2010, Robin Rosenberg * Copyright (C) 2006-2012, Shawn O. Pearce * Copyright (C) 2012, Daniel Megert + * Copyright (C) 2017, Wim Jongman * and other copyright owners as documented in the project's IP log. * * This program and the accompanying materials are made available @@ -1887,4 +1888,40 @@ public Set getRemoteNames() { public void autoGC(ProgressMonitor monitor) { // default does nothing } + + /** + * Normalizes the passed branch name into a possible valid branch name. The + * validity of the returned name should be checked by a subsequent call to + * {@link #isValidRefName(String)}. + *

+ * Future implementations of this method could be more restrictive or more + * lenient about the validity of specific characters in the returned name. + *

+ * The current implementation returns a trimmed string only containing word + * characters ([a-zA-Z_0-9]) and hyphens ('-'). Colons are replaced by + * hyphens. Repeating underscores and hyphens are replaced by a single + * occurrence. Underscores and hyphens at the beginning of the string are + * removed. + * + * @param name + * The name to normalize. + * + * @return The normalized String or null if null was passed. + * @since 4.7 + * @see #isValidRefName(String) + */ + public static String normalizeBranchName(String name) { + if (name == null || name.length() == 0) { + return name; + } + String result = name.trim(); + return result.replaceAll("\\s+([_:-])*?\\s+", "$1") //$NON-NLS-1$//$NON-NLS-2$ + .replaceAll(":", "-") //$NON-NLS-1$//$NON-NLS-2$ + .replaceAll("\\s+", "_") //$NON-NLS-1$//$NON-NLS-2$ + .replaceAll("_{2,}", "_") //$NON-NLS-1$//$NON-NLS-2$ + .replaceAll("-{2,}", "-") //$NON-NLS-1$//$NON-NLS-2$ + .replaceAll("[^\\w-]", "") //$NON-NLS-1$ //$NON-NLS-2$ + .replaceAll("^_+", "") //$NON-NLS-1$//$NON-NLS-2$ + .replaceAll("^-+", ""); //$NON-NLS-1$//$NON-NLS-2$ + } }