Skip to content

Commit 79e7367

Browse files
committed
Testing - V3.1.0
1 parent c398bb0 commit 79e7367

16 files changed

Lines changed: 322 additions & 178 deletions

.github/workflows/publish-release.yml

Lines changed: 106 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,13 @@ on:
99
- main
1010

1111
jobs:
12-
# ── Decide whether this push should trigger a release ──────────────────────
13-
# A step's own exit code does NOT skip later steps in the same job — only an
14-
# `if:` on those later steps (or a job-level `if:`) does. This job exists so
15-
# the entire build/release job can be gated with one job-level `if:` instead.
1612
gate:
1713
name: Check commit message
1814
runs-on: windows-latest
1915
outputs:
2016
should_release: ${{ steps.decide.outputs.should_release }}
2117
version: ${{ steps.decide.outputs.version }}
18+
is_prerelease: ${{ steps.decide.outputs.is_prerelease }}
2219
steps:
2320
- name: Checkout repo
2421
uses: actions/checkout@v4
@@ -30,37 +27,38 @@ jobs:
3027
COMMIT_MSG=$(git log -1 --pretty=%B)
3128
echo "Commit message: $COMMIT_MSG"
3229
33-
if echo "$COMMIT_MSG" | grep -qiE 'testing|dev|development'; then
34-
echo "Commit marked Testing/Dev/Development — skipping release."
35-
echo "should_release=false" >> $GITHUB_OUTPUT
36-
exit 0
37-
fi
38-
3930
VERSION=$(echo "$COMMIT_MSG" | grep -o 'V[0-9]\+\.[0-9]\+\.[0-9]\+' || true)
4031
if [ -z "$VERSION" ]; then
4132
echo "No version found in commit message — skipping release."
4233
echo "should_release=false" >> $GITHUB_OUTPUT
4334
exit 0
4435
fi
4536
46-
echo "Releasing $VERSION"
37+
if echo "$COMMIT_MSG" | grep -qiE 'testing|dev|development'; then
38+
echo "Commit marked Testing/Dev/Development — releasing $VERSION as a pre-release."
39+
echo "is_prerelease=true" >> $GITHUB_OUTPUT
40+
else
41+
echo "Releasing $VERSION as the latest stable release."
42+
echo "is_prerelease=false" >> $GITHUB_OUTPUT
43+
fi
44+
4745
echo "should_release=true" >> $GITHUB_OUTPUT
4846
echo "version=$VERSION" >> $GITHUB_OUTPUT
4947
50-
# ── Build and publish, only when the gate says so ───────────────────────────
5148
release:
5249
name: Build & Release
5350
needs: gate
5451
if: needs.gate.outputs.should_release == 'true'
5552
runs-on: windows-latest
5653
permissions:
5754
contents: write
55+
env:
56+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
5857

5958
steps:
6059
- name: Checkout repo
6160
uses: actions/checkout@v4
6261

63-
# ── Inject version into all three .csproj files ───────────────────────
6462
- name: Set version in .csproj files
6563
shell: pwsh
6664
run: |
@@ -72,16 +70,12 @@ jobs:
7270
Write-Host "Set <Version> to $ver in $path"
7371
}
7472
75-
# ── Setup .NET ──────────────────────────────────────────────────────────
7673
- name: Setup .NET
7774
uses: actions/setup-dotnet@v4
7875
with:
7976
dotnet-version: "9.0.x"
8077

81-
# ── Build GUI — all three targets ─────────────────────────────────────
82-
# Note: the GUI is now WinUI 3 (Windows App SDK), which does not support
83-
# PublishSingleFile — it ships as a self-contained folder, zipped below.
84-
- name: Build GUI win-x64
78+
- name: Publish GUI win-x64
8579
shell: pwsh
8680
run: |
8781
dotnet publish QuickA-Cleanup-GUI\QuickA-Cleanup-GUI.csproj `
@@ -91,9 +85,9 @@ jobs:
9185
-p:WindowsPackageType=None `
9286
-p:DebugType=None `
9387
-p:DebugSymbols=false `
94-
-o publish/gui/win-x64
88+
-o publish/gui-x64
9589
96-
- name: Build GUI win-x86
90+
- name: Publish GUI win-x86
9791
shell: pwsh
9892
run: |
9993
dotnet publish QuickA-Cleanup-GUI\QuickA-Cleanup-GUI.csproj `
@@ -105,7 +99,7 @@ jobs:
10599
-p:DebugSymbols=false `
106100
-o publish/gui/win-x86
107101
108-
- name: Build GUI win-arm64
102+
- name: Publish GUI win-arm64
109103
shell: pwsh
110104
run: |
111105
dotnet publish QuickA-Cleanup-GUI\QuickA-Cleanup-GUI.csproj `
@@ -117,7 +111,6 @@ jobs:
117111
-p:DebugSymbols=false `
118112
-o publish/gui/win-arm64
119113
120-
# ── Build CLI — all three targets ─────────────────────────────────────
121114
- name: Build CLI win-x64
122115
shell: pwsh
123116
run: |
@@ -160,56 +153,105 @@ jobs:
160153
-p:DebugSymbols=false `
161154
-o publish/cli/win-arm64
162155
163-
# ── Package binaries ────────────────────────────────────────────────────
164-
# GUI (WinUI 3) ships as a zipped self-contained folder per architecture.
165-
# CLI stays a single-file .exe per architecture, as before.
166-
- name: Package binaries
156+
- name: Package zips and CLI exes
167157
shell: pwsh
168158
run: |
169159
$v = "${{ needs.gate.outputs.version }}"
170160
171-
Compress-Archive -Path publish/gui/win-x64/* -DestinationPath "QuickA-Cleanup-GUI-${v}-win-x64.zip"
172161
Compress-Archive -Path publish/gui/win-x86/* -DestinationPath "QuickA-Cleanup-GUI-${v}-win-x86.zip"
173162
Compress-Archive -Path publish/gui/win-arm64/* -DestinationPath "QuickA-Cleanup-GUI-${v}-win-arm64.zip"
174163
175164
Copy-Item publish/cli/win-x64/QuickA-Cleanup-CLI.exe "QuickA-Cleanup-CLI-${v}-win-x64.exe"
176165
Copy-Item publish/cli/win-x86/QuickA-Cleanup-CLI.exe "QuickA-Cleanup-CLI-${v}-win-x86.exe"
177166
Copy-Item publish/cli/win-arm64/QuickA-Cleanup-CLI.exe "QuickA-Cleanup-CLI-${v}-win-arm64.exe"
178167
179-
# ── Create GitHub Release ───────────────────────────────────────────────
180-
- name: Create GitHub Release
181-
uses: ncipollo/release-action@v1
182-
with:
183-
tag: ${{ needs.gate.outputs.version }}
184-
name: "QuickA-Cleanup"
185-
body: |
186-
## QuickA-Cleanup ${{ needs.gate.outputs.version }}
187-
Smart Quick Access Navigation Pane cleaner for Windows Explorer.
188-
189-
---
190-
191-
## ✨ Socials & Stars
192-
[![Discord](https://img.shields.io/badge/Discord-Server%20Invite-7289DA?style=for-the-badge&logo=discord&logoColor=white&labelColor=1c1917&color=blueviolet)](https://rb.ash1421.com/discord)
193-
[![GitHub Stars](https://img.shields.io/github/stars/Ash1421/QuickA-Cleanup?style=for-the-badge&logo=github&logoColor=white&labelColor=1c1917&color=gold)](https://github.com/Ash1421/QuickA-Cleanup/stargazers)
194-
195-
## 📦 Repository Info
196-
[![Version](https://img.shields.io/badge/Version-${{ needs.gate.outputs.version }}-6829B1?style=for-the-badge&label=Version&logo=github&logoColor=white&labelColor=1c1917)](https://github.com/Ash1421/QuickA-Cleanup/releases/tag/${{ needs.gate.outputs.version }})
197-
[![Latest Release](https://img.shields.io/github/v/release/Ash1421/QuickA-Cleanup?style=for-the-badge&label=Latest%20Version&logo=github&logoColor=white&labelColor=1c1917&color=6829B1)](https://github.com/Ash1421/QuickA-Cleanup/releases/latest)
198-
[![CodeFactor](https://img.shields.io/codefactor/grade/github/ash1421/QuickA-Cleanup?style=for-the-badge&logo=codefactor&logoColor=white&labelColor=1c1917&color=6829B1)](https://www.codefactor.io/repository/github/ash1421/QuickA-Cleanup)
199-
[![Total Downloads](https://img.shields.io/github/downloads/Ash1421/QuickA-Cleanup/total?style=for-the-badge&logo=github&logoColor=white&labelColor=1c1917&color=6829B1&label=Total%20Downloads)](https://github.com/Ash1421/QuickA-Cleanup/releases)
200-
[![Downloads @ Latest](https://img.shields.io/github/downloads/Ash1421/QuickA-Cleanup/latest/total?style=for-the-badge&logo=github&logoColor=white&labelColor=1c1917&color=6829B1&label=Downloads%20%40%20Latest)](https://github.com/Ash1421/QuickA-Cleanup/releases/latest)
201-
[![Open Issues](https://img.shields.io/github/issues/Ash1421/QuickA-Cleanup/open?style=for-the-badge&labelColor=1c1917&logo=github&logoColor=white)](https://github.com/Ash1421/QuickA-Cleanup/issues)
202-
[![Closed Issues](https://img.shields.io/github/issues-closed/Ash1421/QuickA-Cleanup/closed?style=for-the-badge&color=red&labelColor=1c1917&logo=github&logoColor=white)](https://github.com/Ash1421/QuickA-Cleanup/issues?q=is:closed)
203-
[![New Issue](https://img.shields.io/badge/Open%20A%20New-Issue-orange?style=for-the-badge&labelColor=1c1917&logo=github&logoColor=white)](https://github.com/Ash1421/QuickA-Cleanup/issues/new)
204-
205-
## 📜 License
206-
[![License: GPL v3.0](https://img.shields.io/badge/License-GPL%20v3.0-6829B1.svg?style=for-the-badge&labelColor=1c1917&logo=gnu&logoColor=white)](./LICENSE)
207-
208-
artifacts: |
209-
QuickA-Cleanup-GUI-${{ needs.gate.outputs.version }}-win-x64.zip
210-
QuickA-Cleanup-GUI-${{ needs.gate.outputs.version }}-win-x86.zip
211-
QuickA-Cleanup-GUI-${{ needs.gate.outputs.version }}-win-arm64.zip
212-
QuickA-Cleanup-CLI-${{ needs.gate.outputs.version }}-win-x64.exe
213-
QuickA-Cleanup-CLI-${{ needs.gate.outputs.version }}-win-x86.exe
214-
QuickA-Cleanup-CLI-${{ needs.gate.outputs.version }}-win-arm64.exe
215-
makeLatest: true
168+
- name: Install vpk
169+
run: dotnet tool install -g vpk
170+
171+
- name: Download previous Velopack release
172+
shell: pwsh
173+
continue-on-error: true
174+
run: |
175+
vpk download github --repoUrl https://github.com/${{ github.repository }} --channel win-x64 --token ${{ secrets.GITHUB_TOKEN }}
176+
177+
- name: Pack Velopack release (win-x64)
178+
shell: pwsh
179+
run: |
180+
$ver = "${{ needs.gate.outputs.version }}" -replace '^V',''
181+
vpk pack `
182+
--packId QuickA-Cleanup `
183+
--packVersion $ver `
184+
--packDir publish\gui-x64 `
185+
--mainExe QuickA-Cleanup-GUI.exe `
186+
--packTitle "QuickA-Cleanup" `
187+
--channel win-x64 `
188+
--runtime win-x64
189+
190+
- name: Upload Velopack release to GitHub
191+
shell: pwsh
192+
run: |
193+
vpk upload github `
194+
--repoUrl https://github.com/${{ github.repository }} `
195+
--channel win-x64 `
196+
--token ${{ secrets.GITHUB_TOKEN }} `
197+
--publish `
198+
--releaseName "QuickA-Cleanup ${{ needs.gate.outputs.version }}" `
199+
--tag ${{ needs.gate.outputs.version }}
200+
201+
- name: Attach zips/CLI exes to the release
202+
shell: pwsh
203+
run: |
204+
$v = "${{ needs.gate.outputs.version }}"
205+
gh release upload $v `
206+
"QuickA-Cleanup-GUI-${v}-win-x86.zip" `
207+
"QuickA-Cleanup-GUI-${v}-win-arm64.zip" `
208+
"QuickA-Cleanup-CLI-${v}-win-x64.exe" `
209+
"QuickA-Cleanup-CLI-${v}-win-x86.exe" `
210+
"QuickA-Cleanup-CLI-${v}-win-arm64.exe" `
211+
--clobber
212+
213+
- name: Set release notes
214+
shell: pwsh
215+
run: |
216+
$v = "${{ needs.gate.outputs.version }}"
217+
$isPrerelease = "${{ needs.gate.outputs.is_prerelease }}" -eq "true"
218+
219+
$warning = ""
220+
$title = "QuickA-Cleanup $v"
221+
if ($isPrerelease) {
222+
$warning = "> ⚠️ **This is a testing/development build, not production-ready.** It may be unstable, incomplete, or contain bugs. Auto-update will not offer this to regular users on the stable channel.`n`n"
223+
$title = "QuickA-Cleanup $v (Testing)"
224+
}
225+
226+
@"
227+
$warning## QuickA-Cleanup $v
228+
Smart Quick Access Navigation Pane cleaner for Windows Explorer.
229+
230+
The GUI (win-x64) installs via the QuickA-Cleanup-Setup.exe below, and will auto-update itself from here on.
231+
win-x86 / win-arm64 GUI builds and all CLI builds are portable — extract/run directly, no installer.
232+
233+
---
234+
235+
## ✨ Socials & Stars
236+
[![Discord](https://img.shields.io/badge/Discord-Server%20Invite-7289DA?style=for-the-badge&logo=discord&logoColor=white&labelColor=1c1917&color=blueviolet)](https://rb.ash1421.com/discord)
237+
[![GitHub Stars](https://img.shields.io/github/stars/Ash1421/QuickA-Cleanup?style=for-the-badge&logo=github&logoColor=white&labelColor=1c1917&color=gold)](https://github.com/Ash1421/QuickA-Cleanup/stargazers)
238+
239+
## 📦 Repository Info
240+
[![Version](https://img.shields.io/badge/Version-$v-6829B1?style=for-the-badge&label=Version&logo=github&logoColor=white&labelColor=1c1917)](https://github.com/Ash1421/QuickA-Cleanup/releases/tag/$v)
241+
[![Latest Release](https://img.shields.io/github/v/release/Ash1421/QuickA-Cleanup?style=for-the-badge&label=Latest%20Version&logo=github&logoColor=white&labelColor=1c1917&color=6829B1)](https://github.com/Ash1421/QuickA-Cleanup/releases/latest)
242+
[![CodeFactor](https://img.shields.io/codefactor/grade/github/ash1421/QuickA-Cleanup?style=for-the-badge&logo=codefactor&logoColor=white&labelColor=1c1917&color=6829B1)](https://www.codefactor.io/repository/github/ash1421/QuickA-Cleanup)
243+
[![Total Downloads](https://img.shields.io/github/downloads/Ash1421/QuickA-Cleanup/total?style=for-the-badge&logo=github&logoColor=white&labelColor=1c1917&color=6829B1&label=Total%20Downloads)](https://github.com/Ash1421/QuickA-Cleanup/releases)
244+
[![Downloads @ Latest](https://img.shields.io/github/downloads/Ash1421/QuickA-Cleanup/latest/total?style=for-the-badge&logo=github&logoColor=white&labelColor=1c1917&color=6829B1&label=Downloads%20%40%20Latest)](https://github.com/Ash1421/QuickA-Cleanup/releases/latest)
245+
[![Open Issues](https://img.shields.io/github/issues/Ash1421/QuickA-Cleanup/open?style=for-the-badge&labelColor=1c1917&logo=github&logoColor=white)](https://github.com/Ash1421/QuickA-Cleanup/issues)
246+
[![Closed Issues](https://img.shields.io/github/issues-closed/Ash1421/QuickA-Cleanup/closed?style=for-the-badge&color=red&labelColor=1c1917&logo=github&logoColor=white)](https://github.com/Ash1421/QuickA-Cleanup/issues?q=is:closed)
247+
[![New Issue](https://img.shields.io/badge/Open%20A%20New-Issue-orange?style=for-the-badge&labelColor=1c1917&logo=github&logoColor=white)](https://github.com/Ash1421/QuickA-Cleanup/issues/new)
248+
249+
## 📜 License
250+
[![License: GPL v3.0](https://img.shields.io/badge/License-GPL%20v3.0-6829B1.svg?style=for-the-badge&labelColor=1c1917&logo=gnu&logoColor=white)](./LICENSE)
251+
"@ | Out-File -FilePath notes.md -Encoding utf8
252+
253+
if ($isPrerelease) {
254+
gh release edit $v --prerelease --latest=false --notes-file notes.md --title $title
255+
} else {
256+
gh release edit $v --latest --notes-file notes.md --title $title
257+
}

Core/Core.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<RootNamespace>QuickA_Cleanup.Core</RootNamespace>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
8-
<Version>3.0.1</Version>
8+
<Version>3.1.0</Version>
99
<Authors>Ash1421</Authors>
1010
<Copyright>Copyright (c) 2026 Ash1421</Copyright>
1111
<SupportedOSPlatformVersion>7.0</SupportedOSPlatformVersion>

QuickA-Cleanup-CLI/QuickA-Cleanup-CLI.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<AssemblyName>QuickA-Cleanup-CLI</AssemblyName>
77
<ImplicitUsings>enable</ImplicitUsings>
88
<Nullable>enable</Nullable>
9-
<Version>3.0.1</Version>
9+
<Version>3.1.0</Version>
1010
<Authors>Ash1421</Authors>
1111
<Copyright>Copyright (c) 2026 Ash1421</Copyright>
1212
<ApplicationManifest>app.manifest</ApplicationManifest>

QuickA-Cleanup-GUI/App.xaml

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,10 @@
99
<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
1010
</ResourceDictionary.MergedDictionaries>
1111

12-
<!-- Accent brushes: colour is mutated at runtime by ThemeManager.ApplyAccent
13-
so every control bound to these updates live, without restarting the app. -->
1412
<SolidColorBrush x:Key="AccentBrush" Color="#7C3AED"/>
1513
<SolidColorBrush x:Key="AccentBrushSubtle" Color="#7C3AED" Opacity="0.14"/>
1614
<SolidColorBrush x:Key="AccentForegroundBrush" Color="White"/>
1715

18-
<!-- These specific keys are what native Fluent controls (CheckBox, RadioButton,
19-
ToggleSwitch, ...) actually bind to for their checked/on-state fill —
20-
overwriting "SystemAccentColor" alone does NOT reach them, because
21-
XamlControlsResources bakes these from the real OS accent the moment it's
22-
merged above. Defining our own copies here, at the root dictionary, shadows
23-
the built-in ones for every control created afterwards. -->
2416
<SolidColorBrush x:Key="AccentFillColorDefaultBrush" Color="#7C3AED"/>
2517
<SolidColorBrush x:Key="AccentFillColorSecondaryBrush" Color="#7C3AED"/>
2618
<SolidColorBrush x:Key="AccentFillColorTertiaryBrush" Color="#7C3AED"/>

QuickA-Cleanup-GUI/App.xaml.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
using Microsoft.UI.Xaml;
2+
using Velopack;
23

34
namespace QuickA_Cleanup.GUI;
45

5-
/// <summary>
6-
/// Application entry point. Loads persisted UI settings (theme + accent colour)
7-
/// before the window is created so there's no flash of default styling.
8-
/// </summary>
96
public partial class App : Application
107
{
118
public static MainWindow? MainWin { get; private set; }
129

1310
public App()
1411
{
12+
VelopackApp.Build().Run();
13+
1514
InitializeComponent();
1615
}
1716

@@ -22,5 +21,7 @@ protected override void OnLaunched(LaunchActivatedEventArgs args)
2221

2322
MainWin = new MainWindow();
2423
MainWin.Activate();
24+
25+
UpdateService.CheckSilentlyOnStartup();
2526
}
2627
}

QuickA-Cleanup-GUI/GUI/AppSettings.cs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,12 @@
33

44
namespace QuickA_Cleanup.GUI;
55

6-
/// <summary>
7-
/// Small persisted, non-appearance app settings (things that live under a
8-
/// "Developer" section rather than "Appearance"). Kept separate from
9-
/// ThemeManager since these are behavioural toggles, not theming.
10-
/// </summary>
116
public static class AppSettings
127
{
138
private static readonly string SettingsPath = Path.Combine(
149
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
1510
"QuickA-Cleanup", "app-settings.json");
1611

17-
/// <summary>
18-
/// Whether Explorer is restarted after a real (non-dry-run) removal.
19-
/// Enabled by default — turning this off means removed entries won't
20-
/// disappear from the navigation pane until Explorer is restarted some
21-
/// other way, so it's flagged as not recommended in the UI.
22-
/// </summary>
2312
public static bool RestartExplorerAfterRemoval { get; set; } = true;
2413

2514
private class Persisted
@@ -40,7 +29,6 @@ public static void Load()
4029
}
4130
catch
4231
{
43-
// Fall back to defaults — never block startup on a corrupt settings file.
4432
}
4533
}
4634

@@ -56,7 +44,6 @@ public static void Save()
5644
}
5745
catch
5846
{
59-
// Never crash the app over a settings write failure.
6047
}
6148
}
6249
}

QuickA-Cleanup-GUI/GUI/ItemViewModel.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@
66

77
namespace QuickA_Cleanup.GUI;
88

9-
/// <summary>
10-
/// Thin UI wrapper around a scanned <see cref="QuickAccessItem"/>: adds the
11-
/// selection checkbox state and the badge colours the list row displays.
12-
/// </summary>
139
public class ItemViewModel : INotifyPropertyChanged
1410
{
1511
public QuickAccessItem Item { get; }
@@ -46,7 +42,6 @@ public bool IsSelected
4642
}
4743
}
4844

49-
/// <summary>Raised whenever IsSelected changes, so the owning window can refresh its count/enabled state.</summary>
5045
public event Action? SelectionChanged;
5146

5247
public event PropertyChangedEventHandler? PropertyChanged;

0 commit comments

Comments
 (0)