diff --git a/plugins/buildpacks/functions.go b/plugins/buildpacks/functions.go index 13f2141be..b7088c3cf 100644 --- a/plugins/buildpacks/functions.go +++ b/plugins/buildpacks/functions.go @@ -2,14 +2,26 @@ package buildpacks import ( "errors" + "fmt" + "regexp" + "strings" ) -func getAppName(args []string) (appName string, err error) { - if len(args) >= 1 { - appName = args[0] - } else { - err = errors.New("Please specify an app to run the command on") +func validBuildpackURL(buildpack string) (string, error) { + if buildpack == "" { + return buildpack, errors.New("Must specify a buildpack to add") } - return + reHerokuValue := regexp.MustCompile(`(?m)^([\w]+\/[\w]+)$`) + if found := reHerokuValue.Find([]byte(buildpack)); found != nil { + parts := strings.SplitN(buildpack, "/", 2) + return fmt.Sprintf("https://github.com/%s/heroku-buildpack-%s.git", parts[0], parts[1]), nil + } + + reString := regexp.MustCompile(`(?m)^(http|https|git)(:\/\/|@)([^\/:]+)[\/:]([^\/:]+)\/(.+)(.git(#derp)?)?$`) + if found := reString.Find([]byte(buildpack)); found != nil { + return buildpack, nil + } + + return buildpack, fmt.Errorf("Invalid buildpack specified: %v", buildpack) } diff --git a/plugins/buildpacks/src/subcommands/subcommands.go b/plugins/buildpacks/src/subcommands/subcommands.go index 212898cfe..fe5e46179 100644 --- a/plugins/buildpacks/src/subcommands/subcommands.go +++ b/plugins/buildpacks/src/subcommands/subcommands.go @@ -21,30 +21,39 @@ func main() { args := flag.NewFlagSet("buildpacks:add", flag.ExitOnError) index := args.Int("index", 0, "--index: the 1-based index of the URL in the list of URLs") args.Parse(os.Args[2:]) - err = buildpacks.CommandAdd(args.Args(), *index) + appName := args.Arg(0) + buildpack := args.Arg(1) + err = buildpacks.CommandAdd(appName, buildpack, *index) case "clear": args := flag.NewFlagSet("buildpacks:clear", flag.ExitOnError) args.Parse(os.Args[2:]) - err = buildpacks.CommandClear(args.Args()) + appName := args.Arg(0) + err = buildpacks.CommandClear(appName) case "list": args := flag.NewFlagSet("buildpacks:list", flag.ExitOnError) args.Parse(os.Args[2:]) - buildpacks.CommandList(args.Args()) + appName := args.Arg(0) + err = buildpacks.CommandList(appName) case "remove": args := flag.NewFlagSet("buildpacks:remove", flag.ExitOnError) index := args.Int("index", 0, "--index: the 1-based index of the URL in the list of URLs") args.Parse(os.Args[2:]) - err = buildpacks.CommandRemove(args.Args(), *index) + appName := args.Arg(0) + buildpack := args.Arg(1) + err = buildpacks.CommandRemove(appName, buildpack, *index) case "report": - flag.Parse() - appName := flag.Arg(1) - infoFlag := flag.Arg(2) - buildpacks.CommandReport(appName, infoFlag) + args := flag.NewFlagSet("buildpacks:report", flag.ExitOnError) + args.Parse(os.Args[2:]) + appName := args.Arg(0) + infoFlag := args.Arg(1) + err = buildpacks.CommandReport(appName, infoFlag) case "set": args := flag.NewFlagSet("buildpacks:set", flag.ExitOnError) index := args.Int("index", 0, "--index: the 1-based index of the URL in the list of URLs") args.Parse(os.Args[2:]) - err = buildpacks.CommandSet(args.Args(), *index) + appName := args.Arg(0) + buildpack := args.Arg(1) + err = buildpacks.CommandSet(appName, buildpack, *index) default: common.LogFail(fmt.Sprintf("Invalid plugin subcommand call: %s", subcommand)) } diff --git a/plugins/buildpacks/subcommands.go b/plugins/buildpacks/subcommands.go index 7335d0ca3..53a97c963 100644 --- a/plugins/buildpacks/subcommands.go +++ b/plugins/buildpacks/subcommands.go @@ -3,71 +3,38 @@ package buildpacks import ( "errors" "fmt" - "regexp" "strings" "github.com/dokku/dokku/plugins/common" ) -func validBuildpackURL(buildpack string) (string, error) { - if buildpack == "" { - return buildpack, errors.New("Must specify a buildpack to add") - } - - reHerokuValue := regexp.MustCompile(`(?m)^([\w]+\/[\w]+)$`) - if found := reHerokuValue.Find([]byte(buildpack)); found != nil { - parts := strings.SplitN(buildpack, "/", 2) - return fmt.Sprintf("https://github.com/%s/heroku-buildpack-%s.git", parts[0], parts[1]), nil - } - - reString := regexp.MustCompile(`(?m)^(http|https|git)(:\/\/|@)([^\/:]+)[\/:]([^\/:]+)\/(.+)(.git(#derp)?)?$`) - if found := reString.Find([]byte(buildpack)); found != nil { - return buildpack, nil - } - - return buildpack, fmt.Errorf("Invalid buildpack specified: %v", buildpack) -} - // CommandAdd implements buildpacks:add -func CommandAdd(args []string, index int) (err error) { - var appName string - appName, err = getAppName(args) - if err != nil { - return +func CommandAdd(appName string, buildpack string, index int) error { + if appName == "" { + return errors.New("Please specify an app to run the command on") } - buildpack := "" - if len(args) >= 2 { - buildpack = args[1] - } - - buildpack, err = validBuildpackURL(buildpack) + buildpack, err := validBuildpackURL(buildpack) if err != nil { return err } - err = common.PropertyListAdd("buildpacks", appName, "buildpacks", buildpack, index) - return + return common.PropertyListAdd("buildpacks", appName, "buildpacks", buildpack, index) } // CommandClear implements buildpacks:clear -func CommandClear(args []string) (err error) { - var appName string - appName, err = getAppName(args) - if err != nil { - return +func CommandClear(appName string) error { + if appName == "" { + return errors.New("Please specify an app to run the command on") } - common.PropertyDelete("buildpacks", appName, "buildpacks") - return + return common.PropertyDelete("buildpacks", appName, "buildpacks") } // CommandList implements buildpacks:list -func CommandList(args []string) (err error) { - var appName string - appName, err = getAppName(args) - if err != nil { - return +func CommandList(appName string) (err error) { + if appName == "" { + return errors.New("Please specify an app to run the command on") } buildpacks, err := common.PropertyListGet("buildpacks", appName, "buildpacks") @@ -83,17 +50,11 @@ func CommandList(args []string) (err error) { } // CommandRemove implements buildpacks:remove -func CommandRemove(args []string, index int) (err error) { - var appName string - appName, err = getAppName(args) - if err != nil { - return +func CommandRemove(appName string, buildpack string, index int) (err error) { + if appName == "" { + return errors.New("Please specify an app to run the command on") } - buildpack := "" - if len(args) >= 2 { - buildpack = args[1] - } if index != 0 && buildpack != "" { err = errors.New("Please choose either index or Buildpack, but not both") return @@ -164,23 +125,15 @@ func CommandReport(appName string, infoFlag string) error { } return ReportSingleApp(appName, infoFlag) - } // CommandSet implements buildpacks:set -func CommandSet(args []string, index int) (err error) { - var appName string - appName, err = getAppName(args) - if err != nil { - return +func CommandSet(appName string, buildpack string, index int) error { + if appName == "" { + return errors.New("Please specify an app to run the command on") } - buildpack := "" - if len(args) >= 2 { - buildpack = args[1] - } - - buildpack, err = validBuildpackURL(buildpack) + buildpack, err := validBuildpackURL(buildpack) if err != nil { return err } @@ -189,10 +142,5 @@ func CommandSet(args []string, index int) (err error) { index-- } - err = common.PropertyListSet("buildpacks", appName, "buildpacks", buildpack, index) - if err != nil { - return - } - - return + return common.PropertyListSet("buildpacks", appName, "buildpacks", buildpack, index) }