Implement SSH receive-pack pushes
This commit is contained in:
@@ -80,6 +80,18 @@ verification, object limits, and atomic ref updates, while the existing
|
||||
IronStorage code continues to own clone staging, checkout, merge, conflict, and
|
||||
rollback behavior.
|
||||
|
||||
SSH push opens the same verified and authenticated session-channel boundary for
|
||||
`git-receive-pack '<path>'`. Storage validates the advertisement, rejects
|
||||
non-fast-forward updates before sending, constructs the complete reachable
|
||||
object pack, then half-closes channel input and drains the status and bounded
|
||||
stderr streams. The remote-tracking ref advances only after `unpack ok`, an
|
||||
`ok` for the selected ref, a zero service exit, and clean channel completion.
|
||||
Unpack and ref-policy rejections remain typed failures; a malformed response,
|
||||
disconnect, or cancellation after sending is an unknown outcome that requires
|
||||
a fresh fetch before retrying and is never replayed automatically. Synchronize
|
||||
always completes pull first and cannot open receive-pack after a failed,
|
||||
cancelled, or conflicted pull.
|
||||
|
||||
Pull refuses a dirty worktree. It fast-forwards when possible and otherwise
|
||||
uses the embedded three-way tree merge. Unresolved paths are returned as typed
|
||||
`MergeConflicts`; no conflict markers or partial checkout are written. Checkout
|
||||
|
||||
Reference in New Issue
Block a user