Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgBundle.java @ 329:694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Thu, 13 Oct 2011 03:30:50 +0200 |
parents | 981f9f50bb6c |
children | 5f9073eabf06 |
comparison
equal
deleted
inserted
replaced
328:a674b8590362 | 329:694ebabb5cb3 |
---|---|
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.IOException; | 20 import java.io.IOException; |
21 import java.util.LinkedList; | 21 import java.util.LinkedList; |
22 import java.util.List; | |
23 | 22 |
24 import org.tmatesoft.hg.core.HgBadStateException; | 23 import org.tmatesoft.hg.core.HgBadStateException; |
25 import org.tmatesoft.hg.core.HgException; | 24 import org.tmatesoft.hg.core.HgException; |
26 import org.tmatesoft.hg.core.HgInvalidFileException; | 25 import org.tmatesoft.hg.core.HgInvalidFileException; |
27 import org.tmatesoft.hg.core.Nodeid; | 26 import org.tmatesoft.hg.core.Nodeid; |
29 import org.tmatesoft.hg.internal.ByteArrayDataAccess; | 28 import org.tmatesoft.hg.internal.ByteArrayDataAccess; |
30 import org.tmatesoft.hg.internal.DataAccess; | 29 import org.tmatesoft.hg.internal.DataAccess; |
31 import org.tmatesoft.hg.internal.DataAccessProvider; | 30 import org.tmatesoft.hg.internal.DataAccessProvider; |
32 import org.tmatesoft.hg.internal.DigestHelper; | 31 import org.tmatesoft.hg.internal.DigestHelper; |
33 import org.tmatesoft.hg.internal.InflaterDataAccess; | 32 import org.tmatesoft.hg.internal.InflaterDataAccess; |
34 import org.tmatesoft.hg.internal.RevlogStream; | 33 import org.tmatesoft.hg.internal.Patch; |
35 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; | 34 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; |
36 import org.tmatesoft.hg.util.CancelledException; | 35 import org.tmatesoft.hg.util.CancelledException; |
37 | 36 |
38 /** | 37 /** |
39 * @see http://mercurial.selenic.com/wiki/BundleFormat | 38 * @see http://mercurial.selenic.com/wiki/BundleFormat |
237 public void fileEnd(String name) { | 236 public void fileEnd(String name) { |
238 } | 237 } |
239 | 238 |
240 public boolean element(GroupElement ge) { | 239 public boolean element(GroupElement ge) { |
241 try { | 240 try { |
242 System.out.printf(" %s %s %s %s; patches:%d\n", ge.node(), ge.firstParent(), ge.secondParent(), ge.cset(), ge.patches().size()); | 241 System.out.printf(" %s %s %s %s; patches:%d\n", ge.node(), ge.firstParent(), ge.secondParent(), ge.cset(), ge.patch().count()); |
243 } catch (Exception ex) { | 242 } catch (Exception ex) { |
244 ex.printStackTrace(); // FIXME | 243 ex.printStackTrace(); // FIXME |
245 } | 244 } |
246 return true; | 245 return true; |
247 } | 246 } |
395 da.skip(len - 4); // sizeof(int) | 394 da.skip(len - 4); // sizeof(int) |
396 len = da.isEmpty() ? 0 : da.readInt(); | 395 len = da.isEmpty() ? 0 : da.readInt(); |
397 } | 396 } |
398 } | 397 } |
399 | 398 |
399 // FIXME GroupElement exposes some internal API!!! (DataAccess) | |
400 public static class GroupElement { | 400 public static class GroupElement { |
401 private final byte[] header; // byte[80] takes 120 bytes, 4 Nodeids - 192 | 401 private final byte[] header; // byte[80] takes 120 bytes, 4 Nodeids - 192 |
402 private final DataAccess dataAccess; | 402 private final DataAccess dataAccess; |
403 private List<RevlogStream.PatchRecord> patches; | 403 private Patch patches; |
404 | 404 |
405 GroupElement(byte[] fourNodeids, DataAccess rawDataAccess) { | 405 GroupElement(byte[] fourNodeids, DataAccess rawDataAccess) { |
406 assert fourNodeids != null && fourNodeids.length == 80; | 406 assert fourNodeids != null && fourNodeids.length == 80; |
407 header = fourNodeids; | 407 header = fourNodeids; |
408 dataAccess = rawDataAccess; | 408 dataAccess = rawDataAccess; |
430 | 430 |
431 public DataAccess rawData() { | 431 public DataAccess rawData() { |
432 return dataAccess; | 432 return dataAccess; |
433 } | 433 } |
434 | 434 |
435 public List<RevlogStream.PatchRecord> patches() throws IOException { | 435 /*package-local*/ Patch patch() throws IOException { |
436 if (patches == null) { | 436 if (patches == null) { |
437 dataAccess.reset(); | 437 dataAccess.reset(); |
438 LinkedList<RevlogStream.PatchRecord> p = new LinkedList<RevlogStream.PatchRecord>(); | 438 patches = new Patch(); |
439 while (!dataAccess.isEmpty()) { | 439 patches.read(dataAccess); |
440 RevlogStream.PatchRecord pr = RevlogStream.PatchRecord.read(dataAccess); | |
441 p.add(pr); | |
442 } | |
443 patches = p; | |
444 } | 440 } |
445 return patches; | 441 return patches; |
446 } | 442 } |
447 | 443 |
448 public byte[] apply(DataAccess baseContent) throws IOException { | 444 public byte[] apply(DataAccess baseContent) throws IOException { |
449 return RevlogStream.apply(baseContent, -1, patches()); | 445 return patch().apply(baseContent, -1); |
450 } | 446 } |
451 } | 447 } |
452 } | 448 } |