Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
74bd0e1
Add support for folders in exclusion list
Iridium-IO Aug 23, 2026
86e32c4
Switch skiplist tokeniser to use semicolon and comma instead of space…
Iridium-IO Aug 23, 2026
4582700
Updated skiplist editor to remove laggy tokenized box
Iridium-IO Aug 23, 2026
950032d
UI polish on skiplist editor
Iridium-IO Aug 23, 2026
0c379ee
Implement per-folder skiplist
Iridium-IO Aug 23, 2026
36bdc2a
Update UI around per-folder skiplist
Iridium-IO Aug 23, 2026
61ad7a2
Add tooltip. Naming still feels awkward though
Iridium-IO Aug 25, 2026
a5d3124
Fix overlapped (?) text on Settings page for long languages. Closes #615
Iridium-IO Aug 25, 2026
e6aea90
Fix spelling error
Iridium-IO Aug 25, 2026
4032a20
Update to .NET 10.0
Iridium-IO Aug 25, 2026
146338e
Add DirectStorage warning badge on the folder view. Close #641
Iridium-IO Aug 25, 2026
2a1bb61
Merge branch 'master' of https://github.com/IridiumIO/CompactGUI
Iridium-IO Aug 25, 2026
787b924
Implement a true portable mode (similar to PolyCut) if CompactGUi is …
Iridium-IO Aug 25, 2026
516d8c3
Delete old VB Core
Iridium-IO Aug 25, 2026
809e0ae
Move to README folder
Iridium-IO Aug 25, 2026
92f254a
Move to README folder
Iridium-IO Aug 25, 2026
2082f6a
Fix links to localized README files
Iridium-IO Aug 25, 2026
1ad3922
Revise README for clarity and additional features
Iridium-IO Aug 25, 2026
aeb53de
Fix DirectStorage check (whoops)
Iridium-IO Aug 26, 2026
3f94b56
Generalised DirectStorage check to work at any level in the folder tree
Iridium-IO Aug 26, 2026
b3c4fa6
Merge branch 'master' of https://github.com/IridiumIO/CompactGUI
Iridium-IO Aug 26, 2026
eb250e0
Merge upstream master while preserving custom fork baseline
marcmy Aug 26, 2026
6c8d0ff
Integrate upstream skip-list matching and DirectStorage detection
marcmy Aug 26, 2026
0a103f8
Remove obsolete projects and tokenized skip-list control
marcmy Aug 26, 2026
d833ba6
Adopt upstream skip-list UI, settings, localization, and docs
marcmy Aug 26, 2026
17e4ce1
Integrate portable settings without replacing custom bootstrap
marcmy Aug 26, 2026
08dc51a
Preserve resilient watcher state while adding per-folder skip lists
marcmy Aug 26, 2026
058f148
Apply per-folder exclusions to resilient background compression
marcmy Aug 26, 2026
9c4749e
Combine skip-list metrics with custom compression states
marcmy Aug 26, 2026
80d52b8
Persist upstream skip-list state in saved compression sessions
marcmy Aug 26, 2026
6a04708
Preserve per-folder exclusions across compression resume
marcmy Aug 26, 2026
44fdb6a
Merge per-folder skip semantics into custom compression service
marcmy Aug 26, 2026
875a47b
Wire upstream skip-list UI while preserving charcoal theming
marcmy Aug 26, 2026
2aaa845
Preserve detailed compression UI while integrating skip-list state
marcmy Aug 26, 2026
cc5fadb
Use portable-aware Steam cache while preserving DirectStorage warning
marcmy Aug 26, 2026
130a39d
Merge watcher skip lists into custom home/resume orchestration
marcmy Aug 26, 2026
9311664
Provide neutral fallbacks for upstream skip-list localization
marcmy Aug 26, 2026
ee90e34
Add DirectStorage badge without replacing custom folder layout
marcmy Aug 26, 2026
21008bb
Persist watcher skip-list enabled state
marcmy Aug 26, 2026
9d54533
Keep watcher exclusions aligned with foreground compression
marcmy Aug 26, 2026
74575e4
Preserve legacy watcher exclusions when no per-folder list exists
marcmy Aug 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion CompactGUI.Core/Analyser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public sealed class Analyser : IDisposable
private readonly FolderChangeMonitor _folderMonitor;
public bool HasFolderChanged => _folderMonitor.HasChanged;
public DateTime LastFolderChanged => _folderMonitor.LastChanged;
public bool IsDirectStorage { get; private set; }


public Analyser(string folder, ILogger<Analyser> logger)
Expand Down Expand Up @@ -65,12 +66,18 @@ private static bool GetContainsCompressedFiles(List<AnalysedFileDetails> fileCom
{

List<AnalysedFileDetails>? AnalysedFileDetails;
IsDirectStorage = false;

AnalyserLog.StartingAnalysis(_logger, FolderName);
Stopwatch sw = Stopwatch.StartNew();
try
{
var allFiles = await Task.Run(() => Directory.EnumerateFiles(FolderName, "*", new EnumerationOptions { RecurseSubdirectories = true, IgnoreInaccessible = true, AttributesToSkip = FileAttributes.ReparsePoint }).AsShortPathNames(), cancellationToken).ConfigureAwait(false);
var allFiles = (await Task.Run(() => Directory.EnumerateFiles(FolderName, "*", new EnumerationOptions { RecurseSubdirectories = true, IgnoreInaccessible = true, AttributesToSkip = FileAttributes.ReparsePoint }), cancellationToken).ConfigureAwait(false))
.AsShortPathNames()
.ToList();

IsDirectStorage = allFiles.Any(f => Path.GetFileName(f).Equals("dstorage.dll", StringComparison.OrdinalIgnoreCase));

var fileDetails = allFiles
.AsParallel()
.WithCancellation(cancellationToken)
Expand Down
1 change: 1 addition & 0 deletions CompactGUI.Core/CompactGUI.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
<ItemGroup>
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
<PackageReference Include="K4os.Compression.LZ4.Streams" Version="1.3.8" />
<PackageReference Include="Microsoft.Extensions.FileSystemGlobbing" Version="10.0.11" />
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.321">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
Expand Down
7 changes: 5 additions & 2 deletions CompactGUI.Core/Compactor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -308,15 +308,18 @@ public async Task<IEnumerable<FileDetails>> BuildWorkingFilesList(IReadOnlyColle
uint clusterSize = SharedMethods.GetClusterSize(workingDirectory);

var analysedFiles = await _analyser.GetAnalysedFilesAsync(cancellationTokenSource.Token) ?? [];
var excludedFiles = SkipListMatcher.GetExcludedFiles(
workingDirectory,
analysedFiles.Select(fl => fl.FileName),
excludedFilesAndExtensions);

return analysedFiles
.Where(fl =>
fl.CompressionMode != wofCompressionAlgorithm
&& !resumeExcludedFiles.Contains(fl.FileName)
&& !notBeneficialCache.ShouldSkip(fl.FileName, wofCompressionAlgorithm)
&& fl.UncompressedSize > clusterSize
&& (fl.FileInfo == null || !excludedFilesAndExtensions.Contains(fl.FileInfo.Extension))
&& !excludedFilesAndExtensions.Contains(fl.FileName)
&& !excludedFiles.Contains(fl.FileName)
)
.Select(fl => new FileDetails(fl.FileName, fl.UncompressedSize, fl.CompressionMode))
.ToList();
Expand Down
75 changes: 75 additions & 0 deletions CompactGUI.Core/SkipListMatcher.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
using Microsoft.Extensions.FileSystemGlobbing;

namespace CompactGUI.Core;

public static class SkipListMatcher
{
public static HashSet<string> GetExcludedFiles(string rootDirectory, IEnumerable<string> allFiles, IEnumerable<string> patterns)
{
var excluded = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
if (!patterns.Any()) return excluded;

var matcher = new Matcher(StringComparison.OrdinalIgnoreCase);
foreach (string glob in NormalisePatterns(patterns, rootDirectory))
{
matcher.AddInclude(glob);
}

var relativeFiles = allFiles.Select(f => Path.GetRelativePath(rootDirectory, f).Replace('\\', '/'));

foreach (FilePatternMatch match in matcher.Match(relativeFiles).Files)
{
excluded.Add(Path.GetFullPath(Path.Combine(rootDirectory, match.Path)));
}

return excluded;
}

private static IEnumerable<string> NormalisePatterns(IEnumerable<string> entries, string rootDirectory)
{
foreach (string entry in entries)
{
string pattern = entry.Trim().Trim(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
if (pattern.Length == 0) continue;

if (Path.IsPathRooted(pattern))
{
try
{
string relative = Path.GetRelativePath(rootDirectory, pattern).Replace('\\', '/');
if (!relative.StartsWith("../", StringComparison.Ordinal) && relative != "..")
{
pattern = relative;
}
}
catch (ArgumentException)
{
// Unrelated roots; leave as-is (won't match).
}
}

bool hasWildcard = pattern.Contains('*') || pattern.Contains('?');
bool hasSeparator = pattern.Contains(Path.DirectorySeparatorChar) || pattern.Contains(Path.AltDirectorySeparatorChar);

if (!hasSeparator && IsExtensionPattern(pattern))
{
yield return "**/*" + (pattern.StartsWith('.') ? pattern : pattern[1..]);
}
else if (!hasWildcard && !hasSeparator)
{
yield return "**/" + pattern;
}
else
{
yield return NormalisePath(pattern);
}
}
}

private static bool IsExtensionPattern(string pattern)
{
return pattern.StartsWith('.') || pattern.StartsWith("*.");
}

private static string NormalisePath(string path) => path.Replace(Path.DirectorySeparatorChar, '/').Replace(Path.AltDirectorySeparatorChar, '/');
}
172 changes: 0 additions & 172 deletions CompactGUI.CoreVB/Analyser.vb

This file was deleted.

24 changes: 0 additions & 24 deletions CompactGUI.CoreVB/CompactGUI.CoreVB.vbproj

This file was deleted.

Loading
Loading