@@ -601,39 +601,41 @@ def render_environment(
601601
602602 new_env = RenderedEnvironment (name , package_manager )
603603
604+ # Stores a mapping from rendered package name to template.
605+ # This helps with more efficient env package matching and
606+ # allows only matched packages to be fully rendered.
607+ name_to_template = {}
608+ for pkg_template in all_package_templates .values ():
609+ rendered_name = expander .expand_var (pkg_template .name , merge_used_stage = False )
610+ if rendered_name :
611+ name_to_template [rendered_name ] = pkg_template
612+
604613 for env_pkg_template in self ._package_names :
605614 rendered_env_pkg_name = expander .expand_var (env_pkg_template )
606-
607- if rendered_env_pkg_name :
608- found = False
609- for template_pkg in all_package_templates .values ():
610- expander .flush_used_variable_stage ()
611- rendered_pkg = template_pkg .render_package (expander , package_manager )
612-
613- if rendered_env_pkg_name == rendered_pkg .name :
614- found = True
615- if rendered_pkg .spec is not None :
616- expander .merge_used_variable_stage ()
617-
618- if rendered_pkg .name in all_packages [pm_name ]:
619- if rendered_pkg != all_packages [pm_name ][rendered_pkg .name ]:
620- raise RambleSoftwareEnvironmentError (
621- f"Environment { name } defined multiple "
622- "times in inconsistent ways.\n "
623- f"Package with differences is { rendered_pkg .name } "
624- )
625- rendered_pkg = all_packages [pm_name ][rendered_pkg .name ]
626- else :
627- all_packages [pm_name ][rendered_pkg .name ] = rendered_pkg
628-
629- template_pkg .add_rendered_package (rendered_pkg , all_packages , pm_name )
630- new_env .add_package (rendered_pkg )
631-
632- if not found :
633- raise RambleSoftwareEnvironmentError (
634- f"Environment template { self .name } references "
635- f"undefined package { env_pkg_template } rendered to { rendered_env_pkg_name } "
636- )
615+ if not rendered_env_pkg_name :
616+ continue
617+ matching_template = name_to_template .get (rendered_env_pkg_name )
618+ if matching_template is None :
619+ raise RambleSoftwareEnvironmentError (
620+ f"Environment template { self .name } references "
621+ f"undefined package { env_pkg_template } rendered to { rendered_env_pkg_name } "
622+ )
623+ expander .flush_used_variable_stage ()
624+ rendered_pkg = matching_template .render_package (expander , package_manager )
625+ if rendered_pkg .spec is not None :
626+ expander .merge_used_variable_stage ()
627+ if rendered_pkg .name in all_packages [pm_name ]:
628+ if rendered_pkg != all_packages [pm_name ][rendered_pkg .name ]:
629+ raise RambleSoftwareEnvironmentError (
630+ f"Environment { name } defined multiple "
631+ "times in inconsistent ways.\n "
632+ f"Package with differences is { rendered_pkg .name } "
633+ )
634+ rendered_pkg = all_packages [pm_name ][rendered_pkg .name ]
635+ else :
636+ all_packages [pm_name ][rendered_pkg .name ] = rendered_pkg
637+ matching_template .add_rendered_package (rendered_pkg , all_packages , pm_name )
638+ new_env .add_package (rendered_pkg )
637639
638640 return new_env
639641
0 commit comments