/// <summary> /// Repairs the provided project. /// </summary> /// <param name="projectResult"></param> void Repair(ScriptProjectAnalysisResult projectResult) { RepairBadReferences(projectResult); RepairWhitelist(projectResult); RepairOptions(projectResult); projectResult.ProjectDocument.Save(projectResult.ProjectInfo.FileName, SaveOptions.OmitDuplicateNamespaces); }
void RepairOptions(ScriptProjectAnalysisResult projectResult) { var projectFileInfo = new FileInfo(projectResult.ProjectInfo.FileName); var targetOptionsFileInfo = new FileInfo(Path.Combine(projectFileInfo.Directory.FullName, TargetOptionsSubPath)); var document = XDocument.Load(targetOptionsFileInfo.FullName); var attribute = document.Element("mdk")?.Attribute("version"); if (attribute != null) { attribute.Value = ProjectScriptInfo.TargetPackageVersion.ToString(); document.Save(targetOptionsFileInfo.FullName, SaveOptions.OmitDuplicateNamespaces); } }
void RepairWhitelist(ScriptProjectAnalysisResult projectResult) { var whitelist = projectResult.Whitelist; if (!whitelist.HasValidWhitelistFile) { var projectFileInfo = new FileInfo(projectResult.ProjectInfo.FileName); var targetWhitelistFileInfo = new FileInfo(Path.Combine(projectFileInfo.Directory.FullName, TargetWhitelistSubPath)); if (!targetWhitelistFileInfo.Directory.Exists) { targetWhitelistFileInfo.Directory.Create(); } File.Copy(whitelist.SourceWhitelistFilePath, targetWhitelistFileInfo.FullName, true); } if (!whitelist.HasValidWhitelistElement) { var projectElement = projectResult.ProjectDocument .Element($"{{{Xmlns}}}Project"); if (projectElement == null) { throw new InvalidOperationException("Bad MDK project"); } var badElements = projectElement .Elements($"{{{Xmlns}}}ItemGroup") .Elements() .Where(e => string.Equals((string)e.Attribute("Include"), TargetWhitelistSubPath, StringComparison.CurrentCultureIgnoreCase) || string.Equals((string)e.Element($"{{{Xmlns}}}Link"), TargetWhitelistSubPath, StringComparison.CurrentCultureIgnoreCase)) .ToArray(); foreach (var element in badElements) { element.Remove(); } var targetGroup = projectElement .Elements($"{{{Xmlns}}}ItemGroup") .Elements() .FirstOrDefault(e => string.Equals((string)e.Attribute("Include"), TargetOptionsSubPath, StringComparison.CurrentCultureIgnoreCase)) ?.Parent; if (targetGroup == null) { targetGroup = new XElement(XName.Get("ItemGroup", Xmlns)); projectElement.Add(targetGroup); } var itemElement = new XElement(XName.Get("AdditionalFiles", Xmlns), new XAttribute("Include", TargetWhitelistSubPath)); targetGroup.Add(itemElement); } }
static void RepairBadReferences(ScriptProjectAnalysisResult projectResult) { foreach (var badReference in projectResult.BadReferences) { switch (badReference.Type) { case BadReferenceType.File: badReference.Element.AddOrUpdateAttribute("Include", badReference.ExpectedPath); break; case BadReferenceType.Assembly: badReference.Element.AddOrUpdateElement(XName.Get("HintPath", Xmlns), badReference.ExpectedPath); break; default: throw new ArgumentOutOfRangeException(); } } }
/// <summary> /// Upgrades the provided project to the current package version. /// </summary> /// <param name="projectResult"></param> void Upgrade(ScriptProjectAnalysisResult projectResult) { foreach (var badReference in projectResult.BadReferences) { switch (badReference.Type) { case BadReferenceType.File: badReference.Element.AddOrUpdateAttribute("Include", badReference.ExpectedPath); break; case BadReferenceType.Assembly: badReference.Element.AddOrUpdateElement(XName.Get("HintPath", Xmlns), badReference.ExpectedPath); break; default: throw new ArgumentOutOfRangeException(); } } projectResult.ProjectDocument.Save(projectResult.ProjectInfo.FileName, SaveOptions.OmitDuplicateNamespaces); }
ScriptProjectAnalysisResult AnalyzeProject(Project project, ScriptUpgradeAnalysisOptions options) { if (!project.IsLoaded()) { return(ScriptProjectAnalysisResult.NotAScriptProject); } var projectInfo = MDKProjectProperties.Load(project.FullName, project.Name); if (!projectInfo.IsValid) { return(ScriptProjectAnalysisResult.NotAScriptProject); } if (projectInfo.Options.Version < new Version(1, 2)) { return(ScriptProjectAnalysisResult.For(project, projectInfo).AsLegacyProject()); } return(ScriptProjectAnalysisResult.For(project, projectInfo)); }