# HG changeset patch # User Artem Tikhomirov # Date 1293330077 -3600 # Node ID df8c67f3006a16ddbb13ee0dfc84c2f14cfb44fa # Parent 181fccc176efd019d58638ae6562981ea554858d Basic manifest parsing to analyze what's in there diff -r 181fccc176ef -r df8c67f3006a src/com/tmate/hgkit/console/Manifest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/com/tmate/hgkit/console/Manifest.java Sun Dec 26 03:21:17 2010 +0100 @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2010 Artem Tikhomirov + */ +package com.tmate.hgkit.console; + +import com.tmate.hgkit.fs.RepositoryLookup; +import com.tmate.hgkit.ll.HgRepository; + +/** + * + * @author artem + */ +public class Manifest { + + public static void main(String[] args) throws Exception { + RepositoryLookup repoLookup = new RepositoryLookup(); + RepositoryLookup.Options cmdLineOpts = RepositoryLookup.Options.parse(args); + HgRepository hgRepo = repoLookup.detect(cmdLineOpts); + if (hgRepo.isInvalid()) { + System.err.printf("Can't find repository in: %s\n", hgRepo.getLocation()); + return; + } + System.out.println(hgRepo.getLocation()); + hgRepo.getManifest().dump(); + } +} diff -r 181fccc176ef -r df8c67f3006a src/com/tmate/hgkit/ll/HgManifest.java --- a/src/com/tmate/hgkit/ll/HgManifest.java Sun Dec 26 02:17:39 2010 +0100 +++ b/src/com/tmate/hgkit/ll/HgManifest.java Sun Dec 26 03:21:17 2010 +0100 @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2010 Artem Tikhomirov */ package com.tmate.hgkit.ll; @@ -9,7 +9,46 @@ */ public class HgManifest extends Revlog { - /*package-local*/ HgManifest(HgRepository hgRepo) { + private final RevlogStream content; + + /*package-local*/ HgManifest(HgRepository hgRepo, RevlogStream content) { super(hgRepo); + this.content = content; + } + + public void dump() { + Revlog.Inspector insp = new Revlog.Inspector() { + public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, byte[] data) { + System.out.println(revisionNumber); + int i; + String fname = null; + String flags = null; + Nodeid nid = null; + for (i = 0; i < actualLen; i++) { + int x = i; + for( ; data[i] != '\n' && i < actualLen; i++) { + if (fname == null && data[i] == 0) { + fname = new String(data, x, i - x); + x = i+1; + } + } + if (i < actualLen) { + assert data[i] == '\n'; + int nodeidLen = i - x < 40 ? i-x : 40; + nid = Nodeid.fromAscii(data, x, nodeidLen); + if (nodeidLen + x < i) { + // 'x' and 'l' for executable bits and symlinks? + // hg --debug manifest shows 644 for each regular file in my repo + flags = new String(data, x + nodeidLen, i-x-nodeidLen); + } + System.out.println(nid + "\t" + fname + "\t\t" + flags); + } + nid = null; + fname = flags = null; + } + System.out.println(); + } + }; + content.iterate(0, -1, true, insp); } } diff -r 181fccc176ef -r df8c67f3006a src/com/tmate/hgkit/ll/HgRepository.java --- a/src/com/tmate/hgkit/ll/HgRepository.java Sun Dec 26 02:17:39 2010 +0100 +++ b/src/com/tmate/hgkit/ll/HgRepository.java Sun Dec 26 03:21:17 2010 +0100 @@ -41,7 +41,8 @@ public final HgManifest getManifest() { if (this.manifest == null) { - this.manifest = new HgManifest(this); + RevlogStream content = resolve(toStoragePath("00manifest.i", false)); + this.manifest = new HgManifest(this, content); } return this.manifest; } diff -r 181fccc176ef -r df8c67f3006a src/com/tmate/hgkit/ll/Nodeid.java --- a/src/com/tmate/hgkit/ll/Nodeid.java Sun Dec 26 02:17:39 2010 +0100 +++ b/src/com/tmate/hgkit/ll/Nodeid.java Sun Dec 26 03:21:17 2010 +0100 @@ -22,7 +22,7 @@ @Override public String toString() { - return new DigestHelper().toHexString(binaryData, 0, 20); + return new DigestHelper().toHexString(binaryData, 0, binaryData.length); } // binascii.unhexlify()