| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| |\ \
| | |
| | |
| | |
| | | |
zerolabsco/dependabot/swift/github.com/swiftlang/swift-cmark-0.8.0
chore(deps): bump github.com/swiftlang/swift-cmark from 0.7.1 to 0.8.0
|
| | |/
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Bumps [github.com/swiftlang/swift-cmark](https://github.com/swiftlang/swift-cmark) from 0.7.1 to 0.8.0.
- [Release notes](https://github.com/swiftlang/swift-cmark/releases)
- [Changelog](https://github.com/swiftlang/swift-cmark/blob/gfm/changelog.txt)
- [Commits](https://github.com/swiftlang/swift-cmark/compare/0.7.1...924936d0427cb25a61169739a7660230bffa6ea6)
---
updated-dependencies:
- dependency-name: github.com/swiftlang/swift-cmark
dependency-version: 0.8.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <[email protected]>
|
| | | |
|
| |/
|
|
|
|
|
|
|
|
| |
The workflow set no permissions, so GITHUB_TOKEN inherited the repository
default — read-write for repositories created before February 2023. Flagged by
CodeQL as actions/missing-workflow-permissions (CWE-275).
Checkout only reads the repo and xcodebuild uses no token, so contents: read
covers the job. upload-artifact authenticates with the separate runtime token
and is unaffected.
|
| | |
|
| |
|
|
|
|
| |
Four phases ordered by dependency, with feature gaps identified by diffing the
schema dumps in Docs/API against actual call sites. Records Phase 0 as done and
what unblocking CI turned up.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
The builds.sr.ht job runs on Ubuntu and can only do secret scanning and
structure checks, so the 214 tests ran only when someone remembered to run
them in Xcode. That is why the suite had rotted to ten failures.
builds.sr.ht has no macOS image and its maintainer has ruled them out, so
xcodebuild cannot run there. Add a job on the GitHub mirror instead.
Pinned to macos-26 because macos-latest still points at macOS 15, which lacks
the iOS 26 SDK. The simulator is resolved at runtime rather than pinned by
name, since device names shift between runner images.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
InboxThreadSummary.id returned threadGroupingKey, which is listRID plus the
subject with Re:/Fwd: stripped. Two unrelated threads on one list sharing a
subject therefore shared an id — common on sourcehut, where "[PATCH] test" is
an ordinary subject — which collides under Identifiable in every list that
renders these summaries.
Key id on the root Message-ID, which is unique per thread, and leave
threadGroupingKey subject-based so replies still collapse into one
conversation.
Read state moves to threadGroupingKey at each call site. It was already
keyed on that string via id, so persisted keys are unchanged and marking a
conversation read still covers the whole subject group, matching how
HomeViewModel already builds the key for isUnread.
|
| |
|
|
|
|
|
|
|
|
|
| |
processInline protected allowlisted HTML tags before it handled code spans, so
a `<b>` written inside backticks was carried through as a live tag and applied
formatting instead of rendering as text. Every other inline pass ran against
code span contents for the same reason, so `**x**` in backticks was emitted as
bold.
Protect code spans first with their contents escaped, which takes them out of
reach of the tag, emphasis, and link passes.
|
| |
|
|
|
|
|
| |
The expected incident declared url: nil while the cachedIncidentRSS it stands
in for carries <link>https://status.sr.ht/issues/1/</link>, so the fixture
contradicted its own input. The repository parses and persists the link
correctly.
|
| |
|
|
|
|
|
|
|
|
| |
"No such repository or user found" matched the broad "no such" test for
.notFound, which ran first and made the .serviceNotProvisioned rule below it
unreachable. Users hitting a service they have not activated were told the
content was no longer available rather than that the account needs to enable
the service.
Order the specific check ahead of the general one.
|
| |
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
| |
markdownImageQueryStringPreservesAmpersands rejected any "amp;metric" in the
rendered HTML, but `&` is the correct encoding for `&` in an attribute
value and is what a browser needs to request a literal `&`. The assertion
conflated the URL with its HTML encoding.
Target the real failure mode instead: double-escaping, which would send
"&" through as part of the query string and break badge images.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
These tests drifted from the code and went unnoticed because CI never ran
them. All four are test-side errors; no app behavior is involved.
- TicketListViewModelTests asserted lowercase "resolved"/"fixed"/"reported"
against TicketStatus/TicketResolution rawValues, which are uppercase to
match the todo.sr.ht GraphQL enums.
- HomeViewModelTests expected failedBuilds in ascending id order. Ordering
moved to newest-first when sortBuildItemsForTriage landed in 5f6d545; the
filtering the test covers is unchanged.
- SettingsViewModelTests read request.httpBody inside a URLProtocol, where it
is always nil because URLSession moves the body onto httpBodyStream. The
stub now reads the body off the stream at capture time.
|
| |
|
|
|
|
|
|
|
|
| |
The Hutch scheme referenced `container:HutchTests`, omitting the
`.xctestplan` extension, so `xcodebuild test -scheme Hutch` failed with
"the test plan HutchTests could not be read". HutchTests.xcscheme already
used the correct reference.
The README directs contributors to the Hutch scheme, so this path needs to
work before it can be wired into CI.
|
| |
|
|
|
|
|
| |
repo-structure-check asserted `test -d "website"`, but the website/ tree was
removed in 24c8bc6 when the privacy policy moved to its new location. The
check has failed on every build since, so the builds.sr.ht badge has been red
since April.
|
| | |
|
| |
|
|
|
|
|
|
|
|
| |
- add read-only App Intents for core Hutch workflows
- route intents through the existing Hutch navigation/deep-link model
- expose Work Queue, Recent Activity, System Status, pinned resources, projects, failed builds, assigned tickets, saved searches, and search where supported
- keep App Intents non-mutating for the initial implementation
- preserve existing widget, Safari extension, and hutch:// routing behavior
References: https://todo.sr.ht/~ccleberg/hutch/71
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Add a bounded stale-while-revalidate cache at the Sourcehut API boundary with
stable keys, centralized TTLs, request coalescing, payload hashing, and LRU disk
pruning.
Cache high-value read-only repo, build, ticket, project, profile, paste, and
Home/Work Queue data while keeping mutations network-only and invalidating
related prefixes after successful writes.
Add focused cache tests and implementation notes.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Introduce an actor-backed persistent cache layer at the SRHTClient boundary
for read-only SourceHut data. Cache entries now store stable metadata
including key, resource type, fetched/expires/access timestamps, payload
hash, schema version, and payload size, with bounded memory and disk usage.
Add centralized cache key builders and TTL defaults for repository, file,
ticket, build, log, profile, status, and list-style resources. Support
networkOnly, cacheOnly, cacheFirstThenRefresh, and refreshIgnoringCache
policies, plus request coalescing for duplicate in-flight cache keys.
Integrate first-pass caching into high-value low-risk read paths:
- build detail and completed/active build logs
- ticket detail
- README lookup
- repository tree, blob, and linked file reads
Keep mutation paths network-only and add simple prefix invalidation after
ticket and build mutations. Add compact cached/stale UI status rows and a
Settings action to clear the persistent cache.
Add focused cache tests covering round trips, expiration, stale fallback,
policy behavior, request coalescing, prefix invalidation, size limits, LRU
pruning, expired pruning, and mutation bypass behavior. Document storage,
key, TTL, invalidation, limitations, and next recommended targets.
|
| |
|
|
| |
Fixes: https://todo.sr.ht/~ccleberg/hutch/69
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
pagination
|
| |
|
|
|
|
|
|
|
| |
- limit Home failed-build counts to a configurable lookback window
and add the setting under Behavior.
- make the Recent and Builds rows fully tappable across the
entire cell and add coverage for the new failed-build filtering.
Fixes: https://todo.sr.ht/~ccleberg/hutch/67
|
| |
|
|
|
|
| |
of implementing its own view
Fixes: https://todo.sr.ht/~ccleberg/hutch/66
|
| | |
|
| | |
|
| |
|
|
|
|
| |
tapped
Fixes: https://todo.sr.ht/~ccleberg/hutch/63
|
| |
|
|
| |
Implements: https://todo.sr.ht/~ccleberg/hutch/64
|
| | |
|
| |
|
|
|
|
|
|
| |
- removed prototype screens
- limited Recent section to 3 items
- added initial support for tips
Fixes: https://todo.sr.ht/~ccleberg/hutch/65
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Add shared HutchDeepLinkURL constants for app, widgets, and tests.
- Bump marketing version to 3.1.2 and build to 70 (app + widget extension).
- Point Hutch stats default base URL at HutchStatsAPI; add SRHTWebURL status
incident feed and reuse it from SystemStatusService.
- Group Project into Metadata and Resources; split ContributionStatsResponse
into StatsWindow and StatsTotals with updated decoding and tests.
- Replace @Bindable usage with explicit Bindings in Profile, Projects list,
and repository ACL flows; simplify Home pinned-item helper; add no-op
bodies on cancel alert buttons where the compiler requires a statement.
- Move repository row build-status indicator next to the relative-updated
caption and reserve a fixed 8×8 slot so the row does not jump when status
loads.
- Use NSString.lastPathComponent for build artifact filenames; collapse
duplicate ACL error branches; minor HutchStats HTTP and XMLParserDelegate
cleanups.
- Point widgets at HutchDeepLinkURL helpers; align tests with the new
response and URL types.
|
| |
|
|
|
|
|
|
| |
todo.sr.ht only exposes cursor-based `tracker.tickets` (no status filter),
so client-side Open filtering missed older open tickets when only the first
page was loaded. Paginate until the cursor is exhausted in loadTickets().
Fixes: https://todo.sr.ht/~ccleberg/hutch/62
|
| |
|
|
|
|
|
|
|
|
| |
Apply listRowBackground(Color.black) per row in AMOLED mode using ThemedRowStyle
and themedRow() across Lists and Forms. Use themedList() for scroll/grouped
backgrounds. Treat segmented and clear list rows with isAMOLED-aware
listRowBackground where Color.clear was required. Removes reliance on UIKit
appearance for list cells on iOS 16+.
Implements: https://todo.sr.ht/~ccleberg/hutch/24
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Replaces the list-based layout with a full-screen viewer that matches
the repository file tree pattern. File contents are now the primary
focus using CodeFileTextView (line numbers, wrap toggle). A compact
sticky header shows the filename, visibility badge, owner, date, and
abbreviated hash. Paste metadata moves to a Details sheet accessible
via the bottom toolbar. Duplicate share buttons are consolidated: link
sharing lives in the ··· menu and content sharing is in the toolbar.
Fixes: https://todo.sr.ht/~ccleberg/hutch/13
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
When scrolling through a large tracker, SwiftUI's .task modifier cancels
in-flight pagination requests as rows leave the screen. URLSession
responds with URLError(-999), which was being surfaced to the user as
"The network request failed. Please try again." — even though the
cancellation is expected and benign.
Guard against Task.isCancelled in the catch block so cancellations are
silently ignored; isLoadingMore is still reset unconditionally so the
next scroll attempt retries from the same cursor position.
Fixes: https://todo.sr.ht/~ccleberg/hutch/61
|
| |
|
|
|
|
|
|
|
|
|
| |
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
|
| |
|
|
|
|
|
|
|
|
| |
- implements consistent UX between repo types
- ensures centralized services and routes are used between repo types
- graphql error handling is centralized
- error messages are consistent
Implements: https://todo.sr.ht/~ccleberg/hutch/58
Implements: https://todo.sr.ht/~ccleberg/hutch/59
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Convert filteredJobs, filteredPastes, and filteredTickets from computed
properties to stored properties updated via didSet on their inputs. Each
update function guards with an equality check before assigning, so
@Observable skips the notification when the filtered result hasn't
changed — preventing list re-renders on auto-refresh when no visible
data has actually changed.
Add Equatable conformance to BuildRowView, PasteRowView, TicketRowView,
and SelectableTicketRow, and apply .equatable() at each ForEach call
site. When a list does re-render, SwiftUI now skips body evaluation for
rows whose model value is identical to the previous pass.
Implements: https://todo.sr.ht/~ccleberg/hutch/57
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Remove no-op per-row task from RepositoryListView; loadMoreIfNeeded
is a stub for repos so each row was allocating a Task that did nothing
- Fix BuildListView auto-refresh stopping permanently after navigating
away; startAutoRefresh now runs unconditionally on task so it restarts
on every reappear, not just first load
- Add lastRefreshed tracking to HomeViewModel with a needsRefresh(after:)
helper; HomeView and WorkView scene-activation handlers now skip
loadDashboard() if the data is less than 60 seconds old
- Add 120-second TTL to repository build status refresh; statuses are
no longer re-fetched on every tab appear, only when stale or when the
user explicitly pulls to refresh (forceRefresh: true)
Implements: https://todo.sr.ht/~ccleberg/hutch/56
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Reworks the app's core navigation and home screen for v3.0.0:
- Replace Inbox with Work view: unified dashboard showing unread threads
and assigned tickets, with All/Unread/Assigned scope picker
- Overhaul Home screen: redesigned with pinned items grid (trackers,
repos, mailing lists, users), recent activity section, and system
status banner; backed by HomePinStore supporting all resource types
- Simplify navigation bars across list screens: default toolbar shows
only the primary action (+) and an overflow menu (…); pin, share, and
select moved into the overflow menu; selection mode gets its own nav
bar with Cancel / "N Selected" / All
- Consolidate repo detail toolbars: pin and share moved into the
existing actions menu for both Git and Mercurial detail views
- Add recent activity tracking via RecentActivityStore
- Add work and inbox deep link aliases (hutch://work, hutch://inbox)
Implements: https://todo.sr.ht/~ccleberg/hutch/55
|