Tag message must not include the signature

Signatures on tags are just tacked onto the end of the message.
Getting the message must not return the signature. Compare [1]
and [2] in C git, which both drop a signature at the end of an
object body.

[1] https://github.com/git/git/blob/21bf933/builtin/tag.c#L173
[2] https://github.com/git/git/blob/21bf933/ref-filter.c#L1276

Change-Id: Ic8a1062b8bc77f2d7c138c3fe8a7fd13b1253f38
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Show.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Show.java
index 5f9551e..1d43220 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Show.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Show.java
@@ -41,6 +41,7 @@
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.treewalk.TreeWalk;
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
+import org.eclipse.jgit.util.RawParseUtils;
 import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.Option;
 
@@ -219,13 +220,17 @@
 		}
 
 		outw.println();
-		final String[] lines = tag.getFullMessage().split("\n"); //$NON-NLS-1$
+		String[] lines = tag.getFullMessage().split("\n"); //$NON-NLS-1$
 		for (String s : lines) {
-			outw.print("    "); //$NON-NLS-1$
-			outw.print(s);
-			outw.println();
+			outw.println(s);
 		}
-
+		byte[] rawSignature = tag.getRawGpgSignature();
+		if (rawSignature != null) {
+			lines = RawParseUtils.decode(rawSignature).split("\n"); //$NON-NLS-1$
+			for (String s : lines) {
+				outw.println(s);
+			}
+		}
 		outw.println();
 	}
 
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevTagParseTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevTagParseTest.java
index edddc33..a3ba3d6 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevTagParseTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevTagParseTest.java
@@ -136,7 +136,7 @@
 				+ "\n" //
 				+ "iD8DBQBC0b9oF3Y\n" //
 				+ "-----END PGP SIGNATURE-----";
-		final String message = "test\n\n" + fakeSignature + '\n';
+		final String message = "test\n" + fakeSignature + '\n';
 
 		final StringBuilder body = new StringBuilder();
 
@@ -168,7 +168,7 @@
 		assertNotNull(c.getTagName());
 		assertEquals(name, c.getTagName());
 		assertEquals("test", c.getShortMessage());
-		assertEquals(message, c.getFullMessage());
+		assertEquals("test\n", c.getFullMessage());
 		assertEquals(fakeSignature + '\n',
 				new String(c.getRawGpgSignature(), US_ASCII));
 
@@ -406,7 +406,7 @@
 		b.write("tag v1.0\n".getBytes(UTF_8));
 		b.write("tagger t <t@example.com> 1218123387 +0700\n".getBytes(UTF_8));
 		b.write('\n');
-		b.write("message\n\n".getBytes(UTF_8));
+		b.write("message\n".getBytes(UTF_8));
 		b.write(signature.getBytes(US_ASCII));
 		b.write('\n');
 
@@ -417,7 +417,7 @@
 
 		assertEquals("t", t.getTaggerIdent().getName());
 		assertEquals("message", t.getShortMessage());
-		assertEquals("message\n\n" + signature + '\n', t.getFullMessage());
+		assertEquals("message\n", t.getFullMessage());
 		String gpgSig = new String(t.getRawGpgSignature(), UTF_8);
 		assertEquals(signature + '\n', gpgSig);
 	}
@@ -452,7 +452,7 @@
 
 		assertEquals("t", t.getTaggerIdent().getName());
 		assertEquals("message", t.getShortMessage());
-		assertEquals(message + signature + '\n', t.getFullMessage());
+		assertEquals(message, t.getFullMessage());
 		String gpgSig = new String(t.getRawGpgSignature(), UTF_8);
 		assertEquals(signature + '\n', gpgSig);
 	}
@@ -486,7 +486,7 @@
 
 		assertEquals("t", t.getTaggerIdent().getName());
 		assertEquals("message", t.getShortMessage());
-		assertEquals(message + signature + '\n', t.getFullMessage());
+		assertEquals(message, t.getFullMessage());
 		String gpgSig = new String(t.getRawGpgSignature(), UTF_8);
 		assertEquals(signature + '\n', gpgSig);
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java
index 3bcdfaf..3499136 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java
@@ -202,6 +202,29 @@
 		return -1;
 	}
 
+	private int getSignatureStart() {
+		byte[] raw = buffer;
+		int msgB = RawParseUtils.tagMessage(raw, 0);
+		if (msgB < 0) {
+			return msgB;
+		}
+		// Find the last signature start and return the rest
+		int start = nextStart(hSignature, raw, msgB);
+		if (start < 0) {
+			return start;
+		}
+		int next = RawParseUtils.nextLF(raw, start);
+		while (next < raw.length) {
+			int newStart = nextStart(hSignature, raw, next);
+			if (newStart < 0) {
+				break;
+			}
+			start = newStart;
+			next = RawParseUtils.nextLF(raw, start);
+		}
+		return start;
+	}
+
 	/**
 	 * Parse the GPG signature from the raw buffer.
 	 *
@@ -212,24 +235,10 @@
 	@Nullable
 	public final byte[] getRawGpgSignature() {
 		byte[] raw = buffer;
-		int msgB = RawParseUtils.tagMessage(raw, 0);
-		if (msgB < 0) {
-			return null;
-		}
-		// Find the last signature start and return the rest
-		int start = nextStart(hSignature, raw, msgB);
+		int start = getSignatureStart();
 		if (start < 0) {
 			return null;
 		}
-		int next = RawParseUtils.nextLF(raw, start);
-		while (next < raw.length) {
-			int newStart = nextStart(hSignature, raw, next);
-			if (newStart < 0) {
-				break;
-			}
-			start = newStart;
-			next = RawParseUtils.nextLF(raw, start);
-		}
 		return Arrays.copyOfRange(raw, start, raw.length);
 	}
 
@@ -249,7 +258,12 @@
 		if (msgB < 0) {
 			return ""; //$NON-NLS-1$
 		}
-		return RawParseUtils.decode(guessEncoding(), raw, msgB, raw.length);
+		int signatureStart = getSignatureStart();
+		int end = signatureStart < 0 ? raw.length : signatureStart;
+		if (end == msgB) {
+			return ""; //$NON-NLS-1$
+		}
+		return RawParseUtils.decode(guessEncoding(), raw, msgB, end);
 	}
 
 	/**
@@ -275,6 +289,16 @@
 		}
 
 		int msgE = RawParseUtils.endOfParagraph(raw, msgB);
+		int signatureStart = getSignatureStart();
+		if (signatureStart >= msgB && msgE > signatureStart) {
+			msgE = signatureStart;
+			if (msgE > msgB) {
+				msgE--;
+			}
+			if (msgB == msgE) {
+				return ""; //$NON-NLS-1$
+			}
+		}
 		String str = RawParseUtils.decode(guessEncoding(), raw, msgB, msgE);
 		if (RevCommit.hasLF(raw, msgB, msgE)) {
 			str = StringUtils.replaceLineBreaksWithSpace(str);