-
Notifications
You must be signed in to change notification settings - Fork 177
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
refactor: status, metadata and content handlers for manifest index
commands
#1509
base: main
Are you sure you want to change the base?
Changes from 15 commits
182c8f0
495ab7e
d81fd04
f807af8
9134a8f
5104cc9
a9b1164
4d144be
4d18845
8ea9b14
16cf5ab
c56fdec
49091a2
66249a8
6e3b09a
851701d
3a2fb99
a7a88d8
f6c0790
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,58 @@ | ||||||||||
/* | ||||||||||
Copyright The ORAS Authors. | ||||||||||
Licensed under the Apache License, Version 2.0 (the "License"); | ||||||||||
you may not use this file except in compliance with the License. | ||||||||||
You may obtain a copy of the License at | ||||||||||
|
||||||||||
http://www.apache.org/licenses/LICENSE-2.0 | ||||||||||
|
||||||||||
Unless required by applicable law or agreed to in writing, software | ||||||||||
distributed under the License is distributed on an "AS IS" BASIS, | ||||||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||||||
See the License for the specific language governing permissions and | ||||||||||
limitations under the License. | ||||||||||
*/ | ||||||||||
|
||||||||||
package content | ||||||||||
|
||||||||||
import ( | ||||||||||
"fmt" | ||||||||||
"io" | ||||||||||
"os" | ||||||||||
|
||||||||||
"oras.land/oras/cmd/oras/internal/output" | ||||||||||
) | ||||||||||
|
||||||||||
// manifestIndexCreate handles raw content output. | ||||||||||
type manifestIndexCreate struct { | ||||||||||
pretty bool | ||||||||||
stdout io.Writer | ||||||||||
outputPath string | ||||||||||
} | ||||||||||
|
||||||||||
// OnContentCreated is called after index content is created. | ||||||||||
func (h *manifestIndexCreate) OnContentCreated(manifest []byte) error { | ||||||||||
out := h.stdout | ||||||||||
if h.outputPath != "" && h.outputPath != "-" { | ||||||||||
f, err := os.Create(h.outputPath) | ||||||||||
if err != nil { | ||||||||||
return fmt.Errorf("failed to open %q: %w", h.outputPath, err) | ||||||||||
} | ||||||||||
defer f.Close() | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We need to create an issue to track handling errors returned by There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Created #1516 |
||||||||||
out = f | ||||||||||
} | ||||||||||
return output.PrintJSON(out, manifest, h.pretty) | ||||||||||
qweeah marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||
} | ||||||||||
|
||||||||||
// NewManifestIndexCreateHandler creates a new handler. | ||||||||||
func NewManifestIndexCreateHandler(out io.Writer, pretty bool, outputPath string) ManifestIndexCreateHandler { | ||||||||||
// ignore --pretty when output to a file | ||||||||||
if outputPath != "" && outputPath != "-" { | ||||||||||
pretty = false | ||||||||||
} | ||||||||||
Comment on lines
+49
to
+52
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It is different from There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
oras/cmd/oras/root/manifest/fetch.go Lines 80 to 83 in dcef719
I think we need to remove it and change the flag reset to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Added pretty value reset in manifest fetch handler too. |
||||||||||
return &manifestIndexCreate{ | ||||||||||
qweeah marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||
pretty: pretty, | ||||||||||
stdout: out, | ||||||||||
outputPath: outputPath, | ||||||||||
} | ||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -174,9 +174,42 @@ func NewManifestPushHandler(printer *output.Printer) metadata.ManifestPushHandle | |
return text.NewManifestPushHandler(printer) | ||
} | ||
|
||
// NewManifestIndexCreateHandler returns an index create handler. | ||
func NewManifestIndexCreateHandler(printer *output.Printer) metadata.ManifestIndexCreateHandler { | ||
return text.NewManifestIndexCreateHandler(printer) | ||
// NewManifestIndexCreateHandler returns status, metadata and content handlers for index create command. | ||
func NewManifestIndexCreateHandler(outputPath string, printer *output.Printer, pretty bool) ( | ||
status.ManifestIndexCreateHandler, | ||
metadata.ManifestIndexCreateHandler, | ||
content.ManifestIndexCreateHandler, | ||
error) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. When will an error be returned? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. good catch. Removed the error return. |
||
statusHandler := status.NewTextManifestIndexCreateHandler(printer) | ||
metadataHandler := text.NewManifestIndexCreateHandler(printer) | ||
contentHandler := content.NewManifestIndexCreateHandler(printer, pretty, outputPath) | ||
switch outputPath { | ||
case "": | ||
contentHandler = content.NewDiscardHandler() | ||
case "-": | ||
statusHandler = status.NewDiscardHandler() | ||
metadataHandler = metadata.NewDiscardHandler() | ||
} | ||
return statusHandler, metadataHandler, contentHandler, nil | ||
} | ||
|
||
// NewManifestIndexUpdateHandler returns status, metadata and content handlers for index update command. | ||
func NewManifestIndexUpdateHandler(outputPath string, printer *output.Printer, pretty bool) ( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. should there just be a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Currently we need both create and update handlers. |
||
status.ManifestIndexUpdateHandler, | ||
metadata.ManifestIndexUpdateHandler, | ||
content.ManifestIndexUpdateHandler, | ||
error) { | ||
statusHandler := status.NewTextManifestIndexUpdateHandler(printer) | ||
metadataHandler := text.NewManifestIndexUpdateHandler(printer) | ||
contentHandler := content.NewManifestIndexCreateHandler(printer, pretty, outputPath) | ||
switch outputPath { | ||
case "": | ||
contentHandler = content.NewDiscardHandler() | ||
case "-": | ||
statusHandler = status.NewDiscardHandler() | ||
metadataHandler = metadata.NewDiscardHandler() | ||
} | ||
return statusHandler, metadataHandler, contentHandler, nil | ||
} | ||
|
||
// NewCopyHandler returns copy handlers. | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,6 +16,7 @@ limitations under the License. | |
package metadata | ||
|
||
import ( | ||
"github.com/opencontainers/go-digest" | ||
ocispec "github.com/opencontainers/image-spec/specs-go/v1" | ||
"oras.land/oras/cmd/oras/internal/option" | ||
) | ||
|
@@ -78,9 +79,25 @@ type ManifestPushHandler interface { | |
TaggedHandler | ||
} | ||
|
||
type manifestPackHandler interface { | ||
OnIndexPacked(desc ocispec.Descriptor) error | ||
OnIndexPushed(path string) error | ||
OnCompleted(desc ocispec.Descriptor) error | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do you want to merge this to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Removed this interface and now moved these three methods to index create handler. |
||
|
||
// ManifestIndexCreateHandler handles metadata output for index create events. | ||
type ManifestIndexCreateHandler interface { | ||
TaggedHandler | ||
manifestPackHandler | ||
} | ||
|
||
// ManifestIndexUpdateHandler handles metadata output for index update events. | ||
type ManifestIndexUpdateHandler interface { | ||
TaggedHandler | ||
manifestPackHandler | ||
OnManifestRemoved(digest digest.Digest) error | ||
OnManifestAdded(manifestRef string, digest digest.Digest) error | ||
OnIndexMerged(indexRef string, digest digest.Digest) error | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Change digest to descriptor since it will be used for formatted output in the future. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The parameter of |
||
|
||
// CopyHandler handles metadata output for cp events. | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
/* | ||
Copyright The ORAS Authors. | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
|
||
http://www.apache.org/licenses/LICENSE-2.0 | ||
|
||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
*/ | ||
|
||
package text | ||
|
||
import ( | ||
"github.com/opencontainers/go-digest" | ||
ocispec "github.com/opencontainers/image-spec/specs-go/v1" | ||
"oras.land/oras/cmd/oras/internal/display/metadata" | ||
"oras.land/oras/cmd/oras/internal/output" | ||
"oras.land/oras/internal/contentutil" | ||
"oras.land/oras/internal/descriptor" | ||
) | ||
|
||
// ManifestIndexCreateHandler handles text metadata output for index create events. | ||
type ManifestIndexCreateHandler struct { | ||
printer *output.Printer | ||
} | ||
|
||
// NewManifestIndexCreateHandler returns a new handler for index create events. | ||
func NewManifestIndexCreateHandler(printer *output.Printer) metadata.ManifestIndexCreateHandler { | ||
return &ManifestIndexCreateHandler{ | ||
printer: printer, | ||
} | ||
} | ||
|
||
// OnIndexPacked implements metadata.ManifestIndexCreateHandler. | ||
func (h *ManifestIndexCreateHandler) OnIndexPacked(desc ocispec.Descriptor) error { | ||
return h.printer.Println("Packed", descriptor.ShortDigest(desc), ocispec.MediaTypeImageIndex) | ||
} | ||
|
||
// OnIndexPushed implements metadata.ManifestIndexCreateHandler. | ||
wangxiaoxuan273 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
func (h *ManifestIndexCreateHandler) OnIndexPushed(path string) error { | ||
return h.printer.Println("Pushed", path) | ||
} | ||
|
||
// OnTagged implements metadata.TaggedHandler. | ||
func (h *ManifestIndexCreateHandler) OnTagged(_ ocispec.Descriptor, tag string) error { | ||
return h.printer.Println("Tagged", tag) | ||
} | ||
|
||
// OnCompleted implements metadata.ManifestIndexCreateHandler. | ||
func (h *ManifestIndexCreateHandler) OnCompleted(desc ocispec.Descriptor) error { | ||
return h.printer.Println("Digest:", desc.Digest) | ||
} | ||
|
||
type ManifestIndexUpdateHandler struct { | ||
wangxiaoxuan273 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
printer *output.Printer | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can you help separate |
||
} | ||
|
||
// NewManifestIndexUpdateHandler returns a new handler for index update events. | ||
func NewManifestIndexUpdateHandler(printer *output.Printer) metadata.ManifestIndexUpdateHandler { | ||
return &ManifestIndexUpdateHandler{ | ||
printer: printer, | ||
} | ||
} | ||
|
||
// OnManifestRemoved implements metadata.ManifestIndexUpdateHandler. | ||
func (miuh ManifestIndexUpdateHandler) OnManifestRemoved(digest digest.Digest) error { | ||
return miuh.printer.Println("Removed", digest) | ||
} | ||
|
||
// OnManifestAdded implements metadata.ManifestIndexUpdateHandler. | ||
func (miuh ManifestIndexUpdateHandler) OnManifestAdded(ref string, digest digest.Digest) error { | ||
if contentutil.IsDigest(ref) { | ||
return miuh.printer.Println("Added", ref) | ||
} | ||
return miuh.printer.Println("Added", digest, ref) | ||
} | ||
|
||
// OnIndexMerged implements metadata.ManifestIndexUpdateHandler. | ||
func (miuh ManifestIndexUpdateHandler) OnIndexMerged(ref string, digest digest.Digest) error { | ||
if contentutil.IsDigest(ref) { | ||
return miuh.printer.Println("Merged", ref) | ||
} | ||
return miuh.printer.Println("Merged", digest, ref) | ||
} | ||
|
||
// OnIndexUpdated implements metadata.ManifestIndexUpdateHandler. | ||
func (miuh ManifestIndexUpdateHandler) OnIndexPacked(desc ocispec.Descriptor) error { | ||
return miuh.printer.Println("Updated", desc.Digest) | ||
} | ||
|
||
// OnIndexPushed implements metadata.ManifestIndexUpdateHandler. | ||
func (miuh ManifestIndexUpdateHandler) OnIndexPushed(indexRef string) error { | ||
return miuh.printer.Println("Pushed", indexRef) | ||
} | ||
|
||
// OnTagged implements metadata.TaggedHandler. | ||
func (h *ManifestIndexUpdateHandler) OnTagged(_ ocispec.Descriptor, tag string) error { | ||
return h.printer.Println("Tagged", tag) | ||
} | ||
|
||
// OnCompleted implements metadata.ManifestIndexUpdateHandler. | ||
func (h *ManifestIndexUpdateHandler) OnCompleted(desc ocispec.Descriptor) error { | ||
return h.printer.Println("Digest:", desc.Digest) | ||
} |
This file was deleted.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we export
discardHandler
just likestatus.DiscardHandler
?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As
NewDiscardHandler
is a public method, its returned type should be exported. Exported alldiscard
handlers in content, metadata and status packages.