package testdata import ( "fmt" "log" "os" "os/exec" "path/filepath" "strings" "github.com/gookit/color" "github.com/zeromicro/go-zero/tools/goctl/util/pathx" ) type ( File struct { IsDir bool Path string AbsolutePath string Content string Cmd string } Files []File ) func (f File) execute(goctl string) error { printDir := f.Path dir := f.AbsolutePath if !f.IsDir { printDir = filepath.Dir(printDir) dir = filepath.Dir(dir) } printCommand := strings.ReplaceAll(fmt.Sprintf("cd %s && %s", printDir, f.Cmd), "goctl", filepath.Base(goctl)) command := strings.ReplaceAll(fmt.Sprintf("cd %s && %s", dir, f.Cmd), "goctl", goctl) fmt.Println(color.LightGreen.Render(printCommand)) cmd := exec.Command("sh", "-c", command) cmd.Env = os.Environ() cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr return cmd.Run() } func (fs Files) execute(goctl string) error { for _, f := range fs { err := f.execute(goctl) if err != nil { return err } } return nil } func mustGetTestData(baseDir string) (Files, Files) { if len(baseDir) == 0 { dir, err := os.Getwd() if err != nil { log.Fatalln(err) } baseDir = dir } baseDir, err := filepath.Abs(baseDir) if err != nil { return nil, nil } createFile := func(baseDir string, data File) (File, error) { fp := filepath.Join(baseDir, data.Path) dir := filepath.Dir(fp) if data.IsDir { dir = fp } if err := pathx.MkdirIfNotExist(dir); err != nil { return data, err } data.AbsolutePath = fp if data.IsDir { return data, nil } return data, os.WriteFile(fp, []byte(data.Content), os.ModePerm) } oldDir := filepath.Join(baseDir, "old_fs") newDir := filepath.Join(baseDir, "new_fs") os.RemoveAll(oldDir) os.RemoveAll(newDir) var oldFiles, newFiles []File for _, data := range list { od, err := createFile(oldDir, data) if err != nil { log.Fatalln(err) } oldFiles = append(oldFiles, od) nd, err := createFile(newDir, data) if err != nil { log.Fatalln(err) } newFiles = append(newFiles, nd) } return oldFiles, newFiles } func MustRun(baseDir string) { oldFiles, newFiles := mustGetTestData(baseDir) goctlOld, err := exec.LookPath("goctl.old") must(err) goctlNew, err := exec.LookPath("goctl") must(err) fmt.Println(color.LightBlue.Render("========================goctl.old=======================")) must(oldFiles.execute(goctlOld)) fmt.Println() fmt.Println(color.LightBlue.Render("========================goctl.new=======================")) must(newFiles.execute(goctlNew)) } func must(err error) { if err != nil { log.Fatalln(err) } }