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:
commit
3e702626a4
@ -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())
|
|
||||||
action = p.Action().FindByPath(actionLookupPath)
|
|
||||||
if action == nil {
|
|
||||||
errorMsg = "Error: action not found\n\n"
|
|
||||||
} else {
|
|
||||||
actions = action.Children
|
|
||||||
actionLookupPathMsg = fmt.Sprintf(`%s:`, actionLookupPath.String())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
fmt.Printf(`%s%s
|
|
||||||
|
|
||||||
%s
|
target := getTargetPath(cmd.Flags().Args())
|
||||||
|
action := p.Action().FindByPath(target)
|
||||||
|
if action == nil {
|
||||||
|
lg.Fatal().Msg(fmt.Sprintf("action %s not found", target.String()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
%s
|
if len(action.Name) < 1 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
%s
|
fmt.Println("")
|
||||||
`, errorMsg, cmd.Short, cmd.UsageString(), loadedMsg, actionLookupPathMsg)
|
w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', tabwriter.StripEscape)
|
||||||
|
defer w.Flush()
|
||||||
|
|
||||||
// fmt.Fprintln(w, "Actions\tDescription\tPackage")
|
for _, a := range action.Children {
|
||||||
// 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)
|
||||||
|
13
plan/plan.go
13
plan/plan.go
@ -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,8 +18,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ActionSelector = cue.Str("actions")
|
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")
|
||||||
ClientSelector = cue.Str("client")
|
ActionSelector = cue.Str("actions")
|
||||||
|
ClientSelector = cue.Str("client")
|
||||||
)
|
)
|
||||||
|
|
||||||
type Plan struct {
|
type Plan struct {
|
||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
60
tests/plan/do/error_message_for_0.1_projects.cue
Normal file
60
tests/plan/do/error_message_for_0.1_projects.cue
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user