Download HEAD by itself if not in info/refs
The dumb HTTP transport needs to download the HEAD ref and resolve it manually if HEAD does not appear in info/refs. Its typically for it to not be in the info/refs file. Change-Id: Ie2a58fdfacfeee530b10edb433b8f98c85568585 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
parent
8c836c6f21
commit
d5bc8be743
|
@ -187,16 +187,7 @@ public FetchConnection openFetch() throws TransportException,
|
||||||
// Assume this server doesn't support smart HTTP fetch
|
// Assume this server doesn't support smart HTTP fetch
|
||||||
// and fall back on dumb object walking.
|
// and fall back on dumb object walking.
|
||||||
//
|
//
|
||||||
HttpObjectDB d = new HttpObjectDB(objectsUrl);
|
return newDumbConnection(in);
|
||||||
WalkFetchConnection wfc = new WalkFetchConnection(this, d);
|
|
||||||
BufferedReader br = new BufferedReader(
|
|
||||||
new InputStreamReader(in, Constants.CHARSET));
|
|
||||||
try {
|
|
||||||
wfc.available(d.readAdvertisedImpl(br));
|
|
||||||
} finally {
|
|
||||||
br.close();
|
|
||||||
}
|
|
||||||
return wfc;
|
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
in.close();
|
in.close();
|
||||||
|
@ -210,6 +201,64 @@ public FetchConnection openFetch() throws TransportException,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private FetchConnection newDumbConnection(InputStream in)
|
||||||
|
throws IOException, PackProtocolException {
|
||||||
|
HttpObjectDB d = new HttpObjectDB(objectsUrl);
|
||||||
|
BufferedReader br = toBufferedReader(in);
|
||||||
|
Map<String, Ref> refs;
|
||||||
|
try {
|
||||||
|
refs = d.readAdvertisedImpl(br);
|
||||||
|
} finally {
|
||||||
|
br.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!refs.containsKey(Constants.HEAD)) {
|
||||||
|
// If HEAD was not published in the info/refs file (it usually
|
||||||
|
// is not there) download HEAD by itself as a loose file and do
|
||||||
|
// the resolution by hand.
|
||||||
|
//
|
||||||
|
HttpURLConnection conn = httpOpen(new URL(baseUrl, Constants.HEAD));
|
||||||
|
int status = HttpSupport.response(conn);
|
||||||
|
switch (status) {
|
||||||
|
case HttpURLConnection.HTTP_OK: {
|
||||||
|
br = toBufferedReader(openInputStream(conn));
|
||||||
|
try {
|
||||||
|
String line = br.readLine();
|
||||||
|
if (line != null && line.startsWith("ref: ")) {
|
||||||
|
Ref src = refs.get(line.substring(5));
|
||||||
|
if (src != null) {
|
||||||
|
refs.put(Constants.HEAD, new Ref(
|
||||||
|
Ref.Storage.NETWORK, Constants.HEAD, src
|
||||||
|
.getName(), src.getObjectId()));
|
||||||
|
}
|
||||||
|
} else if (line != null && ObjectId.isId(line)) {
|
||||||
|
refs.put(Constants.HEAD, new Ref(Ref.Storage.NETWORK,
|
||||||
|
Constants.HEAD, ObjectId.fromString(line)));
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
br.close();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case HttpURLConnection.HTTP_NOT_FOUND:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new TransportException(uri, "cannot read HEAD: " + status
|
||||||
|
+ " " + conn.getResponseMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
WalkFetchConnection wfc = new WalkFetchConnection(this, d);
|
||||||
|
wfc.available(refs);
|
||||||
|
return wfc;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BufferedReader toBufferedReader(InputStream in) {
|
||||||
|
return new BufferedReader(new InputStreamReader(in, Constants.CHARSET));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PushConnection openPush() throws NotSupportedException,
|
public PushConnection openPush() throws NotSupportedException,
|
||||||
TransportException {
|
TransportException {
|
||||||
|
|
Loading…
Reference in New Issue