da4d9b333d
feat(git): protected-branches enforcement + panel editor ( #649 )
...
projects.protected_branches existed end-to-end but nothing consulted it
— the panel had no editor and the git safety checks used hardcoded sets.
Now: GitService._protected_branches_for(slug) (frozenset, stripped,
fail-open to the hardcoded floor with a warning log) is unioned — never
replacing, only tightening — into rebase()'s refusal set, the shared
_delete_remote_branch_best_effort skip set (threaded through every
caller: task cleanup, PR merge/close cleanup), and sync_task_branch,
which now refuses to force-push a protected-named head (the dev-facing
sync_branch verb path the HTTP-only fix would have missed). Matching is
exact and case-sensitive; an empty list degrades to exactly the old
hardcoded behavior, pinned by union-floor regression tests (master/main
stay refused regardless of the project list).
Panel: chips editor for the field in the edit-project dialog (add via
Enter/comma, paste-splitting on comma-separated lists, dedup, clear-to-
empty persists []) with an honest tooltip scoped to what is actually
enforced. Tests cover both the incumbent GitHub-App dialog suite and the
new Protected Branches suite in one harness.
Co-authored-by: Renn F <rennf93@users.noreply.github.com >
2026-07-22 20:30:05 +02:00
..
2026-05-02 03:11:49 +02:00
2026-06-21 20:31:42 +02:00
2026-07-02 05:46:01 +02:00
2026-07-02 05:46:01 +02:00
2026-07-08 10:41:02 +02:00
2026-06-21 20:31:42 +02:00
2026-07-21 05:54:29 +02:00
2026-06-08 02:45:03 +02:00
2026-06-29 05:38:21 +02:00
2026-07-11 15:51:19 +02:00
2026-07-13 08:06:57 +02:00
2026-05-12 06:27:33 +02:00
2026-07-04 08:29:15 +02:00
2026-07-07 10:09:23 +02:00
2026-06-30 08:08:35 +02:00
2026-07-02 15:44:34 +02:00
2026-07-11 22:54:42 +02:00
2026-07-17 01:52:33 +02:00
2026-07-02 15:44:34 +02:00
2026-07-07 10:09:23 +02:00
2026-06-16 05:13:00 +02:00
2026-07-07 10:09:23 +02:00
2026-06-30 08:08:35 +02:00
2026-07-17 01:52:33 +02:00
2026-07-11 22:54:42 +02:00
2026-07-17 01:52:33 +02:00
2026-07-11 22:54:42 +02:00
2026-07-11 22:54:42 +02:00
2026-06-25 01:07:05 +02:00
2026-07-14 08:56:55 +02:00
2026-07-02 15:44:34 +02:00
2026-07-04 03:10:33 +02:00
2026-06-30 08:08:35 +02:00
2026-06-29 05:38:21 +02:00
2026-05-02 03:11:49 +02:00
2026-07-15 08:25:06 +02:00
2026-07-18 15:55:48 +02:00
2026-06-14 13:43:46 +02:00
2026-07-09 20:59:53 +02:00
2026-07-04 03:10:33 +02:00
2026-07-04 03:10:33 +02:00
2026-07-18 15:54:49 +02:00
2026-07-04 03:10:33 +02:00
2026-07-16 17:15:12 +02:00
2026-07-08 10:41:02 +02:00
2026-06-21 04:20:07 +02:00
2026-06-22 12:37:46 +02:00
2026-06-29 05:38:21 +02:00
2026-07-11 22:54:42 +02:00
2026-07-17 01:52:33 +02:00
2026-07-04 03:10:33 +02:00
2026-07-17 01:52:33 +02:00
2026-07-17 01:52:33 +02:00
2026-07-17 01:52:33 +02:00
2026-07-04 03:10:33 +02:00
2026-06-14 04:34:02 +02:00
2026-05-24 06:59:25 +02:00
2026-07-04 03:10:33 +02:00
2026-07-04 03:10:33 +02:00
2026-06-14 13:43:46 +02:00
2026-05-11 02:15:47 +02:00
2026-05-11 02:15:47 +02:00
2026-07-07 10:09:23 +02:00
2026-07-13 08:06:57 +02:00
2026-07-13 08:06:57 +02:00
2026-07-13 08:06:57 +02:00
2026-07-04 07:34:40 +02:00
2026-07-11 22:54:42 +02:00
2026-06-21 05:11:20 +02:00
2026-07-18 17:03:10 +02:00
2026-06-11 04:36:17 +02:00
2026-05-12 06:27:33 +02:00
2026-05-12 06:27:33 +02:00
2026-05-12 06:27:33 +02:00
2026-06-29 05:38:21 +02:00
2026-07-08 21:40:22 +02:00
2026-07-02 18:28:07 +02:00
2026-05-16 10:14:45 +02:00
2026-07-08 02:01:23 +02:00
2026-07-18 16:41:17 +02:00
2026-06-29 05:38:21 +02:00
2026-07-04 03:10:33 +02:00
2026-06-21 06:09:59 +02:00
2026-07-04 03:10:33 +02:00
2026-07-04 03:10:33 +02:00
2026-06-29 05:38:21 +02:00
2026-06-25 01:07:05 +02:00
2026-07-21 05:54:29 +02:00
2026-06-25 01:07:05 +02:00
2026-06-21 20:31:42 +02:00
2026-07-04 03:10:33 +02:00
2026-07-16 19:49:26 +02:00
2026-07-11 22:54:42 +02:00
2026-07-01 01:11:34 +02:00
2026-07-11 22:54:42 +02:00
2026-06-29 05:38:21 +02:00
2026-07-17 01:52:33 +02:00
2026-06-30 08:08:35 +02:00
2026-06-21 03:47:17 +02:00
2026-06-26 02:13:41 +02:00
2026-06-21 20:31:42 +02:00
2026-07-04 03:10:33 +02:00
2026-06-25 10:54:31 +02:00
2026-06-14 04:44:21 +02:00
2026-07-17 01:52:33 +02:00
2026-07-08 03:26:12 +02:00
2026-06-06 22:10:48 +02:00
2026-06-03 06:35:03 +02:00
2026-07-16 19:49:26 +02:00
2026-07-13 20:05:45 +02:00
2026-07-17 01:52:33 +02:00
2026-07-02 15:44:34 +02:00
2026-07-03 19:24:00 +02:00
2026-07-09 18:40:12 +02:00
2026-07-11 22:54:42 +02:00
2026-06-16 04:10:05 +02:00
2026-06-14 04:34:02 +02:00
2026-07-17 01:52:33 +02:00
2026-07-17 01:52:33 +02:00
2026-07-22 20:30:05 +02:00
2026-06-29 05:38:21 +02:00
2026-07-16 19:49:26 +02:00
2026-07-20 20:59:36 +02:00
2026-05-12 06:27:33 +02:00
2026-07-11 03:17:59 +02:00
2026-06-30 08:08:35 +02:00
2026-07-18 16:41:17 +02:00
2026-07-16 19:49:26 +02:00
2026-07-05 13:37:17 +02:00
2026-07-02 15:44:34 +02:00