Author: sisbell Date: Mon Feb 19 16:50:39 2007 New Revision: 509398 URL: http://svn.apache.org/viewvc?view=rev&rev=509398 Log: FEATURE: Now handles dynamically adding dependencies to the csproj file by parsing the cs class files and extracting dependencies.
Modified: incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/pom.xml incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/NMavenContextImpl.cs Modified: incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/pom.xml URL: http://svn.apache.org/viewvc/incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/pom.xml?view=diff&rev=509398&r1=509397&r2=509398 ============================================================================== --- incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/pom.xml (original) +++ incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/pom.xml Mon Feb 19 16:50:39 2007 @@ -1,4 +1,4 @@ -<project> +<project xmlns="http://maven.apache.org/POM/4.0.0">> <modelVersion>4.0.0</modelVersion> <groupId>NMaven.Core</groupId> <artifactId>NMaven.Core</artifactId> Modified: incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/NMavenContextImpl.cs URL: http://svn.apache.org/viewvc/incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/NMavenContextImpl.cs?view=diff&rev=509398&r1=509397&r2=509398 ============================================================================== --- incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/NMavenContextImpl.cs (original) +++ incubator/nmaven/branches/SI_IDE/assemblies/NMaven.Core/src/main/csharp/Core/Impl/NMavenContextImpl.cs Mon Feb 19 16:50:39 2007 @@ -4,6 +4,8 @@ using NMaven.Model; using NMaven.Core; using Microsoft.Build.BuildEngine; +using System.Collections.Generic; +using System.Reflection; namespace NMaven.Core.Impl { @@ -33,11 +35,13 @@ DirectoryInfo sourcedir = new DirectoryInfo(basedir + @"src\main\csharp"); DirectoryInfo[] directoryInfos = rootDirectoryInfo.GetDirectories(); if(directoryInfos != null && directoryInfos.Length > 0) - { + { if(folderGroup == null) folderGroup = project.AddNewItemGroup(); foreach(DirectoryInfo di in directoryInfos) { + if(di.FullName.Contains(".svn") || di.FullName.Contains(@"obj") || di.FullName.Contains(@"bin")) + continue; folderGroup.AddNewItem("Folder", di.FullName.Substring(sourcedir.FullName.Length + 1)); addFoldersToProject(project, folderGroup, di); } @@ -54,6 +58,8 @@ foreach(DirectoryInfo di in directoryInfos) { + if(di.FullName.Contains(".svn") || di.FullName.Contains("obj") || di.FullName.Contains("bin")) + continue; foreach(FileInfo fileInfo in di.GetFiles()) { BuildItem buildItem = @@ -66,6 +72,59 @@ } } + private void addProjectDependencies(Project project, NMaven.Model.Model model, DirectoryInfo rootDirectoryInfo) + { + + BuildItemGroup group = project.AddNewItemGroup(); + group.AddNewItem("Reference", "System.Xml"); + + foreach(Dependency dependency in model.dependencies) { + String repoPath = @localRepository + dependency.groupId.Replace(".", "\\") + + "\\" + dependency.artifactId + "\\" + dependency.version + "\\" + dependency.artifactId + ".dll"; + BuildItem buildItem = group.AddNewItem("Reference", dependency.artifactId); + if(!dependency.GetType().Equals("gac")) buildItem.SetMetadata("HintPath", repoPath, true); + } + + DirectoryInfo sourcedir = new DirectoryInfo(basedir + @"src\main\csharp"); + DirectoryInfo[] directoryInfos = rootDirectoryInfo.GetDirectories(); + + ClassParser classParser = new ClassParser(); + List<FileInfo> fileInfos = new List<FileInfo>(); + addFileInfosFromSourceDirectories(rootDirectoryInfo, fileInfos); + List<string> dependencies = classParser.getDependencies(fileInfos); + foreach(string dependency in dependencies) + { + try { + DirectoryInfo fileInfo = new DirectoryInfo(@"C:\WINDOWS\assembly\GAC_MSIL\" + dependency); + if(fileInfo.Exists) { + group.AddNewItem("Reference", dependency); + } else + Console.WriteLine("FNE: " + fileInfo.FullName); + } + catch(Exception e) + { + Console.WriteLine(e.Message); + } + + } + } + + + private void addFileInfosFromSourceDirectories(DirectoryInfo rootDirectoryInfo, List<FileInfo> fileInfos ) + { + DirectoryInfo[] directoryInfos = rootDirectoryInfo.GetDirectories(); + if(directoryInfos != null && directoryInfos.Length > 0) + { + foreach(DirectoryInfo di in directoryInfos) + { + if(di.FullName.Contains(".svn") || di.FullName.Contains("obj") || di.FullName.Contains("bin")) + continue; + fileInfos.AddRange(di.GetFiles()); + addFileInfosFromSourceDirectories(di, fileInfos); + } + } + } + private string getOutputType(String type) { if (type.Equals("library")) return "Library"; @@ -94,18 +153,11 @@ project.AddNewImport(@"$(MSBuildBinPath)\Microsoft.CSharp.Targets", null); - DirectoryInfo rootDirectoryInfo = new DirectoryInfo(basedir + @"src\main\csharp"); + DirectoryInfo rootDirectoryInfo = new DirectoryInfo(basedir + @"src\main\csharp"); + addProjectDependencies(project, model, rootDirectoryInfo); addFoldersToProject(project, null, rootDirectoryInfo); addClassFilesToProject(project, null, rootDirectoryInfo); - - BuildItemGroup group = project.AddNewItemGroup(); - foreach(Dependency dependency in model.dependencies) { - String repoPath = @localRepository + dependency.groupId.Replace(".", "\\") - + "\\" + dependency.artifactId + "\\" + dependency.version + "\\" + dependency.artifactId + ".dll"; - BuildItem buildItem = group.AddNewItem("Reference", dependency.artifactId); - if(!dependency.GetType().Equals("gac")) buildItem.SetMetadata("HintPath", repoPath, true); - } - + return project; } @@ -118,6 +170,39 @@ private class ClassParser { + public List<string> getDependencies(List<FileInfo> fileInfos) + { + List<string> dependencies = new List<string>(); + foreach(FileInfo fileInfo in fileInfos) + { + try + { + using (StreamReader sr = new StreamReader(fileInfo.FullName)) + { + String line; + while ((line = sr.ReadLine()) != null) + { + if (line.StartsWith("namespace")) break; + if (line.StartsWith("//")) continue; + if (line.StartsWith("using")) { + string[] tokens = line.Remove(line.Length - 1).Split(new char[1]{' '}); + if(!dependencies.Contains(tokens[1])) + { + dependencies.Add(tokens[1]); + } + } + } + } + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + + } + + return dependencies; + } } }