Skip to content

Commit 1226d8f

Browse files
committed
align
1 parent ba014ae commit 1226d8f

File tree

4 files changed

+93
-121
lines changed

4 files changed

+93
-121
lines changed

apptrust/commands/flags.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ const (
5353
BuildsFlag = "builds"
5454
ReleaseBundlesFlag = "release-bundles"
5555
SourceVersionFlag = "source-version"
56-
ExcludeFlag = "exclude"
57-
PromoteFlag = "promote"
5856
)
5957

6058
// Flag keys mapped to their corresponding components.Flag definition.
@@ -92,8 +90,6 @@ var flagsMap = map[string]components.Flag{
9290
BuildsFlag: components.NewStringFlag(BuildsFlag, "List of builds in format 'name1:number1[:timestamp1];name2:number2[:timestamp2]'", func(f *components.StringFlag) { f.Mandatory = false }),
9391
ReleaseBundlesFlag: components.NewStringFlag(ReleaseBundlesFlag, "List of release bundles in format 'name1:version1;name2:version2'", func(f *components.StringFlag) { f.Mandatory = false }),
9492
SourceVersionFlag: components.NewStringFlag(SourceVersionFlag, "Source versions in format 'app1:version1;app2:version2'", func(f *components.StringFlag) { f.Mandatory = false }),
95-
ExcludeFlag: components.NewStringFlag(ExcludeFlag, "Excluded packages in format 'package1:version1;package2:version2'", func(f *components.StringFlag) { f.Mandatory = false }),
96-
PromoteFlag: components.NewStringFlag(PromoteFlag, "Promotion stage for immediate promotion after creation", func(f *components.StringFlag) { f.Mandatory = false }),
9793
}
9894

9995
var commandFlags = map[string][]string{
@@ -111,9 +107,8 @@ var commandFlags = map[string][]string{
111107
BuildsFlag,
112108
ReleaseBundlesFlag,
113109
SourceVersionFlag,
114-
ExcludeFlag,
115-
PromoteFlag,
116110
SpecFlag,
111+
SpecVarsFlag,
117112
},
118113
VersionPromote: {
119114
url,

apptrust/commands/version/create_app_version_cmd.go

Lines changed: 85 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ type createVersionSpec struct {
3333
Builds []model.CreateVersionBuild `json:"builds,omitempty"`
3434
ReleaseBundles []model.CreateVersionReleaseBundle `json:"release_bundles,omitempty"`
3535
Versions []model.CreateVersionReference `json:"versions,omitempty"`
36-
Exclude []model.ExcludePackage `json:"exclude,omitempty"`
3736
}
3837

3938
func (cv *createAppVersionCommand) Run() error {
@@ -70,67 +69,71 @@ func (cv *createAppVersionCommand) prepareAndRunCommand(ctx *components.Context)
7069
}
7170

7271
func (cv *createAppVersionCommand) buildRequestPayload(ctx *components.Context) (*model.CreateAppVersionRequest, error) {
73-
sources := &model.CreateVersionSources{}
74-
var err error
72+
var (
73+
sources *model.CreateVersionSources
74+
err error
75+
)
76+
77+
if err = validateNoSpecAndFlagsTogether(ctx); err != nil {
78+
return nil, err
79+
}
80+
7581
if ctx.IsFlagSet(commands.SpecFlag) {
76-
sources, err = cv.loadFromSpec(ctx)
77-
if errorutils.CheckError(err) != nil {
78-
return nil, err
79-
}
82+
sources, err = cv.buildSourcesFromSpec(ctx)
8083
} else {
81-
if ctx.IsFlagSet(commands.PackageNameFlag) {
82-
sources.Packages = append(sources.Packages, model.CreateVersionPackage{
83-
Type: ctx.GetStringFlagValue(commands.PackageTypeFlag),
84-
Name: ctx.GetStringFlagValue(commands.PackageNameFlag),
85-
Version: ctx.GetStringFlagValue(commands.PackageVersionFlag),
86-
Repository: ctx.GetStringFlagValue(commands.PackageRepositoryFlag),
87-
})
88-
}
89-
if buildsStr := ctx.GetStringFlagValue(commands.BuildsFlag); buildsStr != "" {
90-
builds, err := cv.parseBuilds(buildsStr)
91-
if err != nil {
92-
return nil, err
93-
}
94-
sources.Builds = builds
95-
}
96-
if rbStr := ctx.GetStringFlagValue(commands.ReleaseBundlesFlag); rbStr != "" {
97-
releaseBundles, err := cv.parseReleaseBundles(rbStr)
98-
if err != nil {
99-
return nil, err
100-
}
101-
sources.ReleaseBundles = releaseBundles
102-
}
103-
if srcVersionsStr := ctx.GetStringFlagValue(commands.SourceVersionFlag); srcVersionsStr != "" {
104-
sourceVersions, err := cv.parseSourceVersions(srcVersionsStr)
105-
if err != nil {
106-
return nil, err
107-
}
108-
sources.Versions = sourceVersions
109-
}
110-
if excludeStr := ctx.GetStringFlagValue(commands.ExcludeFlag); excludeStr != "" {
111-
excludedPackages, err := cv.parseExcludedPackages(excludeStr)
112-
if err != nil {
113-
return nil, err
114-
}
115-
sources.Exclude = excludedPackages
116-
}
84+
sources, err = cv.buildSourcesFromFlags(ctx)
11785
}
11886

119-
// Only include sources in the request if any sources were provided
120-
var sourcesPointer *model.CreateVersionSources
121-
if len(sources.Packages) > 0 || len(sources.Builds) > 0 ||
122-
len(sources.ReleaseBundles) > 0 || len(sources.Versions) > 0 || len(sources.Exclude) > 0 {
123-
sourcesPointer = sources
87+
if err != nil {
88+
return nil, err
12489
}
12590

12691
return &model.CreateAppVersionRequest{
12792
ApplicationKey: ctx.GetStringFlagValue(commands.ApplicationKeyFlag),
12893
Version: ctx.Arguments[1],
129-
Sources: sourcesPointer,
94+
Sources: appendSourceIfExists(sources),
13095
Tag: ctx.GetStringFlagValue(commands.TagFlag),
13196
}, nil
13297
}
13398

99+
func (cv *createAppVersionCommand) buildSourcesFromSpec(ctx *components.Context) (*model.CreateVersionSources, error) {
100+
return cv.loadFromSpec(ctx)
101+
}
102+
103+
func (cv *createAppVersionCommand) buildSourcesFromFlags(ctx *components.Context) (*model.CreateVersionSources, error) {
104+
sources := &model.CreateVersionSources{}
105+
if ctx.IsFlagSet(commands.PackageNameFlag) {
106+
sources.Packages = append(sources.Packages, model.CreateVersionPackage{
107+
Type: ctx.GetStringFlagValue(commands.PackageTypeFlag),
108+
Name: ctx.GetStringFlagValue(commands.PackageNameFlag),
109+
Version: ctx.GetStringFlagValue(commands.PackageVersionFlag),
110+
Repository: ctx.GetStringFlagValue(commands.PackageRepositoryFlag),
111+
})
112+
}
113+
if buildsStr := ctx.GetStringFlagValue(commands.BuildsFlag); buildsStr != "" {
114+
builds, err := cv.parseBuilds(buildsStr)
115+
if err != nil {
116+
return nil, err
117+
}
118+
sources.Builds = builds
119+
}
120+
if rbStr := ctx.GetStringFlagValue(commands.ReleaseBundlesFlag); rbStr != "" {
121+
releaseBundles, err := cv.parseReleaseBundles(rbStr)
122+
if err != nil {
123+
return nil, err
124+
}
125+
sources.ReleaseBundles = releaseBundles
126+
}
127+
if srcVersionsStr := ctx.GetStringFlagValue(commands.SourceVersionFlag); srcVersionsStr != "" {
128+
sourceVersions, err := cv.parseSourceVersions(srcVersionsStr)
129+
if err != nil {
130+
return nil, err
131+
}
132+
sources.Versions = sourceVersions
133+
}
134+
return sources, nil
135+
}
136+
134137
func (cv *createAppVersionCommand) loadFromSpec(ctx *components.Context) (*model.CreateVersionSources, error) {
135138
specFilePath := ctx.GetStringFlagValue(commands.SpecFlag)
136139
spec := new(createVersionSpec)
@@ -154,7 +157,6 @@ func (cv *createAppVersionCommand) loadFromSpec(ctx *components.Context) (*model
154157
Builds: spec.Builds,
155158
ReleaseBundles: spec.ReleaseBundles,
156159
Versions: spec.Versions,
157-
Exclude: spec.Exclude,
158160
}
159161

160162
return sources, nil
@@ -237,28 +239,6 @@ func (cv *createAppVersionCommand) parseSourceVersions(sourceVersionsStr string)
237239
return sourceVersions, nil
238240
}
239241

240-
// Helper method to parse excluded packages string format: "name1:version1;name2:version2"
241-
func (cv *createAppVersionCommand) parseExcludedPackages(excludeStr string) ([]model.ExcludePackage, error) {
242-
var excludedPackages []model.ExcludePackage
243-
packageEntries := strings.Split(excludeStr, ";")
244-
245-
for _, entry := range packageEntries {
246-
parts := strings.Split(entry, ":")
247-
if len(parts) != 2 {
248-
return nil, errorutils.CheckErrorf("invalid exclude package format: '%s'. Expected format: name:version", entry)
249-
}
250-
251-
pkg := model.ExcludePackage{
252-
Name: parts[0],
253-
Version: parts[1],
254-
}
255-
256-
excludedPackages = append(excludedPackages, pkg)
257-
}
258-
259-
return excludedPackages, nil
260-
}
261-
262242
// Updated validation logic to support multiple source types
263243
func validateCreateAppVersionContext(ctx *components.Context) error {
264244
if len(ctx.Arguments) != 2 {
@@ -290,18 +270,18 @@ func GetCreateAppVersionCommand(appContext app.Context) components.Command {
290270
cmd := &createAppVersionCommand{versionService: appContext.GetVersionService()}
291271
return components.Command{
292272
Name: commands.VersionCreate,
293-
Description: "Create application version.",
273+
Description: "Creates a new version of the specified application with the given version number, tag, and associated packages, builds, release bundles, or source versions.",
294274
Category: common.CategoryVersion,
295275
Aliases: []string{"vc"},
296276
Arguments: []components.Argument{
297277
{
298-
Name: "application-key",
299-
Description: "The application key.",
278+
Name: "app-key",
279+
Description: "The application key of the application for which the version is being created.",
300280
Optional: false,
301281
},
302282
{
303283
Name: "version",
304-
Description: "The version to create (must follow SemVer format).",
284+
Description: "The version number (in SemVer format) for the new application version.",
305285
Optional: false,
306286
},
307287
},
@@ -314,3 +294,32 @@ func handleMissingPackageDetailsError() error {
314294
return errorutils.CheckErrorf("Missing packages information. Please provide the following flags --%s or the set of: --%s, --%s, --%s, --%s",
315295
commands.SpecFlag, commands.PackageTypeFlag, commands.PackageNameFlag, commands.PackageVersionFlag, commands.PackageRepositoryFlag)
316296
}
297+
298+
// Helper to return a pointer only if the object has any sources, otherwise returns nil
299+
func appendSourceIfExists(s *model.CreateVersionSources) *model.CreateVersionSources {
300+
if s == nil {
301+
return nil
302+
}
303+
if len(s.Packages) > 0 || len(s.Builds) > 0 || len(s.ReleaseBundles) > 0 || len(s.Versions) > 0 {
304+
return s
305+
}
306+
return nil
307+
}
308+
309+
// Returns error if both --spec and any other source flag are set
310+
func validateNoSpecAndFlagsTogether(ctx *components.Context) error {
311+
if ctx.IsFlagSet(commands.SpecFlag) {
312+
otherSourceFlags := []string{
313+
commands.PackageNameFlag,
314+
commands.BuildsFlag,
315+
commands.ReleaseBundlesFlag,
316+
commands.SourceVersionFlag,
317+
}
318+
for _, flag := range otherSourceFlags {
319+
if ctx.IsFlagSet(flag) {
320+
return errorutils.CheckErrorf("--spec provided: all other source flags (e.g., --%s) are not allowed.", flag)
321+
}
322+
}
323+
}
324+
return nil
325+
}

apptrust/commands/version/create_app_version_cmd_test.go

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -219,29 +219,6 @@ func TestParseSourceVersions(t *testing.T) {
219219
assert.Contains(t, err.Error(), "invalid source version format")
220220
}
221221

222-
func TestParseExcludedPackages(t *testing.T) {
223-
cmd := &createAppVersionCommand{}
224-
225-
// Test basic excluded packages parsing
226-
excludes, err := cmd.parseExcludedPackages("pkg1:1.0.0;pkg2:2.0.0")
227-
assert.NoError(t, err)
228-
assert.Equal(t, 2, len(excludes))
229-
assert.Equal(t, "pkg1", excludes[0].Name)
230-
assert.Equal(t, "1.0.0", excludes[0].Version)
231-
assert.Equal(t, "pkg2", excludes[1].Name)
232-
assert.Equal(t, "2.0.0", excludes[1].Version)
233-
234-
// Test invalid format
235-
_, err = cmd.parseExcludedPackages("pkg1")
236-
assert.Error(t, err)
237-
assert.Contains(t, err.Error(), "invalid exclude package format")
238-
239-
// Test invalid format with too many parts
240-
_, err = cmd.parseExcludedPackages("pkg1:1.0.0:extra")
241-
assert.Error(t, err)
242-
assert.Contains(t, err.Error(), "invalid exclude package format")
243-
}
244-
245222
func TestCreateVersionSpec(t *testing.T) {
246223
// Test that the struct can be properly unmarshalled
247224
specData := `{
@@ -267,7 +244,4 @@ func TestCreateVersionSpec(t *testing.T) {
267244

268245
assert.Len(t, spec.Versions, 1)
269246
assert.Equal(t, "app1", spec.Versions[0].ApplicationKey)
270-
271-
assert.Len(t, spec.Exclude, 1)
272-
assert.Equal(t, "excluded-pkg", spec.Exclude[0].Name)
273247
}

apptrust/model/create_app_version_request.go

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,20 @@ type CreateAppVersionRequest struct {
77
Tag string `json:"tag,omitempty"`
88
}
99

10-
type CreateVersionSources struct {
11-
Packages []CreateVersionPackage `json:"packages,omitempty"`
12-
Builds []CreateVersionBuild `json:"builds,omitempty"`
13-
ReleaseBundles []CreateVersionReleaseBundle `json:"release_bundles,omitempty"`
14-
Versions []CreateVersionReference `json:"versions,omitempty"`
15-
Exclude []ExcludePackage `json:"exclude,omitempty"`
16-
}
17-
1810
type CreateVersionPackage struct {
1911
Type string `json:"type"`
2012
Name string `json:"name"`
2113
Version string `json:"version"`
2214
Repository string `json:"repository"`
2315
}
2416

17+
type CreateVersionSources struct {
18+
Packages []CreateVersionPackage `json:"packages,omitempty"`
19+
Builds []CreateVersionBuild `json:"builds,omitempty"`
20+
ReleaseBundles []CreateVersionReleaseBundle `json:"release_bundles,omitempty"`
21+
Versions []CreateVersionReference `json:"versions,omitempty"`
22+
}
23+
2524
type CreateVersionArtifact struct {
2625
Path string `json:"path"`
2726
SHA256 string `json:"sha256,omitempty"`
@@ -46,8 +45,3 @@ type CreateVersionReference struct {
4645
ApplicationKey string `json:"application_key,omitempty"`
4746
Version string `json:"version"`
4847
}
49-
50-
type ExcludePackage struct {
51-
Name string `json:"name,omitempty"`
52-
Version string `json:"version,omitempty"`
53-
}

0 commit comments

Comments
 (0)