diff options
author | Shawn O. Pearce <sop@google.com> | 2009-11-02 11:25:34 -0800 |
---|---|---|
committer | Shawn O. Pearce <sop@google.com> | 2009-11-02 11:25:34 -0800 |
commit | a8b019eef15f7a7b1379a48bd88cfc0169df60f6 (patch) | |
tree | 007fc7bae09da9a5780095462bf371c85f1ad20d | |
parent | 807941f2950d47762e82ae73a447e8bf77bbf87e (diff) |
Remove the branches table from the database
This table is actually unnecessary, and causes some confusion when
setting up a new Gerrit installation, or a new project.
Bug: issue 299
Change-Id: If19f3474a7b5e3adba3b09c470a01927fe46cb58
Signed-off-by: Shawn O. Pearce <sop@google.com>
10 files changed, 56 insertions, 137 deletions
diff --git a/Documentation/project-setup.txt b/Documentation/project-setup.txt index 29aab86b44..6210808ac7 100644 --- a/Documentation/project-setup.txt +++ b/Documentation/project-setup.txt @@ -47,10 +47,7 @@ protocol, don't forget to create a `git-daemon-export-ok` file: Register Project ~~~~~~~~~~~~~~~~ -At least two inserts are needed to register a project with Gerrit: -one to define the project exists, and another to define a branch -that changes can be uploaded to for code review. Additional branches -may be defined if desired. +One insert is needed to register a project with Gerrit. [NOTE] Note that the `.git` suffix is not typically included in the @@ -69,13 +66,6 @@ for a project named `project`. ,'N' ,'M' ,'new/project'); - - INSERT INTO branches - (branch_name - ,project_name) - VALUES - ('refs/heads/master' - ,'new/project'); ==== [NOTE] diff --git a/src/main/java/com/google/gerrit/client/reviewdb/Branch.java b/src/main/java/com/google/gerrit/client/reviewdb/Branch.java index 04328f4aa7..06b18e6f2a 100644 --- a/src/main/java/com/google/gerrit/client/reviewdb/Branch.java +++ b/src/main/java/com/google/gerrit/client/reviewdb/Branch.java @@ -17,7 +17,7 @@ package com.google.gerrit.client.reviewdb; import com.google.gwtorm.client.Column; import com.google.gwtorm.client.StringKey; -/** Registered line of development within a {@link Project}. */ +/** Line of development within a {@link Project}. */ public final class Branch { public static final String R_HEADS = "refs/heads/"; public static final String R_REFS = "refs/"; @@ -69,8 +69,8 @@ public final class Branch { } } - @Column(name = Column.NONE) protected NameKey name; + protected RevId revision; protected Branch() { } @@ -90,4 +90,12 @@ public final class Branch { public String getShortName() { return name.getShortName(); } + + public RevId getRevision() { + return revision; + } + + public void setRevision(final RevId id) { + revision = id; + } } diff --git a/src/main/java/com/google/gerrit/client/reviewdb/BranchAccess.java b/src/main/java/com/google/gerrit/client/reviewdb/BranchAccess.java deleted file mode 100644 index 3394ce3acf..0000000000 --- a/src/main/java/com/google/gerrit/client/reviewdb/BranchAccess.java +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (C) 2008 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.client.reviewdb; - -import com.google.gwtorm.client.Access; -import com.google.gwtorm.client.OrmException; -import com.google.gwtorm.client.PrimaryKey; -import com.google.gwtorm.client.Query; -import com.google.gwtorm.client.ResultSet; - -public interface BranchAccess extends Access<Branch, Branch.NameKey> { - @PrimaryKey("name") - Branch get(Branch.NameKey name) throws OrmException; - - @Query("WHERE name.projectName = ? ORDER BY name.branchName") - ResultSet<Branch> byProject(Project.NameKey key) throws OrmException; -} diff --git a/src/main/java/com/google/gerrit/client/reviewdb/ReviewDb.java b/src/main/java/com/google/gerrit/client/reviewdb/ReviewDb.java index d06e3a85bf..3a2fc6d5f2 100644 --- a/src/main/java/com/google/gerrit/client/reviewdb/ReviewDb.java +++ b/src/main/java/com/google/gerrit/client/reviewdb/ReviewDb.java @@ -88,9 +88,6 @@ public interface ReviewDb extends Schema { ProjectRightAccess projectRights(); @Relation - BranchAccess branches(); - - @Relation ChangeAccess changes(); @Relation diff --git a/src/main/java/com/google/gerrit/server/rpc/project/AddBranch.java b/src/main/java/com/google/gerrit/server/rpc/project/AddBranch.java index 08f185c8ec..f9622d63a3 100644 --- a/src/main/java/com/google/gerrit/server/rpc/project/AddBranch.java +++ b/src/main/java/com/google/gerrit/server/rpc/project/AddBranch.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.rpc.project; import com.google.gerrit.client.reviewdb.Branch; import com.google.gerrit.client.reviewdb.Project; -import com.google.gerrit.client.reviewdb.ReviewDb; import com.google.gerrit.client.rpc.InvalidNameException; import com.google.gerrit.client.rpc.InvalidRevisionException; import com.google.gerrit.git.GitRepositoryManager; @@ -25,12 +24,9 @@ import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.project.NoSuchProjectException; import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.server.rpc.Handler; -import com.google.gwtorm.client.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.Constants; @@ -40,9 +36,10 @@ import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.ObjectWalk; import org.eclipse.jgit.revwalk.RevWalk; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; -import java.util.Collections; import java.util.List; class AddBranch extends Handler<List<Branch>> { @@ -59,7 +56,6 @@ class AddBranch extends Handler<List<Branch>> { private final IdentifiedUser identifiedUser; private final GitRepositoryManager repoManager; private final ReplicationQueue replication; - private final ReviewDb db; private final Project.NameKey projectName; private final String branchName; @@ -69,7 +65,7 @@ class AddBranch extends Handler<List<Branch>> { AddBranch(final ProjectControl.Factory projectControlFactory, final ListBranches.Factory listBranchesFactory, final IdentifiedUser identifiedUser, final GitRepositoryManager repoManager, - final ReplicationQueue replication, final ReviewDb db, + final ReplicationQueue replication, @Assisted Project.NameKey projectName, @Assisted("branchName") String branchName, @@ -79,7 +75,6 @@ class AddBranch extends Handler<List<Branch>> { this.identifiedUser = identifiedUser; this.repoManager = repoManager; this.replication = replication; - this.db = db; this.projectName = projectName; this.branchName = branchName; @@ -87,7 +82,7 @@ class AddBranch extends Handler<List<Branch>> { } @Override - public List<Branch> call() throws NoSuchProjectException, OrmException, + public List<Branch> call() throws NoSuchProjectException, InvalidNameException, InvalidRevisionException, IOException { final ProjectControl projectControl = projectControlFactory.validateFor(projectName, ProjectControl.OWNER @@ -141,9 +136,6 @@ class AddBranch extends Handler<List<Branch>> { repo.close(); } - final Branch newBranch = new Branch(name); - db.branches().insert(Collections.singleton(newBranch)); - return listBranchesFactory.create(projectName).call(); } diff --git a/src/main/java/com/google/gerrit/server/rpc/project/DeleteBranches.java b/src/main/java/com/google/gerrit/server/rpc/project/DeleteBranches.java index 0c77034c97..5f47bb95d1 100644 --- a/src/main/java/com/google/gerrit/server/rpc/project/DeleteBranches.java +++ b/src/main/java/com/google/gerrit/server/rpc/project/DeleteBranches.java @@ -16,24 +16,21 @@ package com.google.gerrit.server.rpc.project; import com.google.gerrit.client.reviewdb.Branch; import com.google.gerrit.client.reviewdb.Project; -import com.google.gerrit.client.reviewdb.ReviewDb; import com.google.gerrit.git.GitRepositoryManager; import com.google.gerrit.git.ReplicationQueue; import com.google.gerrit.server.project.NoSuchProjectException; import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.server.rpc.Handler; -import com.google.gwtorm.client.OrmException; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.lib.Repository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; -import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -49,21 +46,19 @@ class DeleteBranches extends Handler<Set<Branch.NameKey>> { private final ProjectControl.Factory projectControlFactory; private final GitRepositoryManager repoManager; private final ReplicationQueue replication; - private final ReviewDb db; private final Project.NameKey projectName; private final Set<Branch.NameKey> toRemove; @Inject DeleteBranches(final ProjectControl.Factory projectControlFactory, - final GitRepositoryManager repoManager, final ReplicationQueue replication, - final ReviewDb db, + final GitRepositoryManager repoManager, + final ReplicationQueue replication, @Assisted Project.NameKey name, @Assisted Set<Branch.NameKey> toRemove) { this.projectControlFactory = projectControlFactory; this.repoManager = repoManager; this.replication = replication; - this.db = db; this.projectName = name; this.toRemove = toRemove; @@ -71,7 +66,7 @@ class DeleteBranches extends Handler<Set<Branch.NameKey>> { @Override public Set<Branch.NameKey> call() throws NoSuchProjectException, - RepositoryNotFoundException, OrmException { + RepositoryNotFoundException { final ProjectControl projectControl = projectControlFactory.validateFor(projectName, ProjectControl.OWNER | ProjectControl.VISIBLE); @@ -89,14 +84,10 @@ class DeleteBranches extends Handler<Set<Branch.NameKey>> { final Repository r = repoManager.openRepository(projectName.get()); try { for (final Branch.NameKey branchKey : toRemove) { - final Branch b = db.branches().get(branchKey); - if (b == null) { - continue; - } - + final String refname = branchKey.get(); final RefUpdate.Result result; try { - final RefUpdate u = r.updateRef(b.getName()); + final RefUpdate u = r.updateRef(refname); u.setForceUpdate(true); result = u.delete(); } catch (IOException e) { @@ -109,9 +100,8 @@ class DeleteBranches extends Handler<Set<Branch.NameKey>> { case NO_CHANGE: case FAST_FORWARD: case FORCED: - db.branches().delete(Collections.singleton(b)); deleted.add(branchKey); - replication.scheduleUpdate(projectName, b.getName()); + replication.scheduleUpdate(projectName, refname); break; case REJECTED_CURRENT_BRANCH: diff --git a/src/main/java/com/google/gerrit/server/ssh/commands/AdminCreateProject.java b/src/main/java/com/google/gerrit/server/ssh/commands/AdminCreateProject.java index 91143f1187..1c76b05af3 100644 --- a/src/main/java/com/google/gerrit/server/ssh/commands/AdminCreateProject.java +++ b/src/main/java/com/google/gerrit/server/ssh/commands/AdminCreateProject.java @@ -16,7 +16,6 @@ package com.google.gerrit.server.ssh.commands; import com.google.gerrit.client.reviewdb.AccountGroup; import com.google.gerrit.client.reviewdb.ApprovalCategory; -import com.google.gerrit.client.reviewdb.Branch; import com.google.gerrit.client.reviewdb.Project; import com.google.gerrit.client.reviewdb.ProjectRight; import com.google.gerrit.client.reviewdb.ReviewDb; @@ -30,9 +29,9 @@ import com.google.gwtorm.client.OrmException; import com.google.gwtorm.client.Transaction; import com.google.inject.Inject; -import org.kohsuke.args4j.Option; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Repository; +import org.kohsuke.args4j.Option; import java.io.PrintWriter; import java.util.Collections; @@ -130,10 +129,6 @@ final class AdminCreateProject extends BaseCommand { pr.setMaxValue((short) 1); pr.setMinValue((short) 1); db.projectRights().insert(Collections.singleton(pr), txn); - - final Branch newBranch = - new Branch(new Branch.NameKey(newProjectNameKey, branch)); - db.branches().insert(Collections.singleton(newBranch), txn); } private void validateParameters() throws Failure { diff --git a/src/main/java/com/google/gerrit/server/ssh/commands/Receive.java b/src/main/java/com/google/gerrit/server/ssh/commands/Receive.java index 68ab6705e0..e8c38de287 100644 --- a/src/main/java/com/google/gerrit/server/ssh/commands/Receive.java +++ b/src/main/java/com/google/gerrit/server/ssh/commands/Receive.java @@ -57,9 +57,6 @@ import com.google.gwtorm.client.OrmRunnable; import com.google.gwtorm.client.Transaction; import com.google.inject.Inject; -import org.kohsuke.args4j.Option; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; @@ -81,6 +78,9 @@ import org.eclipse.jgit.transport.ReceiveCommand; import org.eclipse.jgit.transport.ReceivePack; import org.eclipse.jgit.transport.ReceiveCommand.Result; import org.eclipse.jgit.transport.ReceiveCommand.Type; +import org.kohsuke.args4j.Option; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.PrintWriter; @@ -168,7 +168,7 @@ final class Receive extends AbstractGitCommand { private ReceivePack rp; private PersonIdent refLogIdent; private ReceiveCommand newChange; - private Branch destBranch; + private Branch.NameKey destBranch; private final List<Change.Id> allNewChanges = new ArrayList<Change.Id>(); private final Map<Change.Id, ReplaceRequest> replaceByChange = @@ -223,11 +223,9 @@ final class Receive extends AbstractGitCommand { if (isHead(c)) { switch (c.getType()) { case CREATE: - insertBranchEntity(c); autoCloseChanges(c); break; case DELETE: - deleteBranchEntity(c); break; case UPDATE: case UPDATE_NONFASTFORWARD: @@ -541,15 +539,30 @@ final class Receive extends AbstractGitCommand { destBranchName = Constants.R_HEADS + destBranchName; } - try { - destBranch = - db.branches().get( - new Branch.NameKey(project.getNameKey(), destBranchName)); - } catch (OrmException e) { - log.error("Cannot lookup branch " + project + " " + destBranchName, e); - reject(cmd, "database error"); - return; + if (rp.getAdvertisedRefs().containsKey(destBranchName)) { + // We advertised the branch to the client so we know + // the branch exists. Target this branch for the upload. + // + destBranch = new Branch.NameKey(project.getNameKey(), destBranchName); + + } else { + // We didn't advertise the branch, because it doesn't exist yet. + // Allow it anyway if HEAD is a symbolic reference to the name. + // + final String head; + try { + head = repo.getFullBranch(); + } catch (IOException e) { + log.error("Cannot read HEAD symref", e); + reject(cmd, "internal error"); + return; + } + + if (head.equals(destBranchName)) { + destBranch = new Branch.NameKey(project.getNameKey(), destBranchName); + } } + if (destBranch == null) { String n = destBranchName; if (n.startsWith(Constants.R_HEADS)) @@ -797,8 +810,7 @@ final class Receive extends AbstractGitCommand { final Transaction txn = db.beginTransaction(); final Change change = - new Change(changeKey, new Change.Id(db.nextChangeId()), me, destBranch - .getNameKey()); + new Change(changeKey, new Change.Id(db.nextChangeId()), me, destBranch); final PatchSet ps = new PatchSet(change.newPatchSetId()); ps.setCreatedOn(change.getCreatedOn()); ps.setUploader(me); @@ -1240,46 +1252,6 @@ final class Receive extends AbstractGitCommand { return true; } - private void insertBranchEntity(final ReceiveCommand c) { - try { - final Branch.NameKey nameKey = - new Branch.NameKey(project.getNameKey(), c.getRefName()); - final Branch b = new Branch(nameKey); - db.branches().insert(Collections.singleton(b)); - } catch (OrmException e) { - final String msg = "database failure creating " + c.getRefName(); - log.error(msg, e); - - try { - err.write(("remote error: " + msg + "\n").getBytes("UTF-8")); - err.flush(); - } catch (IOException e2) { - // Ignore errors writing to the client - } - } - } - - private void deleteBranchEntity(final ReceiveCommand c) { - try { - final Branch.NameKey nameKey = - new Branch.NameKey(project.getNameKey(), c.getRefName()); - final Branch b = db.branches().get(nameKey); - if (b != null) { - db.branches().delete(Collections.singleton(b)); - } - } catch (OrmException e) { - final String msg = "database failure deleting " + c.getRefName(); - log.error(msg, e); - - try { - err.write(("remote error: " + msg + "\n").getBytes("UTF-8")); - err.flush(); - } catch (IOException e2) { - // Ignore errors writing to the client - } - } - } - private void autoCloseChanges(final ReceiveCommand cmd) { final RevWalk rw = rp.getRevWalk(); try { diff --git a/src/main/webapp/WEB-INF/sql/upgrade018_019_mysql.sql b/src/main/webapp/WEB-INF/sql/upgrade018_019_mysql.sql index e24b355d83..a0de31bd01 100644 --- a/src/main/webapp/WEB-INF/sql/upgrade018_019_mysql.sql +++ b/src/main/webapp/WEB-INF/sql/upgrade018_019_mysql.sql @@ -29,4 +29,6 @@ UPDATE account_groups SET group_type = 'INTERNAL' WHERE group_type IS NULL; ALTER TABLE account_groups MODIFY group_type VARCHAR(8) NOT NULL; ALTER TABLE account_groups DROP automatic_membership; +DROP TABLE branches; + UPDATE schema_version SET version_nbr = 19; diff --git a/src/main/webapp/WEB-INF/sql/upgrade018_019_postgres.sql b/src/main/webapp/WEB-INF/sql/upgrade018_019_postgres.sql index 45de402fce..fbf7c81948 100644 --- a/src/main/webapp/WEB-INF/sql/upgrade018_019_postgres.sql +++ b/src/main/webapp/WEB-INF/sql/upgrade018_019_postgres.sql @@ -33,6 +33,8 @@ UPDATE account_groups SET group_type = 'INTERNAL' WHERE group_type IS NULL; ALTER TABLE account_groups ALTER group_type SET NOT NULL; ALTER TABLE account_groups DROP automatic_membership; +DROP TABLE branches; + UPDATE schema_version SET version_nbr = 19; COMMIT; |