@@ -254,43 +254,16 @@ func promoteRun(cmd *cobra.Command, f factory.Factory, flags *PromoteFlags) erro
254254 }
255255 }
256256 } else {
257- projectResource , err := proj .GetByName (octopus , f .GetCurrentSpace ().Resource .ID , options .ProjectName )
257+ release , err := getPromotionReleaseVersion (octopus ,
258+ f .GetCurrentSpace (),
259+ options .ProjectName ,
260+ options .SourceEnvironment ,
261+ options .LatestSuccessful )
258262 if err != nil {
259263 return err
260264 }
261- environmentResource , err := env .Get (octopus , f .GetCurrentSpace ().Resource .ID , env.EnvironmentsQuery {
262- Name : options .SourceEnvironment ,
263- })
264- if err != nil {
265- return err
266- }
267- dashboardItem , err := dashboard .GetDynamicDashboardItem (octopus , f .GetCurrentSpace ().Resource .ID , dashboard.DashboardDynamicQuery {
268- Environments : []string {environmentResource .Items [0 ].ID },
269- Projects : []string {projectResource .ID },
270- IncludePrevious : options .LatestSuccessful ,
271- })
272- if err != nil {
273- return err
274- }
275- sort .Slice (dashboardItem .Items , func (i , j int ) bool {
276- return dashboardItem .Items [i ].ReleaseVersion < dashboardItem .Items [j ].ReleaseVersion
277- })
278- var version string
279- if options .LatestSuccessful {
280- for _ , item := range dashboardItem .Items {
281- if item .State == "Success" {
282- version = item .ReleaseVersion
283- break
284- }
285- }
286- } else {
287- version = dashboardItem .Items [0 ].ReleaseVersion
288- }
289- releaseResource , err := releases .GetReleaseInProject (octopus , f .GetCurrentSpace ().Resource .ID , projectResource .ID , version )
290- if err != nil {
291- return err
292- }
293- options .ReleaseVersion = releaseResource .Version
265+ options .ReleaseVersion = release .Version
266+ options .ReleaseID = release .ID
294267 }
295268
296269 // the executor will raise errors if any required options are missing
@@ -399,30 +372,22 @@ func AskQuestions(octopus *octopusApiClient.Client, stdout io.Writer, asker ques
399372 // Find release from source environment
400373 var selectedRelease * releases.Release
401374 var selectedChannel * channels.Channel
402- if options .ReleaseVersion == "" {
403- // Find release from source environment using dashboard API
404- selectedRelease , err = findReleaseFromSourceEnvironment (octopus , space , selectedProject , options .SourceEnvironment , options .LatestSuccessful )
405- if err != nil {
406- return err
407- }
408- selectedChannel , err = channels .GetByID (octopus , space .ID , selectedRelease .ChannelID )
409- if err != nil {
410- return err
411- }
412- _ , _ = fmt .Fprintf (stdout , "Release %s\n " , output .Cyan (selectedRelease .Version ))
413- } else {
414- selectedRelease , err = releases .GetReleaseInProject (octopus , space .ID , selectedProject .ID , options .ReleaseVersion )
415- if err != nil {
416- return err
417- }
418- selectedChannel , err = channels .GetByID (octopus , space .ID , selectedRelease .ChannelID )
419- if err != nil {
420- return err
421- }
422- _ , _ = fmt .Fprintf (stdout , "Release %s\n " , output .Cyan (selectedRelease .Version ))
375+
376+ release , err := getPromotionReleaseVersion (octopus , space , selectedProject .Name , options .SourceEnvironment , options .LatestSuccessful )
377+ if err != nil {
378+ return err
423379 }
424- options .ReleaseVersion = selectedRelease .Version
425- options .ReleaseID = selectedRelease .ID
380+ if err != nil {
381+ return err
382+ }
383+ _ , _ = fmt .Fprintf (stdout , "Release %s\n " , output .Cyan (release .Version ))
384+ selectedRelease = release
385+ selectedChannel , err = channels .GetByID (octopus , space .ID , selectedRelease .ChannelID )
386+ if err != nil {
387+ return err
388+ }
389+ options .ReleaseVersion = release .Version
390+ options .ReleaseID = release .ID
426391
427392 indicateMissingPackagesForReleaseFeatureToggleValue , err := featuretoggle .IsToggleEnabled (octopus , "indicate-missing-packages-for-release" )
428393 if indicateMissingPackagesForReleaseFeatureToggleValue {
@@ -1124,3 +1089,48 @@ func determineIsTenanted(project *projects.Project, ask question.Asker) (bool, e
11241089 return false , fmt .Errorf ("unhandled tenanted deployment mode %s" , project .TenantedDeploymentMode )
11251090 }
11261091}
1092+
1093+ func getPromotionReleaseVersion (octopus * octopusApiClient.Client ,
1094+ space * spaces.Space ,
1095+ projectName string ,
1096+ sourceEnvironmentName string ,
1097+ latestSuccessful bool ) (* releases.Release , error ) {
1098+
1099+ projectResource , err := proj .GetByName (octopus , space .Resource .ID , projectName )
1100+ if err != nil {
1101+ return nil , err
1102+ }
1103+ environmentResource , err := env .Get (octopus , space .Resource .ID , env.EnvironmentsQuery {
1104+ Name : sourceEnvironmentName ,
1105+ })
1106+ if err != nil {
1107+ return nil , err
1108+ }
1109+ dashboardItem , err := dashboard .GetDynamicDashboardItem (octopus , space .Resource .ID , dashboard.DashboardDynamicQuery {
1110+ Environments : []string {environmentResource .Items [0 ].ID },
1111+ Projects : []string {projectResource .ID },
1112+ IncludePrevious : latestSuccessful ,
1113+ })
1114+ if err != nil {
1115+ return nil , err
1116+ }
1117+ sort .Slice (dashboardItem .Items , func (i , j int ) bool {
1118+ return dashboardItem .Items [i ].ReleaseVersion < dashboardItem .Items [j ].ReleaseVersion
1119+ })
1120+ var version string
1121+ if latestSuccessful {
1122+ for _ , item := range dashboardItem .Items {
1123+ if item .State == "Success" {
1124+ version = item .ReleaseVersion
1125+ break
1126+ }
1127+ }
1128+ } else {
1129+ version = dashboardItem .Items [0 ].ReleaseVersion
1130+ }
1131+ releaseResource , err := releases .GetReleaseInProject (octopus , space .Resource .ID , projectResource .ID , version )
1132+ if err != nil {
1133+ return nil , err
1134+ }
1135+ return releaseResource , nil
1136+ }
0 commit comments