blob: 312406580606b98ed48d33f9acdf3eb8e135e508 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;
using System.IO;
namespace DotNetOpenAuth.BuildTasks {
public class GetBuildVersion : Task {
/// <summary>
/// Gets the version string to use in the compiled assemblies.
/// </summary>
[Output]
public string Version { get; private set; }
/// <summary>
/// Gets the Git revision control commit id for HEAD (the current source code version).
/// </summary>
[Output]
public string GitCommitId { get; private set; }
/// <summary>
/// The file that contains the version base (Major.Minor.Build) to use.
/// </summary>
[Required]
public string VersionFile { get; set; }
/// <summary>
/// Gets or sets the parent directory of the .git directory.
/// </summary>
public string GitRepoRoot { get; set; }
public override bool Execute() {
try {
Version typedVersion = ReadVersionFromFile();
typedVersion = new Version(typedVersion.Major, typedVersion.Minor, typedVersion.Build, CalculateJDate(DateTime.Now));
Version = typedVersion.ToString();
this.GitCommitId = GetGitHeadCommitId();
} catch (ArgumentOutOfRangeException ex) {
Log.LogErrorFromException(ex);
return false;
}
return true;
}
private string GetGitHeadCommitId() {
if (string.IsNullOrEmpty(this.GitRepoRoot)) {
return string.Empty;
}
string headContent = string.Empty;
try {
headContent = File.ReadAllText(Path.Combine(this.GitRepoRoot, @".git/HEAD")).Trim();
if (headContent.StartsWith("ref:", StringComparison.Ordinal)) {
string refName = headContent.Substring(5).Trim();
headContent = File.ReadAllText(Path.Combine(this.GitRepoRoot, @".git/" + refName)).Trim();
}
} catch (FileNotFoundException) { }
if (string.IsNullOrEmpty(headContent)) {
Log.LogWarning("Unable to determine the git HEAD commit ID to use for informational version number.");
}
return headContent.Trim();
}
private Version ReadVersionFromFile() {
string[] lines = File.ReadAllLines(VersionFile);
string versionLine = lines[0];
return new Version(versionLine);
}
private int CalculateJDate(DateTime date) {
int yearLastDigit = date.Year - 2000; // can actually be two digits in or after 2010
DateTime firstOfYear = new DateTime(date.Year, 1, 1);
int dayOfYear = (date - firstOfYear).Days + 1;
int jdate = yearLastDigit * 1000 + dayOfYear;
return jdate;
}
}
}
|