Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
d22ba53
docs(governance): add full PR-108 review audit matrix with evidence
github-actions[bot] Feb 21, 2026
dd5a44a
release(versioning): align active convergence to 6.0.0
github-actions[bot] Feb 21, 2026
e6cd639
docs(governance): add reimplementation evidence for PR-108 file set
github-actions[bot] Feb 21, 2026
389bab9
fix(docs): normalize truncated URLs in PR-108 audit matrix
github-actions[bot] Feb 21, 2026
af28e72
docs(versioning): remove deferred 6.0.1 section from EN changelog
github-actions[bot] Feb 21, 2026
54e8e3d
docs(versioning): drop deferred 6.0.1 row from DE history
github-actions[bot] Feb 21, 2026
a866a98
docs(versioning): drop deferred 6.0.1 row from EN history
github-actions[bot] Feb 21, 2026
dafd437
docs(versioning): remove deferred 6.0.1 section from DE changelog
github-actions[bot] Feb 21, 2026
462a5c2
docs(governance): fix typo Aehnlichkeit in PR108 audit matrix
github-actions[bot] Feb 21, 2026
27b8d64
docs(governance): korrigiere Tippfehler nicht in Audit-Tabelle
github-actions[bot] Feb 21, 2026
80cd07b
docs(governance): korrigiere zweites nicht in Audit-Tabelle
github-actions[bot] Feb 21, 2026
7d81109
docs(governance): korrigiere Benennung in Audit-Tabelle
github-actions[bot] Feb 21, 2026
b57b7b4
docs(versioning): align EvidenceHashingIO spelling in DE changelog
github-actions[bot] Feb 21, 2026
9a93ab4
docs(governance): remove markdown code-fence fragments from audit table
github-actions[bot] Feb 21, 2026
9cbbeea
docs(governance): clarify historical 6.0.1 context in PR108 audit rows
github-actions[bot] Feb 21, 2026
b028121
style(props): normalize Directory.Build.props indentation
github-actions[bot] Feb 21, 2026
7f97f83
docs(infrastructure): complete XML docs and logic block comments
github-actions[bot] Feb 22, 2026
478d432
docs(abstractions): ergaenze konstruktor-xml-dokumentation
github-actions[bot] Feb 22, 2026
cff47a3
style(core): richte Dim-Deklarationen spaltenweise aus
github-actions[bot] Feb 22, 2026
85d1334
Update src/FileTypeDetection/Infrastructure/ArchiveInternals.vb
tomtastisch Feb 22, 2026
9769222
style(vb): enforce Dim block alignment across FileTypeDetection
github-actions[bot] Feb 22, 2026
ac19ae9
fix(config): stabilisiere Builder-Syntax in Registry-Konfiguration
github-actions[bot] Feb 22, 2026
280b0df
fix(core): stabilisiere filekind-kompatibilitaet und policy-formatierung
github-actions[bot] Feb 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,16 @@ Abweichung ist blocker und vor Merge/Release zu beheben.
## 10) Lokale Overrides
- Optional: `AGENTS.override.md` wird zusaetzlich angewendet.
- `AGENTS.override.md` ist lokal-only und darf nicht committed werden.

## 11) VB.NET Deklarationsstil (verbindlich)
- Lokale Variablendeklarationen mit `Dim` werden in zusammenhängenden Blöcken spaltenweise ausgerichtet.
- Ausrichtung erfolgt mindestens über diese Spalten:
- `Dim`
- Variablenname
- `As <Typ>`
- optionale Initialisierung `= <Wert>`
- Die Einrückung startet linksbündig identisch je Block.
- Beispiel:
- `Dim hasContentTypes As Boolean = False`
- `Dim hasOpenDocumentConflict As Boolean = False`
- `Dim candidateOpenDocumentKind As FileKind`
12 changes: 6 additions & 6 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<Project>
<PropertyGroup>
<Deterministic>true</Deterministic>
<ContinuousIntegrationBuild Condition="'$(CI)' == 'true'">true</ContinuousIntegrationBuild>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup>
<PropertyGroup>
<RepoVersion>6.0.1</RepoVersion>
<Deterministic>true</Deterministic>
<ContinuousIntegrationBuild Condition="'$(CI)' == 'true'">true</ContinuousIntegrationBuild>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup>
<PropertyGroup>
<RepoVersion>6.0.0</RepoVersion>
</PropertyGroup>
</Project>
84 changes: 84 additions & 0 deletions docs/governance/047_PR_108_REVIEW_AUDIT_DE.MD

Large diffs are not rendered by default.

5 changes: 2 additions & 3 deletions docs/versioning/002_HISTORY_VERSIONS.MD
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,20 @@

Diese Tabelle wurde aus der Commit-Historie anhand der Policy in
`docs/versioning/001_POLICY_VERSIONING.MD` abgeleitet.
Heuristik fuer die Rueckwirkungs-Zuordnung:
Heuristik für die Rückwirkungs-Zuordnung:
- Major-Overrides: `5255724`, `fd03389`
- `feat:` oder `Add ...` (nicht-Doku) => Minor
- `docs|test|ci|chore|tooling|refactor|fix` => Patch

Aktueller Entwicklungsstand:
- Aktuelle Entwicklungslinie enthaelt `6.x` (aktueller Arbeitsstand: `v6.0.1`; Details in `docs/versioning/003_CHANGELOG_RELEASES.MD`).
- Aktuelle Entwicklungslinie enthält `6.x` (aktueller Arbeitsstand: `v6.0.0`; Details in `docs/versioning/003_CHANGELOG_RELEASES.MD`).

Hinweis:
- Die Spalte `Keyword` verwendet den technischen Klassifizierungswert aus der Historie.
- Einzelne Committitel bleiben in der Originalsprache, wenn sie als exakter Quelltextnachweis uebernommen wurden.

| Version | Kurzbeschreibung | Commit | Keyword |
|---|---|---|---|
| `6.0.1` | Refactor-Haertung: interne SSOT-Utilities nach `Infrastructure/Utils` konsolidiert, Core-Utility-Logik in dedizierte Dateien gesplittet und Duplikat-Guards vereinheitlicht | [unreleased](https://github.com/tomtastisch/FileClassifier/compare/v5.2.1...HEAD) | patch |
| `6.0.0` | Breaking-Release: `FileKind`-Enum und `HashRoundTripReport`-Public-API auf neues Slot-/Methodenmodell umgestellt, Hashing-Interna in Core/RoundTrip/Io ausgelagert | [unreleased](https://github.com/tomtastisch/FileClassifier/compare/v5.2.1...HEAD) | breaking |
| `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 |
Expand Down
16 changes: 3 additions & 13 deletions docs/versioning/003_CHANGELOG_RELEASES.MD
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,20 @@

# Changelog

Alle Aenderungen werden hier technisch dokumentiert. Die Release-Version selbst ist
Alle Änderungen werden hier technisch dokumentiert. Die Release-Version selbst ist
der Git-Tag `vX.Y.Z` (optional `-prerelease`) als SSOT.

## [6.0.1]
- Added:
- Neues internes Submodul `src/FileTypeDetection/Infrastructure/Utils/` als SSOT fuer wiederverwendbare Guard-/I/O-/Pfad-/Logging-Helfer.
- Changed:
- Utility-Klassen aus `CoreInternals.vb` in dedizierte Dateien unter `Infrastructure/Utils` ausgelagert; `CoreInternals.vb` auf Refinement-Logik fokussiert.
- Vorhandene Utils von `src/FileTypeDetection/Utils/` nach `src/FileTypeDetection/Infrastructure/Utils/` verschoben und Namespace auf `Tomtastisch.FileClassifier.Infrastructure.Utils` konsolidiert.
- Duplizierte Byte-Array-Guard-Checks auf `ByteArrayGuard.HasContent(...)` vereinheitlicht.
- Docs/CI/Tooling:
- Versionskonvergenz auf `6.0.1` nachgezogen (`RepoVersion`, `Version`, `PackageVersion`, Versionshistorie DE/EN).

## [6.0.0]
- Added:
- Neue interne Hashing-Services (`EvidenceHashingCore`, `EvidenceHashingRoundTrip`, `EvidenceHashingIo`) fuer deterministische Auslagerung ohne neue Dependencies.
- Neue interne Hashing-Services (`EvidenceHashingCore`, `EvidenceHashingRoundTrip`, `EvidenceHashingIO`) für deterministische Auslagerung ohne neue Dependencies.
- Changed:
- Breaking-Umstellung von `FileKind`-Werten (`Docx`/`Xlsx`/`Pptx` -> `Doc`/`Xls`/`Ppt`).
- Breaking-Umstellung der `HashRoundTripReport`-Public-API auf Slot-basiertes Zugriffsmodell (`HashSlot`, `Evidence(...)`, `LogicalEquals(...)`, `PhysicalEquals(...)`).
- `EvidenceHashing` auf Fassade reduziert; Kernlogik in interne stateless Services verschoben.
- Fixed:
- Reflection-basierte Unit-Tests auf neue interne Hashing-Typen angepasst.
- Docs/CI/Tooling:
- Versionskonvergenz lokal auf `6.0.0` vorbereitet (`RepoVersion`, `Version`, `PackageVersion`, Versionshistorie DE/EN).
- Versionskonvergenz aktiv auf `6.0.0` gesetzt (`RepoVersion`, `Version`, `PackageVersion`, Versionshistorie DE/EN).

## [5.2.1]
- Added:
Expand Down
3 changes: 1 addition & 2 deletions docs/versioning/102_HISTORY_VERSIONS.MD
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,13 @@ Heuristics for retroactive classification:
- `docs|test|ci|chore|tooling|refactor|fix` => patch

Current state:
- Current release line contains `6.x` (current working state: `v6.0.1`; details in `docs/versioning/103_CHANGELOG_RELEASES.MD`).
- Current release line contains `6.x` (current working state: `v6.0.0`; 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 |
|---|---|---|---|
| `6.0.1` | Refactor hardening: consolidated internal SSOT utilities into `Infrastructure/Utils`, split core utility logic into dedicated files, and unified duplicate byte guards | [unreleased](https://github.com/tomtastisch/FileClassifier/compare/v5.2.1...HEAD) | patch |
| `6.0.0` | Breaking release: migrated `FileKind` enum and `HashRoundTripReport` public API to the new slot/method model and split hashing internals into core/roundtrip/io services | [unreleased](https://github.com/tomtastisch/FileClassifier/compare/v5.2.1...HEAD) | breaking |
| `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 |
Expand Down
12 changes: 1 addition & 11 deletions docs/versioning/103_CHANGELOG_RELEASES.MD
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,6 @@

All changes are documented here in technical terms. The release version itself is the Git tag `vX.Y.Z` (optional `-prerelease`) as SSOT.

## [6.0.1]
- Added:
- New internal submodule `src/FileTypeDetection/Infrastructure/Utils/` as the SSOT for reusable guard/I/O/path/logging helpers.
- Changed:
- Moved utility classes from `CoreInternals.vb` into dedicated files under `Infrastructure/Utils`; narrowed `CoreInternals.vb` to refinement logic.
- Relocated existing utils from `src/FileTypeDetection/Utils/` to `src/FileTypeDetection/Infrastructure/Utils/` and consolidated the namespace to `Tomtastisch.FileClassifier.Infrastructure.Utils`.
- Unified duplicate byte-array guard checks to `ByteArrayGuard.HasContent(...)`.
- Docs/CI/Tooling:
- Updated version convergence to `6.0.1` (`RepoVersion`, `Version`, `PackageVersion`, version history DE/EN).

## [6.0.0]
- Added:
- New internal hashing services (`EvidenceHashingCore`, `EvidenceHashingRoundTrip`, `EvidenceHashingIo`) for deterministic extraction without adding dependencies.
Expand All @@ -26,7 +16,7 @@ All changes are documented here in technical terms. The release version itself i
- Fixed:
- Updated reflection-based unit tests to the new internal hashing types.
- Docs/CI/Tooling:
- Prepared local version convergence to `6.0.0` (`RepoVersion`, `Version`, `PackageVersion`, version history DE/EN).
- Set active version convergence to `6.0.0` (`RepoVersion`, `Version`, `PackageVersion`, version history DE/EN).

## [5.2.1]
- Added:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ Namespace Global.Tomtastisch.FileClassifier
''' </summary>
Public ReadOnly Property Size As Integer

''' <summary>
''' Initialisiert ein unveränderliches In-Memory-Modell für einen Archiveintrag.
''' </summary>
''' <param name="entryPath">Normalisierter relativer Eintragspfad.</param>
''' <param name="payload">Extrahierter Byteinhalt des Eintrags.</param>
Friend Sub New _
(
entryPath As String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,14 @@ Namespace Global.Tomtastisch.FileClassifier
''' </summary>
Public ReadOnly Property ExtensionVerified As Boolean

''' <summary>
''' Initialisiert ein detailliertes Detektionsergebnis.
''' </summary>
''' <param name="detectedType">Finaler, nach allen Policies ermittelter Dateityp.</param>
''' <param name="reasonCode">Deterministischer Reason-Code für den Entscheidungspfad.</param>
''' <param name="usedZipContentCheck">Kennzeichnet eine inhaltsbasierte Archivprüfung.</param>
''' <param name="usedStructuredRefinement">Kennzeichnet ein strukturiertes Archiv-Refinement.</param>
''' <param name="extensionVerified">Kennzeichnet die bestätigte Endungsprüfung.</param>
Friend Sub New _
(
detectedType As FileType,
Expand Down
15 changes: 11 additions & 4 deletions src/FileTypeDetection/Abstractions/Detection/FileType.vb
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ Namespace Global.Tomtastisch.FileClassifier
''' <summary>Enum-Schlüssel des Typs.</summary>
Public ReadOnly Property Kind As FileKind

''' <summary>Kanonische Endung inklusive Punkt, bei Unknown leer.</summary>
''' <summary>Kanonische Endung inklusive Punkt, bei UNKNOWN leer.</summary>
Public ReadOnly Property CanonicalExtension As String

''' <summary>Kanonischer MIME-Typ als Metadatum, kann leer sein.</summary>
Expand All @@ -44,6 +44,14 @@ Namespace Global.Tomtastisch.FileClassifier
''' </summary>
Public ReadOnly Property Aliases As ImmutableArray(Of String)

''' <summary>
''' Initialisiert ein unveränderliches Dateityp-Wertobjekt.
''' </summary>
''' <param name="kind">Enum-Schlüssel des Dateityps.</param>
''' <param name="canonicalExtension">Kanonische Endung inklusive Punkt.</param>
''' <param name="mime">Kanonischer MIME-Typ als Metadatum.</param>
''' <param name="allowed">Kennzeichnet die Policy-Zulässigkeit.</param>
''' <param name="aliases">Aliasmenge für Endungszuordnung.</param>
Friend Sub New _
(
kind As FileKind,
Expand All @@ -53,8 +61,8 @@ Namespace Global.Tomtastisch.FileClassifier
aliases As IEnumerable(Of String)
)

Dim dedup As HashSet(Of String) = New HashSet(Of String)(StringComparer.OrdinalIgnoreCase)
Dim n As String
Dim dedup As HashSet(Of String) = New HashSet(Of String)(StringComparer.OrdinalIgnoreCase)
Dim n As String
Dim orderedAliases As List(Of String)

Me.Kind = kind
Expand Down Expand Up @@ -83,7 +91,6 @@ Namespace Global.Tomtastisch.FileClassifier
''' </summary>
''' <returns>String-Repräsentation des Feldes <see cref="Kind"/>.</returns>
Public Overrides Function ToString() As String

Return Kind.ToString()
End Function
End Class
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ Namespace Global.Tomtastisch.FileClassifier
''' <param name="sourceType">Herkunftskanal der Hashquelle.</param>
''' <param name="label">Fachliches Quelllabel.</param>
''' <param name="notes">Fehler-/Hinweistext.</param>
''' <returns>Evidence mit leerem Digest-Satz und Unknown-Typkontext.</returns>
''' <returns>Evidence mit leerem Digest-Satz und UNKNOWN-Typkontext.</returns>
Friend Shared Function CreateFailure _
(
sourceType As HashSourceType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ Namespace Global.Tomtastisch.FileClassifier
normalized = IO.Path.GetFileName(normalized)
Catch ex As Exception When _
TypeOf ex Is UnauthorizedAccessException OrElse
TypeOf ex Is System.Security.SecurityException OrElse
TypeOf ex Is Security.SecurityException OrElse
TypeOf ex Is IO.IOException OrElse
TypeOf ex Is NotSupportedException OrElse
TypeOf ex Is ArgumentException
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,14 +105,14 @@ Namespace Global.Tomtastisch.FileClassifier
)

' Deklarationsblock (Pflicht, spaltenartig)
Dim slotCount As Integer = RequiredSlots.Length
Dim i As Integer
Dim idx As Integer
Dim baseEvidence As HashEvidence
Dim otherEvidence As HashEvidence
Dim otherSlot As HashSlot
Dim eqLogical As Boolean
Dim consistentLocal As Boolean = True
Dim slotCount As Integer = RequiredSlots.Length
Dim i As Integer
Dim idx As Integer
Dim baseEvidence As HashEvidence
Dim otherEvidence As HashEvidence
Dim otherSlot As HashSlot
Dim eqLogical As Boolean
Dim consistentLocal As Boolean = True

' -----------------------------------------------------------------
' Guard-Clauses (fail-closed)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,25 +49,25 @@ Namespace Global.Tomtastisch.FileClassifier
notes As String
) As HashEvidence

Dim normalizedEntries As List(Of NormalizedEntry) = Nothing
Dim normalizeError As String = String.Empty
Dim logicalBytes As Byte()
Dim logicalSha As String
Dim fastLogical As String
Dim hmacLogical As String
Dim physicalSha As String
Dim fastPhysical As String
Dim hmacPhysical As String
Dim hasPhysical As Boolean
Dim secureNote As String
Dim hmacKey As Byte()
Dim hasHmacKey As Boolean
Dim firstEntry As ZipExtractedEntry = Nothing
Dim digestSet As HashDigestSet
Dim combinedNotes As String
Dim totalBytes As Long
Dim normalizedEntries As List(Of NormalizedEntry) = Nothing
Dim normalizeError As String = String.Empty
Dim logicalBytes As Byte()
Dim logicalSha As String
Dim fastLogical As String
Dim hmacLogical As String
Dim physicalSha As String
Dim fastPhysical As String
Dim hmacPhysical As String
Dim hasPhysical As Boolean
Dim secureNote As String
Dim hmacKey As Byte()
Dim hasHmacKey As Boolean
Dim firstEntry As ZipExtractedEntry = Nothing
Dim digestSet As HashDigestSet
Dim combinedNotes As String
Dim totalBytes As Long
Dim persistedCompressed As Byte()
Dim persistedLogical As Byte()
Dim persistedLogical As Byte()

If Not TryNormalizeEntries(entries, normalizedEntries, normalizeError) Then
Return HashEvidence.CreateFailure(sourceType, label, normalizeError)
Expand Down Expand Up @@ -165,19 +165,19 @@ Namespace Global.Tomtastisch.FileClassifier
notes As String
) As HashEvidence

Dim safePayload As Byte() = If(payload, Array.Empty(Of Byte)())
Dim physicalSha As String = ComputeSha256Hex(safePayload)
Dim logicalSha As String = physicalSha
Dim fastPhysical As String = ComputeFastHash(safePayload, hashOptions)
Dim fastLogical As String = fastPhysical
Dim hmacPhysical As String = String.Empty
Dim hmacLogical As String = String.Empty
Dim secureNote As String = String.Empty
Dim hmacKey As Byte() = Array.Empty(Of Byte)()
Dim safePayload As Byte() = If(payload, Array.Empty(Of Byte)())
Dim physicalSha As String = ComputeSha256Hex(safePayload)
Dim logicalSha As String = physicalSha
Dim fastPhysical As String = ComputeFastHash(safePayload, hashOptions)
Dim fastLogical As String = fastPhysical
Dim hmacPhysical As String = String.Empty
Dim hmacLogical As String = String.Empty
Dim secureNote As String = String.Empty
Dim hmacKey As Byte() = Array.Empty(Of Byte)()
Dim persistedPayload As Byte()
Dim entry As ZipExtractedEntry
Dim digestSet As HashDigestSet
Dim combinedNotes As String
Dim entry As ZipExtractedEntry
Dim digestSet As HashDigestSet
Dim combinedNotes As String

If hashOptions IsNot Nothing AndAlso hashOptions.IncludeSecureHash Then
If TryResolveHmacKey(hmacKey, secureNote) Then
Expand Down Expand Up @@ -232,9 +232,9 @@ Namespace Global.Tomtastisch.FileClassifier
ByRef errorMessage As String
) As Boolean

Dim seen As HashSet(Of String) = New HashSet(Of String)(StringComparer.Ordinal)
Dim seen As HashSet(Of String) = New HashSet(Of String)(StringComparer.Ordinal)
Dim normalizedPath As String
Dim payload As Byte()
Dim payload As Byte()

normalizedEntries = New List(Of NormalizedEntry)()
errorMessage = String.Empty
Expand Down Expand Up @@ -300,8 +300,8 @@ Namespace Global.Tomtastisch.FileClassifier
) As Byte()

Dim versionBytes As Byte()
Dim pathBytes As Byte()
Dim contentHash As Byte()
Dim pathBytes As Byte()
Dim contentHash As Byte()

Using ms As New IO.MemoryStream()
Using writer As New IO.BinaryWriter(ms, Text.Encoding.UTF8, leaveOpen:=True)
Expand Down Expand Up @@ -372,7 +372,7 @@ Namespace Global.Tomtastisch.FileClassifier
) As String

Dim safeKey As Byte() = If(key, Array.Empty(Of Byte)())
Dim data As Byte() = If(payload, Array.Empty(Of Byte)())
Dim data As Byte() = If(payload, Array.Empty(Of Byte)())

Using hmac As New Security.Cryptography.HMACSHA256(safeKey)
Return HashPrimitives.Current.HexCodec.EncodeLowerHex(hmac.ComputeHash(data))
Expand Down Expand Up @@ -432,7 +432,7 @@ Namespace Global.Tomtastisch.FileClassifier
toAppend As String
) As String

Dim left As String = If(baseNotes, String.Empty).Trim()
Dim left As String = If(baseNotes, String.Empty).Trim()
Dim right As String = If(toAppend, String.Empty).Trim()

If right.Length = 0 Then Return left
Expand Down
Loading
Loading