PageRenderTime 43ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/src/KProjectConverter/KProject.cs

https://github.com/desdesdes/KProjectConverter
C# | 114 lines | 94 code | 16 blank | 4 comment | 9 complexity | d8eaabcb57103e26473d26aa63fef280 MD5 | raw file
Possible License(s): Unlicense
  1. using Newtonsoft.Json.Linq;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Xml.Linq;
  7. namespace KProjectConverter
  8. {
  9. /// <summary>
  10. /// Summary description for KProject
  11. /// </summary>
  12. public class KProject
  13. {
  14. private static XNamespace _msbuildNs = XNamespace.Get("http://schemas.microsoft.com/developer/msbuild/2003");
  15. CSProject _project;
  16. ISet<string> _projectReferences;
  17. public KProject(CSProject project, ISet<string> projectReferences)
  18. {
  19. _project = project;
  20. _projectReferences = projectReferences;
  21. }
  22. private static void MakeBackup(string filePath)
  23. {
  24. if (File.Exists(filePath))
  25. {
  26. File.Move(filePath, string.Format("{0}.backup", filePath));
  27. }
  28. }
  29. public void DeleteOldProjectFiles()
  30. {
  31. File.Delete(_project.ProjectFilePath);
  32. File.Delete(string.Format("{0}.vspscc", _project.ProjectFilePath));
  33. }
  34. private static string GetProjectNameFromReference(string reference)
  35. {
  36. var pos = reference.IndexOf(',');
  37. if (pos == -1)
  38. {
  39. return reference;
  40. }
  41. return reference.Substring(0, pos);
  42. }
  43. public void BuildKproj()
  44. {
  45. var stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("embed/base.kproj");
  46. var kprojXml = XElement.Load(stream);
  47. var globalXml = kprojXml.Elements(_msbuildNs + "PropertyGroup").Single(e => e.Attribute("Label")?.Value?.Equals("Globals") == true);
  48. globalXml.Element(_msbuildNs + "ProjectGuid").Value = _project.Info.ProjectGuid.ToString("D");
  49. globalXml.Element(_msbuildNs + "RootNamespace").Value = _project.Info.RootNamespace;
  50. var kprojectFilePath = Path.ChangeExtension(_project.ProjectFilePath, "kproj");
  51. kprojXml.Save(kprojectFilePath);
  52. }
  53. public void BuildProjectJson(IEnumerable<KDependency> additionalDependencies)
  54. {
  55. var packageSet = new HashSet<string>();
  56. var generalDependencies = new List<JProperty>();
  57. foreach (var additionalDependency in additionalDependencies)
  58. {
  59. generalDependencies.Add(new JProperty(additionalDependency.Package, additionalDependency.Version));
  60. }
  61. foreach (var package in _project.Info.Packages)
  62. {
  63. generalDependencies.Add(new JProperty(package.Package, package.Version));
  64. packageSet.Add(package.Package);
  65. }
  66. var netDependencies = new List<JProperty>();
  67. foreach (var reference in _project.Info.References)
  68. {
  69. if (FrameworkReferenceResolver.IsFrameworkReference(reference))
  70. {
  71. if (!FrameworkReferenceResolver.IsStandardKReference(reference))
  72. {
  73. netDependencies.Add(new JProperty(FrameworkReferenceResolver.GetFrameworkReferenceCorrectCase(reference), ""));
  74. }
  75. }
  76. else
  77. {
  78. // Build project name from reference
  79. var projectName = GetProjectNameFromReference(reference);
  80. if (_projectReferences.Contains(projectName))
  81. {
  82. generalDependencies.Add(new JProperty(reference, "1.0.0-*"));
  83. }
  84. else if (!packageSet.Contains(projectName))
  85. {
  86. _project.Warnings.Add(string.Format("Possible resolvable reference to '{0}', check if this is part of a package", projectName));
  87. }
  88. }
  89. }
  90. var projectJson = new JObject();
  91. projectJson.Add(new JProperty("version", "1.0.0-*"));
  92. projectJson.Add(new JProperty("dependencies", new JObject(generalDependencies)));
  93. projectJson.Add(new JProperty("frameworks", new JObject(new JProperty("aspnet50", new JObject(new JProperty("frameworkAssemblies", new JObject(netDependencies)))))));
  94. var projectPath = Path.Combine(Path.GetDirectoryName(_project.ProjectFilePath), "project.json");
  95. File.WriteAllText(projectPath, projectJson.ToString());
  96. }
  97. }
  98. }