diff options
author | Thomas Wolf <thomas.wolf@paranor.ch> | 2021-01-07 17:10:45 +0100 |
---|---|---|
committer | Thomas Wolf <thomas.wolf@paranor.ch> | 2021-01-10 10:19:40 -0500 |
commit | dd3846513bbc682b9c51b09d369687ab7a036a49 (patch) | |
tree | 83d745d1dc95baab8b1009edfe11f0cbe47e2d96 /org.eclipse.jgit | |
parent | db48fcedbc7284076f48f00e836ab944ff119fdb (diff) | |
download | jgit-dd3846513bbc682b9c51b09d369687ab7a036a49.tar.gz jgit-dd3846513bbc682b9c51b09d369687ab7a036a49.zip |
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>
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java | 48 |
1 files changed, 36 insertions, 12 deletions
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 3bcdfafea7..3499136f92 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java @@ -202,24 +202,16 @@ public class RevTag extends RevObject { return -1; } - /** - * Parse the GPG signature from the raw buffer. - * - * @return contents of the GPG signature; {@code null} if the tag was not - * signed. - * @since 5.11 - */ - @Nullable - public final byte[] getRawGpgSignature() { + private int getSignatureStart() { byte[] raw = buffer; int msgB = RawParseUtils.tagMessage(raw, 0); if (msgB < 0) { - return null; + return msgB; } // Find the last signature start and return the rest int start = nextStart(hSignature, raw, msgB); if (start < 0) { - return null; + return start; } int next = RawParseUtils.nextLF(raw, start); while (next < raw.length) { @@ -230,6 +222,23 @@ public class RevTag extends RevObject { start = newStart; next = RawParseUtils.nextLF(raw, start); } + return start; + } + + /** + * Parse the GPG signature from the raw buffer. + * + * @return contents of the GPG signature; {@code null} if the tag was not + * signed. + * @since 5.11 + */ + @Nullable + public final byte[] getRawGpgSignature() { + byte[] raw = buffer; + int start = getSignatureStart(); + if (start < 0) { + return null; + } return Arrays.copyOfRange(raw, start, raw.length); } @@ -249,7 +258,12 @@ public class RevTag extends RevObject { 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 @@ public class RevTag extends RevObject { } 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); |