tikhomirov@610: /* tikhomirov@610: * Copyright (c) 2013 TMate Software Ltd tikhomirov@610: * tikhomirov@610: * This program is free software; you can redistribute it and/or modify tikhomirov@610: * it under the terms of the GNU General Public License as published by tikhomirov@610: * the Free Software Foundation; version 2 of the License. tikhomirov@610: * tikhomirov@610: * This program is distributed in the hope that it will be useful, tikhomirov@610: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@610: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@610: * GNU General Public License for more details. tikhomirov@610: * tikhomirov@610: * For information on how to redistribute this software under tikhomirov@610: * the terms of a license other than GNU General Public License tikhomirov@610: * contact TMate Software at support@hg4j.com tikhomirov@610: */ tikhomirov@610: package org.tmatesoft.hg.internal; tikhomirov@610: tikhomirov@610: import org.tmatesoft.hg.core.Nodeid; tikhomirov@610: import org.tmatesoft.hg.core.SessionContext; tikhomirov@610: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@628: import org.tmatesoft.hg.repo.HgRuntimeException; tikhomirov@610: tikhomirov@610: /** tikhomirov@610: * Track changes to a repository based on recent changelog revision. tikhomirov@610: * TODO shall be merged with {@link RevlogChangeMonitor} and {@link FileChangeMonitor} into tikhomirov@610: * a single facility available from {@link SessionContext} tikhomirov@610: * tikhomirov@610: * @author Artem Tikhomirov tikhomirov@610: * @author TMate Software Ltd. tikhomirov@610: */ tikhomirov@610: public class ChangelogMonitor { tikhomirov@610: private final HgRepository repo; tikhomirov@610: private int changelogRevCount = -1; tikhomirov@610: private Nodeid changelogLastRev = null; tikhomirov@610: tikhomirov@610: public ChangelogMonitor(HgRepository hgRepo) { tikhomirov@610: repo = hgRepo; tikhomirov@610: } tikhomirov@610: tikhomirov@610: // memorize the state of the repository's changelog tikhomirov@628: public void touch() throws HgRuntimeException { tikhomirov@610: changelogRevCount = repo.getChangelog().getRevisionCount(); tikhomirov@610: changelogLastRev = safeGetRevision(changelogRevCount-1); tikhomirov@610: } tikhomirov@610: tikhomirov@610: // if present state doesn't match the one we remember tikhomirov@628: public boolean isChanged() throws HgRuntimeException { tikhomirov@610: int rc = repo.getChangelog().getRevisionCount(); tikhomirov@610: if (rc != changelogRevCount) { tikhomirov@610: return true; tikhomirov@610: } tikhomirov@610: Nodeid r = safeGetRevision(rc-1); tikhomirov@610: return !r.equals(changelogLastRev); tikhomirov@610: } tikhomirov@610: tikhomirov@610: // handles empty repository case tikhomirov@628: private Nodeid safeGetRevision(int revIndex) throws HgRuntimeException { tikhomirov@610: if (revIndex >= 0) { tikhomirov@610: return repo.getChangelog().getRevision(revIndex); tikhomirov@610: } tikhomirov@610: return Nodeid.NULL; tikhomirov@610: } tikhomirov@610: }