Skip to content

Commit 85a3ea1

Browse files
author
Bruce Hill
committed
Allow passing --branch and --target instead of providing them
interactively
1 parent fda3fa7 commit 85a3ea1

File tree

2 files changed

+89
-47
lines changed

2 files changed

+89
-47
lines changed

pkg/cmd/dev.go

Lines changed: 80 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,16 @@ var devCommand = cli.Command{
264264
Aliases: []string{"config"},
265265
Usage: "Path to Stainless config file",
266266
},
267+
&cli.StringFlag{
268+
Name: "branch",
269+
Aliases: []string{"b"},
270+
Usage: "Which branch to use",
271+
},
272+
&cli.StringSliceFlag{
273+
Name: "target",
274+
Aliases: []string{"t"},
275+
Usage: "The target build language(s)",
276+
},
267277
&cli.BoolFlag{
268278
Name: "watch",
269279
Aliases: []string{"w"},
@@ -288,7 +298,68 @@ func runPreview(ctx context.Context, cmd *cli.Command) error {
288298
}
289299

290300
var selectedBranch string
301+
if cmd.IsSet("branch") {
302+
selectedBranch = cmd.String("branch")
303+
} else {
304+
selectedBranch, err = chooseBranch(gitUser)
305+
if err != nil {
306+
return err
307+
}
308+
}
309+
Property("branch", selectedBranch)
291310

311+
// Phase 2: Language selection
312+
var selectedTargets []string
313+
targetInfos := getAvailableTargetInfo(ctx, cc.client, cmd.String("project"), cc.workspaceConfig)
314+
if cmd.IsSet("target") {
315+
selectedTargets = cmd.StringSlice("target")
316+
for _, target := range selectedTargets {
317+
if !isValidTarget(targetInfos, target) {
318+
return fmt.Errorf("invalid language target: %s", target)
319+
}
320+
}
321+
} else {
322+
selectedTargets, err = chooseSelectedTargets(targetInfos)
323+
}
324+
325+
if len(selectedTargets) == 0 {
326+
return fmt.Errorf("no languages selected")
327+
}
328+
329+
Property("targets", strings.Join(selectedTargets, ", "))
330+
331+
// Convert string targets to stainless.Target
332+
targets := make([]stainless.Target, len(selectedTargets))
333+
for i, target := range selectedTargets {
334+
targets[i] = stainless.Target(target)
335+
}
336+
337+
// Phase 3: Start build and monitor progress in a loop
338+
for {
339+
// Make the user get past linter errors
340+
if err := runLinter(ctx, cmd, true); err != nil {
341+
if errors.Is(err, ErrUserCancelled) {
342+
return nil
343+
}
344+
return err
345+
}
346+
347+
// Start the build process
348+
if err := runDevBuild(ctx, cc, cmd, selectedBranch, targets); err != nil {
349+
if errors.Is(err, ErrUserCancelled) {
350+
return nil
351+
}
352+
return err
353+
}
354+
355+
if !cmd.Bool("watch") {
356+
break
357+
}
358+
}
359+
return nil
360+
}
361+
362+
func chooseBranch(gitUser string) (string, error) {
292363
now := time.Now()
293364
randomBytes := make([]byte, 3)
294365
rand.Read(randomBytes)
@@ -306,6 +377,7 @@ func runPreview(ctx context.Context, cmd *cli.Command) error {
306377
huh.NewOption(fmt.Sprintf("%s/<random>", gitUser), randomBranch),
307378
)
308379

380+
var selectedBranch string
309381
branchForm := huh.NewForm(
310382
huh.NewGroup(
311383
huh.NewSelect[string]().
@@ -317,20 +389,16 @@ func runPreview(ctx context.Context, cmd *cli.Command) error {
317389
).WithTheme(GetFormTheme(0))
318390

319391
if err := branchForm.Run(); err != nil {
320-
return fmt.Errorf("branch selection failed: %v", err)
392+
return selectedBranch, fmt.Errorf("branch selection failed: %v", err)
321393
}
322394

323-
Property("branch", selectedBranch)
324-
325-
// Phase 2: Language selection
326-
var selectedTargets []string
327-
328-
// Use cached workspace config for intelligent defaults
329-
config := cc.workspaceConfig
395+
return selectedBranch, nil
396+
}
330397

331-
targetInfo := getAvailableTargetInfo(ctx, cc.client, cmd.String("project"), config)
332-
targetOptions := targetInfoToOptions(targetInfo)
398+
func chooseSelectedTargets(targetInfos []TargetInfo) ([]string, error) {
399+
targetOptions := targetInfoToOptions(targetInfos)
333400

401+
var selectedTargets []string
334402
targetForm := huh.NewForm(
335403
huh.NewGroup(
336404
huh.NewMultiSelect[string]().
@@ -342,44 +410,9 @@ func runPreview(ctx context.Context, cmd *cli.Command) error {
342410
).WithTheme(GetFormTheme(0))
343411

344412
if err := targetForm.Run(); err != nil {
345-
return fmt.Errorf("target selection failed: %v", err)
346-
}
347-
348-
if len(selectedTargets) == 0 {
349-
return fmt.Errorf("no languages selected")
350-
}
351-
352-
Property("targets", strings.Join(selectedTargets, ", "))
353-
354-
// Convert string targets to stainless.Target
355-
targets := make([]stainless.Target, len(selectedTargets))
356-
for i, target := range selectedTargets {
357-
targets[i] = stainless.Target(target)
413+
return nil, fmt.Errorf("target selection failed: %v", err)
358414
}
359-
360-
// Phase 3: Start build and monitor progress in a loop
361-
for {
362-
// Make the user get past linter errors
363-
if err := runLinter(ctx, cmd, true); err != nil {
364-
if errors.Is(err, ErrUserCancelled) {
365-
return nil
366-
}
367-
return err
368-
}
369-
370-
// Start the build process
371-
if err := runDevBuild(ctx, cc, cmd, selectedBranch, targets); err != nil {
372-
if errors.Is(err, ErrUserCancelled) {
373-
return nil
374-
}
375-
return err
376-
}
377-
378-
if !cmd.Bool("watch") {
379-
break
380-
}
381-
}
382-
return nil
415+
return selectedTargets, nil
383416
}
384417

385418
func runDevBuild(ctx context.Context, cc *apiCommandContext, cmd *cli.Command, branch string, languages []stainless.Target) error {

pkg/cmd/init.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,15 @@ func getAllTargetInfo() []TargetInfo {
523523
}
524524
}
525525

526+
func isValidTarget(targetInfos []TargetInfo, name string) bool {
527+
for _, info := range targetInfos {
528+
if info.Name == name {
529+
return true
530+
}
531+
}
532+
return false
533+
}
534+
526535
// targetInfoToOptions converts TargetInfo slice to huh.Options
527536
func targetInfoToOptions(targets []TargetInfo) []huh.Option[string] {
528537
options := make([]huh.Option[string], len(targets))

0 commit comments

Comments
 (0)