From: Clayton H. <dr...@us...> - 2004-10-28 06:42:34
|
Update of /cvsroot/sharpcvslib/sharpcvslib/src/ICSharpCode/SharpCvsLib/FileSystem In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18006/src/ICSharpCode/SharpCvsLib/FileSystem Modified Files: AbstractCvsFile.cs Entry.cs Factory.cs ICvsFile.cs Manager.cs PathTranslator.cs Repository.cs Root.cs Tag.cs Log Message: Big update to the FileSystem namespace both to cleanup the implementation and to handle the condition: c:\CVS\src\sharpcvslib where CVS is not a management folder. Also added the cvsnt specific List (ls) command. Index: Factory.cs =================================================================== RCS file: /cvsroot/sharpcvslib/sharpcvslib/src/ICSharpCode/SharpCvsLib/FileSystem/Factory.cs,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** Factory.cs 9 Dec 2003 08:25:38 -0000 1.10 --- Factory.cs 28 Oct 2004 06:42:21 -0000 1.11 *************** *** 93,106 **** /// (directory seperator character may be different): /// ! /// path = c:/dev/sharpcvslib ! /// fileName = Entries ! /// line = /SharpCvsLib.build/1.1/// ! /// ! /// With the following information: ! /// FileContents = /SharpCvsLib.build/1.1/// ! /// FileName = Entries ! /// FullPath = c:/dev/sharpcvslib/SharpCvsLib.build ! /// IsMultiLined = true ! /// Path = c:/dev/sharpcvslib/ /// /// NOTE: --- 93,118 ---- /// (directory seperator character may be different): /// ! /// <list type="table"> ! /// <term>path</term> ! /// <description>c:/dev/sharpcvslib</description> ! /// <term>fileName</term> ! /// <description>Entries</description> ! /// <term>line</term> ! /// <description>/SharpCvsLib.build/1.1///</description> ! /// </list> ! /// ! /// With the following information: ! /// <list type="table"> ! /// <term>FileContents</term> ! /// <description>/SharpCvsLib.build/1.1///</description> ! /// <term>FileName</term> ! /// <description>Entries</description> ! /// <term>FullPath</term> ! /// <description>c:/dev/sharpcvslib/SharpCvsLib.build</description> ! /// <term>IsMultiLined</term> ! /// <description>true</description> ! /// <term>Path</term> ! /// <description>c:/dev/sharpcvslib/</description> ! /// </list> /// /// NOTE: *************** *** 113,155 **** public ICvsFile CreateCvsObject (String path, String fileName, String line) { FileType fileType = this.GetFileType(fileName); ! return this.CreateCvsObject(path, fileType, line); } /// <summary> ! /// Create the cvs file based on the filename. Returns the ! /// cvs file interface. /// </summary> ! public ICvsFile CreateCvsObject (String path, ! FileType fileType, ! String line) { ICvsFile entry; ! LOGGER.Debug("path=[" + path + "]"); ! LOGGER.Debug("line=[" + line + "]"); ! switch (fileType) { case (FileType.Entries): { ! if (Entry.IsDirectoryEntry(line)) { ! if (path.EndsWith("/") || ! path.EndsWith(Path.DirectorySeparatorChar.ToString())) { ! path = path.Substring(0, path.Length - 1); ! } ! path = Path.GetDirectoryName(path); ! } ! LOGGER.Debug("path=[" + path + "]"); ! entry = new Entry(path, line); break; } case (FileType.Repository):{ ! LOGGER.Debug("Creating repository file."); ! entry = new Repository (path, line); break; } case (FileType.Root):{ ! LOGGER.Debug("Creating root file."); ! entry = new Root (path, line); break; } case (FileType.Tag):{ ! LOGGER.Debug("Creating tag file."); ! entry = new Tag (path, line); break; } --- 125,170 ---- public ICvsFile CreateCvsObject (String path, String fileName, String line) { FileType fileType = this.GetFileType(fileName); ! FileInfo cvsFile = new FileInfo(Path.Combine(PathTranslator.AppendCvs(path).FullName, fileName)); ! return this.CreateCvsObject(cvsFile, line); ! } ! ! public ICvsFile CreateCvsObject (DirectoryInfo dir, string fileName, string line) { ! if (!dir.FullName.EndsWith(string.Format("{0}CVS", ! Path.DirectorySeparatorChar))) { ! dir = new DirectoryInfo(Path.Combine(dir.FullName, "CVS")); ! } ! FileInfo cvsFile = new FileInfo(Path.Combine(dir.FullName, fileName)); ! return this.CreateCvsObject(cvsFile, line); } /// <summary> ! /// Create a cvs file object given the full path and line of the file. /// </summary> ! /// <param name="file"></param> ! /// <param name="line"></param> ! /// <returns></returns> ! public ICvsFile CreateCvsObject (FileInfo file, string line) { ICvsFile entry; ! ! if (!System.Enum.IsDefined(typeof(FileType), file.Name)) { ! throw new UnsupportedFileTypeException(string.Format("Unknown cvs file type: {0}", ! file.Name)); ! } ! ! switch ((FileType)Enum.Parse(typeof(FileType), file.Name, true)) { case (FileType.Entries): { ! entry = new Entry(file, line); break; } case (FileType.Repository):{ ! entry = new Repository (file, line); break; } case (FileType.Root):{ ! entry = new Root (file, line); break; } case (FileType.Tag):{ ! entry = new Tag (file, line); break; } *************** *** 157,161 **** StringBuilder msg = new StringBuilder(); msg.Append("Unknown file type specified."); ! msg.Append("fileType=[").Append(fileType.ToString()).Append("]"); throw new UnsupportedFileTypeException (msg.ToString()); } --- 172,176 ---- StringBuilder msg = new StringBuilder(); msg.Append("Unknown file type specified."); ! msg.Append("fileType=[").Append(file.Name).Append("]"); throw new UnsupportedFileTypeException (msg.ToString()); } *************** *** 163,167 **** --- 178,203 ---- } return entry; + } + + private string GetCvsFileName (string fullPath) { + int cvsIndex = fullPath.LastIndexOf("CVS"); + if (cvsIndex == -1) { + throw new Exception(string.Format("CVS directory does not exist in {0}.", + fullPath)); + } + return + fullPath.Substring(cvsIndex + 3); + } + + private string GetPath(string fullPath) { + int cvsIndex = fullPath.LastIndexOf("CVS"); + if (cvsIndex == -1) { + throw new Exception(string.Format("CVS directory does not exist in {0}.", + fullPath)); + } + + return + fullPath.Substring(0, cvsIndex); } Index: PathTranslator.cs =================================================================== RCS file: /cvsroot/sharpcvslib/sharpcvslib/src/ICSharpCode/SharpCvsLib/FileSystem/PathTranslator.cs,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** PathTranslator.cs 16 Dec 2003 07:44:54 -0000 1.9 --- PathTranslator.cs 28 Oct 2004 06:42:22 -0000 1.10 *************** *** 61,71 **** private String repositoryPath; private CvsRoot cvsRoot; private String relativePath; - private String filename; - private String localPath; - private String localPathAndFilename; - private String localRootPath; - private String localModuleFolderName; private bool isDirectory; --- 61,70 ---- private String repositoryPath; + private DirectoryInfo baseDir; + private string moduleFacade; + private DirectoryInfo currentDir; + private CvsRoot cvsRoot; private String relativePath; private bool isDirectory; *************** *** 91,95 **** /// </summary> public String Filename { ! get {return this.filename;} } --- 90,94 ---- /// </summary> public String Filename { ! get {return baseDir.Name;} } *************** *** 100,104 **** /// </summary> public String LocalPath { ! get {return this.localPath;} } --- 99,103 ---- /// </summary> public String LocalPath { ! get {return baseDir.FullName;} } *************** *** 107,112 **** /// of the file. /// </summary> public String LocalPathAndFilename { ! get {return this.localPathAndFilename;} } --- 106,116 ---- /// of the file. /// </summary> + [Obsolete ("Use CurrentDir")] public String LocalPathAndFilename { ! get {return this.currentDir.FullName;} ! } ! ! public DirectoryInfo CurrentDir { ! get {return this.currentDir;} } *************** *** 119,122 **** --- 123,147 ---- /// <summary> + /// Uses the directory seperator character to determine if the platform is Windows. + /// </summary> + /// <value><code>true</code> if the directory seperator character is a '\'; otherwise + /// <code>false</code>.</value> + public static bool IsWin32 { + get { + return Path.DirectorySeparatorChar.Equals('\\'); + } + } + + /// <summary> + /// Indicate if the platform filesystem is case sensitive or not. + /// </summary> + /// <value><code>true</code> if the OS is case sensitive; otherwise <code>false</code>.</value> + public static bool IsCaseSensitive { + get { + return !IsWin32; + } + } + + /// <summary> /// Constructor, parses out the orgainizational path response from /// the cvs server. *************** *** 127,218 **** /// down from the cvs server.</param> public PathTranslator (WorkingDirectory workingDirectory, ! String repositoryPath) { this.repositoryPath = repositoryPath; this.workingDirectory = workingDirectory; - this.localRootPath = workingDirectory.LocalDirectory; this.cvsRoot = workingDirectory.CvsRoot; - this.localModuleFolderName = workingDirectory.WorkingDirectoryName; - this.filename = this.GetFilename (repositoryPath); this.relativePath = ! this.GetRelativePath (workingDirectory.CvsRoot.CvsRepository, ! repositoryPath, ! workingDirectory.ModuleName); ! LOGGER.Debug ("relativePath=[" + relativePath + "]"); ! ! LOGGER.Debug ("workingDirectory=[" + workingDirectory.ToString () + "]"); ! this.localPath = ! PathTranslator.ConvertToOSSpecificPath (Path.Combine (workingDirectory.WorkingPath, ! relativePath)); ! if (this.isDirectory) { ! this.localPathAndFilename = ! PathTranslator.ConvertToOSSpecificPath(this.LocalPath); ! } else { ! this.localPathAndFilename = ! PathTranslator.ConvertToOSSpecificPath (Path.Combine (this.localPath, this.filename)); ! } ! } ! ! /// <summary> ! /// Gets the relative path to the file by removing the cvs root directory ! /// and the module name from the reporitoy path. ! /// </summary> ! /// <param name="cvsRootDirectory">The cvs root directory.</param> ! /// <param name="repositoryPath">The path to the file/ directory as specified ! /// by the cvs server.</param> ! /// <param name="moduleName">The name of the module which will be parsed ! /// out so the local directory name can be different than the module ! /// name.</param> ! /// <returns>The relative path to the filename, excluding the file name.</returns> ! private String GetRelativePath (String cvsRootDirectory, ! String repositoryPath, ! String moduleName) { ! String filename = this.GetFilename (repositoryPath); ! LOGGER.Debug ("Enter relative path"); ! if (LOGGER.IsDebugEnabled) { ! StringBuilder msg = new StringBuilder (); ! msg.Append ("cvsRootDirectory=[").Append (cvsRootDirectory).Append ("]"); ! msg.Append ("repositoryPath=[").Append (repositoryPath).Append ("]"); ! msg.Append ("moduleName=[").Append (moduleName).Append ("]"); ! msg.Append ("filename=[").Append (filename).Append ("]"); ! LOGGER.Debug (msg); ! } ! ! String tempRelativePath = repositoryPath; ! ! LOGGER.Debug ("before cvsroot touched=[" + tempRelativePath + "]"); ! // Remove the cvsRoot from the path. ! tempRelativePath = ! tempRelativePath.Substring (cvsRootDirectory.Length); ! LOGGER.Debug ("after cvsroot removed=[" + tempRelativePath + "]"); ! ! if (tempRelativePath.StartsWith ("/")) { ! tempRelativePath = tempRelativePath.Substring (1); ! } ! ! if (tempRelativePath.Length >= filename.Length && ! filename.Length > 0 && ! !filename.Equals(Path.DirectorySeparatorChar.ToString())) { ! tempRelativePath = tempRelativePath.Substring(0, ! tempRelativePath.Length - filename.Length); ! } ! LOGGER.Debug ("after filename removed=[" + tempRelativePath + "]"); ! ! // at this point module name should be at the start of the string ! if (tempRelativePath.IndexOf (moduleName) > 0 || ! tempRelativePath.Length >= moduleName.Length) { ! tempRelativePath = ! tempRelativePath.Substring (moduleName.Length); ! } ! LOGGER.Debug ("after module name removed=[" + ! tempRelativePath + "]"); ! ! if (tempRelativePath.StartsWith ("/")) { ! tempRelativePath = tempRelativePath.Substring (1); ! } ! LOGGER.Debug ("after / removed from start=[" + ! tempRelativePath + "]"); ! ! return tempRelativePath; } --- 152,167 ---- /// down from the cvs server.</param> public PathTranslator (WorkingDirectory workingDirectory, ! String repositoryPath) { ! this.baseDir = new DirectoryInfo(workingDirectory.LocalDirectory); ! this.moduleFacade = workingDirectory.WorkingDirectoryName; ! this.repositoryPath = repositoryPath; this.workingDirectory = workingDirectory; this.cvsRoot = workingDirectory.CvsRoot; this.relativePath = ! this.GetRelativePath (repositoryPath); + this.currentDir = + new DirectoryInfo(Path.Combine(baseDir.FullName, this.relativePath)); } *************** *** 224,237 **** /// which is returned in the server response.</param> /// <returns>The value of the filename.</returns> ! private String GetFilename (String repositoryPath) { ! String filename = Path.GetFileName (repositoryPath); if (repositoryPath.EndsWith("/")) { - filename = Path.DirectorySeparatorChar.ToString(); this.isDirectory = true; } ! if (LOGGER.IsDebugEnabled) { ! LOGGER.Debug ("filename=[" + filename + "]"); } return filename; } --- 173,191 ---- /// which is returned in the server response.</param> /// <returns>The value of the filename.</returns> ! private String GetRelativePath (String repositoryPath) { ! String filename = ! repositoryPath.Replace(this.workingDirectory.CvsRoot.CvsRepository, ""); if (repositoryPath.EndsWith("/")) { this.isDirectory = true; } ! filename = filename.Substring(1, filename.Length - 1); ! // if the module name is different from the one sent down from the repository ! // then we have specified an override directory. ! if (filename.Substring(0, this.moduleFacade.Length) != this.moduleFacade) { ! filename = filename.Replace(filename.Substring(0, filename.IndexOf("/")), ! this.moduleFacade); } + return filename; } *************** *** 246,254 **** formatter.AddProperty ("repositoryPath=[", this.repositoryPath); formatter.AddProperty ("relativePath", relativePath); - formatter.AddProperty ("localModuleFolderName", localModuleFolderName); - formatter.AddProperty ("filename", filename); - formatter.AddProperty ("localRootPath", localRootPath); - formatter.AddProperty ("localPath", localPath); - formatter.AddProperty ("localPathAndFilename", this.localPathAndFilename); return formatter.ToString (); --- 200,203 ---- *************** *** 278,289 **** /// <returns>Returns <code>true</code> if the path does NOT contain a CVS /// folder; otherwise returns <code>false</code></returns> ! public static bool ContainsCVS(String fullPath) { ! if (fullPath.ToUpper().IndexOf(CVS) >= 0) { ! if (fullPath.ToUpper().IndexOf(Path.DirectorySeparatorChar + CVS + Path.DirectorySeparatorChar) >= 0) { return true; } ! if (IsSeperatorBeforeAndAfterCvs(fullPath)) { return true; ! } } return false; --- 227,276 ---- /// <returns>Returns <code>true</code> if the path does NOT contain a CVS /// folder; otherwise returns <code>false</code></returns> ! private static bool ContainsCVS(String fullPath) { ! if (!fullPath.EndsWith(Path.DirectorySeparatorChar.ToString())) { ! fullPath += Path.DirectorySeparatorChar; ! } ! foreach (string fileType in System.Enum.GetNames(typeof(Factory.FileType))) { ! string cvsDir = string.Format("{0}{1}{2}{3}", ! Path.DirectorySeparatorChar, CVS, Path.DirectorySeparatorChar, fileType); ! ! int lastCvsDir = fullPath.ToUpper().IndexOf(cvsDir.ToUpper()); ! int lastFile = fullPath.Length - cvsDir.Length - 1; ! if (lastCvsDir == lastFile) { return true; } ! } ! return false; ! } ! ! /// <summary> ! /// Determine if the full path specified is a cvs control directory or if it is just a ! /// regular path on the hard drive. ! /// </summary> ! /// <param name="fullPath">Full path to check.</param> ! /// <returns><code>true</code> if the directory is a cvs control directory; ! /// otherwise <code>false</code>.</returns> ! public static bool IsCvsDir (string fullPath) { ! if (ContainsCVS(fullPath)) { // && HasControlFiles(fullPath)) { ! return true; ! } else { ! return false; ! } ! } ! ! private static bool HasControlFiles (string fullPath) { ! if (null == fullPath) { ! return false; ! } ! DirectoryInfo dirInfo = new DirectoryInfo(fullPath); ! if (!dirInfo.Exists) { ! return false; ! } ! foreach (FileInfo file in dirInfo.GetFiles()) { ! if ((ContainsCVS(dirInfo.Name) && Entry.FILE_NAME.IndexOf(file.Name) > -1) || ! (ContainsCVS(dirInfo.Name) && Root.FILE_NAME.IndexOf(file.Name) > -1) || ! (ContainsCVS(dirInfo.Name) && Repository.FILE_NAME.IndexOf(file.Name) > -1)) { return true; ! } } return false; *************** *** 297,312 **** fullPath.ToUpper().Substring (startOfCvs - 1, CVS.Length + 2); - if (LOGGER.IsDebugEnabled) { - StringBuilder msg = new StringBuilder(); - msg.Append("fullPath=[").Append(fullPath).Append("]"); - msg.Append("cvsString=[").Append(cvsString).Append("]"); - LOGGER.Debug(msg); - } if (cvsString.Equals( Path.DirectorySeparatorChar + CVS + Path.DirectorySeparatorChar)) { return true; } ! } catch (ArgumentOutOfRangeException e) { ! LOGGER.Debug(e); return true; } --- 284,292 ---- fullPath.ToUpper().Substring (startOfCvs - 1, CVS.Length + 2); if (cvsString.Equals( Path.DirectorySeparatorChar + CVS + Path.DirectorySeparatorChar)) { return true; } ! } catch (ArgumentOutOfRangeException) { return true; } *************** *** 315,318 **** --- 295,357 ---- } + /// <summary> + /// Checks the end of a path string, if the path ends in CVS it does nothing, + /// otherwise it appends CVS to the full path. + /// </summary> + /// <param name="fullPath">Full path to a file/ directory that may or may + /// not end with CVS.</param> + /// <returns>The full path with a CVS appended.</returns> + public static FileSystemInfo AppendCvs(FileSystemInfo fs) { + if (fs.FullName.EndsWith(string.Format("{0}{1}{2}", Path.DirectorySeparatorChar, CVS, Path.DirectorySeparatorChar)) || + fs.FullName.EndsWith(string.Format("{0}{1}", Path.DirectorySeparatorChar, CVS)) || + PathTranslator.IsCvsDir(fs.FullName)) { + LOGGER.Warn(string.Format("Already ends with cvs directory: {0}", + fs.FullName)); + return fs; + } + + if (fs.GetType() == typeof(DirectoryInfo)) { + return new DirectoryInfo(Path.Combine(fs.FullName, CVS)); + } else { + return new FileInfo(Path.Combine(fs.FullName, CVS)); + } + } + + public static FileSystemInfo AppendCvs(string fs) { + FileSystemInfo _fs; + if (File.Exists(fs) || + IsControlFile(fs)) { + _fs = new FileInfo(fs); + } else { + _fs = new DirectoryInfo(fs); + } + + return AppendCvs(_fs); + } + + /// <summary> + /// Append the cvs directory to the file full path, then append the cvs management + /// file to the full path. + /// </summary> + /// <param name="fullPath">Full path that may or may not contain a CVS + /// directory.</param> + /// <param name="managingFile">Name of the managing file, should correspond + /// to a type in <see cref="ICSharpCode.SharpCvsLib.FileSystem.Manager.FileType"/></param> + /// <returns></returns> + public static string AppendCvs(string fullPath, string managingFile) { + return Path.Combine(AppendCvs(fullPath).FullName, managingFile); + } + + private static bool IsControlFile (string fs) { + FileInfo fileInfo = new FileInfo(fs); + + foreach (string file in System.Enum.GetNames(typeof(Factory.FileType))) { + if (fileInfo.Name == file) { + return true; + } + } + return false; + } + } } Index: Tag.cs =================================================================== RCS file: /cvsroot/sharpcvslib/sharpcvslib/src/ICSharpCode/SharpCvsLib/FileSystem/Tag.cs,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** Tag.cs 11 Dec 2003 16:36:25 -0000 1.6 --- Tag.cs 28 Oct 2004 06:42:22 -0000 1.7 *************** *** 63,67 **** /// The name of the cvs file that the object represents. /// </summary> ! public String Filename { get {return Tag.FILE_NAME;} } --- 63,67 ---- /// The name of the cvs file that the object represents. /// </summary> ! public override String Filename { get {return Tag.FILE_NAME;} } *************** *** 72,77 **** /// <param name="fullPath">The full path to the object being managed.</param> /// <param name="fileContents">The contents of the cvs management file.</param> ! public Tag (String fullPath, String fileContents) : ! base (fullPath, fileContents) { } --- 72,82 ---- /// <param name="fullPath">The full path to the object being managed.</param> /// <param name="fileContents">The contents of the cvs management file.</param> ! public Tag (FileInfo cvsFile, String fileContents) : ! base (cvsFile, fileContents) { ! } ! ! public Tag (string fullPath, string fileContents) : ! this(new FileInfo(System.IO.Path.Combine(fullPath, "CVS")), fileContents) { ! } Index: Manager.cs =================================================================== RCS file: /cvsroot/sharpcvslib/sharpcvslib/src/ICSharpCode/SharpCvsLib/FileSystem/Manager.cs,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** Manager.cs 14 Mar 2004 07:36:08 -0000 1.28 --- Manager.cs 28 Oct 2004 06:42:21 -0000 1.29 *************** *** 47,54 **** /// <summary> /// Manages the addition and creation of cvs files such as ! /// - Entries ! /// - Repository ! /// - Root ! /// - Tag /// </summary> // TODO: Change to internalize helpers (accessor) --- 47,56 ---- /// <summary> [...1178 lines suppressed...] + + private void Touch (FileInfo cvsFile) { + if (cvsFile.FullName.EndsWith(string.Format("{0}CVS{0}CVS", + Path.DirectorySeparatorChar))) { + throw new Exception("Don't do that."); + } + DirectoryInfo dir = cvsFile.Directory; + if (!dir.Exists) { + dir.Create(); + } + using (FileStream fs = System.IO.File.Create(cvsFile.FullName)) { + fs.Close(); + } + } + + private void Touch (ICvsFile cvsFile) { + this.Touch(cvsFile.CvsFile); + } } } Index: AbstractCvsFile.cs =================================================================== RCS file: /cvsroot/sharpcvslib/sharpcvslib/src/ICSharpCode/SharpCvsLib/FileSystem/AbstractCvsFile.cs,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** AbstractCvsFile.cs 11 Dec 2003 16:36:24 -0000 1.3 --- AbstractCvsFile.cs 28 Oct 2004 06:42:21 -0000 1.4 *************** *** 32,35 **** --- 32,36 ---- using System; + using System.IO; using log4net; *************** *** 43,50 **** public abstract class AbstractCvsFile { private readonly ILog LOGGER = LogManager.GetLogger(typeof (AbstractCvsFile)); ! private String fullPath; private String fileContents; private String localCvsFullPath; /// <summary> /// Return the path to the file that this cvs object is controlling. In --- 44,60 ---- public abstract class AbstractCvsFile { private readonly ILog LOGGER = LogManager.GetLogger(typeof (AbstractCvsFile)); ! private String _fullPath; private String fileContents; private String localCvsFullPath; + private FileInfo cvsFile; + + /// <summary> + /// Return a key that uniquely identifies this cvs file. + /// </summary> + public virtual string Key { + get {return this.FullPath;} + } + /// <summary> /// Return the path to the file that this cvs object is controlling. In *************** *** 53,61 **** /// stripped from the full path. /// </summary> ! public String Path { get { ! String tempPath = this.fullPath; ! if (this.fullPath.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString())) { ! tempPath = this.fullPath.Substring(0, this.fullPath.Length - 1); } tempPath = System.IO.Path.GetDirectoryName(tempPath); --- 63,71 ---- /// stripped from the full path. /// </summary> ! public virtual String Path { get { ! String tempPath = this.FullPath; ! if (this.FullPath.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString())) { ! tempPath = this.FullPath.Substring(0, this.FullPath.Length - 1); } tempPath = System.IO.Path.GetDirectoryName(tempPath); *************** *** 88,94 **** /// The full path to the file or directory that this object is managing. /// </summary> ! public String FullPath { ! get {return this.fullPath;} ! set {this.fullPath = value;} } --- 98,112 ---- /// The full path to the file or directory that this object is managing. /// </summary> ! public virtual String FullPath { ! get {return this.cvsFile.Directory.FullName;} ! set {this._fullPath = value;} ! } ! ! /// <summary> ! /// The full path to the file as a <see cref="FileInfo"/> object. ! /// </summary> ! public FileInfo CvsFile { ! get {return this.cvsFile;} ! set {this.cvsFile = value;} } *************** *** 102,105 **** --- 120,125 ---- } + public abstract string Filename {get;} + /// <summary> /// Create a new object that represents the management file that CVS *************** *** 112,136 **** /// to be written to the cvs management file, or is written in the /// cvs management file.</param> ! public AbstractCvsFile(String fullPath, String fileContents) { ! if (PathTranslator.ContainsCVS(fullPath)) { ! // attempt recovery if this file contains a cvs folder. ! fullPath = System.IO.Path.GetDirectoryName(fullPath); ! if (PathTranslator.ContainsCVS(fullPath)) { ! throw new Exception("Path information should not contain cvs folder."); ! } ! } this.fileContents = fileContents; - this.fullPath = fullPath; ! this.Parse(fileContents); ! //this.DeriveCvsFullPath(); ! if (LOGGER.IsDebugEnabled) { ! LOGGER.Debug("Created new entry=[" + this + "]"); ! if (this.ToString().ToUpper().IndexOf("C:") > 0) { ! LOGGER.Debug("Should not have an entry formatted like this, should just contain relative paths."); ! LOGGER.Debug("Stack trace=[" + Environment.StackTrace + "]"); ! } ! } } --- 132,141 ---- /// to be written to the cvs management file, or is written in the /// cvs management file.</param> ! public AbstractCvsFile(FileInfo cvsFile, String fileContents) { this.fileContents = fileContents; ! this.cvsFile = cvsFile; ! this.Parse(fileContents); } Index: Repository.cs =================================================================== RCS file: /cvsroot/sharpcvslib/sharpcvslib/src/ICSharpCode/SharpCvsLib/FileSystem/Repository.cs,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** Repository.cs 13 Dec 2003 05:49:56 -0000 1.10 --- Repository.cs 28 Oct 2004 06:42:22 -0000 1.11 *************** *** 65,69 **** /// <param name="path">The path to the directory above the CVS directory.</param> /// <param name="line">The line to enter into the repository file.</param> ! public Repository (String path, String line) : base (path, line) { } --- 65,85 ---- /// <param name="path">The path to the directory above the CVS directory.</param> /// <param name="line">The line to enter into the repository file.</param> ! public Repository (FileInfo cvsFile, String line) : base (cvsFile, line) { ! } ! ! /// <summary> ! /// Create a new repository object taking the path to the ! /// folder above the CVS directory and the line to enter ! /// into the repository file. ! /// ! /// The repository file stores the relative path to the directory ! /// from the server's perspective. ! /// </summary> ! /// <param name="path">The path to the directory above the CVS directory.</param> ! /// <param name="line">The line to enter into the repository file.</param> ! [Obsolete ("Use constructor Repository(FileInfo string)")] ! public Repository (string filePath, string line) : ! this (new FileInfo(System.IO.Path.Combine(filePath, "CVS")), line) { ! } *************** *** 72,76 **** /// for a cvs repository. /// </summary> ! public String Filename { get {return Repository.FILE_NAME;} } --- 88,92 ---- /// for a cvs repository. /// </summary> ! public override String Filename { get {return Repository.FILE_NAME;} } Index: Root.cs =================================================================== RCS file: /cvsroot/sharpcvslib/sharpcvslib/src/ICSharpCode/SharpCvsLib/FileSystem/Root.cs,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** Root.cs 11 Dec 2003 16:36:25 -0000 1.9 --- Root.cs 28 Oct 2004 06:42:22 -0000 1.10 *************** *** 63,67 **** /// The name of the cvs file that the object represents. /// </summary> ! public String Filename { get {return Root.FILE_NAME;} } --- 63,67 ---- /// The name of the cvs file that the object represents. /// </summary> ! public override String Filename { get {return Root.FILE_NAME;} } *************** *** 72,77 **** /// <param name="fullPath">The full path to the object being managed.</param> /// <param name="fileContents">The contents of the cvs management file.</param> ! public Root (String fullPath, String fileContents) : ! base (fullPath, fileContents) { } --- 72,82 ---- /// <param name="fullPath">The full path to the object being managed.</param> /// <param name="fileContents">The contents of the cvs management file.</param> ! public Root (FileInfo cvsFile, String fileContents) : ! base (cvsFile, fileContents) { ! } ! ! public Root (string cvsPath, string fileContents) : ! this (new FileInfo(cvsPath), fileContents) { ! } Index: Entry.cs =================================================================== RCS file: /cvsroot/sharpcvslib/sharpcvslib/src/ICSharpCode/SharpCvsLib/FileSystem/Entry.cs,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** Entry.cs 16 Dec 2003 07:44:54 -0000 1.18 --- Entry.cs 28 Oct 2004 06:42:21 -0000 1.19 *************** *** 73,76 **** --- 73,102 ---- private bool isUtcTimeStamp= true; + private string key; + /// <summary> + /// Get a key that represents this cvs entry. + /// </summary> + public override string Key { + get { + if (null == key) { + this.key = System.IO.Path.Combine( + System.IO.Path.GetDirectoryName(this.FullPath), this.Name); + } + return this.key; + } + } + + /// <summary> + /// The full path to the file or directory that this object is managing. + /// </summary> + public virtual String FullPath { + get { + string fullPath = System.IO.Path.Combine( + System.IO.Path.GetDirectoryName( + this.CvsFile.Directory.FullName), this.Name); + return fullPath; + } + set {base.FullPath = value;} + } /// <summary> *************** *** 82,86 **** /// The name of the file to write to. /// </summary> ! public String Filename { get {return Entry.FILE_NAME;} } --- 108,112 ---- /// The name of the file to write to. /// </summary> ! public override String Filename { get {return Entry.FILE_NAME;} } *************** *** 236,301 **** /// <summary> ! /// Create a new instance of the cvs object. ! /// ! /// NOTE: Derive full path is assumed. What this means is it is assumed ! /// that you are passing in the path to the file and would like to use ! /// the fileContents or entry to get the full path to the managed file. /// </summary> ! /// <param name="path">The path to the directory above the object being /// managed. The information in the fileContents parameter is used /// to fill in the "missing" information about the file location.</param> /// <param name="fileContents">The contents of the cvs management file.</param> ! public Entry (String path, String fileContents) : this (path, fileContents, true) { } /// <summary> ! /// Create a new Cvs entry. If the deriveFullPath is set to false then the ! /// path information specified in the constructor is taken as the ! /// entire path to the file. /// </summary> ! /// <param name="path">Either the path to the directory above the CVS directory, ! /// or if the deriveFullPath is set to true then this is the full path ! /// to the file under cvs control.</param> ! /// <param name="fileContents">A line that represents this particular entry ! /// under cvs control.</param> ! /// <param name="deriveFullPath"><code>true</code> if the full path should ! /// be derived from combining the path information and the file name ! /// parsed from the fileContents or if the path information passed ! /// in represents the full path to the file.</param> ! public Entry (String path, String fileContents, bool deriveFullPath) : base(path, fileContents) { ! if (PathTranslator.ContainsCVS(path)) { ! // attempt recovery if this file contains a cvs folder. ! path = System.IO.Path.GetDirectoryName(path); ! if (PathTranslator.ContainsCVS(path)) { ! throw new EntryParseException("Path information should not contain cvs folder."); ! } ! } ! this.Parse(fileContents); ! LOGGER.Debug("path=[" + path + "]"); ! LOGGER.Debug("name=[" + this.Name + "]"); ! if (deriveFullPath) { ! this.FullPath = System.IO.Path.Combine(path, this.Name); ! if (this.isDir) { ! this.FullPath = this.FullPath + System.IO.Path.DirectorySeparatorChar; ! } ! } else { ! this.FullPath = path; ! } ! if (this.FullPath.IndexOf("\\src\\src") >= 0) { ! throw new Exception("What is going on? Path repeat index=[" + path.IndexOf(this.Name) + "]"); ! } ! if (LOGGER.IsDebugEnabled) { ! StringBuilder msg = new StringBuilder(); ! msg.Append("Created new entry=[").Append(this).Append("]"); ! msg.Append("path=[").Append(path).Append("]"); ! msg.Append("entry.FullPath=[").Append(this.FullPath).Append("]"); ! LOGGER.Debug(msg); ! if (this.ToString().ToUpper().IndexOf("C:") > 0) { ! LOGGER.Debug("Should not have an entry formatted like this, should just contain relative paths."); ! LOGGER.Debug("Stack trace=[" + Environment.StackTrace + "]"); ! } ! } } --- 262,335 ---- /// <summary> ! /// Create a new instance of the cvs object. The file that is passed in should ! /// be the cvs file that will contain the file contents. /// </summary> ! /// <param name="cvsFile">The path to the directory above the object being /// managed. The information in the fileContents parameter is used /// to fill in the "missing" information about the file location.</param> /// <param name="fileContents">The contents of the cvs management file.</param> ! /// <example> ! /// <list type="table"> ! /// <term>cvsFile</term> ! /// <description>C:\dev\src\sharpcvslib\sharpcvslib\src\ICSharpCode\SharpCvsLib\FileSystem\CVS\Entries</description> ! /// <term>fileContents</term> ! /// <description></description> ! /// </list> ! /// </example> ! public Entry (FileInfo cvsFile, String fileContents) : base (cvsFile, fileContents) { } /// <summary> ! /// Create a new instance of the cvs management object. The file that is passed ! /// in should be the path <warn>ABOVE</warn> the object being managed. /// </summary> ! /// <param name="cvsPath">The full path of the cvs management file.</param> ! /// <param name="fileContents">Contents of the cvs management file or line item.</param> ! /// <example> ! /// <list type="table"> ! /// <term>cvsPath</term> ! /// <description>C:\dev\src\sharpcvslib\sharpcvslib\src\ICSharpCode\SharpCvsLib\FileSystem</description> ! /// <term>fileContents</term> ! /// <description>/Entry.cs/1.18/Tue Dec 16 07:44:54 2003//</description> ! /// </list> ! /// </example> ! [Obsolete ("Use 'Entry (FileInfo, string)' instead.")] ! public Entry (string cvsPath, string fileContents) : ! base (new FileInfo(System.IO.Path.Combine(cvsPath, "CVS")), fileContents) { ! ! } ! /// <summary> ! /// Creates an <see cref="Entry"/> object that manages the file being passed in. ! /// </summary> ! /// <param name="managedFile">The file that is under cvs control.</returns> ! /// <exception cref="EntryParseException">If the entry file cannot be ! /// parsed.</exception> ! /// <example> ! /// <list type="table"> ! /// <term>managedFile</term> ! /// <description>A full path to a file being managed such as: ! /// <br /> ! /// <code>C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\sharpcvslib-tests\sharpcvslib-test-repository\someFile.txt</code> ! /// would create a Entries line like: ! /// <code>/someText.txt////</code> ! /// </description> ! /// </list> ! /// <warn>If a directory is being managed use the <see cref="DirectoryInfo"/> ! /// object.</warn> ! /// </example> ! public static Entry CreateEntry (FileInfo managedFile) { ! DirectoryInfo cvsDir = new DirectoryInfo( ! System.IO.Path.Combine(managedFile.Directory.FullName, "CVS")); ! FileInfo cvsFile = new FileInfo( ! System.IO.Path.Combine(cvsDir.FullName, Entry.FILE_NAME)); ! ! StringBuilder entryString = new StringBuilder(); ! entryString.Append("/").Append(managedFile.Name); ! entryString.Append("/0///"); ! ! Entry entry = new Entry(cvsFile, entryString.ToString()); ! return entry; } *************** *** 333,369 **** /// </p> /// </example> ! public static Entry CreateEntry (String fullPath) { ! String path; ! String fileName; ! if (PathTranslator.ContainsCVS(fullPath)) { ! throw new EntryParseException("Unable to create an entry for CVS files."); } ! StringBuilder entryString = new StringBuilder(); ! // Sample directory entry: D/conf//// ! if (Directory.Exists(fullPath) || ! fullPath.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString()) || ! fullPath.EndsWith("/")) { ! entryString.Append("D"); ! if (fullPath.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString()) || ! fullPath.EndsWith("/")) { ! // strip the slash off so the filename is derived correctly ! fullPath = fullPath.Substring(0, fullPath.Length - 1); ! } ! } ! path = System.IO.Path.GetDirectoryName(fullPath); ! fileName = System.IO.Path.GetFileName(fullPath); ! entryString.Append("/").Append(System.IO.Path.GetFileName(fileName)); ! entryString.Append("/0///"); ! LOGGER.Debug("entryString=[" + entryString.ToString() + "]"); ! Entry entry = new Entry(path, ! entryString.ToString()); ! LOGGER.Debug("Created entry=[" + entry + "]"); ! LOGGER.Debug("entry.Path=[" + entry.Path + "]"); ! LOGGER.Debug("entry.FullPath=[" + entry.FullPath + "]"); ! LOGGER.Debug("fullPath=[" + fullPath + "]"); return entry; } --- 367,410 ---- /// </p> /// </example> ! public static Entry CreateEntry (string fullPath) { ! if (fullPath.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString())) { ! return CreateEntry(new DirectoryInfo(fullPath)); ! } else { ! return CreateEntry(new FileInfo(fullPath)); } ! } ! /// <summary> ! /// Creates an <see cref="Entry"/> object that manages the file being passed in. ! /// </summary> ! /// <param name="managedDir">The directory that is under cvs control.</returns> ! /// <exception cref="EntryParseException">If the entry file cannot be ! /// parsed.</exception> ! /// <example> ! /// <list type="table"> ! /// <term>managedDir</term> ! /// <description>The full path to a directory being managed by CVS such as: ! /// <br /> ! /// <code>C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\sharpcvslib-tests\sharpcvslib-test-repository\someFile.txt</code> ! /// would create a Entries line like: ! /// <code>/someText.txt////</code> ! /// </description> ! /// </list> ! /// <warn>If a directory is being managed use the <see cref="DirectoryInfo"/> ! /// object.</warn> ! /// </example> ! public static Entry CreateEntry (DirectoryInfo managedDir) { ! DirectoryInfo cvsDir = new DirectoryInfo( ! System.IO.Path.Combine(System.IO.Path.GetDirectoryName(managedDir.FullName), "CVS")); ! FileInfo cvsFile = new FileInfo( ! System.IO.Path.Combine(cvsDir.FullName, Entry.FILE_NAME)); ! StringBuilder entryString = new StringBuilder(); ! entryString.Append("D"); ! entryString.Append("/").Append(managedDir.Name); ! entryString.Append("/0///"); + Entry entry = new Entry(cvsFile, entryString.ToString()); return entry; } *************** *** 450,454 **** /// <returns>The name of the entry in the cvs file.</returns> public static String ParseFileName (String line) { ! Entry entry = new Entry(System.IO.Path.GetTempPath(), line); return entry.Filename; } --- 491,495 ---- /// <returns>The name of the entry in the cvs file.</returns> public static String ParseFileName (String line) { ! Entry entry = new Entry(new FileInfo(System.IO.Path.GetTempPath()), line); return entry.Filename; } Index: ICvsFile.cs =================================================================== RCS file: /cvsroot/sharpcvslib/sharpcvslib/src/ICSharpCode/SharpCvsLib/FileSystem/ICvsFile.cs,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** ICvsFile.cs 11 Dec 2003 16:36:24 -0000 1.8 --- ICvsFile.cs 28 Oct 2004 06:42:21 -0000 1.9 *************** *** 54,78 **** String Filename {get;} - /* - /// <summary> - /// The full path to the cvs management file. In the case of a Root or - /// Repository file this is the path below the directory being managed. - /// In the case of Entries files this can be in the path below if - /// the entry being managed is a file, or in the Entries file above - /// if the file being managed is a directory. - /// </summary> - /// <example> - /// <p>For a Repository file managing the sharpcvslib module folder in - /// the following path: - /// <code>c:/dev/src/sharpcvslib/</code> - /// the Repository file would go in the sub directory or: - /// <code>c:/dev/src/sharpcvslib/CVS/Repository</code> - /// </p> - /// <p>In the case of an Entries file the cvs management folder can - /// appear in one of two places depending on whether the Entry is - /// a directory or a file.</p> - /// </example> - //String CvsFullPath {get;} - */ /// <summary> /// Get the path to the directory above the cvs file. In most cases --- 54,57 ---- *************** *** 82,85 **** --- 61,65 ---- /// </summary> String Path {get;} + /// <summary> /// The full path to the file that the file that this CVS object is managing. *************** *** 90,93 **** --- 70,78 ---- /// <summary> + /// The full path to the file as a <see cref="FileInfo"/> object. + /// </summary> + FileInfo CvsFile {get;} + + /// <summary> /// The contents that are going to be written to the file. /// </summary> *************** *** 110,113 **** --- 95,105 ---- /// <param name="line">The line entry to parse.</param> void Parse (String line); + + /// <summary> + /// A unique key that identifies the cvs file. In most cases this is the path + /// information, except for the entries file. In the case of the entries file + /// this equals the file that the entry represents. + /// </summary> + string Key {get;} } } |