# HG changeset patch # User Artem Tikhomirov # Date 1294887793 -3600 # Node ID 51bc56c0addd7c019b158787137c4eb21e4dc4b0 # Parent 565ce08356744b2a44470cc52785b85b48777176 Static Nodeid creation methods to reuse NULL id diff -r 565ce0835674 -r 51bc56c0addd src/com/tmate/hgkit/console/Bundle.java --- a/src/com/tmate/hgkit/console/Bundle.java Thu Jan 13 03:42:14 2011 +0100 +++ b/src/com/tmate/hgkit/console/Bundle.java Thu Jan 13 04:03:13 2011 +0100 @@ -20,23 +20,24 @@ File bundleFile = new File("/temp/hg/hg-bundle-a78c980749e3.tmp"); DataAccessProvider dap = new DataAccessProvider(); DataAccess da = dap.create(bundleFile); - while (!da.isEmpty()) { - int len = da.readInt(); - while (len > 4) { - byte[] nb = new byte[20]; - da.readBytes(nb, 0, 20); - Nodeid node = new Nodeid(nb, true); - da.readBytes(nb, 0, 20); - Nodeid p1 = new Nodeid(nb, true); - da.readBytes(nb, 0, 20); - Nodeid p2 = new Nodeid(nb, true); - da.readBytes(nb, 0, 20); - Nodeid cs = new Nodeid(nb, true); - da.skip(len - 84); - System.out.printf("%6d %s %s %s %s\n", len, node, p1, p2, cs); - len = da.isEmpty() ? 0 : da.readInt(); + 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(); + } + System.out.println("Group done"); } - System.out.println("Group done"); + } finally { + da.done(); } } } diff -r 565ce0835674 -r 51bc56c0addd src/com/tmate/hgkit/ll/Nodeid.java --- a/src/com/tmate/hgkit/ll/Nodeid.java Thu Jan 13 03:42:14 2011 +0100 +++ b/src/com/tmate/hgkit/ll/Nodeid.java Thu Jan 13 04:03:13 2011 +0100 @@ -55,12 +55,44 @@ @Override public String toString() { + // XXX may want to output just single 0 for the NULL id? return toHexString(binaryData, 0, binaryData.length); } public String shortNotation() { return toHexString(binaryData, 0, 6); } + + public boolean isNull() { + if (this == NULL) { + return true; + } + for (int i = 0; i < 20; i++) { + if (this.binaryData[i] != 0) { + return false; + } + } + return true; + } + + // primary difference with cons is handling of NULL id (this method returns constant) + // always makes a copy of an array passed + public static Nodeid fromBinary(byte[] binaryRepresentation, int offset) { + if (binaryRepresentation == null || binaryRepresentation.length - offset < 20) { + throw new IllegalArgumentException(); + } + int i = 0; + while (i < 20 && binaryRepresentation[offset+i] == 0) i++; + if (i == 20) { + return NULL; + } + if (offset == 0 && binaryRepresentation.length == 20) { + return new Nodeid(binaryRepresentation, true); + } + byte[] b = new byte[20]; // create new instance if no other reasonable guesses possible + System.arraycopy(binaryRepresentation, offset, b, 0, 20); + return new Nodeid(b, false); + } // binascii.unhexlify() public static Nodeid fromAscii(byte[] asciiRepresentation, int offset, int length) {