diff --git a/cmd/dagger/cmd/up.go b/cmd/dagger/cmd/up.go index 3e6960cd..12ccf559 100644 --- a/cmd/dagger/cmd/up.go +++ b/cmd/dagger/cmd/up.go @@ -25,7 +25,7 @@ import ( var upCmd = &cobra.Command{ Use: "up", Short: "Bring an environment online with latest plan and inputs", - Args: cobra.NoArgs, + Args: cobra.MaximumNArgs(1), PreRun: func(cmd *cobra.Command, args []string) { // Fix Viper bug for duplicate flags: // https://github.com/spf13/viper/issues/233 @@ -52,6 +52,20 @@ var upCmd = &cobra.Command{ } ctx := lg.WithContext(cmd.Context()) + cl := common.NewClient(ctx) + + if viper.GetBool("europa") { + err = europaUp(ctx, cl, args...) + + // TODO: rework telemetry + // <-doneCh + + if err != nil { + lg.Fatal().Err(err).Msg("failed to up environment") + } + + return + } project := common.CurrentProject(ctx) st := common.CurrentEnvironmentState(ctx, project) @@ -62,20 +76,6 @@ var upCmd = &cobra.Command{ doneCh := common.TrackProjectCommand(ctx, cmd, project, st) - cl := common.NewClient(ctx) - - if viper.GetBool("europa") { - err = europaUp(ctx, cl, project.Path) - - <-doneCh - - if err != nil { - lg.Fatal().Err(err).Msg("failed to up environment") - } - - return - } - env, err := environment.New(st) if err != nil { lg.Fatal().Err(err).Msg("unable to create environment") @@ -112,10 +112,10 @@ var upCmd = &cobra.Command{ }, } -func europaUp(ctx context.Context, cl *client.Client, path string) error { +func europaUp(ctx context.Context, cl *client.Client, args ...string) error { lg := log.Ctx(ctx) - p, err := plan.Load(ctx, path, "") + p, err := plan.Load(ctx, args...) if err != nil { lg.Fatal().Err(err).Msg("failed to load plan") } diff --git a/plan/plan.go b/plan/plan.go index d6802fbb..b5c295a5 100644 --- a/plan/plan.go +++ b/plan/plan.go @@ -23,13 +23,14 @@ type Plan struct { source *compiler.Value } -func Load(ctx context.Context, path, pkg string) (*Plan, error) { +func Load(ctx context.Context, args ...string) (*Plan, error) { // FIXME: universe vendoring - if err := state.VendorUniverse(ctx, path); err != nil { + + if err := state.VendorUniverse(ctx, ""); err != nil { return nil, err } - v, err := compiler.Build(path, nil, pkg) + v, err := compiler.Build("", nil, args...) if err != nil { return nil, err } diff --git a/state/project.go b/state/project.go index ec180a8f..c85a50d3 100644 --- a/state/project.go +++ b/state/project.go @@ -391,6 +391,10 @@ func cueModInit(ctx context.Context, parentDir string) error { } func VendorUniverse(ctx context.Context, p string) error { + if p == "" { + p = getCueModParent() + } + // ensure cue module is initialized if err := cueModInit(ctx, p); err != nil { return err @@ -414,3 +418,25 @@ func VendorUniverse(ctx context.Context, p string) error { return nil } + +func getCueModParent() string { + cwd, _ := os.Getwd() + parentDir := cwd + + // traverse the directory tree up through ancestors looking for a cue.mod folder + for { + if _, err := os.Stat(path.Join(parentDir, "cue.mod")); !errors.Is(err, os.ErrNotExist) { + break // found it! + } + + parentDir = filepath.Dir(parentDir) + + if parentDir == string(os.PathSeparator) { + // reached the root + parentDir = cwd // reset to working directory + break + } + } + + return parentDir +} diff --git a/tests/plan.bats b/tests/plan.bats new file mode 100644 index 00000000..56c037b9 --- /dev/null +++ b/tests/plan.bats @@ -0,0 +1,10 @@ +setup() { + load 'helpers' + + common_setup +} + +@test "plan: hello" { + run dagger --europa up ./plan/hello-europa + assert_success +} \ No newline at end of file diff --git a/tests/plan/hello-europa/main.cue b/tests/plan/hello-europa/main.cue new file mode 100644 index 00000000..466f34f9 --- /dev/null +++ b/tests/plan/hello-europa/main.cue @@ -0,0 +1,16 @@ +package main + +import ( + "alpha.dagger.io/dagger/engine" + "alpha.dagger.io/os" +) + +engine.#Plan & { + actions: { + sayHello: os.#Container & { + command: "echo Hello Europa! > /out.txt" + } + + verify: "Hello Europa!\n" & (os.#File & {from: sayHello, path: "/out.txt"}).contents + } +}