Merge branch 'stable-3.2' into stable-3.3 * stable-3.2: Introduce an optional configuration to define a regex for naming rules Change-Id: Ia493f7b3b219547e8cc2197d99758e73ab476067
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/Configuration.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/Configuration.java index 1a3570d..a74c4cb 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/Configuration.java +++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/Configuration.java
@@ -33,6 +33,7 @@ private final int indexThreads; private final int sshCommandTimeout; private final int sshConnectionTimeout; + private final String renameRegex; private final Set<String> urls; @@ -42,6 +43,7 @@ indexThreads = cfg.getInt("indexThreads", 4); sshCommandTimeout = cfg.getInt("sshCommandTimeout", 0); sshConnectionTimeout = cfg.getInt("sshConnectionTimeout", DEFAULT_SSH_CONNECTION_TIMEOUT_MS); + renameRegex = cfg.getString("renameRegex", ".+"); urls = Arrays.stream(cfg.getStringList(URL_KEY)) @@ -66,4 +68,8 @@ public int getSshConnectionTimeout() { return sshConnectionTimeout; } + + public String getRenameRegex() { + return renameRegex; + } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameProject.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameProject.java index f4a5418..0cf1ca4 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameProject.java +++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameProject.java
@@ -151,6 +151,14 @@ } } + private void assertNewNameMatchesRegex(Input input) throws BadRequestException { + if (!input.name.matches(cfg.getRenameRegex())) { + throw new BadRequestException( + String.format( + "Name of the repo should match the expected regex: %s", cfg.getRenameRegex())); + } + } + private void assertRenamePermission(ProjectResource rsrc) throws AuthException { if (!canRename(rsrc)) { throw new AuthException("Not allowed to rename project"); @@ -195,6 +203,7 @@ pm.ifPresent(progressMonitor -> progressMonitor.beginTask("Checking preconditions")); assertNewNameNotNull(input); + assertNewNameMatchesRegex(input); assertRenamePermission(rsrc); renamePreconditions.assertCanRename(rsrc, Project.nameKey(input.name)); log.debug("Rename preconditions check successful.");
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md index 7a5faeb..80872a1 100644 --- a/src/main/resources/Documentation/config.md +++ b/src/main/resources/Documentation/config.md
@@ -43,3 +43,14 @@ the client waits indefinitely. By default, 0. * `sshConnectionTimeout` : Timeout for SSH connections in minutes. If 0, there is no timeout, and the client waits indefinitely. By default, 2 minutes. + +Also, this plugin offers a way to restrict the new names of the projects to match an optionally +configured regex. For example: + +``` + [plugin "@PLUGIN@"] + renameRegex = [a-z0-9]+ +``` + +In this example the new names for projects will be restricted to only non-capital letters and +numbers.
diff --git a/src/test/java/com/googlesource/gerrit/plugins/renameproject/RenameIT.java b/src/test/java/com/googlesource/gerrit/plugins/renameproject/RenameIT.java index 7b41fb2..c436745 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/renameproject/RenameIT.java +++ b/src/test/java/com/googlesource/gerrit/plugins/renameproject/RenameIT.java
@@ -58,6 +58,7 @@ private static final String CACHE_NAME = "changeid_project"; private static final String REPLICATION_OPTION = "--replication"; private static final String URL = "ssh://localhost:29418"; + private static final String RENAME_REGEX = "[a-zA-Z]+"; @Inject private RequestScopeOperations requestScopeOperations; @@ -254,6 +255,32 @@ assertThat(projectState.isPresent()).isFalse(); } + @Test + @UseLocalDisk + @GerritConfig(name = "plugin.rename-project.renameRegex", value = RENAME_REGEX) + public void testRenameViaHttpWithNonMatchingNameFail() throws Exception { + createChange(); + RestResponse r = renameProjectTo(NEW_PROJECT_NAME + "1"); + r.assertBadRequest(); + + Optional<ProjectState> projectState = projectCache.get(Project.nameKey(NEW_PROJECT_NAME)); + assertThat(projectState.isPresent()).isFalse(); + } + + @Test + @UseLocalDisk + @GerritConfig(name = "plugin.rename-project.renameRegex", value = RENAME_REGEX) + public void testRenameViaHttpWithMatchingNameSuccess() throws Exception { + createChange(); + RestResponse r = renameProjectTo(NEW_PROJECT_NAME); + r.assertOK(); + + Optional<ProjectState> projectState = projectCache.get(Project.nameKey(NEW_PROJECT_NAME)); + assertThat(projectState.isPresent()).isTrue(); + assertThat(queryProvider.get().byProject(project)).isEmpty(); + assertThat(queryProvider.get().byProject(Project.nameKey(NEW_PROJECT_NAME))).isNotEmpty(); + } + private RestResponse renameProjectTo(String newName) throws Exception { requestScopeOperations.setApiUser(user.id()); sender.clear();