/*
 *                 Sun Public License Notice
 *
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 *
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
 * Microsystems, Inc. All Rights Reserved.
 */
package org.netbeans.lib.cvsclient.file;

import org.netbeans.lib.cvsclient.admin.IAdminReader;

/**
 * @author  Thomas Singer
 */
public interface ICvsFileSystem {

	FileObject getFileObject(String relativeLocalDirectoryPath, String repositoryFilePath);

	DirectoryObject getDirectoryObject(String relativeLocalDirectoryPath, String repositoryDirectoryPath);

	IFileSystem getAdminFileSystem();

	IFileSystem getLocalFileSystem();

	String getRelativeRepositoryPath(String repositoryPath);

	String getRepositoryForDirectory(DirectoryObject directoryObject, IAdminReader adminReader);

	FileObject unixFileNameToFileObject(String unixFileName);
}
