Skip to content

Commit

Permalink
Fsdk/Misc: support <ApplicationVersion>
Browse files Browse the repository at this point in the history
Before this commit, the only way to get the
current version of a project was to have
AssemblyInfo files with the corresponding
attributes, but that approach is very .NET4.x
(legacy), so this MSBuild-based one is more in
line with the times.
  • Loading branch information
knocte committed May 2, 2023
1 parent b128a51 commit f2a13d9
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 28 deletions.
8 changes: 8 additions & 0 deletions Fsdk/Fsdk-legacy.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@
<Reference Include="System.Numerics" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Xml.XDocument">
<HintPath>..\packages\System.Xml.XDocument.4.3.0\ref\netstandard1.0\System.Xml.XDocument.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="AssemblyInfo.fs" />
Expand All @@ -59,6 +64,9 @@
<Compile Include="Git.fs" />
<Compile Include="Taiga.fs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="..\CommonBuildProps-legacy.proj" />
<Import Condition="'$(FSharpTargetsPath)' != ''" Project="$(FSharpTargetsPath)" />
<Target Name="BeforeBuild">
Expand Down
5 changes: 5 additions & 0 deletions Fsdk/Fsdk.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@
/>
</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Xml.XDocument" Version="4.3.0">
<GeneratePathProperty></GeneratePathProperty>
</PackageReference>
</ItemGroup>
<ItemGroup>
<PackageReference Update="FSharp.Core" Version="4.7.0" />
</ItemGroup>
Expand Down
80 changes: 52 additions & 28 deletions Fsdk/Misc.fs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ open System.IO
open System.Text
open System.Reflection
open System.Linq
open System.Xml
open System.Xml.Linq
open System.Xml.XPath
#if LEGACY_FRAMEWORK
open System.Configuration
open System.Security.Cryptography
Expand Down Expand Up @@ -636,34 +639,8 @@ module Misc =

not(String.IsNullOrEmpty(gitlabUserEmail))

let GetCurrentVersion(dir: DirectoryInfo) : Version =
let defaultAssemblyVersionFileName = "AssemblyInfo.fs"

let assemblyVersionFsFiles =
(Directory.EnumerateFiles(
dir.FullName,
defaultAssemblyVersionFileName,
SearchOption.AllDirectories
))

let assemblyVersionFsFile =
if assemblyVersionFsFiles.Count() = 1 then
assemblyVersionFsFiles.Single()
else
(Directory.EnumerateFiles(
dir.FullName,
"Common" + defaultAssemblyVersionFileName,
SearchOption.AllDirectories
))
.SingleOrDefault()

if assemblyVersionFsFile = null then
Console.Error.WriteLine(
"Canonical AssemblyInfo not found in any subfolder (or found too many), cannot extract version number"
)

Environment.Exit 1

// TODO: move this as nested func of GetCurrentVersion()
let private GetCurrentVersionFromAssemblyInfos(assemblyVersionFsFile: string) : Version =
let assemblyVersionAttribute = "AssemblyVersion"

let lineContainingVersionNumber =
Expand Down Expand Up @@ -713,6 +690,53 @@ module Misc =

Version(version)

let GetCurrentVersion(dir: DirectoryInfo) : Version =
let defaultAssemblyVersionFileName = "AssemblyInfo.fs"

let assemblyVersionFsFiles =
(Directory.EnumerateFiles(
dir.FullName,
defaultAssemblyVersionFileName,
SearchOption.AllDirectories
))

let assemblyVersionFsFile =
if assemblyVersionFsFiles.Count() = 1 then
assemblyVersionFsFiles.Single()
else
(Directory.EnumerateFiles(
dir.FullName,
"Common" + defaultAssemblyVersionFileName,
SearchOption.AllDirectories
))
.SingleOrDefault()

if not (isNull assemblyVersionFsFile) then
GetCurrentVersionFromAssemblyInfos assemblyVersionFsFile
else
let projectFiles =
(Directory.EnumerateFiles(
dir.FullName,
"*.*proj",
SearchOption.AllDirectories
))
let versions =
seq {
for projFile in projectFiles do
let xmlDoc = XDocument.Load projFile
let query = "//ApplicationVersion"
let appVersionElements = xmlDoc.XPathSelectElements query
for appVersionElement in appVersionElements do
yield appVersionElement.Value
} |> Seq.distinct
if Seq.isEmpty versions then
failwithf "No <ApplicationVersion> tag found in project files"
match Seq.tryExactlyOne versions with
| None ->
let versionsStr = String.Join(",", versions)
failwithf "More than one <ApplicationVersion> tag found in project files: %s" versionsStr
| Some version ->
Version version

let SqlReadOnlyGroupName = "sqlreadonly"

Expand Down
1 change: 1 addition & 0 deletions Fsdk/packages.config
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="FSharp.Core" version="5.0.0.0" />
<package id="System.Xml.XDocument" version="4.3.0" targetFramework="net471" />
</packages>

0 comments on commit f2a13d9

Please sign in to comment.