Skip to content

Commit 0aedce4

Browse files
committed
refactor: simplify reader with manager and messenger
Signed-off-by: Terry Howe <[email protected]>
1 parent 8986d6d commit 0aedce4

File tree

5 files changed

+67
-49
lines changed

5 files changed

+67
-49
lines changed

cmd/oras/internal/display/status/progress/manager.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,23 @@ type manager struct {
4545
status []*status
4646
statusLock sync.RWMutex
4747
console *console.Console
48+
actionPrompt string
49+
donePrompt string
4850
updating sync.WaitGroup
4951
renderDone chan struct{}
5052
renderClosed chan struct{}
5153
}
5254

5355
// NewManager initialized a new progress manager.
54-
func NewManager(f *os.File) (Manager, error) {
55-
c, err := console.New(f)
56+
func NewManager(actionPrompt string, donePrompt string, tty *os.File) (Manager, error) {
57+
c, err := console.New(tty)
5658
if err != nil {
5759
return nil, err
5860
}
5961
m := &manager{
6062
console: c,
63+
actionPrompt: actionPrompt,
64+
donePrompt: donePrompt,
6165
renderDone: make(chan struct{}),
6266
renderClosed: make(chan struct{}),
6367
}

cmd/oras/internal/display/status/track/reader.go

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,56 +17,44 @@ package track
1717

1818
import (
1919
"io"
20-
"os"
2120

2221
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
2322
"oras.land/oras/cmd/oras/internal/display/status/progress"
2423
)
2524

25+
type Reader interface {
26+
io.Reader
27+
Done()
28+
Close()
29+
Start()
30+
}
31+
2632
type reader struct {
2733
base io.Reader
2834
offset int64
2935
actionPrompt string
3036
donePrompt string
3137
descriptor ocispec.Descriptor
32-
manager progress.Manager
3338
messenger *progress.Messenger
39+
done bool
3440
}
3541

3642
// NewReader returns a new reader with tracked progress.
37-
func NewReader(r io.Reader, descriptor ocispec.Descriptor, actionPrompt string, donePrompt string, tty *os.File) (*reader, error) {
38-
manager, err := progress.NewManager(tty)
39-
if err != nil {
40-
return nil, err
43+
func NewReader(r io.Reader, descriptor ocispec.Descriptor, messenger *progress.Messenger) Reader {
44+
tr := reader{
45+
base: r,
46+
descriptor: descriptor,
47+
messenger: messenger,
4148
}
42-
return managedReader(r, descriptor, manager, actionPrompt, donePrompt)
43-
}
44-
45-
func managedReader(r io.Reader, descriptor ocispec.Descriptor, manager progress.Manager, actionPrompt string, donePrompt string) (*reader, error) {
46-
messenger, err := manager.Add()
47-
if err != nil {
48-
return nil, err
49-
}
50-
51-
return &reader{
52-
base: r,
53-
descriptor: descriptor,
54-
actionPrompt: actionPrompt,
55-
donePrompt: donePrompt,
56-
manager: manager,
57-
messenger: messenger,
58-
}, nil
59-
}
60-
61-
// StopManager stops the messenger channel and related manager.
62-
func (r *reader) StopManager() {
63-
r.Close()
64-
_ = r.manager.Close()
49+
return &tr
6550
}
6651

6752
// Done sends message to mark the tracked progress as complete.
6853
func (r *reader) Done() {
69-
r.messenger.Send(r.donePrompt, r.descriptor, r.descriptor.Size)
54+
if !r.done {
55+
r.messenger.Send(r.donePrompt, r.descriptor, r.descriptor.Size)
56+
r.done = true
57+
}
7058
r.messenger.Stop()
7159
}
7260

cmd/oras/internal/display/status/track/target.go

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,7 @@ type GraphTarget interface {
3535

3636
type graphTarget struct {
3737
oras.GraphTarget
38-
manager progress.Manager
39-
actionPrompt string
40-
donePrompt string
38+
manager progress.Manager
4139
}
4240

4341
type referenceGraphTarget struct {
@@ -46,15 +44,13 @@ type referenceGraphTarget struct {
4644

4745
// NewTarget creates a new tracked Target.
4846
func NewTarget(t oras.GraphTarget, actionPrompt, donePrompt string, tty *os.File) (GraphTarget, error) {
49-
manager, err := progress.NewManager(tty)
47+
manager, err := progress.NewManager(actionPrompt, donePrompt, tty)
5048
if err != nil {
5149
return nil, err
5250
}
5351
gt := &graphTarget{
54-
GraphTarget: t,
55-
manager: manager,
56-
actionPrompt: actionPrompt,
57-
donePrompt: donePrompt,
52+
GraphTarget: t,
53+
manager: manager,
5854
}
5955

6056
if _, ok := t.(registry.ReferencePusher); ok {
@@ -74,7 +70,13 @@ func (t *graphTarget) Mount(ctx context.Context, desc ocispec.Descriptor, fromRe
7470

7571
// Push pushes the content to the base oras.GraphTarget with tracking.
7672
func (t *graphTarget) Push(ctx context.Context, expected ocispec.Descriptor, content io.Reader) error {
77-
r, err := managedReader(content, expected, t.manager, t.actionPrompt, t.donePrompt)
73+
messenger, err := t.manager.Add()
74+
if err != nil {
75+
return err
76+
}
77+
defer messenger.Stop()
78+
79+
r := NewReader(content, expected, messenger)
7880
if err != nil {
7981
return err
8082
}
@@ -89,7 +91,13 @@ func (t *graphTarget) Push(ctx context.Context, expected ocispec.Descriptor, con
8991

9092
// PushReference pushes the content to the base oras.GraphTarget with tracking.
9193
func (rgt *referenceGraphTarget) PushReference(ctx context.Context, expected ocispec.Descriptor, content io.Reader, reference string) error {
92-
r, err := managedReader(content, expected, rgt.manager, rgt.actionPrompt, rgt.donePrompt)
94+
messenger, err := rgt.manager.Add()
95+
if err != nil {
96+
return err
97+
}
98+
defer messenger.Stop()
99+
100+
r := NewReader(content, expected, messenger)
93101
if err != nil {
94102
return err
95103
}

cmd/oras/root/blob/fetch.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"oras.land/oras-go/v2/registry/remote"
2929
"oras.land/oras/cmd/oras/internal/argument"
3030
"oras.land/oras/cmd/oras/internal/command"
31+
"oras.land/oras/cmd/oras/internal/display/status/progress"
3132
"oras.land/oras/cmd/oras/internal/display/status/track"
3233
oerrors "oras.land/oras/cmd/oras/internal/errors"
3334
"oras.land/oras/cmd/oras/internal/option"
@@ -170,12 +171,20 @@ func (opts *fetchBlobOptions) doFetch(ctx context.Context, src oras.ReadOnlyTarg
170171
return ocispec.Descriptor{}, err
171172
}
172173
} else {
173-
// TTY output
174-
trackedReader, err := track.NewReader(vr, desc, "Downloading", "Downloaded ", opts.TTY)
174+
manager, err := progress.NewManager("Downloading", "Downloaded ", opts.TTY)
175175
if err != nil {
176-
return ocispec.Descriptor{}, err
176+
return desc, err
177177
}
178-
defer trackedReader.StopManager()
178+
defer manager.Close()
179+
180+
messenger, err := manager.Add()
181+
if err != nil {
182+
return desc, err
183+
}
184+
defer messenger.Stop()
185+
186+
// TTY output
187+
trackedReader := track.NewReader(vr, desc, messenger)
179188
trackedReader.Start()
180189
if _, err = io.Copy(writer, trackedReader); err != nil {
181190
return ocispec.Descriptor{}, err

cmd/oras/root/blob/push.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"context"
2020
"errors"
2121
"io"
22+
"oras.land/oras/cmd/oras/internal/display/status/progress"
2223
"os"
2324

2425
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
@@ -154,12 +155,20 @@ func (opts *pushBlobOptions) doPush(ctx context.Context, printer *output.Printer
154155
return printer.PrintStatus(desc, "Uploaded ")
155156
}
156157

157-
// TTY output
158-
trackedReader, err := track.NewReader(r, desc, "Uploading", "Uploaded ", opts.TTY)
158+
manager, err := progress.NewManager("Downloading", "Downloaded ", opts.TTY)
159159
if err != nil {
160160
return err
161161
}
162-
defer trackedReader.StopManager()
162+
defer manager.Close()
163+
164+
messenger, err := manager.Add()
165+
if err != nil {
166+
return err
167+
}
168+
defer messenger.Stop()
169+
170+
// TTY output
171+
trackedReader := track.NewReader(r, desc, messenger)
163172
trackedReader.Start()
164173
r = trackedReader
165174
if err := t.Push(ctx, desc, r); err != nil {

0 commit comments

Comments
 (0)