# HG changeset patch # User Artem Tikhomirov # Date 1294197028 -3600 # Node ID e929cecae4e102806c1668867d3cbfeec5ed5573 # Parent 11cfabe692b38b88bca1abdf736acad08ff31b19 Refactor to move revlog content to base class diff -r 11cfabe692b3 -r e929cecae4e1 design.txt --- a/design.txt Tue Jan 04 02:08:25 2011 +0100 +++ b/design.txt Wed Jan 05 04:10:28 2011 +0100 @@ -29,6 +29,7 @@ *.hgignored processing DataAccess - collect debug info (buffer misses, file size/total read operations) to find out better strategy to buffer size detection. +DataAccess - implement memory mapped files, compare performance. delta merge Changeset to get index (local revision number) RevisionWalker (on manifest) and WorkingCopyWalker (io.File) talking to ? and/or dirstate @@ -52,6 +53,6 @@ File access: * NIO and mapped files - should be fast. Although seems to give less control on mem usage. -* Regular InputStreams and chunked stream on top - allocate List, each (but last) chunk of fixed size (depending on initial file size) +* Regular InputStreams and chunked stream on top - allocate List, each (but last) chunk of fixed size (depending on initial file size) <<<<< \ No newline at end of file diff -r 11cfabe692b3 -r e929cecae4e1 src/com/tmate/hgkit/ll/Changelog.java --- a/src/com/tmate/hgkit/ll/Changelog.java Tue Jan 04 02:08:25 2011 +0100 +++ b/src/com/tmate/hgkit/ll/Changelog.java Wed Jan 05 04:10:28 2011 +0100 @@ -1,5 +1,5 @@ -/** - * Copyright (c) 2010 Artem Tikhomirov +/* + * Copyright (c) 2010, 2011 Artem Tikhomirov */ package com.tmate.hgkit.ll; @@ -13,11 +13,8 @@ */ public class Changelog extends Revlog { - private final RevlogStream content; - /*package-local*/ Changelog(HgRepository hgRepo, RevlogStream content) { - super(hgRepo); - this.content = content; + super(hgRepo, content); } public void all(final Changeset.Inspector inspector) { diff -r 11cfabe692b3 -r e929cecae4e1 src/com/tmate/hgkit/ll/HgDataFile.java --- a/src/com/tmate/hgkit/ll/HgDataFile.java Tue Jan 04 02:08:25 2011 +0100 +++ b/src/com/tmate/hgkit/ll/HgDataFile.java Wed Jan 05 04:10:28 2011 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010 Artem Tikhomirov + * Copyright (c) 2010, 2011 Artem Tikhomirov */ package com.tmate.hgkit.ll; @@ -14,17 +14,14 @@ */ public class HgDataFile extends Revlog { - private final RevlogStream content; // XXX move up to Revlog? - // absolute from repo root? // slashes, unix-style? // repo location agnostic, just to give info to user, not to access real storage private final String path; /*package-local*/HgDataFile(HgRepository hgRepo, String path, RevlogStream content) { - super(hgRepo); + super(hgRepo, content); this.path = path; - this.content = content; } public boolean exists() { @@ -35,10 +32,6 @@ return path; // hgRepo.backresolve(this) -> name? } - public int getRevisionCount() { - return content.revisionCount(); - } - public byte[] content() { return content(TIP); } diff -r 11cfabe692b3 -r e929cecae4e1 src/com/tmate/hgkit/ll/HgManifest.java --- a/src/com/tmate/hgkit/ll/HgManifest.java Tue Jan 04 02:08:25 2011 +0100 +++ b/src/com/tmate/hgkit/ll/HgManifest.java Wed Jan 05 04:10:28 2011 +0100 @@ -9,11 +9,8 @@ */ public class HgManifest extends Revlog { - private final RevlogStream content; - /*package-local*/ HgManifest(HgRepository hgRepo, RevlogStream content) { - super(hgRepo); - this.content = content; + super(hgRepo, content); } public void walk(int start, int end, final Inspector inspector) { diff -r 11cfabe692b3 -r e929cecae4e1 src/com/tmate/hgkit/ll/LocalHgRepo.java --- a/src/com/tmate/hgkit/ll/LocalHgRepo.java Tue Jan 04 02:08:25 2011 +0100 +++ b/src/com/tmate/hgkit/ll/LocalHgRepo.java Wed Jan 05 04:10:28 2011 +0100 @@ -47,25 +47,7 @@ @Override public void status(int rev1, int rev2, final StatusInspector inspector) { - final HashMap idsMap = new HashMap(); - final HashMap flagsMap = new HashMap(); - HgManifest.Inspector collect = new HgManifest.Inspector() { - - - public boolean next(Nodeid nid, String fname, String flags) { - idsMap.put(fname, nid); - flagsMap.put(fname, flags); - return true; - } - - public boolean end(int revision) { - return false; - } - - public boolean begin(int revision, Nodeid nid) { - return true; - } - }; + final ManifestRevisionCollector collect = new ManifestRevisionCollector(); getManifest().walk(rev1, rev1, collect); HgManifest.Inspector compare = new HgManifest.Inspector() { @@ -75,8 +57,8 @@ } public boolean next(Nodeid nid, String fname, String flags) { - Nodeid nidR1 = idsMap.remove(fname); - String flagsR1 = flagsMap.remove(fname); + Nodeid nidR1 = collect.idsMap.remove(fname); + String flagsR1 = collect.flagsMap.remove(fname); if (nidR1 == null) { inspector.added(fname); } else { @@ -90,10 +72,10 @@ } public boolean end(int revision) { - for (String fname : idsMap.keySet()) { + for (String fname : collect.idsMap.keySet()) { inspector.removed(fname); } - if (idsMap.size() != flagsMap.size()) { + if (collect.idsMap.size() != collect.flagsMap.size()) { throw new IllegalStateException(); } return false; @@ -102,13 +84,18 @@ getManifest().walk(rev2, rev2, compare); } - public void statusLocal(int rev1, StatusInspector inspector) { + public void statusLocal(int baseRevision, StatusInspector inspector) { LinkedList folders = new LinkedList(); final File rootDir = repoDir.getParentFile(); folders.add(rootDir); final HgDirstate dirstate = loadDirstate(); final HgIgnore hgignore = loadIgnore(); TreeSet knownEntries = dirstate.all(); + final boolean isTipBase = baseRevision == TIP || baseRevision == getManifest().revisionCount(); + final ManifestRevisionCollector collect = isTipBase ? null : new ManifestRevisionCollector(); + if (!isTipBase) { + getManifest().walk(baseRevision, baseRevision, collect); + } do { File d = folders.removeFirst(); for (File f : d.listFiles()) { @@ -336,4 +323,23 @@ } return path; } + + private final class ManifestRevisionCollector implements HgManifest.Inspector { + final HashMap idsMap = new HashMap(); + final HashMap flagsMap = new HashMap(); + + public boolean next(Nodeid nid, String fname, String flags) { + idsMap.put(fname, nid); + flagsMap.put(fname, flags); + return true; + } + + public boolean end(int revision) { + return false; + } + + public boolean begin(int revision, Nodeid nid) { + return true; + } + } } diff -r 11cfabe692b3 -r e929cecae4e1 src/com/tmate/hgkit/ll/Revlog.java --- a/src/com/tmate/hgkit/ll/Revlog.java Tue Jan 04 02:08:25 2011 +0100 +++ b/src/com/tmate/hgkit/ll/Revlog.java Wed Jan 05 04:10:28 2011 +0100 @@ -10,18 +10,24 @@ public abstract class Revlog { private final HgRepository hgRepo; + protected final RevlogStream content; - protected Revlog(HgRepository hgRepo) { + protected Revlog(HgRepository hgRepo, RevlogStream content) { if (hgRepo == null) { throw new NullPointerException(); } this.hgRepo = hgRepo; + this.content = content; } public final HgRepository getRepo() { return hgRepo; } + public int getRevisionCount() { + return content.revisionCount(); + } + public interface Inspector { // XXX boolean retVal to indicate whether to continue? void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[/*32*/] nodeid, byte[] data);