From 1c5c9ac99cf6ab76a87f51f73dfe0b391539a420 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Sun, 29 Jun 2008 03:59:24 -0400 Subject: [PATCH] Extract readPackedRefs from TransportSftp for reuse Other dumb transports may need this functionality available to them. Signed-off-by: Shawn O. Pearce Signed-off-by: Robin Rosenberg --- .../org/spearce/jgit/transport/TransportHttp.java | 5 ++ .../org/spearce/jgit/transport/TransportSftp.java | 47 +++--------------- .../src/org/spearce/jgit/transport/URIish.java | 22 ++++++++ .../jgit/transport/WalkRemoteObjectDatabase.java | 58 ++++++++++++++++++++++ 4 files changed, 91 insertions(+), 41 deletions(-) diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/TransportHttp.java b/org.spearce.jgit/src/org/spearce/jgit/transport/TransportHttp.java index 46559504..2f28f2c1 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/transport/TransportHttp.java +++ b/org.spearce.jgit/src/org/spearce/jgit/transport/TransportHttp.java @@ -119,6 +119,11 @@ class TransportHttp extends WalkTransport { } @Override + URIish getURI() { + return new URIish(objectsUrl); + } + + @Override Collection getAlternates() throws IOException { try { return readAlternates(INFO_HTTP_ALTERNATES); diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/TransportSftp.java b/org.spearce.jgit/src/org/spearce/jgit/transport/TransportSftp.java index e5db6cc4..a33406bd 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/transport/TransportSftp.java +++ b/org.spearce.jgit/src/org/spearce/jgit/transport/TransportSftp.java @@ -193,6 +193,11 @@ class TransportSftp extends WalkTransport { } @Override + URIish getURI() { + return uri.setPath(objectsPath); + } + + @Override Collection getAlternates() throws IOException { try { return readAlternates(INFO_ALTERNATES); @@ -355,52 +360,12 @@ class TransportSftp extends WalkTransport { Map readAdvertisedRefs() throws TransportException { final TreeMap avail = new TreeMap(); - try { - final BufferedReader br = openReader(PACKED_REFS); - try { - readPackedRefs(avail, br); - } finally { - br.close(); - } - } catch (FileNotFoundException notPacked) { - // Perhaps it wasn't worthwhile, or is just an older repository. - } catch (IOException e) { - throw new TransportException(uri, "error in packed-refs", e); - } + readPackedRefs(avail); readRef(avail, "../HEAD", "HEAD"); readLooseRefs(avail, "../refs", "refs/"); return avail; } - private void readPackedRefs(final TreeMap avail, - final BufferedReader br) throws IOException { - Ref last = null; - for (;;) { - String line = br.readLine(); - if (line == null) - break; - if (line.charAt(0) == '#') - continue; - if (line.charAt(0) == '^') { - if (last == null) - throw new TransportException("Peeled line before ref."); - final ObjectId id = ObjectId.fromString(line + 1); - last = new Ref(Ref.Storage.PACKED, last.getName(), last - .getObjectId(), id); - avail.put(last.getName(), last); - continue; - } - - final int sp = line.indexOf(' '); - if (sp < 0) - throw new TransportException("Unrecognized ref: " + line); - final ObjectId id = ObjectId.fromString(line.substring(0, sp)); - final String name = line.substring(sp + 1); - last = new Ref(Ref.Storage.PACKED, name, id); - avail.put(last.getName(), last); - } - } - private void readLooseRefs(final TreeMap avail, final String dir, final String prefix) throws TransportException { diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/URIish.java b/org.spearce.jgit/src/org/spearce/jgit/transport/URIish.java index 307b591f..bb0a1907 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/transport/URIish.java +++ b/org.spearce.jgit/src/org/spearce/jgit/transport/URIish.java @@ -39,6 +39,7 @@ package org.spearce.jgit.transport; import java.net.URISyntaxException; +import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -100,6 +101,27 @@ public class URIish { } } + /** + * Construct a URIish from a standard URL. + * + * @param u + * the source URL to convert from. + */ + public URIish(final URL u) { + scheme = u.getProtocol(); + path = u.getPath(); + + final String ui = u.getUserInfo(); + if (ui != null) { + final int d = ui.indexOf(':'); + user = d < 0 ? ui : ui.substring(0, d); + pass = d < 0 ? null : ui.substring(d + 1); + } + + port = u.getPort(); + host = u.getHost(); + } + /** Create an empty, non-configured URI. */ public URIish() { // Configure nothing. diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/WalkRemoteObjectDatabase.java b/org.spearce.jgit/src/org/spearce/jgit/transport/WalkRemoteObjectDatabase.java index 580cf1ca..1e13b334 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/transport/WalkRemoteObjectDatabase.java +++ b/org.spearce.jgit/src/org/spearce/jgit/transport/WalkRemoteObjectDatabase.java @@ -47,7 +47,9 @@ import java.io.OutputStream; import java.io.StringWriter; import java.util.ArrayList; import java.util.Collection; +import java.util.Map; +import org.spearce.jgit.errors.TransportException; import org.spearce.jgit.lib.Constants; import org.spearce.jgit.lib.ObjectId; import org.spearce.jgit.lib.Ref; @@ -76,6 +78,8 @@ abstract class WalkRemoteObjectDatabase { static final String PACKED_REFS = "../packed-refs"; + abstract URIish getURI(); + /** * Obtain the list of available packs (if any). *

@@ -469,6 +473,60 @@ abstract class WalkRemoteObjectDatabase { } } + /** + * Read a standard Git packed-refs file to discover known references. + * + * @param avail + * return collection of references. Any existing entries will be + * replaced if they are found in the packed-refs file. + * @throws TransportException + * an error occurred reading from the packed refs file. + */ + protected void readPackedRefs(final Map avail) + throws TransportException { + try { + final BufferedReader br = openReader(PACKED_REFS); + try { + readPackedRefsImpl(avail, br); + } finally { + br.close(); + } + } catch (FileNotFoundException notPacked) { + // Perhaps it wasn't worthwhile, or is just an older repository. + } catch (IOException e) { + throw new TransportException(getURI(), "error in packed-refs", e); + } + } + + private void readPackedRefsImpl(final Map avail, + final BufferedReader br) throws IOException { + Ref last = null; + for (;;) { + String line = br.readLine(); + if (line == null) + break; + if (line.charAt(0) == '#') + continue; + if (line.charAt(0) == '^') { + if (last == null) + throw new TransportException("Peeled line before ref."); + final ObjectId id = ObjectId.fromString(line + 1); + last = new Ref(Ref.Storage.PACKED, last.getName(), last + .getObjectId(), id); + avail.put(last.getName(), last); + continue; + } + + final int sp = line.indexOf(' '); + if (sp < 0) + throw new TransportException("Unrecognized ref: " + line); + final ObjectId id = ObjectId.fromString(line.substring(0, sp)); + final String name = line.substring(sp + 1); + last = new Ref(Ref.Storage.PACKED, name, id); + avail.put(last.getName(), last); + } + } + static final class FileStream { final InputStream in; -- 2.11.4.GIT