view src/org/tmatesoft/hg/core/HgRepoFacade.java @ 709:497e697636fc

Report merged lines as changed block if possible, not as a sequence of added/deleted blocks. To facilitate access to merge parent lines AddBlock got mergeLineAt() method that reports index of the line in the second parent (if any), while insertedAt() has been changed to report index in the first parent always
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Wed, 21 Aug 2013 16:23:27 +0200
parents 7743a9c10bfa
children
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);
	}

	public HgMergeCommand createMergeCommand() {
		return new HgMergeCommand(repo);
	}
}