diff --git a/src/main/java/ch/trick17/gitlabtools/cmd/CheckoutCmd.java b/src/main/java/ch/trick17/gitlabtools/cmd/CheckoutCmd.java index dce2c8a..1408afd 100644 --- a/src/main/java/ch/trick17/gitlabtools/cmd/CheckoutCmd.java +++ b/src/main/java/ch/trick17/gitlabtools/cmd/CheckoutCmd.java @@ -39,7 +39,7 @@ protected void executeTasks() throws Exception { var projects = getProjects(); System.out.println("Checking out " + projects.size() + " projects..."); for (var project : projects) { - var repoDir = destDir.resolve(project.getName()); + var repoDir = destDir.resolve(project.getPathWithNamespace()); var branch = requireNonNullElse(args.getBranch(), project.getDefaultBranch()); for (int attempts = ATTEMPTS; attempts-- > 0; ) { diff --git a/src/main/java/ch/trick17/gitlabtools/cmd/CmdForProjects.java b/src/main/java/ch/trick17/gitlabtools/cmd/CmdForProjects.java index 5fc317d..333ae0e 100644 --- a/src/main/java/ch/trick17/gitlabtools/cmd/CmdForProjects.java +++ b/src/main/java/ch/trick17/gitlabtools/cmd/CmdForProjects.java @@ -2,11 +2,15 @@ import com.lexicalscope.jewel.cli.Option; import org.gitlab4j.api.GitLabApiException; +import org.gitlab4j.api.models.Group; +import org.gitlab4j.api.models.GroupFilter; import org.gitlab4j.api.models.Project; import java.io.IOException; import java.nio.file.Path; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Stream; @@ -30,14 +34,21 @@ protected final List getProjects() throws GitLabApiException, IOExcepti } private List getProjectsFromGitLab() throws GitLabApiException, IOException { + final List descendants = gitlab.getGroupApi().getDescendantGroups(args.getGroup(), new GroupFilter().withAllAvailable(true)); var projects = gitlab.getGroupApi().getProjectsStream(args.getGroup()) - .sorted(comparing(Project::getName)); + .sorted(comparing(Project::getPathWithNamespace)); + for (Group descendant : descendants) { + projects = Stream.concat(projects, gitlab.getGroupApi().getProjectsStream(descendant)) + .sorted(comparing(Project::getPathWithNamespace)); + } + if (args.getCourseFile() != null) { projects = filter(projects); } return projects.collect(toList()); } + private Stream filter(Stream projects) throws IOException { var names = Set.copyOf(readSimpleCourseFile(Path.of(args.getCourseFile()))); return projects.filter(args.isWithProjectNamePrefix()