build/VersionInfoAttribute.cs (68 lines of code) (raw):

using System.Reflection; using Nuke.Common.Tools.Git; using Nuke.Common.ValueInjection; namespace _build { public class VersionInfoAttribute : ValueInjectionAttributeBase { public int VersionMajor { get; set; } = 1; public int VersionMinor { get; set; } public override object GetValue(MemberInfo member, object instance) => GetFromSpace() ?? GetFromGit() ?? GetFromTime(); bool IsMainBranch(string branch) => string.Equals(branch, "refs/heads/main", StringComparison.OrdinalIgnoreCase) || string.Equals(branch, "main", StringComparison.OrdinalIgnoreCase); VersionInfo? GetFromSpace() { var versionInfo = File.Exists("version-info.txt") ? File.ReadAllText("version-info.txt").TrimStart('v') : $"{VersionMajor}.{VersionMinor}"; var executionNumber = Environment.GetEnvironmentVariable("JB_SPACE_EXECUTION_NUMBER"); var branch = Environment.GetEnvironmentVariable("JB_SPACE_GIT_BRANCH")?.Replace("refs/heads/", "").Replace("/", "-"); var revision = Environment.GetEnvironmentVariable("JB_SPACE_GIT_REVISION"); if (!string.IsNullOrEmpty(executionNumber) && !string.IsNullOrEmpty(branch) && !string.IsNullOrEmpty(revision)) { return new VersionInfo( $"{VersionMajor}.{VersionMinor}.{executionNumber}.0", $"{VersionMajor}.{VersionMinor}.{executionNumber}.0", $"{VersionMajor}.{VersionMinor}.{executionNumber}.0+Branch.{branch}.Sha.{revision}.Server.{versionInfo}", IsMainBranch(branch) ? $"{versionInfo}.{executionNumber}" : $"{versionInfo}-{branch}.{executionNumber}"); } return null; } VersionInfo? GetFromGit() { if (!GitTasks.GitIsDetached()) { var commitCount = GitTasks.Git("rev-list HEAD --count", logOutput: false).Select(x => x.Text).Single(); var branch = GitTasks.GitCurrentBranch()?.Replace("refs/heads/", "").Replace("/", "-"); var revision = GitTasks.Git("rev-parse HEAD", logOutput: false).Select(x => x.Text).Single(); if (!string.IsNullOrEmpty(commitCount) && !string.IsNullOrEmpty(branch) && !string.IsNullOrEmpty(revision)) { return new VersionInfo( $"{VersionMajor}.{VersionMinor}.{commitCount}.0", $"{VersionMajor}.{VersionMinor}.{commitCount}.0", $"{VersionMajor}.{VersionMinor}.{commitCount}.0+Branch.{branch}.Sha.{revision}", IsMainBranch(branch) ? $"{VersionMajor}.{VersionMinor}.{commitCount}" : $"{VersionMajor}.{VersionMinor}.{commitCount}-{branch}"); } } return null; } VersionInfo GetFromTime() { // [last two digits of year][day of year number] var x = new string(DateTime.UtcNow.Year.ToString().Skip(2).Take(2).ToArray()) + DateTime.UtcNow.DayOfYear; var y = DateTime.UtcNow.ToString("HHmmss"); return new VersionInfo( $"{VersionMajor}.{VersionMinor}.{x}.{y}", $"{VersionMajor}.{VersionMinor}.{x}.{y}", $"{VersionMajor}.{VersionMinor}.{x}.{y}+development", $"{VersionMajor}.{VersionMinor}.{x}.{y}-development"); } } }