diff --git a/src/main/java/org/eclipsefoundation/git/eca/model/Project.java b/src/main/java/org/eclipsefoundation/git/eca/model/Project.java index 2131223bf4c2cabf00418400efddfd39e0633995..31ebdc3af2dec65a740cd128d21b51d599b9ae3b 100644 --- a/src/main/java/org/eclipsefoundation/git/eca/model/Project.java +++ b/src/main/java/org/eclipsefoundation/git/eca/model/Project.java @@ -45,6 +45,8 @@ public abstract class Project { public abstract List<Repo> getGerritRepos(); public abstract Object getSpecProjectWorkingGroup(); + + public abstract GitlabProject getGitlab(); @Nullable @Memoized @@ -86,6 +88,8 @@ public abstract class Project { public abstract Builder setGerritRepos(List<Repo> gerritRepos); public abstract Builder setSpecProjectWorkingGroup(Object specProjectWorkingGroup); + + public abstract Builder setGitlab(GitlabProject gitlab); public abstract Project build(); } @@ -112,6 +116,28 @@ public abstract class Project { } } + @AutoValue + @JsonDeserialize(builder = AutoValue_Project_GitlabProject.Builder.class) + public static abstract class GitlabProject { + public abstract String getProjectGroup(); + + public abstract List<String> getIgnoredSubGroups(); + + public static Builder builder() { + return new AutoValue_Project_GitlabProject.Builder(); + } + + @AutoValue.Builder + @JsonPOJOBuilder(withPrefix = "set") + public abstract static class Builder { + public abstract Builder setProjectGroup(String projectGroup); + + public abstract Builder setIgnoredSubGroups(List<String> ignoredSubGroups); + + public abstract GitlabProject build(); + } + } + /** * Does not use autovalue as the value should be mutable. * diff --git a/src/main/java/org/eclipsefoundation/git/eca/resource/ValidationResource.java b/src/main/java/org/eclipsefoundation/git/eca/resource/ValidationResource.java index 9bc1c102314902ad15f2239ae83db4dc504f8b6a..7c55f68c51a1af3184a80c8c19c6cf01e751f1dd 100644 --- a/src/main/java/org/eclipsefoundation/git/eca/resource/ValidationResource.java +++ b/src/main/java/org/eclipsefoundation/git/eca/resource/ValidationResource.java @@ -9,6 +9,7 @@ package org.eclipsefoundation.git.eca.resource; import java.net.MalformedURLException; +import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -113,8 +114,8 @@ public class ValidationResource { filteredProjects.isEmpty() ? null : filteredProjects.get(0).getProjectId()); for (Commit c : req.getCommits()) { // get the current status if present - Optional<CommitValidationStatus> status = statuses.stream().filter(s -> c.getHash().equals(s.getCommitHash())) - .findFirst(); + Optional<CommitValidationStatus> status = statuses.stream() + .filter(s -> c.getHash().equals(s.getCommitHash())).findFirst(); // skip the commit validation if already passed if (status.isPresent() && status.get().getErrors().isEmpty()) { r.addMessage(c.getHash(), "Commit was previously validated, skipping processing", @@ -386,9 +387,11 @@ public class ValidationResource { // filter the projects based on the repo URL. At least one repo in project must // match the repo URL to be valid if (ProviderType.GITLAB.equals(req.getProvider())) { + // get the path of the project, removing the leading slash + String projectNamespace = URI.create(repoUrl).getPath().substring(1).toLowerCase(); return availableProjects.stream() - .filter(p -> p.getGitlabRepos().stream() - .anyMatch(re -> re.getUrl() != null && re.getUrl().endsWith(repoUrl))) + .filter(p -> projectNamespace.startsWith(p.getGitlab().getProjectGroup() + "/") && p.getGitlab() + .getIgnoredSubGroups().stream().noneMatch(sg -> projectNamespace.startsWith(sg + "/"))) .collect(Collectors.toList()); } else if (ProviderType.GITHUB.equals(req.getProvider())) { return availableProjects.stream() diff --git a/src/test/java/org/eclipsefoundation/git/eca/resource/ValidationResourceTest.java b/src/test/java/org/eclipsefoundation/git/eca/resource/ValidationResourceTest.java index a92fb96a48add25efd09f646822e67749c005f36..ee7500e71120b8d7aa27831f61511b194ebd7472 100644 --- a/src/test/java/org/eclipsefoundation/git/eca/resource/ValidationResourceTest.java +++ b/src/test/java/org/eclipsefoundation/git/eca/resource/ValidationResourceTest.java @@ -571,7 +571,7 @@ class ValidationResourceTest { commits.add(c1); ValidationRequest vr = ValidationRequest.builder().setStrictMode(false).setProvider(ProviderType.GITLAB) - .setRepoUrl(new URI("https://gitlab.eclipse.org/eclipse/dash/dash.handbook.test")).setCommits(commits) + .setRepoUrl(new URI("https://gitlab.eclipse.org/eclipse/dash-second/dash.handbook.test")).setCommits(commits) .build(); // test output w/ assertions // Should be valid as bots should only commit on their own projects (including aliases) @@ -579,7 +579,7 @@ class ValidationResourceTest { } @Test - void validateBotCommiterAccessGitlab_untracked() throws URISyntaxException { + void validateBotCommiterAccessGitlab_ignored() throws URISyntaxException { // set up test users GitUser g1 = GitUser.builder().setName("protobot-gh").setMail("2.bot-github@eclipse.org").build(); @@ -591,7 +591,7 @@ class ValidationResourceTest { commits.add(c1); ValidationRequest vr = ValidationRequest.builder().setStrictMode(false).setProvider(ProviderType.GITLAB) - .setRepoUrl(new URI("https://gitlab.eclipse.org/eclipse/dash/dash.handbook.untracked")) + .setRepoUrl(new URI("https://gitlab.eclipse.org/eclipse/dash/mirror/dash.handbook.untracked")) .setCommits(commits).build(); // test output w/ assertions // Should be valid as bots can commit on any untracked project (legacy support) @@ -611,7 +611,7 @@ class ValidationResourceTest { commits.add(c1); ValidationRequest vr = ValidationRequest.builder().setStrictMode(false).setProvider(ProviderType.GITLAB) - .setRepoUrl(new URI("https://gitlab.eclipse.org/eclipse/dash/dash.handbook.test")).setCommits(commits) + .setRepoUrl(new URI("https://gitlab.eclipse.org/eclipse/dash-second/dash.handbook.test")).setCommits(commits) .build(); // test output w/ assertions // Should be invalid as bots should only commit on their own projects diff --git a/src/test/java/org/eclipsefoundation/git/eca/test/api/MockProjectsAPI.java b/src/test/java/org/eclipsefoundation/git/eca/test/api/MockProjectsAPI.java index 14737a9c402546dc23b908422dacdfd38f51fe6a..c3bd456c4690b23442acad1f94ae8a8676e375d2 100644 --- a/src/test/java/org/eclipsefoundation/git/eca/test/api/MockProjectsAPI.java +++ b/src/test/java/org/eclipsefoundation/git/eca/test/api/MockProjectsAPI.java @@ -22,6 +22,7 @@ import javax.enterprise.context.ApplicationScoped; import org.eclipse.microprofile.rest.client.inject.RestClient; import org.eclipsefoundation.git.eca.api.ProjectsAPI; import org.eclipsefoundation.git.eca.model.Project; +import org.eclipsefoundation.git.eca.model.Project.GitlabProject; import org.eclipsefoundation.git.eca.model.Project.Repo; import org.eclipsefoundation.git.eca.model.Project.User; @@ -54,28 +55,32 @@ public class MockProjectsAPI implements ProjectsAPI { Repo r7 = new Repo(); r7.setUrl("https://gitlab.eclipse.org/eclipse/dash/dash.git"); Repo r8 = new Repo(); - r8.setUrl("https://gitlab.eclipse.org/eclipse/dash/dash.handbook.test"); + r8.setUrl("https://gitlab.eclipse.org/eclipse/dash-second/dash.handbook.test"); // sample users, correlates to users in Mock projects API User u1 = User.builder().setUrl("").setUsername("da_wizz").build(); User u2 = User.builder().setUrl("").setUsername("grunter").build(); + // projects Project p1 = Project.builder().setName("Sample project").setProjectId("sample.proj") .setSpecProjectWorkingGroup(Collections.emptyList()).setGithubRepos(Arrays.asList(r1, r2)) - .setGerritRepos(Arrays.asList(r5)).setCommitters(Arrays.asList(u1, u2)).build(); + .setGerritRepos(Arrays.asList(r5)).setCommitters(Arrays.asList(u1, u2)).setGitlab( + GitlabProject.builder().setIgnoredSubGroups(Collections.emptyList()).setProjectGroup("").build()).build(); src.add(p1); Project p2 = Project.builder().setName("Prototype thing").setProjectId("sample.proto") .setSpecProjectWorkingGroup(Collections.emptyList()).setGithubRepos(Arrays.asList(r3)) - .setGerritRepos(Arrays.asList(r6)).setGitlabRepos(Arrays.asList(r8)).setCommitters(Arrays.asList(u2)) + .setGerritRepos(Arrays.asList(r6)).setGitlabRepos(Arrays.asList(r8)).setCommitters(Arrays.asList(u2)).setGitlab( + GitlabProject.builder().setIgnoredSubGroups(Collections.emptyList()).setProjectGroup("eclipse/dash-second").build()) .build(); src.add(p2); Map<String, String> map = new HashMap<>(); map.put("id", "proj1"); Project p3 = Project.builder().setName("Spec project").setProjectId("spec.proj").setSpecProjectWorkingGroup(map) - .setGithubRepos(Arrays.asList(r4)).setGitlabRepos(Arrays.asList(r7)) + .setGithubRepos(Arrays.asList(r4)).setGitlabRepos(Arrays.asList(r7)).setGitlab( + GitlabProject.builder().setIgnoredSubGroups(Arrays.asList("eclipse/dash/mirror")).setProjectGroup("eclipse/dash").build()) .setCommitters(Arrays.asList(u1, u2)).build(); src.add(p3); }