diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/BatchUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/BatchUpdate.java index 46d34c9ecb..6fe95423a2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/BatchUpdate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/BatchUpdate.java @@ -397,6 +397,7 @@ public class BatchUpdate implements AutoCloseable { private final GitRepositoryManager repoManager; private final ChangeIndexer indexer; private final ChangeControl.GenericFactory changeControlFactory; + private final ChangeNotes.Factory changeNotesFactory; private final ChangeUpdate.Factory changeUpdateFactory; private final GitReferenceUpdated gitRefUpdated; private final NotesMigration notesMigration; @@ -424,6 +425,7 @@ public class BatchUpdate implements AutoCloseable { BatchUpdate(GitRepositoryManager repoManager, ChangeIndexer indexer, ChangeControl.GenericFactory changeControlFactory, + ChangeNotes.Factory changeNotesFactory, ChangeUpdate.Factory changeUpdateFactory, GitReferenceUpdated gitRefUpdated, NotesMigration notesMigration, @@ -437,6 +439,7 @@ public class BatchUpdate implements AutoCloseable { this.repoManager = repoManager; this.indexer = indexer; this.changeControlFactory = changeControlFactory; + this.changeNotesFactory = changeNotesFactory; this.changeUpdateFactory = changeUpdateFactory; this.gitRefUpdated = gitRefUpdated; this.notesMigration = notesMigration; @@ -628,8 +631,9 @@ public class BatchUpdate implements AutoCloseable { // Pass in preloaded change to controlFor, to avoid: // - reading from a db that does not belong to this update // - attempting to read a change that doesn't exist yet + ChangeNotes notes = changeNotesFactory.createForNew(c); ChangeContext ctx = new ChangeContext( - changeControlFactory.controlFor(c, user), new BatchUpdateReviewDb(db)); + changeControlFactory.controlFor(notes, user), new BatchUpdateReviewDb(db)); if (notesMigration.readChanges()) { ctx.getNotes().load(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java index d4555b437b..88f795ddbb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java @@ -89,7 +89,7 @@ public abstract class AbstractChangeNotes extends VersionedMetaData { * @return the NameKey for the project where the notes should be stored, * which is not necessarily the same as the change's project. */ - protected abstract Project.NameKey getProjectName(); + public abstract Project.NameKey getProjectName(); @SuppressWarnings("unchecked") protected final T self() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java index 23aa422e29..9ac5f50318 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java @@ -118,6 +118,10 @@ public class ChangeNotes extends AbstractChangeNotes { public ChangeNotes create(Change change) { return new ChangeNotes(repoManager, migration, allUsersProvider, change); } + + public ChangeNotes createForNew(Change change) { + return new ChangeNotes(repoManager, migration, allUsersProvider, change); + } } private final Change change; @@ -345,7 +349,7 @@ public class ChangeNotes extends AbstractChangeNotes { } @Override - protected Project.NameKey getProjectName() { + public Project.NameKey getProjectName() { return getChange().getProject(); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DraftCommentNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DraftCommentNotes.java index a02c24dbcb..24d5c362b2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DraftCommentNotes.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DraftCommentNotes.java @@ -134,7 +134,7 @@ public class DraftCommentNotes extends AbstractChangeNotes { } @Override - protected Project.NameKey getProjectName() { + public Project.NameKey getProjectName() { return draftsProject; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java index 606ca78dc5..dd022d95a5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java @@ -77,6 +77,16 @@ public class ChangeControl { } } + public ChangeControl controlFor(ChangeNotes notes, CurrentUser user) + throws NoSuchChangeException { + try { + return projectControl.controlFor(notes.getProjectName(), user) + .controlFor(notes); + } catch (NoSuchProjectException | IOException e) { + throw new NoSuchChangeException(notes.getChangeId(), e); + } + } + public ChangeControl validateFor(Change.Id changeId, CurrentUser user) throws NoSuchChangeException, OrmException { Change change = db.get().changes().get(changeId); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java index 9116dcc07b..02a1d45739 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java @@ -43,6 +43,7 @@ import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.TagCache; import com.google.gerrit.server.git.VisibleRefFilter; import com.google.gerrit.server.group.SystemGroupBackend; +import com.google.gerrit.server.notedb.ChangeNotes; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; @@ -196,6 +197,11 @@ public class ProjectControl { return changeControlFactory.create(controlForRef(change.getDest()), change); } + public ChangeControl controlFor(ChangeNotes notes) { + return changeControlFactory + .create(controlForRef(notes.getChange().getDest()), notes); + } + public RefControl controlForRef(Branch.NameKey ref) { return controlForRef(ref.get()); }