krz/hutch

an ios client for sourcehut

clone: git clone https://gitbay.org/krz/hutch.git

7ffef07278e94bd3c268ee5cbd5c9c11cbfa3270

verified · cmc

author: Christian Cleberg <hello@cleberg.net> · 2026-07-16T00:25:27Z

fix: allow clearing a repository description

metadataInputForSave assigned nil through the dictionary subscript to clear a
description. Swift removes the key on a nil subscript assignment, so the
mutation was sent with no `description` field and the old value survived —
clearing a description silently did nothing.

Store the nil with updateValue so the key is retained; AnyCodable already
encodes an unmatched value as a JSON null.
 Hutch/Views/Repositories/RepositorySettingsViewModel.swift | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/Hutch/Views/Repositories/RepositorySettingsViewModel.swift b/Hutch/Views/Repositories/RepositorySettingsViewModel.swift
index 6ad6a78..dd8d7a1 100644
--- a/Hutch/Views/Repositories/RepositorySettingsViewModel.swift
+++ b/Hutch/Views/Repositories/RepositorySettingsViewModel.swift
@@ -301,7 +301,14 @@ final class RepositorySettingsViewModel {
         }
 
         if normalizedEditedDescription != (repository.description ?? "") {
-            input["description"] = normalizedEditedDescription.isEmpty ? Optional<String>.none as String? : normalizedEditedDescription
+            if normalizedEditedDescription.isEmpty {
+                // Assigning nil through the subscript would remove the key and omit
+                // `description` from the mutation, leaving the old value in place.
+                // updateValue stores an explicit nil, which AnyCodable encodes as null.
+                input.updateValue(Optional<String>.none as any Sendable, forKey: "description")
+            } else {
+                input["description"] = normalizedEditedDescription
+            }
         }
 
         return input