Merge branch 'stable-2.15' into stable-2.16
* stable-2.15:
Change log messages of noteDb case to match reviewDb case
Add error handling if rename was not successful
Change-Id: I14ea9349c90e151436ef5761e8eee16978ac87e0
diff --git a/WORKSPACE b/WORKSPACE
index c2472a0..89be0ac 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -3,7 +3,7 @@
load("//:bazlets.bzl", "load_bazlets")
load_bazlets(
- commit = "ec949feac1b9dae6cc2c8c25d254f34924c54296",
+ commit = "23d849dfd1876c1b4b88efa55a4f716895e33fa3",
#local_path = "/home/<user>/projects/bazlets",
)
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/LockUnlockProject.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/LockUnlockProject.java
index 45cf294..04426bc 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/LockUnlockProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/LockUnlockProject.java
@@ -16,9 +16,9 @@
import com.google.gerrit.extensions.client.ProjectState;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.IOException;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameCommand.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameCommand.java
index b28d47c..14b5898 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameCommand.java
@@ -18,12 +18,15 @@
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.project.ProjectControl;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.project.ProjectResource;
import com.google.gerrit.sshd.CommandMetaData;
import com.google.gerrit.sshd.SshCommand;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
+import com.google.inject.Provider;
import com.googlesource.gerrit.plugins.renameproject.monitor.CommandProgressMonitor;
import com.googlesource.gerrit.plugins.renameproject.monitor.ProgressMonitor;
import java.io.BufferedReader;
@@ -37,17 +40,24 @@
@CommandMetaData(name = "rename", description = "Rename project")
public final class RenameCommand extends SshCommand {
@Argument(index = 0, required = true, metaVar = "OLDPROJECT", usage = "project to rename")
- private ProjectControl projectControl;
+ private String projectControl;
@Argument(index = 1, required = true, metaVar = "NEWNAME", usage = "new name for the project")
private String newProjectName;
private static final Logger log = LoggerFactory.getLogger(RenameCommand.class);
private final RenameProject renameProject;
+ private final Provider<ProjectCache> projectCacheProvider;
+ private final Provider<CurrentUser> self;
@Inject
- protected RenameCommand(RenameProject renameProject) {
+ protected RenameCommand(
+ RenameProject renameProject,
+ Provider<ProjectCache> projectCacheProvider,
+ Provider<CurrentUser> self) {
this.renameProject = renameProject;
+ this.projectCacheProvider = projectCacheProvider;
+ this.self = self;
}
@Override
@@ -55,7 +65,9 @@
try {
RenameProject.Input input = new RenameProject.Input();
input.name = newProjectName;
- ProjectResource rsrc = new ProjectResource(projectControl);
+ ProjectResource rsrc =
+ new ProjectResource(
+ projectCacheProvider.get().get(new Project.NameKey(projectControl)), self.get());
try (CommandProgressMonitor monitor = new CommandProgressMonitor(stdout)) {
renameProject.assertCanRename(rsrc, input, monitor);
List<Change.Id> changeIds = renameProject.getChanges(rsrc, monitor);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameLog.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameLog.java
index a15d2c5..88c0e3b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameLog.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameLog.java
@@ -16,15 +16,15 @@
import com.google.common.collect.ListMultimap;
import com.google.common.collect.MultimapBuilder;
-import com.google.gerrit.audit.AuditEvent;
-import com.google.gerrit.audit.AuditService;
-import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.extensions.systemstatus.ServerInformation;
import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.AuditEvent;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.OutputFormat;
+import com.google.gerrit.server.audit.AuditService;
import com.google.gerrit.server.util.PluginLogFile;
import com.google.gerrit.server.util.SystemLog;
+import com.google.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.apache.log4j.Level;
@@ -68,7 +68,7 @@
null);
event.setProperty(ACCOUNT_ID, user.getAccountId().toString());
- event.setProperty(USER_NAME, user.getUserName());
+ event.setProperty(USER_NAME, user.getUserName().get());
event.setProperty(PROJECT_NAME, project.get());
if (options != null) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameProject.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameProject.java
index b3519fa..2a49cf0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/RenameProject.java
@@ -31,6 +31,8 @@
import com.google.gerrit.server.extensions.events.PluginEvent;
import com.google.gerrit.server.permissions.GlobalPermission;
import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
import com.google.gerrit.server.project.ProjectResource;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
@@ -114,11 +116,27 @@
}
protected boolean canRename(ProjectResource rsrc) {
- PermissionBackend.WithUser userPermission = permissionBackend.user(userProvider);
+ PermissionBackend.WithUser userPermission = permissionBackend.user(userProvider.get());
return userPermission.testOrFalse(GlobalPermission.ADMINISTRATE_SERVER)
|| userPermission.testOrFalse(new PluginPermission(pluginName, RENAME_PROJECT))
|| (userPermission.testOrFalse(new PluginPermission(pluginName, RENAME_OWN_PROJECT))
- && rsrc.getControl().isOwner());
+ && isOwner(rsrc));
+ }
+
+ private boolean isOwner(ProjectResource project) {
+ try {
+ permissionBackend
+ .user(project.getUser())
+ .project(project.getNameKey())
+ .check(ProjectPermission.WRITE_CONFIG);
+ } catch (AuthException | PermissionBackendException noWriter) {
+ try {
+ permissionBackend.user(project.getUser()).check(GlobalPermission.ADMINISTRATE_SERVER);
+ } catch (AuthException | PermissionBackendException noAdmin) {
+ return false;
+ }
+ }
+ return true;
}
void assertCanRename(ProjectResource rsrc, Input input, ProgressMonitor pm)
@@ -136,13 +154,13 @@
void doRename(List<Change.Id> changeIds, ProjectResource rsrc, Input input, ProgressMonitor pm)
throws InterruptedException, OrmException, ConfigInvalidException, IOException {
- Project.NameKey oldProjectKey = rsrc.getControl().getProject().getNameKey();
+ Project.NameKey oldProjectKey = rsrc.getNameKey();
Project.NameKey newProjectKey = new Project.NameKey(input.name);
Exception ex = null;
try {
fsHandler.rename(oldProjectKey, newProjectKey, pm);
log.debug("Renamed the git repo to {} successfully.", newProjectKey.get());
- cacheHandler.update(rsrc.getControl().getProject(), newProjectKey);
+ cacheHandler.update(rsrc.getProjectState().getProject(), newProjectKey);
List<Change.Id> updatedChangeIds =
dbHandler.rename(changeIds, oldProjectKey, newProjectKey, pm);
@@ -170,7 +188,7 @@
List<Change.Id> getChanges(ProjectResource rsrc, ProgressMonitor pm)
throws OrmException, IOException {
pm.beginTask("Retrieving the list of changes from DB");
- Project.NameKey oldProjectKey = rsrc.getControl().getProject().getNameKey();
+ Project.NameKey oldProjectKey = rsrc.getNameKey();
return dbHandler.getChangeIds(oldProjectKey);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/SshModule.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/SshModule.java
index e2a7ee0..4dcae20 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/SshModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/SshModule.java
@@ -16,7 +16,7 @@
import com.google.gerrit.sshd.SingleCommandPluginModule;
import com.google.inject.binder.LinkedBindingBuilder;
-import org.apache.sshd.server.Command;
+import org.apache.sshd.server.command.Command;
public class SshModule extends SingleCommandPluginModule {
@Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/cache/CacheRenameHandler.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/cache/CacheRenameHandler.java
index c9ff8cf..0ca033e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/cache/CacheRenameHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/cache/CacheRenameHandler.java
@@ -18,6 +18,7 @@
import com.google.gerrit.server.project.ProjectCache;
import com.google.inject.Inject;
import com.google.inject.Singleton;
+import java.io.IOException;
@Singleton
public class CacheRenameHandler {
@@ -29,7 +30,7 @@
this.projectCache = projectCache;
}
- public void update(Project oldProject, Project.NameKey newProjectKey) {
+ public void update(Project oldProject, Project.NameKey newProjectKey) throws IOException {
projectCache.remove(oldProject);
projectCache.onCreateProject(newProjectKey);
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/conditions/RenamePreconditions.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/conditions/RenamePreconditions.java
index 2246d50..9efa51d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/conditions/RenamePreconditions.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/conditions/RenamePreconditions.java
@@ -15,18 +15,20 @@
package com.googlesource.gerrit.plugins.renameproject.conditions;
import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.config.AllUsersName;
import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MergeOpRepoManager;
-import com.google.gerrit.server.git.SubmoduleException;
-import com.google.gerrit.server.git.SubmoduleOp;
import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ListChildProjects;
import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.restapi.project.ListChildProjects;
+import com.google.gerrit.server.submit.MergeOpRepoManager;
+import com.google.gerrit.server.submit.SubmoduleException;
+import com.google.gerrit.server.submit.SubmoduleOp;
+import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
@@ -73,7 +75,7 @@
public void assertCanRename(ProjectResource oldProjectRsrc, Project.NameKey newProjectKey)
throws CannotRenameProjectException {
- Project.NameKey oldProjectKey = oldProjectRsrc.getControl().getProject().getNameKey();
+ Project.NameKey oldProjectKey = oldProjectRsrc.getNameKey();
assertNewRepoNotExists(newProjectKey);
assertIsNotDefaultProject(oldProjectKey);
assertHasNoChildProjects(oldProjectRsrc);
@@ -100,7 +102,7 @@
log.error(message);
throw new CannotRenameProjectException(message);
}
- } catch (PermissionBackendException e) {
+ } catch (PermissionBackendException | OrmException | RestApiException e) {
throw new CannotRenameProjectException(e);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/renameproject/database/DatabaseRenameHandler.java b/src/main/java/com/googlesource/gerrit/plugins/renameproject/database/DatabaseRenameHandler.java
index 671dc27..a837267 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/renameproject/database/DatabaseRenameHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/renameproject/database/DatabaseRenameHandler.java
@@ -14,15 +14,17 @@
package com.googlesource.gerrit.plugins.renameproject.database;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ServerInitiated;
import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.WatchConfig;
-import com.google.gerrit.server.account.WatchConfig.Accessor;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.ProjectWatches.ProjectWatchKey;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.notedb.ChangeNotes.Factory.ChangeNotesResult;
@@ -42,6 +44,7 @@
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -59,7 +62,7 @@
private final ChangeNotes.Factory schemaFactoryNoteDb;
private final GitRepositoryManager repoManager;
private final Provider<InternalAccountQuery> accountQueryProvider;
- private final Provider<Accessor> watchConfig;
+ private final Provider<AccountsUpdate> accountsUpdateProvider;
private NotesMigration migration;
@Inject
@@ -69,12 +72,12 @@
GitRepositoryManager repoManager,
NotesMigration migration,
Provider<InternalAccountQuery> accountQueryProvider,
- Provider<WatchConfig.Accessor> watchConfig) {
+ @ServerInitiated Provider<AccountsUpdate> accountsUpdateProvider) {
this.accountQueryProvider = accountQueryProvider;
- this.watchConfig = watchConfig;
this.schemaFactory = schemaFactory;
this.schemaFactoryNoteDb = schemaFactoryNoteDb;
this.repoManager = repoManager;
+ this.accountsUpdateProvider = accountsUpdateProvider;
this.migration = migration;
}
@@ -240,20 +243,31 @@
throws OrmException {
for (AccountState a : accountQueryProvider.get().byWatchedProject(oldProjectKey)) {
Account.Id accountId = a.getAccount().getId();
+ ImmutableMap<ProjectWatchKey, ImmutableSet<NotifyType>> projectWatches =
+ a.getProjectWatches();
+ Map<ProjectWatchKey, Set<NotifyType>> newProjectWatches = new HashMap<>();
+ List<ProjectWatchKey> oldProjectWatches = new ArrayList<>();
for (ProjectWatchKey watchKey : a.getProjectWatches().keySet()) {
if (oldProjectKey.equals(watchKey.project())) {
+ newProjectWatches.put(
+ ProjectWatchKey.create(newProjectKey, watchKey.filter()),
+ projectWatches.get(watchKey));
+ oldProjectWatches.add(watchKey);
try {
- Map<ProjectWatchKey, Set<NotifyType>> newProjectWatches =
- watchConfig.get().getProjectWatches(accountId);
-
- newProjectWatches.put(
- ProjectWatchKey.create(newProjectKey, watchKey.filter()),
- a.getProjectWatches().get(watchKey));
-
- newProjectWatches.remove(watchKey);
-
- watchConfig.get().deleteAllProjectWatches(accountId);
- watchConfig.get().upsertProjectWatches(accountId, newProjectWatches);
+ accountsUpdateProvider
+ .get()
+ .update(
+ "Add watch entry",
+ accountId,
+ (accountState, update) ->
+ update.updateProjectWatches(newProjectWatches).build());
+ accountsUpdateProvider
+ .get()
+ .update(
+ "Remove watch entry",
+ accountId,
+ (accountState, update) ->
+ update.deleteProjectWatches(oldProjectWatches).build());
} catch (ConfigInvalidException e) {
log.error(
"Updating watch entry for user {} in project {} failed. Watch config found invalid.",
diff --git a/src/test/java/com/googlesource/gerrit/plugins/renameproject/SubmoduleUtil.java b/src/test/java/com/googlesource/gerrit/plugins/renameproject/SubmoduleUtil.java
index 89243a1..e6fcdd1 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/renameproject/SubmoduleUtil.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/renameproject/SubmoduleUtil.java
@@ -18,10 +18,10 @@
import com.google.gerrit.common.data.SubscribeSection;
import com.google.gerrit.reviewdb.client.Project.NameKey;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.MetaDataUpdate.Server;
-import com.google.gerrit.server.git.ProjectConfig;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.git.meta.MetaDataUpdate.Server;
import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ObjectId;
diff --git a/src/test/java/com/googlesource/gerrit/plugins/renameproject/conditions/RenamePreconditionsTest.java b/src/test/java/com/googlesource/gerrit/plugins/renameproject/conditions/RenamePreconditionsTest.java
index 43050e1..e42e550 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/renameproject/conditions/RenamePreconditionsTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/renameproject/conditions/RenamePreconditionsTest.java
@@ -19,14 +19,15 @@
import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.config.AllUsersName;
import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MergeOpRepoManager;
-import com.google.gerrit.server.git.SubmoduleOp;
-import com.google.gerrit.server.project.ListChildProjects;
-import com.google.gerrit.server.project.ProjectControl;
import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.restapi.project.ListChildProjects;
+import com.google.gerrit.server.submit.MergeOpRepoManager;
+import com.google.gerrit.server.submit.SubmoduleOp;
import com.google.inject.Provider;
import com.googlesource.gerrit.plugins.renameproject.CannotRenameProjectException;
import java.util.ArrayList;
@@ -50,7 +51,8 @@
@Mock private Provider<MergeOpRepoManager> ormProvider;
@Mock private RenamePreconditions preconditions;
@Mock private ObjectDatabase objDb;
- @Mock private ProjectControl control;
+ @Mock private ProjectState control;
+ @Mock private CurrentUser user;
@Mock private Repository repo;
@Mock private ListChildProjects listChildProjects;
@@ -60,7 +62,7 @@
@Before
public void setUp() throws Exception {
- oldRsrc = new ProjectResource(control);
+ oldRsrc = new ProjectResource(control, user);
when(repoManager.openRepository(newProjectKey)).thenReturn(repo);
when(repo.getObjectDatabase()).thenReturn(objDb);
preconditions =
@@ -75,8 +77,6 @@
@Test(expected = CannotRenameProjectException.class)
public void testAssertCannotRenameRepoExists() throws Exception {
- Project oldProject = new Project(new Project.NameKey("oldProject"));
- when(control.getProject()).thenReturn(oldProject);
when(objDb.exists()).thenReturn(true);
preconditions.assertCanRename(oldRsrc, newProjectKey);
@@ -85,7 +85,7 @@
@Test(expected = CannotRenameProjectException.class)
public void testAssertCannotRenameAllProjects() throws Exception {
Project oldProject = new Project(allProjects);
- when(control.getProject()).thenReturn(oldProject);
+ when(oldRsrc.getNameKey()).thenReturn(oldProject.getNameKey());
when(objDb.exists()).thenReturn(false);
preconditions.assertCanRename(oldRsrc, newProjectKey);
@@ -94,7 +94,7 @@
@Test(expected = CannotRenameProjectException.class)
public void testAssertCannotRenameAllUsers() throws Exception {
Project oldProject = new Project(allUsersName);
- when(control.getProject()).thenReturn(oldProject);
+ when(oldRsrc.getNameKey()).thenReturn(oldProject.getNameKey());
when(objDb.exists()).thenReturn(false);
preconditions.assertCanRename(oldRsrc, newProjectKey);
@@ -103,7 +103,7 @@
@Test(expected = CannotRenameProjectException.class)
public void testAssertCannotRenameHasChildren() throws Exception {
Project oldProject = new Project(new Project.NameKey("oldProject"));
- when(control.getProject()).thenReturn(oldProject);
+ when(oldRsrc.getNameKey()).thenReturn(oldProject.getNameKey());
when(objDb.exists()).thenReturn(false);
when(listChildProjectsProvider.get()).thenReturn(listChildProjects);