tikhomirov@565: /* tikhomirov@565: * Copyright (c) 2013 TMate Software Ltd tikhomirov@565: * tikhomirov@565: * This program is free software; you can redistribute it and/or modify tikhomirov@565: * it under the terms of the GNU General Public License as published by tikhomirov@565: * the Free Software Foundation; version 2 of the License. tikhomirov@565: * tikhomirov@565: * This program is distributed in the hope that it will be useful, tikhomirov@565: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@565: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@565: * GNU General Public License for more details. tikhomirov@565: * tikhomirov@565: * For information on how to redistribute this software under tikhomirov@565: * the terms of a license other than GNU General Public License tikhomirov@565: * contact TMate Software at support@hg4j.com tikhomirov@565: */ tikhomirov@565: package org.tmatesoft.hg.internal; tikhomirov@565: tikhomirov@565: import static org.tmatesoft.hg.repo.HgRepository.BAD_REVISION; tikhomirov@565: import static org.tmatesoft.hg.repo.HgRepository.TIP; tikhomirov@565: tikhomirov@565: import org.tmatesoft.hg.core.HgBadArgumentException; tikhomirov@565: import org.tmatesoft.hg.core.Nodeid; tikhomirov@565: import org.tmatesoft.hg.repo.HgInvalidRevisionException; tikhomirov@565: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@628: import org.tmatesoft.hg.repo.HgRuntimeException; tikhomirov@565: tikhomirov@565: /** tikhomirov@565: * Common code to keep changelog revision and to perform boundary check. tikhomirov@565: * tikhomirov@565: * @author Artem Tikhomirov tikhomirov@565: * @author TMate Software Ltd. tikhomirov@565: */ tikhomirov@565: public class CsetParamKeeper { tikhomirov@565: private final HgRepository repo; tikhomirov@565: private int changelogRevisionIndex = HgRepository.BAD_REVISION; tikhomirov@565: tikhomirov@565: public CsetParamKeeper(HgRepository hgRepo) { tikhomirov@565: repo = hgRepo; tikhomirov@565: } tikhomirov@565: tikhomirov@565: public CsetParamKeeper set(Nodeid changeset) throws HgBadArgumentException { tikhomirov@565: try { tikhomirov@565: set(repo.getChangelog().getRevisionIndex(changeset)); tikhomirov@565: } catch (HgInvalidRevisionException ex) { tikhomirov@565: throw new HgBadArgumentException("Can't find revision", ex).setRevision(changeset); tikhomirov@628: } catch (HgRuntimeException ex) { tikhomirov@628: throw new HgBadArgumentException(String.format("Can't initialize with revision %s", changeset.shortNotation()), ex); tikhomirov@565: } tikhomirov@565: return this; tikhomirov@565: } tikhomirov@565: tikhomirov@565: public CsetParamKeeper set(int changelogRevIndex) throws HgBadArgumentException { tikhomirov@628: try { tikhomirov@628: int lastCsetIndex = repo.getChangelog().getLastRevision(); tikhomirov@628: if (changelogRevIndex == HgRepository.TIP) { tikhomirov@628: changelogRevIndex = lastCsetIndex; tikhomirov@628: } tikhomirov@628: if (changelogRevIndex < 0 || changelogRevIndex > lastCsetIndex) { tikhomirov@628: throw new HgBadArgumentException(String.format("Bad revision index %d, value from [0..%d] expected", changelogRevIndex, lastCsetIndex), null).setRevisionIndex(changelogRevIndex); tikhomirov@628: } tikhomirov@628: doSet(changelogRevIndex); tikhomirov@628: } catch (HgRuntimeException ex) { tikhomirov@628: throw new HgBadArgumentException(String.format("Can't initialize with revision index %d", changelogRevIndex), ex); tikhomirov@565: } tikhomirov@565: return this; tikhomirov@565: } tikhomirov@565: tikhomirov@565: public void doSet(int changelogRevIndex) { tikhomirov@565: changelogRevisionIndex = changelogRevIndex; tikhomirov@565: } tikhomirov@565: tikhomirov@565: /** tikhomirov@565: * @return the value set, or {@link HgRepository#BAD_REVISION} otherwise tikhomirov@565: */ tikhomirov@565: public int get() { tikhomirov@565: return changelogRevisionIndex; tikhomirov@565: } tikhomirov@565: tikhomirov@565: /** tikhomirov@565: * @param defaultRevisionIndex value to return when no revision was set, may be {@link HgRepository#TIP} which gets translated to real index if used tikhomirov@565: * @return changelog revision index if set, or defaultRevisionIndex value otherwise tikhomirov@565: */ tikhomirov@628: public int get(int defaultRevisionIndex) throws HgRuntimeException { tikhomirov@565: // XXX perhaps, shall translate other predefined constants (like WORKING COPY) here, too (e.g. for HgRevertCommand) tikhomirov@565: if (changelogRevisionIndex != BAD_REVISION || changelogRevisionIndex != TIP) { tikhomirov@565: return changelogRevisionIndex; tikhomirov@565: } tikhomirov@565: if (changelogRevisionIndex == TIP || defaultRevisionIndex == TIP) { tikhomirov@565: return repo.getChangelog().getLastRevision(); tikhomirov@565: } tikhomirov@565: return defaultRevisionIndex; tikhomirov@565: } tikhomirov@565: }