From 9047db2c874a457258a5e48d69521a2e1dab2213 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 10 Apr 2007 12:58:06 +0000 Subject: [PATCH] Automatically add new projects to version control if they are created in a directory under version control. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.1@2478 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Commands/AutostartCommands.cs | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/AddIns/Misc/SubversionAddIn/Project/Src/Commands/AutostartCommands.cs b/src/AddIns/Misc/SubversionAddIn/Project/Src/Commands/AutostartCommands.cs index 019de021f7..979d753bdb 100644 --- a/src/AddIns/Misc/SubversionAddIn/Project/Src/Commands/AutostartCommands.cs +++ b/src/AddIns/Misc/SubversionAddIn/Project/Src/Commands/AutostartCommands.cs @@ -7,6 +7,7 @@ using System; using System.IO; +using System.Text; using System.Windows.Forms; using ICSharpCode.Core; @@ -32,6 +33,8 @@ namespace ICSharpCode.Svn.Commands FileService.FileRenaming += FileRenaming; FileService.FileCreated += FileCreated; + ProjectService.ProjectAdded += ProjectAdded; + FileUtility.FileSaved += new FileNameEventHandler(FileSaved); AbstractProjectBrowserTreeNode.AfterNodeInitialize += TreeNodeInitialized; } @@ -44,6 +47,71 @@ namespace ICSharpCode.Svn.Commands node.AcceptVisitor(visitor, null); } + void ProjectAdded(object sender, ProjectEventArgs e) + { + if (!AddInOptions.AutomaticallyAddFiles) return; + if (!CanBeVersionControlledFile(e.Project.Directory)) return; + + string projectDir = Path.GetFullPath(e.Project.Directory); + try { + Status status = SvnClient.Instance.Client.SingleStatus(projectDir); + if (status.TextStatus != StatusKind.Unversioned) + return; + SvnClient.Instance.Client.Add(projectDir, Recurse.None); + if (FileUtility.IsBaseDirectory(Path.Combine(projectDir, "bin"), e.Project.OutputAssemblyFullPath)) { + AddToIgnoreList(projectDir, "bin"); + } + CompilableProject compilableProject = e.Project as CompilableProject; + if (compilableProject != null) { + if (FileUtility.IsBaseDirectory(Path.Combine(projectDir, "obj"), compilableProject.IntermediateOutputFullPath)) { + AddToIgnoreList(projectDir, "obj"); + } + } + foreach (ProjectItem item in e.Project.Items) { + FileProjectItem fileItem = item as FileProjectItem; + if (fileItem != null) { + if (FileUtility.IsBaseDirectory(projectDir, fileItem.FileName)) { + AddFileWithParentDirectoriesToSvn(fileItem.FileName); + } + } + } + AddFileWithParentDirectoriesToSvn(e.Project.FileName); + } catch (Exception ex) { + MessageService.ShowError("Project add exception: " + ex); + } + } + + void AddFileWithParentDirectoriesToSvn(string fileName) + { + if (!CanBeVersionControlledFile(fileName)) { + AddFileWithParentDirectoriesToSvn(FileUtility.GetAbsolutePath(fileName, "..")); + } + Status status = SvnClient.Instance.Client.SingleStatus(fileName); + if (status.TextStatus != StatusKind.Unversioned) + return; + SvnClient.Instance.Client.Add(fileName, Recurse.None); + } + + void AddToIgnoreList(string directory, string file) + { + PropertyDictionary pd = SvnClient.Instance.Client.PropGet("svn:ignore", directory, Revision.Working, Recurse.None); + StringBuilder b = new StringBuilder(); + foreach (Property p in pd.Values) { + using (StreamReader r = new StreamReader(new MemoryStream(p.Data))) { + string line; + while ((line = r.ReadLine()) != null) { + if (line.Length > 0) { + b.AppendLine(line); + } + } + } + break; + } + b.AppendLine(file); + SvnClient.Instance.Client.PropSet(new Property("svn:ignore", b.ToString()), + directory, Recurse.None); + } + internal static bool CanBeVersionControlledFile(string fileName) { return CanBeVersionControlledDirectory(Path.GetDirectoryName(fileName));