From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp11.migadu.com ([2001:41d0:403:4876::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms8.migadu.com with LMTPS id IOY6ANe9Q2U0pAAA9RJhRA:P1 (envelope-from ) for ; Thu, 02 Nov 2023 16:18:47 +0100 Received: from aspmx1.migadu.com ([2001:41d0:403:4876::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp11.migadu.com with LMTPS id IOY6ANe9Q2U0pAAA9RJhRA (envelope-from ) for ; Thu, 02 Nov 2023 16:18:47 +0100 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 42DE8152BC for ; Thu, 2 Nov 2023 16:18:46 +0100 (CET) Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=pass (policy=none) header.from=gnu.org; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org" ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1698938326; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding:resent-cc: resent-from:resent-sender:resent-message-id:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post; bh=zsXdJLVavk6a4q5Bus1ywULQZ2Aa9zu/Fk3uxGf7y8E=; b=bVt2W170UJhEOwvZu77MCKIbmjElbfIqrUEBJecdPsj53cxLDUgr0bBlyLml+BXP09JWpZ OIOtAev6Fr5P2K9m/fGzxHRP8WBvc1n1X3ZKCSSHBZ+RksW/jw1l0Sd9KTEFucF5hErE/z Q7QUHRZ1LIi0uYpfxeb9wO6k/VAOhd5KD2EH8N3BzpdO89f0ZFPsOUUhWp1hTrGV3uqgJX 1oZ7qbUtA33o7qoIXkjkfIAKjuiQTm73o42G3mjzBJ1Ef8goYTz/WqUnouhNiuL096+qAA J4y5xguM+izF7pF1FAAIiSmMGZLyFnIYG3z/51QTUnTyTEEVvyvRb2nfQ2tgpQ== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=none; dmarc=pass (policy=none) header.from=gnu.org; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org" ARC-Seal: i=1; s=key1; d=yhetil.org; t=1698938326; a=rsa-sha256; cv=none; b=oMwGZgcddRyKQMSzAnQrSHryEUN/ZXnxwwAYL+CaOG2AMPSNsX8anC6SPCBya8z9ABF/1v NCWmhuAxa/FGpVQz0UW4aAELcMBmMy+RlcsR4ohlweqs1nnww6LtL/ipH9qJ+AaHb2KnkQ 0Ee8v5xZeGroWD1VPsyDsRjIDl1bhaz2TU8VRp7wxP3T2bnq/WYozJlg/40dkL1CeKlJFC G9Ll9iysfGVSa390CMurL0EdImxOr1UyZcrluz3yYTlj+oQ8WDT25SDQIhR86y9M0yIDOK S8fgViAzrONT9fupnzBBq4ZmSfdS7rNXGDl7U17o3e2+ugp2+YUWf08o73PmNw== Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qyZSs-00007n-VA; Thu, 02 Nov 2023 11:18:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qyZSo-000067-QD for guix-patches@gnu.org; Thu, 02 Nov 2023 11:18:30 -0400 Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qyZSo-0003qF-Ge for guix-patches@gnu.org; Thu, 02 Nov 2023 11:18:30 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1qyZTN-0006cS-Eo for guix-patches@gnu.org; Thu, 02 Nov 2023 11:19:05 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#42338] [PATCH v5 9/9] gnu: composer-build-system: Full check phase rewrite. Resent-From: Nicolas Graves Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Thu, 02 Nov 2023 15:19:05 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 42338 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 42338@debbugs.gnu.org Cc: ngraves@ngraves.fr Received: via spool by 42338-submit@debbugs.gnu.org id=B42338.169893830625327 (code B ref 42338); Thu, 02 Nov 2023 15:19:05 +0000 Received: (at 42338) by debbugs.gnu.org; 2 Nov 2023 15:18:26 +0000 Received: from localhost ([127.0.0.1]:55792 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qyZSj-0006aL-Hu for submit@debbugs.gnu.org; Thu, 02 Nov 2023 11:18:26 -0400 Received: from 8.mo550.mail-out.ovh.net ([178.33.110.239]:40205) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qyZSf-0006ZX-C2 for 42338@debbugs.gnu.org; Thu, 02 Nov 2023 11:18:22 -0400 Received: from director2.ghost.mail-out.ovh.net (unknown [10.108.4.253]) by mo550.mail-out.ovh.net (Postfix) with ESMTP id 4A914290F0 for <42338@debbugs.gnu.org>; Thu, 2 Nov 2023 15:17:45 +0000 (UTC) Received: from ghost-submission-6684bf9d7b-qvpd6 (unknown [10.110.171.251]) by director2.ghost.mail-out.ovh.net (Postfix) with ESMTPS id C56111FE79; Thu, 2 Nov 2023 15:17:44 +0000 (UTC) Received: from ngraves.fr ([37.59.142.110]) by ghost-submission-6684bf9d7b-qvpd6 with ESMTPSA id uc23LJi9Q2V3MgEAyqyfIw (envelope-from ); Thu, 02 Nov 2023 15:17:44 +0000 X-OVh-ClientIp: 87.88.157.103 Date: Thu, 2 Nov 2023 16:16:56 +0100 Message-ID: <20231102151725.31362-10-ngraves@ngraves.fr> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231102151725.31362-1-ngraves@ngraves.fr> References: <20231102151725.31362-1-ngraves@ngraves.fr> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Ovh-Tracer-Id: 13661950945032987362 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: 0 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedvkedruddtiedgjeehucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecuhedttdenucenucfjughrpefhvfevufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefpihgtohhlrghsucfirhgrvhgvshcuoehnghhrrghvvghssehnghhrrghvvghsrdhfrheqnecuggftrfgrthhtvghrnhepleffjeetueethfefkeffffefvddukeejkefgleduiedthfekvefhiedvhfffgeegnecukfhppeduvdejrddtrddtrddupdekjedrkeekrdduheejrddutdefpdefjedrheelrddugedvrdduuddtnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehinhgvthepuddvjedrtddrtddruddpmhgrihhlfhhrohhmpeeonhhgrhgrvhgvshesnhhgrhgrvhgvshdrfhhrqedpnhgspghrtghpthhtohepuddprhgtphhtthhopeegvdeffeekseguvggssghughhsrdhgnhhurdhorhhgpdfovfetjfhoshhtpehmohehhedtpdhmohguvgepshhmthhpohhuthdpughkihhmpehprghssh X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: Nicolas Graves X-ACL-Warn: , Nicolas Graves via Guix-patches From: Nicolas Graves via Guix-patches via Errors-To: guix-patches-bounces+larch=yhetil.org@gnu.org Sender: guix-patches-bounces+larch=yhetil.org@gnu.org X-Migadu-Flow: FLOW_IN X-Migadu-Country: US X-Migadu-Spam-Score: -6.11 X-Spam-Score: -6.11 X-Migadu-Queue-Id: 42DE8152BC X-Migadu-Scanner: mx10.migadu.com X-TUID: 5KDd7XJX+BVc Change-Id: I824b27b925cd718ee83ef6b2ee4a8a1e69455de6 --- guix/build-system/composer.scm | 2 + guix/build/composer-build-system.scm | 239 ++++++++++++++++----------- 2 files changed, 148 insertions(+), 93 deletions(-) diff --git a/guix/build-system/composer.scm b/guix/build-system/composer.scm index 8bf99ff9c5..7d2ad2b398 100644 --- a/guix/build-system/composer.scm +++ b/guix/build-system/composer.scm @@ -107,6 +107,7 @@ (define* (composer-build name inputs (composer-file "composer.json") (tests? #t) (test-target "test") + (test-flags ''()) (install-target "install") (validate-runpath? #t) (patch-shebangs? #t) @@ -140,6 +141,7 @@ (define builder #:composer-file #$composer-file #:tests? #$tests? #:test-target #$test-target + #:test-flags #$test-flags #:install-target #$install-target #:validate-runpath? #$validate-runpath? #:patch-shebangs? #$patch-shebangs? diff --git a/guix/build/composer-build-system.scm b/guix/build/composer-build-system.scm index bcbae27021..6f05801ad1 100644 --- a/guix/build/composer-build-system.scm +++ b/guix/build/composer-build-system.scm @@ -53,9 +53,22 @@ (define (if-specified-to-list fn) (define-json-mapping make-composer-autoload composer-autoload? json->composer-autoload - (psr-4 composer-autoload-psr-4 "psr-4" (if-specified-to-list identity)) + (psr-4 composer-autoload-psr-4 "psr-4" + (match-lambda + ((? unspecified?) '()) + ((? (lambda (al) + (and (list? al) (pair? (car al)) (vector? (cdar al)))) al) + (append-map + (lambda (vect-el) + (list (cons (caar al) vect-el))) + (vector->list (cdar al)))) + ((? list? l) l) + (_ '()))) + (psr-0 composer-autoload-psr-0 "psr-0" (if-specified-to-list identity)) (classmap composer-autoload-classmap "classmap" - (if-specified-to-list vector->list))) + (if-specified-to-list vector->list)) + (files composer-autoload-files "files" + (if-specified-to-list vector->list))) (define-json-mapping make-composer-package composer-package? json->composer-package @@ -76,65 +89,57 @@ (define* (read-package-data #:key (filename "composer.json")) (lambda (port) (json->composer-package (json->scm port))))) -(define* (check #:key composer-file inputs outputs tests? test-target #:allow-other-keys) - "Test the given package." +(define* (create-test-autoload #:key composer-file inputs outputs tests? + #:allow-other-keys) + "Create the autoload.php file for tests. This is a standalone phase so that +the autoload.php file can be edited before the check phase." (when tests? (mkdir-p "vendor") (create-autoload (string-append (getcwd) "/vendor") composer-file - (append inputs outputs) #:dev-dependencies? #t) - (let* ((package-data (read-package-data #:filename composer-file)) - (scripts (composer-package-scripts package-data)) - (test-script (assoc-ref scripts test-target)) - (dependencies (composer-package-require package-data)) - (dependencies-dev (composer-package-dev-require package-data)) - (name (composer-package-name package-data))) - (for-each - (match-lambda - ((_ . input) - (let ((bin (find-php-bin input))) - (when bin - (copy-recursively bin "vendor/bin"))))) - inputs) - (match test-script - ((? string? command) - (unless (zero? (system command)) - (throw 'failed-command command))) - (('@ (? string? command) ...) - (for-each - (lambda (c) - (unless (zero? (system c)) - (throw 'failed-command c))) - command)) - (#f (invoke "vendor/bin/phpunit")))))) + inputs #:dev-dependencies? #t))) -(define (find-php-bin input) - (let* ((web-dir (string-append input "/share/web")) - (vendors (if (file-exists? web-dir) - (find-files web-dir "^vendor$" #:directories? #t) - #f))) - (match vendors - ((vendor) - (let ((bin (string-append vendor "/bin"))) - (and (file-exists? bin) bin))) - (_ #f)))) +(define (find-bin script inputs) + (search-input-file inputs + (string-append + "bin/" + (string-drop script (string-length "vendor/bin/"))))) -(define (find-php-dep inputs dependency) - (let loop ((inputs inputs)) - (match inputs - (() (throw 'unsatisfied-dependency "Unsatisfied dependency: required " - dependency)) - (((_ . input) inputs ...) - (let ((autoload (string-append input "/share/web/" dependency - "/vendor/autoload_conf.php"))) - (if (file-exists? autoload) - autoload - (loop inputs)))) - ((input inputs ...) - (let ((autoload (string-append input "/share/web/" dependency - "/vendor/autoload_conf.php"))) - (if (file-exists? autoload) - autoload - (loop inputs))))))) +(define* (check #:key composer-file inputs + tests? test-target test-flags #:allow-other-keys) + "Test the given package. +Please note that none of the PHP packages at the time of the rewrite of the +build-system did use the test-script field. This means that the @code{match +test-script} part is not tested on a real example and relies on the original +implementation." + (if tests? + (let* ((package-data (read-package-data #:filename composer-file)) + (scripts (composer-package-scripts package-data)) + (test-script (assoc-ref scripts test-target))) + (match test-script + ((? string? bin) + (let ((command (find-bin bin inputs))) + (unless (zero? (apply system command test-flags)) + (throw 'failed-command command)))) + (('@ (? string? bins) ...) + (for-each + (lambda (c) + (let ((command (find-bin bin inputs))) + (unless (zero? (apply system command test-flags)) + (throw 'failed-command command)))) + bins)) + (_ (if (file-exists? "phpunit.xml.dist") + (apply invoke + (with-exception-handler + (lambda (exn) + (if (search-error? exn) + (error "\ +Missing php-phpunit-phpunit native input.~%") + (raise exn))) + (lambda () + (search-input-file (or inputs '()) "bin/phpunit"))) + test-flags)) + (format #t "No test suite found.~%")))) + (format #t "Test suite not run.~%"))) (define* (create-autoload vendor composer-file inputs #:key dev-dependencies?) "creates an autoload.php file that sets up the class locations for this package, @@ -144,15 +149,14 @@ (define* (create-autoload vendor composer-file inputs #:key dev-dependencies?) (display (string-append " $path) { - $loader->set($namespace, $path); -} -foreach ($psr4map as $namespace => $path) { - $loader->setPsr4($namespace, $path); +foreach ($psr4map as $namespace => $paths) { + foreach ($paths as $path) { + $loader->addPsr4($namespace, $path); + } } $loader->addClassMap($classmap); $loader->register(); @@ -170,37 +174,85 @@ (define* (create-autoload vendor composer-file inputs #:key dev-dependencies?) (format #t "// autoload_conf.php @generated by Guix~%") (force-output) (for-each - (lambda (psr4) - (match psr4 - ((key . value) - (format #t "$psr4map['~a'] = '~a/../~a';~%" - (string-join (string-split key #\\) "\\\\") - vendor value)))) + (match-lambda + ((key . value) + (let ((vals (if (list? value) + (reverse value) + (list value)))) + (apply + format + #t + (string-append + "$psr4map['~a'][] = [" + (string-join + (make-list (length vals) "'~a/../~a'") ",") + "];~%") + (cons* (string-join (string-split key #\\) "\\\\") + (append-map (lambda (v) (list vendor v)) vals))))) + (_ (format #t ""))) + (merge-duplicates (append - (composer-autoload-psr-4 autoload) - (if dev-dependencies? - (composer-autoload-psr-4 autoload-dev) - '()))) + (composer-autoload-psr-4 autoload) + (if (and dev-dependencies? (not (null? autoload-dev))) + (composer-autoload-psr-4 autoload-dev) + '())) + '())) (for-each - (lambda (classmap) - (for-each - (lambda (file) - (invoke "php" (assoc-ref inputs "findclass.php") - "-i" (string-append vendor "/..") "-f" file)) - (find-files classmap ".(php|hh|inc)$"))) - (append - (composer-autoload-classmap autoload) - (if dev-dependencies? - (composer-autoload-classmap autoload-dev) - '()))) + (lambda (psr0) + (match psr0 + ((key . value) + (format #t "$psr4map['~a'][] = ['~a/../~a/~a'];~%" + (string-join (string-split key #\\) "\\\\") + vendor + value + (string-join (string-split key #\\) "/"))) + (_ (format #t "")))) + (append + (composer-autoload-psr-0 autoload) + (if (and dev-dependencies? (not (null? autoload-dev))) + (composer-autoload-psr-0 autoload-dev) + '()))) (for-each - (lambda (dep) - (format #t "require_once '~a';~%" (find-php-dep inputs dep))) - (append - dependencies - (if dev-dependencies? - dependencies-dev - '()))))))) + (lambda (classmap) + (for-each + (lambda (file) + (invoke "php" (assoc-ref inputs "findclass.php") + "-i" (string-append vendor "/..") "-f" file)) + (find-files classmap ".(php|hh|inc)$"))) + (append + (composer-autoload-classmap autoload) + (if (and dev-dependencies? (not (null? autoload-dev))) + (composer-autoload-classmap autoload-dev) + '()))) + (for-each + (lambda (file) + (format #t "require_once '~a/../~a';~%" vendor file)) + (append + (composer-autoload-files autoload) + (if (and dev-dependencies? (not (null? autoload-dev))) + (composer-autoload-files autoload-dev) + '()))) + (for-each + (lambda (dep) + (format + #t "require_once '~a';~%" + (search-input-file + inputs + (string-append "/share/web/" dep "/vendor/autoload_conf.php")))) + dependencies) + ;; Also add native-inputs that are not necessarily given in the + ;; composer.json. This allows to simply add a package in tests by + ;; adding it in native-inputs, without the need to patch composer.json. + (for-each + (match-lambda + ((name . loc) + (match (find-files loc "autoload_conf\\.php$") + (() #t) + (((? string? conf) . ()) + (format #t "require_once '~a';~%" conf)) + (_ #t))) + (_ #t)) + (or inputs '())))))) (define* (install #:key inputs outputs composer-file #:allow-other-keys) "Install the given package." @@ -237,7 +289,8 @@ (define %standard-phases (delete 'build) (delete 'check) (replace 'install install) - (add-after 'install 'check check))) + (add-after 'install 'check check) + (add-after 'install 'create-test-autoload create-test-autoload))) (define* (composer-build #:key inputs (phases %standard-phases) #:allow-other-keys #:rest args) -- 2.41.0