Merge pull request #1381 from virzak/feature/sync-method-generator

Generate the synchronous archive entry extensions from the async ones
This commit is contained in:
Adam Hathcock
2026-07-28 10:22:17 +01:00
committed by GitHub
7 changed files with 74 additions and 72 deletions

View File

@@ -19,5 +19,6 @@
Version="17.14.15"
/>
<GlobalPackageReference Include="PolySharp" Version="1.16.0" />
<GlobalPackageReference Include="Zomp.SyncMethodGenerator" Version="2.0.40" />
</ItemGroup>
</Project>

View File

@@ -52,6 +52,12 @@
"resolved": "13.0.0",
"contentHash": "zcCR1pupa1wI1VqBULRiQKeHKKZOuJhi/K+4V5oO+rHJZlaOD53ViFo1c3PavDoMAfSn/FAXGAWpPoF57rwhYg=="
},
"Zomp.SyncMethodGenerator": {
"type": "Direct",
"requested": "[2.0.40, )",
"resolved": "2.0.40",
"contentHash": "lpU06HVF3AXHHU+qQSmoCCYPf3QfAUD4tePJ6o2PZta0K1Vt2jEyChwEeqTuG1940SB7kT6Wp5BagmL+7ILimw=="
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "10.0.300",

View File

@@ -7,7 +7,7 @@ using SharpCompress.IO;
namespace SharpCompress.Archives;
public static class IArchiveEntryExtensions
public static partial class IArchiveEntryExtensions
{
/// <param name="archiveEntry">The archive entry to extract.</param>
extension(IArchiveEntry archiveEntry)
@@ -16,48 +16,9 @@ public static class IArchiveEntryExtensions
/// Extract entry to the specified stream.
/// </summary>
/// <param name="streamToWriteTo">The stream to write the entry content to.</param>
/// <param name="progress">Optional progress reporter for tracking extraction progress.</param>
public void WriteTo(Stream streamToWriteTo, IProgress<ProgressReport>? progress = null) =>
archiveEntry.WriteTo(streamToWriteTo, bufferSize: null, progress: progress);
/// <summary>
/// Extract entry to the specified stream.
/// </summary>
/// <param name="streamToWriteTo">The stream to write the entry content to.</param>
/// <param name="options">Options for configuring extraction behavior.</param>
/// <param name="progress">Optional progress reporter for tracking extraction progress.</param>
public void WriteTo(
Stream streamToWriteTo,
ExtractionOptions options,
IProgress<ProgressReport>? progress = null
) => archiveEntry.WriteTo(streamToWriteTo, options.BufferSize, options, progress);
private void WriteTo(
Stream streamToWriteTo,
int? bufferSize,
ExtractionOptions? options = null,
IProgress<ProgressReport>? progress = null
)
{
if (archiveEntry.IsDirectory)
{
throw new ExtractionException("Entry is a file directory and cannot be extracted.");
}
using var entryStream = archiveEntry.OpenEntryStream();
var checkedStream = options is null
? entryStream
: IEntryExtensions.WrapWithChecksumValidation(archiveEntry, entryStream, options);
var sourceStream = WrapWithProgress(checkedStream, archiveEntry, progress);
sourceStream.CopyTo(streamToWriteTo, bufferSize ?? Constants.BufferSize);
}
/// <summary>
/// Extract entry to the specified stream asynchronously.
/// </summary>
/// <param name="streamToWriteTo">The stream to write the entry content to.</param>
/// <param name="cancellationToken">Cancellation token.</param>
/// <param name="progress">Optional progress reporter for tracking extraction progress.</param>
[Zomp.SyncMethodGenerator.CreateSyncVersion(PreserveProgress = true)]
public async ValueTask WriteToAsync(
Stream streamToWriteTo,
IProgress<ProgressReport>? progress = null,
@@ -73,12 +34,13 @@ public static class IArchiveEntryExtensions
.ConfigureAwait(false);
/// <summary>
/// Extract entry to the specified stream asynchronously.
/// Extract entry to the specified stream.
/// </summary>
/// <param name="streamToWriteTo">The stream to write the entry content to.</param>
/// <param name="options">Options for configuring extraction behavior.</param>
/// <param name="progress">Optional progress reporter for tracking extraction progress.</param>
/// <param name="cancellationToken">Cancellation token.</param>
[Zomp.SyncMethodGenerator.CreateSyncVersion(PreserveProgress = true)]
public async ValueTask WriteToAsync(
Stream streamToWriteTo,
ExtractionOptions options,
@@ -95,6 +57,7 @@ public static class IArchiveEntryExtensions
)
.ConfigureAwait(false);
[Zomp.SyncMethodGenerator.CreateSyncVersion(PreserveProgress = true)]
private async ValueTask WriteToAsync(
Stream streamToWriteTo,
int? bufferSize,
@@ -167,19 +130,7 @@ public static class IArchiveEntryExtensions
/// <summary>
/// Extract to specific directory, retaining filename
/// </summary>
public void WriteToDirectory(
string destinationDirectory,
ExtractionOptions? options = null
) =>
entry.WriteEntryToDirectory(
destinationDirectory,
options,
(path) => entry.WriteToFile(path, options)
);
/// <summary>
/// Extract to specific directory asynchronously, retaining filename
/// </summary>
[Zomp.SyncMethodGenerator.CreateSyncVersion]
public async ValueTask WriteToDirectoryAsync(
string destinationDirectory,
ExtractionOptions? options = null,
@@ -198,23 +149,7 @@ public static class IArchiveEntryExtensions
/// <summary>
/// Extract to specific file
/// </summary>
public void WriteToFile(string destinationFileName, ExtractionOptions? options = null)
{
options ??= new ExtractionOptions();
entry.WriteEntryToFile(
destinationFileName,
options,
(x, fm) =>
{
using var fs = File.Open(x, fm);
entry.WriteTo(fs, options?.BufferSize ?? Constants.BufferSize, options, null);
}
);
}
/// <summary>
/// Extract to specific file asynchronously
/// </summary>
[Zomp.SyncMethodGenerator.CreateSyncVersion]
public async ValueTask WriteToFileAsync(
string destinationFileName,
ExtractionOptions? options = null,

View File

@@ -53,6 +53,12 @@
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
}
},
"Zomp.SyncMethodGenerator": {
"type": "Direct",
"requested": "[2.0.40, )",
"resolved": "2.0.40",
"contentHash": "lpU06HVF3AXHHU+qQSmoCCYPf3QfAUD4tePJ6o2PZta0K1Vt2jEyChwEeqTuG1940SB7kT6Wp5BagmL+7ILimw=="
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "10.0.300",
@@ -175,6 +181,12 @@
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
}
},
"Zomp.SyncMethodGenerator": {
"type": "Direct",
"requested": "[2.0.40, )",
"resolved": "2.0.40",
"contentHash": "lpU06HVF3AXHHU+qQSmoCCYPf3QfAUD4tePJ6o2PZta0K1Vt2jEyChwEeqTuG1940SB7kT6Wp5BagmL+7ILimw=="
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "10.0.300",
@@ -289,6 +301,12 @@
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
}
},
"Zomp.SyncMethodGenerator": {
"type": "Direct",
"requested": "[2.0.40, )",
"resolved": "2.0.40",
"contentHash": "lpU06HVF3AXHHU+qQSmoCCYPf3QfAUD4tePJ6o2PZta0K1Vt2jEyChwEeqTuG1940SB7kT6Wp5BagmL+7ILimw=="
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "10.0.300",
@@ -357,6 +375,12 @@
"resolved": "1.16.0",
"contentHash": "3kdIIceBPumwjw279FuiVMfVENT2cGASXJgcigdySsbX2dJB8ofUgG6i47yqF/k1qu6fvNR3csrSekZPviR6kQ=="
},
"Zomp.SyncMethodGenerator": {
"type": "Direct",
"requested": "[2.0.40, )",
"resolved": "2.0.40",
"contentHash": "lpU06HVF3AXHHU+qQSmoCCYPf3QfAUD4tePJ6o2PZta0K1Vt2jEyChwEeqTuG1940SB7kT6Wp5BagmL+7ILimw=="
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "10.0.300",
@@ -414,6 +438,12 @@
"resolved": "1.16.0",
"contentHash": "3kdIIceBPumwjw279FuiVMfVENT2cGASXJgcigdySsbX2dJB8ofUgG6i47yqF/k1qu6fvNR3csrSekZPviR6kQ=="
},
"Zomp.SyncMethodGenerator": {
"type": "Direct",
"requested": "[2.0.40, )",
"resolved": "2.0.40",
"contentHash": "lpU06HVF3AXHHU+qQSmoCCYPf3QfAUD4tePJ6o2PZta0K1Vt2jEyChwEeqTuG1940SB7kT6Wp5BagmL+7ILimw=="
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "10.0.300",
@@ -477,6 +507,12 @@
"resolved": "1.16.0",
"contentHash": "3kdIIceBPumwjw279FuiVMfVENT2cGASXJgcigdySsbX2dJB8ofUgG6i47yqF/k1qu6fvNR3csrSekZPviR6kQ=="
},
"Zomp.SyncMethodGenerator": {
"type": "Direct",
"requested": "[2.0.40, )",
"resolved": "2.0.40",
"contentHash": "lpU06HVF3AXHHU+qQSmoCCYPf3QfAUD4tePJ6o2PZta0K1Vt2jEyChwEeqTuG1940SB7kT6Wp5BagmL+7ILimw=="
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "10.0.300",

View File

@@ -46,6 +46,12 @@
"resolved": "1.16.0",
"contentHash": "3kdIIceBPumwjw279FuiVMfVENT2cGASXJgcigdySsbX2dJB8ofUgG6i47yqF/k1qu6fvNR3csrSekZPviR6kQ=="
},
"Zomp.SyncMethodGenerator": {
"type": "Direct",
"requested": "[2.0.40, )",
"resolved": "2.0.40",
"contentHash": "lpU06HVF3AXHHU+qQSmoCCYPf3QfAUD4tePJ6o2PZta0K1Vt2jEyChwEeqTuG1940SB7kT6Wp5BagmL+7ILimw=="
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "10.0.300",

View File

@@ -62,6 +62,12 @@
"resolved": "1.16.0",
"contentHash": "3kdIIceBPumwjw279FuiVMfVENT2cGASXJgcigdySsbX2dJB8ofUgG6i47yqF/k1qu6fvNR3csrSekZPviR6kQ=="
},
"Zomp.SyncMethodGenerator": {
"type": "Direct",
"requested": "[2.0.40, )",
"resolved": "2.0.40",
"contentHash": "lpU06HVF3AXHHU+qQSmoCCYPf3QfAUD4tePJ6o2PZta0K1Vt2jEyChwEeqTuG1940SB7kT6Wp5BagmL+7ILimw=="
},
"BenchmarkDotNet.Annotations": {
"type": "Transitive",
"resolved": "0.15.8",

View File

@@ -70,6 +70,12 @@
"xunit.v3.mtp-v1": "[3.2.2]"
}
},
"Zomp.SyncMethodGenerator": {
"type": "Direct",
"requested": "[2.0.40, )",
"resolved": "2.0.40",
"contentHash": "lpU06HVF3AXHHU+qQSmoCCYPf3QfAUD4tePJ6o2PZta0K1Vt2jEyChwEeqTuG1940SB7kT6Wp5BagmL+7ILimw=="
},
"Microsoft.ApplicationInsights": {
"type": "Transitive",
"resolved": "2.23.0",
@@ -392,6 +398,12 @@
"xunit.v3.mtp-v1": "[3.2.2]"
}
},
"Zomp.SyncMethodGenerator": {
"type": "Direct",
"requested": "[2.0.40, )",
"resolved": "2.0.40",
"contentHash": "lpU06HVF3AXHHU+qQSmoCCYPf3QfAUD4tePJ6o2PZta0K1Vt2jEyChwEeqTuG1940SB7kT6Wp5BagmL+7ILimw=="
},
"Microsoft.ApplicationInsights": {
"type": "Transitive",
"resolved": "2.23.0",