From 2d46de5741ca0bed533394fe09f9bbf3a8dc65c8 Mon Sep 17 00:00:00 2001 From: Gregory Becker Date: Thu, 25 May 2023 01:43:55 +0200 Subject: [PATCH] fix and test issue with copying by reference vs value --- lib/spack/spack/environment/environment.py | 4 ++-- lib/spack/spack/test/cmd/env.py | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/lib/spack/spack/environment/environment.py b/lib/spack/spack/environment/environment.py index a0978d20638..cb7930c620b 100644 --- a/lib/spack/spack/environment/environment.py +++ b/lib/spack/spack/environment/environment.py @@ -1346,8 +1346,8 @@ def concretize(self, force=False, tests=False): the user spec and the corresponding concretized spec. """ old_concretized_user_specs = self.concretized_user_specs[:] - old_concretized_order = self.concretized_order - old_specs_by_hash = self.specs_by_hash + old_concretized_order = self.concretized_order[:] + old_specs_by_hash = self.specs_by_hash.copy() try: if force: diff --git a/lib/spack/spack/test/cmd/env.py b/lib/spack/spack/test/cmd/env.py index 4b778227906..28fd7c5402b 100644 --- a/lib/spack/spack/test/cmd/env.py +++ b/lib/spack/spack/test/cmd/env.py @@ -2766,6 +2766,11 @@ def test_virtual_spec_concretize_together(tmpdir): [ (True, (spack.concretize, "concretize_specs_together")), ("when_possible", (spack.solver.asp.Solver, "solve_in_rounds")), + # An earlier failure so that we test the case where the internal state + # has been changed, but the pointer to the internal variables has not change. + # This effectively tests that we are properly copying by value not by + # reference for the transactional concretization + (True, (spack.environment.Environment, "_get_specs_to_concretize")), ], ) def test_concretize_transactional(unify, method_to_fail, monkeypatch): @@ -2773,20 +2778,26 @@ def test_concretize_transactional(unify, method_to_fail, monkeypatch): e.unify = unify e.add("mpi") + e.add("zlib") e.concretize() + # remove one spec and add another to ensure we test with changes before + # and after the environment is cleared during concretization + e.remove("zlib") + e.add("libelf") + def fail(*args, **kwargs): raise Exception("Test failures") location, method = method_to_fail monkeypatch.setattr(location, method, fail) - first_user_specs = e.concretized_user_specs - first_order = e.concretized_order - first_hash_dict = e.specs_by_hash + first_user_specs = e.concretized_user_specs[:] + first_order = e.concretized_order[:] + first_hash_dict = e.specs_by_hash.copy() try: - e.concretize(force=True) + e.concretize() except Exception: pass