From 3429ce1b1ad49c47ada117a52374a81139d4b3f4 Mon Sep 17 00:00:00 2001 From: COMBROUSE Dimitri Date: Thu, 22 Jan 2026 13:34:48 +0100 Subject: [PATCH] fix(composer): allow single pipe for backward compatibility in PHP version selection --- src/php/extensions/composer/composer.go | 11 ++++++ src/php/extensions/composer/composer_test.go | 39 ++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/php/extensions/composer/composer.go b/src/php/extensions/composer/composer.go index e799d4501..ef8ce36de 100644 --- a/src/php/extensions/composer/composer.go +++ b/src/php/extensions/composer/composer.go @@ -410,6 +410,17 @@ func (e *ComposerExtension) versionMatchesConstraint(version, constraint string) return false } + // Handle OR constraints (|) + if strings.Contains(constraint, "|") { + parts := strings.Split(constraint, "|") + for _, part := range parts { + if e.versionMatchesConstraint(version, strings.TrimSpace(part)) { + return true + } + } + return false + } + // Handle AND constraints (space-separated) if strings.Contains(constraint, " ") { parts := strings.Fields(constraint) diff --git a/src/php/extensions/composer/composer_test.go b/src/php/extensions/composer/composer_test.go index d8f1ac545..b2b51fb21 100644 --- a/src/php/extensions/composer/composer_test.go +++ b/src/php/extensions/composer/composer_test.go @@ -386,6 +386,45 @@ var _ = Describe("ComposerExtension", func() { }) }) + Context("when lock use | (OR) constraint", func() { + BeforeEach(func() { + composerJSON := filepath.Join(buildDir, "composer.json") + jsonContent := `{ + "require": { + "php": ">=8.3" + } + }` + err := os.WriteFile(composerJSON, []byte(jsonContent), 0644) + Expect(err).NotTo(HaveOccurred()) + + composerLock := filepath.Join(buildDir, "composer.lock") + lockContent := `{ + "packages": [ + { + "name": "simple/package", + "version": "1.0.0", + "require": { + "php": "^7.1 | ^8.0" + } + } + ] + }` + err = os.WriteFile(composerLock, []byte(lockContent), 0644) + Expect(err).NotTo(HaveOccurred()) + + ext.ShouldCompile(ctx) + }) + + It("should select highest version matching all constraints", func() { + err := ext.Configure(ctx) + Expect(err).NotTo(HaveOccurred()) + + phpVersion := ctx.GetString("PHP_VERSION") + // In Composer, ^7.1 | ^8.0 is same as ^7.1 || ^8.0, so 8.3.21 is valid + Expect(phpVersion).To(Equal("8.3.21")) + }) + }) + Context("when composer.json specifies AND constraints (space-separated)", func() { BeforeEach(func() { composerJSON := filepath.Join(buildDir, "composer.json")