Added backup branch creation for deleted refs
Change-Id: I2e1c4ad18a525c5f39c247e9c11d5f376b5f30b3
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 92b6527..ebfca25 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/refprotection/RefUpdateListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/refprotection/RefUpdateListener.java
@@ -4,15 +4,40 @@
import static org.eclipse.jgit.lib.Constants.R_TAGS;
import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.project.CreateBranch;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectControl;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Inject;
import org.eclipse.jgit.lib.ObjectId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
class RefUpdateListener implements GitReferenceUpdatedListener {
private static final Logger log = LoggerFactory
.getLogger(RefUpdateListener.class);
+ private final CreateBranch.Factory createBranchFactory;
+ private final ProjectControl.GenericFactory projectControl;
+ private final CurrentUser user;
+
+ @Inject
+ RefUpdateListener(CreateBranch.Factory createBranchFactory,
+ ProjectControl.GenericFactory p, CurrentUser user) {
+ this.createBranchFactory = createBranchFactory;
+ this.projectControl = p;
+ this.user = user;
+ }
@Override
public void onGitReferenceUpdated(final Event event) {
@@ -29,7 +54,31 @@
* @param event the Event
*/
private void createBackupBranch(Event event) {
- // TODO
+ String branchName = event.getRefName().replaceFirst(R_HEADS, "");
+ try {
+ String branchPrefix = "";
+ int n = branchName.lastIndexOf("/");
+ if (n != -1) {
+ branchPrefix = branchName.substring(0, n + 1);
+ branchName = branchName.substring(n + 1);
+ }
+
+ String ref =
+ String.format("%sbackup-%s-%s", branchPrefix, branchName,
+ new SimpleDateFormat("YYYYMMdd-HHmmss").format(new Date()));
+
+ CreateBranch.Input input = new CreateBranch.Input();
+ input.ref = ref;
+ input.revision = event.getOldObjectId();
+ Project.NameKey nameKey = new Project.NameKey(event.getProjectName());
+ ProjectResource project =
+ new ProjectResource(projectControl.controlFor(nameKey, user));
+
+ createBranchFactory.create(ref).apply(project, input);
+ } catch (BadRequestException | AuthException | ResourceConflictException
+ | IOException | NoSuchProjectException e) {
+ log.error(e.getMessage(), e);
+ }
}
/**