diff --git a/internal/system/setup.go b/internal/system/setup.go index c879466a..03ef6daf 100644 --- a/internal/system/setup.go +++ b/internal/system/setup.go @@ -65,6 +65,11 @@ func CheckProjectDependencies(ctx context.Context, useDocker bool, phpConstraint if useDocker && !IsInsideContainer() { if _, err := exec.LookPath("docker"); err != nil { missing = append(missing, MissingDependency{Name: "Docker", Reason: "not installed"}) + } else { + cmd := exec.CommandContext(ctx, "docker", "info") + if err := cmd.Run(); err != nil { + missing = append(missing, MissingDependency{Name: "Docker", Reason: "not running"}) + } } return missing } @@ -120,13 +125,19 @@ func RenderMissingDependencies(useDocker bool, missing []MissingDependency) stri arrow := tui.GreenText.Render("→") insideContainer := IsInsideContainer() - if insideContainer { + dockerOnlyMissing := useDocker && len(missing) == 1 && missing[0].Name == "Docker" + switch { + case dockerOnlyMissing && missing[0].Reason == "not running": + b.WriteString(tui.BoldText.Render("Start Docker and try again.")) + case dockerOnlyMissing && missing[0].Reason == "not installed": + b.WriteString(tui.BoldText.Render("Install Docker and try again.")) + case insideContainer: b.WriteString(tui.BoldText.Render("To create a Shopware project from inside this container, install:")) b.WriteString("\n\n") b.WriteString(" " + arrow + " " + tui.BoldText.Render("PHP 8.2+ and Composer") + "\n") b.WriteString(" PHP: " + tui.BlueText.Render("https://www.php.net/downloads.php") + "\n") b.WriteString(" Composer: " + tui.BlueText.Render("https://getcomposer.org/") + "\n") - } else { + default: b.WriteString(tui.BoldText.Render("To create a Shopware project, install one of:")) b.WriteString("\n\n") b.WriteString(" " + arrow + " " + tui.RecommendedText.Render("Docker") + " " + tui.DimText.Render("(recommended)") + "\n") diff --git a/internal/system/setup_test.go b/internal/system/setup_test.go index 1fdb40a9..23e83830 100644 --- a/internal/system/setup_test.go +++ b/internal/system/setup_test.go @@ -13,3 +13,31 @@ func TestCheckIncompatibilities(t *testing.T) { assert.Empty(t, incompatibilities) }) } + +func TestRenderMissingDependencies(t *testing.T) { + t.Run("docker not running shows start message", func(t *testing.T) { + out := RenderMissingDependencies(true, []MissingDependency{ + {Name: "Docker", Reason: "not running"}, + }) + assert.Contains(t, out, "Start Docker and try again.") + assert.NotContains(t, out, "install one of") + }) + + t.Run("docker not installed shows install message", func(t *testing.T) { + out := RenderMissingDependencies(true, []MissingDependency{ + {Name: "Docker", Reason: "not installed"}, + }) + assert.Contains(t, out, "Install Docker and try again.") + assert.NotContains(t, out, "install one of") + }) + + t.Run("missing php and composer shows install links", func(t *testing.T) { + out := RenderMissingDependencies(false, []MissingDependency{ + {Name: "PHP 8.2+", Reason: "not installed"}, + {Name: "Composer", Reason: "not installed"}, + }) + assert.Contains(t, out, "install one of") + assert.Contains(t, out, "https://www.php.net/downloads.php") + assert.Contains(t, out, "https://getcomposer.org/") + }) +}