Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit dfb79ad

Browse files
Refactor push command to lower the cyclomatic complexity
Signed-off-by: Silvin Lubecki <[email protected]>
1 parent 4e4ff4b commit dfb79ad

File tree

2 files changed

+63
-26
lines changed

2 files changed

+63
-26
lines changed

internal/commands/push.go

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -72,36 +72,46 @@ func pushCmd(dockerCli command.Cli) *cobra.Command {
7272

7373
func runPush(dockerCli command.Cli, name string, opts pushOptions) error {
7474
defer muteDockerCli(dockerCli)()
75-
76-
bundleStore, err := prepareBundleStore()
75+
// Get the bundle
76+
bndl, ref, err := resolveReferenceAndBundle(dockerCli, name)
7777
if err != nil {
7878
return err
7979
}
80-
81-
bndl, ref, err := resolveBundle(dockerCli, bundleStore, name, false, nil)
80+
// Retag invocation image if needed
81+
retag, err := shouldRetagInvocationImage(metadata.FromBundle(bndl), bndl, opts.tag, ref)
8282
if err != nil {
8383
return err
8484
}
85-
// Use the bundle reference as a tag
86-
if ref != "" && opts.tag == "" {
87-
opts.tag = ref
85+
if retag.shouldRetag {
86+
if err := retagInvocationImage(dockerCli, bndl, retag.invocationImageRef.String()); err != nil {
87+
return err
88+
}
8889
}
89-
if err := bndl.Validate(); err != nil {
90+
// Push the invocation image
91+
if err := pushInvocationImage(dockerCli, retag); err != nil {
9092
return err
9193
}
94+
// Push the bundle
95+
return pushBundle(dockerCli, opts, bndl, retag)
96+
}
9297

93-
retag, err := shouldRetagInvocationImage(metadata.FromBundle(bndl), bndl, opts.tag)
98+
func resolveReferenceAndBundle(dockerCli command.Cli, name string) (*bundle.Bundle, string, error) {
99+
bundleStore, err := prepareBundleStore()
94100
if err != nil {
95-
return err
101+
return nil, "", err
96102
}
97-
if retag.shouldRetag {
98-
err := retagInvocationImage(dockerCli, bndl, retag.invocationImageRef.String())
99-
if err != nil {
100-
return err
101-
}
103+
104+
bndl, ref, err := resolveBundle(dockerCli, bundleStore, name, false, nil)
105+
if err != nil {
106+
return nil, "", err
107+
}
108+
if err := bndl.Validate(); err != nil {
109+
return nil, "", err
102110
}
111+
return bndl, ref, err
112+
}
103113

104-
// pushing invocation image
114+
func pushInvocationImage(dockerCli command.Cli, retag retagResult) error {
105115
repoInfo, err := registry.ParseRepositoryInfo(retag.invocationImageRef)
106116
if err != nil {
107117
return err
@@ -117,10 +127,13 @@ func runPush(dockerCli command.Cli, name string, opts pushOptions) error {
117127
return errors.Wrapf(err, "starting push of %q", retag.invocationImageRef.String())
118128
}
119129
defer reader.Close()
120-
if err = jsonmessage.DisplayJSONMessagesStream(reader, ioutil.Discard, 0, false, nil); err != nil {
130+
if err := jsonmessage.DisplayJSONMessagesStream(reader, ioutil.Discard, 0, false, nil); err != nil {
121131
return errors.Wrapf(err, "pushing to %q", retag.invocationImageRef.String())
122132
}
133+
return nil
134+
}
123135

136+
func pushBundle(dockerCli command.Cli, opts pushOptions, bndl *bundle.Bundle, retag retagResult) error {
124137
resolver := remotes.CreateResolver(dockerCli.ConfigFile(), opts.registry.insecureRegistries...)
125138
var display fixupDisplay = &plainDisplay{out: os.Stdout}
126139
if term.IsTerminal(os.Stdout.Fd()) {
@@ -133,9 +146,7 @@ func runPush(dockerCli command.Cli, name string, opts pushOptions) error {
133146
fixupOptions = append(fixupOptions, remotes.WithComponentImagePlatforms(platforms))
134147
}
135148
// bundle fixup
136-
err = remotes.FixupBundle(context.Background(), bndl, retag.cnabRef, resolver, fixupOptions...)
137-
138-
if err != nil {
149+
if err := remotes.FixupBundle(context.Background(), bndl, retag.cnabRef, resolver, fixupOptions...); err != nil {
139150
return errors.Wrapf(err, "fixing up %q for push", retag.cnabRef)
140151
}
141152
// push bundle manifest
@@ -185,7 +196,11 @@ type retagResult struct {
185196
invocationImageRef reference.Named
186197
}
187198

188-
func shouldRetagInvocationImage(meta metadata.AppMetadata, bndl *bundle.Bundle, tagOverride string) (retagResult, error) {
199+
func shouldRetagInvocationImage(meta metadata.AppMetadata, bndl *bundle.Bundle, tagOverride, bundleRef string) (retagResult, error) {
200+
// Use the bundle reference as a tag override
201+
if tagOverride == "" && bundleRef != "" {
202+
tagOverride = bundleRef
203+
}
189204
imgName := tagOverride
190205
var err error
191206
if imgName == "" {

internal/commands/push_test.go

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ type retagTestCase struct {
1515
metaVersion string
1616
invocationImageName string
1717
tag string
18+
bundleRef string
1819
expectedImageRef reference.Named
1920
expectedCnabRef reference.Named
2021
shouldRetag bool
@@ -40,7 +41,7 @@ func parseRefOrDie(t *testing.T, name string) reference.Named {
4041
func TestInvocationImageRetag(t *testing.T) {
4142
cases := []retagTestCase{
4243
{
43-
name: "no-tag-aligned-names",
44+
name: "no-tag-override-should-not-retag",
4445
metaName: "app",
4546
metaVersion: "0.1.0",
4647
invocationImageName: "app:0.1.0-invoc",
@@ -50,7 +51,7 @@ func TestInvocationImageRetag(t *testing.T) {
5051
shouldRetag: false,
5152
},
5253
{
53-
name: "tag-aligned-names-untagged-ref",
54+
name: "name-override-should-retag",
5455
metaName: "app",
5556
metaVersion: "0.1.0",
5657
invocationImageName: "app:0.1.0-invoc",
@@ -60,7 +61,7 @@ func TestInvocationImageRetag(t *testing.T) {
6061
shouldRetag: true,
6162
},
6263
{
63-
name: "tag-aligned-names-tagged-ref",
64+
name: "tag-override-should-retag",
6465
metaName: "app",
6566
metaVersion: "0.1.0",
6667
invocationImageName: "app:0.1.0-invoc",
@@ -69,6 +70,27 @@ func TestInvocationImageRetag(t *testing.T) {
6970
expectedCnabRef: parseRefOrDie(t, "some-app:test"),
7071
shouldRetag: true,
7172
},
73+
{
74+
name: "bundle-ref-should-retag",
75+
metaName: "app",
76+
metaVersion: "0.1.0",
77+
invocationImageName: "app:0.1.0-invoc",
78+
bundleRef: "some-app:test",
79+
expectedImageRef: parseRefOrDie(t, "some-app:test-invoc"),
80+
expectedCnabRef: parseRefOrDie(t, "some-app:test"),
81+
shouldRetag: true,
82+
},
83+
{
84+
name: "tag-overrides-bundle-ref",
85+
metaName: "app",
86+
metaVersion: "0.1.0",
87+
invocationImageName: "app:0.1.0-invoc",
88+
tag: "some-app:test",
89+
bundleRef: "other-app:other-test",
90+
expectedImageRef: parseRefOrDie(t, "some-app:test-invoc"),
91+
expectedCnabRef: parseRefOrDie(t, "some-app:test"),
92+
shouldRetag: true,
93+
},
7294
{
7395
name: "parsing-error",
7496
metaName: "app",
@@ -78,7 +100,7 @@ func TestInvocationImageRetag(t *testing.T) {
78100
errorMessage: "some-App:test: invalid reference format: repository name must be lowercase",
79101
},
80102
{
81-
name: "no-digest",
103+
name: "error-no-digest",
82104
metaName: "app",
83105
metaVersion: "0.1.0",
84106
invocationImageName: "app:0.1.0-invoc",
@@ -90,7 +112,7 @@ func TestInvocationImageRetag(t *testing.T) {
90112
for _, c := range cases {
91113
t.Run(c.name, func(t *testing.T) {
92114
p, b := c.buildPackageMetaAndBundle()
93-
retag, err := shouldRetagInvocationImage(p, b, c.tag)
115+
retag, err := shouldRetagInvocationImage(p, b, c.tag, c.bundleRef)
94116
if c.errorMessage == "" {
95117
assert.NilError(t, err)
96118
assert.Equal(t, retag.shouldRetag, c.shouldRetag)

0 commit comments

Comments
 (0)