tikhomirov@231: /* tikhomirov@231: * Copyright (c) 2011 TMate Software Ltd tikhomirov@231: * tikhomirov@231: * This program is free software; you can redistribute it and/or modify tikhomirov@231: * it under the terms of the GNU General Public License as published by tikhomirov@231: * the Free Software Foundation; version 2 of the License. tikhomirov@231: * tikhomirov@231: * This program is distributed in the hope that it will be useful, tikhomirov@231: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@231: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@231: * GNU General Public License for more details. tikhomirov@231: * tikhomirov@231: * For information on how to redistribute this software under tikhomirov@231: * the terms of a license other than GNU General Public License tikhomirov@231: * contact TMate Software at support@hg4j.com tikhomirov@231: */ tikhomirov@231: package org.tmatesoft.hg.core; tikhomirov@231: tikhomirov@231: import org.tmatesoft.hg.repo.HgDataFile; tikhomirov@316: import org.tmatesoft.hg.repo.HgInternals; tikhomirov@231: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@231: import org.tmatesoft.hg.util.ByteChannel; tikhomirov@231: import org.tmatesoft.hg.util.CancelledException; tikhomirov@231: import org.tmatesoft.hg.util.Path; tikhomirov@231: tikhomirov@231: /** tikhomirov@231: * Keeps together information about specific file revision tikhomirov@231: * tikhomirov@231: * @author Artem Tikhomirov tikhomirov@231: * @author TMate Software Ltd. tikhomirov@231: */ tikhomirov@249: public final class HgFileRevision { tikhomirov@231: private final HgRepository repo; tikhomirov@231: private final Nodeid revision; tikhomirov@231: private final Path path; tikhomirov@316: private Path origin; tikhomirov@316: private Boolean isCopy = null; // null means not yet known tikhomirov@316: tikhomirov@231: public HgFileRevision(HgRepository hgRepo, Nodeid rev, Path p) { tikhomirov@231: if (hgRepo == null || rev == null || p == null) { tikhomirov@231: // since it's package local, it is our code to blame for non validated arguments tikhomirov@316: throw new IllegalArgumentException(); tikhomirov@231: } tikhomirov@231: repo = hgRepo; tikhomirov@231: revision = rev; tikhomirov@231: path = p; tikhomirov@231: } tikhomirov@316: tikhomirov@316: // this cons shall be used when we know whether p was a copy. Perhaps, shall pass Map instead to stress orig argument is not optional tikhomirov@316: HgFileRevision(HgRepository hgRepo, Nodeid rev, Path p, Path orig) { tikhomirov@316: this(hgRepo, rev, p); tikhomirov@316: isCopy = Boolean.valueOf(orig == null); tikhomirov@316: origin = orig; tikhomirov@316: } tikhomirov@231: tikhomirov@231: public Path getPath() { tikhomirov@231: return path; tikhomirov@231: } tikhomirov@231: public Nodeid getRevision() { tikhomirov@231: return revision; tikhomirov@231: } tikhomirov@316: public boolean wasCopied() { tikhomirov@316: if (isCopy == null) { tikhomirov@316: checkCopy(); tikhomirov@316: } tikhomirov@316: return isCopy.booleanValue(); tikhomirov@316: } tikhomirov@316: /** tikhomirov@316: * @return null if {@link #wasCopied()} is false, name of the copy source otherwise. tikhomirov@316: */ tikhomirov@316: public Path getOriginIfCopy() { tikhomirov@316: if (wasCopied()) { tikhomirov@316: return origin; tikhomirov@316: } tikhomirov@316: return null; tikhomirov@316: } tikhomirov@316: tikhomirov@237: public void putContentTo(ByteChannel sink) throws HgDataStreamException, CancelledException { tikhomirov@231: HgDataFile fn = repo.getFileNode(path); tikhomirov@231: int localRevision = fn.getLocalRevision(revision); tikhomirov@231: fn.contentWithFilters(localRevision, sink); tikhomirov@231: } tikhomirov@231: tikhomirov@316: private void checkCopy() { tikhomirov@316: HgDataFile fn = repo.getFileNode(path); tikhomirov@316: try { tikhomirov@316: if (fn.isCopy()) { tikhomirov@316: if (fn.getRevision(0).equals(revision)) { tikhomirov@316: // this HgFileRevision represents first revision of the copy tikhomirov@316: isCopy = Boolean.TRUE; tikhomirov@316: origin = fn.getCopySourceName(); tikhomirov@316: return; tikhomirov@316: } tikhomirov@316: } tikhomirov@316: } catch (HgDataStreamException ex) { tikhomirov@316: HgInternals.getContext(repo).getLog().error(getClass(), ex, null); tikhomirov@316: } tikhomirov@316: isCopy = Boolean.FALSE; tikhomirov@316: } tikhomirov@231: }