From 7df760fd9cc61e5d0d004bb65ae70c9ec83a2db3 Mon Sep 17 00:00:00 2001 From: Terry Howe Date: Sat, 28 Sep 2024 12:36:11 -0600 Subject: [PATCH] refactor: Create tracked reader interface Signed-off-by: Terry Howe --- .../internal/display/status/track/reader.go | 25 +++++++++---------- .../internal/display/status/track/target.go | 6 +++-- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/cmd/oras/internal/display/status/track/reader.go b/cmd/oras/internal/display/status/track/reader.go index 93919381f..fca875293 100644 --- a/cmd/oras/internal/display/status/track/reader.go +++ b/cmd/oras/internal/display/status/track/reader.go @@ -23,6 +23,14 @@ import ( "oras.land/oras/cmd/oras/internal/display/status/progress" ) +type Reader interface { + io.Reader + Done() + Close() + Start() + StopManager() +} + type reader struct { base io.Reader offset int64 @@ -34,28 +42,19 @@ type reader struct { } // NewReader returns a new reader with tracked progress. -func NewReader(r io.Reader, descriptor ocispec.Descriptor, actionPrompt string, donePrompt string, tty *os.File) (*reader, error) { +func NewReader(r io.Reader, descriptor ocispec.Descriptor, actionPrompt string, donePrompt string, tty *os.File) (Reader, error) { manager, err := progress.NewManager(tty) if err != nil { return nil, err } - return managedReader(r, descriptor, manager, actionPrompt, donePrompt) -} - -func managedReader(r io.Reader, descriptor ocispec.Descriptor, manager progress.Manager, actionPrompt string, donePrompt string) (*reader, error) { - messenger, err := manager.Add() - if err != nil { - return nil, err - } - - return &reader{ + tr := reader{ base: r, descriptor: descriptor, actionPrompt: actionPrompt, donePrompt: donePrompt, manager: manager, - messenger: messenger, - }, nil + } + return &tr, nil } // StopManager stops the messenger channel and related manager. diff --git a/cmd/oras/internal/display/status/track/target.go b/cmd/oras/internal/display/status/track/target.go index 5c704ebbc..f93bdcb03 100644 --- a/cmd/oras/internal/display/status/track/target.go +++ b/cmd/oras/internal/display/status/track/target.go @@ -35,6 +35,7 @@ type GraphTarget interface { type graphTarget struct { oras.GraphTarget + tty *os.File manager progress.Manager actionPrompt string donePrompt string @@ -52,6 +53,7 @@ func NewTarget(t oras.GraphTarget, actionPrompt, donePrompt string, tty *os.File } gt := &graphTarget{ GraphTarget: t, + tty: tty, manager: manager, actionPrompt: actionPrompt, donePrompt: donePrompt, @@ -74,7 +76,7 @@ func (t *graphTarget) Mount(ctx context.Context, desc ocispec.Descriptor, fromRe // Push pushes the content to the base oras.GraphTarget with tracking. func (t *graphTarget) Push(ctx context.Context, expected ocispec.Descriptor, content io.Reader) error { - r, err := managedReader(content, expected, t.manager, t.actionPrompt, t.donePrompt) + r, err := NewReader(content, expected, t.actionPrompt, t.donePrompt, t.tty) if err != nil { return err } @@ -89,7 +91,7 @@ func (t *graphTarget) Push(ctx context.Context, expected ocispec.Descriptor, con // PushReference pushes the content to the base oras.GraphTarget with tracking. func (rgt *referenceGraphTarget) PushReference(ctx context.Context, expected ocispec.Descriptor, content io.Reader, reference string) error { - r, err := managedReader(content, expected, rgt.manager, rgt.actionPrompt, rgt.donePrompt) + r, err := NewReader(content, expected, rgt.actionPrompt, rgt.donePrompt, rgt.tty) if err != nil { return err }