tikhomirov@239: /* tikhomirov@403: * Copyright (c) 2011-2012 TMate Software Ltd tikhomirov@239: * tikhomirov@239: * This program is free software; you can redistribute it and/or modify tikhomirov@239: * it under the terms of the GNU General Public License as published by tikhomirov@239: * the Free Software Foundation; version 2 of the License. tikhomirov@239: * tikhomirov@239: * This program is distributed in the hope that it will be useful, tikhomirov@239: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@239: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@239: * GNU General Public License for more details. tikhomirov@239: * tikhomirov@239: * For information on how to redistribute this software under tikhomirov@239: * the terms of a license other than GNU General Public License tikhomirov@239: * contact TMate Software at support@hg4j.com tikhomirov@239: */ tikhomirov@239: package org.tmatesoft.hg.repo; tikhomirov@239: tikhomirov@239: import java.io.File; tikhomirov@239: tikhomirov@423: import org.tmatesoft.hg.core.HgRepositoryNotFoundException; tikhomirov@442: import org.tmatesoft.hg.core.Nodeid; tikhomirov@239: import org.tmatesoft.hg.util.Path; tikhomirov@239: tikhomirov@239: /** tikhomirov@467: * Descriptor for subrepository location tikhomirov@442: * tikhomirov@442: * @see http://mercurial.selenic.com/wiki/Subrepository tikhomirov@239: * @author Artem Tikhomirov tikhomirov@239: * @author TMate Software Ltd. tikhomirov@239: */ tikhomirov@239: public class HgSubrepoLocation { tikhomirov@239: tikhomirov@239: private final HgRepository owner; tikhomirov@239: private final Kind kind; tikhomirov@239: private final Path location; tikhomirov@239: private final String source; tikhomirov@442: private final Nodeid revInfo; tikhomirov@239: tikhomirov@239: public enum Kind { Hg, SVN, Git, } tikhomirov@239: tikhomirov@442: /** tikhomirov@442: * tikhomirov@442: * @param parentRepo tikhomirov@442: * @param repoLocation path, shall be valid directory (i.e. even if .hgsub doesn't specify trailing slash, this one shall) tikhomirov@442: * @param actualLocation tikhomirov@442: * @param type tikhomirov@442: * @param revision may be null tikhomirov@442: */ tikhomirov@442: /*package-local*/ HgSubrepoLocation(HgRepository parentRepo, Path repoLocation, String actualLocation, Kind type, Nodeid revision) { tikhomirov@239: owner = parentRepo; tikhomirov@442: location = repoLocation; tikhomirov@239: source = actualLocation; tikhomirov@239: kind = type; tikhomirov@239: revInfo = revision; tikhomirov@239: } tikhomirov@239: tikhomirov@442: /** tikhomirov@442: * Sub-repository's location within owning repository, always directory, path/to/nested. tikhomirov@442: *

tikhomirov@442: * May differ from left-hand, key value from .hgsub if the latter doesn't include trailing slash, which is required tikhomirov@442: * for {@link Path} objects tikhomirov@442: * tikhomirov@442: * @return path to nested repository relative to owner's location tikhomirov@442: */ tikhomirov@239: public Path getLocation() { tikhomirov@239: return location; tikhomirov@239: } tikhomirov@239: tikhomirov@442: /** tikhomirov@442: * Right-hand value from .hgsub, with [kind] stripped, if any. tikhomirov@442: * @return sub-repository's source tikhomirov@442: */ tikhomirov@239: public String getSource() { tikhomirov@239: return source; tikhomirov@239: } tikhomirov@239: tikhomirov@442: /** tikhomirov@442: * Sub-repository kind, either Mercurial, Subversion or Git tikhomirov@442: * @return one of predefined constants tikhomirov@442: */ tikhomirov@239: public Kind getType() { tikhomirov@239: return kind; tikhomirov@239: } tikhomirov@239: tikhomirov@442: /** tikhomirov@442: * For a nested repository that has been committed at least once, returns tikhomirov@442: * its revision as known from .hgsubstate tikhomirov@442: * tikhomirov@442: *

Note, this revision belongs to the nested repository history, not that of owning repository. tikhomirov@442: * tikhomirov@442: * @return revision of the nested repository, or null if not yet committed tikhomirov@442: */ tikhomirov@442: public Nodeid getRevision() { tikhomirov@239: return revInfo; tikhomirov@239: } tikhomirov@239: tikhomirov@239: /** tikhomirov@442: * Answers whether this sub repository has ever been part of a commit of the owner repository tikhomirov@442: * tikhomirov@442: * @return true if owning repository records {@link #getRevision() revision} of this sub-repository tikhomirov@239: */ tikhomirov@239: public boolean isCommitted() { tikhomirov@239: return revInfo != null; tikhomirov@239: } tikhomirov@239: tikhomirov@239: /** tikhomirov@442: * Answers whether there are local changes in the sub-repository, tikhomirov@442: * @return true if it's dirty tikhomirov@239: */ tikhomirov@239: public boolean hasChanges() { tikhomirov@239: throw HgRepository.notImplemented(); tikhomirov@239: } tikhomirov@442: tikhomirov@442: /** tikhomirov@442: * Access repository that owns nested one described by this object tikhomirov@442: */ tikhomirov@239: public HgRepository getOwner() { tikhomirov@239: return owner; tikhomirov@239: } tikhomirov@239: tikhomirov@423: /** tikhomirov@442: * Access nested repository as a full-fledged Mercurial repository tikhomirov@423: * tikhomirov@423: * @return object to access sub-repository tikhomirov@423: * @throws HgRepositoryNotFoundException if failed to find repository tikhomirov@423: * @throws HgRuntimeException subclass thereof to indicate issues with the library. Runtime exception tikhomirov@423: */ tikhomirov@423: public HgRepository getRepo() throws HgRepositoryNotFoundException { tikhomirov@239: if (kind != Kind.Hg) { tikhomirov@423: throw new HgInvalidStateException(String.format("Unsupported subrepository %s", kind)); tikhomirov@239: } tikhomirov@239: return new HgLookup().detect(new File(owner.getWorkingDir(), source)); tikhomirov@239: } tikhomirov@239: }