tikhomirov@248: /* tikhomirov@537: * Copyright (c) 2011-2013 TMate Software Ltd tikhomirov@248: * tikhomirov@248: * This program is free software; you can redistribute it and/or modify tikhomirov@248: * it under the terms of the GNU General Public License as published by tikhomirov@248: * the Free Software Foundation; version 2 of the License. tikhomirov@248: * tikhomirov@248: * This program is distributed in the hope that it will be useful, tikhomirov@248: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@248: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@248: * GNU General Public License for more details. tikhomirov@248: * tikhomirov@248: * For information on how to redistribute this software under tikhomirov@248: * the terms of a license other than GNU General Public License tikhomirov@248: * contact TMate Software at support@hg4j.com tikhomirov@248: */ tikhomirov@248: package org.tmatesoft.hg.internal; tikhomirov@248: tikhomirov@538: import static org.tmatesoft.hg.repo.HgRepository.NO_REVISION; tikhomirov@538: tikhomirov@248: import java.util.Collection; tikhomirov@248: import java.util.TreeMap; tikhomirov@248: tikhomirov@248: import org.tmatesoft.hg.core.Nodeid; tikhomirov@248: import org.tmatesoft.hg.repo.HgManifest; tikhomirov@431: import org.tmatesoft.hg.util.Convertor; tikhomirov@285: import org.tmatesoft.hg.util.Path; tikhomirov@248: tikhomirov@248: /** tikhomirov@248: * Specific revision of the manifest. tikhomirov@537: * Note, suited to keep single revision only ({@link #revision()}), which is linked to changeset {@link #changesetRevisionIndex()}. tikhomirov@248: * tikhomirov@248: * @author Artem Tikhomirov tikhomirov@248: * @author TMate Software Ltd. tikhomirov@248: */ tikhomirov@424: public final class ManifestRevision implements HgManifest.Inspector { tikhomirov@285: private final TreeMap idsMap; tikhomirov@285: private final TreeMap flagsMap; tikhomirov@431: private final Convertor idsPool; tikhomirov@431: private final Convertor namesPool; tikhomirov@538: private Nodeid manifestRev = Nodeid.NULL; tikhomirov@538: private int changelogRevIndex = NO_REVISION, manifestRevIndex = NO_REVISION; tikhomirov@248: tikhomirov@248: // optional pools for effective management of nodeids and filenames (they are likely tikhomirov@248: // to be duplicated among different manifest revisions tikhomirov@431: public ManifestRevision(Pool nodeidPool, Convertor filenamePool) { tikhomirov@248: idsPool = nodeidPool; tikhomirov@248: namesPool = filenamePool; tikhomirov@285: idsMap = new TreeMap(); tikhomirov@285: flagsMap = new TreeMap(); tikhomirov@248: } tikhomirov@248: tikhomirov@285: public Collection files() { tikhomirov@248: return idsMap.keySet(); tikhomirov@248: } tikhomirov@248: tikhomirov@285: public Nodeid nodeid(Path fname) { tikhomirov@248: return idsMap.get(fname); tikhomirov@248: } tikhomirov@248: tikhomirov@285: public HgManifest.Flags flags(Path fname) { tikhomirov@415: HgManifest.Flags f = flagsMap.get(fname); tikhomirov@415: return f == null ? HgManifest.Flags.RegularFile : f; tikhomirov@248: } tikhomirov@248: tikhomirov@248: /** tikhomirov@537: * @return identifier of this manifest revision tikhomirov@248: */ tikhomirov@537: public Nodeid revision() { tikhomirov@537: return manifestRev; tikhomirov@248: } tikhomirov@248: tikhomirov@537: public int revisionIndex() { tikhomirov@537: return manifestRevIndex; tikhomirov@537: } tikhomirov@537: tikhomirov@537: /** tikhomirov@537: * @return revision index for the changelog this manifest revision is linked to tikhomirov@537: */ tikhomirov@537: public int changesetRevisionIndex() { tikhomirov@537: return changelogRevIndex; tikhomirov@248: } tikhomirov@248: tikhomirov@248: // tikhomirov@248: tikhomirov@285: public boolean next(Nodeid nid, Path fname, HgManifest.Flags flags) { tikhomirov@248: if (namesPool != null) { tikhomirov@431: fname = namesPool.mangle(fname); tikhomirov@248: } tikhomirov@248: if (idsPool != null) { tikhomirov@431: nid = idsPool.mangle(nid); tikhomirov@248: } tikhomirov@248: idsMap.put(fname, nid); tikhomirov@415: if (flags != HgManifest.Flags.RegularFile) { tikhomirov@415: // TreeMap$Entry takes 32 bytes. No reason to keep regular file attribute (in fact, no flags state) tikhomirov@415: // for such price tikhomirov@285: // Alternatively, Map> might come as a solution tikhomirov@285: // however, with low rate of elements with flags this would consume more memory tikhomirov@285: // than two distinct maps (sizeof(Pair) == 16). tikhomirov@285: // Map: n*(32+16) tikhomirov@285: // 2 Maps: n*32 + m*32 <-- consumes more with m>n/2 tikhomirov@248: flagsMap.put(fname, flags); tikhomirov@248: } tikhomirov@248: return true; tikhomirov@248: } tikhomirov@248: tikhomirov@248: public boolean end(int revision) { tikhomirov@248: // in fact, this class cares about single revision tikhomirov@248: return false; tikhomirov@248: } tikhomirov@248: tikhomirov@537: public boolean begin(int revisionIndex, Nodeid revision, int changelogRevisionIndex) { tikhomirov@537: if (manifestRev != null) { tikhomirov@248: idsMap.clear(); tikhomirov@248: flagsMap.clear(); tikhomirov@248: } tikhomirov@537: manifestRev = revision; tikhomirov@537: manifestRevIndex = revisionIndex; tikhomirov@537: changelogRevIndex = changelogRevisionIndex; tikhomirov@248: return true; tikhomirov@248: } tikhomirov@248: }