Added new Changelog generator
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
name: Create Tag
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tagName:
|
||||
description: 'Tag name:'
|
||||
type: string
|
||||
required: true
|
||||
jobs:
|
||||
generate_changelog:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
ref: ${{ github.head_ref }}
|
||||
token: ${{ secrets.TOKEN }}
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v1
|
||||
with:
|
||||
dotnet-version: '7.0.x'
|
||||
- name: Update Project Versions
|
||||
run: sed -i "s/\(<Version>\([0-9]\+\.\)\{2\}\)\([0-9]\+\)/\1${{github.event.inputs.tagName}}/" "./OmegaLeo.HelperLib/OmegaLeo.HelperLib.csproj"
|
||||
- name: Update Project Versions
|
||||
run: sed -i "s/\(<Version>\([0-9]\+\.\)\{2\}\)\([0-9]\+\)/\1${{github.event.inputs.tagName}}/" "./OmegaLeo.HelperLib.Changelog/OmegaLeo.HelperLib.Changelog.csproj"
|
||||
- name: Build and Run Changelog Generator
|
||||
run: dotnet run --project "./OmegaLeo.HelperLib.ChangelogHandler/OmegaLeo.HelperLib.ChangelogHandler.csproj"
|
||||
env:
|
||||
UNITYFLOW_SECRET: ${{ secrets.TOKEN }}
|
||||
- name: Create Tag
|
||||
run: |
|
||||
git config --local user.email "nunodiogo@omegaleo.pt"
|
||||
git config --local user.name "Nuno Diogo"
|
||||
git add .
|
||||
git commit -m "Automatically generated changelog for v${{github.event.inputs.tagName}}"
|
||||
git tag -a "${{ github.event.inputs.tagName }}" -m "Release ${{ github.event.inputs.tagName }}"
|
||||
git push origin "${{ github.event.inputs.tagName }}"
|
||||
- name: Create Release
|
||||
uses: actions/create-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: '${{ github.event.inputs.tagName }}'
|
||||
release_name: 'Release v${{ github.event.inputs.tagName }}'
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.TOKEN }}
|
||||
outputs:
|
||||
upload_url: ${{ steps.get_release.outputs.upload_url }}
|
||||
publish_doc_helper:
|
||||
publish-helper-lib:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [get-release]
|
||||
steps:
|
||||
@@ -40,3 +40,27 @@ jobs:
|
||||
asset_path: ./OmegaLeo.HelperLib/bin/Release/OmegaLeo.HelperLib.${{ github.event.release.tag_name }}.nupkg
|
||||
asset_name: OmegaLeo.HelperLib.${{ github.event.release.tag_name }}.nupkg
|
||||
asset_content_type: application/zip
|
||||
publish-changelog-lib:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [ get-release ]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Setup .Net Core
|
||||
uses: actions/setup-dotnet@v1
|
||||
with:
|
||||
dotnet-version: '7.0.x'
|
||||
- name: Update Project Version
|
||||
run: sed -i "s/\(<Version>\([0-9]\+\.\)\{2\}\)\([0-9]\+\)/\1${{ github.event.release.tag_name }}/" "./OmegaLeo.HelperLib/OmegaLeo.HelperLib.Changelog.csproj"
|
||||
- name: Create Nuget Package
|
||||
run: dotnet pack "./OmegaLeo.HelperLib.Changelog/OmegaLeo.HelperLib.Changelog.csproj" -c Release /p:Version=${{ github.event.release.tag_name }} /p:PackageReleaseNotes="See https://github.com/omegaleo/OmegaLeo.HelperLib/releases/tag/${{ github.event.release.tag_name }}"
|
||||
- name: Publish Nuget Package
|
||||
run: dotnet nuget push ./OmegaLeo.HelperLib.Changelog/bin/Release/OmegaLeo.HelperLib.Changelog.${{ github.event.release.tag_name }}.nupkg --api-key ${{ secrets.nuget_api_key }} --source https://api.nuget.org/v3/index.json --skip-duplicate
|
||||
- name: Upload assets to release
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ needs.get-release.outputs.upload_url }}
|
||||
asset_path: ./OmegaLeo.HelperLib/bin/Release/OmegaLeo.HelperLib.Changelog.${{ github.event.release.tag_name }}.nupkg
|
||||
asset_name: OmegaLeo.HelperLib.Changelog.${{ github.event.release.tag_name }}.nupkg
|
||||
asset_content_type: application/zip
|
||||
@@ -0,0 +1,18 @@
|
||||
using System;
|
||||
|
||||
namespace OmegaLeo.HelperLib.Changelog.Attributes
|
||||
{
|
||||
[Changelog("v1.0.0", "Created ChangelogAttribute to be used to register changes in the code.")]
|
||||
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
|
||||
public class ChangelogAttribute : Attribute
|
||||
{
|
||||
public string Version { get; }
|
||||
public string Description { get; }
|
||||
|
||||
public ChangelogAttribute(string version, string description)
|
||||
{
|
||||
Version = version;
|
||||
Description = description;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
# Changelog
|
||||
|
||||
## Version v1.0.0
|
||||
|
||||
- **Class: ChangelogTool**: Created the class ChangelogTool to extract changelogs via attributes
|
||||
- **Class: ChangelogAttribute**: Created ChangelogAttribute to be used to register changes in the code.
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
namespace OmegaLeo.HelperLib.Changelog.Models
|
||||
{
|
||||
public class Changelog
|
||||
{
|
||||
public string Target;
|
||||
public string Description;
|
||||
|
||||
public Changelog(string target, string description)
|
||||
{
|
||||
Target = target;
|
||||
Description = description;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.1</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,63 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using OmegaLeo.HelperLib.Changelog.Attributes;
|
||||
|
||||
namespace OmegaLeo.HelperLib.Changelog.Tools
|
||||
{
|
||||
[Changelog("v1.0.0", "Created the class ChangelogTool to extract changelogs via attributes")]
|
||||
public class ChangelogTool
|
||||
{
|
||||
public static Dictionary<string, List<Models.Changelog>> ExtractChangelog(Assembly assembly)
|
||||
{
|
||||
var changelogByVersion = new Dictionary<string, List<Models.Changelog>>();
|
||||
|
||||
foreach (var type in assembly.GetTypes())
|
||||
{
|
||||
foreach (var attr in type.GetCustomAttributes<ChangelogAttribute>())
|
||||
{
|
||||
AddChangelogEntry(changelogByVersion, attr.Version, $"Class: {type.Name}", attr.Description);
|
||||
}
|
||||
|
||||
foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static))
|
||||
{
|
||||
foreach (var attr in method.GetCustomAttributes<ChangelogAttribute>())
|
||||
AddChangelogEntry(changelogByVersion, attr.Version, $"Method: {type.Name}.{method.Name}()", attr.Description);
|
||||
}
|
||||
}
|
||||
|
||||
changelogByVersion = new Dictionary<string, List<Models.Changelog>>(changelogByVersion.OrderByDescending(x => x.Key));
|
||||
|
||||
return changelogByVersion;
|
||||
}
|
||||
|
||||
public static string GetMarkdown(Assembly assembly)
|
||||
{
|
||||
var changelog = ExtractChangelog(assembly);
|
||||
|
||||
var sb = new StringBuilder();
|
||||
|
||||
sb.AppendLine("# Changelog\n");
|
||||
foreach (var version in changelog)
|
||||
{
|
||||
sb.AppendLine($"## Version {version.Key}\n");
|
||||
foreach (var entry in version.Value)
|
||||
{
|
||||
sb.AppendLine($"- **{entry.Target}**: {entry.Description}");
|
||||
}
|
||||
sb.AppendLine();
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
private static void AddChangelogEntry(Dictionary<string, List<Models.Changelog>> changelog, string version, string target, string description)
|
||||
{
|
||||
if (!changelog.ContainsKey(version))
|
||||
changelog[version] = new List<Models.Changelog>();
|
||||
|
||||
changelog[version].Add(new Models.Changelog(target, description));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\OmegaLeo.HelperLib.Changelog\OmegaLeo.HelperLib.Changelog.csproj" />
|
||||
<ProjectReference Include="..\OmegaLeo.HelperLib\OmegaLeo.HelperLib.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,42 @@
|
||||
// See https://aka.ms/new-console-template for more information
|
||||
|
||||
using System.Reflection;
|
||||
using GameDevLibrary.Helpers;
|
||||
using OmegaLeo.HelperLib.Changelog.Models;
|
||||
using OmegaLeo.HelperLib.Changelog.Tools;
|
||||
|
||||
var root = GetSolutionRoot();
|
||||
|
||||
var changelogs = new Dictionary<string, Assembly>()
|
||||
{
|
||||
{Path.Join(root, "OmegaLeo.HelperLib.Changelog", "CHANGELOG.md"), typeof(Changelog).Assembly},
|
||||
{Path.Join(root, "OmegaLeo.HelperLib", "CHANGELOG.md"), typeof(BenchmarkUtility).Assembly},
|
||||
};
|
||||
|
||||
foreach (var changelog in changelogs)
|
||||
{
|
||||
GenerateChangelog(changelog.Key, changelog.Value);
|
||||
}
|
||||
|
||||
|
||||
void GenerateChangelog(string path, Assembly libraryAssembly)
|
||||
{
|
||||
var changelogMarkdown = ChangelogTool.GetMarkdown(libraryAssembly);
|
||||
|
||||
File.WriteAllText(path,changelogMarkdown);
|
||||
}
|
||||
|
||||
static string GetSolutionRoot()
|
||||
{
|
||||
string dir = AppContext.BaseDirectory;
|
||||
|
||||
while (!string.IsNullOrEmpty(dir))
|
||||
{
|
||||
if (Directory.GetFiles(dir, "*.sln").Length > 0)
|
||||
return dir; // Found the solution root
|
||||
|
||||
dir = Directory.GetParent(dir)?.FullName; // Move up a directory
|
||||
}
|
||||
|
||||
throw new Exception("Solution root not found.");
|
||||
}
|
||||
@@ -8,6 +8,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\OmegaLeo.HelperLib.Changelog\OmegaLeo.HelperLib.Changelog.csproj" />
|
||||
<ProjectReference Include="..\OmegaLeo.HelperLib.Git\OmegaLeo.HelperLib.Git.csproj" />
|
||||
<ProjectReference Include="..\OmegaLeo.HelperLib\OmegaLeo.HelperLib.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -2,9 +2,11 @@
|
||||
|
||||
// /media/omegaleo/Development/Library Dev/HelperLib
|
||||
|
||||
using System.Reflection;
|
||||
using GameDevLibrary.Extensions;
|
||||
using GameDevLibrary.Helpers;
|
||||
using LibGit2Sharp;
|
||||
using OmegaLeo.HelperLib.Changelog.Tools;
|
||||
using OmegaLeo.HelperLib.Git;
|
||||
using OmegaLeo.HelperLib.Git.Models;
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
using OmegaLeo.HelperLib.Changelog.Attributes;
|
||||
|
||||
namespace OmegaLeo.HelperLib.ConsoleApp;
|
||||
|
||||
[Changelog("v1.0.0", "Test")]
|
||||
[Changelog("v1.0.1", "Test 1")]
|
||||
public class TestClass
|
||||
{
|
||||
|
||||
}
|
||||
@@ -6,6 +6,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OmegaLeo.HelperLib.Git", "O
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OmegaLeo.HelperLib.ConsoleApp", "OmegaLeo.HelperLib.ConsoleApp\OmegaLeo.HelperLib.ConsoleApp.csproj", "{3B77B177-FD47-470A-B0EF-01EF8B30CE09}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OmegaLeo.HelperLib.Changelog", "OmegaLeo.HelperLib.Changelog\OmegaLeo.HelperLib.Changelog.csproj", "{378D8125-66B5-42B8-9881-33F951E5E04A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OmegaLeo.HelperLib.ChangelogHandler", "OmegaLeo.HelperLib.ChangelogHandler\OmegaLeo.HelperLib.ChangelogHandler.csproj", "{359536F7-02DE-43E9-A383-D83853227B0F}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@@ -24,5 +28,13 @@ Global
|
||||
{3B77B177-FD47-470A-B0EF-01EF8B30CE09}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3B77B177-FD47-470A-B0EF-01EF8B30CE09}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3B77B177-FD47-470A-B0EF-01EF8B30CE09}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{378D8125-66B5-42B8-9881-33F951E5E04A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{378D8125-66B5-42B8-9881-33F951E5E04A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{378D8125-66B5-42B8-9881-33F951E5E04A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{378D8125-66B5-42B8-9881-33F951E5E04A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{359536F7-02DE-43E9-A383-D83853227B0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{359536F7-02DE-43E9-A383-D83853227B0F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{359536F7-02DE-43E9-A383-D83853227B0F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{359536F7-02DE-43E9-A383-D83853227B0F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASafeFileHandle_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003Fhome_003Fomegaleo_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fc21672d0d37542808f219d7d1f059dc1b2e000_003Faf_003Fbed3a9b4_003FSafeFileHandle_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003Fhome_003Fomegaleo_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fc61cc76f205b4535a5b4f40700c07900b2d200_003Fe5_003F6b3ec67e_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATreeChanges_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003Fhome_003Fomegaleo_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F7478b0ce6362feb345e793626f5c504bd9d7ffeb748226521658c85fc4e29_003FTreeChanges_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATreeEntryChanges_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003Fhome_003Fomegaleo_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F2b7912eaeadb1d9a91a3f891a244b5cd4a856d9dde42694e941ee6a2994_003FTreeEntryChanges_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>
|
||||
@@ -0,0 +1,2 @@
|
||||
# Changelog
|
||||
|
||||
Reference in New Issue
Block a user