From 398d8e877f91216e287a7a569ea758062dd7c521 Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Sat, 9 Jan 2016 17:27:25 -0800 Subject: [PATCH] RefTree: Change peel suffix to " ^" (space carrot) Using ^{} as the peel suffix has caused problems when projects used tags like v2.1 and then v2.1.1, v2.2.2, etc. The peeled value for v2.1 was stored very far away in the tree relative to v2.1 itself as ^ sorts in the ASCII/UTF-8 encoding after all other common tag characters like digits and dots. Use " ^" instead as space is not valid in a reference name, sorts before all other valid reference characters (thus forcing next entry locality) and this looks like a peeled marker for the prior tag. Change-Id: I26d2247a0428dfe26a9c319c02159502b3a67455 --- .../eclipse/jgit/internal/storage/reftree/RefTree.java | 8 ++++---- .../eclipse/jgit/internal/storage/reftree/Scanner.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTree.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTree.java index 66c0be676..43eec5185 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTree.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/RefTree.java @@ -100,15 +100,15 @@ * blob storing the name of the target reference. *

* Annotated tags also store the peeled object using a {@code GITLINK} entry - * with the suffix "^{}", for example {@code "tags/v1.0"} stores - * the annotated tag object, while "tags/v1.0^{}" stores the commit - * the tag annotates. + * with the suffix " ^" (space carrot), for example + * {@code "tags/v1.0"} stores the annotated tag object, while + * "tags/v1.0 ^" stores the commit the tag annotates. *

* {@code HEAD} is a special case and stored as {@code "..HEAD"}. */ public class RefTree { /** Suffix applied to GITLINK to indicate its the peeled value of a tag. */ - public static final String PEELED_SUFFIX = "^{}"; //$NON-NLS-1$ + public static final String PEELED_SUFFIX = " ^"; //$NON-NLS-1$ static final String ROOT_DOTDOT = ".."; //$NON-NLS-1$ /** diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/Scanner.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/Scanner.java index b3aeed0df..d383abf31 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/Scanner.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftree/Scanner.java @@ -230,7 +230,7 @@ private static RevTree toTree(ObjectReader reader, AnyObjectId id) private static boolean curElementHasPeelSuffix(AbstractTreeIterator itr) { int n = itr.getEntryPathLength(); byte[] c = itr.getEntryPathBuffer(); - return n > 3 && c[n - 3] == '^' && c[n - 2] == '{' && c[n - 1] == '}'; + return n > 2 && c[n - 2] == ' ' && c[n - 1] == '^'; } private static void peel(RefList.Builder all, CanonicalTreeParser p) { @@ -272,7 +272,7 @@ private static String refName(CanonicalTreeParser p, boolean peel) { byte[] buf = p.getEntryPathBuffer(); int len = p.getEntryPathLength(); if (peel) { - len -= 3; + len -= 2; } int ptr = 0; if (RawParseUtils.match(buf, ptr, REFS_DOT_DOT) > 0) {