Correct backup of tags Backing up an annotated tag could lead to errors as you cannot create a branch on a tag, but you have to find the underlying commit first. Change-Id: I136edb9eaf5f8866cecc14da938cb43e1b8680f7
diff --git a/src/main/java/com/googlesource/gerrit/plugins/refprotection/BackupRef.java b/src/main/java/com/googlesource/gerrit/plugins/refprotection/BackupRef.java index f32f597..aab80bb 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/refprotection/BackupRef.java +++ b/src/main/java/com/googlesource/gerrit/plugins/refprotection/BackupRef.java
@@ -35,8 +35,10 @@ import com.google.inject.Inject; import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevWalk; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,14 +73,24 @@ return; } - CreateBranch.Input input = new CreateBranch.Input(); - input.ref = backupRef; - input.revision = event.refUpdate.oldRev; + try (Repository git = repoManager.openRepository(project.getNameKey())) { + try (RevWalk revWalk = new RevWalk(git)) { + CreateBranch.Input input = new CreateBranch.Input(); + input.ref = backupRef; + // We need to parse the commit to ensure if it's a tag, we get the + // commit the tag points to! + input.revision = + ObjectId.toString(revWalk.parseCommit(ObjectId.fromString(event.refUpdate.oldRev)) + .getId()); - try { - createBranchFactory.create(backupRef).apply(project, input); - } catch (BadRequestException | AuthException | ResourceConflictException - | IOException e) { + try { + createBranchFactory.create(backupRef).apply(project, input); + } catch (BadRequestException | AuthException | ResourceConflictException + | IOException e) { + log.error(e.getMessage(), e); + } + } + } catch (IOException e) { log.error(e.getMessage(), e); } }