/* * Copyright 2000-2009 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.cvsSupport2.connections; import com.intellij.cvsSupport2.CvsUtil; import com.intellij.cvsSupport2.application.CvsEntriesManager; import com.intellij.cvsSupport2.application.CvsInfo; import com.intellij.cvsSupport2.cvsoperations.dateOrRevision.RevisionOrDate; import com.intellij.cvsSupport2.errorHandling.CannotFindCvsRootException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; /** * author: lesya */ public class CvsRootOnFileSystem extends CvsRootProvider { private final CvsConnectionSettings mySettings; private CvsRootOnFileSystem(CvsConnectionSettings cvsRoot, File fileRoot) { super(fileRoot, cvsRoot); mySettings = cvsRoot; } public static CvsRootOnFileSystem createMeOn(File file) throws CannotFindCvsRootException { File nearestRoot = getRootFor(file); if (nearestRoot == null) throw new CannotFindCvsRootException(file); CvsConnectionSettings cvsRoot = getCvsRootFor(nearestRoot); if (cvsRoot == CvsInfo.getAbsentSettings()) throw new CannotFindCvsRootException(file); File commonRoot = getCommonRoot(nearestRoot, cvsRoot); return new CvsRootOnFileSystem(getCvsEntriesManager().getCvsConnectionSettingsFor(commonRoot), commonRoot); } private static CvsEntriesManager getCvsEntriesManager() { return CvsEntriesManager.getInstance(); } public int hashCode() { return mySettings.hashCode() ^ getLocalRoot().hashCode(); } public boolean equals(Object obj) { if (!(obj instanceof CvsRootOnFileSystem)) return false; CvsRootOnFileSystem other = (CvsRootOnFileSystem) obj; return mySettings.equals(other.mySettings) && getLocalRoot().equals(other.getLocalRoot()); } private static File getCommonRoot(File nearestRoot, CvsConnectionSettings cvsRoot) { File result = nearestRoot; if (result.getParentFile() == null) return result; while (cvsRoot.equals(getCvsRootFor(result.getParentFile()))) { result = result.getParentFile(); if (result.getParentFile() == null) return result; } return result; } private static CvsConnectionSettings getCvsRootFor(@NotNull File file) { return getCvsEntriesManager().getCvsConnectionSettingsFor(file); } @Nullable private static File getRootFor(File file) { if (file == null) return null; if (!file.isDirectory()) return getRootFor(file.getParentFile()); if (CvsUtil.fileIsUnderCvs(file)) return file; return getRootFor(file.getParentFile()); } public String getRepository() { return myCvsEnvironment.getRepository(); } public RevisionOrDate getRevisionOrDate() { return RevisionOrDate.EMPTY; } }