forgejo: squash unless curation is claimed, and name the curated style #22
No reviewers
Labels
No labels
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Meta/Campaign
Meta/Epic
Meta/Session
Priority/Critical
Priority/High
Priority/Low
Priority/Medium
Reviewed/Confirmed
Reviewed/Curated
Reviewed/Duplicate
Reviewed/Invalid
Reviewed/Won't Fix
Scope/Campaign
Status/Abandoned
Status/Blocked
Status/Conflicted
Status/In Progress
Status/In Review
Status/Need Grooming
Status/Need More Info
Status/Ready
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Depends on
Reference
Ting/Jostoph!22
Loading…
Reference in a new issue
No description provided.
Delete branch "tango/squash-unless-curated"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The Ting half of lar.ad/flake-ops#79 — owner ruling of 2026-08-11, that a merge with no claim attached should squash.
Stacked on #20 (base is
tango/curated-and-standing) because it moves a value #20 explicitly declared out of scope. Merge #20 first and this retargets tomain.In scope
instance."repository.pull-request".DEFAULT_MERGE_STYLEissquash. This file declares the instance defaults;lar.ad/flake-ops'smodules/impls/forge/forgejo.nixis where they are applied, and flake-ops#79 moves that one. They move together because the check inflake.nixcompares the two halves and would otherwise say so — which is the check working, not the check being in the way.curatedStyleis now its own name.nix/policy.nixreadmerge_style_curatedfrommergeStyles.default_merge_style, and that was correct only for as long as the default happened to berebase.The trap, since it is the reason this is more than one word
Changing the default alone would have made the curated path squash as well. The label would have gone on being read, applied, and reported — while meaning nothing, because both branches of the rule would have declared the same style. Nothing would have failed. The merge rule's own tests would have passed, because they assert
Do == "rebase"for a curated PR against a fixture policy that spells its styles out rather than deriving them.Two decisions had one name. They now have two:
curatedStyleis what a claim buys,default_merge_styleis what applies without one. Both are still validated against the repos' allow-set by the existing eval assertion, so neither can name a style the forge refuses.Out of scope
rebasewhen the label is present,squashwhen it is not.rebase,squashand fast-forward-only stay allowed; merge commits and rebase-merge stay off. This moves which style is offered first, not which are possible.DEFAULT_*only reaches repos created after it is set — every repo here still reportsdefault_merge_style: merge. This ruling reaches them through per-repo conformance, which this file already declares, not through app.ini.Boundary
nix/forgejo.nix(the instance default, andcuratedStyle),nix/policy.nix(reads it),flake.nix(the literal the check pins). No Rust, no policy parameters' values, no module.Acceptance
Verified locally:
nix flake checkpasses, includingrepos-declare-what-must-hold— which pins the instance/per-repo agreement and now pins it atsquash.nix build .#policyrendersmerge_style_curated: "rebase",merge_style_uncurated: "squash"— unchanged, which is exactly the point: the values stayed put while what determines them stopped being one value wearing two hats.policy/ting.jsonneeds no edit and the drift check stays quiet.(As with #20, the check run uses
--override-input jostoph-rs path:…against lar.ad/jostoph-rs#5; see #20 for why.)Authored as
agent.odin.bbf6a80707to6a0bca7149