tikhomirov@21: /* tikhomirov@74: * Copyright (c) 2010-2011 TMate Software Ltd tikhomirov@74: * tikhomirov@74: * This program is free software; you can redistribute it and/or modify tikhomirov@74: * it under the terms of the GNU General Public License as published by tikhomirov@74: * the Free Software Foundation; version 2 of the License. tikhomirov@74: * tikhomirov@74: * This program is distributed in the hope that it will be useful, tikhomirov@74: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@74: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@74: * GNU General Public License for more details. tikhomirov@74: * tikhomirov@74: * For information on how to redistribute this software under tikhomirov@74: * the terms of a license other than GNU General Public License tikhomirov@74: * contact TMate Software at support@svnkit.com tikhomirov@0: */ tikhomirov@74: package org.tmatesoft.hg.repo; tikhomirov@0: tikhomirov@2: import java.util.ArrayList; tikhomirov@3: import java.util.Arrays; tikhomirov@2: import java.util.List; tikhomirov@2: tikhomirov@74: import org.tmatesoft.hg.core.Nodeid; tikhomirov@74: tikhomirov@74: tikhomirov@0: /** tikhomirov@0: * Representation of the Mercurial changelog file (list of ChangeSets) tikhomirov@74: * tikhomirov@74: * @author Artem Tikhomirov tikhomirov@74: * @author TMate Software Ltd. tikhomirov@0: */ tikhomirov@2: public class Changelog extends Revlog { tikhomirov@0: tikhomirov@3: /*package-local*/ Changelog(HgRepository hgRepo, RevlogStream content) { tikhomirov@21: super(hgRepo, content); tikhomirov@2: } tikhomirov@2: tikhomirov@3: public void all(final Changeset.Inspector inspector) { tikhomirov@48: range(0, content.revisionCount() - 1, inspector); tikhomirov@48: } tikhomirov@48: tikhomirov@48: public void range(int start, int end, final Changeset.Inspector inspector) { tikhomirov@3: Revlog.Inspector i = new Revlog.Inspector() { tikhomirov@3: tikhomirov@3: public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, byte[] data) { tikhomirov@3: Changeset cset = Changeset.parse(data, 0, data.length); tikhomirov@3: // XXX there's no guarantee for Changeset.Callback that distinct instance comes each time, consider instance reuse tikhomirov@47: inspector.next(revisionNumber, Nodeid.fromBinary(nodeid, 0), cset); tikhomirov@3: } tikhomirov@3: }; tikhomirov@48: content.iterate(start, end, true, i); tikhomirov@2: } tikhomirov@2: tikhomirov@2: public List range(int start, int end) { tikhomirov@2: final ArrayList rv = new ArrayList(end - start + 1); tikhomirov@2: Revlog.Inspector i = new Revlog.Inspector() { tikhomirov@2: tikhomirov@3: public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, byte[] data) { tikhomirov@3: Changeset cset = Changeset.parse(data, 0, data.length); tikhomirov@3: rv.add(cset); tikhomirov@2: } tikhomirov@2: }; tikhomirov@2: content.iterate(start, end, true, i); tikhomirov@2: return rv; tikhomirov@2: } tikhomirov@3: tikhomirov@3: public void range(final Changeset.Inspector inspector, final int... revisions) { tikhomirov@3: if (revisions == null || revisions.length == 0) { tikhomirov@3: return; tikhomirov@3: } tikhomirov@3: Revlog.Inspector i = new Revlog.Inspector() { tikhomirov@3: tikhomirov@3: public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, byte[] data) { tikhomirov@3: if (Arrays.binarySearch(revisions, revisionNumber) >= 0) { tikhomirov@3: Changeset cset = Changeset.parse(data, 0, data.length); tikhomirov@47: inspector.next(revisionNumber, Nodeid.fromBinary(nodeid, 0), cset); tikhomirov@3: } tikhomirov@3: } tikhomirov@3: }; tikhomirov@3: Arrays.sort(revisions); tikhomirov@3: content.iterate(revisions[0], revisions[revisions.length - 1], true, i); tikhomirov@3: } tikhomirov@0: }