From d440b4614d02c5455a9c940e13f75bf80bf2ec66 Mon Sep 17 00:00:00 2001 From: Tasos Maschalidis Date: Wed, 1 Oct 2025 00:30:09 +0300 Subject: [PATCH] Define and register 'detect' subcommand --- plugins/buildpacks/Makefile | 2 +- .../buildpacks/src/subcommands/subcommands.go | 5 ++ plugins/buildpacks/subcommands.go | 46 +++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/plugins/buildpacks/Makefile b/plugins/buildpacks/Makefile index aff09a27a..70ed37a5f 100644 --- a/plugins/buildpacks/Makefile +++ b/plugins/buildpacks/Makefile @@ -1,4 +1,4 @@ -SUBCOMMANDS = subcommands/add subcommands/clear subcommands/list subcommands/remove subcommands/report subcommands/set subcommands/set-property +SUBCOMMANDS = subcommands/add subcommands/clear subcommands/detect subcommands/list subcommands/remove subcommands/report subcommands/set subcommands/set-property TRIGGERS = triggers/buildpack-stack-name triggers/install triggers/post-app-clone-setup triggers/post-app-rename-setup triggers/post-delete triggers/post-extract triggers/report BUILD = commands subcommands triggers PLUGIN_NAME = buildpacks diff --git a/plugins/buildpacks/src/subcommands/subcommands.go b/plugins/buildpacks/src/subcommands/subcommands.go index f245238f7..d1c596bcc 100644 --- a/plugins/buildpacks/src/subcommands/subcommands.go +++ b/plugins/buildpacks/src/subcommands/subcommands.go @@ -30,6 +30,11 @@ func main() { args.Parse(os.Args[2:]) appName := args.Arg(0) err = buildpacks.CommandClear(appName) + case "detect": + args := flag.NewFlagSet("buildpacks:detect", flag.ExitOnError) + args.Parse(os.Args[2:]) + appName := args.Arg(0) + err = buildpacks.CommandDetect(appName) case "list": args := flag.NewFlagSet("buildpacks:list", flag.ExitOnError) args.Parse(os.Args[2:]) diff --git a/plugins/buildpacks/subcommands.go b/plugins/buildpacks/subcommands.go index 329ed6b9f..4674eb4e8 100644 --- a/plugins/buildpacks/subcommands.go +++ b/plugins/buildpacks/subcommands.go @@ -3,6 +3,7 @@ package buildpacks import ( "errors" "fmt" + "os" "github.com/dokku/dokku/plugins/common" ) @@ -30,6 +31,51 @@ func CommandClear(appName string) error { return common.PropertyDelete("buildpacks", appName, "buildpacks") } +// CommandDetect implements buildpacks:detect +func CommandDetect(appName string) error { + if err := common.VerifyAppName(appName); err != nil { + return err + } + + buildPath := common.AppRoot(appName) + if !common.DirectoryExists(buildPath) { + return fmt.Errorf("App %s does not exist", appName) + } + + workDir := buildPath + if isBareGitRepo(buildPath) { + checkedOutPath, err := checkoutBareGitRepo(buildPath) + if err != nil { + return err + } + workDir = checkedOutPath + defer func() { + if err := os.RemoveAll(checkedOutPath); err != nil { + common.LogWarn(fmt.Sprintf("Failed to remove temporary directory %s: %v", checkedOutPath, err)) + } + }() + } + + appRoot := workDir + + dockerArgs := []string{ + "run", "--rm", + "-v", fmt.Sprintf("%s:/tmp/app", appRoot), + "gliderlabs/herokuish", "/bin/herokuish", "buildpack", "detect", "/tmp/app", + } + + result, err := common.CallExecCommand(common.ExecCommandInput{ + Command: common.DockerBin(), + Args: dockerArgs, + }) + if err != nil { + return fmt.Errorf("Buildpack detection failed: %s", result.StderrContents()) + } + + common.LogVerbose(fmt.Sprintf("%s", result.StdoutContents())) + return nil +} + // CommandList implements buildpacks:list func CommandList(appName string) (err error) { if err := common.VerifyAppName(appName); err != nil {