From 8096ed4b22f1187bc7262521534ec5ebeb41be67 Mon Sep 17 00:00:00 2001 From: Harmen Stoppels Date: Wed, 24 May 2023 15:23:46 +0200 Subject: spack remove: fix traversal when user specs intersect (#37882) drop unnecessary double loop over the matching user specs. --- lib/spack/spack/environment/environment.py | 41 +++++++++++++++--------------- 1 file changed, 20 insertions(+), 21 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/environment/environment.py b/lib/spack/spack/environment/environment.py index a4312df6dc..3d56a7d207 100644 --- a/lib/spack/spack/environment/environment.py +++ b/lib/spack/spack/environment/environment.py @@ -1221,28 +1221,27 @@ class Environment: old_specs = set(self.user_specs) new_specs = set() for spec in matches: - if spec in list_to_change: - try: - list_to_change.remove(spec) - self.update_stale_references(list_name) - new_specs = set(self.user_specs) - except spack.spec_list.SpecListError: - # define new specs list - new_specs = set(self.user_specs) - msg = f"Spec '{spec}' is part of a spec matrix and " - msg += f"cannot be removed from list '{list_to_change}'." - if force: - msg += " It will be removed from the concrete specs." - # Mock new specs, so we can remove this spec from concrete spec lists - new_specs.remove(spec) - tty.warn(msg) + if spec not in list_to_change: + continue + try: + list_to_change.remove(spec) + self.update_stale_references(list_name) + new_specs = set(self.user_specs) + except spack.spec_list.SpecListError: + # define new specs list + new_specs = set(self.user_specs) + msg = f"Spec '{spec}' is part of a spec matrix and " + msg += f"cannot be removed from list '{list_to_change}'." + if force: + msg += " It will be removed from the concrete specs." + # Mock new specs, so we can remove this spec from concrete spec lists + new_specs.remove(spec) + tty.warn(msg) + else: + if list_name == user_speclist_name: + self.manifest.remove_user_spec(str(spec)) else: - if list_name == user_speclist_name: - for user_spec in matches: - self.manifest.remove_user_spec(str(user_spec)) - else: - for user_spec in matches: - self.manifest.remove_definition(str(user_spec), list_name=list_name) + self.manifest.remove_definition(str(spec), list_name=list_name) # If force, update stale concretized specs for spec in old_specs - new_specs: -- cgit v1.2.3-60-g2f50