Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgRemoteRepository.java @ 179:da426c2fe1ec
Support for changegroup wire command
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Wed, 06 Apr 2011 02:50:26 +0200 |
| parents | 62665d8f0686 |
| children | cd3371670f0b |
comparison
equal
deleted
inserted
replaced
| 178:62665d8f0686 | 179:da426c2fe1ec |
|---|---|
| 15 * contact TMate Software at support@hg4j.com | 15 * contact TMate Software at support@hg4j.com |
| 16 */ | 16 */ |
| 17 package org.tmatesoft.hg.repo; | 17 package org.tmatesoft.hg.repo; |
| 18 | 18 |
| 19 import java.io.File; | 19 import java.io.File; |
| 20 import java.io.FileOutputStream; | |
| 20 import java.io.IOException; | 21 import java.io.IOException; |
| 22 import java.io.InputStream; | |
| 21 import java.io.InputStreamReader; | 23 import java.io.InputStreamReader; |
| 22 import java.io.OutputStream; | 24 import java.io.OutputStream; |
| 23 import java.io.StreamTokenizer; | 25 import java.io.StreamTokenizer; |
| 24 import java.net.HttpURLConnection; | 26 import java.net.HttpURLConnection; |
| 25 import java.net.MalformedURLException; | 27 import java.net.MalformedURLException; |
| 35 import java.util.LinkedList; | 37 import java.util.LinkedList; |
| 36 import java.util.List; | 38 import java.util.List; |
| 37 import java.util.Map; | 39 import java.util.Map; |
| 38 import java.util.prefs.BackingStoreException; | 40 import java.util.prefs.BackingStoreException; |
| 39 import java.util.prefs.Preferences; | 41 import java.util.prefs.Preferences; |
| 42 import java.util.zip.InflaterInputStream; | |
| 40 | 43 |
| 41 import javax.net.ssl.HttpsURLConnection; | 44 import javax.net.ssl.HttpsURLConnection; |
| 42 import javax.net.ssl.SSLContext; | 45 import javax.net.ssl.SSLContext; |
| 43 import javax.net.ssl.TrustManager; | 46 import javax.net.ssl.TrustManager; |
| 44 import javax.net.ssl.X509TrustManager; | 47 import javax.net.ssl.X509TrustManager; |
| 275 } | 278 } |
| 276 } | 279 } |
| 277 | 280 |
| 278 // WireProtocol wiki: roots = a list of the latest nodes on every service side changeset branch that both the client and server know about. | 281 // WireProtocol wiki: roots = a list of the latest nodes on every service side changeset branch that both the client and server know about. |
| 279 public HgBundle getChanges(List<Nodeid> roots) throws HgException { | 282 public HgBundle getChanges(List<Nodeid> roots) throws HgException { |
| 280 return new HgLookup().loadBundle(new File("/temp/hg/hg-bundle-000000000000-gz.tmp")); | 283 StringBuilder sb = new StringBuilder(20 + roots.size() * 41); |
| 284 sb.append("roots="); | |
| 285 for (Nodeid n : roots) { | |
| 286 sb.append(n.toString()); | |
| 287 sb.append('+'); | |
| 288 } | |
| 289 if (sb.charAt(sb.length() - 1) == '+') { | |
| 290 // strip last space | |
| 291 sb.setLength(sb.length() - 1); | |
| 292 } | |
| 293 try { | |
| 294 URL u = new URL(url, url.getPath() + "?cmd=changegroup&" + sb.toString()); | |
| 295 HttpURLConnection c = setupConnection(u.openConnection()); | |
| 296 c.connect(); | |
| 297 if (debug) { | |
| 298 dumpResponseHeader(u, c); | |
| 299 } | |
| 300 File tf = writeBundle(c.getInputStream(), false, "HG10GZ" /*didn't see any other that zip*/); | |
| 301 return new HgLookup().loadBundle(tf); | |
| 302 } catch (MalformedURLException ex) { | |
| 303 throw new HgException(ex); | |
| 304 } catch (IOException ex) { | |
| 305 throw new HgException(ex); | |
| 306 } | |
| 281 } | 307 } |
| 282 | 308 |
| 283 private HttpURLConnection setupConnection(URLConnection urlConnection) { | 309 private HttpURLConnection setupConnection(URLConnection urlConnection) { |
| 284 urlConnection.setRequestProperty("User-Agent", "hg4j/0.5.0"); | 310 urlConnection.setRequestProperty("User-Agent", "hg4j/0.5.0"); |
| 285 urlConnection.addRequestProperty("Accept", "application/mercurial-0.1"); | 311 urlConnection.addRequestProperty("Accept", "application/mercurial-0.1"); |
| 298 final Map<String, List<String>> headerFields = c.getHeaderFields(); | 324 final Map<String, List<String>> headerFields = c.getHeaderFields(); |
| 299 for (String s : headerFields.keySet()) { | 325 for (String s : headerFields.keySet()) { |
| 300 System.out.printf("%s: %s\n", s, c.getHeaderField(s)); | 326 System.out.printf("%s: %s\n", s, c.getHeaderField(s)); |
| 301 } | 327 } |
| 302 } | 328 } |
| 329 | |
| 330 private static File writeBundle(InputStream is, boolean decompress, String header) throws IOException { | |
| 331 InputStream zipStream = decompress ? new InflaterInputStream(is) : is; | |
| 332 File tf = File.createTempFile("hg-bundle-", null); | |
| 333 FileOutputStream fos = new FileOutputStream(tf); | |
| 334 fos.write(header.getBytes()); | |
| 335 int r; | |
| 336 byte[] buf = new byte[8*1024]; | |
| 337 while ((r = zipStream.read(buf)) != -1) { | |
| 338 fos.write(buf, 0, r); | |
| 339 } | |
| 340 fos.close(); | |
| 341 zipStream.close(); | |
| 342 return tf; | |
| 343 } | |
| 344 | |
| 303 | 345 |
| 304 public static final class Range { | 346 public static final class Range { |
| 305 /** | 347 /** |
| 306 * Root of the range, earlier revision | 348 * Root of the range, earlier revision |
| 307 */ | 349 */ |
