Commit ab77dbf977

ab77dbf977d020d14ba351ba926385c345693daf

parent: 023f46c63e

Unsigned

cmc <hello@cleberg.net> · 2026-07-16 02:50 UTC

chore: bump to 3.7.0 and record Phase 2

MARKETING_VERSION 3.6.0 -> 3.7.0, build 88 -> 89.

The README feature list also picks up Phase 1's ticket editing, subscriptions,
and email preferences, which it never gained.

Layout: unified · split

Hutch.xcodeproj/project.pbxproj +12 −12
@@ -597,7 +597,7 @@
597597 ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
598598 CODE_SIGN_ENTITLEMENTS = Hutch/Hutch.entitlements;
599599 CODE_SIGN_STYLE = Automatic;
600 CURRENT_PROJECT_VERSION = 88;
600 CURRENT_PROJECT_VERSION = 89;
601601 DEVELOPMENT_TEAM = ZCNAX3VL9D;
602602 ENABLE_PREVIEWS = YES;
603603 GENERATE_INFOPLIST_FILE = YES;
@@ -614,7 +614,7 @@
614614 "$(inherited)",
615615 "@executable_path/Frameworks",
616616 );
617 MARKETING_VERSION = 3.6.0;
617 MARKETING_VERSION = 3.7.0;
618618 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch;
619619 PRODUCT_NAME = "$(TARGET_NAME)";
620620 STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -634,7 +634,7 @@
634634 ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
635635 CODE_SIGN_ENTITLEMENTS = Hutch/Hutch.entitlements;
636636 CODE_SIGN_STYLE = Automatic;
637 CURRENT_PROJECT_VERSION = 88;
637 CURRENT_PROJECT_VERSION = 89;
638638 DEVELOPMENT_TEAM = ZCNAX3VL9D;
639639 ENABLE_PREVIEWS = YES;
640640 GENERATE_INFOPLIST_FILE = YES;
@@ -651,7 +651,7 @@
651651 "$(inherited)",
652652 "@executable_path/Frameworks",
653653 );
654 MARKETING_VERSION = 3.6.0;
654 MARKETING_VERSION = 3.7.0;
655655 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch;
656656 PRODUCT_NAME = "$(TARGET_NAME)";
657657 STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -714,7 +714,7 @@
714714 APPLICATION_EXTENSION_API_ONLY = YES;
715715 CODE_SIGN_ENTITLEMENTS = HutchWidgetExtension/HutchWidgetExtension.entitlements;
716716 CODE_SIGN_STYLE = Automatic;
717 CURRENT_PROJECT_VERSION = 88;
717 CURRENT_PROJECT_VERSION = 89;
718718 DEVELOPMENT_TEAM = ZCNAX3VL9D;
719719 GENERATE_INFOPLIST_FILE = NO;
720720 INFOPLIST_FILE = HutchWidgetExtension/Info.plist;
@@ -724,7 +724,7 @@
724724 "@executable_path/Frameworks",
725725 "@executable_path/../../Frameworks",
726726 );
727 MARKETING_VERSION = 3.6.0;
727 MARKETING_VERSION = 3.7.0;
728728 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch.HutchWidgetExtension;
729729 PRODUCT_NAME = "$(TARGET_NAME)";
730730 SKIP_INSTALL = YES;
@@ -743,7 +743,7 @@
743743 APPLICATION_EXTENSION_API_ONLY = YES;
744744 CODE_SIGN_ENTITLEMENTS = HutchWidgetExtension/HutchWidgetExtension.entitlements;
745745 CODE_SIGN_STYLE = Automatic;
746 CURRENT_PROJECT_VERSION = 88;
746 CURRENT_PROJECT_VERSION = 89;
747747 DEVELOPMENT_TEAM = ZCNAX3VL9D;
748748 GENERATE_INFOPLIST_FILE = NO;
749749 INFOPLIST_FILE = HutchWidgetExtension/Info.plist;
@@ -753,7 +753,7 @@
753753 "@executable_path/Frameworks",
754754 "@executable_path/../../Frameworks",
755755 );
756 MARKETING_VERSION = 3.6.0;
756 MARKETING_VERSION = 3.7.0;
757757 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch.HutchWidgetExtension;
758758 PRODUCT_NAME = "$(TARGET_NAME)";
759759 SKIP_INSTALL = YES;
@@ -772,7 +772,7 @@
772772 APPLICATION_EXTENSION_API_ONLY = YES;
773773 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
774774 CODE_SIGN_STYLE = Automatic;
775 CURRENT_PROJECT_VERSION = 88;
775 CURRENT_PROJECT_VERSION = 89;
776776 DEVELOPMENT_TEAM = ZCNAX3VL9D;
777777 GENERATE_INFOPLIST_FILE = NO;
778778 INFOPLIST_FILE = HutchSafariExtension/Info.plist;
@@ -782,7 +782,7 @@
782782 "@executable_path/Frameworks",
783783 "@executable_path/../../Frameworks",
784784 );
785 MARKETING_VERSION = 3.6.0;
785 MARKETING_VERSION = 3.7.0;
786786 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch.HutchSafariExtension;
787787 PRODUCT_NAME = "$(TARGET_NAME)";
788788 SKIP_INSTALL = YES;
@@ -801,7 +801,7 @@
801801 APPLICATION_EXTENSION_API_ONLY = YES;
802802 ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
803803 CODE_SIGN_STYLE = Automatic;
804 CURRENT_PROJECT_VERSION = 88;
804 CURRENT_PROJECT_VERSION = 89;
805805 DEVELOPMENT_TEAM = ZCNAX3VL9D;
806806 GENERATE_INFOPLIST_FILE = NO;
807807 INFOPLIST_FILE = HutchSafariExtension/Info.plist;
@@ -811,7 +811,7 @@
811811 "@executable_path/Frameworks",
812812 "@executable_path/../../Frameworks",
813813 );
814 MARKETING_VERSION = 3.6.0;
814 MARKETING_VERSION = 3.7.0;
815815 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch.HutchSafariExtension;
816816 PRODUCT_NAME = "$(TARGET_NAME)";
817817 SKIP_INSTALL = YES;
README.md +3
@@ -15,10 +15,13 @@ The app currently includes:
1515- Repository browsing for Git and Mercurial repositories
1616- Repository details including README, references, commits, diffs, files, artifacts, and settings
1717- Tracker and ticket browsing, ticket detail views, and tracker creation
18- Ticket editing and deletion, with subscriptions for tickets and trackers
1819- Build job browsing, build detail views, and build submission
1920- Inbox and mailing list reading flows
21- Patchset review: cover letters, per-patch diffs, checks, version chains, and status changes
2022- Paste browsing, creation, and detail views
2123- Profile and account settings, including SSH keys, PGP keys, and personal access token management
24- Email preferences for todo.sr.ht and lists.sr.ht
2225- Deep links for repositories, tickets, and build jobs
2326
2427Some SourceHut services are still browser-only from within Hutch. Unsupported areas currently open in Safari instead of rendering in-app.
ROADMAP.md +23 −14
@@ -74,24 +74,33 @@ Known follow-up: `BuildListViewModel`, `RepositoryListViewModel`, and
7474two different cache keys. That predates `APICacheKeys` and should be folded into
7575`cachedPayload`.
7676
77## Phase 2: Patchsets
77## Phase 2: Patchsets — done (v3.7.0)
7878
79The flagship gap. There is currently no reference to `patchset` anywhere in the
80Swift source, yet lists.sr.ht exposes a full `Patchset` type (subject, version,
81prefix, status, coverLetter, patches, tools, mbox), a `patchset` query, and an
82`updatePatchset` mutation. Sending and reviewing patches over email is the
83SourceHut contribution model, and Hutch cannot currently participate in it.
79The flagship gap. Sending and reviewing patches over email is the SourceHut
80contribution model, and Hutch had no reference to `patchset` anywhere.
8481
85Scope this as review-and-triage, not submission:
82Scoped as review-and-triage, not submission:
8683
87- Patchset list per mailing list.
88- Patchset detail: cover letter, per-patch diffs (reuse the existing
89 `DiffView`), version and superseded-by chain.
90- Status transitions via `updatePatchset`.
84- ~~Patchset list per mailing list~~ — see the caveat below.
85- ~~Patchset detail~~: cover letter, per-patch diffs (via the existing
86 `DiffView`), checks, and the version / superseded-by chain.
87- ~~Status transitions via `updatePatchset`~~.
9188
92Patch *submission* is an email / `git send-email` flow and is likely out of
93reach from the app. Treat that boundary as explicit rather than half-building
94it.
89Two schema facts shaped the result, and are worth knowing before extending this:
90
91- **`MailingList` has no `patchsets` field.** A list's patchsets cannot be
92 queried directly; they are reachable only through thread roots. The existing
93 threads query now also selects `root.patchset`, so the Patches tab costs no
94 extra request — but it also means patchsets cannot be filtered by status
95 server-side, and only patchsets whose thread appears in the current page are
96 listed.
97- **`Patch` carries no diff.** It has only `index`, `count`, `version`,
98 `prefix`, `subject`, and `trailers`. The diff exists solely inside the email
99 body, so it is recovered with `InboxThreadUtilities.segmentMessageBody` — the
100 same splitter the inbox thread view uses.
101
102Patch *submission* remains out of reach: it is a `git send-email` flow, not a
103GraphQL mutation. Treat that boundary as explicit rather than half-building it.
95104
96105## Phase 3: Polish and reach
97106