Add details from original tag

The original tag was being used as the basis for a branch or commit,
which would result in errors when parsing.  This stores a reference
to the commit the original tag points to, and, when backing up as
a tag, it also stores the original tag message.

Change-Id: Ie23739630f18e8af0aa7a76c1e4f9b362a5f2d6b
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 93f0227..af075c9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/refprotection/BackupRef.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/refprotection/BackupRef.java
@@ -34,6 +34,8 @@
 import com.google.gerrit.server.project.ProjectResource;
 import com.google.inject.Inject;
 
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectInserter;
@@ -43,6 +45,7 @@
 import org.eclipse.jgit.lib.RefUpdate.Result;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.TagBuilder;
+import org.eclipse.jgit.revwalk.RevTag;
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -93,10 +96,28 @@
             update = "Deleted";
           }
           String type = "branch";
+          String fullMessage = "";
           if (event.refUpdate.refName.startsWith(R_TAGS)) {
             type = "tag";
+            try {
+              RevTag origTag =
+                  revWalk.parseTag(ObjectId.fromString(event.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 + " " + event.refUpdate.refName);
+          tag.setMessage(update + " " + type + " " + event.refUpdate.refName + fullMessage);
           tag.setTag(backupRef);
 
           ObjectInserter inserter = git.newObjectInserter();