From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp12.migadu.com ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms9.migadu.com with LMTPS id OLbcAj7wWWTTlQAASxT56A (envelope-from ) for ; Tue, 09 May 2023 09:03:26 +0200 Received: from aspmx1.migadu.com ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp12.migadu.com with LMTPS id uBfsAj7wWWStrQAAauVa8A (envelope-from ) for ; Tue, 09 May 2023 09:03:26 +0200 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 9981930D94 for ; Tue, 9 May 2023 09:03:25 +0200 (CEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pwHN6-0005ZS-2S; Tue, 09 May 2023 03:02:52 -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 1pw7YZ-0004Ew-HU for bug-guix@gnu.org; Mon, 08 May 2023 16:34:03 -0400 Received: from debbugs.gnu.org ([209.51.188.43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pw7YZ-0005KP-8R for bug-guix@gnu.org; Mon, 08 May 2023 16:34:03 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1pw7YY-0006U8-U3 for bug-guix@gnu.org; Mon, 08 May 2023 16:34:02 -0400 X-Loop: help-debbugs@gnu.org Subject: bug#63319: [PATCH 1/3] profiles: include non-lowered entries and manifest in collision error. Resent-From: Ulf Herrman Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Mon, 08 May 2023 20:34:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 63319 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: 63319@debbugs.gnu.org Received: via spool by 63319-submit@debbugs.gnu.org id=B63319.168357803224878 (code B ref 63319); Mon, 08 May 2023 20:34:02 +0000 Received: (at 63319) by debbugs.gnu.org; 8 May 2023 20:33:52 +0000 Received: from localhost ([127.0.0.1]:41785 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pw7YN-0006T7-RZ for submit@debbugs.gnu.org; Mon, 08 May 2023 16:33:52 -0400 Received: from tilde.club ([142.44.150.184]:42442 ident=postfix) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pw7YL-0006Ss-Ub for 63319@debbugs.gnu.org; Mon, 08 May 2023 16:33:50 -0400 Received: by tilde.club (Postfix, from userid 5378) id AC0E62230502B; Mon, 8 May 2023 20:33:49 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 tilde.club AC0E62230502B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tilde.club; s=mail; t=1683578029; bh=GkUKPHduALi/MAUdQEZQX/5l1CQ4P6zqwJw2OtPKVdI=; h=From:To:Subject:Date:In-Reply-To:References:From; b=KHT7ZBS8aeCoaJ97aquQ3nJPWYSzKX0BKy/isH9ubSrRyR7HbRcKRI7W1i5kT3xF6 Ocw7OjCPMbj6gE13IyVT7UDcFAjOGzguzc05tIMtVfUEclHZtjvm9vuYCusGn7BkR7 c58yQGoihnuUEJuP+Rya6JJ7EU4YN/DPecGrO/Jc= From: Ulf Herrman Date: Mon, 8 May 2023 15:33:33 -0500 Message-Id: <20230508203335.30659-2-striness@tilde.club> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230508203335.30659-1-striness@tilde.club> References: <20230508203335.30659-1-striness@tilde.club> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-Mailman-Approved-At: Tue, 09 May 2023 03:02:40 -0400 X-BeenThere: bug-guix@gnu.org List-Id: Bug reports for GNU Guix List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-guix-bounces+larch=yhetil.org@gnu.org Sender: bug-guix-bounces+larch=yhetil.org@gnu.org X-Migadu-Flow: FLOW_IN X-Migadu-Country: US ARC-Seal: i=1; s=key1; d=yhetil.org; t=1683615805; a=rsa-sha256; cv=none; b=m2CiB3/BMgGpgWoDWrocNDt3Npsi4E5BfcTNqgdiVeuNT/N99Z+1Eb7aSCbv58g3IDS9f5 Ubqx32q7JnFwYo0qwVE3s6+T9wNL0xm0fLhS0gVwCokuspprnCWH9HtcTjgTUtiP1+kP// u67UeqH+eWvaJO0OGV6iqFu/8zcv08CDK4zczCNQ4gbR0jsc5Ug7q5OgLNjKTq2S/tVMqm hNsdjKSi/mwnmS8+ckF4DIaIPPTXkCmPVPLev+9PvmLYX/ItpmDNwVauj27wW/X4hyOZuC FtTcwrnuWHVEXwwHMyDncEHFQAfZp1d6gOU1noxxgAvQu2wQdVo9q6pEaHA+Bg== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=tilde.club header.s=mail header.b=KHT7ZBS8; dmarc=fail reason="SPF not aligned (relaxed)" header.from=tilde.club (policy=none); spf=pass (aspmx1.migadu.com: domain of "bug-guix-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="bug-guix-bounces+larch=yhetil.org@gnu.org" ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1683615805; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to: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:dkim-signature; bh=sQkBraZw+EHVqSEt17zMPM/U0W+5yVB8rw3lizHo0qE=; b=FQaAzw/wAV9apdkU2yRA4fHXBjmy8SZd3RPGT4dmaKn+ZHYjqCnuZvgoAsqcasC4/eaIRu LBvJf+UaqN99bBkOPpOrxl4MhQMjywFYT5Pa4VZkMxaFBxpZ36DFdvFc2ZFK8nfbs0V7JR dUt7IRA5Qzh1LxcL2xT67XpL7ADbjw0eOcPHDlr/0V8SSc/EHAyEZm9gvS7tOMyoiiqNrB kI5OfooE1yUUhXPwyVWknlx/rZoU2sqX64MWmDbrk5akzi/JeSKvAT0xAGOYAyXRjvSlLp QUXxkvBNIWYdKvDmCXMAwD7TKSJbrlEHSIFZsmztSG2uj1Is7LPdmYthrjhHKw== X-Migadu-Spam: Yes X-Migadu-Scanner: scn1.migadu.com Authentication-Results: aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=tilde.club header.s=mail header.b=KHT7ZBS8; dmarc=fail reason="SPF not aligned (relaxed)" header.from=tilde.club (policy=none); spf=pass (aspmx1.migadu.com: domain of "bug-guix-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="bug-guix-bounces+larch=yhetil.org@gnu.org" X-Spam: Yes X-Migadu-Spam-Score: 8.82 X-Spam-Score: 8.82 X-Migadu-Queue-Id: 9981930D94 X-TUID: 3oO3UTVREDqH This provides the necessary information for (guix ui) to accurately determine the actual entries causing the collision. The entries alone aren't enough, since they inherit their parent (singular!) field from whatever it happened to be before any manifest transaction was applied. The lowered variants are included because (guix ui) needs them for reporting store paths, and the non-lowered variants are included so that the proper parents can be derived from the included manifest, which must contain them. We also add and export a convenience procedure for finding the parents of menu entries in a particular manifest. * guix/profiles.scm (profile-collision-error-entry-lowered, profile-collision-error-conflict-lowered, profile-collision-error-manifest): new fields. (check-for-collisions): populate them. (manifest-entry->parents): new procedure. * guix/ui.scm (call-with-error-handling): use lowered entries. --- guix/profiles.scm | 60 ++++++++++++++++++++++++++++++++++++++--------- guix/ui.scm | 4 ++-- 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/guix/profiles.scm b/guix/profiles.scm index 03333785f9..b812a6f7d9 100644 --- a/guix/profiles.scm +++ b/guix/profiles.scm @@ -64,7 +64,10 @@ (define-module (guix profiles) &profile-collision-error profile-collision-error? profile-collision-error-entry + profile-collision-error-entry-lowered profile-collision-error-conflict + profile-collision-error-conflict-lowered + profile-collision-error-manifest &missing-generation-error missing-generation-error? missing-generation-error-generation @@ -107,6 +110,7 @@ (define-module (guix profiles) manifest-installed? manifest-matching-entries manifest-search-paths + manifest-entry->parents check-for-collisions manifest->code @@ -186,7 +190,10 @@ (define-condition-type &profile-not-found-error &profile-error (define-condition-type &profile-collision-error &error profile-collision-error? (entry profile-collision-error-entry) ; - (conflict profile-collision-error-conflict)) ; + (conflict profile-collision-error-conflict) ; + (entry-lowered profile-collision-error-entry-lowered) ; + (conflict-lowered profile-collision-error-conflict-lowered) ; + (manifest profile-collision-error-manifest)) ; (define-condition-type &unmatched-pattern-error &error unmatched-pattern-error? @@ -329,6 +336,34 @@ (define (recurse entry) (item (derivation->output-path drv output)) (dependencies dependencies))))))) +(define (manifest-entry->parents manifest) + "Return a procedure that maps each in MANIFEST to the list +of s in MANIFEST or their dependencies, recursively, that +have the entry in question as a direct dependency." + (define (visit-entries entries mapping visited?) + (match entries + (((and entry ($ _ _ _ _ dependencies)) . rest) + (if (vhash-assq entry visited?) + (visit-entries rest mapping visited?) + (call-with-values + (lambda () + (visit-entries dependencies + (fold (lambda (dependency mapping) + (vhash-consq dependency entry mapping)) + mapping + dependencies) + (vhash-consq entry #t visited?))) + (lambda (mapping visited?) + (visit-entries rest mapping visited?))))) + (() + (values mapping visited?)))) + + (define mapping + (visit-entries (manifest-entries manifest) vlist-null vlist-null)) + + (lambda (entry) + (vhash-foldq* cons '() entry mapping))) + (define* (check-for-collisions manifest system #:key target) "Check whether the entries of MANIFEST conflict with one another; raise a '&profile-collision-error' when a conflict is encountered." @@ -348,25 +383,28 @@ (define candidates (define lower-pair (match-lambda ((first second) - (mlet %store-monad ((first (lower-manifest-entry first system - #:target target)) - (second (lower-manifest-entry second system - #:target target))) - (return (list first second)))))) + (mlet %store-monad ((first-low (lower-manifest-entry first system + #:target target)) + (second-low (lower-manifest-entry second system + #:target target))) + (return (list first first-low second second-low)))))) ;; Start by lowering CANDIDATES "in parallel". - (mlet %store-monad ((lst (mapm/accumulate-builds lower-pair candidates))) + (mlet* %store-monad ((lst (mapm/accumulate-builds lower-pair candidates))) (foldm %store-monad (lambda (entries result) (match entries - ((first second) - (if (string=? (manifest-entry-item first) - (manifest-entry-item second)) + ((first first-low second second-low) + (if (string=? (manifest-entry-item first-low) + (manifest-entry-item second-low)) (return result) (raise (condition (&profile-collision-error (entry first) - (conflict second)))))))) + (entry-lowered first-low) + (conflict second) + (conflict-lowered second-low) + (manifest manifest)))))))) #t lst))) diff --git a/guix/ui.scm b/guix/ui.scm index d75243458d..5d2ae23c25 100644 --- a/guix/ui.scm +++ b/guix/ui.scm @@ -750,8 +750,8 @@ (define (port-filename* port) ("out" #f) (output output))))) ((profile-collision-error? c) - (let ((entry (profile-collision-error-entry c)) - (conflict (profile-collision-error-conflict c))) + (let ((entry (profile-collision-error-entry-lowered c)) + (conflict (profile-collision-error-conflict-lowered c))) (define (report-parent-entries entry) (let ((parent (force (manifest-entry-parent entry)))) (when (manifest-entry? parent) -- 2.39.1