create-project: Add --permissions-only option

The new --permissions-only option permits creating a project only
for use as a parent of other projects, for permissions inheritance.
This bypasses the creation of an otherwise empty git repository in
the server's repository forest.

Bug: issue 613
Change-Id: I86c53b11597a3d0cddfae01b2195944b458727a1
Signed-off-by: Shawn O. Pearce <sop@google.com>
diff --git a/Documentation/cmd-create-project.txt b/Documentation/cmd-create-project.txt
index 3da01c4..099008d 100644
--- a/Documentation/cmd-create-project.txt
+++ b/Documentation/cmd-create-project.txt
@@ -13,6 +13,7 @@
 [--branch <REF>] \
 [\--owner <GROUP> ...] \
 [\--parent <NAME>] \
+[\--permissions-only] \
 [\--description <DESC>] \
 [\--submit-type <TYPE>] \
 [\--use-contributor-agreements] \
@@ -68,6 +69,11 @@
 	through. If not specified, the parent is set to the default
 	project `\-- All Projects \--`.
 
+\--permissions-only::
+	Create the project only to serve as a parent for other
+	projects.  The new project's Git repository will not be
+	initialized, and cannot be cloned.
+
 \--description::
 	Initial description of the project.  If not specified,
 	no description is stored.
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProject.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProject.java
index a237aa8..80f2c1f 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProject.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProject.java
@@ -55,6 +55,9 @@
   @Option(name = "--parent", aliases = {"-p"}, metaVar = "NAME", usage = "parent project")
   private ProjectControl newParent;
 
+  @Option(name = "--permissions-only", usage = "create project for use only as parent")
+  private boolean permissionsOnly;
+
   @Option(name = "--description", aliases = {"-d"}, metaVar = "DESC", usage = "description of project")
   private String projectDescription = "";
 
@@ -104,21 +107,28 @@
         try {
           validateParameters();
 
-          Repository repo = repoManager.createRepository(projectName);
-          try {
-            repo.create(true);
+          if (!permissionsOnly) {
+            Repository repo = repoManager.createRepository(projectName);
+            try {
+              repo.create(true);
 
-            RefUpdate u = repo.updateRef(Constants.HEAD);
-            u.disableRefLog();
-            u.link(branch);
+              RefUpdate u = repo.updateRef(Constants.HEAD);
+              u.disableRefLog();
+              u.link(branch);
 
-            repoManager.setProjectDescription(projectName, projectDescription);
+              repoManager
+                  .setProjectDescription(projectName, projectDescription);
 
-            createProject();
+              rq.replicateNewProject(new Project.NameKey(projectName), branch);
+            } finally {
+              repo.close();
+            }
+          }
 
+          createProject();
+
+          if (!permissionsOnly) {
             rq.replicateNewProject(new Project.NameKey(projectName), branch);
-          } finally {
-            repo.close();
           }
         } catch (Exception e) {
           p.print("Error when trying to create project: " + e.getMessage()