From 30decf6d9b6b95277cbd8b8a7d9e23d9ce5413ca Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Mon, 13 Apr 2026 17:35:37 -0500 Subject: fix: show empty state for bare git repos instead of an error git.sr.ht returns "internal system error" from the references query and "reference not found" from the log/readme queries when a repo has no commits. Broaden isEmptyRepositoryError to cover missingReference, unknownRevision, noRows, notFound, and those two message strings, then apply the same silent-empty treatment to loadReferences and loadArtifacts (which previously surfaced any error directly to the user). Fixes: https://todo.sr.ht/~ccleberg/hutch/60 --- .../Repositories/RepositoryDetailViewModel.swift | 24 +++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'Hutch/Views/Repositories') diff --git a/Hutch/Views/Repositories/RepositoryDetailViewModel.swift b/Hutch/Views/Repositories/RepositoryDetailViewModel.swift index ebd07d2..8dec51b 100644 --- a/Hutch/Views/Repositories/RepositoryDetailViewModel.swift +++ b/Hutch/Views/Repositories/RepositoryDetailViewModel.swift @@ -226,7 +226,7 @@ final class RepositoryDetailViewModel { responseType: LogResponse.self ) } catch { - if isMissingGitReferenceError(error) { + if isEmptyRepositoryError(error) { return LogPage(results: [], cursor: nil) } throw error @@ -273,7 +273,12 @@ final class RepositoryDetailViewModel { branches = allRefs.filter { $0.name.hasPrefix("refs/heads/") }.map { $0.toDetail() } tags = allRefs.filter { $0.name.hasPrefix("refs/tags/") }.map { $0.toDetail() } } catch { - self.error = error.userFacingMessage + if isEmptyRepositoryError(error) { + branches = [] + tags = [] + } else { + self.error = error.userFacingMessage + } } isLoadingRefs = false @@ -340,7 +345,7 @@ final class RepositoryDetailViewModel { responseType: PathResponse.self ) } catch { - if isMissingGitReferenceError(error) { + if isEmptyRepositoryError(error) { readmeContent = nil readmePath = nil readmeLoaded = true @@ -371,8 +376,13 @@ final class RepositoryDetailViewModel { } } - private func isMissingGitReferenceError(_ error: Error) -> Bool { + private func isEmptyRepositoryError(_ error: Error) -> Bool { error.matchesGraphQLErrorClassification(.missingReference) + || error.matchesGraphQLErrorClassification(.unknownRevision) + || error.matchesGraphQLErrorClassification(.noRows) + || error.matchesGraphQLErrorClassification(.notFound) + || error.containsGraphQLErrorMessage("missing") + || error.containsGraphQLErrorMessage("internal system error") } // MARK: - Artifacts @@ -417,7 +427,11 @@ final class RepositoryDetailViewModel { .filter { !$0.artifacts.results.isEmpty } .map { ReferenceWithArtifacts(name: $0.name, artifacts: $0.artifacts.results) } } catch { - self.error = error.userFacingMessage + if isEmptyRepositoryError(error) { + referenceArtifacts = [] + } else { + self.error = error.userFacingMessage + } } isLoadingArtifacts = false -- cgit v1.2.3