Merge pull request #1763 from jlongtine/migrate-message

Create a nice error message for 0.1 plans loaded in 0.2
This commit is contained in:
Andrea Luzzardi 2022-03-10 15:34:36 -08:00 committed by GitHub
commit 3e702626a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 98 additions and 36 deletions

View File

@ -22,7 +22,6 @@ import (
var doCmd = &cobra.Command{ var doCmd = &cobra.Command{
Use: "do [OPTIONS] ACTION [SUBACTION...]", Use: "do [OPTIONS] ACTION [SUBACTION...]",
Short: "Execute a dagger action.", Short: "Execute a dagger action.",
// Args: cobra.MinimumNArgs(1),
PreRun: func(cmd *cobra.Command, args []string) { PreRun: func(cmd *cobra.Command, args []string) {
// Fix Viper bug for duplicate flags: // Fix Viper bug for duplicate flags:
// https://github.com/spf13/viper/issues/233 // https://github.com/spf13/viper/issues/233
@ -32,7 +31,7 @@ var doCmd = &cobra.Command{
}, },
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
if len(args) < 1 { if len(args) < 1 {
doHelp(cmd, nil) doHelpCmd(cmd, nil)
return return
} }
@ -108,46 +107,32 @@ func getTargetPath(args []string) cue.Path {
return cue.MakePath(selectors...) return cue.MakePath(selectors...)
} }
func doHelp(cmd *cobra.Command, _ []string) { func doHelpCmd(cmd *cobra.Command, _ []string) {
w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', tabwriter.StripEscape) lg := logger.New()
defer w.Flush()
planPath := viper.GetString("plan") fmt.Printf("%s\n\n%s", cmd.Short, cmd.UsageString())
var (
errorMsg string
loadedMsg string
actionLookupPathMsg string
action *plan.Action
actions []*plan.Action
)
p, err := loadPlan() p, err := loadPlan()
if err != nil { if err != nil {
errorMsg = "Error: failed to load plan\n\n" lg.Fatal().Err(err).Msg("failed to load plan")
} else { }
loadedMsg = "Plan loaded from " + planPath
actionLookupPath := getTargetPath(cmd.Flags().Args()) target := getTargetPath(cmd.Flags().Args())
action = p.Action().FindByPath(actionLookupPath) action := p.Action().FindByPath(target)
if action == nil { if action == nil {
errorMsg = "Error: action not found\n\n" lg.Fatal().Msg(fmt.Sprintf("action %s not found", target.String()))
} else { return
actions = action.Children
actionLookupPathMsg = fmt.Sprintf(`%s:`, actionLookupPath.String())
} }
if len(action.Name) < 1 {
return
} }
fmt.Printf(`%s%s
%s fmt.Println("")
w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', tabwriter.StripEscape)
defer w.Flush()
%s for _, a := range action.Children {
%s
`, errorMsg, cmd.Short, cmd.UsageString(), loadedMsg, actionLookupPathMsg)
// fmt.Fprintln(w, "Actions\tDescription\tPackage")
// fmt.Fprintln(w, "\t\t")
for _, a := range actions {
if !a.Hidden { if !a.Hidden {
lineParts := []string{"", a.Name, strings.TrimSpace(a.Comment)} lineParts := []string{"", a.Name, strings.TrimSpace(a.Comment)}
fmt.Fprintln(w, strings.Join(lineParts, "\t")) fmt.Fprintln(w, strings.Join(lineParts, "\t"))
@ -164,7 +149,7 @@ func init() {
doCmd.Flags().StringArray("cache-from", []string{}, doCmd.Flags().StringArray("cache-from", []string{},
"External cache sources (eg. user/app:cache, type=local,src=path/to/dir)") "External cache sources (eg. user/app:cache, type=local,src=path/to/dir)")
doCmd.SetHelpFunc(doHelp) doCmd.SetHelpFunc(doHelpCmd)
if err := viper.BindPFlags(doCmd.Flags()); err != nil { if err := viper.BindPFlags(doCmd.Flags()); err != nil {
panic(err) panic(err)

View File

@ -2,7 +2,9 @@ package plan
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"strings"
"cuelang.org/go/cue" "cuelang.org/go/cue"
cueflow "cuelang.org/go/tools/flow" cueflow "cuelang.org/go/tools/flow"
@ -16,6 +18,7 @@ import (
) )
var ( var (
ErrIncompatiblePlan = errors.New("attempting to load a dagger 0.1.0 project.\nPlease upgrade your config to be compatible with this version of dagger. Contact the Dagger team if you need help")
ActionSelector = cue.Str("actions") ActionSelector = cue.Str("actions")
ClientSelector = cue.Str("client") ClientSelector = cue.Str("client")
) )
@ -44,6 +47,12 @@ func Load(ctx context.Context, cfg Config) (*Plan, error) {
v, err := compiler.Build("", nil, cfg.Args...) v, err := compiler.Build("", nil, cfg.Args...)
if err != nil { if err != nil {
errstring := err.Error()
if strings.Contains(errstring, "cannot find package") && strings.Contains(errstring, "alpha.dagger.io") {
return nil, ErrIncompatiblePlan
}
return nil, err return nil, err
} }

View File

@ -38,6 +38,14 @@ setup() {
refute_output --partial 'client.filesystem."./dependent_do".write' refute_output --partial 'client.filesystem."./dependent_do".write'
} }
@test "plan/do: nice error message for 0.1.0 projects" {
run "$DAGGER" "do" -p ./plan/do/error_message_for_0.1_projects.cue
assert_output --partial "attempting to load a dagger 0.1.0 project."
run "$DAGGER" "do" -p ./plan/do/error_message_for_0.1_projects.cue test
assert_output --partial "attempting to load a dagger 0.1.0 project."
}
@test "plan/hello" { @test "plan/hello" {
# Europa loader handles the cwd differently, therefore we need to CD into the tree at or below the parent of cue.mod # Europa loader handles the cwd differently, therefore we need to CD into the tree at or below the parent of cue.mod
cd "$TESTDIR" cd "$TESTDIR"

View File

@ -0,0 +1,60 @@
package main
import (
"alpha.dagger.io/dagger"
"alpha.dagger.io/aws/s3"
"alpha.dagger.io/netlify"
"alpha.dagger.io/os"
)
repo: dagger.#Artifact & dagger.#Input
hello: {
dir: dagger.#Artifact & dagger.#Input
ctr: os.#Container & {
command: """
ls -l /src > /tmp/out
"""
mount: "/src": from: dir
}
f: os.#File & {
from: ctr
path: "/tmp/out"
}
message: f.contents & dagger.#Output
}
// Website
web: {
source: os.#Dir & {
from: repo
path: "web"
}
url: string & dagger.#Output
// Where to host the website?
provider: *"s3" | "netlify" & dagger.#Input
// Deploy to AWS S3
if provider == "s3" {
url: "\(bucket.url)index.html"
bucket: s3.#Put & {
contentType: "text/html"
"source": source
}
}
// Deploy to Netlify
if provider == "netlify" {
url: site.url
site: netlify.#Site & {
contents: source
}
}
}