Skip to content

Commit 929419d

Browse files
authored
Merge pull request #927 from shopware/fix/project-create-smarter-defaults
fix(project): use smarter defaults when git or AMQP are unavailable
2 parents 0c1ad39 + 78b9101 commit 929419d

File tree

4 files changed

+70
-1
lines changed

4 files changed

+70
-1
lines changed

cmd/project/project_create.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"os"
1212
"os/exec"
1313
"path/filepath"
14+
"slices"
1415
"sort"
1516
"strings"
1617
"text/template"
@@ -182,6 +183,17 @@ var projectCreateCmd = &cobra.Command{
182183
selectGit := tui.Yes
183184
selectElasticsearch := tui.No
184185
selectAMQP := tui.Yes
186+
187+
if !system.IsGitInstalled() {
188+
selectGit = tui.No
189+
}
190+
191+
if !useDocker {
192+
extensions, err := system.GetAvailablePHPExtensions(cmd.Context())
193+
if err == nil && !slices.Contains(extensions, "amqp") {
194+
selectAMQP = tui.No
195+
}
196+
}
185197
selectedMinor := versionLatest
186198

187199
theme := huh.ThemeFunc(func(isDark bool) *huh.Styles {

internal/system/git.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package system
2+
3+
import "os/exec"
4+
5+
func IsGitInstalled() bool {
6+
_, err := exec.LookPath("git")
7+
return err == nil
8+
}

internal/system/php.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,31 @@ func GetInstalledPHPVersion(ctx context.Context) (string, error) {
3535
return strings.TrimSpace(version), nil
3636
}
3737

38+
// GetAvailablePHPExtensions returns the list of loaded PHP extensions by parsing `php -m` output.
39+
func GetAvailablePHPExtensions(ctx context.Context) ([]string, error) {
40+
phpPath, err := exec.LookPath("php")
41+
if err != nil {
42+
return nil, fmt.Errorf("PHP is not installed: %w", err)
43+
}
44+
45+
cmd := exec.CommandContext(ctx, phpPath, "-m")
46+
output, err := cmd.Output()
47+
if err != nil {
48+
return nil, fmt.Errorf("failed to get PHP extensions: %w, output: %s", err, string(output))
49+
}
50+
51+
var extensions []string
52+
for line := range strings.SplitSeq(string(output), "\n") {
53+
line = strings.TrimSpace(line)
54+
if line == "" || strings.HasPrefix(line, "[") {
55+
continue
56+
}
57+
extensions = append(extensions, line)
58+
}
59+
60+
return extensions, nil
61+
}
62+
3863
func IsPHPVersionAtLeast(ctx context.Context, requiredVersion string) (bool, error) {
3964
installedVersion, err := GetInstalledPHPVersion(ctx)
4065
if err != nil {

internal/system/php_test.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,35 @@ func TestPHPVersionIsNotAtLeast(t *testing.T) {
4141
assert.False(t, hit, "PHP version should not be at least 8.0.0")
4242
}
4343

44+
func TestGetAvailablePHPExtensionsNotInstalled(t *testing.T) {
45+
t.Setenv("PATH", "")
46+
_, err := GetAvailablePHPExtensions(t.Context())
47+
assert.ErrorContains(t, err, "PHP is not installed")
48+
}
49+
50+
func TestGetAvailablePHPExtensions(t *testing.T) {
51+
tmpDir := t.TempDir()
52+
53+
setupFakePHP(t, tmpDir, "8.0.0")
54+
55+
extensions, err := GetAvailablePHPExtensions(t.Context())
56+
assert.NoError(t, err)
57+
assert.ElementsMatch(t, []string{"Core", "curl", "json", "mbstring"}, extensions)
58+
}
59+
4460
func setupFakePHP(t *testing.T, tmpDir string, version string) {
4561
t.Helper()
4662
shPath, err := exec.LookPath("sh")
4763
assert.NoError(t, err)
4864

49-
assert.NoError(t, os.WriteFile(tmpDir+"/php", []byte(fmt.Sprintf("#!%s\necho PHP %s", shPath, version)), 0755))
65+
script := fmt.Sprintf(`#!%s
66+
if [ "$1" = "-m" ]; then
67+
printf '[PHP Modules]\nCore\ncurl\njson\nmbstring\n\n[Zend Modules]\n'
68+
else
69+
echo PHP %s
70+
fi
71+
`, shPath, version)
72+
73+
assert.NoError(t, os.WriteFile(tmpDir+"/php", []byte(script), 0755))
5074
t.Setenv("PATH", tmpDir)
5175
}

0 commit comments

Comments
 (0)