2017-03-03 05:04:03 +00:00
|
|
|
// Copyright (c) .NET Foundation and contributors. All rights reserved.
|
|
|
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
|
|
|
2016-05-04 02:41:48 +00:00
|
|
|
namespace Microsoft.DotNet.Cli.Build
|
|
|
|
{
|
2017-02-08 22:31:07 +00:00
|
|
|
public class Version
|
2016-05-04 02:41:48 +00:00
|
|
|
{
|
|
|
|
public virtual int Major { get; set; }
|
|
|
|
public virtual int Minor { get; set; }
|
|
|
|
public virtual int Patch { get; set; }
|
|
|
|
public virtual int CommitCount { get; set; }
|
|
|
|
|
|
|
|
public string GenerateMsiVersion()
|
|
|
|
{
|
|
|
|
// MSI versioning
|
|
|
|
// Encode the CLI version to fit into the MSI versioning scheme - https://msdn.microsoft.com/en-us/library/windows/desktop/aa370859(v=vs.85).aspx
|
|
|
|
// MSI versions are 3 part
|
|
|
|
// major.minor.build
|
|
|
|
// Size(bits) of each part 8 8 16
|
|
|
|
// So we have 32 bits to encode the CLI version
|
|
|
|
// Starting with most significant bit this how the CLI version is going to be encoded as MSI Version
|
|
|
|
// CLI major -> 6 bits
|
|
|
|
// CLI minor -> 6 bits
|
|
|
|
// CLI patch -> 6 bits
|
|
|
|
// CLI commitcount -> 14 bits
|
|
|
|
var major = Major << 26;
|
|
|
|
var minor = Minor << 20;
|
|
|
|
var patch = Patch << 14;
|
|
|
|
var msiVersionNumber = major | minor | patch | CommitCount;
|
|
|
|
|
|
|
|
var msiMajor = (msiVersionNumber >> 24) & 0xFF;
|
|
|
|
var msiMinor = (msiVersionNumber >> 16) & 0xFF;
|
|
|
|
var msiBuild = msiVersionNumber & 0xFFFF;
|
|
|
|
|
|
|
|
return $"{msiMajor}.{msiMinor}.{msiBuild}";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|