create-project: Bring back --permissions-only flag

If a project is permissions only, assign HEAD to point to
refs/meta/config. This way gitweb view of the project shows the
permissions history by default, and clients that clone the project
are able to get a detached HEAD pointing to the current permission
state, rather than an empty repository.

Change-Id: I194bfef1af9d00268de9c503ea986879f1fbaff9
This commit is contained in:
Shawn O. Pearce
2011-06-14 10:24:49 -07:00
parent 8b962b12e9
commit aaca9593f1
4 changed files with 94 additions and 4 deletions

View File

@@ -13,6 +13,7 @@ SYNOPSIS
[--branch <REF>] \ [--branch <REF>] \
[\--owner <GROUP> ...] \ [\--owner <GROUP> ...] \
[\--parent <NAME>] \ [\--parent <NAME>] \
[\--permissions-only] \
[\--description <DESC>] \ [\--description <DESC>] \
[\--submit-type <TYPE>] \ [\--submit-type <TYPE>] \
[\--use-content-merge] \ [\--use-content-merge] \
@@ -70,6 +71,11 @@ repository.*.createGroup will be used. If they don't exist,
through. If not specified, the parent is set to the default through. If not specified, the parent is set to the default
project `\-- All Projects \--`. project `\-- All Projects \--`.
\--permissions-only::
Create the project only to serve as a parent for other
projects. The new project's Git repository will be
initialized to have 'HEAD' point to 'refs/meta/config'.
\--description:: \--description::
Initial description of the project. If not specified, Initial description of the project. If not specified,
no description is stored. no description is stored.

View File

@@ -32,7 +32,7 @@ import java.util.List;
/** A version of the database schema. */ /** A version of the database schema. */
public abstract class SchemaVersion { public abstract class SchemaVersion {
/** The current schema version. */ /** The current schema version. */
private static final Class<? extends SchemaVersion> C = Schema_55.class; private static final Class<? extends SchemaVersion> C = Schema_56.class;
public static class Module extends AbstractModule { public static class Module extends AbstractModule {
@Override @Override

View File

@@ -0,0 +1,80 @@
// Copyright (C) 2011 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.server.schema;
import com.google.gerrit.reviewdb.Project;
import com.google.gerrit.reviewdb.ReviewDb;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.LocalDiskRepositoryManager;
import com.google.inject.Inject;
import com.google.inject.Provider;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefUpdate;
import org.eclipse.jgit.lib.Repository;
import java.io.IOException;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class Schema_56 extends SchemaVersion {
private final LocalDiskRepositoryManager mgr;
private final Set<String> keysOne;
private final Set<String> keysTwo;
@Inject
Schema_56(Provider<Schema_55> prior, LocalDiskRepositoryManager mgr) {
super(prior);
this.mgr = mgr;
keysOne = new HashSet<String>();
keysTwo = new HashSet<String>();
keysOne.add(GitRepositoryManager.REF_CONFIG);
keysTwo.add(GitRepositoryManager.REF_CONFIG);
keysTwo.add(Constants.HEAD);
}
@Override
protected void migrateData(ReviewDb db, UpdateUI ui) {
for (Project.NameKey name : mgr.list()) {
Repository git;
try {
git = mgr.openRepository(name);
} catch (RepositoryNotFoundException e) {
ui.message("warning: Cannot open " + name.get());
continue;
}
try {
Map<String, Ref> all = git.getAllRefs();
if (all.keySet().equals(keysOne) || all.keySet().equals(keysTwo)) {
try {
RefUpdate update = git.updateRef(Constants.HEAD);
update.disableRefLog();
update.link(GitRepositoryManager.REF_CONFIG);
} catch (IOException err) {
ui.message("warning: " + name.get() + ": Cannot update HEAD to "
+ GitRepositoryManager.REF_CONFIG + ": " + err.getMessage());
}
}
} finally {
git.close();
}
}
}
}

View File

@@ -70,6 +70,9 @@ final class CreateProject extends BaseCommand {
@Option(name = "--parent", aliases = {"-p"}, metaVar = "NAME", usage = "parent project") @Option(name = "--parent", aliases = {"-p"}, metaVar = "NAME", usage = "parent project")
private ProjectControl newParent; 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") @Option(name = "--description", aliases = {"-d"}, metaVar = "DESC", usage = "description of project")
private String projectDescription = ""; private String projectDescription = "";
@@ -141,20 +144,21 @@ final class CreateProject extends BaseCommand {
validateParameters(); validateParameters();
nameKey = new Project.NameKey(projectName); nameKey = new Project.NameKey(projectName);
String head = permissionsOnly ? GitRepositoryManager.REF_CONFIG : branch;
final Repository repo = repoManager.createRepository(nameKey); final Repository repo = repoManager.createRepository(nameKey);
try { try {
RefUpdate u = repo.updateRef(Constants.HEAD); RefUpdate u = repo.updateRef(Constants.HEAD);
u.disableRefLog(); u.disableRefLog();
u.link(branch); u.link(head);
createProject(); createProject();
repoManager.setProjectDescription(nameKey, projectDescription); repoManager.setProjectDescription(nameKey, projectDescription);
if (createEmptyCommit) { if (!permissionsOnly && createEmptyCommit) {
createEmptyCommit(repo, nameKey, branch); createEmptyCommit(repo, nameKey, branch);
} }
rq.replicateNewProject(nameKey, branch); rq.replicateNewProject(nameKey, head);
} finally { } finally {
repo.close(); repo.close();
} }