Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgRemoteRepository.java @ 698:822f3a83ff57
in, out and clone tests pass for ssh repositories. Infrastructure to decouple HgRemoteRepository from specific Connector implementation
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Tue, 06 Aug 2013 21:18:33 +0200 |
| parents | 24f4efedc9d5 |
| children | a483b2b68a2e |
comparison
equal
deleted
inserted
replaced
| 697:24f4efedc9d5 | 698:822f3a83ff57 |
|---|---|
| 19 import static org.tmatesoft.hg.internal.remote.Connector.*; | 19 import static org.tmatesoft.hg.internal.remote.Connector.*; |
| 20 import static org.tmatesoft.hg.util.Outcome.Kind.Failure; | 20 import static org.tmatesoft.hg.util.Outcome.Kind.Failure; |
| 21 import static org.tmatesoft.hg.util.Outcome.Kind.Success; | 21 import static org.tmatesoft.hg.util.Outcome.Kind.Success; |
| 22 | 22 |
| 23 import java.io.BufferedReader; | 23 import java.io.BufferedReader; |
| 24 import java.io.ByteArrayOutputStream; | |
| 25 import java.io.File; | 24 import java.io.File; |
| 26 import java.io.IOException; | 25 import java.io.IOException; |
| 27 import java.io.InputStream; | 26 import java.io.InputStream; |
| 28 import java.io.InputStreamReader; | 27 import java.io.InputStreamReader; |
| 29 import java.io.OutputStream; | 28 import java.io.OutputStream; |
| 30 import java.io.StreamTokenizer; | 29 import java.io.StreamTokenizer; |
| 31 import java.net.ContentHandler; | |
| 32 import java.net.ContentHandlerFactory; | |
| 33 import java.net.URL; | |
| 34 import java.net.URLConnection; | |
| 35 import java.util.ArrayList; | 30 import java.util.ArrayList; |
| 36 import java.util.Arrays; | 31 import java.util.Arrays; |
| 37 import java.util.Collection; | 32 import java.util.Collection; |
| 38 import java.util.Collections; | 33 import java.util.Collections; |
| 39 import java.util.HashSet; | 34 import java.util.HashSet; |
| 56 import org.tmatesoft.hg.internal.EncodingHelper; | 51 import org.tmatesoft.hg.internal.EncodingHelper; |
| 57 import org.tmatesoft.hg.internal.FileUtils; | 52 import org.tmatesoft.hg.internal.FileUtils; |
| 58 import org.tmatesoft.hg.internal.Internals; | 53 import org.tmatesoft.hg.internal.Internals; |
| 59 import org.tmatesoft.hg.internal.PropertyMarshal; | 54 import org.tmatesoft.hg.internal.PropertyMarshal; |
| 60 import org.tmatesoft.hg.internal.remote.Connector; | 55 import org.tmatesoft.hg.internal.remote.Connector; |
| 61 import org.tmatesoft.hg.internal.remote.HttpConnector; | 56 import org.tmatesoft.hg.internal.remote.RemoteConnectorDescriptor; |
| 62 import org.tmatesoft.hg.internal.remote.SshConnector; | 57 import org.tmatesoft.hg.repo.HgLookup.RemoteDescriptor; |
| 63 import org.tmatesoft.hg.util.LogFacility.Severity; | 58 import org.tmatesoft.hg.util.LogFacility.Severity; |
| 64 import org.tmatesoft.hg.util.Outcome; | 59 import org.tmatesoft.hg.util.Outcome; |
| 65 import org.tmatesoft.hg.util.Pair; | 60 import org.tmatesoft.hg.util.Pair; |
| 66 | 61 |
| 67 /** | 62 /** |
| 79 private HgLookup lookupHelper; | 74 private HgLookup lookupHelper; |
| 80 private final SessionContext sessionContext; | 75 private final SessionContext sessionContext; |
| 81 private Set<String> remoteCapabilities; | 76 private Set<String> remoteCapabilities; |
| 82 private Connector remote; | 77 private Connector remote; |
| 83 | 78 |
| 84 static { | 79 HgRemoteRepository(SessionContext ctx, RemoteDescriptor rd) throws HgBadArgumentException { |
| 85 URLConnection.setContentHandlerFactory(new ContentHandlerFactory() { | 80 if (false == rd instanceof RemoteConnectorDescriptor) { |
| 86 | 81 throw new IllegalArgumentException(String.format("Present implementation supports remote connections via %s only", Connector.class.getName())); |
| 87 public ContentHandler createContentHandler(String mimetype) { | |
| 88 if ("application/mercurial-0.1".equals(mimetype)) { | |
| 89 return new ContentHandler() { | |
| 90 | |
| 91 @Override | |
| 92 public Object getContent(URLConnection urlc) throws IOException { | |
| 93 if (urlc.getContentLength() > 0) { | |
| 94 ByteArrayOutputStream bos = new ByteArrayOutputStream(); | |
| 95 InputStream is = urlc.getInputStream(); | |
| 96 int r; | |
| 97 while ((r = is.read()) != -1) { | |
| 98 bos.write(r); | |
| 99 } | |
| 100 return new String(bos.toByteArray()); | |
| 101 } | |
| 102 return "<empty>"; | |
| 103 } | |
| 104 }; | |
| 105 } | |
| 106 return null; | |
| 107 } | |
| 108 }); | |
| 109 } | |
| 110 | |
| 111 HgRemoteRepository(SessionContext ctx, URL url) throws HgBadArgumentException { | |
| 112 if (url == null || ctx == null) { | |
| 113 throw new IllegalArgumentException(); | |
| 114 } | 82 } |
| 115 sessionContext = ctx; | 83 sessionContext = ctx; |
| 116 debug = new PropertyMarshal(ctx).getBoolean("hg4j.remote.debug", false); | 84 debug = new PropertyMarshal(ctx).getBoolean("hg4j.remote.debug", false); |
| 117 remote = "ssh".equals(url.getProtocol()) ? new SshConnector() : new HttpConnector(); | 85 remote = ((RemoteConnectorDescriptor) rd).createConnector(); |
| 118 remote.init(url, ctx, null); | 86 remote.init(rd.getURI(), ctx, null); |
| 119 } | 87 } |
| 120 | 88 |
| 121 public boolean isInvalid() throws HgRemoteConnectionException { | 89 public boolean isInvalid() throws HgRemoteConnectionException { |
| 122 initCapabilities(); | 90 initCapabilities(); |
| 123 return remoteCapabilities.isEmpty(); | 91 return remoteCapabilities.isEmpty(); |
| 516 } | 484 } |
| 517 RemoteBranch o = (RemoteBranch) obj; | 485 RemoteBranch o = (RemoteBranch) obj; |
| 518 // in fact, p1 and p2 are not supposed to be null, ever (at least for RemoteBranch created from server output) | 486 // in fact, p1 and p2 are not supposed to be null, ever (at least for RemoteBranch created from server output) |
| 519 return head.equals(o.head) && root.equals(o.root) && (p1 == null && o.p1 == null || p1.equals(o.p1)) && (p2 == null && o.p2 == null || p2.equals(o.p2)); | 487 return head.equals(o.head) && root.equals(o.root) && (p1 == null && o.p1 == null || p1.equals(o.p1)) && (p2 == null && o.p2 == null || p2.equals(o.p2)); |
| 520 } | 488 } |
| 489 | |
| 490 @Override | |
| 491 public int hashCode() { | |
| 492 return head.hashCode() ^ root.hashCode(); | |
| 493 } | |
| 494 | |
| 495 @Override | |
| 496 public String toString() { | |
| 497 String none = String.valueOf(-1); | |
| 498 String s1 = p1 == null || p1.isNull() ? none : p1.shortNotation(); | |
| 499 String s2 = p2 == null || p2.isNull() ? none : p2.shortNotation(); | |
| 500 return String.format("RemoteBranch[root: %s, head:%s, p1:%s, p2:%s]", root.shortNotation(), head.shortNotation(), s1, s2); | |
| 501 } | |
| 521 } | 502 } |
| 522 | 503 |
| 523 public static final class Bookmarks implements Iterable<Pair<String, Nodeid>> { | 504 public static final class Bookmarks implements Iterable<Pair<String, Nodeid>> { |
| 524 private final List<Pair<String, Nodeid>> bm; | 505 private final List<Pair<String, Nodeid>> bm; |
| 525 | 506 |
