From ea8373ed78113af57315ae4523d42dfed3a3b1fe Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sat, 28 Mar 2026 19:58:37 +0000 Subject: network, internal/progress, format/packfile/ingest: Use WriteFlusher --- network/protocol/pktline/encoder.go | 14 ++++-------- network/protocol/sideband64k/encoder.go | 3 ++- .../protocol/v0v1/server/receivepack/session.go | 3 ++- network/protocol/v0v1/server/session.go | 25 ++++++++++++++++++---- network/receivepack/hook.go | 3 ++- network/receivepack/receivepack.go | 15 ++++++------- network/receivepack/service/hook.go | 3 ++- network/receivepack/service/ingest_quarantine.go | 9 ++++---- network/receivepack/service/options.go | 9 ++++---- 9 files changed, 47 insertions(+), 37 deletions(-) (limited to 'network') diff --git a/network/protocol/pktline/encoder.go b/network/protocol/pktline/encoder.go index b4c6dbf0..3d92ca19 100644 --- a/network/protocol/pktline/encoder.go +++ b/network/protocol/pktline/encoder.go @@ -3,26 +3,20 @@ package pktline import ( "fmt" "io" -) -// WriteFlusher is the output transport contract required by Encoder. -// -// Write emits framed bytes and Flush pushes buffered transport state. -type WriteFlusher interface { - io.Writer - Flush() error -} + "codeberg.org/lindenii/furgit/common/iowrap" +) // Encoder writes pkt-line frames to a flush-capable output transport. // // It writes exactly one frame per method call and does not auto-chunk data. type Encoder struct { - w WriteFlusher + w iowrap.WriteFlusher maxData int } // NewEncoder creates an encoder over w. -func NewEncoder(w WriteFlusher) *Encoder { +func NewEncoder(w iowrap.WriteFlusher) *Encoder { return &Encoder{ w: w, maxData: LargePacketDataMax, diff --git a/network/protocol/sideband64k/encoder.go b/network/protocol/sideband64k/encoder.go index 9f729d15..8b48566d 100644 --- a/network/protocol/sideband64k/encoder.go +++ b/network/protocol/sideband64k/encoder.go @@ -3,6 +3,7 @@ package sideband64k import ( "fmt" + "codeberg.org/lindenii/furgit/common/iowrap" "codeberg.org/lindenii/furgit/network/protocol/pktline" ) @@ -15,7 +16,7 @@ type Encoder struct { } // NewEncoder creates an encoder over w. -func NewEncoder(w pktline.WriteFlusher) *Encoder { +func NewEncoder(w iowrap.WriteFlusher) *Encoder { return &Encoder{ enc: pktline.NewEncoder(w), maxData: DataMax, diff --git a/network/protocol/v0v1/server/receivepack/session.go b/network/protocol/v0v1/server/receivepack/session.go index 55019714..d7b2a7c5 100644 --- a/network/protocol/v0v1/server/receivepack/session.go +++ b/network/protocol/v0v1/server/receivepack/session.go @@ -5,6 +5,7 @@ import ( "io" "strings" + "codeberg.org/lindenii/furgit/common/iowrap" common "codeberg.org/lindenii/furgit/network/protocol/v0v1/server" objectid "codeberg.org/lindenii/furgit/object/id" ) @@ -168,7 +169,7 @@ func (session *Session) WriteProgress(p []byte) error { // ProgressWriter returns one chunking writer for sideband progress output. // // When side-band-64k was not negotiated, writes are discarded. -func (session *Session) ProgressWriter() io.Writer { +func (session *Session) ProgressWriter() iowrap.WriteFlusher { return session.base.ProgressWriter() } diff --git a/network/protocol/v0v1/server/session.go b/network/protocol/v0v1/server/session.go index ab79a7d7..0a4ecb53 100644 --- a/network/protocol/v0v1/server/session.go +++ b/network/protocol/v0v1/server/session.go @@ -3,6 +3,7 @@ package server import ( "io" + "codeberg.org/lindenii/furgit/common/iowrap" "codeberg.org/lindenii/furgit/network/protocol/pktline" "codeberg.org/lindenii/furgit/network/protocol/sideband64k" objectid "codeberg.org/lindenii/furgit/object/id" @@ -26,7 +27,7 @@ type Session struct { } // NewSession creates one v0/v1 server session over r and w. -func NewSession(r io.Reader, w pktline.WriteFlusher, opts Options) *Session { +func NewSession(r io.Reader, w iowrap.WriteFlusher, opts Options) *Session { return &Session{ dec: pktline.NewDecoder(r, pktline.ReadOptions{}), enc: pktline.NewEncoder(w), @@ -96,15 +97,31 @@ func (session *Session) FlushIO() error { return session.enc.FlushIO() } +type flushWriter struct { + writer io.Writer + flush func() error +} + +func (w flushWriter) Write(p []byte) (int, error) { + return w.writer.Write(p) +} + +func (w flushWriter) Flush() error { + return w.flush() +} + // ProgressWriter returns one chunking writer for sideband progress output. // // When side-band-64k was not negotiated, writes are discarded. -func (session *Session) ProgressWriter() io.Writer { +func (session *Session) ProgressWriter() iowrap.WriteFlusher { if !session.useSideBand { - return io.Discard + return iowrap.NopFlush(io.Discard) } - return sideband64k.NewChunkWriter(session.sideband, sideband64k.BandProgress) + return flushWriter{ + writer: sideband64k.NewChunkWriter(session.sideband, sideband64k.BandProgress), + flush: session.sideband.FlushIO, + } } // ErrorWriter returns one chunking writer for sideband error output. diff --git a/network/receivepack/hook.go b/network/receivepack/hook.go index 96027769..22135746 100644 --- a/network/receivepack/hook.go +++ b/network/receivepack/hook.go @@ -4,6 +4,7 @@ import ( "context" "io" + "codeberg.org/lindenii/furgit/common/iowrap" commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read" "codeberg.org/lindenii/furgit/network/receivepack/service" objectid "codeberg.org/lindenii/furgit/object/id" @@ -12,7 +13,7 @@ import ( ) type HookIO struct { - Progress io.Writer + Progress iowrap.WriteFlusher Error io.Writer } diff --git a/network/receivepack/receivepack.go b/network/receivepack/receivepack.go index 1052848e..26fce24c 100644 --- a/network/receivepack/receivepack.go +++ b/network/receivepack/receivepack.go @@ -4,7 +4,7 @@ import ( "context" "io" - "codeberg.org/lindenii/furgit/network/protocol/pktline" + "codeberg.org/lindenii/furgit/common/iowrap" common "codeberg.org/lindenii/furgit/network/protocol/v0v1/server" protoreceive "codeberg.org/lindenii/furgit/network/protocol/v0v1/server/receivepack" "codeberg.org/lindenii/furgit/network/receivepack/service" @@ -23,7 +23,7 @@ import ( // Labels: Deps-Borrowed. func ReceivePack( ctx context.Context, - w pktline.WriteFlusher, + w iowrap.WriteFlusher, r io.Reader, opts Options, ) error { @@ -89,12 +89,10 @@ func ReceivePack( return err } - progressWriter := protoSession.ProgressWriter() - progressFlush := base.FlushIO + progress := protoSession.ProgressWriter() if req.Capabilities.Quiet { - progressWriter = io.Discard - progressFlush = nil + progress = iowrap.NopFlush(io.Discard) } serviceReq := &service.Request{ @@ -112,14 +110,13 @@ func ReceivePack( ExistingObjects: opts.ExistingObjects, CommitGraph: opts.CommitGraph, ObjectsRoot: opts.ObjectsRoot, - Progress: progressWriter, - ProgressFlush: progressFlush, + Progress: progress, PromotedObjectPermissions: translatePromotedObjectPermissions( opts.PromotedObjectPermissions, ), Hook: translateHook(opts.Hook), HookIO: service.HookIO{ - Progress: progressWriter, + Progress: progress, Error: protoSession.ErrorWriter(), }, }) diff --git a/network/receivepack/service/hook.go b/network/receivepack/service/hook.go index 66ff0929..7f7b88b5 100644 --- a/network/receivepack/service/hook.go +++ b/network/receivepack/service/hook.go @@ -4,6 +4,7 @@ import ( "context" "io" + "codeberg.org/lindenii/furgit/common/iowrap" commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read" objectid "codeberg.org/lindenii/furgit/object/id" objectstore "codeberg.org/lindenii/furgit/object/store" @@ -11,7 +12,7 @@ import ( ) type HookIO struct { - Progress io.Writer + Progress iowrap.WriteFlusher Error io.Writer } diff --git a/network/receivepack/service/ingest_quarantine.go b/network/receivepack/service/ingest_quarantine.go index 1ed62a73..14083fe1 100644 --- a/network/receivepack/service/ingest_quarantine.go +++ b/network/receivepack/service/ingest_quarantine.go @@ -50,11 +50,10 @@ func (service *Service) ingestQuarantine( req.Pack, service.opts.Algorithm, ingest.Options{ - FixThin: true, - WriteRev: true, - Base: service.opts.ExistingObjects, - Progress: service.opts.Progress, - ProgressFlush: service.opts.ProgressFlush, + FixThin: true, + WriteRev: true, + Base: service.opts.ExistingObjects, + Progress: service.opts.Progress, }, ) if err != nil { diff --git a/network/receivepack/service/options.go b/network/receivepack/service/options.go index ab867bce..82c496c3 100644 --- a/network/receivepack/service/options.go +++ b/network/receivepack/service/options.go @@ -1,10 +1,10 @@ package service import ( - "io" "io/fs" "os" + "codeberg.org/lindenii/furgit/common/iowrap" commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read" objectid "codeberg.org/lindenii/furgit/object/id" objectstore "codeberg.org/lindenii/furgit/object/store" @@ -22,16 +22,15 @@ type PromotedObjectPermissions struct { // // Refs and ExistingObjects are required and must be non-nil. // ObjectsRoot is required if Execute may need to ingest or promote a pack. -// Progress, ProgressFlush, Hook, and HookIO are optional; when provided they -// are also borrowed for the duration of Execute. +// Progress, Hook, and HookIO are optional; when provided they are also +// borrowed for the duration of Execute. type Options struct { Algorithm objectid.Algorithm Refs refstore.ReadWriteStore ExistingObjects objectstore.ReadingStore CommitGraph *commitgraphread.Reader ObjectsRoot *os.Root - Progress io.Writer - ProgressFlush func() error + Progress iowrap.WriteFlusher PromotedObjectPermissions *PromotedObjectPermissions Hook Hook HookIO HookIO -- cgit v1.3.1-10-gc9f91