Skip to content

Commit 4a44d12

Browse files
committed
Merge pull request #531 from JakeGinnivan/feature/versioninfo-attribute
Add GitVersionInformationAttribute to make reflection easier [rebased]
2 parents 8cb07e5 + 8613364 commit 4a44d12

7 files changed

+207
-27
lines changed

src/GitVersionTask.Tests/AssemblyInfoBuilderTests.VerifyAssemblyVersion_Major.approved.txt

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-

2-
using System;
1+
using System;
32
using System.Reflection;
43

54
[assembly: AssemblyVersion("2.0.0.0")]
65
[assembly: AssemblyFileVersion("2.3.4.0")]
76
[assembly: AssemblyInformationalVersion("2.3.4-beta.5+6.Branch.master.Sha.commitSha")]
87
[assembly: Fake.ReleaseDate("2014-03-06")]
8+
[assembly: Fake.GitVersionInformation()]
99

1010
namespace Fake
1111
{
1212
[System.Runtime.CompilerServices.CompilerGenerated]
13+
[AttributeUsage(AttributeTargets.Assembly)]
1314
sealed class ReleaseDateAttribute : System.Attribute
1415
{
1516
public string Date { get; private set; }
@@ -42,6 +43,30 @@ namespace Fake
4243
public static string NuGetVersionV2 = "2.3.4-beta0005";
4344
public static string NuGetVersion = "2.3.4-beta0005";
4445
public static string CommitDate = "2014-03-06";
46+
}
4547

48+
[System.Runtime.CompilerServices.CompilerGenerated]
49+
[AttributeUsage(AttributeTargets.Assembly)]
50+
sealed class GitVersionInformationAttribute : System.Attribute
51+
{
52+
public string Major { get { return "2"; } }
53+
public string Minor { get { return "3"; } }
54+
public string Patch { get { return "4"; } }
55+
public string PreReleaseTag { get { return "beta.5"; } }
56+
public string PreReleaseTagWithDash { get { return "-beta.5"; } }
57+
public string BuildMetaData { get { return "6"; } }
58+
public string FullBuildMetaData { get { return "6.Branch.master.Sha.commitSha"; } }
59+
public string MajorMinorPatch { get { return "2.3.4"; } }
60+
public string SemVer { get { return "2.3.4-beta.5"; } }
61+
public string LegacySemVer { get { return "2.3.4-beta5"; } }
62+
public string LegacySemVerPadded { get { return "2.3.4-beta0005"; } }
63+
public string AssemblySemVer { get { return "2.0.0.0"; } }
64+
public string FullSemVer { get { return "2.3.4-beta.5+6"; } }
65+
public string InformationalVersion { get { return "2.3.4-beta.5+6.Branch.master.Sha.commitSha"; } }
66+
public string BranchName { get { return "master"; } }
67+
public string Sha { get { return "commitSha"; } }
68+
public string NuGetVersionV2 { get { return "2.3.4-beta0005"; } }
69+
public string NuGetVersion { get { return "2.3.4-beta0005"; } }
70+
public string CommitDate { get { return "2014-03-06"; } }
4671
}
4772
}

src/GitVersionTask.Tests/AssemblyInfoBuilderTests.VerifyAssemblyVersion_MajorMinor.approved.txt

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-

2-
using System;
1+
using System;
32
using System.Reflection;
43

54
[assembly: AssemblyVersion("2.3.0.0")]
65
[assembly: AssemblyFileVersion("2.3.4.0")]
76
[assembly: AssemblyInformationalVersion("2.3.4-beta.5+6.Branch.master.Sha.commitSha")]
87
[assembly: Fake.ReleaseDate("2014-03-06")]
8+
[assembly: Fake.GitVersionInformation()]
99

1010
namespace Fake
1111
{
1212
[System.Runtime.CompilerServices.CompilerGenerated]
13+
[AttributeUsage(AttributeTargets.Assembly)]
1314
sealed class ReleaseDateAttribute : System.Attribute
1415
{
1516
public string Date { get; private set; }
@@ -42,6 +43,30 @@ namespace Fake
4243
public static string NuGetVersionV2 = "2.3.4-beta0005";
4344
public static string NuGetVersion = "2.3.4-beta0005";
4445
public static string CommitDate = "2014-03-06";
46+
}
4547

48+
[System.Runtime.CompilerServices.CompilerGenerated]
49+
[AttributeUsage(AttributeTargets.Assembly)]
50+
sealed class GitVersionInformationAttribute : System.Attribute
51+
{
52+
public string Major { get { return "2"; } }
53+
public string Minor { get { return "3"; } }
54+
public string Patch { get { return "4"; } }
55+
public string PreReleaseTag { get { return "beta.5"; } }
56+
public string PreReleaseTagWithDash { get { return "-beta.5"; } }
57+
public string BuildMetaData { get { return "6"; } }
58+
public string FullBuildMetaData { get { return "6.Branch.master.Sha.commitSha"; } }
59+
public string MajorMinorPatch { get { return "2.3.4"; } }
60+
public string SemVer { get { return "2.3.4-beta.5"; } }
61+
public string LegacySemVer { get { return "2.3.4-beta5"; } }
62+
public string LegacySemVerPadded { get { return "2.3.4-beta0005"; } }
63+
public string AssemblySemVer { get { return "2.3.0.0"; } }
64+
public string FullSemVer { get { return "2.3.4-beta.5+6"; } }
65+
public string InformationalVersion { get { return "2.3.4-beta.5+6.Branch.master.Sha.commitSha"; } }
66+
public string BranchName { get { return "master"; } }
67+
public string Sha { get { return "commitSha"; } }
68+
public string NuGetVersionV2 { get { return "2.3.4-beta0005"; } }
69+
public string NuGetVersion { get { return "2.3.4-beta0005"; } }
70+
public string CommitDate { get { return "2014-03-06"; } }
4671
}
4772
}

src/GitVersionTask.Tests/AssemblyInfoBuilderTests.VerifyAssemblyVersion_MajorMinorPatch.approved.txt

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-

2-
using System;
1+
using System;
32
using System.Reflection;
43

54
[assembly: AssemblyVersion("2.3.4.0")]
65
[assembly: AssemblyFileVersion("2.3.4.0")]
76
[assembly: AssemblyInformationalVersion("2.3.4-beta.5+6.Branch.master.Sha.commitSha")]
87
[assembly: Fake.ReleaseDate("2014-03-06")]
8+
[assembly: Fake.GitVersionInformation()]
99

1010
namespace Fake
1111
{
1212
[System.Runtime.CompilerServices.CompilerGenerated]
13+
[AttributeUsage(AttributeTargets.Assembly)]
1314
sealed class ReleaseDateAttribute : System.Attribute
1415
{
1516
public string Date { get; private set; }
@@ -42,6 +43,30 @@ namespace Fake
4243
public static string NuGetVersionV2 = "2.3.4-beta0005";
4344
public static string NuGetVersion = "2.3.4-beta0005";
4445
public static string CommitDate = "2014-03-06";
46+
}
4547

48+
[System.Runtime.CompilerServices.CompilerGenerated]
49+
[AttributeUsage(AttributeTargets.Assembly)]
50+
sealed class GitVersionInformationAttribute : System.Attribute
51+
{
52+
public string Major { get { return "2"; } }
53+
public string Minor { get { return "3"; } }
54+
public string Patch { get { return "4"; } }
55+
public string PreReleaseTag { get { return "beta.5"; } }
56+
public string PreReleaseTagWithDash { get { return "-beta.5"; } }
57+
public string BuildMetaData { get { return "6"; } }
58+
public string FullBuildMetaData { get { return "6.Branch.master.Sha.commitSha"; } }
59+
public string MajorMinorPatch { get { return "2.3.4"; } }
60+
public string SemVer { get { return "2.3.4-beta.5"; } }
61+
public string LegacySemVer { get { return "2.3.4-beta5"; } }
62+
public string LegacySemVerPadded { get { return "2.3.4-beta0005"; } }
63+
public string AssemblySemVer { get { return "2.3.4.0"; } }
64+
public string FullSemVer { get { return "2.3.4-beta.5+6"; } }
65+
public string InformationalVersion { get { return "2.3.4-beta.5+6.Branch.master.Sha.commitSha"; } }
66+
public string BranchName { get { return "master"; } }
67+
public string Sha { get { return "commitSha"; } }
68+
public string NuGetVersionV2 { get { return "2.3.4-beta0005"; } }
69+
public string NuGetVersion { get { return "2.3.4-beta0005"; } }
70+
public string CommitDate { get { return "2014-03-06"; } }
4671
}
4772
}

src/GitVersionTask.Tests/AssemblyInfoBuilderTests.VerifyAssemblyVersion_MajorMinorPatchTag.approved.txt

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-

2-
using System;
1+
using System;
32
using System.Reflection;
43

54
[assembly: AssemblyVersion("2.3.4.5")]
65
[assembly: AssemblyFileVersion("2.3.4.0")]
76
[assembly: AssemblyInformationalVersion("2.3.4-beta.5+6.Branch.master.Sha.commitSha")]
87
[assembly: Fake.ReleaseDate("2014-03-06")]
8+
[assembly: Fake.GitVersionInformation()]
99

1010
namespace Fake
1111
{
1212
[System.Runtime.CompilerServices.CompilerGenerated]
13+
[AttributeUsage(AttributeTargets.Assembly)]
1314
sealed class ReleaseDateAttribute : System.Attribute
1415
{
1516
public string Date { get; private set; }
@@ -42,6 +43,30 @@ namespace Fake
4243
public static string NuGetVersionV2 = "2.3.4-beta0005";
4344
public static string NuGetVersion = "2.3.4-beta0005";
4445
public static string CommitDate = "2014-03-06";
46+
}
4547

48+
[System.Runtime.CompilerServices.CompilerGenerated]
49+
[AttributeUsage(AttributeTargets.Assembly)]
50+
sealed class GitVersionInformationAttribute : System.Attribute
51+
{
52+
public string Major { get { return "2"; } }
53+
public string Minor { get { return "3"; } }
54+
public string Patch { get { return "4"; } }
55+
public string PreReleaseTag { get { return "beta.5"; } }
56+
public string PreReleaseTagWithDash { get { return "-beta.5"; } }
57+
public string BuildMetaData { get { return "6"; } }
58+
public string FullBuildMetaData { get { return "6.Branch.master.Sha.commitSha"; } }
59+
public string MajorMinorPatch { get { return "2.3.4"; } }
60+
public string SemVer { get { return "2.3.4-beta.5"; } }
61+
public string LegacySemVer { get { return "2.3.4-beta5"; } }
62+
public string LegacySemVerPadded { get { return "2.3.4-beta0005"; } }
63+
public string AssemblySemVer { get { return "2.3.4.5"; } }
64+
public string FullSemVer { get { return "2.3.4-beta.5+6"; } }
65+
public string InformationalVersion { get { return "2.3.4-beta.5+6.Branch.master.Sha.commitSha"; } }
66+
public string BranchName { get { return "master"; } }
67+
public string Sha { get { return "commitSha"; } }
68+
public string NuGetVersionV2 { get { return "2.3.4-beta0005"; } }
69+
public string NuGetVersion { get { return "2.3.4-beta0005"; } }
70+
public string CommitDate { get { return "2014-03-06"; } }
4671
}
4772
}

src/GitVersionTask.Tests/AssemblyInfoBuilderTests.VerifyCreatedCode.approved.txt

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-

2-
using System;
1+
using System;
32
using System.Reflection;
43

54
[assembly: AssemblyVersion("1.2.3.0")]
65
[assembly: AssemblyFileVersion("1.2.3.0")]
76
[assembly: AssemblyInformationalVersion("1.2.3-unstable.4+5.Branch.feature1.Sha.commitSha")]
87
[assembly: Fake.ReleaseDate("2014-03-06")]
8+
[assembly: Fake.GitVersionInformation()]
99

1010
namespace Fake
1111
{
1212
[System.Runtime.CompilerServices.CompilerGenerated]
13+
[AttributeUsage(AttributeTargets.Assembly)]
1314
sealed class ReleaseDateAttribute : System.Attribute
1415
{
1516
public string Date { get; private set; }
@@ -42,6 +43,30 @@ namespace Fake
4243
public static string NuGetVersionV2 = "1.2.3-unstable0004";
4344
public static string NuGetVersion = "1.2.3-unstable0004";
4445
public static string CommitDate = "2014-03-06";
46+
}
4547

48+
[System.Runtime.CompilerServices.CompilerGenerated]
49+
[AttributeUsage(AttributeTargets.Assembly)]
50+
sealed class GitVersionInformationAttribute : System.Attribute
51+
{
52+
public string Major { get { return "1"; } }
53+
public string Minor { get { return "2"; } }
54+
public string Patch { get { return "3"; } }
55+
public string PreReleaseTag { get { return "unstable.4"; } }
56+
public string PreReleaseTagWithDash { get { return "-unstable.4"; } }
57+
public string BuildMetaData { get { return "5"; } }
58+
public string FullBuildMetaData { get { return "5.Branch.feature1.Sha.commitSha"; } }
59+
public string MajorMinorPatch { get { return "1.2.3"; } }
60+
public string SemVer { get { return "1.2.3-unstable.4"; } }
61+
public string LegacySemVer { get { return "1.2.3-unstable4"; } }
62+
public string LegacySemVerPadded { get { return "1.2.3-unstable0004"; } }
63+
public string AssemblySemVer { get { return "1.2.3.0"; } }
64+
public string FullSemVer { get { return "1.2.3-unstable.4+5"; } }
65+
public string InformationalVersion { get { return "1.2.3-unstable.4+5.Branch.feature1.Sha.commitSha"; } }
66+
public string BranchName { get { return "feature1"; } }
67+
public string Sha { get { return "commitSha"; } }
68+
public string NuGetVersionV2 { get { return "1.2.3-unstable0004"; } }
69+
public string NuGetVersion { get { return "1.2.3-unstable0004"; } }
70+
public string CommitDate { get { return "2014-03-06"; } }
4671
}
4772
}

src/GitVersionTask.Tests/AssemblyInfoBuilderTests.cs

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.IO;
33
using System.Linq;
4+
using System.Reflection;
45
using System.Runtime.CompilerServices;
56
using ApprovalTests;
67
using GitVersion;
@@ -29,12 +30,20 @@ public void VerifyCreatedCode()
2930
Approvals.Verify(assemblyInfoText);
3031

3132
var compilation = CSharpCompilation.Create("Fake.dll")
32-
.WithOptions(new CSharpCompilationOptions(OutputKind.NetModule))
33+
.WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary))
3334
.AddReferences(MetadataReference.CreateFromFile(typeof(object).Assembly.Location))
3435
.AddSyntaxTrees(CSharpSyntaxTree.ParseText(assemblyInfoText));
3536

36-
var emitResult = compilation.Emit(new MemoryStream());
37-
Assert.IsTrue(emitResult.Success, string.Join(Environment.NewLine, emitResult.Diagnostics.Select(x => x.Descriptor)));
37+
using (var stream = new MemoryStream())
38+
{
39+
var emitResult = compilation.Emit(stream);
40+
41+
Assert.IsTrue(emitResult.Success, string.Join(Environment.NewLine, emitResult.Diagnostics.Select(x => x.Descriptor)));
42+
43+
stream.Seek(0, SeekOrigin.Begin);
44+
var assembly = Assembly.Load(stream.ToArray());
45+
VerifyGitVersionInformationAttribute(assembly, versionVariables);
46+
}
3847
}
3948

4049
[Test]
@@ -89,4 +98,32 @@ static void VerifyAssemblyVersion(AssemblyVersioningScheme avs)
8998
var emitResult = compilation.Emit(new MemoryStream());
9099
Assert.IsTrue(emitResult.Success, string.Join(Environment.NewLine, emitResult.Diagnostics.Select(x => x.Descriptor)));
91100
}
101+
102+
static void VerifyGitVersionInformationAttribute(Assembly assembly, VersionVariables versionVariables)
103+
{
104+
var gitVersionInformationAttributeData = assembly.CustomAttributes
105+
.FirstOrDefault(a => a.AttributeType.Name == "GitVersionInformationAttribute");
106+
107+
Assert.IsNotNull(gitVersionInformationAttributeData);
108+
109+
var gitVersionInformationAttributeType = gitVersionInformationAttributeData.AttributeType;
110+
var gitVersionInformationAttribute = assembly
111+
.GetCustomAttributes(gitVersionInformationAttributeType)
112+
.FirstOrDefault();
113+
114+
Assert.IsNotNull(gitVersionInformationAttribute);
115+
116+
var properties = gitVersionInformationAttributeType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
117+
118+
foreach (var variable in versionVariables)
119+
{
120+
Assert.IsNotNull(variable.Value);
121+
122+
var property = properties.FirstOrDefault(p => p.Name == variable.Key);
123+
Assert.IsNotNull(property);
124+
125+
var propertyValue = property.GetValue(gitVersionInformationAttribute, null);
126+
Assert.AreEqual(variable.Value, propertyValue, "{0} had an invalid value.", property.Name);
127+
}
128+
}
92129
}
Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
1-
using System.Collections.Generic;
2-
using System.Text;
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
34
using GitVersion;
45

56
public class AssemblyInfoBuilder
67
{
78
public string GetAssemblyInfoText(VersionVariables vars, string assemblyName)
89
{
9-
var assemblyInfo = string.Format(@"
10-
using System;
10+
var v = vars.ToList();
11+
12+
var assemblyInfo = string.Format(
13+
@"using System;
1114
using System.Reflection;
1215
1316
[assembly: AssemblyVersion(""{0}"")]
1417
[assembly: AssemblyFileVersion(""{1}"")]
1518
[assembly: AssemblyInformationalVersion(""{2}"")]
16-
[assembly: {5}.ReleaseDate(""{3}"")]
19+
[assembly: {6}.ReleaseDate(""{3}"")]
20+
[assembly: {6}.GitVersionInformation()]
1721
18-
namespace {5}
22+
namespace {6}
1923
{{
2024
[System.Runtime.CompilerServices.CompilerGenerated]
25+
[AttributeUsage(AttributeTargets.Assembly)]
2126
sealed class ReleaseDateAttribute : System.Attribute
2227
{{
2328
public string Date {{ get; private set; }}
@@ -33,26 +38,39 @@ static class GitVersionInformation
3338
{{
3439
{4}
3540
}}
41+
42+
[System.Runtime.CompilerServices.CompilerGenerated]
43+
[AttributeUsage(AttributeTargets.Assembly)]
44+
sealed class GitVersionInformationAttribute : System.Attribute
45+
{{
46+
{5}
47+
}}
3648
}}
3749
",
3850
vars.AssemblySemVer,
3951
vars.MajorMinorPatch + ".0",
4052
vars.InformationalVersion,
4153
vars.CommitDate,
42-
GenerateVariableMembers(vars),
54+
GenerateStaticVariableMembers(v),
55+
GenerateAttributeVariableMembers(v),
4356
assemblyName);
4457

4558
return assemblyInfo;
4659
}
4760

48-
string GenerateVariableMembers(IEnumerable<KeyValuePair<string, string>> vars)
61+
static string GenerateStaticVariableMembers(IList<KeyValuePair<string, string>> vars)
4962
{
50-
var members = new StringBuilder();
51-
foreach (var variable in vars)
52-
{
53-
members.AppendLine(string.Format(" public static string {0} = \"{1}\";", variable.Key, variable.Value));
54-
}
63+
return GenerateMembers(vars, " public static string {0} = \"{1}\";");
64+
}
5565

56-
return members.ToString();
66+
67+
static string GenerateAttributeVariableMembers(IList<KeyValuePair<string, string>> vars)
68+
{
69+
return GenerateMembers(vars, " public string {0} {{ get {{ return \"{1}\"; }} }}");
70+
}
71+
72+
static string GenerateMembers(IList<KeyValuePair<string, string>> vars, string memberFormat)
73+
{
74+
return string.Join(Environment.NewLine, vars.Select(v => string.Format(memberFormat, v.Key, v.Value)));
5775
}
5876
}

0 commit comments

Comments
 (0)