From 7545f3b53bd4acaa57568c84ae48c960d85bcb09 Mon Sep 17 00:00:00 2001 From: Aaron Schlesinger Date: Wed, 20 Jan 2016 16:28:51 -0700 Subject: [PATCH 1/8] fix(.gitignore): ignore makeup binaries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit when built with ‘go build’ --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 2ac9c89..4278072 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ /vendor /bin - +makeup From 38cb1c4406038db01de1fe6a188ca23d47d47aa6 Mon Sep 17 00:00:00 2001 From: Aaron Schlesinger Date: Wed, 20 Jan 2016 16:29:40 -0700 Subject: [PATCH 2/8] ref(add.go, constants.go): pulling submodule dir prefix into constant --- cmd/add.go | 3 ++- cmd/bag/constants.go | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 cmd/bag/constants.go diff --git a/cmd/add.go b/cmd/add.go index 5bae63e..92034fd 100644 --- a/cmd/add.go +++ b/cmd/add.go @@ -22,6 +22,7 @@ import ( "path" "path/filepath" + "github.com/deis/makeup/cmd/bag" "github.com/spf13/cobra" ) @@ -49,7 +50,7 @@ func AddSubmodule(repo_path string) { log.Printf("[DEBUG] git submodule %s already exists!", repo_name) } else { url := fmt.Sprint("https://", repo_path, ".git") - path := fmt.Sprint(".makeup/", repo_name) + path := fmt.Sprint(bag.SubmoduleDir, "/", repo_name) output, err := exec.Command("git", "submodule", "add", url, path).CombinedOutput() if err != nil { log.Fatalf("[ERROR] git submodule add failed with:\n%s\n", output) diff --git a/cmd/bag/constants.go b/cmd/bag/constants.go new file mode 100644 index 0000000..e8125b5 --- /dev/null +++ b/cmd/bag/constants.go @@ -0,0 +1,5 @@ +package bag + +const ( + SubmoduleDir = ".makeup" +) From 7ea1a8ff05e5cd709d5b10512c0c7092a7c5b810 Mon Sep 17 00:00:00 2001 From: Aaron Schlesinger Date: Wed, 20 Jan 2016 16:29:52 -0700 Subject: [PATCH 3/8] fix(add.go): run gofmt on add.go --- cmd/add.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/add.go b/cmd/add.go index 92034fd..dac4854 100644 --- a/cmd/add.go +++ b/cmd/add.go @@ -16,11 +16,11 @@ package cmd import ( "fmt" - "os/exec" - "strings" "log" + "os/exec" "path" "path/filepath" + "strings" "github.com/deis/makeup/cmd/bag" "github.com/spf13/cobra" @@ -62,7 +62,7 @@ func AddSubmodule(repo_path string) { var addCmd = &cobra.Command{ Use: "add", Short: "Add a makeup kit to this project", - Long: ``, + Long: ``, Run: func(cmd *cobra.Command, args []string) { if len(args) == 1 { AddSubmodule(args[0]) From 303e00947f2a46c8257042ed54373bdfc036aef0 Mon Sep 17 00:00:00 2001 From: Aaron Schlesinger Date: Wed, 20 Jan 2016 16:30:37 -0700 Subject: [PATCH 4/8] feat(bag.go,cmd/bag): add 'bag vars' command --- cmd/bag.go | 31 +++++++++++++++++++ cmd/bag/vars.go | 70 ++++++++++++++++++++++++++++++++++++++++++ cmd/bag/vars_parser.go | 39 +++++++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 cmd/bag.go create mode 100644 cmd/bag/vars.go create mode 100644 cmd/bag/vars_parser.go diff --git a/cmd/bag.go b/cmd/bag.go new file mode 100644 index 0000000..13cb108 --- /dev/null +++ b/cmd/bag.go @@ -0,0 +1,31 @@ +// Copyright © 2015 NAME HERE +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cmd + +import ( + "github.com/deis/makeup/cmd/bag" + "github.com/spf13/cobra" +) + +var bagCmd = &cobra.Command{ + Use: "bag", + Short: "Performs operations on bags", + Long: "", +} + +func init() { + bag.AddVarsCommand(bagCmd) + RootCmd.AddCommand(bagCmd) +} diff --git a/cmd/bag/vars.go b/cmd/bag/vars.go new file mode 100644 index 0000000..d909b84 --- /dev/null +++ b/cmd/bag/vars.go @@ -0,0 +1,70 @@ +package bag + +import ( + "fmt" + "log" + "os" + "path/filepath" + "strings" + + "github.com/spf13/cobra" +) + +const ( + dependencies = "DEPENDENCIES" + varListPrefix = "# - " +) + +func lineCommented(text string) string { + return "# " + text +} + +var varsCmd = &cobra.Command{ + Use: "vars", + Short: "List the input variables for a bag or individual Makefile inside a bag", + Long: "", + Run: func(cmd *cobra.Command, args []string) { + if len(args) != 1 { + log.Printf("[ERROR] Bag or individual makefile name not given") + os.Exit(1) + } + if strings.LastIndex(args[0], ".mk") != -1 { + listMakefileVars(args[0]) + } else { + listBagVars(args[0]) + } + }, +} + +func listBagVars(path string) { + log.Printf("listing vars for bag %s", path) +} + +func listMakefileVars(path string) { + spl := strings.Split(path, "/") + if len(spl) != 4 { + log.Printf("[ERROR] makefile path %s is invalid", path) + os.Exit(1) + } + bagName := spl[len(spl)-2] + makefileName := spl[len(spl)-1] + relPath := filepath.Join(SubmoduleDir, bagName, makefileName) + fd, err := os.Open(relPath) + if err != nil { + log.Printf("[ERROR] opening makefile %s (%s)", path, err) + os.Exit(1) + } + defer fd.Close() + vars, err := parseVars(fd) + if err != nil { + log.Printf("[ERROR] parsing variables from %s (%s)", path, err) + os.Exit(1) + } + for _, variable := range vars { + fmt.Println(variable.name) + } +} + +func AddVarsCommand(cmd *cobra.Command) { + cmd.AddCommand(varsCmd) +} diff --git a/cmd/bag/vars_parser.go b/cmd/bag/vars_parser.go new file mode 100644 index 0000000..eb0e180 --- /dev/null +++ b/cmd/bag/vars_parser.go @@ -0,0 +1,39 @@ +package bag + +import ( + "bufio" + "errors" + "io" + "strings" +) + +var ( + errEmpty = errors.New("reader was empty") + errNoDeps = errors.New("no dependencies prefix found") +) + +type variable struct { + name string +} + +func parseVars(reader io.Reader) ([]variable, error) { + scanner := bufio.NewScanner(reader) + if !scanner.Scan() { + return nil, errEmpty + } + + if scanner.Text() != lineCommented("DEPENDENCIES") { + return nil, errNoDeps + } + + var ret []variable + for scanner.Scan() { + line := scanner.Text() + if !strings.HasPrefix(line, varListPrefix) { + continue + } + remainder := line[len(varListPrefix):] + ret = append(ret, variable{name: remainder}) + } + return ret, nil +} From 3f1f5b399d902dd1b079dac54e31e336960ebaab Mon Sep 17 00:00:00 2001 From: Aaron Schlesinger Date: Wed, 20 Jan 2016 16:31:13 -0700 Subject: [PATCH 5/8] fix(makeup-bag-deis): update submodule proj ID --- .makeup/makeup-bag-deis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.makeup/makeup-bag-deis b/.makeup/makeup-bag-deis index 60fa1cf..0f50fc4 160000 --- a/.makeup/makeup-bag-deis +++ b/.makeup/makeup-bag-deis @@ -1 +1 @@ -Subproject commit 60fa1cfd1800c29499c14808bfc7e68c61c3ef01 +Subproject commit 0f50fc4bb87e908c2c5f0ed3061dee16c95d7bf4 From abc186cf49af329b4cc40a904c5b6762a136afbe Mon Sep 17 00:00:00 2001 From: Aaron Schlesinger Date: Wed, 20 Jan 2016 16:35:48 -0700 Subject: [PATCH 6/8] fix(.gitignore): remove ignore for makeup script missed this before --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 4278072..ccd0805 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ /vendor /bin -makeup From 1af2a8ee6d63bade928024f58a651b72aef567be Mon Sep 17 00:00:00 2001 From: Aaron Schlesinger Date: Wed, 20 Jan 2016 16:36:02 -0700 Subject: [PATCH 7/8] feat(vars.go,vars_parser.go): add description --- cmd/bag/vars.go | 6 +++++- cmd/bag/vars_parser.go | 11 +++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/cmd/bag/vars.go b/cmd/bag/vars.go index d909b84..b9a171a 100644 --- a/cmd/bag/vars.go +++ b/cmd/bag/vars.go @@ -61,7 +61,11 @@ func listMakefileVars(path string) { os.Exit(1) } for _, variable := range vars { - fmt.Println(variable.name) + if variable.description != "" { + fmt.Println(variable.name, " - ", variable.description) + } else { + fmt.Println(variable.name) + } } } diff --git a/cmd/bag/vars_parser.go b/cmd/bag/vars_parser.go index eb0e180..a8a772a 100644 --- a/cmd/bag/vars_parser.go +++ b/cmd/bag/vars_parser.go @@ -13,7 +13,8 @@ var ( ) type variable struct { - name string + name string + description string } func parseVars(reader io.Reader) ([]variable, error) { @@ -33,7 +34,13 @@ func parseVars(reader io.Reader) ([]variable, error) { continue } remainder := line[len(varListPrefix):] - ret = append(ret, variable{name: remainder}) + spl := strings.Split(remainder, ": ") + newVar := variable{} + newVar.name = spl[0] + if len(spl) > 1 { + newVar.description = spl[1] + } + ret = append(ret, newVar) } return ret, nil } From 40e53c8c6fd3f450b7cce187c08fd7b4cdaff567 Mon Sep 17 00:00:00 2001 From: Aaron Schlesinger Date: Thu, 21 Jan 2016 12:40:21 -0700 Subject: [PATCH 8/8] feat(vars_parser.go,vars.go): implement vars list for entire bag --- cmd/bag/vars.go | 47 ++++++++++++++++++++++++++++++++++++------ cmd/bag/vars_parser.go | 8 +++++++ 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/cmd/bag/vars.go b/cmd/bag/vars.go index b9a171a..6e7129a 100644 --- a/cmd/bag/vars.go +++ b/cmd/bag/vars.go @@ -37,7 +37,46 @@ var varsCmd = &cobra.Command{ } func listBagVars(path string) { - log.Printf("listing vars for bag %s", path) + makefiles := make(map[string][]variable) + makefileErrs := make(map[string]error) + spl := strings.Split(path, "/") + if len(spl) != 3 { + log.Printf("[ERROR] bag path %s is invalid", path) + os.Exit(1) + } + bagName := spl[len(spl)-1] + relPath := filepath.Join(SubmoduleDir, bagName) + err := filepath.Walk(relPath, func(path string, info os.FileInfo, err error) error { + if info.IsDir() && filepath.Base(path) == ".git" { + return filepath.SkipDir + } else if filepath.Base(path) == ".git" || info.IsDir() { + return nil + } + + fd, err := os.Open(path) + if err != nil { + return err + } + defer fd.Close() + vars, err := parseVars(fd) + if err != nil { + makefileErrs[path] = err + } else { + makefiles[path] = vars + } + return nil + }) + if err != nil && err != filepath.SkipDir { + log.Printf("[ERROR] walking the bag directory (%s)", err) + os.Exit(1) + } + + for makefileName, vars := range makefiles { + fmt.Println("-- ", filepath.Base(makefileName), " --") + for _, v := range vars { + fmt.Println(v.String()) + } + } } func listMakefileVars(path string) { @@ -61,11 +100,7 @@ func listMakefileVars(path string) { os.Exit(1) } for _, variable := range vars { - if variable.description != "" { - fmt.Println(variable.name, " - ", variable.description) - } else { - fmt.Println(variable.name) - } + fmt.Println(variable.String()) } } diff --git a/cmd/bag/vars_parser.go b/cmd/bag/vars_parser.go index a8a772a..df2959b 100644 --- a/cmd/bag/vars_parser.go +++ b/cmd/bag/vars_parser.go @@ -3,6 +3,7 @@ package bag import ( "bufio" "errors" + "fmt" "io" "strings" ) @@ -17,6 +18,13 @@ type variable struct { description string } +func (v variable) String() string { + if v.description != "" { + return fmt.Sprintf("%s - %s", v.name, v.description) + } + return v.name +} + func parseVars(reader io.Reader) ([]variable, error) { scanner := bufio.NewScanner(reader) if !scanner.Scan() {