tikhomirov@107: /* tikhomirov@107: * Copyright (c) 2011 TMate Software Ltd tikhomirov@107: * tikhomirov@107: * This program is free software; you can redistribute it and/or modify tikhomirov@107: * it under the terms of the GNU General Public License as published by tikhomirov@107: * the Free Software Foundation; version 2 of the License. tikhomirov@107: * tikhomirov@107: * This program is distributed in the hope that it will be useful, tikhomirov@107: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@107: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@107: * GNU General Public License for more details. tikhomirov@107: * tikhomirov@107: * For information on how to redistribute this software under tikhomirov@107: * the terms of a license other than GNU General Public License tikhomirov@107: * contact TMate Software at support@svnkit.com tikhomirov@107: */ tikhomirov@107: package org.tmatesoft.hg.core; tikhomirov@107: tikhomirov@107: import static org.tmatesoft.hg.repo.HgRepository.BAD_REVISION; tikhomirov@107: import static org.tmatesoft.hg.repo.HgRepository.TIP; tikhomirov@107: tikhomirov@107: import java.io.FileNotFoundException; tikhomirov@107: tikhomirov@107: import org.tmatesoft.hg.repo.HgDataFile; tikhomirov@107: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@115: import org.tmatesoft.hg.util.ByteChannel; tikhomirov@107: tikhomirov@107: /** tikhomirov@107: * Command to obtain content of a tikhomirov@107: * tikhomirov@107: * @author Artem Tikhomirov tikhomirov@107: * @author TMate Software Ltd. tikhomirov@107: */ tikhomirov@107: public class CatCommand { tikhomirov@107: tikhomirov@107: private final HgRepository repo; tikhomirov@107: private Path file; tikhomirov@107: private int localRevision = TIP; tikhomirov@107: private Nodeid revision; tikhomirov@107: tikhomirov@107: public CatCommand(HgRepository hgRepo) { tikhomirov@107: repo = hgRepo; tikhomirov@107: } tikhomirov@107: tikhomirov@107: public CatCommand file(Path fname) { tikhomirov@107: file = fname; tikhomirov@107: return this; tikhomirov@107: } tikhomirov@107: tikhomirov@107: // rev can't be WORKING_COPY (if allowed, need to implement in #execute()) tikhomirov@107: public CatCommand revision(int rev) { tikhomirov@107: localRevision = rev; tikhomirov@107: revision = null; tikhomirov@107: return this; tikhomirov@107: } tikhomirov@107: tikhomirov@107: public CatCommand revision(Nodeid nodeid) { tikhomirov@107: revision = nodeid; tikhomirov@107: localRevision = BAD_REVISION; tikhomirov@107: return this; tikhomirov@107: } tikhomirov@107: tikhomirov@115: public void execute(ByteChannel sink) throws Exception /*TODO own exception type*/ { tikhomirov@107: if (localRevision == BAD_REVISION && revision == null) { tikhomirov@107: throw new IllegalArgumentException("Either local file revision number or nodeid shall be specified"); tikhomirov@107: } tikhomirov@107: if (file == null) { tikhomirov@107: throw new IllegalArgumentException("Name of the file is missing"); tikhomirov@107: } tikhomirov@115: if (sink == null) { tikhomirov@107: throw new IllegalArgumentException(); tikhomirov@107: } tikhomirov@107: HgDataFile dataFile = repo.getFileNode(file); tikhomirov@107: if (!dataFile.exists()) { tikhomirov@107: throw new FileNotFoundException(); tikhomirov@107: } tikhomirov@115: int revToExtract; tikhomirov@107: if (revision != null) { tikhomirov@115: revToExtract = dataFile.getLocalRevision(revision); tikhomirov@107: } else { tikhomirov@115: revToExtract = localRevision; tikhomirov@107: } tikhomirov@115: dataFile.content(revToExtract, sink); tikhomirov@107: } tikhomirov@107: }