From 97a0b80cc0cd82dd34cc33c0b6c0ff0326549c49 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 28 Mar 2026 15:50:34 +0100 Subject: [PATCH 1/4] chore: centralize NuGet package versioning and remove explicit versions from project files - Added `Directory.Packages.props` for central NuGet package version management. - Removed explicit version specifications from individual `.csproj` files. - Updated solution to include `Directory.Packages.props`. --- Directory.Packages.props | 34 +++++++++++++++++++ GitTools.sln | 1 + build/Build.csproj | 2 +- .../CreativeCoders.Git.Abstractions.csproj | 4 +-- ...ders.Git.Auth.CredentialManagerCore.csproj | 4 +-- .../CreativeCoders.Git.csproj | 6 ++-- .../CreativeCoders.GitTool.Base.csproj | 8 ++--- ...CreativeCoders.GitTool.Cli.Commands.csproj | 4 +-- .../CreativeCoders.GitTool.Cli.GtApp.csproj | 4 +-- .../CreativeCoders.GitTool.GitHub.csproj | 8 ++--- .../CreativeCoders.GitTool.GitLab.csproj | 6 ++-- ...uth.CredentialManagerCore.UnitTests.csproj | 18 +++++----- .../CreativeCoders.Git.UnitTests.csproj | 16 ++++----- ...tiveCoders.GitTool.GitHub.UnitTests.csproj | 16 ++++----- ...tiveCoders.GitTool.GitLab.UnitTests.csproj | 16 ++++----- .../CreativeCoders.GitTool.Tests.csproj | 16 ++++----- 16 files changed, 99 insertions(+), 64 deletions(-) create mode 100644 Directory.Packages.props diff --git a/Directory.Packages.props b/Directory.Packages.props new file mode 100644 index 0000000..11ee905 --- /dev/null +++ b/Directory.Packages.props @@ -0,0 +1,34 @@ + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GitTools.sln b/GitTools.sln index 6b7c6f5..c2092fd 100644 --- a/GitTools.sln +++ b/GitTools.sln @@ -50,6 +50,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "__global", "__global", "{95 LICENSE = LICENSE README.md = README.md global.json = global.json + Directory.Packages.props = Directory.Packages.props EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_setup", "_setup", "{A26D07EF-C593-41ED-AFD0-A2660857BEA6}" diff --git a/build/Build.csproj b/build/Build.csproj index caf68a7..3a934a9 100644 --- a/build/Build.csproj +++ b/build/Build.csproj @@ -8,7 +8,7 @@ - + diff --git a/source/Git/CreativeCoders.Git.Abstractions/CreativeCoders.Git.Abstractions.csproj b/source/Git/CreativeCoders.Git.Abstractions/CreativeCoders.Git.Abstractions.csproj index 38dcfa6..cb39ec5 100644 --- a/source/Git/CreativeCoders.Git.Abstractions/CreativeCoders.Git.Abstractions.csproj +++ b/source/Git/CreativeCoders.Git.Abstractions/CreativeCoders.Git.Abstractions.csproj @@ -5,8 +5,8 @@ - - + + diff --git a/source/Git/CreativeCoders.Git.Auth.CredentialManagerCore/CreativeCoders.Git.Auth.CredentialManagerCore.csproj b/source/Git/CreativeCoders.Git.Auth.CredentialManagerCore/CreativeCoders.Git.Auth.CredentialManagerCore.csproj index 9d8b465..d425713 100644 --- a/source/Git/CreativeCoders.Git.Auth.CredentialManagerCore/CreativeCoders.Git.Auth.CredentialManagerCore.csproj +++ b/source/Git/CreativeCoders.Git.Auth.CredentialManagerCore/CreativeCoders.Git.Auth.CredentialManagerCore.csproj @@ -5,8 +5,8 @@ - - + + diff --git a/source/Git/CreativeCoders.Git/CreativeCoders.Git.csproj b/source/Git/CreativeCoders.Git/CreativeCoders.Git.csproj index 4795f10..176c451 100644 --- a/source/Git/CreativeCoders.Git/CreativeCoders.Git.csproj +++ b/source/Git/CreativeCoders.Git/CreativeCoders.Git.csproj @@ -5,9 +5,9 @@ - - - + + + diff --git a/source/GitTool/CreativeCoders.GitTool.Base/CreativeCoders.GitTool.Base.csproj b/source/GitTool/CreativeCoders.GitTool.Base/CreativeCoders.GitTool.Base.csproj index 613a962..efd9da2 100644 --- a/source/GitTool/CreativeCoders.GitTool.Base/CreativeCoders.GitTool.Base.csproj +++ b/source/GitTool/CreativeCoders.GitTool.Base/CreativeCoders.GitTool.Base.csproj @@ -5,10 +5,10 @@ - - - - + + + + diff --git a/source/GitTool/CreativeCoders.GitTool.Cli.Commands/CreativeCoders.GitTool.Cli.Commands.csproj b/source/GitTool/CreativeCoders.GitTool.Cli.Commands/CreativeCoders.GitTool.Cli.Commands.csproj index 925be94..2720180 100644 --- a/source/GitTool/CreativeCoders.GitTool.Cli.Commands/CreativeCoders.GitTool.Cli.Commands.csproj +++ b/source/GitTool/CreativeCoders.GitTool.Cli.Commands/CreativeCoders.GitTool.Cli.Commands.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/source/GitTool/CreativeCoders.GitTool.Cli.GtApp/CreativeCoders.GitTool.Cli.GtApp.csproj b/source/GitTool/CreativeCoders.GitTool.Cli.GtApp/CreativeCoders.GitTool.Cli.GtApp.csproj index 6bd35e1..7a40e23 100644 --- a/source/GitTool/CreativeCoders.GitTool.Cli.GtApp/CreativeCoders.GitTool.Cli.GtApp.csproj +++ b/source/GitTool/CreativeCoders.GitTool.Cli.GtApp/CreativeCoders.GitTool.Cli.GtApp.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/source/GitTool/CreativeCoders.GitTool.GitHub/CreativeCoders.GitTool.GitHub.csproj b/source/GitTool/CreativeCoders.GitTool.GitHub/CreativeCoders.GitTool.GitHub.csproj index 579ed7a..6f334fe 100644 --- a/source/GitTool/CreativeCoders.GitTool.GitHub/CreativeCoders.GitTool.GitHub.csproj +++ b/source/GitTool/CreativeCoders.GitTool.GitHub/CreativeCoders.GitTool.GitHub.csproj @@ -5,10 +5,10 @@ - - - - + + + + diff --git a/source/GitTool/CreativeCoders.GitTool.GitLab/CreativeCoders.GitTool.GitLab.csproj b/source/GitTool/CreativeCoders.GitTool.GitLab/CreativeCoders.GitTool.GitLab.csproj index 0332cb7..2ae1c09 100644 --- a/source/GitTool/CreativeCoders.GitTool.GitLab/CreativeCoders.GitTool.GitLab.csproj +++ b/source/GitTool/CreativeCoders.GitTool.GitLab/CreativeCoders.GitTool.GitLab.csproj @@ -5,9 +5,9 @@ - - - + + + diff --git a/tests/CreativeCoders.Git.Auth.CredentialManagerCore.UnitTests/CreativeCoders.Git.Auth.CredentialManagerCore.UnitTests.csproj b/tests/CreativeCoders.Git.Auth.CredentialManagerCore.UnitTests/CreativeCoders.Git.Auth.CredentialManagerCore.UnitTests.csproj index 546ee84..03d79e6 100644 --- a/tests/CreativeCoders.Git.Auth.CredentialManagerCore.UnitTests/CreativeCoders.Git.Auth.CredentialManagerCore.UnitTests.csproj +++ b/tests/CreativeCoders.Git.Auth.CredentialManagerCore.UnitTests/CreativeCoders.Git.Auth.CredentialManagerCore.UnitTests.csproj @@ -5,24 +5,24 @@ - - - - - - + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/tests/CreativeCoders.Git.UnitTests/CreativeCoders.Git.UnitTests.csproj b/tests/CreativeCoders.Git.UnitTests/CreativeCoders.Git.UnitTests.csproj index b25d634..8a7dc83 100644 --- a/tests/CreativeCoders.Git.UnitTests/CreativeCoders.Git.UnitTests.csproj +++ b/tests/CreativeCoders.Git.UnitTests/CreativeCoders.Git.UnitTests.csproj @@ -5,23 +5,23 @@ - - - - - + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/tests/CreativeCoders.GitTool.GitHub.UnitTests/CreativeCoders.GitTool.GitHub.UnitTests.csproj b/tests/CreativeCoders.GitTool.GitHub.UnitTests/CreativeCoders.GitTool.GitHub.UnitTests.csproj index 2061174..32d8364 100644 --- a/tests/CreativeCoders.GitTool.GitHub.UnitTests/CreativeCoders.GitTool.GitHub.UnitTests.csproj +++ b/tests/CreativeCoders.GitTool.GitHub.UnitTests/CreativeCoders.GitTool.GitHub.UnitTests.csproj @@ -5,23 +5,23 @@ - - - - - + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/tests/CreativeCoders.GitTool.GitLab.UnitTests/CreativeCoders.GitTool.GitLab.UnitTests.csproj b/tests/CreativeCoders.GitTool.GitLab.UnitTests/CreativeCoders.GitTool.GitLab.UnitTests.csproj index e642bc3..681f234 100644 --- a/tests/CreativeCoders.GitTool.GitLab.UnitTests/CreativeCoders.GitTool.GitLab.UnitTests.csproj +++ b/tests/CreativeCoders.GitTool.GitLab.UnitTests/CreativeCoders.GitTool.GitLab.UnitTests.csproj @@ -5,23 +5,23 @@ - - - - - + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/tests/CreativeCoders.GitTool.Tests/CreativeCoders.GitTool.Tests.csproj b/tests/CreativeCoders.GitTool.Tests/CreativeCoders.GitTool.Tests.csproj index f81dccf..cc4bb43 100644 --- a/tests/CreativeCoders.GitTool.Tests/CreativeCoders.GitTool.Tests.csproj +++ b/tests/CreativeCoders.GitTool.Tests/CreativeCoders.GitTool.Tests.csproj @@ -10,23 +10,23 @@ - - - - - + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + From 176f429d1ddd366d4ac2b23ee4671928327e949c Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 28 Mar 2026 15:56:17 +0100 Subject: [PATCH 2/4] chore: add Dependabot configuration and workflows for automated dependency updates - Introduced `.github/dependabot.yml` to manage dependency update scheduling and grouping. - Added `dependabot-auto-merge.yml` for automating merges of minor and patch updates. - Added `dependabot-manual.yml` to enable manual dependency checks and updates. - Updated solution file to include new Dependabot configuration and workflows. --- .github/dependabot.yml | 55 +++++++++++++++++++++ .github/workflows/dependabot-auto-merge.yml | 40 +++++++++++++++ .github/workflows/dependabot-manual.yml | 54 ++++++++++++++++++++ GitTools.sln | 3 ++ 4 files changed, 152 insertions(+) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/dependabot-auto-merge.yml create mode 100644 .github/workflows/dependabot-manual.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..d191eda --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,55 @@ +version: 2 + +updates: + - package-ecosystem: "nuget" + directory: "/" + schedule: + interval: "weekly" + day: "monday" + time: "06:00" + timezone: "Europe/Berlin" + open-pull-requests-limit: 10 + groups: + # Tier 1: Dev/Test dependencies — auto-merge on patch + minor + dev-dependencies: + patterns: + - "xunit*" + - "XunitXml.TestLogger" + - "FakeItEasy" + - "AwesomeAssertions" + - "Microsoft.NET.Test.Sdk" + - "coverlet.collector" + - "JetBrains.Annotations" + - "Cake.*" + # Tier 2: Production dependencies — auto-merge on patch only + microsoft-packages: + patterns: + - "Microsoft.Extensions.*" + - "Microsoft.AspNetCore.*" + - "Microsoft.EntityFrameworkCore*" + - "Microsoft.CodeAnalysis.*" + - "Microsoft.JSInterop" + runtime-libraries: + patterns: + - "Castle.Core" + - "Polly" + - "Newtonsoft.Json" + - "NHibernate" + - "LiteDB" + - "System.IO.Abstractions*" + - "System.Reactive" + - "System.IO.Ports" + - "Spectre.Console" + - "Swashbuckle.AspNetCore" + - "MimeMapping" + - "Octokit" + - "YamlDotNet" + - "log4net" + # Catch-all: Any package not matched by the groups above. + # Dependabot assigns each package to the first matching group only, + # so this will never include packages already covered above. + other-dependencies: + patterns: + - "*" + labels: + - "dependencies" diff --git a/.github/workflows/dependabot-auto-merge.yml b/.github/workflows/dependabot-auto-merge.yml new file mode 100644 index 0000000..9859f0d --- /dev/null +++ b/.github/workflows/dependabot-auto-merge.yml @@ -0,0 +1,40 @@ +name: dependabot-auto-merge + +on: + pull_request: + +permissions: + contents: write + pull-requests: write + +jobs: + auto-merge: + runs-on: ubuntu-latest + if: github.actor == 'dependabot[bot]' + steps: + - name: Fetch Dependabot metadata + id: metadata + uses: dependabot/fetch-metadata@v2 + with: + github-token: "${{ secrets.GITHUB_TOKEN }}" + + # Tier 1: Dev/Test dependencies — auto-merge on patch + minor + - name: "Auto-merge Tier 1 (patch + minor)" + if: >- + steps.metadata.outputs.dependency-group == 'dev-dependencies' && + (steps.metadata.outputs.update-type == 'version-update:semver-patch' || + steps.metadata.outputs.update-type == 'version-update:semver-minor') + run: gh pr merge --auto --squash "$PR_URL" + env: + PR_URL: ${{ github.event.pull_request.html_url }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # Tier 2: Production dependencies — auto-merge on patch only + - name: "Auto-merge Tier 2 (patch only)" + if: >- + steps.metadata.outputs.dependency-group != 'dev-dependencies' && + steps.metadata.outputs.update-type == 'version-update:semver-patch' + run: gh pr merge --auto --squash "$PR_URL" + env: + PR_URL: ${{ github.event.pull_request.html_url }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/dependabot-manual.yml b/.github/workflows/dependabot-manual.yml new file mode 100644 index 0000000..df05cd6 --- /dev/null +++ b/.github/workflows/dependabot-manual.yml @@ -0,0 +1,54 @@ +name: dependabot-manual + +on: + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + check-outdated: + name: Check outdated NuGet packages + runs-on: ubuntu-latest + env: + TERM: xterm + DOTNET_SYSTEM_CONSOLE_ALLOW_ANSI_COLOR_REDIRECTION: 1 + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + + - name: 'Cache: ~/.nuget/packages' + uses: actions/cache@v4 + with: + path: | + ~/.nuget/packages + key: ${{ runner.os }}-${{ hashFiles('**/global.json', '**/*.csproj', '**/Directory.Packages.props') }} + + - name: Check for outdated packages + run: | + echo "## Outdated NuGet Packages" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + dotnet list package --outdated 2>&1 | tee -a $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + + - name: Trigger Dependabot update + run: | + set -euo pipefail + + echo "Triggering Dependabot update via GitHub CLI..." + if response=$(gh api \ + --method POST \ + "/repos/${{ github.repository }}/dependabot/updates" \ + --input - <<< '{}' 2>&1); then + echo "Dependabot trigger sent successfully." + echo "$response" + else + echo "Failed to trigger Dependabot update. gh api output:" + echo "$response" + exit 1 + fi + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/GitTools.sln b/GitTools.sln index c2092fd..492435c 100644 --- a/GitTools.sln +++ b/GitTools.sln @@ -51,6 +51,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "__global", "__global", "{95 README.md = README.md global.json = global.json Directory.Packages.props = Directory.Packages.props + .github\dependabot.yml = .github\dependabot.yml EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_setup", "_setup", "{A26D07EF-C593-41ED-AFD0-A2660857BEA6}" @@ -67,6 +68,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ci", "ci", "{E91F4387-0278- .github\workflows\pull-request.yml = .github\workflows\pull-request.yml .github\workflows\release.yml = .github\workflows\release.yml .github\workflows\sync-ai-config.yml = .github\workflows\sync-ai-config.yml + .github\workflows\dependabot-auto-merge.yml = .github\workflows\dependabot-auto-merge.yml + .github\workflows\dependabot-manual.yml = .github\workflows\dependabot-manual.yml EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{DE982092-6508-4062-99D5-6A6EE9ECB81F}" From d7ba5782ebac572cd987c1cedccce1dd950893f2 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 28 Mar 2026 15:58:15 +0100 Subject: [PATCH 3/4] chore(dependabot): clean up unused package patterns in configuration --- .github/dependabot.yml | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index d191eda..4adf064 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -20,31 +20,15 @@ updates: - "Microsoft.NET.Test.Sdk" - "coverlet.collector" - "JetBrains.Annotations" - - "Cake.*" # Tier 2: Production dependencies — auto-merge on patch only microsoft-packages: patterns: - "Microsoft.Extensions.*" - - "Microsoft.AspNetCore.*" - - "Microsoft.EntityFrameworkCore*" - - "Microsoft.CodeAnalysis.*" - - "Microsoft.JSInterop" runtime-libraries: patterns: - - "Castle.Core" - - "Polly" - "Newtonsoft.Json" - - "NHibernate" - - "LiteDB" - - "System.IO.Abstractions*" - - "System.Reactive" - - "System.IO.Ports" - "Spectre.Console" - - "Swashbuckle.AspNetCore" - - "MimeMapping" - "Octokit" - - "YamlDotNet" - - "log4net" # Catch-all: Any package not matched by the groups above. # Dependabot assigns each package to the first matching group only, # so this will never include packages already covered above. From 1e8348dbdcd98c1bc6b2000c31b34a368a50e1fc Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 28 Mar 2026 16:00:12 +0100 Subject: [PATCH 4/4] chore(dependabot): add new package patterns for CreativeCoders and runtime libraries --- .github/dependabot.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 4adf064..959b78e 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -18,17 +18,24 @@ updates: - "FakeItEasy" - "AwesomeAssertions" - "Microsoft.NET.Test.Sdk" - - "coverlet.collector" + - "coverlet.*" - "JetBrains.Annotations" + - "CreativeCoders.CakeBuild" # Tier 2: Production dependencies — auto-merge on patch only microsoft-packages: patterns: - "Microsoft.Extensions.*" + creativecoders-packages: + patterns: + - "CreativeCoders.*" runtime-libraries: patterns: + - "Devlooped.CredentialManager" + - "GitLabApiClient" + - "LibGit2Sharp" - "Newtonsoft.Json" - - "Spectre.Console" - "Octokit" + - "Spectre.Console" # Catch-all: Any package not matched by the groups above. # Dependabot assigns each package to the first matching group only, # so this will never include packages already covered above.