Add configuration for levels of protection
Add the ability to enable/disable protection on specific events:
either branch deleted or on non-fast-forward. Both are on by
default to maintain legacy behavior, but if desired, it can be
disabled.
Change-Id: I5b36476852aa7df33f8b06f71298d7b0a27898d1
diff --git a/src/main/java/com/googlesource/gerrit/plugins/refprotection/RefUpdateListener.java b/src/main/java/com/googlesource/gerrit/plugins/refprotection/RefUpdateListener.java
index 714b2c6..cbaffad 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/refprotection/RefUpdateListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/refprotection/RefUpdateListener.java
@@ -26,9 +26,11 @@
import static org.eclipse.jgit.lib.Constants.R_HEADS;
import static org.eclipse.jgit.lib.Constants.R_TAGS;
+import com.google.gerrit.extensions.annotations.PluginName;
import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.config.PluginConfigFactory;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.project.NoSuchProjectException;
import com.google.gerrit.server.project.ProjectControl;
@@ -53,26 +55,35 @@
private final CurrentUser user;
private final GitRepositoryManager repoManager;
private final BackupRef backupRef;
+ private final boolean protectDeleted;
+ private final boolean protectFastForward;
@Inject
RefUpdateListener(ProjectControl.GenericFactory p,
CurrentUser user,
GitRepositoryManager repoManager,
- BackupRef backupRef) {
+ BackupRef backupRef,
+ PluginConfigFactory cfg,
+ @PluginName String pluginName) {
this.projectControl = p;
this.user = user;
this.repoManager = repoManager;
this.backupRef = backupRef;
+ this.protectDeleted =
+ cfg.getFromGerritConfig(pluginName).getBoolean("protectDeleted", true);
+ this.protectFastForward =
+ cfg.getFromGerritConfig(pluginName).getBoolean("protectFastForward", true);
}
@Override
public void onGitReferenceUpdated(final Event event) {
- if (isRelevantRef(event)) {
+ if ((protectDeleted || protectFastForward) && isRelevantRef(event)) {
Project.NameKey nameKey = new Project.NameKey(event.getProjectName());
try {
ProjectResource project =
new ProjectResource(projectControl.controlFor(nameKey, user));
- if (isRefDeleted(event) || isNonFastForwardUpdate(event, project)) {
+ if ((protectDeleted && isRefDeleted(event))
+ || (protectFastForward && isNonFastForwardUpdate(event, project))) {
backupRef.createBackup(event, project);
}
} catch (NoSuchProjectException | IOException e) {