# HG changeset patch # User Artem Tikhomirov # Date 1294945341 -3600 # Node ID 6061aa826a9e5562541360d7a5561dd57bf7e9c6 # Parent 51bc56c0addd7c019b158787137c4eb21e4dc4b0 Complete parsing of the bundle format diff -r 51bc56c0addd -r 6061aa826a9e src/com/tmate/hgkit/console/Bundle.java --- a/src/com/tmate/hgkit/console/Bundle.java Thu Jan 13 04:03:13 2011 +0100 +++ b/src/com/tmate/hgkit/console/Bundle.java Thu Jan 13 20:02:21 2011 +0100 @@ -4,6 +4,7 @@ package com.tmate.hgkit.console; import java.io.File; +import java.util.LinkedList; import com.tmate.hgkit.fs.DataAccess; import com.tmate.hgkit.fs.DataAccessProvider; @@ -21,23 +22,47 @@ DataAccessProvider dap = new DataAccessProvider(); DataAccess da = dap.create(bundleFile); try { - while (!da.isEmpty()) { - int len = da.readInt(); - while (len > 4) { - byte[] nb = new byte[80]; - da.readBytes(nb, 0, 80); - Nodeid node = Nodeid.fromBinary(nb, 0); - Nodeid p1 = Nodeid.fromBinary(nb, 20); - Nodeid p2 = Nodeid.fromBinary(nb, 40); - Nodeid cs = Nodeid.fromBinary(nb, 60); - da.skip(len - 84); - System.out.printf("%6d %s %s %s %s\n", len, node, p1, p2, cs); - len = da.isEmpty() ? 0 : da.readInt(); + LinkedList names = new LinkedList(); + if (!da.isEmpty()) { + System.out.println("Changelog group"); + readGroup(da); + System.out.println("Manifest group"); + readGroup(da); + while (!da.isEmpty()) { + int fnameLen = da.readInt(); + if (fnameLen <= 4) { + break; // null chunk, the last one. + } + byte[] fname = new byte[fnameLen - 4]; + da.readBytes(fname, 0, fname.length); + names.add(new String(fname)); + System.out.println(names.getLast()); + readGroup(da); } - System.out.println("Group done"); + } + System.out.println(names.size()); + for (String s : names) { + System.out.println(s); } } finally { da.done(); } } + + private static void readGroup(DataAccess da) throws Exception { + int len = da.readInt(); + while (len > 4 && !da.isEmpty()) { + byte[] nb = new byte[80]; + da.readBytes(nb, 0, 80); + Nodeid node = Nodeid.fromBinary(nb, 0); + Nodeid p1 = Nodeid.fromBinary(nb, 20); + Nodeid p2 = Nodeid.fromBinary(nb, 40); + Nodeid cs = Nodeid.fromBinary(nb, 60); + byte[] data = new byte[len-84]; + da.readBytes(data, 0, data.length); + System.out.printf("%6d %s %s %s %s\n", len, node, p1, p2, cs); + System.out.println(new String(data)); + len = da.isEmpty() ? 0 : da.readInt(); + } + } } diff -r 51bc56c0addd -r 6061aa826a9e src/com/tmate/hgkit/ll/RevlogStream.java --- a/src/com/tmate/hgkit/ll/RevlogStream.java Thu Jan 13 04:03:13 2011 +0100 +++ b/src/com/tmate/hgkit/ll/RevlogStream.java Thu Jan 13 20:02:21 2011 +0100 @@ -304,6 +304,7 @@ return rv; } + // @see http://mercurial.selenic.com/wiki/BundleFormat, in Changelog group description static class PatchRecord { // copy of struct frag from mpatch.c int start, end, len; byte[] data;