blob: cf255569ca1f1e90c34000824a272f4f2bee22d4 [file] [log] [blame]
/*
* 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.admin;
import org.netbeans.lib.cvsclient.file.*;
import org.netbeans.lib.cvsclient.util.BugLog;
import org.netbeans.lib.cvsclient.SmartCvsSrcBundle;
import org.jetbrains.annotations.NonNls;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
/**
* A handler for administrative information that maintains full compatibility
* with the one employed by the original C implementation of a CVS client.
* <p>This implementation strives to provide complete compatibility with
* the standard CVS client, so that operations on locally checked-out
* files can be carried out by either this library or the standard client
* without causing the other to fail. Any such failure should be considered
* a bug in this library.
* @author Robert Greig
*/
public final class AdminReader
implements IAdminReader {
// Setup ==================================================================
private final String myCharset;
@NonNls private static final String CVS_REPOSITORY_FILE_PATH = "CVS/Repository";
@NonNls private static final String CVS_DIR_NAME = "CVS";
@NonNls private static final String CVS_ENTRIES_STATIC_FILE_PATH = "CVS/Entries.Static";
@NonNls private static final String CVS_ROOT_FILE_PATH = "CVS/Root";
public AdminReader(String charset) {
myCharset = charset;
}
// Implemented ============================================================
/**
* Get the Entry for the specified file, if one exists
*/
public Entry getEntry(AbstractFileObject fileObject, ICvsFileSystem cvsFileSystem) throws IOException {
final File directory = cvsFileSystem.getAdminFileSystem().getFile(fileObject.getParent());
try {
final EntriesHandler entriesHandler = new EntriesHandler(directory);
entriesHandler.read(myCharset);
return entriesHandler.getEntries().getEntry(fileObject.getName());
}
catch (FileNotFoundException ex) {
return null;
}
}
public Collection getEntries(DirectoryObject directoryObject, ICvsFileSystem cvsFileSystem) throws IOException {
final File directory = cvsFileSystem.getAdminFileSystem().getFile(directoryObject);
try {
final EntriesHandler entriesHandler = new EntriesHandler(directory);
entriesHandler.read(myCharset);
return entriesHandler.getEntries().getEntries();
}
catch (FileNotFoundException ex) {
return Collections.emptySet();
}
}
/**
* Get the repository path for a given directory, for example in
* the directory /home/project/foo/bar, the repository directory
* might be /usr/cvs/foo/bar. The repository directory is commonly
* stored in the file <pre>Repository</pre> in the CVS directory on
* the client. (This is the case in the standard CVS command-line tool).
* However, the path stored in that file is relative to the repository
* path
*/
public String getRepositoryForDirectory(DirectoryObject directoryObject, String repository, ICvsFileSystem cvsFileSystem) throws IOException {
final File directory = cvsFileSystem.getAdminFileSystem().getFile(directoryObject);
// if there is no "CVS/Repository" file, try to search up the file-hierarchy
File repositoryFile;
String repositoryDirs = "";
File dirFile = directory;
while (true) {
// if there is no Repository file we cannot very well get any repository from it
if (dirFile == null
|| dirFile.getName().length() == 0
|| !dirFile.exists()) {
throw new FileNotFoundException(
SmartCvsSrcBundle.message("repository.file.not.found.for.directory.error.message", directory));
}
repositoryFile = new File(dirFile, CVS_REPOSITORY_FILE_PATH);
if (repositoryFile.exists()) {
break;
}
repositoryDirs = '/' + dirFile.getName() + repositoryDirs;
dirFile = dirFile.getParentFile();
}
String fileRepository = FileUtils.readLineFromFile(repositoryFile);
if (fileRepository == null) {
fileRepository = "";
}
fileRepository += repositoryDirs;
fileRepository = fileRepository.replace(File.separatorChar, '/');
if (fileRepository.startsWith(repository)) {
return fileRepository;
} else {
return FileUtils.ensureTrailingSlash(repository) + fileRepository;
}
// otherwise the cvs is using relative repository path
// must be a forward slash, regardless of the local filing system
}
public String getStickyTagForDirectory(DirectoryObject directoryObject, ICvsFileSystem cvsFileSystem) {
return AdminUtils.getStickyTagForDirectory(directoryObject, cvsFileSystem);
}
public boolean hasCvsDirectory(DirectoryObject directoryObject, ICvsFileSystem cvsFileSystem) {
BugLog.getInstance().assertNotNull(directoryObject);
BugLog.getInstance().assertNotNull(cvsFileSystem);
final File directory = cvsFileSystem.getAdminFileSystem().getFile(directoryObject);
return new File(directory, CVS_DIR_NAME).isDirectory();
}
public boolean isModified(FileObject fileObject, Date entryLastModified, ICvsFileSystem cvsFileSystem) {
final File file = cvsFileSystem.getLocalFileSystem().getFile(fileObject);
return !DateComparator.getInstance().equals(file.lastModified(), entryLastModified.getTime());
}
public boolean isStatic(DirectoryObject directoryObject, ICvsFileSystem cvsFileSystem) {
BugLog.getInstance().assertNotNull(directoryObject);
BugLog.getInstance().assertNotNull(cvsFileSystem);
final File directory = cvsFileSystem.getAdminFileSystem().getFile(directoryObject);
return new File(directory, CVS_ENTRIES_STATIC_FILE_PATH).isFile();
}
public String getCvsRootForDirectory(DirectoryObject directoryObject, ICvsFileSystem cvsFileSystem) throws IOException {
final File directory = cvsFileSystem.getAdminFileSystem().getFile(directoryObject);
// if there is no "CVS/Root" file, try to search up the file-hierarchy
File rootFile;
String repositoryDirs = "";
File dirFile = directory;
while (true) {
// if there is no Repository file we cannot very well get any repository from it
if (dirFile == null
|| dirFile.getName().length() == 0
|| !dirFile.exists()) {
throw new FileNotFoundException(SmartCvsSrcBundle.message("root.file.not.found.for.directory.err.rmessage", directory));
}
rootFile = new File(dirFile, CVS_ROOT_FILE_PATH);
if (rootFile.exists()) {
break;
}
repositoryDirs = '/' + dirFile.getName() + repositoryDirs;
dirFile = dirFile.getParentFile();
}
return FileUtils.readLineFromFile(rootFile).trim();
}
}