Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgBundle.java @ 667:fba85bc1dfb8
Refactoring: move all encoding/decoding operations into single place, EncodingHelper
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Thu, 11 Jul 2013 17:54:08 +0200 | 
| parents | 46b56864b483 | 
| children | 545b1d4cc11d | 
   comparison
  equal
  deleted
  inserted
  replaced
| 666:27a3ddedd6cc | 667:fba85bc1dfb8 | 
|---|---|
| 29 import org.tmatesoft.hg.internal.Callback; | 29 import org.tmatesoft.hg.internal.Callback; | 
| 30 import org.tmatesoft.hg.internal.DataAccess; | 30 import org.tmatesoft.hg.internal.DataAccess; | 
| 31 import org.tmatesoft.hg.internal.DataAccessProvider; | 31 import org.tmatesoft.hg.internal.DataAccessProvider; | 
| 32 import org.tmatesoft.hg.internal.DataSerializer; | 32 import org.tmatesoft.hg.internal.DataSerializer; | 
| 33 import org.tmatesoft.hg.internal.DigestHelper; | 33 import org.tmatesoft.hg.internal.DigestHelper; | 
| 34 import org.tmatesoft.hg.internal.EncodingHelper; | |
| 34 import org.tmatesoft.hg.internal.Experimental; | 35 import org.tmatesoft.hg.internal.Experimental; | 
| 35 import org.tmatesoft.hg.internal.FileUtils; | 36 import org.tmatesoft.hg.internal.FileUtils; | 
| 36 import org.tmatesoft.hg.internal.InflaterDataAccess; | 37 import org.tmatesoft.hg.internal.InflaterDataAccess; | 
| 37 import org.tmatesoft.hg.internal.Internals; | 38 import org.tmatesoft.hg.internal.Internals; | 
| 38 import org.tmatesoft.hg.internal.Lifecycle; | 39 import org.tmatesoft.hg.internal.Lifecycle; | 
| 39 import org.tmatesoft.hg.internal.Patch; | 40 import org.tmatesoft.hg.internal.Patch; | 
| 41 import org.tmatesoft.hg.repo.HgChangelog.ChangesetParser; | |
| 40 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; | 42 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; | 
| 41 import org.tmatesoft.hg.util.Adaptable; | 43 import org.tmatesoft.hg.util.Adaptable; | 
| 42 import org.tmatesoft.hg.util.CancelledException; | 44 import org.tmatesoft.hg.util.CancelledException; | 
| 43 | 45 | 
| 44 /** | 46 /** | 
| 53 public class HgBundle { | 55 public class HgBundle { | 
| 54 | 56 | 
| 55 private final File bundleFile; | 57 private final File bundleFile; | 
| 56 private final DataAccessProvider accessProvider; | 58 private final DataAccessProvider accessProvider; | 
| 57 private final SessionContext ctx; | 59 private final SessionContext ctx; | 
| 60 private final EncodingHelper fnDecorer; | |
| 58 private Lifecycle.BasicCallback flowControl; | 61 private Lifecycle.BasicCallback flowControl; | 
| 59 | 62 | 
| 60 HgBundle(SessionContext sessionContext, DataAccessProvider dap, File bundle) { | 63 HgBundle(SessionContext sessionContext, DataAccessProvider dap, File bundle) { | 
| 61 ctx = sessionContext; | 64 ctx = sessionContext; | 
| 62 accessProvider = dap; | 65 accessProvider = dap; | 
| 63 bundleFile = bundle; | 66 bundleFile = bundle; | 
| 67 fnDecorer = Internals.buildFileNameEncodingHelper(new SessionContext.SourcePrim(ctx)); | |
| 64 } | 68 } | 
| 65 | 69 | 
| 66 private DataAccess getDataStream() throws IOException { | 70 private DataAccess getDataStream() throws IOException { | 
| 67 DataAccess da = accessProvider.createReader(bundleFile, false); | 71 DataAccess da = accessProvider.createReader(bundleFile, false); | 
| 68 byte[] signature = new byte[6]; | 72 byte[] signature = new byte[6]; | 
| 110 Inspector bundleInsp = new Inspector() { | 114 Inspector bundleInsp = new Inspector() { | 
| 111 DigestHelper dh = new DigestHelper(); | 115 DigestHelper dh = new DigestHelper(); | 
| 112 boolean emptyChangelog = true; | 116 boolean emptyChangelog = true; | 
| 113 private DataAccess prevRevContent; | 117 private DataAccess prevRevContent; | 
| 114 private int revisionIndex; | 118 private int revisionIndex; | 
| 119 private ChangesetParser csetBuilder; | |
| 115 | 120 | 
| 116 public void changelogStart() { | 121 public void changelogStart() { | 
| 117 emptyChangelog = true; | 122 emptyChangelog = true; | 
| 118 revisionIndex = 0; | 123 revisionIndex = 0; | 
| 124 csetBuilder = new ChangesetParser(hgRepo, true); | |
| 119 } | 125 } | 
| 120 | 126 | 
| 121 public void changelogEnd() { | 127 public void changelogEnd() { | 
| 122 if (emptyChangelog) { | 128 if (emptyChangelog) { | 
| 123 throw new IllegalStateException("No changelog group in the bundle"); // XXX perhaps, just be silent and/or log? | 129 throw new IllegalStateException("No changelog group in the bundle"); // XXX perhaps, just be silent and/or log? | 
| 170 dh = dh.sha1(ge.firstParent(), ge.secondParent(), csetContent); // XXX ge may give me access to byte[] content of nodeid directly, perhaps, I don't need DH to be friend of Nodeid? | 176 dh = dh.sha1(ge.firstParent(), ge.secondParent(), csetContent); // XXX ge may give me access to byte[] content of nodeid directly, perhaps, I don't need DH to be friend of Nodeid? | 
| 171 if (!ge.node().equalsTo(dh.asBinary())) { | 177 if (!ge.node().equalsTo(dh.asBinary())) { | 
| 172 throw new HgInvalidStateException(String.format("Integrity check failed on %s, node: %s", bundleFile, ge.node().shortNotation())); | 178 throw new HgInvalidStateException(String.format("Integrity check failed on %s, node: %s", bundleFile, ge.node().shortNotation())); | 
| 173 } | 179 } | 
| 174 ByteArrayDataAccess csetDataAccess = new ByteArrayDataAccess(csetContent); | 180 ByteArrayDataAccess csetDataAccess = new ByteArrayDataAccess(csetContent); | 
| 175 RawChangeset cs = RawChangeset.parse(csetDataAccess); | 181 RawChangeset cs = csetBuilder.parse(csetDataAccess); | 
| 176 inspector.next(revisionIndex++, ge.node(), cs); | 182 inspector.next(revisionIndex++, ge.node(), cs); | 
| 177 prevRevContent.done(); | 183 prevRevContent.done(); | 
| 178 prevRevContent = csetDataAccess.reset(); | 184 prevRevContent = csetDataAccess.reset(); | 
| 179 } catch (CancelledException ex) { | 185 } catch (CancelledException ex) { | 
| 180 return false; | 186 return false; | 
| 395 if (fnameLen <= 4) { | 401 if (fnameLen <= 4) { | 
| 396 break; // null chunk, the last one. | 402 break; // null chunk, the last one. | 
| 397 } | 403 } | 
| 398 byte[] fnameBuf = new byte[fnameLen - 4]; | 404 byte[] fnameBuf = new byte[fnameLen - 4]; | 
| 399 da.readBytes(fnameBuf, 0, fnameBuf.length); | 405 da.readBytes(fnameBuf, 0, fnameBuf.length); | 
| 400 String name = new String(fnameBuf); | 406 String name = fnDecorer.fromBundle(fnameBuf, 0, fnameBuf.length); | 
| 401 inspector.fileStart(name); | 407 inspector.fileStart(name); | 
| 402 if (flowControl.isStopped()) { | 408 if (flowControl.isStopped()) { | 
| 403 return; | 409 return; | 
| 404 } | 410 } | 
| 405 readGroup(da, inspector); | 411 readGroup(da, inspector); | 
