FastGithub/FastGithub.Upgrade/ProductionVersion.cs
2021-07-27 18:18:36 +08:00

108 lines
2.9 KiB
C#

using System;
using System.Reflection;
using System.Text.RegularExpressions;
namespace FastGithub.Upgrade
{
/// <summary>
/// 表示产品版本
/// </summary>
public class ProductionVersion : IComparable<ProductionVersion>
{
/// <summary>
/// 版本
/// </summary>
public Version Version { get; }
/// <summary>
/// 子版本
/// </summary>
public string SubVersion { get; }
/// <summary>
/// 产品版本
/// </summary>
/// <param name="version"></param>
/// <param name="subVersion"></param>
public ProductionVersion(Version version, string subVersion)
{
this.Version = version;
this.SubVersion = subVersion;
}
/// <summary>
/// 比较版本
/// </summary>
/// <param name="other"></param>
/// <returns></returns>
public int CompareTo(ProductionVersion? other)
{
var x = this;
var y = other;
if (y == null)
{
return 1;
}
var value = x.Version.CompareTo(y.Version);
if (value == 0)
{
value = CompareSubVerson(x.SubVersion, y.SubVersion);
}
return value;
static int CompareSubVerson(string subX, string subY)
{
if (subX.Length == 0 && subY.Length == 0)
{
return 0;
}
if (subX.Length == 0)
{
return 1;
}
if (subY.Length == 0)
{
return -1;
}
return StringComparer.OrdinalIgnoreCase.Compare(subX, subY);
}
}
public override string ToString()
{
return $"{Version}{SubVersion}";
}
/// <summary>
/// 解析
/// </summary>
/// <param name="productionVersion"></param>
/// <returns></returns>
public static ProductionVersion Parse(string productionVersion)
{
const string VERSION = @"^\d+\.(\d+.){0,2}\d+";
var verion = Regex.Match(productionVersion, VERSION).Value;
var subVersion = productionVersion[verion.Length..];
return new ProductionVersion(Version.Parse(verion), subVersion);
}
/// <summary>
/// 获取当前应用程序的产品版本
/// </summary>
/// <returns></returns>
public static ProductionVersion? GetAppVersion()
{
var version = Assembly
.GetEntryAssembly()?
.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?
.InformationalVersion;
return version == null ? null : Parse(version);
}
}
}