view src/org/tmatesoft/hg/core/StatusCommand.java @ 69:5a69397f0f99

Discovery utility for Hg network protocol finally in the repo, with quick-n-dirty ConfigFile impl that helps to hide auth info
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Sat, 22 Jan 2011 22:53:57 +0100
parents 0e499fed9b3d
children 6f1b88693d48
line wrap: on
line source
/*
 * Copyright (c) 2011 TMate Software Ltd
 *  
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * For information on how to redistribute this software under
 * the terms of a license other than GNU General Public License
 * contact TMate Software at support@svnkit.com
 */
package org.tmatesoft.hg.core;

import static com.tmate.hgkit.ll.HgRepository.BAD_REVISION;
import static com.tmate.hgkit.ll.HgRepository.TIP;
import static com.tmate.hgkit.ll.HgRepository.WORKING_COPY;

import org.tmatesoft.hg.core.Path.Matcher;
import org.tmatesoft.hg.util.PathPool;

import com.tmate.hgkit.fs.FileWalker;
import com.tmate.hgkit.ll.HgRepository;
import com.tmate.hgkit.ll.LocalHgRepo;
import com.tmate.hgkit.ll.StatusCollector;
import com.tmate.hgkit.ll.WorkingCopyStatusCollector;
import com.tmate.hgkit.ll.StatusCollector.Record;

/**
 *
 * @author Artem Tikhomirov
 * @author TMate Software Ltd.
 */
public class StatusCommand {
	private final HgRepository repo;

	private boolean needModified;
	private boolean needAdded;
	private boolean needRemoved;
	private boolean needUnknown;
	private boolean needMissing;
	private boolean needClean;
	private boolean needIgnored;
	private Matcher matcher;
	private int startRevision = TIP;
	private int endRevision = WORKING_COPY; 
	private boolean visitSubRepo = true;

	public StatusCommand(HgRepository hgRepo) { 
		repo = hgRepo;
		defaults();
	}

	public StatusCommand defaults() {
		needModified = needAdded = needRemoved = needUnknown = needMissing = true;
		needClean = needIgnored = false;
		return this;
	}
	public StatusCommand all() {
		needModified = needAdded = needRemoved = needUnknown = needMissing = true;
		needClean = needIgnored = true;
		return this;
	}
	

	public StatusCommand modified(boolean include) {
		needModified = include;
		return this;
	}
	public StatusCommand added(boolean include) {
		needAdded = include;
		return this;
	}
	public StatusCommand removed(boolean include) {
		needRemoved = include;
		return this;
	}
	public StatusCommand deleted(boolean include) {
		needMissing = include;
		return this;
	}
	public StatusCommand unknown(boolean include) {
		needUnknown = include;
		return this;
	}
	public StatusCommand clean(boolean include) {
		needClean = include;
		return this;
	}
	public StatusCommand ignored(boolean include) {
		needIgnored = include;
		return this;
	}
	
	/**
	 * if set, either base:revision or base:workingdir
	 * to unset, pass {@link HgRepository#TIP} or {@link HgRepository#BAD_REVISION}
	 * @param revision
	 * @return
	 */
	
	public StatusCommand base(int revision) {
		if (revision == WORKING_COPY) {
			throw new IllegalArgumentException();
		}
		if (revision == BAD_REVISION) {
			revision = TIP;
		}
		startRevision = revision;
		return this;
	}
	
	/**
	 * Revision without base == --change
	 * Pass {@link HgRepository#WORKING_COPY} or {@link HgRepository#BAD_REVISION} to reset
	 * @param revision
	 * @return
	 */
	public StatusCommand revision(int revision) {
		if (revision == BAD_REVISION) {
			revision = WORKING_COPY;
		}
		// XXX negative values, except for predefined constants, shall throw IAE.
		endRevision = revision;
		return this;
	}
	
	public StatusCommand match(Path.Matcher pathMatcher) {
		matcher = pathMatcher;
		return this;
	}

	public StatusCommand subrepo(boolean visit) {
		visitSubRepo  = visit;
		throw HgRepository.notImplemented();
	}
	
	public void execute(StatusCollector.Inspector inspector) {
		StatusCollector sc = new StatusCollector(repo); // TODO from CommandContext
//		StatusCollector.Record r = new StatusCollector.Record(); // XXX use own inspector not to collect entries that
		// are not interesting or do not match name
		if (endRevision == WORKING_COPY) {
			WorkingCopyStatusCollector wcsc = new WorkingCopyStatusCollector(repo, ((LocalHgRepo) repo).createWorkingDirWalker());
			wcsc.setBaseRevisionCollector(sc);
			wcsc.walk(startRevision, inspector);
		} else {
			if (startRevision == TIP) {
				sc.change(endRevision, inspector);
			} else {
				sc.walk(startRevision, endRevision, inspector);
			}
		}
//		PathPool pathHelper = new PathPool(repo.getPathHelper()); // TODO from CommandContext
	}
}