tikhomirov@64: /* tikhomirov@64: * Copyright (c) 2011 TMate Software Ltd tikhomirov@64: * tikhomirov@64: * This program is free software; you can redistribute it and/or modify tikhomirov@64: * it under the terms of the GNU General Public License as published by tikhomirov@64: * the Free Software Foundation; version 2 of the License. tikhomirov@64: * tikhomirov@64: * This program is distributed in the hope that it will be useful, tikhomirov@64: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@64: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@64: * GNU General Public License for more details. tikhomirov@64: * tikhomirov@64: * For information on how to redistribute this software under tikhomirov@64: * the terms of a license other than GNU General Public License tikhomirov@64: * contact TMate Software at support@svnkit.com tikhomirov@64: */ tikhomirov@64: package org.tmatesoft.hg.core; tikhomirov@64: tikhomirov@74: import static org.tmatesoft.hg.repo.HgRepository.BAD_REVISION; tikhomirov@74: import static org.tmatesoft.hg.repo.HgRepository.TIP; tikhomirov@74: import static org.tmatesoft.hg.repo.HgRepository.WORKING_COPY; tikhomirov@68: tikhomirov@64: import org.tmatesoft.hg.core.Path.Matcher; tikhomirov@74: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@74: import org.tmatesoft.hg.repo.StatusCollector; tikhomirov@74: import org.tmatesoft.hg.repo.WorkingCopyStatusCollector; tikhomirov@64: tikhomirov@64: /** tikhomirov@64: * tikhomirov@64: * @author Artem Tikhomirov tikhomirov@64: * @author TMate Software Ltd. tikhomirov@64: */ tikhomirov@64: public class StatusCommand { tikhomirov@64: private final HgRepository repo; tikhomirov@64: tikhomirov@68: private boolean needModified; tikhomirov@68: private boolean needAdded; tikhomirov@68: private boolean needRemoved; tikhomirov@68: private boolean needUnknown; tikhomirov@68: private boolean needMissing; tikhomirov@68: private boolean needClean; tikhomirov@68: private boolean needIgnored; tikhomirov@64: private Matcher matcher; tikhomirov@68: private int startRevision = TIP; tikhomirov@68: private int endRevision = WORKING_COPY; tikhomirov@64: private boolean visitSubRepo = true; tikhomirov@64: tikhomirov@68: public StatusCommand(HgRepository hgRepo) { tikhomirov@68: repo = hgRepo; tikhomirov@68: defaults(); tikhomirov@64: } tikhomirov@64: tikhomirov@68: public StatusCommand defaults() { tikhomirov@68: needModified = needAdded = needRemoved = needUnknown = needMissing = true; tikhomirov@68: needClean = needIgnored = false; tikhomirov@64: return this; tikhomirov@64: } tikhomirov@68: public StatusCommand all() { tikhomirov@68: needModified = needAdded = needRemoved = needUnknown = needMissing = true; tikhomirov@68: needClean = needIgnored = true; tikhomirov@68: return this; tikhomirov@68: } tikhomirov@68: tikhomirov@64: tikhomirov@68: public StatusCommand modified(boolean include) { tikhomirov@68: needModified = include; tikhomirov@68: return this; tikhomirov@68: } tikhomirov@68: public StatusCommand added(boolean include) { tikhomirov@68: needAdded = include; tikhomirov@68: return this; tikhomirov@68: } tikhomirov@68: public StatusCommand removed(boolean include) { tikhomirov@68: needRemoved = include; tikhomirov@68: return this; tikhomirov@68: } tikhomirov@68: public StatusCommand deleted(boolean include) { tikhomirov@68: needMissing = include; tikhomirov@68: return this; tikhomirov@68: } tikhomirov@68: public StatusCommand unknown(boolean include) { tikhomirov@68: needUnknown = include; tikhomirov@68: return this; tikhomirov@68: } tikhomirov@64: public StatusCommand clean(boolean include) { tikhomirov@64: needClean = include; tikhomirov@64: return this; tikhomirov@64: } tikhomirov@64: public StatusCommand ignored(boolean include) { tikhomirov@64: needIgnored = include; tikhomirov@64: return this; tikhomirov@64: } tikhomirov@64: tikhomirov@68: /** tikhomirov@68: * if set, either base:revision or base:workingdir tikhomirov@68: * to unset, pass {@link HgRepository#TIP} or {@link HgRepository#BAD_REVISION} tikhomirov@68: * @param revision tikhomirov@68: * @return tikhomirov@68: */ tikhomirov@68: tikhomirov@64: public StatusCommand base(int revision) { tikhomirov@68: if (revision == WORKING_COPY) { tikhomirov@68: throw new IllegalArgumentException(); tikhomirov@68: } tikhomirov@68: if (revision == BAD_REVISION) { tikhomirov@68: revision = TIP; tikhomirov@68: } tikhomirov@64: startRevision = revision; tikhomirov@64: return this; tikhomirov@64: } tikhomirov@64: tikhomirov@68: /** tikhomirov@68: * Revision without base == --change tikhomirov@68: * Pass {@link HgRepository#WORKING_COPY} or {@link HgRepository#BAD_REVISION} to reset tikhomirov@68: * @param revision tikhomirov@68: * @return tikhomirov@68: */ tikhomirov@64: public StatusCommand revision(int revision) { tikhomirov@68: if (revision == BAD_REVISION) { tikhomirov@68: revision = WORKING_COPY; tikhomirov@68: } tikhomirov@68: // XXX negative values, except for predefined constants, shall throw IAE. tikhomirov@68: endRevision = revision; tikhomirov@64: return this; tikhomirov@64: } tikhomirov@64: tikhomirov@64: public StatusCommand match(Path.Matcher pathMatcher) { tikhomirov@64: matcher = pathMatcher; tikhomirov@64: return this; tikhomirov@64: } tikhomirov@64: tikhomirov@64: public StatusCommand subrepo(boolean visit) { tikhomirov@64: visitSubRepo = visit; tikhomirov@64: throw HgRepository.notImplemented(); tikhomirov@64: } tikhomirov@64: tikhomirov@68: public void execute(StatusCollector.Inspector inspector) { tikhomirov@68: StatusCollector sc = new StatusCollector(repo); // TODO from CommandContext tikhomirov@68: // StatusCollector.Record r = new StatusCollector.Record(); // XXX use own inspector not to collect entries that tikhomirov@68: // are not interesting or do not match name tikhomirov@68: if (endRevision == WORKING_COPY) { tikhomirov@74: WorkingCopyStatusCollector wcsc = new WorkingCopyStatusCollector(repo); tikhomirov@68: wcsc.setBaseRevisionCollector(sc); tikhomirov@68: wcsc.walk(startRevision, inspector); tikhomirov@68: } else { tikhomirov@68: if (startRevision == TIP) { tikhomirov@68: sc.change(endRevision, inspector); tikhomirov@68: } else { tikhomirov@68: sc.walk(startRevision, endRevision, inspector); tikhomirov@68: } tikhomirov@68: } tikhomirov@68: // PathPool pathHelper = new PathPool(repo.getPathHelper()); // TODO from CommandContext tikhomirov@64: } tikhomirov@64: }