From f0da1b3a93efd024c4ea21936a7787bad6d82c70 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Tue, 10 Feb 2026 15:32:23 +0000 Subject: [PATCH] Consolidate --- .../Archives/GZip/GZipArchive.cs | 6 +++- .../Archives/Zip/ZipArchive.Async.cs | 7 +++- src/SharpCompress/Archives/Zip/ZipArchive.cs | 7 +++- .../Common/GZip/GZipEntry.Async.cs | 4 ++- src/SharpCompress/Common/GZip/GZipEntry.cs | 5 ++- .../Common/GZip/GZipFilePart.Async.cs | 11 +----- src/SharpCompress/Common/GZip/GZipFilePart.cs | 34 +++---------------- .../Common/Options/IReaderOptions.cs | 6 ++-- .../Common/Options/IWriterOptions.cs | 7 ++-- .../Common/Zip/SeekableZipFilePart.cs | 9 +---- .../Common/Zip/StreamingZipFilePart.cs | 5 +-- src/SharpCompress/Common/Zip/ZipFilePart.cs | 30 ++++------------ src/SharpCompress/Readers/ReaderOptions.cs | 9 ++--- src/SharpCompress/Readers/Tar/TarReader.cs | 3 +- .../Readers/Zip/ZipReader.Async.cs | 16 ++++----- src/SharpCompress/Readers/Zip/ZipReader.cs | 8 +++-- src/SharpCompress/Writers/GZip/GZipWriter.cs | 6 ++-- .../Writers/GZip/GZipWriterOptions.cs | 10 +++--- src/SharpCompress/Writers/Tar/TarWriter.cs | 3 +- .../Writers/Tar/TarWriterOptions.cs | 10 +++--- src/SharpCompress/Writers/WriterOptions.cs | 8 ++--- src/SharpCompress/Writers/Zip/ZipWriter.cs | 4 +-- .../Writers/Zip/ZipWriterOptions.cs | 10 +++--- .../CompressionProviderTests.cs | 7 ++-- 24 files changed, 92 insertions(+), 133 deletions(-) diff --git a/src/SharpCompress/Archives/GZip/GZipArchive.cs b/src/SharpCompress/Archives/GZip/GZipArchive.cs index 56f61fa5..563f8193 100644 --- a/src/SharpCompress/Archives/GZip/GZipArchive.cs +++ b/src/SharpCompress/Archives/GZip/GZipArchive.cs @@ -87,7 +87,11 @@ public partial class GZipArchive var stream = volumes.Single().Stream; yield return new GZipArchiveEntry( this, - GZipFilePart.Create(stream, ReaderOptions.ArchiveEncoding), + GZipFilePart.Create( + stream, + ReaderOptions.ArchiveEncoding, + ReaderOptions.CompressionProviders + ), ReaderOptions ); } diff --git a/src/SharpCompress/Archives/Zip/ZipArchive.Async.cs b/src/SharpCompress/Archives/Zip/ZipArchive.Async.cs index c8139b06..dc568887 100644 --- a/src/SharpCompress/Archives/Zip/ZipArchive.Async.cs +++ b/src/SharpCompress/Archives/Zip/ZipArchive.Async.cs @@ -55,7 +55,12 @@ public partial class ZipArchive yield return new ZipArchiveEntry( this, - new SeekableZipFilePart(headerFactory.NotNull(), deh, s), + new SeekableZipFilePart( + headerFactory.NotNull(), + deh, + s, + ReaderOptions.CompressionProviders + ), ReaderOptions ); } diff --git a/src/SharpCompress/Archives/Zip/ZipArchive.cs b/src/SharpCompress/Archives/Zip/ZipArchive.cs index 8fc423bd..5585e61c 100644 --- a/src/SharpCompress/Archives/Zip/ZipArchive.cs +++ b/src/SharpCompress/Archives/Zip/ZipArchive.cs @@ -96,7 +96,12 @@ public partial class ZipArchive yield return new ZipArchiveEntry( this, - new SeekableZipFilePart(headerFactory.NotNull(), deh, s), + new SeekableZipFilePart( + headerFactory.NotNull(), + deh, + s, + ReaderOptions.CompressionProviders + ), ReaderOptions ); } diff --git a/src/SharpCompress/Common/GZip/GZipEntry.Async.cs b/src/SharpCompress/Common/GZip/GZipEntry.Async.cs index bdd56dd2..d4c0e044 100644 --- a/src/SharpCompress/Common/GZip/GZipEntry.Async.cs +++ b/src/SharpCompress/Common/GZip/GZipEntry.Async.cs @@ -12,7 +12,9 @@ public partial class GZipEntry ) { yield return new GZipEntry( - await GZipFilePart.CreateAsync(stream, options.ArchiveEncoding).ConfigureAwait(false), + await GZipFilePart + .CreateAsync(stream, options.ArchiveEncoding, options.CompressionProviders) + .ConfigureAwait(false), options ); } diff --git a/src/SharpCompress/Common/GZip/GZipEntry.cs b/src/SharpCompress/Common/GZip/GZipEntry.cs index f3d41c45..dd84db20 100644 --- a/src/SharpCompress/Common/GZip/GZipEntry.cs +++ b/src/SharpCompress/Common/GZip/GZipEntry.cs @@ -46,7 +46,10 @@ public partial class GZipEntry : Entry internal static IEnumerable GetEntries(Stream stream, ReaderOptions options) { - yield return new GZipEntry(GZipFilePart.Create(stream, options.ArchiveEncoding), options); + yield return new GZipEntry( + GZipFilePart.Create(stream, options.ArchiveEncoding, options.CompressionProviders), + options + ); } // Async methods moved to GZipEntry.Async.cs diff --git a/src/SharpCompress/Common/GZip/GZipFilePart.Async.cs b/src/SharpCompress/Common/GZip/GZipFilePart.Async.cs index b65f81fa..8760b552 100644 --- a/src/SharpCompress/Common/GZip/GZipFilePart.Async.cs +++ b/src/SharpCompress/Common/GZip/GZipFilePart.Async.cs @@ -15,16 +15,7 @@ internal sealed partial class GZipFilePart internal static async ValueTask CreateAsync( Stream stream, IArchiveEncoding archiveEncoding, - CancellationToken cancellationToken = default - ) - { - return await CreateAsync(stream, archiveEncoding, null, cancellationToken); - } - - internal static async ValueTask CreateAsync( - Stream stream, - IArchiveEncoding archiveEncoding, - CompressionProviderRegistry? compressionProviders, + CompressionProviderRegistry compressionProviders, CancellationToken cancellationToken = default ) { diff --git a/src/SharpCompress/Common/GZip/GZipFilePart.cs b/src/SharpCompress/Common/GZip/GZipFilePart.cs index 610607e5..2abb659b 100644 --- a/src/SharpCompress/Common/GZip/GZipFilePart.cs +++ b/src/SharpCompress/Common/GZip/GZipFilePart.cs @@ -12,34 +12,12 @@ internal sealed partial class GZipFilePart : FilePart { private string? _name; private readonly Stream _stream; - private readonly CompressionProviderRegistry? _compressionProviders; - - internal static GZipFilePart Create(Stream stream, IArchiveEncoding archiveEncoding) - { - var part = new GZipFilePart(stream, archiveEncoding, null); - - part.ReadAndValidateGzipHeader(); - if (stream.CanSeek) - { - var position = stream.Position; - stream.Position = stream.Length - 8; - part.ReadTrailer(); - stream.Position = position; - part.EntryStartPosition = position; - } - else - { - // For non-seekable streams, we can't read the trailer or track position. - // Set to 0 since the stream will be read sequentially from its current position. - part.EntryStartPosition = 0; - } - return part; - } + private readonly CompressionProviderRegistry _compressionProviders; internal static GZipFilePart Create( Stream stream, IArchiveEncoding archiveEncoding, - CompressionProviderRegistry? compressionProviders + CompressionProviderRegistry compressionProviders ) { var part = new GZipFilePart(stream, archiveEncoding, compressionProviders); @@ -62,13 +40,10 @@ internal sealed partial class GZipFilePart : FilePart return part; } - private GZipFilePart(Stream stream, IArchiveEncoding archiveEncoding) - : base(archiveEncoding) => _stream = stream; - private GZipFilePart( Stream stream, IArchiveEncoding archiveEncoding, - CompressionProviderRegistry? compressionProviders + CompressionProviderRegistry compressionProviders ) : base(archiveEncoding) { @@ -86,8 +61,7 @@ internal sealed partial class GZipFilePart : FilePart internal override Stream GetCompressedStream() { - var providers = _compressionProviders ?? CompressionProviderRegistry.Default; - return providers.CreateDecompressStream(CompressionType.Deflate, _stream); + return _compressionProviders.CreateDecompressStream(CompressionType.Deflate, _stream); } internal override Stream GetRawStream() => _stream; diff --git a/src/SharpCompress/Common/Options/IReaderOptions.cs b/src/SharpCompress/Common/Options/IReaderOptions.cs index 4ef9ab77..0504e370 100644 --- a/src/SharpCompress/Common/Options/IReaderOptions.cs +++ b/src/SharpCompress/Common/Options/IReaderOptions.cs @@ -39,9 +39,9 @@ public interface IReaderOptions int? RewindableBufferSize { get; init; } /// - /// Optional registry of compression providers. - /// If null, the default registry (SharpCompress internal implementations) will be used. + /// Registry of compression providers. + /// Defaults to but can be replaced with custom providers. /// Use this to provide alternative decompression implementations. /// - CompressionProviderRegistry? CompressionProviders { get; init; } + CompressionProviderRegistry CompressionProviders { get; init; } } diff --git a/src/SharpCompress/Common/Options/IWriterOptions.cs b/src/SharpCompress/Common/Options/IWriterOptions.cs index a0743403..8e542c70 100644 --- a/src/SharpCompress/Common/Options/IWriterOptions.cs +++ b/src/SharpCompress/Common/Options/IWriterOptions.cs @@ -19,10 +19,9 @@ public interface IWriterOptions : IStreamOptions, IEncodingOptions, IProgressOpt int CompressionLevel { get; init; } /// - /// Optional registry of compression providers. - /// If null, the default registry (SharpCompress internal implementations) will be used. - /// Use this to provide alternative compression implementations, such as + /// Registry of compression providers. + /// Defaults to but can be replaced with custom providers, such as /// System.IO.Compression for Deflate/GZip on modern .NET. /// - CompressionProviderRegistry? CompressionProviders { get; init; } + CompressionProviderRegistry CompressionProviders { get; init; } } diff --git a/src/SharpCompress/Common/Zip/SeekableZipFilePart.cs b/src/SharpCompress/Common/Zip/SeekableZipFilePart.cs index 565b85d1..c659cd6a 100644 --- a/src/SharpCompress/Common/Zip/SeekableZipFilePart.cs +++ b/src/SharpCompress/Common/Zip/SeekableZipFilePart.cs @@ -9,18 +9,11 @@ internal partial class SeekableZipFilePart : ZipFilePart private bool _isLocalHeaderLoaded; private readonly SeekableZipHeaderFactory _headerFactory; - internal SeekableZipFilePart( - SeekableZipHeaderFactory headerFactory, - DirectoryEntryHeader header, - Stream stream - ) - : base(header, stream) => _headerFactory = headerFactory; - internal SeekableZipFilePart( SeekableZipHeaderFactory headerFactory, DirectoryEntryHeader header, Stream stream, - CompressionProviderRegistry? compressionProviders + CompressionProviderRegistry compressionProviders ) : base(header, stream, compressionProviders) => _headerFactory = headerFactory; diff --git a/src/SharpCompress/Common/Zip/StreamingZipFilePart.cs b/src/SharpCompress/Common/Zip/StreamingZipFilePart.cs index 08a52973..0dd36881 100644 --- a/src/SharpCompress/Common/Zip/StreamingZipFilePart.cs +++ b/src/SharpCompress/Common/Zip/StreamingZipFilePart.cs @@ -9,13 +9,10 @@ internal sealed partial class StreamingZipFilePart : ZipFilePart { private Stream? _decompressionStream; - internal StreamingZipFilePart(ZipFileEntry header, Stream stream) - : base(header, stream) { } - internal StreamingZipFilePart( ZipFileEntry header, Stream stream, - CompressionProviderRegistry? compressionProviders + CompressionProviderRegistry compressionProviders ) : base(header, stream, compressionProviders) { } diff --git a/src/SharpCompress/Common/Zip/ZipFilePart.cs b/src/SharpCompress/Common/Zip/ZipFilePart.cs index 0be4fd49..6a03e78c 100644 --- a/src/SharpCompress/Common/Zip/ZipFilePart.cs +++ b/src/SharpCompress/Common/Zip/ZipFilePart.cs @@ -20,39 +20,24 @@ namespace SharpCompress.Common.Zip; internal abstract partial class ZipFilePart : FilePart { - private CompressionProviderRegistry? _compressionProviders; + private readonly CompressionProviderRegistry _compressionProviders; - internal ZipFilePart(ZipFileEntry header, Stream stream) + internal ZipFilePart( + ZipFileEntry header, + Stream stream, + CompressionProviderRegistry compressionProviders + ) : base(header.ArchiveEncoding) { Header = header; header.Part = this; BaseStream = stream; - } - - internal ZipFilePart( - ZipFileEntry header, - Stream stream, - CompressionProviderRegistry? compressionProviders - ) - : this(header, stream) - { _compressionProviders = compressionProviders; } internal Stream BaseStream { get; } internal ZipFileEntry Header { get; set; } - /// - /// Gets or sets the compression provider registry. - /// If null, uses the default registry. - /// - internal CompressionProviderRegistry? CompressionProviders - { - get => _compressionProviders; - set => _compressionProviders = value; - } - internal override string? FilePartName => Header.Name; internal override Stream GetCompressedStream() @@ -89,8 +74,7 @@ internal abstract partial class ZipFilePart : FilePart /// /// Gets the compression provider registry, falling back to default if not set. /// - protected CompressionProviderRegistry GetProviders() => - _compressionProviders ?? CompressionProviderRegistry.Default; + protected CompressionProviderRegistry GetProviders() => _compressionProviders; /// /// Converts ZipCompressionMethod to CompressionType. diff --git a/src/SharpCompress/Readers/ReaderOptions.cs b/src/SharpCompress/Readers/ReaderOptions.cs index b210736d..87925c17 100644 --- a/src/SharpCompress/Readers/ReaderOptions.cs +++ b/src/SharpCompress/Readers/ReaderOptions.cs @@ -149,12 +149,13 @@ public sealed record ReaderOptions : IReaderOptions /// The default handler logs a warning message. /// public Action? SymbolicLinkHandler { get; init; } - /// Optional registry of compression providers. - /// If null, the default registry (SharpCompress internal implementations) will be used. - /// Use this to provide alternative decompression implementations, such as + + /// Registry of compression providers. + /// Defaults to but can be replaced with custom implementations, such as /// System.IO.Compression for Deflate/GZip on modern .NET. /// - public CompressionProviderRegistry? CompressionProviders { get; init; } + public CompressionProviderRegistry CompressionProviders { get; init; } = + CompressionProviderRegistry.Default; /// /// Creates a new ReaderOptions instance with default values. diff --git a/src/SharpCompress/Readers/Tar/TarReader.cs b/src/SharpCompress/Readers/Tar/TarReader.cs index 08fa9e52..d7088c8a 100644 --- a/src/SharpCompress/Readers/Tar/TarReader.cs +++ b/src/SharpCompress/Readers/Tar/TarReader.cs @@ -33,8 +33,7 @@ public partial class TarReader : AbstractReader { var stream = base.RequestInitialStream(); - // Get compression providers from options, falling back to default - var providers = Options.CompressionProviders ?? CompressionProviderRegistry.Default; + var providers = Options.CompressionProviders; return compressionType switch { diff --git a/src/SharpCompress/Readers/Zip/ZipReader.Async.cs b/src/SharpCompress/Readers/Zip/ZipReader.Async.cs index 00ea0654..186cfb96 100644 --- a/src/SharpCompress/Readers/Zip/ZipReader.Async.cs +++ b/src/SharpCompress/Readers/Zip/ZipReader.Async.cs @@ -21,24 +21,21 @@ public partial class ZipReader private readonly StreamingZipHeaderFactory _headerFactory; private readonly Stream _stream; private readonly IReaderOptions _options; - private readonly CompressionProviderRegistry? _compressionProviders; public ZipEntryAsyncEnumerable( StreamingZipHeaderFactory headerFactory, Stream stream, - IReaderOptions options, - CompressionProviderRegistry? compressionProviders + IReaderOptions options ) { _headerFactory = headerFactory; _stream = stream; _options = options; - _compressionProviders = compressionProviders; } public IAsyncEnumerator GetAsyncEnumerator( CancellationToken cancellationToken = default - ) => new ZipEntryAsyncEnumerator(_headerFactory, _stream, _options, _compressionProviders, cancellationToken); + ) => new ZipEntryAsyncEnumerator(_headerFactory, _stream, _options, cancellationToken); } /// @@ -49,20 +46,17 @@ public partial class ZipReader private readonly Stream _stream; private readonly IAsyncEnumerator _headerEnumerator; private readonly IReaderOptions _options; - private readonly CompressionProviderRegistry? _compressionProviders; private ZipEntry? _current; public ZipEntryAsyncEnumerator( StreamingZipHeaderFactory headerFactory, Stream stream, IReaderOptions options, - CompressionProviderRegistry? compressionProviders, CancellationToken cancellationToken ) { _stream = stream; _options = options; - _compressionProviders = compressionProviders; _headerEnumerator = headerFactory .ReadStreamHeaderAsync(stream) .GetAsyncEnumerator(cancellationToken); @@ -84,7 +78,11 @@ public partial class ZipReader { case ZipHeaderType.LocalEntry: _current = new ZipEntry( - new StreamingZipFilePart((LocalEntryHeader)header, _stream), + new StreamingZipFilePart( + (LocalEntryHeader)header, + _stream, + _options.CompressionProviders + ), _options ); return true; diff --git a/src/SharpCompress/Readers/Zip/ZipReader.cs b/src/SharpCompress/Readers/Zip/ZipReader.cs index 9e96266f..eeaa549f 100644 --- a/src/SharpCompress/Readers/Zip/ZipReader.cs +++ b/src/SharpCompress/Readers/Zip/ZipReader.cs @@ -74,7 +74,11 @@ public partial class ZipReader : AbstractReader case ZipHeaderType.LocalEntry: { yield return new ZipEntry( - new StreamingZipFilePart((LocalEntryHeader)h, stream), + new StreamingZipFilePart( + (LocalEntryHeader)h, + stream, + Options.CompressionProviders + ), Options ); } @@ -100,7 +104,7 @@ public partial class ZipReader : AbstractReader /// Returns entries asynchronously for streams that only support async reads. /// protected override IAsyncEnumerable GetEntriesAsync(Stream stream) => - new ZipEntryAsyncEnumerable(_headerFactory, stream, Options, Options.CompressionProviders); + new ZipEntryAsyncEnumerable(_headerFactory, stream, Options); // Async nested classes moved to ZipReader.Async.cs } diff --git a/src/SharpCompress/Writers/GZip/GZipWriter.cs b/src/SharpCompress/Writers/GZip/GZipWriter.cs index 7dcb9e4b..0068ae03 100644 --- a/src/SharpCompress/Writers/GZip/GZipWriter.cs +++ b/src/SharpCompress/Writers/GZip/GZipWriter.cs @@ -19,14 +19,14 @@ public sealed partial class GZipWriter : AbstractWriter destination = SharpCompressStream.CreateNonDisposing(destination); } - // Get compression providers from options, falling back to default - var providers = options?.CompressionProviders ?? CompressionProviderRegistry.Default; + // Use the configured compression providers + var providers = WriterOptions.CompressionProviders; // Create the GZip stream using the provider var compressionStream = providers.CreateCompressStream( CompressionType.GZip, destination, - options?.CompressionLevel ?? (int)CompressionLevel.Default + WriterOptions.CompressionLevel ); // If using internal GZipStream, set the encoding for header filename diff --git a/src/SharpCompress/Writers/GZip/GZipWriterOptions.cs b/src/SharpCompress/Writers/GZip/GZipWriterOptions.cs index 328e331e..f4e81d0d 100644 --- a/src/SharpCompress/Writers/GZip/GZipWriterOptions.cs +++ b/src/SharpCompress/Writers/GZip/GZipWriterOptions.cs @@ -68,12 +68,12 @@ public sealed record GZipWriterOptions : IWriterOptions public IProgress? Progress { get; init; } /// - /// Optional registry of compression providers. - /// If null, the default registry (SharpCompress internal implementations) will be used. - /// Use this to provide alternative compression implementations, such as + /// Registry of compression providers. + /// Defaults to but can be replaced with custom implementations, such as /// System.IO.Compression for GZip on modern .NET. /// - public CompressionProviderRegistry? CompressionProviders { get; init; } + public CompressionProviderRegistry CompressionProviders { get; init; } = + CompressionProviderRegistry.Default; /// /// Creates a new GZipWriterOptions instance with default values. @@ -114,6 +114,7 @@ public sealed record GZipWriterOptions : IWriterOptions LeaveStreamOpen = options.LeaveStreamOpen; ArchiveEncoding = options.ArchiveEncoding; Progress = options.Progress; + CompressionProviders = options.CompressionProviders; } /// @@ -126,5 +127,6 @@ public sealed record GZipWriterOptions : IWriterOptions LeaveStreamOpen = options.LeaveStreamOpen; ArchiveEncoding = options.ArchiveEncoding; Progress = options.Progress; + CompressionProviders = options.CompressionProviders; } } diff --git a/src/SharpCompress/Writers/Tar/TarWriter.cs b/src/SharpCompress/Writers/Tar/TarWriter.cs index 341dbf52..f3ff8456 100644 --- a/src/SharpCompress/Writers/Tar/TarWriter.cs +++ b/src/SharpCompress/Writers/Tar/TarWriter.cs @@ -29,8 +29,7 @@ public partial class TarWriter : AbstractWriter destination = SharpCompressStream.CreateNonDisposing(destination); } - // Get compression providers from options, falling back to default - var providers = options.CompressionProviders ?? CompressionProviderRegistry.Default; + var providers = options.CompressionProviders; destination = options.CompressionType switch { diff --git a/src/SharpCompress/Writers/Tar/TarWriterOptions.cs b/src/SharpCompress/Writers/Tar/TarWriterOptions.cs index fadd97cb..091bb412 100755 --- a/src/SharpCompress/Writers/Tar/TarWriterOptions.cs +++ b/src/SharpCompress/Writers/Tar/TarWriterOptions.cs @@ -44,11 +44,11 @@ public sealed record TarWriterOptions : IWriterOptions public IProgress? Progress { get; init; } /// - /// Optional registry of compression providers. - /// If null, the default registry (SharpCompress internal implementations) will be used. - /// Use this to provide alternative compression implementations. + /// Registry of compression providers. + /// Defaults to but can be replaced with custom implementations. /// - public CompressionProviderRegistry? CompressionProviders { get; init; } + public CompressionProviderRegistry CompressionProviders { get; init; } = + CompressionProviderRegistry.Default; /// /// Indicates if archive should be finalized (by 2 empty blocks) on close. @@ -104,6 +104,7 @@ public sealed record TarWriterOptions : IWriterOptions LeaveStreamOpen = options.LeaveStreamOpen; ArchiveEncoding = options.ArchiveEncoding; Progress = options.Progress; + CompressionProviders = options.CompressionProviders; } /// @@ -117,6 +118,7 @@ public sealed record TarWriterOptions : IWriterOptions LeaveStreamOpen = options.LeaveStreamOpen; ArchiveEncoding = options.ArchiveEncoding; Progress = options.Progress; + CompressionProviders = options.CompressionProviders; } /// diff --git a/src/SharpCompress/Writers/WriterOptions.cs b/src/SharpCompress/Writers/WriterOptions.cs index b0d19b36..356a41dd 100644 --- a/src/SharpCompress/Writers/WriterOptions.cs +++ b/src/SharpCompress/Writers/WriterOptions.cs @@ -64,12 +64,12 @@ public sealed record WriterOptions : IWriterOptions public IProgress? Progress { get; init; } /// - /// Optional registry of compression providers. - /// If null, the default registry (SharpCompress internal implementations) will be used. - /// Use this to provide alternative compression implementations, such as + /// Registry of compression providers. + /// Defaults to but can be replaced with custom implementations, such as /// System.IO.Compression for Deflate/GZip on modern .NET. /// - public CompressionProviderRegistry? CompressionProviders { get; init; } + public CompressionProviderRegistry CompressionProviders { get; init; } = + CompressionProviderRegistry.Default; /// /// Creates a new WriterOptions instance with the specified compression type. diff --git a/src/SharpCompress/Writers/Zip/ZipWriter.cs b/src/SharpCompress/Writers/Zip/ZipWriter.cs index 3473a42c..7595d7ff 100644 --- a/src/SharpCompress/Writers/Zip/ZipWriter.cs +++ b/src/SharpCompress/Writers/Zip/ZipWriter.cs @@ -421,9 +421,7 @@ public partial class ZipWriter : AbstractWriter counting = new CountingStream(SharpCompressStream.CreateNonDisposing(writeStream)); Stream output = counting; - // Get compression providers from writer options, falling back to default - var providers = - writer.WriterOptions.CompressionProviders ?? CompressionProviderRegistry.Default; + var providers = writer.WriterOptions.CompressionProviders; switch (zipCompressionMethod) { diff --git a/src/SharpCompress/Writers/Zip/ZipWriterOptions.cs b/src/SharpCompress/Writers/Zip/ZipWriterOptions.cs index 2e9cf8fd..87465d96 100644 --- a/src/SharpCompress/Writers/Zip/ZipWriterOptions.cs +++ b/src/SharpCompress/Writers/Zip/ZipWriterOptions.cs @@ -61,11 +61,11 @@ public sealed record ZipWriterOptions : IWriterOptions public IProgress? Progress { get; init; } /// - /// Optional registry of compression providers. - /// If null, the default registry (SharpCompress internal implementations) will be used. - /// Use this to provide alternative compression implementations. + /// Registry of compression providers. + /// Defaults to but can be replaced with custom implementations. /// - public CompressionProviderRegistry? CompressionProviders { get; init; } + public CompressionProviderRegistry CompressionProviders { get; init; } = + CompressionProviderRegistry.Default; /// /// Optional comment for the archive. @@ -127,6 +127,7 @@ public sealed record ZipWriterOptions : IWriterOptions LeaveStreamOpen = options.LeaveStreamOpen; ArchiveEncoding = options.ArchiveEncoding; Progress = options.Progress; + CompressionProviders = options.CompressionProviders; } /// @@ -139,6 +140,7 @@ public sealed record ZipWriterOptions : IWriterOptions LeaveStreamOpen = options.LeaveStreamOpen; ArchiveEncoding = options.ArchiveEncoding; Progress = options.Progress; + CompressionProviders = options.CompressionProviders; } /// diff --git a/tests/SharpCompress.Test/CompressionProviderTests.cs b/tests/SharpCompress.Test/CompressionProviderTests.cs index 52027ae6..d6bec430 100644 --- a/tests/SharpCompress.Test/CompressionProviderTests.cs +++ b/tests/SharpCompress.Test/CompressionProviderTests.cs @@ -134,13 +134,10 @@ public class CompressionProviderTests } [Fact] - public void TarWriter_WithNullProvider_UsesDefault() + public void TarWriter_WithoutCustomProvider_UsesDefault() { using var stream = new MemoryStream(); - var options = new TarWriterOptions(CompressionType.GZip, true) - { - CompressionProviders = null, // Should use default - }; + var options = new TarWriterOptions(CompressionType.GZip, true); using (var writer = new TarWriter(stream, options)) {