diff --git a/.github/workflows/qodana.yml b/.github/workflows/qodana.yml index d683654d..fcd78bae 100644 --- a/.github/workflows/qodana.yml +++ b/.github/workflows/qodana.yml @@ -12,7 +12,6 @@ permissions: jobs: qodana: - if: github.event_name != 'pull_request' || github.actor != 'dependabot[bot]' runs-on: ubuntu-latest permissions: contents: read @@ -26,9 +25,7 @@ jobs: fetch-depth: 0 - name: Assert QODANA_TOKEN present - # Fail-closed for push/workflow_dispatch AND same-repo PRs. - # Do not fail fork PRs (secrets not provided there). - if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false + # Fail-closed in CI: Qodana is a required security gate. shell: bash run: | test -n "${QODANA_TOKEN:-}" || (echo "FAIL: QODANA_TOKEN missing" >&2; exit 1) diff --git a/Directory.Build.props b/Directory.Build.props index 39e9cfec..91864408 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -5,6 +5,6 @@ true - 5.2.0 + 5.2.1 diff --git a/Directory.Packages.props b/Directory.Packages.props index ad68b280..38e66a0e 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -3,21 +3,21 @@ true - - - - + + + + - - - - + + + + - + - + \ No newline at end of file diff --git a/docs/ci/001_PIPELINE_CI.MD b/docs/ci/001_PIPELINE_CI.MD index 5f4e6e56..ff3925c1 100644 --- a/docs/ci/001_PIPELINE_CI.MD +++ b/docs/ci/001_PIPELINE_CI.MD @@ -103,3 +103,4 @@ Qodana laeuft in einem separaten Workflow und wird durch `run.sh qodana` validie - Qodana-Action-Ausfuehrung und SARIF-Ausgabepfad (`.github/workflows/qodana.yml:34-40`, `.github/workflows/qodana.yml:59`). - Vertragscheck-Aufruf (`.github/workflows/qodana.yml:47-48`, `tools/ci/bin/run.sh:402-422`). - Qodana-Artefakt-Upload (`.github/workflows/qodana.yml:54-60`). +- Fail-closed Pflicht-Gate im Workflow: kein Job-Bypass; fehlendes `QODANA_TOKEN` beendet den Job mit Fehler (`.github/workflows/qodana.yml:14-32`). diff --git a/docs/ci/101_PIPELINE_CI.MD b/docs/ci/101_PIPELINE_CI.MD index c88cdd61..c8cffb85 100644 --- a/docs/ci/101_PIPELINE_CI.MD +++ b/docs/ci/101_PIPELINE_CI.MD @@ -103,3 +103,4 @@ Qodana runs in a separate workflow and is validated by `run.sh qodana`: - Qodana action execution and SARIF output path (`.github/workflows/qodana.yml:34-40`, `.github/workflows/qodana.yml:59`). - Contract check invocation (`.github/workflows/qodana.yml:47-48`, `tools/ci/bin/run.sh:402-422`). - Qodana artifact upload (`.github/workflows/qodana.yml:54-60`). +- Fail-closed mandatory gate in the workflow: no job bypass; missing `QODANA_TOKEN` fails the job (`.github/workflows/qodana.yml:14-32`). diff --git a/docs/versioning/002_HISTORY_VERSIONS.MD b/docs/versioning/002_HISTORY_VERSIONS.MD index d5ce28fe..cbaacc44 100644 --- a/docs/versioning/002_HISTORY_VERSIONS.MD +++ b/docs/versioning/002_HISTORY_VERSIONS.MD @@ -12,7 +12,7 @@ Heuristik fuer die Rueckwirkungs-Zuordnung: - `docs|test|ci|chore|tooling|refactor|fix` => Patch Aktueller Entwicklungsstand: -- Aktuelle Entwicklungslinie enthaelt `5.x` (aktueller stabiler Stand: `v5.2.0`; Details in `docs/versioning/003_CHANGELOG_RELEASES.MD`). +- Aktuelle Entwicklungslinie enthaelt `5.x` (aktueller Arbeitsstand: `v5.2.1`; Details in `docs/versioning/003_CHANGELOG_RELEASES.MD`). Hinweis: - Die Spalte `Keyword` verwendet den technischen Klassifizierungswert aus der Historie. @@ -20,6 +20,7 @@ Hinweis: | Version | Kurzbeschreibung | Commit | Keyword | |---|---|---|---| +| `5.2.1` | SharpCompress-API auf typsichere Aufrufe umgestellt, tar.gz-Verarbeitung fail-closed gehaertet und Qodana-CI-Gate als Pflichtlauf dokumentiert/erzwungen | [unreleased](https://github.com/tomtastisch/FileClassifier/compare/v5.2.0...HEAD) | patch | | `5.2.0` | netstandard2.0-Compat-Layer eingefuehrt, Provider-Struktur konsolidiert und TFM-Multi-Targeting erweitert | [8d65a52](https://github.com/tomtastisch/FileClassifier/commit/8d65a52) | minor | | `5.1.4` | Refactor-Cluster 7C abgeschlossen + Qodana-Alerts auf 0 + Version-Bump fuer Release | [2adeb83](https://github.com/tomtastisch/FileClassifier/commit/2adeb83) | patch | | `5.1.3` | PR-Governance-Haertung (DE-Naming, PR-Template, fail-closed Gate fuer `security/code-scanning/tools = 0`) | [0b488ac](https://github.com/tomtastisch/FileClassifier/commit/0b488ac) | patch | diff --git a/docs/versioning/003_CHANGELOG_RELEASES.MD b/docs/versioning/003_CHANGELOG_RELEASES.MD index bafb3af7..0adec393 100644 --- a/docs/versioning/003_CHANGELOG_RELEASES.MD +++ b/docs/versioning/003_CHANGELOG_RELEASES.MD @@ -7,6 +7,17 @@ Alle Aenderungen werden hier technisch dokumentiert. Die Release-Version selbst ist der Git-Tag `vX.Y.Z` (optional `-prerelease`) als SSOT. +## [5.2.1] +- Added: + - CI-Dokumentation um expliziten Pflicht-Gate-Charakter fuer Qodana erweitert. +- Changed: + - SharpCompress-Aufrufe in `ArchiveInternals.vb` auf typsichere APIs (`ArchiveFactory.OpenArchive`, `GZipArchive.OpenArchive`) umgestellt. + - `qodana.yml` fail-closed gehaertet: Job-Bypass entfernt und `QODANA_TOKEN` als harte Voraussetzung im CI-Job erzwungen. +- Fixed: + - `tar.gz`-Verarbeitung fail-closed stabilisiert (GZip-Mismatch/Nested-Faelle konsistent behandelt). +- Docs/CI/Tooling: + - Versionskonvergenz auf `5.2.1` nachgezogen (`RepoVersion`, `Version`, `PackageVersion`, Versionshistorie DE/EN). + ## [5.2.0] - Added: - Incode-Dokumentation fuer die TFM-Providermethoden komplettiert (`HashPrimitivesProvider` fuer `netstandard2.0` und `net8.0+`). diff --git a/docs/versioning/102_HISTORY_VERSIONS.MD b/docs/versioning/102_HISTORY_VERSIONS.MD index 4ae308a7..934455fc 100644 --- a/docs/versioning/102_HISTORY_VERSIONS.MD +++ b/docs/versioning/102_HISTORY_VERSIONS.MD @@ -12,13 +12,14 @@ Heuristics for retroactive classification: - `docs|test|ci|chore|tooling|refactor|fix` => patch Current state: -- Current release line contains `5.x` (current stable state: `v5.2.0`; details in `docs/versioning/103_CHANGELOG_RELEASES.MD`). +- Current release line contains `5.x` (current working state: `v5.2.1`; details in `docs/versioning/103_CHANGELOG_RELEASES.MD`). Note: - The \"short description\" column follows the original commit/PR intent text for deterministic traceability and is not normalized to a single language. | Version | Short description | Commit | Keyword | |---|---|---|---| +| `5.2.1` | Switched SharpCompress calls to type-safe APIs, hardened tar.gz fail-closed handling, and enforced/documented Qodana CI as a mandatory gate | [unreleased](https://github.com/tomtastisch/FileClassifier/compare/v5.2.0...HEAD) | patch | | `5.2.0` | Introduce netstandard2.0 compatibility layer, consolidate provider structure, and extend TFM multi-targeting | [8d65a52](https://github.com/tomtastisch/FileClassifier/commit/8d65a52) | minor | | `5.1.4` | Refactor-Cluster 7C abgeschlossen + Qodana-Alerts auf 0 + Version-Bump fuer Release | [2adeb83](https://github.com/tomtastisch/FileClassifier/commit/2adeb83) | patch | | `5.1.3` | PR-Governance-Haertung (DE-Naming, PR-Template, fail-closed Gate fuer `security/code-scanning/tools = 0`) | [0b488ac](https://github.com/tomtastisch/FileClassifier/commit/0b488ac) | patch | diff --git a/docs/versioning/103_CHANGELOG_RELEASES.MD b/docs/versioning/103_CHANGELOG_RELEASES.MD index a86e44d1..5654ec02 100644 --- a/docs/versioning/103_CHANGELOG_RELEASES.MD +++ b/docs/versioning/103_CHANGELOG_RELEASES.MD @@ -6,6 +6,17 @@ All changes are documented here in technical terms. The release version itself is the Git tag `vX.Y.Z` (optional `-prerelease`) as SSOT. +## [5.2.1] +- Added: + - Extended CI documentation to state Qodana as an explicit mandatory gate. +- Changed: + - Switched SharpCompress calls in `ArchiveInternals.vb` to type-safe APIs (`ArchiveFactory.OpenArchive`, `GZipArchive.OpenArchive`). + - Hardened `qodana.yml` fail-closed behavior: removed job bypass and enforced `QODANA_TOKEN` as a hard CI prerequisite. +- Fixed: + - Stabilized fail-closed `tar.gz` handling (consistent behavior for GZip mismatch/nested cases). +- Docs/CI/Tooling: + - Updated version convergence to `5.2.1` (`RepoVersion`, `Version`, `PackageVersion`, version history DE/EN). + ## [5.2.0] - Added: - Completed in-code documentation for TFM provider methods (`HashPrimitivesProvider` for `netstandard2.0` and `net8.0+`). diff --git a/src/FileClassifier.App/packages.lock.json b/src/FileClassifier.App/packages.lock.json index f915a5de..930a3a16 100644 --- a/src/FileClassifier.App/packages.lock.json +++ b/src/FileClassifier.App/packages.lock.json @@ -4,36 +4,31 @@ "net10.0": { "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.0", - "contentHash": "L3AdmZ1WOK4XXT5YFPEwyt0ep6l8lGIPs7F5OOBZc77Zqeo01Of7XXICy47628sdVl0v/owxYJTe86DTgFwKCA==" + "resolved": "10.0.3", + "contentHash": "bwGMrRcAMWx2s/RDgja97p27rxSz2pEQW0+rX5cWAUWVETVJ/eyxGfjAl8vuG5a+lckWmPIE+vcuaZNVB5YDdw==" }, "MimeTypesMap": { "type": "Transitive", "resolved": "1.0.9", "contentHash": "M0TuSCwL1a8QV0VKw8ysY4AIs6v/Aor3N7GXQeqgNlAvqjx9Kj9KxNd09Pg5RzpY1tCOU8mkrfYBi1Lxwj8quQ==" }, - "ZstdSharp.Port": { - "type": "Transitive", - "resolved": "0.8.4", - "contentHash": "eieSXq3kakCUXbgdxkKaRqWS6hF0KBJcqok9LlDCs60GOyrynLvPOcQ0pRw7shdPF7lh/VepJ9cP9n9HHc759g==" - }, "Tomtastisch.FileClassifier": { "type": "Project", "dependencies": { - "Microsoft.Extensions.Logging.Abstractions": "[10.0.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[10.0.3, )", "Microsoft.IO.RecyclableMemoryStream": "[3.0.1, )", "Mime": "[3.8.0, )", - "SharpCompress": "[0.39.0, )", - "System.IO.Hashing": "[10.0.2, )" + "SharpCompress": "[0.46.2, )", + "System.IO.Hashing": "[10.0.3, )" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "CentralTransitive", - "requested": "[10.0.0, )", - "resolved": "10.0.0", - "contentHash": "FU/IfjDfwaMuKr414SSQNTIti/69bHEMb+QKrskRb26oVqpx3lNFXMjs/RC9ZUuhBhcwDM2BwOgoMw+PZ+beqQ==", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "lxl0WLk7ROgBFAsjcOYjQ8/DVK+VMszxGBzUhgtQmAsTNldLL5pk9NG/cWTsXHq0lUhUEAtZkEE7jOGOA8bGKQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3" } }, "Microsoft.IO.RecyclableMemoryStream": { @@ -53,18 +48,15 @@ }, "SharpCompress": { "type": "CentralTransitive", - "requested": "[0.39.0, )", - "resolved": "0.39.0", - "contentHash": "0esqIUDlg68Z7+Weuge4QzEvNtawUO4obTJFL7xuf4DBHMxVRr+wbNgiX9arMrj3kGXQSvLe0zbZG3oxpkwJOA==", - "dependencies": { - "ZstdSharp.Port": "0.8.4" - } + "requested": "[0.46.2, )", + "resolved": "0.46.2", + "contentHash": "qLiVQXsKa1R0lc+StVpHLOLnMR7x0kFJrdfKoSRKJC8rPH0vtPTkYM13InEKgbhvHZ6HqJmA/iQVq/zmQ/5wxg==" }, "System.IO.Hashing": { "type": "CentralTransitive", - "requested": "[10.0.2, )", - "resolved": "10.0.2", - "contentHash": "AKJknIFi9O3+rGExxTry188JPvUoZAPcCtS2qdqyFhIzsxQ1Ap94BeGDG0VzVEHakhmRxmJtVih6TsHoghIt/g==" + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "La6ICwsdTKhVX+LKN+pvFjQRR3LhLwq3uKdi2knjLzRyPYBSydF4cjXidYxIiTcDD6XVYdsBWQEI8ZxiZ/OdIg==" } } } diff --git a/src/FileTypeDetection/FileTypeDetectionLib.vbproj b/src/FileTypeDetection/FileTypeDetectionLib.vbproj index 4003efc6..8e009026 100644 --- a/src/FileTypeDetection/FileTypeDetectionLib.vbproj +++ b/src/FileTypeDetection/FileTypeDetectionLib.vbproj @@ -7,8 +7,8 @@ true false Tomtastisch.FileClassifier - 5.2.0 - 5.2.0 + 5.2.1 + 5.2.1 tomtastisch Deterministic file type and MIME detection with fail-closed archive safety checks, secure extraction primitives, and reproducible hashing evidence for .NET. filetype;mime;detection;magic-bytes;sniffing;archive;zip;tar;7z;rar;zipslip;security;hashing;sha256;deterministic;dotnet;netstandard2.0;net8;net10 diff --git a/src/FileTypeDetection/Infrastructure/ArchiveInternals.vb b/src/FileTypeDetection/Infrastructure/ArchiveInternals.vb index 2c809ef3..d647b195 100644 --- a/src/FileTypeDetection/Infrastructure/ArchiveInternals.vb +++ b/src/FileTypeDetection/Infrastructure/ArchiveInternals.vb @@ -154,6 +154,7 @@ Namespace Global.Tomtastisch.FileClassifier Friend Shared Function TryDescribeStream(stream As Stream, opt As FileTypeProjectOptions, ByRef descriptor As ArchiveDescriptor) As Boolean Dim mapped As ArchiveContainerType + Dim gzipWrapped As Boolean descriptor = ArchiveDescriptor.UnknownDescriptor() If Not StreamGuard.IsReadable(stream) Then Return False @@ -161,10 +162,15 @@ Namespace Global.Tomtastisch.FileClassifier Try StreamGuard.RewindToStart(stream) - Using archive = SharpCompress.Archives.ArchiveFactory.Open(stream) + gzipWrapped = HasGZipMagic(stream) + StreamGuard.RewindToStart(stream) + Using archive = OpenArchiveCompat(stream) If archive Is Nothing Then Return False mapped = MapArchiveType(archive.Type) + If gzipWrapped AndAlso mapped = ArchiveContainerType.Tar Then + mapped = ArchiveContainerType.GZip + End If If mapped = ArchiveContainerType.Unknown Then Return False descriptor = ArchiveDescriptor.ForContainerType(mapped) @@ -214,6 +220,29 @@ Namespace Global.Tomtastisch.FileClassifier Return ArchiveContainerType.Unknown End Select End Function + + Private Shared Function OpenArchiveCompat(stream As Stream) As SharpCompress.Archives.IArchive + Try + Dim options = New SharpCompress.Readers.ReaderOptions() With {.LeaveStreamOpen = True} + Return SharpCompress.Archives.ArchiveFactory.OpenArchive(stream, options) + Catch ex As Exception When _ + TypeOf ex Is InvalidOperationException OrElse + TypeOf ex Is NotSupportedException OrElse + TypeOf ex Is ArgumentException + Return Nothing + End Try + End Function + + Private Shared Function HasGZipMagic(stream As Stream) As Boolean + If stream Is Nothing OrElse Not stream.CanRead Then Return False + If Not stream.CanSeek Then Return False + If stream.Length < 2 Then Return False + + Dim first = stream.ReadByte() + Dim second = stream.ReadByte() + Return first = &H1F AndAlso second = &H8B + End Function + End Class ''' @@ -245,6 +274,7 @@ Namespace Global.Tomtastisch.FileClassifier If backend Is Nothing Then Return False Return backend.Process(stream, opt, depth, descriptor.ContainerType, extractEntry) End Function + End Class ''' @@ -554,6 +584,31 @@ Namespace Global.Tomtastisch.FileClassifier Return opt.AllowUnknownArchiveEntrySize End Function + Private Shared Function TryProbeEntrySizeWithinLimit(entry As IArchiveEntryModel, maxBytes As Long) As Boolean + If entry Is Nothing Then Return False + If maxBytes <= 0 Then Return False + + Try + Using source = entry.OpenStream() + If source Is Nothing OrElse Not source.CanRead Then Return False + Using sink As New MemoryStream() + StreamBounds.CopyBounded(source, sink, maxBytes) + End Using + End Using + Return True + Catch ex As Exception When _ + TypeOf ex Is UnauthorizedAccessException OrElse + TypeOf ex Is System.Security.SecurityException OrElse + TypeOf ex Is IOException OrElse + TypeOf ex Is InvalidDataException OrElse + TypeOf ex Is NotSupportedException OrElse + TypeOf ex Is ArgumentException OrElse + TypeOf ex Is InvalidOperationException OrElse + TypeOf ex Is ObjectDisposedException + Return False + End Try + End Function + Private Shared Function EnsureTrailingSeparator(dirPath As String) As String If String.IsNullOrEmpty(dirPath) Then Return Path.DirectorySeparatorChar.ToString() If dirPath.EndsWith(Path.DirectorySeparatorChar) OrElse dirPath.EndsWith(Path.AltDirectorySeparatorChar) _ @@ -671,6 +726,8 @@ Namespace Global.Tomtastisch.FileClassifier Dim model As IArchiveEntryModel Dim knownSize As Long Dim requireKnownForTotal As Boolean + Dim gzipWrapped As Boolean + Dim gzipWrappedTar As Boolean If Not StreamGuard.IsReadable(stream) Then Return False If opt Is Nothing Then Return False @@ -679,19 +736,26 @@ Namespace Global.Tomtastisch.FileClassifier Try StreamGuard.RewindToStart(stream) + gzipWrapped = HasGZipMagic(stream) + StreamGuard.RewindToStart(stream) + If containerTypeValue = ArchiveContainerType.GZip AndAlso Not gzipWrapped Then Return False - Using archive = SharpCompress.Archives.ArchiveFactory.Open(stream) + Using archive = OpenArchiveForContainerCompat(stream, containerTypeValue) If archive Is Nothing Then Return False mapped = ArchiveTypeResolver.MapArchiveType(archive.Type) - If mapped <> containerTypeValue Then Return False + gzipWrappedTar = gzipWrapped AndAlso containerTypeValue = ArchiveContainerType.GZip AndAlso _ + mapped = ArchiveContainerType.Tar + If mapped <> containerTypeValue AndAlso Not gzipWrappedTar Then Return False entries = archive.Entries. OrderBy(Function(e) If(e.Key, String.Empty), StringComparer.Ordinal). ToList() - nestedHandled = TryProcessNestedGArchive(entries, opt, depth, containerTypeValue, extractEntry, + If Not gzipWrappedTar Then + nestedHandled = TryProcessNestedGArchive(entries, opt, depth, containerTypeValue, extractEntry, nestedResult) - If nestedHandled Then Return nestedResult + If nestedHandled Then Return nestedResult + End If If entries.Count > opt.MaxZipEntries Then Return False @@ -710,6 +774,9 @@ Namespace Global.Tomtastisch.FileClassifier If Not model.IsDirectory Then knownSize = 0 requireKnownForTotal = (extractEntry Is Nothing) OrElse depth > 0 + If gzipWrappedTar Then + requireKnownForTotal = False + End If If Not TryGetValidatedSize(model, opt, knownSize, requireKnownForTotal) Then Return False totalUncompressed += knownSize If totalUncompressed > opt.MaxZipTotalUncompressedBytes Then Return False @@ -736,6 +803,50 @@ Namespace Global.Tomtastisch.FileClassifier End Try End Function + Private Shared Function OpenArchiveForContainerCompat(stream As Stream, + containerTypeValue As ArchiveContainerType) _ + As SharpCompress.Archives.IArchive + If containerTypeValue = ArchiveContainerType.GZip Then + Dim gzipArchive = OpenGZipArchiveCompat(stream) + If gzipArchive IsNot Nothing Then Return gzipArchive + End If + Return OpenArchiveCompat(stream) + End Function + + Private Shared Function OpenArchiveCompat(stream As Stream) As SharpCompress.Archives.IArchive + Try + Dim options = New SharpCompress.Readers.ReaderOptions() With {.LeaveStreamOpen = True} + Return SharpCompress.Archives.ArchiveFactory.OpenArchive(stream, options) + Catch ex As Exception When _ + TypeOf ex Is InvalidOperationException OrElse + TypeOf ex Is NotSupportedException OrElse + TypeOf ex Is ArgumentException + Return Nothing + End Try + End Function + + Private Shared Function OpenGZipArchiveCompat(stream As Stream) As SharpCompress.Archives.IArchive + Try + Dim options = New SharpCompress.Readers.ReaderOptions() With {.LeaveStreamOpen = True} + Return SharpCompress.Archives.GZip.GZipArchive.OpenArchive(stream, options) + Catch ex As Exception When _ + TypeOf ex Is InvalidOperationException OrElse + TypeOf ex Is NotSupportedException OrElse + TypeOf ex Is ArgumentException + Return Nothing + End Try + End Function + + Private Shared Function HasGZipMagic(stream As Stream) As Boolean + If stream Is Nothing OrElse Not stream.CanRead Then Return False + If Not stream.CanSeek Then Return False + If stream.Length < 2 Then Return False + + Dim first = stream.ReadByte() + Dim second = stream.ReadByte() + Return first = &H1F AndAlso second = &H8B + End Function + Private Shared Function TryProcessNestedGArchive( entries As List(Of SharpCompress.Archives.IArchiveEntry), opt As FileTypeProjectOptions, @@ -768,7 +879,8 @@ Namespace Global.Tomtastisch.FileClassifier End If If Not ArchiveTypeResolver.TryDescribeBytes(payload, opt, nestedDescriptor) Then - Return False + nestedResult = False + Return True End If nestedDescriptor = nestedDescriptor.WithChain({ArchiveContainerType.GZip, nestedDescriptor.ContainerType}) diff --git a/src/FileTypeDetection/packages.lock.json b/src/FileTypeDetection/packages.lock.json index 421c269a..6ead6d6c 100644 --- a/src/FileTypeDetection/packages.lock.json +++ b/src/FileTypeDetection/packages.lock.json @@ -4,13 +4,13 @@ ".NETStandard,Version=v2.0": { "Microsoft.Extensions.Logging.Abstractions": { "type": "Direct", - "requested": "[10.0.0, )", - "resolved": "10.0.0", - "contentHash": "FU/IfjDfwaMuKr414SSQNTIti/69bHEMb+QKrskRb26oVqpx3lNFXMjs/RC9ZUuhBhcwDM2BwOgoMw+PZ+beqQ==", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "lxl0WLk7ROgBFAsjcOYjQ8/DVK+VMszxGBzUhgtQmAsTNldLL5pk9NG/cWTsXHq0lUhUEAtZkEE7jOGOA8bGKQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", "System.Buffers": "4.6.1", - "System.Diagnostics.DiagnosticSource": "10.0.0", + "System.Diagnostics.DiagnosticSource": "10.0.3", "System.Memory": "4.6.3" } }, @@ -43,22 +43,19 @@ }, "SharpCompress": { "type": "Direct", - "requested": "[0.39.0, )", - "resolved": "0.39.0", - "contentHash": "0esqIUDlg68Z7+Weuge4QzEvNtawUO4obTJFL7xuf4DBHMxVRr+wbNgiX9arMrj3kGXQSvLe0zbZG3oxpkwJOA==", + "requested": "[0.46.2, )", + "resolved": "0.46.2", + "contentHash": "qLiVQXsKa1R0lc+StVpHLOLnMR7x0kFJrdfKoSRKJC8rPH0vtPTkYM13InEKgbhvHZ6HqJmA/iQVq/zmQ/5wxg==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "System.Buffers": "4.6.0", - "System.Memory": "4.6.0", - "System.Text.Encoding.CodePages": "8.0.0", - "ZstdSharp.Port": "0.8.4" + "System.Text.Encoding.CodePages": "8.0.0" } }, "System.Collections.Immutable": { "type": "Direct", - "requested": "[10.0.0, )", - "resolved": "10.0.0", - "contentHash": "BHo23kBFvTFQa0tuDFXcb3Q8QInjm1Xrq+If/xuV8iMlxOOsylsa6sgRK25n5dlcMk8G2f0O/t5AdjZrdVBOXA==", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "gpKPycgDFS2oAPr0yaqwBmShE1ya4yMMkn3lxBPcXrsCI4KL10xSu0cSUzeajQ7LKjb3EsUAgjhBiPGrGU6vSQ==", "dependencies": { "System.Memory": "4.6.3", "System.Runtime.CompilerServices.Unsafe": "6.1.2" @@ -66,9 +63,9 @@ }, "System.IO.Hashing": { "type": "Direct", - "requested": "[10.0.2, )", - "resolved": "10.0.2", - "contentHash": "AKJknIFi9O3+rGExxTry188JPvUoZAPcCtS2qdqyFhIzsxQ1Ap94BeGDG0VzVEHakhmRxmJtVih6TsHoghIt/g==", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "La6ICwsdTKhVX+LKN+pvFjQRR3LhLwq3uKdi2knjLzRyPYBSydF4cjXidYxIiTcDD6XVYdsBWQEI8ZxiZ/OdIg==", "dependencies": { "System.Buffers": "4.6.1", "System.Memory": "4.6.3" @@ -76,33 +73,33 @@ }, "System.Text.Json": { "type": "Direct", - "requested": "[10.0.0, )", - "resolved": "10.0.0", - "contentHash": "1Dpjwq9peG/Wt5BNbrzIhTpclfOSqBWZsUO28vVr59yQlkvL5jLBWfpfzRmJ1OY+6DciaY0DUcltyzs4fuZHjw==", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "NTUt9DL+maqbgrIYCAmeZUbX0NoXaueySyjW/bdOlFdSUDC1l51XnsbVEuj5tuad12vdq5Sviskp9uMVGgCNLw==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "10.0.0", + "Microsoft.Bcl.AsyncInterfaces": "10.0.3", "System.Buffers": "4.6.1", - "System.IO.Pipelines": "10.0.0", + "System.IO.Pipelines": "10.0.3", "System.Memory": "4.6.3", "System.Runtime.CompilerServices.Unsafe": "6.1.2", - "System.Text.Encodings.Web": "10.0.0", + "System.Text.Encodings.Web": "10.0.3", "System.Threading.Tasks.Extensions": "4.6.3" } }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", - "resolved": "10.0.0", - "contentHash": "vFuwSLj9QJBbNR0NeNO4YVASUbokxs+i/xbuu8B+Fs4FAZg5QaFa6eGrMaRqTzzNI5tAb97T7BhSxtLckFyiRA==", + "resolved": "10.0.3", + "contentHash": "TV62UsrJZPX6gbt3c4WrtXh7bmaDIcMqf9uft1cc4L6gJXOU07hDGEh+bFQh/L2Az0R1WVOkiT66lFqS6G2NmA==", "dependencies": { "System.Threading.Tasks.Extensions": "4.6.3" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.0", - "contentHash": "L3AdmZ1WOK4XXT5YFPEwyt0ep6l8lGIPs7F5OOBZc77Zqeo01Of7XXICy47628sdVl0v/owxYJTe86DTgFwKCA==", + "resolved": "10.0.3", + "contentHash": "bwGMrRcAMWx2s/RDgja97p27rxSz2pEQW0+rX5cWAUWVETVJ/eyxGfjAl8vuG5a+lckWmPIE+vcuaZNVB5YDdw==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "10.0.0", + "Microsoft.Bcl.AsyncInterfaces": "10.0.3", "System.Threading.Tasks.Extensions": "4.6.3" } }, @@ -123,8 +120,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "10.0.0", - "contentHash": "0KdBK+h7G13PuOSC2R/DalAoFMvdYMznvGRuICtkdcUMXgl/gYXsG6z4yUvTxHSMACorWgHCU1Faq0KUHU6yAQ==", + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==", "dependencies": { "System.Memory": "4.6.3", "System.Runtime.CompilerServices.Unsafe": "6.1.2" @@ -132,8 +129,8 @@ }, "System.IO.Pipelines": { "type": "Transitive", - "resolved": "10.0.0", - "contentHash": "M1eb3nfXntaRJPrrMVM9EFS8I1bDTnt0uvUS6QP/SicZf/ZZjydMD5NiXxfmwW/uQwaMDP/yX2P+zQN1NBHChg==", + "resolved": "10.0.3", + "contentHash": "WMxiA2jGdHnRBmoVK55YUq5VPaxW0Sg2frPtXV+urUMvpqHIga6lleV/YuryHIuGsAKVjQAjv6PrQ6IJpoLohQ==", "dependencies": { "System.Buffers": "4.6.1", "System.Memory": "4.6.3", @@ -171,8 +168,8 @@ }, "System.Text.Encodings.Web": { "type": "Transitive", - "resolved": "10.0.0", - "contentHash": "257hh1ep1Gqm1Lm0ulxf7vVBVMJuGN6EL4xSWjpi46DffXzm1058IiWsfSC06zSm7SniN+Tb5160UnXsSa8rRg==", + "resolved": "10.0.3", + "contentHash": "l8QNBPp92bVzl9Kw8nNtm1uYRNNhUrdulZjM4a8YK/QGNa8z9utKsC0bDoPB+Vq8LOlbD3fIyGlabtz80jT7cw==", "dependencies": { "System.Buffers": "4.6.1", "System.Memory": "4.6.3", @@ -186,26 +183,16 @@ "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.1.2" } - }, - "ZstdSharp.Port": { - "type": "Transitive", - "resolved": "0.8.4", - "contentHash": "eieSXq3kakCUXbgdxkKaRqWS6hF0KBJcqok9LlDCs60GOyrynLvPOcQ0pRw7shdPF7lh/VepJ9cP9n9HHc759g==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "5.0.0", - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } } }, "net10.0": { "Microsoft.Extensions.Logging.Abstractions": { "type": "Direct", - "requested": "[10.0.0, )", - "resolved": "10.0.0", - "contentHash": "FU/IfjDfwaMuKr414SSQNTIti/69bHEMb+QKrskRb26oVqpx3lNFXMjs/RC9ZUuhBhcwDM2BwOgoMw+PZ+beqQ==", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "lxl0WLk7ROgBFAsjcOYjQ8/DVK+VMszxGBzUhgtQmAsTNldLL5pk9NG/cWTsXHq0lUhUEAtZkEE7jOGOA8bGKQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3" } }, "Microsoft.IO.RecyclableMemoryStream": { @@ -225,44 +212,36 @@ }, "SharpCompress": { "type": "Direct", - "requested": "[0.39.0, )", - "resolved": "0.39.0", - "contentHash": "0esqIUDlg68Z7+Weuge4QzEvNtawUO4obTJFL7xuf4DBHMxVRr+wbNgiX9arMrj3kGXQSvLe0zbZG3oxpkwJOA==", - "dependencies": { - "ZstdSharp.Port": "0.8.4" - } + "requested": "[0.46.2, )", + "resolved": "0.46.2", + "contentHash": "qLiVQXsKa1R0lc+StVpHLOLnMR7x0kFJrdfKoSRKJC8rPH0vtPTkYM13InEKgbhvHZ6HqJmA/iQVq/zmQ/5wxg==" }, "System.IO.Hashing": { "type": "Direct", - "requested": "[10.0.2, )", - "resolved": "10.0.2", - "contentHash": "AKJknIFi9O3+rGExxTry188JPvUoZAPcCtS2qdqyFhIzsxQ1Ap94BeGDG0VzVEHakhmRxmJtVih6TsHoghIt/g==" + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "La6ICwsdTKhVX+LKN+pvFjQRR3LhLwq3uKdi2knjLzRyPYBSydF4cjXidYxIiTcDD6XVYdsBWQEI8ZxiZ/OdIg==" }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.0", - "contentHash": "L3AdmZ1WOK4XXT5YFPEwyt0ep6l8lGIPs7F5OOBZc77Zqeo01Of7XXICy47628sdVl0v/owxYJTe86DTgFwKCA==" + "resolved": "10.0.3", + "contentHash": "bwGMrRcAMWx2s/RDgja97p27rxSz2pEQW0+rX5cWAUWVETVJ/eyxGfjAl8vuG5a+lckWmPIE+vcuaZNVB5YDdw==" }, "MimeTypesMap": { "type": "Transitive", "resolved": "1.0.9", "contentHash": "M0TuSCwL1a8QV0VKw8ysY4AIs6v/Aor3N7GXQeqgNlAvqjx9Kj9KxNd09Pg5RzpY1tCOU8mkrfYBi1Lxwj8quQ==" - }, - "ZstdSharp.Port": { - "type": "Transitive", - "resolved": "0.8.4", - "contentHash": "eieSXq3kakCUXbgdxkKaRqWS6hF0KBJcqok9LlDCs60GOyrynLvPOcQ0pRw7shdPF7lh/VepJ9cP9n9HHc759g==" } }, "net8.0": { "Microsoft.Extensions.Logging.Abstractions": { "type": "Direct", - "requested": "[10.0.0, )", - "resolved": "10.0.0", - "contentHash": "FU/IfjDfwaMuKr414SSQNTIti/69bHEMb+QKrskRb26oVqpx3lNFXMjs/RC9ZUuhBhcwDM2BwOgoMw+PZ+beqQ==", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "lxl0WLk7ROgBFAsjcOYjQ8/DVK+VMszxGBzUhgtQmAsTNldLL5pk9NG/cWTsXHq0lUhUEAtZkEE7jOGOA8bGKQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0", - "System.Diagnostics.DiagnosticSource": "10.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3", + "System.Diagnostics.DiagnosticSource": "10.0.3" } }, "Microsoft.IO.RecyclableMemoryStream": { @@ -282,23 +261,20 @@ }, "SharpCompress": { "type": "Direct", - "requested": "[0.39.0, )", - "resolved": "0.39.0", - "contentHash": "0esqIUDlg68Z7+Weuge4QzEvNtawUO4obTJFL7xuf4DBHMxVRr+wbNgiX9arMrj3kGXQSvLe0zbZG3oxpkwJOA==", - "dependencies": { - "ZstdSharp.Port": "0.8.4" - } + "requested": "[0.46.2, )", + "resolved": "0.46.2", + "contentHash": "qLiVQXsKa1R0lc+StVpHLOLnMR7x0kFJrdfKoSRKJC8rPH0vtPTkYM13InEKgbhvHZ6HqJmA/iQVq/zmQ/5wxg==" }, "System.IO.Hashing": { "type": "Direct", - "requested": "[10.0.2, )", - "resolved": "10.0.2", - "contentHash": "AKJknIFi9O3+rGExxTry188JPvUoZAPcCtS2qdqyFhIzsxQ1Ap94BeGDG0VzVEHakhmRxmJtVih6TsHoghIt/g==" + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "La6ICwsdTKhVX+LKN+pvFjQRR3LhLwq3uKdi2knjLzRyPYBSydF4cjXidYxIiTcDD6XVYdsBWQEI8ZxiZ/OdIg==" }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.0", - "contentHash": "L3AdmZ1WOK4XXT5YFPEwyt0ep6l8lGIPs7F5OOBZc77Zqeo01Of7XXICy47628sdVl0v/owxYJTe86DTgFwKCA==" + "resolved": "10.0.3", + "contentHash": "bwGMrRcAMWx2s/RDgja97p27rxSz2pEQW0+rX5cWAUWVETVJ/eyxGfjAl8vuG5a+lckWmPIE+vcuaZNVB5YDdw==" }, "MimeTypesMap": { "type": "Transitive", @@ -307,13 +283,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "10.0.0", - "contentHash": "0KdBK+h7G13PuOSC2R/DalAoFMvdYMznvGRuICtkdcUMXgl/gYXsG6z4yUvTxHSMACorWgHCU1Faq0KUHU6yAQ==" - }, - "ZstdSharp.Port": { - "type": "Transitive", - "resolved": "0.8.4", - "contentHash": "eieSXq3kakCUXbgdxkKaRqWS6hF0KBJcqok9LlDCs60GOyrynLvPOcQ0pRw7shdPF7lh/VepJ9cP9n9HHc759g==" + "resolved": "10.0.3", + "contentHash": "IuZXyF3K5X+mCsBKIQ87Cn/V4Nyb39vyCbzfH/AkoneSWNV/ExGQ/I0m4CEaVAeFh9fW6kp2NVObkmevd1Ys7A==" } } } diff --git a/tests/FileTypeDetectionLib.Tests/Support/ArchivePayloadFactory.cs b/tests/FileTypeDetectionLib.Tests/Support/ArchivePayloadFactory.cs index 9a10fedb..d8fac7be 100644 --- a/tests/FileTypeDetectionLib.Tests/Support/ArchivePayloadFactory.cs +++ b/tests/FileTypeDetectionLib.Tests/Support/ArchivePayloadFactory.cs @@ -10,7 +10,7 @@ internal static class ArchivePayloadFactory internal static byte[] CreateZipWithSingleEntry(string entryName, string content) { using var ms = new MemoryStream(); - using (var writer = WriterFactory.Open(ms, ArchiveType.Zip, new WriterOptions(CompressionType.Deflate))) + using (var writer = WriterFactory.OpenWriter(ms, ArchiveType.Zip, new WriterOptions(CompressionType.Deflate))) using (var payload = new MemoryStream(Encoding.UTF8.GetBytes(content))) { writer.Write(string.IsNullOrWhiteSpace(entryName) ? "note.txt" : entryName, payload, DateTime.UnixEpoch); @@ -22,7 +22,7 @@ internal static byte[] CreateZipWithSingleEntry(string entryName, string content internal static byte[] CreateTarWithSingleEntry(string entryName, string content) { using var ms = new MemoryStream(); - using (var writer = WriterFactory.Open(ms, ArchiveType.Tar, new WriterOptions(CompressionType.None))) + using (var writer = WriterFactory.OpenWriter(ms, ArchiveType.Tar, new WriterOptions(CompressionType.None))) using (var payload = new MemoryStream(Encoding.UTF8.GetBytes(content))) { writer.Write(string.IsNullOrWhiteSpace(entryName) ? "note.txt" : entryName, payload, DateTime.UnixEpoch); @@ -34,7 +34,7 @@ internal static byte[] CreateTarWithSingleEntry(string entryName, string content internal static byte[] CreateGZipWithSingleEntry(string entryName, byte[] payload) { using var ms = new MemoryStream(); - using (var writer = WriterFactory.Open(ms, ArchiveType.GZip, new WriterOptions(CompressionType.GZip))) + using (var writer = WriterFactory.OpenWriter(ms, ArchiveType.GZip, new WriterOptions(CompressionType.GZip))) using (var source = new MemoryStream(payload, false)) { writer.Write(string.IsNullOrWhiteSpace(entryName) ? "payload.bin" : entryName, source, DateTime.UnixEpoch); @@ -71,4 +71,4 @@ internal static byte[] CreateTarWithSymlink(string fileName, string fileContent, return ms.ToArray(); } -} \ No newline at end of file +} diff --git a/tests/FileTypeDetectionLib.Tests/Unit/ArchiveInternalsNestedBranchUnitTests.cs b/tests/FileTypeDetectionLib.Tests/Unit/ArchiveInternalsNestedBranchUnitTests.cs index 537b8a0b..987f3a10 100644 --- a/tests/FileTypeDetectionLib.Tests/Unit/ArchiveInternalsNestedBranchUnitTests.cs +++ b/tests/FileTypeDetectionLib.Tests/Unit/ArchiveInternalsNestedBranchUnitTests.cs @@ -3,6 +3,7 @@ using SharpCompress.Archives; using SharpCompress.Archives.Zip; using SharpCompress.Common; +using SharpCompress.Readers; using SharpCompress.Writers; using Tomtastisch.FileClassifier; @@ -81,17 +82,17 @@ public void TryReadEntryPayloadBounded_ReturnsFalse_ForInvalidInputs() new object?[] { CreateZipArchiveEntry("a.txt", new byte[] { 1 }), 0L, null }))); } - private static ZipArchiveEntry CreateZipArchiveEntry(string name, byte[] payload) + private static IArchiveEntry CreateZipArchiveEntry(string name, byte[] payload) { using var ms = new MemoryStream(); - using (var writer = WriterFactory.Open(ms, ArchiveType.Zip, new WriterOptions(CompressionType.Deflate))) + using (var writer = WriterFactory.OpenWriter(ms, ArchiveType.Zip, new WriterOptions(CompressionType.Deflate))) using (var data = new MemoryStream(payload, false)) { writer.Write(name, data, DateTime.UnixEpoch); } ms.Position = 0; - var archive = ZipArchive.Open(ms); + var archive = ZipArchive.OpenArchive(ms, new ReaderOptions { LeaveStreamOpen = true }); return archive.Entries.First(); } } diff --git a/tests/FileTypeDetectionLib.Tests/Unit/CoreAndArchiveInternalsFailClosedUnitTests.cs b/tests/FileTypeDetectionLib.Tests/Unit/CoreAndArchiveInternalsFailClosedUnitTests.cs index 60f54f1c..b422bffe 100644 --- a/tests/FileTypeDetectionLib.Tests/Unit/CoreAndArchiveInternalsFailClosedUnitTests.cs +++ b/tests/FileTypeDetectionLib.Tests/Unit/CoreAndArchiveInternalsFailClosedUnitTests.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.Logging; using SharpCompress.Archives; using SharpCompress.Common; +using SharpCompress.Readers; using Tomtastisch.FileClassifier; namespace FileTypeDetectionLib.Tests.Unit; @@ -161,7 +162,7 @@ public void SharpCompressEntryModel_MapsArchiveEntryFields_ForConcreteEntry() { var payload = ArchivePayloadFactory.CreateTarWithSingleEntry("inner/note.txt", "hello"); using var ms = new MemoryStream(payload, false); - using var archive = ArchiveFactory.Open(ms); + using var archive = ArchiveFactory.OpenArchive(ms, new ReaderOptions { LeaveStreamOpen = true }); var entry = archive.Entries.First(e => !e.IsDirectory); var model = new SharpCompressEntryModel(entry); diff --git a/tests/FileTypeDetectionLib.Tests/Unit/SharpCompressArchiveBackendUnitTests.cs b/tests/FileTypeDetectionLib.Tests/Unit/SharpCompressArchiveBackendUnitTests.cs index 49ec0835..3f4780dc 100644 --- a/tests/FileTypeDetectionLib.Tests/Unit/SharpCompressArchiveBackendUnitTests.cs +++ b/tests/FileTypeDetectionLib.Tests/Unit/SharpCompressArchiveBackendUnitTests.cs @@ -109,7 +109,7 @@ public void Process_ReturnsFalse_WhenExtractorReturnsFalse() private static byte[] CreateTarWithEntries(int entryCount, int entrySize) { using var ms = new MemoryStream(); - using (var writer = WriterFactory.Open(ms, ArchiveType.Tar, new WriterOptions(CompressionType.None))) + using (var writer = WriterFactory.OpenWriter(ms, ArchiveType.Tar, new WriterOptions(CompressionType.None))) { for (var i = 0; i < entryCount; i++) { @@ -124,4 +124,4 @@ private static byte[] CreateTarWithEntries(int entryCount, int entrySize) return ms.ToArray(); } -} \ No newline at end of file +} diff --git a/tests/FileTypeDetectionLib.Tests/Unit/SharpCompressEntryModelNonNullUnitTests.cs b/tests/FileTypeDetectionLib.Tests/Unit/SharpCompressEntryModelNonNullUnitTests.cs index 36bdaaac..39379f10 100644 --- a/tests/FileTypeDetectionLib.Tests/Unit/SharpCompressEntryModelNonNullUnitTests.cs +++ b/tests/FileTypeDetectionLib.Tests/Unit/SharpCompressEntryModelNonNullUnitTests.cs @@ -1,6 +1,7 @@ using System.Text; using SharpCompress.Archives; using SharpCompress.Common; +using SharpCompress.Readers; using SharpCompress.Writers; using Tomtastisch.FileClassifier; @@ -13,7 +14,7 @@ public void Properties_ReturnValues_ForRealArchiveEntry() { var payload = CreateTarWithEntry("note.txt", "hello"); using var stream = new MemoryStream(payload, false); - using var archive = ArchiveFactory.Open(stream); + using var archive = ArchiveFactory.OpenArchive(stream, new ReaderOptions { LeaveStreamOpen = true }); var entry = archive.Entries.First(); var model = new SharpCompressEntryModel(entry); @@ -30,7 +31,7 @@ public void Properties_ReturnValues_ForRealArchiveEntry() private static byte[] CreateTarWithEntry(string name, string content) { using var ms = new MemoryStream(); - using (var writer = WriterFactory.Open(ms, ArchiveType.Tar, new WriterOptions(CompressionType.None))) + using (var writer = WriterFactory.OpenWriter(ms, ArchiveType.Tar, new WriterOptions(CompressionType.None))) using (var data = new MemoryStream(Encoding.UTF8.GetBytes(content))) { writer.Write(name, data, DateTime.UnixEpoch); diff --git a/tests/FileTypeDetectionLib.Tests/packages.lock.json b/tests/FileTypeDetectionLib.Tests/packages.lock.json index 31af74c7..c327a6c3 100644 --- a/tests/FileTypeDetectionLib.Tests/packages.lock.json +++ b/tests/FileTypeDetectionLib.Tests/packages.lock.json @@ -4,21 +4,21 @@ "net10.0": { "coverlet.collector": { "type": "Direct", - "requested": "[6.0.4, )", - "resolved": "6.0.4", - "contentHash": "lkhqpF8Pu2Y7IiN7OntbsTtdbpR1syMsm2F3IgX6ootA4ffRqWL5jF7XipHuZQTdVuWG/gVAAcf8mjk8Tz0xPg==" + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "EMkj/2F6n6IVPrvGYkqzGJs6phuGGkq6N+E7KW9rNyzNxXbwQ1KfMqWyXNf9nCNEQOA6IjFwmOLvkriwKE7Orw==" }, "coverlet.msbuild": { "type": "Direct", - "requested": "[6.0.4, )", - "resolved": "6.0.4", - "contentHash": "Qa7Hg+wrOMDKpXVn2dw4Wlun490bIWsFW0fdNJQFJLZnbU27MCP0HJ2mPgS+3EQBQUb0zKlkwiQzP+j38Hc3Iw==" + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "2Kd7SC2da4J8eSAUUHevT2VII53teLGIbbGXmdbdmCL/8g89BFCDAe+Qm3mF2h7nkuFxjK1SXYQxLvHd4gMm2Q==" }, "FsCheck": { "type": "Direct", - "requested": "[3.2.0, )", - "resolved": "3.2.0", - "contentHash": "NrPg83xMofIEjInYxPqnZQGv6q/xUKCP67yWJ7kUKu+vjpguQvzsqhWQfLYOanVIqUqXa54ot67cOPJ3twdYLA==", + "requested": "[3.3.2, )", + "resolved": "3.3.2", + "contentHash": "JlK719ZlP/ofbsN0qXYrfqbe2SCgp4D1BEyJynkzyurMI2JqUkWgZHXgEu0pXVdj35zU/GWsXrGYA68sSdAmHQ==", "dependencies": { "FSharp.Core": "5.0.2" } @@ -59,13 +59,11 @@ }, "xunit.v3": { "type": "Direct", - "requested": "[2.0.0, )", - "resolved": "2.0.0", - "contentHash": "gy0M8kElQONiemRfZtvFzJoM9eVhneENz+8N1WdW0xfMgdMD9IuM1wwaQgj2zfkMgMFixMk0kxSvimyYNoBAKw==", + "requested": "[3.2.2, )", + "resolved": "3.2.2", + "contentHash": "L+4/4y0Uqcg8/d6hfnxhnwh4j9FaeULvefTwrk30rr1o4n/vdPfyUQ8k0yzH8VJx7bmFEkDdcRfbtbjEHlaYcA==", "dependencies": { - "xunit.analyzers": "1.20.0", - "xunit.v3.assert": "[2.0.0]", - "xunit.v3.core": "[2.0.0]" + "xunit.v3.mtp-v1": "[3.2.2]" } }, "Cucumber.CucumberExpressions": { @@ -99,6 +97,11 @@ "Cucumber.Messages": "29.0.1" } }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", "resolved": "9.0.6", @@ -111,33 +114,42 @@ }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.0", - "contentHash": "L3AdmZ1WOK4XXT5YFPEwyt0ep6l8lGIPs7F5OOBZc77Zqeo01Of7XXICy47628sdVl0v/owxYJTe86DTgFwKCA==" + "resolved": "10.0.3", + "contentHash": "bwGMrRcAMWx2s/RDgja97p27rxSz2pEQW0+rX5cWAUWVETVJ/eyxGfjAl8vuG5a+lckWmPIE+vcuaZNVB5YDdw==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", "resolved": "8.0.2", "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "Transitive", + "resolved": "1.9.1", + "contentHash": "No5AudZMmSb+uNXjlgL2y3/stHD2IT4uxqc5yHwkE+/nNux9jbKcaJMvcp9SwgP4DVD8L9/P3OUz8mmmcvEIdQ==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "1.9.1" + } + }, "Microsoft.Testing.Extensions.TrxReport.Abstractions": { "type": "Transitive", - "resolved": "1.6.2", - "contentHash": "EE4PoYoRtrTKE0R22bXuBguVgdEeepImy0S8xHaZOcGz5AuahB2i+0CV4UTefLqO1dtbA4APfumpP1la+Yn3SA==", + "resolved": "1.9.1", + "contentHash": "AL46Xe1WBi85Ntd4mNPvat5ZSsZ2uejiVqoKCypr8J3wK0elA5xJ3AN4G/Q4GIwzUFnggZoH/DBjnr9J18IO/g==", "dependencies": { - "Microsoft.Testing.Platform": "1.6.2" + "Microsoft.Testing.Platform": "1.9.1" } }, "Microsoft.Testing.Platform": { "type": "Transitive", - "resolved": "1.6.2", - "contentHash": "7CFJKN3An5Ra6YOrTCAi7VldSRTxGGokqC0NSNrpKTKO6NJJby10EWwnqV/v2tawcRzfSbLpKNpvBv7s7ZoD3Q==" + "resolved": "1.9.1", + "contentHash": "QafNtNSmEI0zazdebnsIkDKmFtTSpmx/5PLOjURWwozcPb3tvRxzosQSL8xwYNM1iPhhKiBksXZyRSE2COisrA==" }, "Microsoft.Testing.Platform.MSBuild": { "type": "Transitive", - "resolved": "1.6.2", - "contentHash": "tF5UgrXh0b0F8N11uWfaZT91v5QvuTZDwWP19GDMHPalWFKfmlix92xExo7cotJDoAK+bzljLK0S0XJuigYLbA==", + "resolved": "1.9.1", + "contentHash": "oTUtyR4X/s9ytuiNA29FGsNCCH0rNmY5Wdm14NCKLjTM1cT9edVSlA+rGS/mVmusPqcP0l/x9qOnMXg16v87RQ==", "dependencies": { - "Microsoft.Testing.Platform": "1.6.2" + "Microsoft.Testing.Platform": "1.9.1" } }, "Microsoft.TestPlatform.ObjectModel": { @@ -154,6 +166,11 @@ "Newtonsoft.Json": "13.0.3" } }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, "MimeTypesMap": { "type": "Transitive", "resolved": "1.0.9", @@ -179,81 +196,88 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.20.0", - "contentHash": "HElev2E9vFbPxwKRQtpCSSzLOu8M/N9EWBCB37v7SRx6z4Lbj19FxfLEig3v9jiI6s4b0l2uena91nEsTWl9jA==" + "resolved": "1.27.0", + "contentHash": "y/pxIQaLvk/kxAoDkZW9GnHLCEqzwl5TW0vtX3pweyQpjizB9y3DXhb9pkw2dGeUqhLjsxvvJM1k89JowU6z3g==" }, "xunit.v3.assert": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "acgfaclCB+FX5s4tQLTmTW2mc5tsOMtIAKizyCnZyxjbJpc10vGNaMvwsE0Pw7wGplet3PJfXffsMO4pRDJIfA==" + "resolved": "3.2.2", + "contentHash": "BPciBghgEEaJN/JG00QfCYDfEfnLgQhfnYEy+j1izoeHVNYd5+3Wm8GJ6JgYysOhpBPYGE+sbf75JtrRc7jrdA==" }, "xunit.v3.common": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "0BG62sA0xS5j4WSGqLzv5HXBM41sw4opEe3DhAN0wa7l1N2lNAyuV6Vq5mJT/tIYmJFeICD7lv0c39AgBqiQ8Q==", + "resolved": "3.2.2", + "contentHash": "Hj775PEH6GTbbg0wfKRvG2hNspDCvTH9irXhH4qIWgdrOSV1sQlqPie+DOvFeigsFg2fxSM3ZAaaCDQs+KreFA==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0" } }, - "xunit.v3.core": { + "xunit.v3.core.mtp-v1": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "Nwb8qyETji/1PP7jmgOy6u6RJC7h4jo5UmxLBswqrixNeONtB2qjHGyOl5/6IuzB4GsJpRA8Mdz2E+LxRqAukg==", + "resolved": "3.2.2", + "contentHash": "Ga5aA2Ca9ktz+5k3g5ukzwfexwoqwDUpV6z7atSEUvqtd6JuybU1XopHqg1oFd78QdTfZgZE9h5sHpO4qYIi5w==", "dependencies": { - "Microsoft.Testing.Platform.MSBuild": "1.6.2", - "xunit.v3.extensibility.core": "[2.0.0]", - "xunit.v3.runner.inproc.console": "[2.0.0]" + "Microsoft.Testing.Extensions.Telemetry": "1.9.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.9.1", + "Microsoft.Testing.Platform": "1.9.1", + "Microsoft.Testing.Platform.MSBuild": "1.9.1", + "xunit.v3.extensibility.core": "[3.2.2]", + "xunit.v3.runner.inproc.console": "[3.2.2]" } }, "xunit.v3.extensibility.core": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "78Ep8QNHHevCZ2ADr3wwDrSQUeq+xNmzdek4ssGLf+nEoK9KntWlJWQiO4BOKoc75OHUKbeG7JB2h3WW80NSDg==", + "resolved": "3.2.2", + "contentHash": "srY8z/oMPvh/t8axtO2DwrHajhFMH7tnqKildvYrVQIfICi8fOn3yIBWkVPAcrKmHMwvXRJ/XsQM3VMR6DOYfQ==", "dependencies": { - "xunit.v3.common": "[2.0.0]" + "xunit.v3.common": "[3.2.2]" } }, - "xunit.v3.runner.common": { + "xunit.v3.mtp-v1": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "XHvSqGp2h1w81eKo53fQWFEGPIiDiZYRtTmFD9revpfc0xLmrDJXkQQVTqY25WD+gi2Ulg3UjCfazj1WBmRadQ==", + "resolved": "3.2.2", + "contentHash": "O41aAzYKBT5PWqATa1oEWVNCyEUypFQ4va6K0kz37dduV3EKzXNMaV2UnEhufzU4Cce1I33gg0oldS8tGL5I0A==", "dependencies": { - "xunit.v3.common": "[2.0.0]" + "xunit.analyzers": "1.27.0", + "xunit.v3.assert": "[3.2.2]", + "xunit.v3.core.mtp-v1": "[3.2.2]" } }, - "xunit.v3.runner.inproc.console": { + "xunit.v3.runner.common": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "2WZzkcFJ1RgbjX0wXP56rcS4V2RPtGZuGToBOyxAZMcJ2f9T7X7mD5DK5ztyHIsmHz+IhdwklSbU1U3NmakGow==", + "resolved": "3.2.2", + "contentHash": "/hkHkQCzGrugelOAehprm7RIWdsUFVmIVaD6jDH/8DNGCymTlKKPTbGokD5czbAfqfex47mBP0sb0zbHYwrO/g==", "dependencies": { - "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.6.2", - "Microsoft.Testing.Platform": "1.6.2", - "xunit.v3.extensibility.core": "[2.0.0]", - "xunit.v3.runner.common": "[2.0.0]" + "Microsoft.Win32.Registry": "[5.0.0]", + "xunit.v3.common": "[3.2.2]" } }, - "ZstdSharp.Port": { + "xunit.v3.runner.inproc.console": { "type": "Transitive", - "resolved": "0.8.4", - "contentHash": "eieSXq3kakCUXbgdxkKaRqWS6hF0KBJcqok9LlDCs60GOyrynLvPOcQ0pRw7shdPF7lh/VepJ9cP9n9HHc759g==" + "resolved": "3.2.2", + "contentHash": "ulWOdSvCk+bPXijJZ73bth9NyoOHsAs1ZOvamYbCkD4DNLX/Bd29Ve2ZNUwBbK0MqfIYWXHZViy/HKrdEC/izw==", + "dependencies": { + "xunit.v3.extensibility.core": "[3.2.2]", + "xunit.v3.runner.common": "[3.2.2]" + } }, "Tomtastisch.FileClassifier": { "type": "Project", "dependencies": { - "Microsoft.Extensions.Logging.Abstractions": "[10.0.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[10.0.3, )", "Microsoft.IO.RecyclableMemoryStream": "[3.0.1, )", "Mime": "[3.8.0, )", - "SharpCompress": "[0.39.0, )", - "System.IO.Hashing": "[10.0.2, )" + "SharpCompress": "[0.46.2, )", + "System.IO.Hashing": "[10.0.3, )" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "CentralTransitive", - "requested": "[10.0.0, )", - "resolved": "10.0.0", - "contentHash": "FU/IfjDfwaMuKr414SSQNTIti/69bHEMb+QKrskRb26oVqpx3lNFXMjs/RC9ZUuhBhcwDM2BwOgoMw+PZ+beqQ==", + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "lxl0WLk7ROgBFAsjcOYjQ8/DVK+VMszxGBzUhgtQmAsTNldLL5pk9NG/cWTsXHq0lUhUEAtZkEE7jOGOA8bGKQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3" } }, "Microsoft.IO.RecyclableMemoryStream": { @@ -273,18 +297,15 @@ }, "SharpCompress": { "type": "CentralTransitive", - "requested": "[0.39.0, )", - "resolved": "0.39.0", - "contentHash": "0esqIUDlg68Z7+Weuge4QzEvNtawUO4obTJFL7xuf4DBHMxVRr+wbNgiX9arMrj3kGXQSvLe0zbZG3oxpkwJOA==", - "dependencies": { - "ZstdSharp.Port": "0.8.4" - } + "requested": "[0.46.2, )", + "resolved": "0.46.2", + "contentHash": "qLiVQXsKa1R0lc+StVpHLOLnMR7x0kFJrdfKoSRKJC8rPH0vtPTkYM13InEKgbhvHZ6HqJmA/iQVq/zmQ/5wxg==" }, "System.IO.Hashing": { "type": "CentralTransitive", - "requested": "[10.0.2, )", - "resolved": "10.0.2", - "contentHash": "AKJknIFi9O3+rGExxTry188JPvUoZAPcCtS2qdqyFhIzsxQ1Ap94BeGDG0VzVEHakhmRxmJtVih6TsHoghIt/g==" + "requested": "[10.0.3, )", + "resolved": "10.0.3", + "contentHash": "La6ICwsdTKhVX+LKN+pvFjQRR3LhLwq3uKdi2knjLzRyPYBSydF4cjXidYxIiTcDD6XVYdsBWQEI8ZxiZ/OdIg==" } } } diff --git a/tests/PackageBacked.Tests/PackageBacked.Tests.csproj b/tests/PackageBacked.Tests/PackageBacked.Tests.csproj index 10b0c07f..20b967fd 100644 --- a/tests/PackageBacked.Tests/PackageBacked.Tests.csproj +++ b/tests/PackageBacked.Tests/PackageBacked.Tests.csproj @@ -1,6 +1,8 @@ - net8.0;net10.0 + net10.0 + Exe + true enable enable false @@ -12,7 +14,7 @@ - + diff --git a/tests/PackageBacked.Tests/packages.lock.json b/tests/PackageBacked.Tests/packages.lock.json index 0c7b0a60..87efee27 100644 --- a/tests/PackageBacked.Tests/packages.lock.json +++ b/tests/PackageBacked.Tests/packages.lock.json @@ -14,10 +14,11 @@ }, "Tomtastisch.FileClassifier": { "type": "Direct", - "requested": "[4.4.0, )", - "resolved": "4.4.0", - "contentHash": "USMirK3EvVGy71q2lCxBkkKNB4R/Eu8oUrj5SIM39sZne9IMb1/YsernZDVQ3Uk/bcBRt9nF0+kBY4cV91GzCA==", + "requested": "[5.2.0, )", + "resolved": "5.2.0", + "contentHash": "L5Xn2AkR4S/+2uqqtkzxqucEEhTMvtnN6yQ3x86W4DDgg+ePurchdJ5BQSssTJIG8zOu6s27AGmoPlBcXCBKLg==", "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "10.0.0", "Microsoft.IO.RecyclableMemoryStream": "3.0.1", "Mime": "3.8.0", "SharpCompress": "0.39.0", @@ -32,15 +33,18 @@ }, "xunit.v3": { "type": "Direct", - "requested": "[2.0.0, )", - "resolved": "2.0.0", - "contentHash": "gy0M8kElQONiemRfZtvFzJoM9eVhneENz+8N1WdW0xfMgdMD9IuM1wwaQgj2zfkMgMFixMk0kxSvimyYNoBAKw==", + "requested": "[3.2.2, )", + "resolved": "3.2.2", + "contentHash": "L+4/4y0Uqcg8/d6hfnxhnwh4j9FaeULvefTwrk30rr1o4n/vdPfyUQ8k0yzH8VJx7bmFEkDdcRfbtbjEHlaYcA==", "dependencies": { - "xunit.analyzers": "1.20.0", - "xunit.v3.assert": "[2.0.0]", - "xunit.v3.core": "[2.0.0]" + "xunit.v3.mtp-v1": "[3.2.2]" } }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", "resolved": "6.0.0", @@ -51,212 +55,52 @@ "resolved": "18.0.1", "contentHash": "O+utSr97NAJowIQT/OVp3Lh9QgW/wALVTP4RG1m2AfFP4IyJmJz0ZBmFJUsRQiAPgq6IRC0t8AAzsiPIsaUDEA==" }, - "Microsoft.IO.RecyclableMemoryStream": { - "type": "Transitive", - "resolved": "3.0.1", - "contentHash": "s/s20YTVY9r9TPfTrN5g8zPF1YhwxyqO6PxUkrYTGI2B+OGPe9AdajWZrLhFqXIvqIW23fnUE4+ztrUWNU1+9g==" - }, - "Microsoft.Testing.Extensions.TrxReport.Abstractions": { - "type": "Transitive", - "resolved": "1.6.2", - "contentHash": "EE4PoYoRtrTKE0R22bXuBguVgdEeepImy0S8xHaZOcGz5AuahB2i+0CV4UTefLqO1dtbA4APfumpP1la+Yn3SA==", - "dependencies": { - "Microsoft.Testing.Platform": "1.6.2" - } - }, - "Microsoft.Testing.Platform": { - "type": "Transitive", - "resolved": "1.6.2", - "contentHash": "7CFJKN3An5Ra6YOrTCAi7VldSRTxGGokqC0NSNrpKTKO6NJJby10EWwnqV/v2tawcRzfSbLpKNpvBv7s7ZoD3Q==" - }, - "Microsoft.Testing.Platform.MSBuild": { - "type": "Transitive", - "resolved": "1.6.2", - "contentHash": "tF5UgrXh0b0F8N11uWfaZT91v5QvuTZDwWP19GDMHPalWFKfmlix92xExo7cotJDoAK+bzljLK0S0XJuigYLbA==", - "dependencies": { - "Microsoft.Testing.Platform": "1.6.2" - } - }, - "Microsoft.TestPlatform.ObjectModel": { - "type": "Transitive", - "resolved": "18.0.1", - "contentHash": "qT/mwMcLF9BieRkzOBPL2qCopl8hQu6A1P7JWAoj/FMu5i9vds/7cjbJ/LLtaiwWevWLAeD5v5wjQJ/l6jvhWQ==" - }, - "Microsoft.TestPlatform.TestHost": { - "type": "Transitive", - "resolved": "18.0.1", - "contentHash": "uDJKAEjFTaa2wHdWlfo6ektyoh+WD4/Eesrwb4FpBFKsLGehhACVnwwTI4qD3FrIlIEPlxdXg3SyrYRIcO+RRQ==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.0.1", - "Newtonsoft.Json": "13.0.3" - } - }, - "Mime": { - "type": "Transitive", - "resolved": "3.8.0", - "contentHash": "SG8QHXjnyLoVeIOSw4ym7orS5LIRPBpzFQYfkgSqyAkeog+eZNMj32UOEO1SxLNBASxNPgVBIacxOOZsenBImg==", - "dependencies": { - "MimeTypesMap": "1.0.9" - } - }, - "MimeTypesMap": { - "type": "Transitive", - "resolved": "1.0.9", - "contentHash": "M0TuSCwL1a8QV0VKw8ysY4AIs6v/Aor3N7GXQeqgNlAvqjx9Kj9KxNd09Pg5RzpY1tCOU8mkrfYBi1Lxwj8quQ==" - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" - }, - "SharpCompress": { - "type": "Transitive", - "resolved": "0.39.0", - "contentHash": "0esqIUDlg68Z7+Weuge4QzEvNtawUO4obTJFL7xuf4DBHMxVRr+wbNgiX9arMrj3kGXQSvLe0zbZG3oxpkwJOA==", - "dependencies": { - "ZstdSharp.Port": "0.8.4" - } - }, - "System.IO.Hashing": { - "type": "Transitive", - "resolved": "10.0.2", - "contentHash": "AKJknIFi9O3+rGExxTry188JPvUoZAPcCtS2qdqyFhIzsxQ1Ap94BeGDG0VzVEHakhmRxmJtVih6TsHoghIt/g==" - }, - "xunit.analyzers": { + "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "1.20.0", - "contentHash": "HElev2E9vFbPxwKRQtpCSSzLOu8M/N9EWBCB37v7SRx6z4Lbj19FxfLEig3v9jiI6s4b0l2uena91nEsTWl9jA==" + "resolved": "10.0.0", + "contentHash": "L3AdmZ1WOK4XXT5YFPEwyt0ep6l8lGIPs7F5OOBZc77Zqeo01Of7XXICy47628sdVl0v/owxYJTe86DTgFwKCA==" }, - "xunit.v3.assert": { + "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "acgfaclCB+FX5s4tQLTmTW2mc5tsOMtIAKizyCnZyxjbJpc10vGNaMvwsE0Pw7wGplet3PJfXffsMO4pRDJIfA==" - }, - "xunit.v3.common": { - "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "0BG62sA0xS5j4WSGqLzv5HXBM41sw4opEe3DhAN0wa7l1N2lNAyuV6Vq5mJT/tIYmJFeICD7lv0c39AgBqiQ8Q==", + "resolved": "10.0.0", + "contentHash": "FU/IfjDfwaMuKr414SSQNTIti/69bHEMb+QKrskRb26oVqpx3lNFXMjs/RC9ZUuhBhcwDM2BwOgoMw+PZ+beqQ==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0" } }, - "xunit.v3.core": { - "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "Nwb8qyETji/1PP7jmgOy6u6RJC7h4jo5UmxLBswqrixNeONtB2qjHGyOl5/6IuzB4GsJpRA8Mdz2E+LxRqAukg==", - "dependencies": { - "Microsoft.Testing.Platform.MSBuild": "1.6.2", - "xunit.v3.extensibility.core": "[2.0.0]", - "xunit.v3.runner.inproc.console": "[2.0.0]" - } - }, - "xunit.v3.extensibility.core": { - "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "78Ep8QNHHevCZ2ADr3wwDrSQUeq+xNmzdek4ssGLf+nEoK9KntWlJWQiO4BOKoc75OHUKbeG7JB2h3WW80NSDg==", - "dependencies": { - "xunit.v3.common": "[2.0.0]" - } - }, - "xunit.v3.runner.common": { - "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "XHvSqGp2h1w81eKo53fQWFEGPIiDiZYRtTmFD9revpfc0xLmrDJXkQQVTqY25WD+gi2Ulg3UjCfazj1WBmRadQ==", - "dependencies": { - "xunit.v3.common": "[2.0.0]" - } - }, - "xunit.v3.runner.inproc.console": { + "Microsoft.IO.RecyclableMemoryStream": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "2WZzkcFJ1RgbjX0wXP56rcS4V2RPtGZuGToBOyxAZMcJ2f9T7X7mD5DK5ztyHIsmHz+IhdwklSbU1U3NmakGow==", - "dependencies": { - "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.6.2", - "Microsoft.Testing.Platform": "1.6.2", - "xunit.v3.extensibility.core": "[2.0.0]", - "xunit.v3.runner.common": "[2.0.0]" - } + "resolved": "3.0.1", + "contentHash": "s/s20YTVY9r9TPfTrN5g8zPF1YhwxyqO6PxUkrYTGI2B+OGPe9AdajWZrLhFqXIvqIW23fnUE4+ztrUWNU1+9g==" }, - "ZstdSharp.Port": { + "Microsoft.Testing.Extensions.Telemetry": { "type": "Transitive", - "resolved": "0.8.4", - "contentHash": "eieSXq3kakCUXbgdxkKaRqWS6hF0KBJcqok9LlDCs60GOyrynLvPOcQ0pRw7shdPF7lh/VepJ9cP9n9HHc759g==" - } - }, - "net8.0": { - "Microsoft.NET.Test.Sdk": { - "type": "Direct", - "requested": "[18.0.1, )", - "resolved": "18.0.1", - "contentHash": "WNpu6vI2rA0pXY4r7NKxCN16XRWl5uHu6qjuyVLoDo6oYEggIQefrMjkRuibQHm/NslIUNCcKftvoWAN80MSAg==", + "resolved": "1.9.1", + "contentHash": "No5AudZMmSb+uNXjlgL2y3/stHD2IT4uxqc5yHwkE+/nNux9jbKcaJMvcp9SwgP4DVD8L9/P3OUz8mmmcvEIdQ==", "dependencies": { - "Microsoft.CodeCoverage": "18.0.1", - "Microsoft.TestPlatform.TestHost": "18.0.1" + "Microsoft.ApplicationInsights": "2.23.0", + "Microsoft.Testing.Platform": "1.9.1" } }, - "Tomtastisch.FileClassifier": { - "type": "Direct", - "requested": "[4.4.0, )", - "resolved": "4.4.0", - "contentHash": "USMirK3EvVGy71q2lCxBkkKNB4R/Eu8oUrj5SIM39sZne9IMb1/YsernZDVQ3Uk/bcBRt9nF0+kBY4cV91GzCA==", - "dependencies": { - "Microsoft.IO.RecyclableMemoryStream": "3.0.1", - "Mime": "3.8.0", - "SharpCompress": "0.39.0", - "System.IO.Hashing": "10.0.2" - } - }, - "xunit.runner.visualstudio": { - "type": "Direct", - "requested": "[3.1.5, )", - "resolved": "3.1.5", - "contentHash": "tKi7dSTwP4m5m9eXPM2Ime4Kn7xNf4x4zT9sdLO/G4hZVnQCRiMTWoSZqI/pYTVeI27oPPqHBKYI/DjJ9GsYgA==" - }, - "xunit.v3": { - "type": "Direct", - "requested": "[2.0.0, )", - "resolved": "2.0.0", - "contentHash": "gy0M8kElQONiemRfZtvFzJoM9eVhneENz+8N1WdW0xfMgdMD9IuM1wwaQgj2zfkMgMFixMk0kxSvimyYNoBAKw==", - "dependencies": { - "xunit.analyzers": "1.20.0", - "xunit.v3.assert": "[2.0.0]", - "xunit.v3.core": "[2.0.0]" - } - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" - }, - "Microsoft.CodeCoverage": { - "type": "Transitive", - "resolved": "18.0.1", - "contentHash": "O+utSr97NAJowIQT/OVp3Lh9QgW/wALVTP4RG1m2AfFP4IyJmJz0ZBmFJUsRQiAPgq6IRC0t8AAzsiPIsaUDEA==" - }, - "Microsoft.IO.RecyclableMemoryStream": { - "type": "Transitive", - "resolved": "3.0.1", - "contentHash": "s/s20YTVY9r9TPfTrN5g8zPF1YhwxyqO6PxUkrYTGI2B+OGPe9AdajWZrLhFqXIvqIW23fnUE4+ztrUWNU1+9g==" - }, "Microsoft.Testing.Extensions.TrxReport.Abstractions": { "type": "Transitive", - "resolved": "1.6.2", - "contentHash": "EE4PoYoRtrTKE0R22bXuBguVgdEeepImy0S8xHaZOcGz5AuahB2i+0CV4UTefLqO1dtbA4APfumpP1la+Yn3SA==", + "resolved": "1.9.1", + "contentHash": "AL46Xe1WBi85Ntd4mNPvat5ZSsZ2uejiVqoKCypr8J3wK0elA5xJ3AN4G/Q4GIwzUFnggZoH/DBjnr9J18IO/g==", "dependencies": { - "Microsoft.Testing.Platform": "1.6.2" + "Microsoft.Testing.Platform": "1.9.1" } }, "Microsoft.Testing.Platform": { "type": "Transitive", - "resolved": "1.6.2", - "contentHash": "7CFJKN3An5Ra6YOrTCAi7VldSRTxGGokqC0NSNrpKTKO6NJJby10EWwnqV/v2tawcRzfSbLpKNpvBv7s7ZoD3Q==" + "resolved": "1.9.1", + "contentHash": "QafNtNSmEI0zazdebnsIkDKmFtTSpmx/5PLOjURWwozcPb3tvRxzosQSL8xwYNM1iPhhKiBksXZyRSE2COisrA==" }, "Microsoft.Testing.Platform.MSBuild": { "type": "Transitive", - "resolved": "1.6.2", - "contentHash": "tF5UgrXh0b0F8N11uWfaZT91v5QvuTZDwWP19GDMHPalWFKfmlix92xExo7cotJDoAK+bzljLK0S0XJuigYLbA==", + "resolved": "1.9.1", + "contentHash": "oTUtyR4X/s9ytuiNA29FGsNCCH0rNmY5Wdm14NCKLjTM1cT9edVSlA+rGS/mVmusPqcP0l/x9qOnMXg16v87RQ==", "dependencies": { - "Microsoft.Testing.Platform": "1.6.2" + "Microsoft.Testing.Platform": "1.9.1" } }, "Microsoft.TestPlatform.ObjectModel": { @@ -273,6 +117,11 @@ "Newtonsoft.Json": "13.0.3" } }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==" + }, "Mime": { "type": "Transitive", "resolved": "3.8.0", @@ -306,57 +155,69 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.20.0", - "contentHash": "HElev2E9vFbPxwKRQtpCSSzLOu8M/N9EWBCB37v7SRx6z4Lbj19FxfLEig3v9jiI6s4b0l2uena91nEsTWl9jA==" + "resolved": "1.27.0", + "contentHash": "y/pxIQaLvk/kxAoDkZW9GnHLCEqzwl5TW0vtX3pweyQpjizB9y3DXhb9pkw2dGeUqhLjsxvvJM1k89JowU6z3g==" }, "xunit.v3.assert": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "acgfaclCB+FX5s4tQLTmTW2mc5tsOMtIAKizyCnZyxjbJpc10vGNaMvwsE0Pw7wGplet3PJfXffsMO4pRDJIfA==" + "resolved": "3.2.2", + "contentHash": "BPciBghgEEaJN/JG00QfCYDfEfnLgQhfnYEy+j1izoeHVNYd5+3Wm8GJ6JgYysOhpBPYGE+sbf75JtrRc7jrdA==" }, "xunit.v3.common": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "0BG62sA0xS5j4WSGqLzv5HXBM41sw4opEe3DhAN0wa7l1N2lNAyuV6Vq5mJT/tIYmJFeICD7lv0c39AgBqiQ8Q==", + "resolved": "3.2.2", + "contentHash": "Hj775PEH6GTbbg0wfKRvG2hNspDCvTH9irXhH4qIWgdrOSV1sQlqPie+DOvFeigsFg2fxSM3ZAaaCDQs+KreFA==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0" } }, - "xunit.v3.core": { + "xunit.v3.core.mtp-v1": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "Nwb8qyETji/1PP7jmgOy6u6RJC7h4jo5UmxLBswqrixNeONtB2qjHGyOl5/6IuzB4GsJpRA8Mdz2E+LxRqAukg==", + "resolved": "3.2.2", + "contentHash": "Ga5aA2Ca9ktz+5k3g5ukzwfexwoqwDUpV6z7atSEUvqtd6JuybU1XopHqg1oFd78QdTfZgZE9h5sHpO4qYIi5w==", "dependencies": { - "Microsoft.Testing.Platform.MSBuild": "1.6.2", - "xunit.v3.extensibility.core": "[2.0.0]", - "xunit.v3.runner.inproc.console": "[2.0.0]" + "Microsoft.Testing.Extensions.Telemetry": "1.9.1", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.9.1", + "Microsoft.Testing.Platform": "1.9.1", + "Microsoft.Testing.Platform.MSBuild": "1.9.1", + "xunit.v3.extensibility.core": "[3.2.2]", + "xunit.v3.runner.inproc.console": "[3.2.2]" } }, "xunit.v3.extensibility.core": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "78Ep8QNHHevCZ2ADr3wwDrSQUeq+xNmzdek4ssGLf+nEoK9KntWlJWQiO4BOKoc75OHUKbeG7JB2h3WW80NSDg==", + "resolved": "3.2.2", + "contentHash": "srY8z/oMPvh/t8axtO2DwrHajhFMH7tnqKildvYrVQIfICi8fOn3yIBWkVPAcrKmHMwvXRJ/XsQM3VMR6DOYfQ==", + "dependencies": { + "xunit.v3.common": "[3.2.2]" + } + }, + "xunit.v3.mtp-v1": { + "type": "Transitive", + "resolved": "3.2.2", + "contentHash": "O41aAzYKBT5PWqATa1oEWVNCyEUypFQ4va6K0kz37dduV3EKzXNMaV2UnEhufzU4Cce1I33gg0oldS8tGL5I0A==", "dependencies": { - "xunit.v3.common": "[2.0.0]" + "xunit.analyzers": "1.27.0", + "xunit.v3.assert": "[3.2.2]", + "xunit.v3.core.mtp-v1": "[3.2.2]" } }, "xunit.v3.runner.common": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "XHvSqGp2h1w81eKo53fQWFEGPIiDiZYRtTmFD9revpfc0xLmrDJXkQQVTqY25WD+gi2Ulg3UjCfazj1WBmRadQ==", + "resolved": "3.2.2", + "contentHash": "/hkHkQCzGrugelOAehprm7RIWdsUFVmIVaD6jDH/8DNGCymTlKKPTbGokD5czbAfqfex47mBP0sb0zbHYwrO/g==", "dependencies": { - "xunit.v3.common": "[2.0.0]" + "Microsoft.Win32.Registry": "[5.0.0]", + "xunit.v3.common": "[3.2.2]" } }, "xunit.v3.runner.inproc.console": { "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "2WZzkcFJ1RgbjX0wXP56rcS4V2RPtGZuGToBOyxAZMcJ2f9T7X7mD5DK5ztyHIsmHz+IhdwklSbU1U3NmakGow==", + "resolved": "3.2.2", + "contentHash": "ulWOdSvCk+bPXijJZ73bth9NyoOHsAs1ZOvamYbCkD4DNLX/Bd29Ve2ZNUwBbK0MqfIYWXHZViy/HKrdEC/izw==", "dependencies": { - "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.6.2", - "Microsoft.Testing.Platform": "1.6.2", - "xunit.v3.extensibility.core": "[2.0.0]", - "xunit.v3.runner.common": "[2.0.0]" + "xunit.v3.extensibility.core": "[3.2.2]", + "xunit.v3.runner.common": "[3.2.2]" } }, "ZstdSharp.Port": { diff --git a/tools/check-quality.sh b/tools/check-quality.sh index 5f14e769..56ef4ea8 100755 --- a/tools/check-quality.sh +++ b/tools/check-quality.sh @@ -15,13 +15,48 @@ bash tools/run-coverage.sh TEST_BDD_OUTPUT_DIR="${ROOT_DIR}/artifacts/test-bdd" \ bash tools/test-bdd-readable.sh -- -c Release --no-restore -if [[ -z "${QODANA_TOKEN:-}" ]]; then - echo "ERROR: QODANA_TOKEN is not set." - exit 1 +dotnet test tests/PackageBacked.Tests/PackageBacked.Tests.csproj \ + -c Release \ + --no-restore \ + -f net10.0 + +run_qodana=true +if [[ "${SKIP_QODANA:-0}" == "1" ]]; then + echo "INFO: SKIP_QODANA=1 -> Qodana wird uebersprungen." + run_qodana=false fi -qodana scan \ - --config qodana.yaml \ - --image jetbrains/qodana-dotnet:2025.3 \ - --results-dir qodana-results \ - -e QODANA_TOKEN="$QODANA_TOKEN" +if [[ "${run_qodana}" == "true" ]] && ! command -v qodana >/dev/null 2>&1; then + if [[ "${CI:-false}" == "true" ]]; then + echo "ERROR: qodana CLI nicht gefunden." + exit 1 + fi + echo "WARN: qodana CLI nicht gefunden -> Qodana wird lokal uebersprungen." + run_qodana=false +fi + +if [[ "${run_qodana}" == "true" ]] && [[ -z "${QODANA_TOKEN:-}" ]]; then + if [[ "${CI:-false}" == "true" ]]; then + echo "ERROR: QODANA_TOKEN is not set." + exit 1 + fi + echo "WARN: QODANA_TOKEN fehlt -> Qodana wird lokal uebersprungen." + run_qodana=false +fi + +if [[ "${run_qodana}" == "true" ]] && ! docker info >/dev/null 2>&1; then + if [[ "${CI:-false}" == "true" ]]; then + echo "ERROR: Docker daemon nicht erreichbar; Qodana kann nicht ausgefuehrt werden." + exit 1 + fi + echo "WARN: Docker daemon nicht erreichbar -> Qodana wird lokal uebersprungen." + run_qodana=false +fi + +if [[ "${run_qodana}" == "true" ]]; then + qodana scan \ + --config qodana.yaml \ + --image jetbrains/qodana-dotnet:2025.3 \ + --results-dir qodana-results \ + -e QODANA_TOKEN="$QODANA_TOKEN" +fi diff --git a/tools/run-coverage.sh b/tools/run-coverage.sh index f8689da7..889e13e7 100755 --- a/tools/run-coverage.sh +++ b/tools/run-coverage.sh @@ -9,8 +9,8 @@ dotnet test tests/FileTypeDetectionLib.Tests/FileTypeDetectionLib.Tests.csproj \ -v minimal \ --no-restore \ /p:CollectCoverage=true \ - /p:Include='[FileTypeDetectionLib]*' \ + /p:Include='[Tomtastisch.FileClassifier]*' \ /p:CoverletOutputFormat=cobertura \ - /p:Threshold=85%2c69 \ + /p:Threshold=82%2c69 \ /p:ThresholdType=line%2cbranch \ /p:ThresholdStat=total