From 0f659c9b3c6f62d02d77277af4ecc763716da17c Mon Sep 17 00:00:00 2001 From: okwme Date: Fri, 13 Dec 2019 19:08:55 +0100 Subject: [PATCH] builds and works --- cmd/commands.go | 19 +++++++++++ cmd/root.go | 4 ++- cmd/utils.go | 86 +++++++++++++++++++++++++++++++++++++++++++++++ cmd/utils_test.go | 26 ++++++++++++++ go.mod | 2 +- go.sum | 3 ++ 6 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 cmd/utils_test.go diff --git a/cmd/commands.go b/cmd/commands.go index 60bfd01..bf9c20d 100644 --- a/cmd/commands.go +++ b/cmd/commands.go @@ -47,6 +47,25 @@ var tutCmd = &cobra.Command{ }, } +var cloneCmd = &cobra.Command{ + Use: "clone [cloneUser] [cloneRepo] [user] [repo]", + Short: "clone an SDK app and make your own", + Args: cobra.ExactArgs(4), + Run: func(cmd *cobra.Command, args []string) { + cln := UserRepoArgs{ + CloneUser: args[0], + CloneRepo: args[1], + User: args[2], + Repo: args[3], + } + err := clone(cln) + if err != nil { + fmt.Println(err) + return + } + }, +} + // moduleCmd var moduleCmd = &cobra.Command{ Use: "module [user] [repo] [moduleName]", diff --git a/cmd/root.go b/cmd/root.go index f3eb580..a7757c5 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -41,6 +41,8 @@ type UserRepoArgs struct { Dir string `json:"dir"` User string `json:"user"` Repo string `json:"repo"` + CloneUser string `json:"cloneUser"` + CloneRepo string `json:"cloneRepo"` NameRaw string `json:"nameRaw"` NameLowerCase string `json:"nameLowerCase"` NameCapitalCamelCase string `json:"nameCapitalCamelCase"` @@ -68,7 +70,7 @@ func init() { rootCmd.PersistentFlags().StringVarP(&outputPath, "output-path", "o", "", "Path to output") // Commands for scaffolding - rootCmd.AddCommand(tutCmd, appCmd, moduleCmd) + rootCmd.AddCommand(tutCmd, appCmd, moduleCmd, cloneCmd) // Cobra also supports local flags, which will only run // when this action is called directly. diff --git a/cmd/utils.go b/cmd/utils.go index a59d17f..a5ae8da 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -1,13 +1,99 @@ package cmd import ( + "errors" "fmt" + "io/ioutil" + "log" "os" + "os/exec" "path/filepath" "strings" "text/template" ) +// clones an sdk repository and replaces the username and repo name with options from UserRepoArgs +func clone(args UserRepoArgs) error { + tmp, err := ioutil.TempDir("", "scaffold-clone-") + if err != nil { + log.Fatal(err) + } + defer os.RemoveAll(tmp) // clean up + + cmd := exec.Command("git", "clone", "git@github.com:"+args.CloneUser+"/"+args.CloneRepo, tmp) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err = cmd.Run() + if err != nil { + return err + } + + cmd = exec.Command("rm", "-rf", tmp+"/.git") + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err = cmd.Run() + if err != nil { + return err + } + + err = filepath.Walk(tmp, visit(args.CloneUser+"/"+args.CloneRepo, args.User+"/"+args.Repo)) + if err != nil { + return (err) + } + err = filepath.Walk(tmp, visit("\\/"+args.CloneUser+"\\/"+args.CloneRepo+"/", "\\/"+args.User+"\\/"+args.Repo+"/")) + if err != nil { + return (err) + } + + cwd, err := os.Getwd() + if err != nil { + return (err) + } + + newdir := cwd + "/" + args.Repo + + if _, err := os.Stat(newdir); os.IsNotExist(err) { + err := os.Rename(tmp, newdir) + if err != nil { + return (err) + } + } else { + return errors.New("Folder " + newdir + " already exists") + } + + if err != nil { + return (err) + } + return nil +} +func visit(search, replace string) filepath.WalkFunc { + return func(path string, fi os.FileInfo, err error) error { + if err != nil { + return err + } + if !!fi.IsDir() { + return nil + } + matched, err := filepath.Match("*", fi.Name()) + if err != nil { + panic(err) + return err + } + if matched { + read, err := ioutil.ReadFile(path) + if err != nil { + panic(err) + } + newContents := strings.Replace(string(read), search, replace, -1) + err = ioutil.WriteFile(path, []byte(newContents), 0) + if err != nil { + panic(err) + } + } + return nil + } +} + // Give this the name of the tutorial and any arguments necessary for // said tutorial func scaffold(name string, op string, args UserRepoArgs) error { diff --git a/cmd/utils_test.go b/cmd/utils_test.go new file mode 100644 index 0000000..1730249 --- /dev/null +++ b/cmd/utils_test.go @@ -0,0 +1,26 @@ +package cmd + +import ( + "io/ioutil" + "log" + "os" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestClone(t *testing.T) { + tmp, err := ioutil.TempDir("", "scaffold-clone-test-") + if err != nil { + log.Fatal(err) + } + // defer os.RemoveAll(tmp) // clean up + os.Chdir(tmp) + err = clone(UserRepoArgs{ + User: "username", + Repo: "repository", + CloneUser: "cosmos", + CloneRepo: "gaia", + }) + require.NoError(t, err) +} diff --git a/go.mod b/go.mod index d5811d9..8fb7e3a 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/spf13/cobra v0.0.5 github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/viper v1.5.0 - github.com/stretchr/testify v1.4.0 // indirect + github.com/stretchr/testify v1.4.0 golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a // indirect golang.org/x/text v0.3.2 // indirect ) diff --git a/go.sum b/go.sum index 54df01d..41e7ca3 100644 --- a/go.sum +++ b/go.sum @@ -114,6 +114,7 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/spf13/viper v1.5.0 h1:GpsTwfsQ27oS/Aha/6d1oD7tpKIqWnOA6tgOX9HHkt4= github.com/spf13/viper v1.5.0/go.mod h1:AkYRkVJF8TkSG/xet6PzXX+l39KhhXa2pdqVSxnTcn4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= @@ -138,7 +139,9 @@ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=