Skip to content

Commit 0a81ffa

Browse files
committed
refactor: extract loadUserExtensions to shared extensions package
- Add LoadUserExtensions() to src/php/extensions/extension.go: - Shared function that loads user extensions from .bp-config/php/php.ini.d/*.ini - Parses extension= and zend_extension= directives - Updates context with unique extension lists using util.UniqueStrings() - Update src/php/supply/supply.go: - Replace 79-line loadUserExtensions() with simple delegation to extensions.LoadUserExtensions() - Maintains same behavior, eliminates duplication - Update src/php/extensions/composer/composer.go: - Replace 79-line loadUserExtensions() with simple delegation to extensions.LoadUserExtensions() - Maintains same behavior, eliminates duplication Impact: - Eliminated 158 lines of duplicate code (79 lines x 2 instances) - Total reduction so far: ~328 lines - All 144 unit tests pass - Centralized extension loading logic
1 parent b65e0d3 commit 0a81ffa

3 files changed

Lines changed: 85 additions & 154 deletions

File tree

src/php/extensions/composer/composer.go

Lines changed: 1 addition & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1193,81 +1193,5 @@ func (e *ComposerExtension) copyFile(src, dst string) error {
11931193
}
11941194

11951195
func (e *ComposerExtension) loadUserExtensions(ctx *extensions.Context) error {
1196-
userPhpIniDir := filepath.Join(e.buildDir, ".bp-config", "php", "php.ini.d")
1197-
if _, err := os.Stat(userPhpIniDir); os.IsNotExist(err) {
1198-
return nil
1199-
}
1200-
1201-
fmt.Println(" Loading user-requested extensions from .bp-config/php/php.ini.d")
1202-
1203-
currentExtensions := ctx.GetStringSlice("PHP_EXTENSIONS")
1204-
currentZendExtensions := ctx.GetStringSlice("ZEND_EXTENSIONS")
1205-
1206-
extensionsToAdd := make(map[string]bool)
1207-
zendExtensionsToAdd := make(map[string]bool)
1208-
1209-
err := filepath.Walk(userPhpIniDir, func(path string, info os.FileInfo, err error) error {
1210-
if err != nil {
1211-
return err
1212-
}
1213-
1214-
if info.IsDir() || !strings.HasSuffix(strings.ToLower(path), ".ini") {
1215-
return nil
1216-
}
1217-
1218-
content, err := os.ReadFile(path)
1219-
if err != nil {
1220-
fmt.Printf(" WARNING: Failed to read %s: %v\n", path, err)
1221-
return nil
1222-
}
1223-
1224-
for _, line := range strings.Split(string(content), "\n") {
1225-
line = strings.TrimSpace(line)
1226-
1227-
if strings.HasPrefix(line, ";") || strings.HasPrefix(line, "#") || line == "" {
1228-
continue
1229-
}
1230-
1231-
if strings.HasPrefix(line, "extension=") || strings.HasPrefix(line, "extension =") {
1232-
extLine := strings.TrimSpace(strings.TrimPrefix(line, "extension="))
1233-
extLine = strings.TrimSpace(strings.TrimPrefix(extLine, "extension ="))
1234-
extName := strings.TrimSuffix(extLine, ".so")
1235-
extName = strings.Trim(extName, "\"' ")
1236-
if extName != "" {
1237-
extensionsToAdd[extName] = true
1238-
}
1239-
} else if strings.HasPrefix(line, "zend_extension=") || strings.HasPrefix(line, "zend_extension =") {
1240-
extLine := strings.TrimSpace(strings.TrimPrefix(line, "zend_extension="))
1241-
extLine = strings.TrimSpace(strings.TrimPrefix(extLine, "zend_extension ="))
1242-
extName := strings.TrimSuffix(extLine, ".so")
1243-
extName = strings.Trim(extName, "\"' ")
1244-
if extName != "" {
1245-
zendExtensionsToAdd[extName] = true
1246-
}
1247-
}
1248-
}
1249-
1250-
return nil
1251-
})
1252-
1253-
if err != nil {
1254-
return fmt.Errorf("failed to scan user ini files: %w", err)
1255-
}
1256-
1257-
for ext := range extensionsToAdd {
1258-
currentExtensions = append(currentExtensions, ext)
1259-
}
1260-
for ext := range zendExtensionsToAdd {
1261-
currentZendExtensions = append(currentZendExtensions, ext)
1262-
}
1263-
1264-
ctx.Set("PHP_EXTENSIONS", util.UniqueStrings(currentExtensions))
1265-
ctx.Set("ZEND_EXTENSIONS", util.UniqueStrings(currentZendExtensions))
1266-
1267-
if len(extensionsToAdd) > 0 || len(zendExtensionsToAdd) > 0 {
1268-
fmt.Printf(" Found %d extension(s) and %d zend extension(s) in user config\n",
1269-
len(extensionsToAdd), len(zendExtensionsToAdd))
1270-
}
1271-
1272-
return nil
1196+
return extensions.LoadUserExtensions(ctx, e.buildDir)
12731197
}

src/php/extensions/extension.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strings"
1010

1111
"github.com/cloudfoundry/libbuildpack"
12+
"github.com/cloudfoundry/php-buildpack/src/php/util"
1213
)
1314

1415
// Extension defines the interface that all buildpack extensions must implement.
@@ -477,3 +478,85 @@ func (h *PHPConfigHelper) PHPFpm() *ConfigFileEditor {
477478
func (h *PHPConfigHelper) PHPIniPath() string {
478479
return h.phpIniPath
479480
}
481+
482+
// LoadUserExtensions loads user-requested PHP extensions from .bp-config/php/php.ini.d/*.ini files
483+
// and updates the context with the parsed extension lists
484+
func LoadUserExtensions(ctx *Context, buildDir string) error {
485+
userPhpIniDir := filepath.Join(buildDir, ".bp-config", "php", "php.ini.d")
486+
if _, err := os.Stat(userPhpIniDir); os.IsNotExist(err) {
487+
return nil
488+
}
489+
490+
fmt.Println(" Loading user-requested extensions from .bp-config/php/php.ini.d")
491+
492+
currentExtensions := ctx.GetStringSlice("PHP_EXTENSIONS")
493+
currentZendExtensions := ctx.GetStringSlice("ZEND_EXTENSIONS")
494+
495+
extensionsToAdd := make(map[string]bool)
496+
zendExtensionsToAdd := make(map[string]bool)
497+
498+
err := filepath.Walk(userPhpIniDir, func(path string, info os.FileInfo, err error) error {
499+
if err != nil {
500+
return err
501+
}
502+
503+
if info.IsDir() || !strings.HasSuffix(strings.ToLower(path), ".ini") {
504+
return nil
505+
}
506+
507+
content, err := os.ReadFile(path)
508+
if err != nil {
509+
fmt.Printf(" WARNING: Failed to read %s: %v\n", path, err)
510+
return nil
511+
}
512+
513+
for _, line := range strings.Split(string(content), "\n") {
514+
line = strings.TrimSpace(line)
515+
516+
if strings.HasPrefix(line, ";") || strings.HasPrefix(line, "#") || line == "" {
517+
continue
518+
}
519+
520+
if strings.HasPrefix(line, "extension=") || strings.HasPrefix(line, "extension =") {
521+
extLine := strings.TrimSpace(strings.TrimPrefix(line, "extension="))
522+
extLine = strings.TrimSpace(strings.TrimPrefix(extLine, "extension ="))
523+
extName := strings.TrimSuffix(extLine, ".so")
524+
extName = strings.Trim(extName, "\"' ")
525+
if extName != "" {
526+
extensionsToAdd[extName] = true
527+
}
528+
} else if strings.HasPrefix(line, "zend_extension=") || strings.HasPrefix(line, "zend_extension =") {
529+
extLine := strings.TrimSpace(strings.TrimPrefix(line, "zend_extension="))
530+
extLine = strings.TrimSpace(strings.TrimPrefix(extLine, "zend_extension ="))
531+
extName := strings.TrimSuffix(extLine, ".so")
532+
extName = strings.Trim(extName, "\"' ")
533+
if extName != "" {
534+
zendExtensionsToAdd[extName] = true
535+
}
536+
}
537+
}
538+
539+
return nil
540+
})
541+
542+
if err != nil {
543+
return fmt.Errorf("failed to scan user ini files: %w", err)
544+
}
545+
546+
for ext := range extensionsToAdd {
547+
currentExtensions = append(currentExtensions, ext)
548+
}
549+
for ext := range zendExtensionsToAdd {
550+
currentZendExtensions = append(currentZendExtensions, ext)
551+
}
552+
553+
ctx.Set("PHP_EXTENSIONS", util.UniqueStrings(currentExtensions))
554+
ctx.Set("ZEND_EXTENSIONS", util.UniqueStrings(currentZendExtensions))
555+
556+
if len(extensionsToAdd) > 0 || len(zendExtensionsToAdd) > 0 {
557+
fmt.Printf(" Found %d extension(s) and %d zend extension(s) in user config\n",
558+
len(extensionsToAdd), len(zendExtensionsToAdd))
559+
}
560+
561+
return nil
562+
}

src/php/supply/supply.go

Lines changed: 1 addition & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -811,81 +811,5 @@ func (s *Supplier) ProcessPhpFpmConfForTesting(phpFpmConfPath, phpEtcDir string)
811811
}
812812

813813
func (s *Supplier) loadUserExtensions(ctx *extensions.Context) error {
814-
userPhpIniDir := filepath.Join(s.Stager.BuildDir(), ".bp-config", "php", "php.ini.d")
815-
if _, err := os.Stat(userPhpIniDir); os.IsNotExist(err) {
816-
return nil
817-
}
818-
819-
fmt.Println(" Loading user-requested extensions from .bp-config/php/php.ini.d")
820-
821-
currentExtensions := ctx.GetStringSlice("PHP_EXTENSIONS")
822-
currentZendExtensions := ctx.GetStringSlice("ZEND_EXTENSIONS")
823-
824-
extensionsToAdd := make(map[string]bool)
825-
zendExtensionsToAdd := make(map[string]bool)
826-
827-
err := filepath.Walk(userPhpIniDir, func(path string, info os.FileInfo, err error) error {
828-
if err != nil {
829-
return err
830-
}
831-
832-
if info.IsDir() || !strings.HasSuffix(strings.ToLower(path), ".ini") {
833-
return nil
834-
}
835-
836-
content, err := os.ReadFile(path)
837-
if err != nil {
838-
fmt.Printf(" WARNING: Failed to read %s: %v\n", path, err)
839-
return nil
840-
}
841-
842-
for _, line := range strings.Split(string(content), "\n") {
843-
line = strings.TrimSpace(line)
844-
845-
if strings.HasPrefix(line, ";") || strings.HasPrefix(line, "#") || line == "" {
846-
continue
847-
}
848-
849-
if strings.HasPrefix(line, "extension=") || strings.HasPrefix(line, "extension =") {
850-
extLine := strings.TrimSpace(strings.TrimPrefix(line, "extension="))
851-
extLine = strings.TrimSpace(strings.TrimPrefix(extLine, "extension ="))
852-
extName := strings.TrimSuffix(extLine, ".so")
853-
extName = strings.Trim(extName, "\"' ")
854-
if extName != "" {
855-
extensionsToAdd[extName] = true
856-
}
857-
} else if strings.HasPrefix(line, "zend_extension=") || strings.HasPrefix(line, "zend_extension =") {
858-
extLine := strings.TrimSpace(strings.TrimPrefix(line, "zend_extension="))
859-
extLine = strings.TrimSpace(strings.TrimPrefix(extLine, "zend_extension ="))
860-
extName := strings.TrimSuffix(extLine, ".so")
861-
extName = strings.Trim(extName, "\"' ")
862-
if extName != "" {
863-
zendExtensionsToAdd[extName] = true
864-
}
865-
}
866-
}
867-
868-
return nil
869-
})
870-
871-
if err != nil {
872-
return fmt.Errorf("failed to scan user ini files: %w", err)
873-
}
874-
875-
for ext := range extensionsToAdd {
876-
currentExtensions = append(currentExtensions, ext)
877-
}
878-
for ext := range zendExtensionsToAdd {
879-
currentZendExtensions = append(currentZendExtensions, ext)
880-
}
881-
882-
ctx.Set("PHP_EXTENSIONS", util.UniqueStrings(currentExtensions))
883-
ctx.Set("ZEND_EXTENSIONS", util.UniqueStrings(currentZendExtensions))
884-
885-
if len(extensionsToAdd) > 0 || len(zendExtensionsToAdd) > 0 {
886-
fmt.Printf(" Found %d extension(s) and %d zend extension(s) in user config\n",
887-
len(extensionsToAdd), len(zendExtensionsToAdd))
888-
}
889-
890-
return nil
814+
return extensions.LoadUserExtensions(ctx, s.Stager.BuildDir())
891815
}

0 commit comments

Comments
 (0)