in src/main/java/com/googlesource/gerrit/plugins/refprotection/BackupRef.java [78:183]
public void createBackup(RefUpdatedEvent event, ProjectResource project) {
String refName = event.getRefName();
try (Repository git = repoManager.openRepository(project.getNameKey())) {
String backupRef = get(project, refName);
// No-op if the backup branch name is same as the original
if (backupRef.equals(refName)) {
return;
}
try (RevWalk revWalk = new RevWalk(git)) {
RefUpdateAttribute refUpdate = event.refUpdate.get();
if (cfg.getFromGerritConfig(pluginName).getBoolean("createTag", false)) {
TagBuilder tag = new TagBuilder();
AccountAttribute submitter = event.submitter.get();
tag.setTagger(new PersonIdent(submitter.name, submitter.email));
tag.setObjectId(revWalk.parseCommit(ObjectId.fromString(refUpdate.oldRev)));
String update = "Non-fast-forward update to";
if (refUpdate.newRev.equals(ObjectId.zeroId().getName())) {
update = "Deleted";
}
String type = "branch";
String fullMessage = "";
if (refUpdate.refName.startsWith(R_TAGS)) {
type = "tag";
try {
RevTag origTag = revWalk.parseTag(ObjectId.fromString(refUpdate.oldRev));
SimpleDateFormat format = new SimpleDateFormat("EEE MMM d HH:mm:ss yyyy ZZZZ");
PersonIdent taggerIdent = origTag.getTaggerIdent();
String tagger =
String.format(
"Tagger: %s <%s>\nDate: %s",
taggerIdent.getName(),
taggerIdent.getEmailAddress(),
format.format(taggerIdent.getWhen()));
fullMessage = "\n\nOriginal tag:\n" + tagger + "\n\n" + origTag.getFullMessage();
} catch (MissingObjectException e) {
log.warn("Original tag does not exist", e);
} catch (IncorrectObjectTypeException e) {
log.warn("Original tag was not a tag", e);
} catch (IOException e) {
log.warn("Unable to read original tag details", e);
}
}
tag.setMessage(update + " " + type + " " + refUpdate.refName + fullMessage);
tag.setTag(backupRef);
ObjectInserter inserter = git.newObjectInserter();
ObjectId tagId = inserter.insert(tag);
inserter.flush();
RefUpdate tagRef = git.updateRef(tag.getTag());
tagRef.setNewObjectId(tagId);
tagRef.setRefLogMessage("tagged deleted branch/tag " + tag.getTag(), false);
tagRef.setForceUpdate(false);
Result result = tagRef.update();
switch (result) {
case NEW:
case FORCED:
log.debug("Successfully created backup tag");
break;
case LOCK_FAILURE:
log.error("Failed to lock repository while creating backup tag");
break;
case REJECTED:
log.error("Tag already exists while creating backup tag");
break;
case FAST_FORWARD:
case IO_FAILURE:
case NOT_ATTEMPTED:
case NO_CHANGE:
case REJECTED_CURRENT_BRANCH:
case RENAMED:
case REJECTED_MISSING_OBJECT:
case REJECTED_OTHER_REASON:
default:
log.error("Unexpected result while creating backup tag: {}", result);
}
} else {
BranchInput input = new BranchInput();
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(refUpdate.oldRev)).getId());
try {
createBranch.apply(project, IdString.fromDecoded(backupRef), input);
} catch (BadRequestException
| AuthException
| ResourceConflictException
| IOException
| PermissionBackendException
| NoSuchProjectException e) {
log.error("Failed to create backup ref {}", backupRef, e);
}
}
}
} catch (RepositoryNotFoundException e) {
log.error("Repository does not exist", e);
} catch (IOException e) {
log.error("Could not open repository", e);
}
}