You are viewing a plain text version of this content. The canonical link for it is here.
Posted to npanday-commits@incubator.apache.org by br...@apache.org on 2013/08/12 13:07:42 UTC

svn commit: r1513126 - in /incubator/npanday/trunk/dotnet/assemblies: NPanday.ProjectImporter/Engine/ NPanday.ProjectImporter/Engine/src/main/csharp/ NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/ NPanday.Utils/src/main/csharp/

Author: brett
Date: Mon Aug 12 13:07:42 2013
New Revision: 1513126

URL: http://svn.apache.org/r1513126
Log:
[NPANDAY-579] Discover referenced assemblies

When generating dependencies, we need to also inspect the referenced
assemblies.  Currently, we look for those that exist in the same directory
as the assembly and add them to the POM if they exist, as well as to the
generated POM for the assembly copied to the local Maven repository.

Modified:
    incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/pom.xml
    incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs
    incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/NPanday.ProjectImporterEngine.csproj
    incubator/npanday/trunk/dotnet/assemblies/NPanday.Utils/src/main/csharp/RepositoryUtility.cs

Modified: incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/pom.xml
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/pom.xml?rev=1513126&r1=1513125&r2=1513126&view=diff
==============================================================================
--- incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/pom.xml (original)
+++ incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/pom.xml Mon Aug 12 13:07:42 2013
@@ -90,6 +90,12 @@
       <type>dotnet-library</type>  
     </dependency>
     <dependency> 
+      <groupId>Mono.Cecil</groupId>  
+      <artifactId>Mono.Cecil</artifactId>  
+      <version>0.9.5.4</version>  
+      <type>dotnet-library</type>  
+    </dependency>  
+    <dependency> 
       <groupId>NUnit</groupId>  
       <artifactId>NUnit.Framework</artifactId>  
       <version>2.2.8.0</version>  

Modified: incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs?rev=1513126&r1=1513125&r2=1513126&view=diff
==============================================================================
--- incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs (original)
+++ incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs Mon Aug 12 13:07:42 2013
@@ -30,6 +30,7 @@ using NPanday.ProjectImporter.Digest.Mod
 using NPanday.Utils;
 using Microsoft.Win32;
 using System.Text.RegularExpressions;
+using System.Reflection;
 
 /// Author: Leopoldo Lee Agdeppa III
 
@@ -918,7 +919,7 @@ namespace NPanday.ProjectImporter.Conver
 
                     if (warnNonPortable)
                     {
-                        WarnNonPortableReference(path, refDependency);
+                        WarnNonPortableReference(path, refDependency, GetReferencedAssemblies(path));
                     }
                     else
                     {
@@ -1108,7 +1109,7 @@ namespace NPanday.ProjectImporter.Conver
             return null;
         }
 
-        private void WarnNonPortableReference(string path, Dependency refDependency)
+        private void WarnNonPortableReference(string path, Dependency refDependency, List<Dependency> dependencies)
         {
             if (projectDigest.DependencySearchConfig.CopyToMaven)
             {
@@ -1118,6 +1119,16 @@ namespace NPanday.ProjectImporter.Conver
                 // reset the dependency
                 refDependency.scope = null;
                 refDependency.systemPath = null;
+
+                Model.Pom.Model dependencyModel = new Model.Pom.Model();
+                dependencyModel.modelVersion = "4.0.0";
+                dependencyModel.groupId = refDependency.groupId;
+                dependencyModel.artifactId = refDependency.artifactId;
+                dependencyModel.version = refDependency.version;
+                dependencyModel.packaging = "dotnet-library";
+                dependencyModel.dependencies = dependencies.ToArray();
+                string file = RepositoryUtility.GetArtifactPath(refDependency.groupId, refDependency.artifactId, refDependency.version, "pom");
+                PomHelperUtility.WriteModelToPom(new FileInfo(file), dependencyModel);
             }
             else
             {
@@ -1142,17 +1153,25 @@ namespace NPanday.ProjectImporter.Conver
 
         private Dependency ResolveDependencyFromHintPath(Reference reference)
         {
-            if (!string.IsNullOrEmpty(reference.HintFullPath) && new FileInfo(reference.HintFullPath).Exists)
+            return ResolveDependencyFromPath(reference.HintFullPath, reference.Name, reference.Version);
+        }
+
+        private Dependency ResolveDependencyFromPath(string hintFullPath, string name, string version)
+        {
+            if (!string.IsNullOrEmpty(hintFullPath) && new FileInfo(hintFullPath).Exists)
             {
                 string prjRefPath = Path.Combine(projectDigest.FullDirectoryName, ".references");
                 //verbose for new-import
-                if (!reference.HintFullPath.ToLower().StartsWith(prjRefPath.ToLower()) && !reference.Name.Contains("Interop"))
+                if (!hintFullPath.ToLower().StartsWith(prjRefPath.ToLower()) && !name.Contains("Interop"))
                 {
-                    Dependency refDependency = CreateDependencyFromSystemPath(reference, reference.HintFullPath);
+                    Dependency refDependency = CreateDependencyFromPartsAndSystemPath(name, version, hintFullPath);
+
+                    log.DebugFormat("Resolved {0} from hint path: {1}:{2}:{3}", name, refDependency.groupId, refDependency.artifactId, refDependency.version);
 
-                    WarnNonPortableReference(reference.HintFullPath, refDependency);
+                    // this will pick up some NuGet packaged references
+                    List<Dependency> dependencies = GetReferencedAssemblies(hintFullPath);
 
-                    log.DebugFormat("Resolved {0} from hint path: {1}:{2}:{3}", reference.Name, refDependency.groupId, refDependency.artifactId, refDependency.version);
+                    WarnNonPortableReference(hintFullPath, refDependency, dependencies);
 
                     return refDependency;
                 }
@@ -1162,21 +1181,21 @@ namespace NPanday.ProjectImporter.Conver
                     // TODO: not a very good parsing of .references - if we have .references, don't we already know it from local repo?
 
                     Dependency refDependency = new Dependency();
-                    refDependency.artifactId = reference.Name;
+                    refDependency.artifactId = name;
                    
                     //get version from the name above the last path
-                    string[] pathTokens = reference.HintFullPath.Split("\\\\".ToCharArray());
+                    string[] pathTokens = hintFullPath.Split("\\\\".ToCharArray());
                     if (pathTokens.Length < 3)
                     {
                         // should only hit this if it is in .references, and it was incorrectly constructed
-                        throw new Exception("Invalid hint path: " + reference.HintFullPath);
+                        throw new Exception("Invalid hint path: " + hintFullPath);
                     }
                     refDependency.groupId = pathTokens[pathTokens.Length - 3];
-                    refDependency.version = pathTokens[pathTokens.Length-2].Replace(reference.Name+"-","") ?? "1.0.0.0";                    
+                    refDependency.version = pathTokens[pathTokens.Length-2].Replace(name+"-","") ?? "1.0.0.0";                    
                     refDependency.type = "dotnet-library";
 
                     log.DebugFormat("Resolved {0} from previously resolved references: {1}:{2}:{3}", 
-                        reference.Name, refDependency.groupId, refDependency.artifactId, refDependency.version);
+                        name, refDependency.groupId, refDependency.artifactId, refDependency.version);
                     
                     return refDependency;
                 }
@@ -1184,12 +1203,41 @@ namespace NPanday.ProjectImporter.Conver
             return null;
         }
 
+        private List<Dependency> GetReferencedAssemblies(string path)
+        {
+            List<Dependency> dependencies = new List<Dependency>();
+
+            Mono.Cecil.AssemblyDefinition assembly = Mono.Cecil.AssemblyDefinition.ReadAssembly(path);
+
+            // resolve referenced assemblies in the same directory
+            foreach (Mono.Cecil.AssemblyNameReference assemblyName in assembly.MainModule.AssemblyReferences)
+            {
+                Dependency d = ResolveDependencyFromPath(Path.Combine(new FileInfo(path).DirectoryName, assemblyName.Name + ".dll"),
+                    assemblyName.Name,
+                    assemblyName.Version != null ? assemblyName.Version.ToString() : null);
+                if (d != null)
+                {
+                    dependencies.Add(d);
+
+                    // Add it to the POM as well, in case transitive dependency is not available later
+                    AddDependency(d);
+                }
+            }
+
+            return dependencies;
+        }
+
         private static Dependency CreateDependencyFromSystemPath(Reference reference, string path)
         {
+            return CreateDependencyFromPartsAndSystemPath(reference.Name, reference.Version, path);
+        }
+
+        private static Dependency CreateDependencyFromPartsAndSystemPath(string name, string version, string path)
+        {
             Dependency refDependency = new Dependency();
-            refDependency.artifactId = reference.Name;
-            refDependency.groupId = reference.Name;
-            refDependency.version = reference.Version ?? "1.0.0.0";
+            refDependency.artifactId = name;
+            refDependency.groupId = name;
+            refDependency.version = version ?? "1.0.0.0";
             refDependency.type = "dotnet-library";
             refDependency.scope = "system";
             refDependency.systemPath = path;

Modified: incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/NPanday.ProjectImporterEngine.csproj
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/NPanday.ProjectImporterEngine.csproj?rev=1513126&r1=1513125&r2=1513126&view=diff
==============================================================================
--- incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/NPanday.ProjectImporterEngine.csproj (original)
+++ incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/NPanday.ProjectImporterEngine.csproj Mon Aug 12 13:07:42 2013
@@ -39,6 +39,8 @@
     <Reference Include="Microsoft.Build.Framework" />
     <Reference Include="Microsoft.Build.Tasks" />
     <Reference Include="Microsoft.Build.Utilities" />
+    <Reference Include="Mono.Cecil">
+    </Reference>
     <Reference Include="NPanday.Model.Pom, Version=0.14.0.0, Culture=neutral, PublicKeyToken=4b435f4d76e2f0e6, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\..\..\..\NPanday.Model.Pom\target\NPanday.Model.Pom.dll</HintPath>
@@ -47,7 +49,6 @@
       <HintPath>..\..\..\..\..\NPanday.Model.Settings\target\NPanday.Model.Settings.dll</HintPath>
     </Reference>
     <Reference Include="NUnit.Framework">
-      <HintPath>C:\Documents and Settings\user\.m2\uac\gac_msil\NUnit.Framework\2.2.8.0__NUnit\NUnit.Framework.dll</HintPath>
     </Reference>
     <Reference Include="System" />
     <Reference Include="System.Data" />

Modified: incubator/npanday/trunk/dotnet/assemblies/NPanday.Utils/src/main/csharp/RepositoryUtility.cs
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/dotnet/assemblies/NPanday.Utils/src/main/csharp/RepositoryUtility.cs?rev=1513126&r1=1513125&r2=1513126&view=diff
==============================================================================
--- incubator/npanday/trunk/dotnet/assemblies/NPanday.Utils/src/main/csharp/RepositoryUtility.cs (original)
+++ incubator/npanday/trunk/dotnet/assemblies/NPanday.Utils/src/main/csharp/RepositoryUtility.cs Mon Aug 12 13:07:42 2013
@@ -36,22 +36,17 @@ namespace NPanday.Utils
         {
             try
             {
-                string m2Dir = Path.GetFullPath(string.Format("{0}\\..\\.m2", System.Environment.GetFolderPath(Environment.SpecialFolder.Personal)));
-                string artifactDir = Path.Combine(m2Dir, string.Format(@"repository\{0}\{1}\{2}", groupId.Replace('.','\\'), artifactId, version));
-                string artifactFilename = string.Format("{0}-{1}{2}", artifactId, version, Path.GetExtension(filename));
+                string path = GetArtifactPath(groupId, artifactId, version, Path.GetExtension(filename).Substring(1));
 
                 if (!File.Exists(filename))
                     throw new Exception("Cannot find Assembly to install.");
 
-                if (!Directory.Exists(artifactDir))
-                    Directory.CreateDirectory(artifactDir);
-
                 //if assembly already installed skip the copying
-                if (File.Exists(Path.Combine(artifactDir, artifactFilename)))
+                if (File.Exists(path))
                 {
                     if (overwrite)
                     {
-                        File.Delete(Path.Combine(artifactDir, artifactFilename));
+                        File.Delete(path);
                     }
                     else
                     {
@@ -59,8 +54,12 @@ namespace NPanday.Utils
                     }
                 }
 
+                string artifactDir = Path.GetDirectoryName(path);
+                if (!Directory.Exists(artifactDir))
+                    Directory.CreateDirectory(artifactDir);
+
                 //copy file
-                File.Copy(filename, Path.Combine(artifactDir, artifactFilename));
+                File.Copy(filename, path);
                 return true;
 
             }
@@ -69,5 +68,13 @@ namespace NPanday.Utils
                 throw;
             }
         }
+
+        public static string GetArtifactPath(string groupId, string artifactId, string version, string ext)
+        {
+            string m2Dir = Path.GetFullPath(string.Format("{0}\\..\\.m2", System.Environment.GetFolderPath(Environment.SpecialFolder.Personal)));
+            string artifactDir = Path.Combine(m2Dir, string.Format(@"repository\{0}\{1}\{2}", groupId.Replace('.', '\\'), artifactId, version));
+            string artifactFilename = string.Format("{0}-{1}.{2}", artifactId, version, ext);
+            return Path.Combine(artifactDir, artifactFilename);
+        }
     }
 }