Reuse REST code to list child projects in AdminSetParent
For 'set-project-parent --children-of PROJECT' AdminSetParent needs to
list the child projects of PROJECT. To do this use the REST endpoint
for listing child projects instead of having an own implementation for
computing the child projects in AdminSetParent.
Change-Id: Ic557623842f743c440df4bba0dfe713bd7d52ba1
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCache.java
index e7f2e3a..0e5cecb 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCache.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCache.java
@@ -47,6 +47,9 @@
/** Invalidate the cached information about the given project. */
public void evict(Project p);
+ /** Invalidate the cached information about the given project. */
+ public void evict(Project.NameKey p);
+
/**
* Remove information about the given project from the cache. It will no
* longer be returned from {@link #all()}.
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java
index 58af4e1..8ccbca3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java
@@ -142,6 +142,13 @@
}
}
+ /** Invalidate the cached information about the given project. */
+ public void evict(final Project.NameKey p) {
+ if (p != null) {
+ byName.invalidate(p.get());
+ }
+ }
+
@Override
public void remove(final Project p) {
listLock.lock();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectResource.java
index 39a5187..f4449f0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectResource.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectResource.java
@@ -25,7 +25,7 @@
private final ProjectControl control;
- ProjectResource(ProjectControl control) {
+ public ProjectResource(ProjectControl control) {
this.control = control;
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java b/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java
index 504d2d6..117c57b 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java
@@ -106,6 +106,11 @@
}
@Override
+ public void evict(Project.NameKey p) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public void remove(Project p) {
throw new UnsupportedOperationException();
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java
index 919a5a7..968d661 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java
@@ -429,6 +429,10 @@
}
@Override
+ public void evict(Project.NameKey p) {
+ }
+
+ @Override
public void remove(Project p) {
}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminSetParent.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminSetParent.java
index faf2224..e83963a 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminSetParent.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminSetParent.java
@@ -17,18 +17,23 @@
import com.google.common.base.Function;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.extensions.annotations.RequiresCapability;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.git.MetaDataUpdate;
import com.google.gerrit.server.git.ProjectConfig;
+import com.google.gerrit.server.project.ListChildProjects;
import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.project.ProjectControl;
+import com.google.gerrit.server.project.ProjectJson.ProjectInfo;
+import com.google.gerrit.server.project.ProjectResource;
import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.sshd.CommandMetaData;
import com.google.gerrit.sshd.SshCommand;
import com.google.inject.Inject;
+import com.google.inject.Provider;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
@@ -73,6 +78,9 @@
@Inject
private AllProjectsName allProjectsName;
+ @Inject
+ private Provider<ListChildProjects> listChildProjects;
+
private Project.NameKey newParentKey = null;
@Override
@@ -108,17 +116,16 @@
}
}
- final List<Project> childProjects = new ArrayList<Project>();
+ final List<Project.NameKey> childProjects = Lists.newArrayList();
for (final ProjectControl pc : children) {
- childProjects.add(pc.getProject());
+ childProjects.add(pc.getProject().getNameKey());
}
if (oldParent != null) {
childProjects.addAll(getChildrenForReparenting(oldParent));
}
- for (final Project project : childProjects) {
- final String name = project.getName();
- final Project.NameKey nameKey = project.getNameKey();
+ for (final Project.NameKey nameKey : childProjects) {
+ final String name = nameKey.get();
if (allProjectsName.equals(nameKey)) {
// Don't allow the wild card project to have a parent.
@@ -159,7 +166,7 @@
err.append("error: " + msg + "\n");
}
- projectCache.evict(project);
+ projectCache.evict(nameKey);
}
if (err.length() > 0) {
@@ -175,8 +182,8 @@
* reparented. The returned list of child projects does not contain projects
* that were specified to be excluded from reparenting.
*/
- private List<Project> getChildrenForReparenting(final ProjectControl parent) {
- final List<Project> childProjects = new ArrayList<Project>();
+ private List<Project.NameKey> getChildrenForReparenting(final ProjectControl parent) {
+ final List<Project.NameKey> childProjects = Lists.newArrayList();
final List<Project.NameKey> excluded =
new ArrayList<Project.NameKey>(excludedChildren.size());
for (final ProjectControl excludedChild : excludedChildren) {
@@ -187,11 +194,12 @@
if (newParentKey != null) {
automaticallyExcluded.addAll(getAllParents(newParentKey));
}
- for (final Project child : getChildren(parent.getProject().getNameKey())) {
- final Project.NameKey childName = child.getNameKey();
+ for (final ProjectInfo child : listChildProjects.get().apply(
+ new ProjectResource(parent))) {
+ final Project.NameKey childName = new Project.NameKey(child.name);
if (!excluded.contains(childName)) {
if (!automaticallyExcluded.contains(childName)) {
- childProjects.add(child);
+ childProjects.add(childName);
} else {
stdout.println("Automatically excluded '" + childName + "' " +
"from reparenting because it is in the parent " +
@@ -213,20 +221,4 @@
}
}));
}
-
- private List<Project> getChildren(final Project.NameKey parentName) {
- final List<Project> childProjects = new ArrayList<Project>();
- for (final Project.NameKey projectName : projectCache.all()) {
- final ProjectState e = projectCache.get(projectName);
- if (e == null) {
- // If we can't get it from the cache, pretend it's not present.
- continue;
- }
-
- if (parentName.equals(e.getProject().getParent(allProjectsName))) {
- childProjects.add(e.getProject());
- }
- }
- return childProjects;
- }
}