view src/org/tmatesoft/hg/core/HgRepoFacade.java @ 694:7efabe0cddcf

Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Mon, 05 Aug 2013 17:42:10 +0200
parents 4fd317a2fecf
children 7743a9c10bfa
line wrap: on
line source
/*
 * Copyright (c) 2011-2013 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@hg4j.com
 */
package org.tmatesoft.hg.core;

import java.io.File;

import org.tmatesoft.hg.internal.BasicSessionContext;
import org.tmatesoft.hg.repo.HgRepository;
import org.tmatesoft.hg.repo.HgLookup;

/**
 * Starting point for the library.
 * <p>Sample use:
 * <pre>
 *  HgRepoFacade f = new HgRepoFacade();
 *  f.initFrom(System.getenv("whatever.repo.location"));
 *  HgStatusCommand statusCmd = f.createStatusCommand();
 *  HgStatusCommand.Handler handler = ...;
 *  statusCmd.execute(handler);
 * </pre>
 * 
 * @author Artem Tikhomirov
 * @author TMate Software Ltd.
 */
public class HgRepoFacade implements SessionContext.Source {
	private HgRepository repo;
	private final SessionContext context;

	public HgRepoFacade() {
		this(new BasicSessionContext(null));
	}
	
	public HgRepoFacade(SessionContext ctx) {
		if (ctx == null) {
			throw new IllegalArgumentException();
		}
		context = ctx;
	}
	
	/**
	 * @param hgRepo
	 * @return true on successful initialization
	 * @throws IllegalArgumentException when argument is null 
	 */
	public boolean init(HgRepository hgRepo) {
		if (hgRepo == null) {
			throw new IllegalArgumentException();
		}
		repo = hgRepo;
		return !repo.isInvalid();
	}

	/**
	 * Tries to find repository starting from the current working directory.
	 * 
	 * @return <code>true</code> if found valid repository
	 * @throws HgRepositoryNotFoundException if no repository found in working directory
	 */
	public boolean init() throws HgRepositoryNotFoundException {
		repo = new HgLookup(context).detectFromWorkingDir();
		return repo != null && !repo.isInvalid();
	}
	
	/**
	 * Looks up Mercurial repository starting from specified location and up to filesystem root.
	 * 
	 * @param repoLocation path to any folder within structure of a Mercurial repository.
	 * @return <code>true</code> if found valid repository 
	 * @throws HgRepositoryNotFoundException if there's no repository at specified location
	 * @throws IllegalArgumentException if argument is <code>null</code>
	 */
	public boolean initFrom(File repoLocation) throws HgRepositoryNotFoundException {
		if (repoLocation == null) {
			throw new IllegalArgumentException();
		}
		repo = new HgLookup(context).detect(repoLocation);
		return repo != null && !repo.isInvalid();
	}
	
	public HgRepository getRepository() {
		if (repo == null) {
			throw new IllegalStateException("Call any of #init*() methods first first");
		}
		return repo;
	}
	
	public SessionContext getSessionContext() {
		return context;
	}
	
	/**
	 * This factory method doesn't need this facade to be initialized with a repository.
	 * @return command instance, never <code>null</code>
	 */
	public HgInitCommand createInitCommand() {
		return new HgInitCommand(new HgLookup(context));
	}

	public HgLogCommand createLogCommand() {
		return new HgLogCommand(repo/*, getCommandContext()*/);
	}

	public HgStatusCommand createStatusCommand() {
		return new HgStatusCommand(repo/*, getCommandContext()*/);
	}

	public HgCatCommand createCatCommand() {
		return new HgCatCommand(repo);
	}

	public HgManifestCommand createManifestCommand() {
		return new HgManifestCommand(repo);
	}

	public HgOutgoingCommand createOutgoingCommand() {
		return new HgOutgoingCommand(repo);
	}

	public HgIncomingCommand createIncomingCommand() {
		return new HgIncomingCommand(repo);
	}
	
	public HgCloneCommand createCloneCommand() {
		return new HgCloneCommand();
	}
	
	public HgUpdateConfigCommand createUpdateRepositoryConfigCommand() {
		return HgUpdateConfigCommand.forRepository(repo);
	}
	
	public HgAddRemoveCommand createAddRemoveCommand() {
		return new HgAddRemoveCommand(repo);
	}
	
	public HgCheckoutCommand createCheckoutCommand() {
		return new HgCheckoutCommand(repo);
	}
	
	public HgRevertCommand createRevertCommand() {
		return new HgRevertCommand(repo);
	}
	
	public HgAnnotateCommand createAnnotateCommand() {
		return new HgAnnotateCommand(repo);
	}
	
	public HgCommitCommand createCommitCommand() {
		return new HgCommitCommand(repo);
	}
	
	public HgDiffCommand createDiffCommand() {
		return new HgDiffCommand(repo);
	}

	public HgPushCommand createPushCommand() {
		return new HgPushCommand(repo);
	}
	
	public HgPullCommand createPullCommand() {
		return new HgPullCommand(repo);
	}
}