|
|
@@ -375,8 +375,6 @@ public abstract class Repository { |
|
|
|
* Currently supported is combinations of these. |
|
|
|
* <ul> |
|
|
|
* <li>SHA-1 - a SHA-1</li> |
|
|
|
* <li>SHA-1 abbreviation - a leading prefix of a SHA-1. At least the first |
|
|
|
* two bytes must be supplied.</li> |
|
|
|
* <li>refs/... - a ref name</li> |
|
|
|
* <li>ref^n - nth parent reference</li> |
|
|
|
* <li>ref~n - distance via parent reference</li> |
|
|
@@ -387,7 +385,6 @@ public abstract class Repository { |
|
|
|
* |
|
|
|
* Not supported is: |
|
|
|
* <ul> |
|
|
|
* <li>tag-NNN-gcommit - a non tagged revision from git describe</li> |
|
|
|
* <li>timestamps in reflogs, ref@{full or relative timestamp}</li> |
|
|
|
* </ul> |
|
|
|
* |
|
|
@@ -562,6 +559,25 @@ public abstract class Repository { |
|
|
|
revstr); |
|
|
|
i = m - 1; |
|
|
|
break; |
|
|
|
case '-': |
|
|
|
if (i + 4 < rev.length && rev[i + 1] == 'g' |
|
|
|
&& isHex(rev[i + 2]) && isHex(rev[i + 3])) { |
|
|
|
// Possibly output from git describe? |
|
|
|
// Resolve longest valid abbreviation. |
|
|
|
int cnt = 2; |
|
|
|
while (i + 2 + cnt < rev.length && isHex(rev[i + 2 + cnt])) |
|
|
|
cnt++; |
|
|
|
String s = new String(rev, i + 2, cnt); |
|
|
|
if (AbbreviatedObjectId.isId(s)) { |
|
|
|
ObjectId id = resolveAbbreviation(s); |
|
|
|
if (id != null) { |
|
|
|
ref = rw.parseAny(id); |
|
|
|
i += 1 + s.length(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
if (ref != null) |
|
|
|
throw new RevisionSyntaxException(revstr); |
|
|
@@ -570,6 +586,12 @@ public abstract class Repository { |
|
|
|
return ref != null ? ref.copy() : resolveSimple(revstr); |
|
|
|
} |
|
|
|
|
|
|
|
private static boolean isHex(char c) { |
|
|
|
return ('0' <= c && c <= '9') // |
|
|
|
|| ('a' <= c && c <= 'f') // |
|
|
|
|| ('A' <= c && c <= 'F'); |
|
|
|
} |
|
|
|
|
|
|
|
private RevObject parseSimple(RevWalk rw, String revstr) throws IOException { |
|
|
|
ObjectId id = resolveSimple(revstr); |
|
|
|
return id != null ? rw.parseAny(id) : null; |
|
|
@@ -583,23 +605,29 @@ public abstract class Repository { |
|
|
|
if (r != null) |
|
|
|
return r.getObjectId(); |
|
|
|
|
|
|
|
if (AbbreviatedObjectId.isId(revstr)) { |
|
|
|
AbbreviatedObjectId id = AbbreviatedObjectId.fromString(revstr); |
|
|
|
ObjectReader reader = newObjectReader(); |
|
|
|
try { |
|
|
|
Collection<ObjectId> matches = reader.resolve(id); |
|
|
|
if (matches.size() == 1) |
|
|
|
return matches.iterator().next(); |
|
|
|
if (1 < matches.size()) |
|
|
|
throw new AmbiguousObjectException(id, matches); |
|
|
|
} finally { |
|
|
|
reader.release(); |
|
|
|
} |
|
|
|
} |
|
|
|
if (AbbreviatedObjectId.isId(revstr)) |
|
|
|
return resolveAbbreviation(revstr); |
|
|
|
|
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
private ObjectId resolveAbbreviation(final String revstr) throws IOException, |
|
|
|
AmbiguousObjectException { |
|
|
|
AbbreviatedObjectId id = AbbreviatedObjectId.fromString(revstr); |
|
|
|
ObjectReader reader = newObjectReader(); |
|
|
|
try { |
|
|
|
Collection<ObjectId> matches = reader.resolve(id); |
|
|
|
if (matches.size() == 0) |
|
|
|
return null; |
|
|
|
else if (matches.size() == 1) |
|
|
|
return matches.iterator().next(); |
|
|
|
else |
|
|
|
throw new AmbiguousObjectException(id, matches); |
|
|
|
} finally { |
|
|
|
reader.release(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** Increment the use counter by one, requiring a matched {@link #close()}. */ |
|
|
|
public void incrementOpen() { |
|
|
|
useCnt.incrementAndGet(); |