Browse Source

Cli: Make Cli compatible with LeptonX packages

pull/13520/head
Yunus Emre Kalkan 4 years ago
parent
commit
de67b01444
  1. 110
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionPackageVersionFinder.cs
  2. 16
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs

110
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionPackageVersionFinder.cs

@ -1,5 +1,6 @@
using System.IO; using System.Collections.Generic;
using System.Text.RegularExpressions; using System.IO;
using System.Linq;
using System.Xml; using System.Xml;
using NuGet.Versioning; using NuGet.Versioning;
using Volo.Abp.Cli.Utils; using Volo.Abp.Cli.Utils;
@ -9,13 +10,13 @@ namespace Volo.Abp.Cli.ProjectModification;
public class SolutionPackageVersionFinder : ITransientDependency public class SolutionPackageVersionFinder : ITransientDependency
{ {
public string Find(string solutionFile, string packagePrefix = "Volo.Abp") public string Find(string solutionFile, string packagePrefix = "Volo.Abp", string excludedKeywords = "LeptonX")
{ {
var projectFilesUnderSrc = GetProjectFilesOfSolution(solutionFile); var projectFilesUnderSrc = GetProjectFilesOfSolution(solutionFile);
foreach (var projectFile in projectFilesUnderSrc) foreach (var projectFile in projectFilesUnderSrc)
{ {
var content = File.ReadAllText(projectFile); var content = File.ReadAllText(projectFile);
if (TryParseVersionFromCsprojViaXmlDocument(content, out var s, packagePrefix)) if (TryParseVersionFromCsprojViaXmlDocument(content, out var s, packagePrefix, excludedKeywords))
{ {
return s; return s;
} }
@ -24,14 +25,35 @@ public class SolutionPackageVersionFinder : ITransientDependency
return null; return null;
} }
private static bool TryParseVersionFromCsprojViaXmlDocument(string content, out string version, string packagePrefix) private static bool TryParseVersionFromCsprojViaXmlDocument(string content, out string version, string packagePrefix, string excludedKeywords)
{ {
var doc = new XmlDocument() { PreserveWhitespace = true }; var doc = new XmlDocument() { PreserveWhitespace = true };
using (var stream = StreamHelper.GenerateStreamFromString(content)) using (var stream = StreamHelper.GenerateStreamFromString(content))
{ {
doc.Load(stream); doc.Load(stream);
var nodes = doc.SelectNodes($"/Project/ItemGroup/PackageReference[starts-with(@Include, '{packagePrefix}')]"); var nodes = doc.SelectNodes($"/Project/ItemGroup/PackageReference[starts-with(@Include, '{packagePrefix}')]");
var value = nodes?[0]?.Attributes?["Version"]?.Value;
var targetNodes = new List<XmlNode>();
foreach (XmlNode node in nodes!)
{
var packageId = node!.Attributes["Include"]?.Value;
if (excludedKeywords.Split(',').Any(ek => packageId!.Contains(ek)))
{
continue;
}
targetNodes.Add(node);
}
if (!targetNodes.Any())
{
version = null;
return false;
}
var value = targetNodes.First().Attributes?["Version"]?.Value;
if (value == null) if (value == null)
{ {
version = null; version = null;
@ -43,40 +65,17 @@ public class SolutionPackageVersionFinder : ITransientDependency
} }
} }
public static bool TryParseVersionFromCsprojFile(string csprojContent, out string version, string packagePrefix = "Volo.Abp") public static bool TryParseVersionFromCsprojFile(string csprojContent, out string version, string packagePrefix = "Volo.Abp", string excludedKeywords = "LeptonX")
{ {
try return TryParseVersionFromCsprojViaXmlDocument(csprojContent, out version, packagePrefix, excludedKeywords);
{
var matches = Regex.Matches(csprojContent,
@"PackageReference\s*Include\s*=\s*\""" + packagePrefix + @"(.*?)\""\s*Version\s*=\s*\""(.*?)\""",
RegexOptions.IgnoreCase |
RegexOptions.IgnorePatternWhitespace |
RegexOptions.Singleline | RegexOptions.Multiline);
foreach (Match match in matches)
{
if (match.Groups.Count > 2)
{
version = match.Groups[2].Value;
return true;
}
}
}
catch
{
//ignored
}
version = null;
return false;
} }
public static bool TryParseSemanticVersionFromCsprojFile(string csprojContent, out SemanticVersion version, string packagePrefix = "Volo.Abp") public static bool TryParseSemanticVersionFromCsprojFile(string csprojContent, out SemanticVersion version, string packagePrefix = "Volo.Abp", string excludedKeywords = "LeptonX")
{ {
try try
{ {
if (TryParseVersionFromCsprojFile(csprojContent, out var versionText, packagePrefix)) if (TryParseVersionFromCsprojViaXmlDocument(csprojContent, out var versionText, packagePrefix, excludedKeywords))
{ {
return SemanticVersion.TryParse(versionText, out version); return SemanticVersion.TryParse(versionText, out version);
} }
@ -90,51 +89,6 @@ public class SolutionPackageVersionFinder : ITransientDependency
return false; return false;
} }
public static bool TryFind(string solutionFile, out string version, string packagePrefix = "Volo.Abp")
{
var projectFiles = GetProjectFilesOfSolution(solutionFile);
foreach (var projectFile in projectFiles)
{
var csprojContent = File.ReadAllText(projectFile);
if (TryParseVersionFromCsprojFile(csprojContent, out var parsedVersion, packagePrefix))
{
version = parsedVersion;
return true;
}
}
version = null;
return false;
}
public static bool TryFindSemanticVersion(string solutionFile, out SemanticVersion version, string packagePrefix = "Volo.Abp")
{
var projectFiles = GetProjectFilesOfSolution(solutionFile);
foreach (var projectFile in projectFiles)
{
var csprojContent = File.ReadAllText(projectFile);
if (TryParseSemanticVersionFromCsprojFile(csprojContent, out var parsedVersion, packagePrefix))
{
version = parsedVersion;
return true;
}
}
version = null;
return false;
}
//public static bool TryFindSemanticVersion(string solutionFile, out SemanticVersion version)
//{
// if (TryFind(solutionFile, out var versionText))
// {
// return SemanticVersion.TryParse(versionText, out version);
// }
// version = null;
// return false;
//}
private static string[] GetProjectFilesOfSolution(string solutionFile) private static string[] GetProjectFilesOfSolution(string solutionFile)
{ {
var solutionDirectory = Path.GetDirectoryName(solutionFile); var solutionDirectory = Path.GetDirectoryName(solutionFile);

16
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs

@ -183,11 +183,18 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency
var versionAttribute = package.Attributes["Version"]; var versionAttribute = package.Attributes["Version"];
var currentVersion = versionAttribute.Value; var currentVersion = versionAttribute.Value;
var currentSemanticVersion = SemanticVersion.Parse(currentVersion); var currentSemanticVersion = SemanticVersion.Parse(currentVersion);
var isLeptonXPackage = packageId.Contains("LeptonX");
Logger.LogDebug("Checking package: \"{0}\" - Current version: {1}", packageId, currentSemanticVersion); Logger.LogDebug("Checking package: \"{0}\" - Current version: {1}", packageId, currentSemanticVersion);
if (!specifiedVersion.IsNullOrWhiteSpace()) if (!specifiedVersion.IsNullOrWhiteSpace())
{ {
if (isLeptonXPackage)
{
continue;
}
if (await SpecifiedVersionExists(specifiedVersion, packageId)) if (await SpecifiedVersionExists(specifiedVersion, packageId))
{ {
var specifiedSemanticVersion = SemanticVersion.Parse(specifiedVersion); var specifiedSemanticVersion = SemanticVersion.Parse(specifiedVersion);
@ -210,7 +217,8 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency
{ {
if ((includeNightlyPreviews || (currentVersion.Contains("-preview") && !switchToStable)) && !includeReleaseCandidates) if ((includeNightlyPreviews || (currentVersion.Contains("-preview") && !switchToStable)) && !includeReleaseCandidates)
{ {
var latestVersion = latestMyGetVersion ?? await GetLatestVersionFromMyGet(packageId); var latestVersion = latestMyGetVersion == null || isLeptonXPackage ?
await GetLatestVersionFromMyGet(packageId) : latestMyGetVersion;
if (currentVersion != latestVersion) if (currentVersion != latestVersion)
{ {
@ -227,11 +235,13 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency
SemanticVersion latestVersion; SemanticVersion latestVersion;
if (currentSemanticVersion.IsPrerelease && !switchToStable) if (currentSemanticVersion.IsPrerelease && !switchToStable)
{ {
latestVersion = latestNugetReleaseCandidateVersion ?? await _nuGetService.GetLatestVersionOrNullAsync(packageId, includeReleaseCandidates: true); latestVersion = latestNugetReleaseCandidateVersion == null || isLeptonXPackage ?
await _nuGetService.GetLatestVersionOrNullAsync(packageId, includeReleaseCandidates: true) : latestNugetReleaseCandidateVersion;
} }
else else
{ {
latestVersion = latestNugetVersion ?? await _nuGetService.GetLatestVersionOrNullAsync(packageId, includeReleaseCandidates: includeReleaseCandidates); latestVersion = latestNugetVersion == null || isLeptonXPackage ?
await _nuGetService.GetLatestVersionOrNullAsync(packageId, includeReleaseCandidates: includeReleaseCandidates) : latestNugetVersion;
} }
if (latestVersion != null && (currentSemanticVersion < latestVersion || (currentSemanticVersion.IsPrerelease && switchToStable))) if (latestVersion != null && (currentSemanticVersion < latestVersion || (currentSemanticVersion.IsPrerelease && switchToStable)))

Loading…
Cancel
Save