buildcaches: fix directory link relocation (#26948)
When relocating a binary distribution, Spack only checks files to see if they are a link that needs to be relocated. Directories can be such links as well, however, and need to undergo the same checks and potential relocation.
This commit is contained in:
		@@ -608,6 +608,16 @@ def get_buildfile_manifest(spec):
 | 
			
		||||
    # Used by make_package_relative to determine binaries to change.
 | 
			
		||||
    for root, dirs, files in os.walk(spec.prefix, topdown=True):
 | 
			
		||||
        dirs[:] = [d for d in dirs if d not in blacklist]
 | 
			
		||||
 | 
			
		||||
        # Directories may need to be relocated too.
 | 
			
		||||
        for directory in dirs:
 | 
			
		||||
            dir_path_name = os.path.join(root, directory)
 | 
			
		||||
            rel_path_name = os.path.relpath(dir_path_name, spec.prefix)
 | 
			
		||||
            if os.path.islink(dir_path_name):
 | 
			
		||||
                link = os.readlink(dir_path_name)
 | 
			
		||||
                if os.path.isabs(link) and link.startswith(spack.store.layout.root):
 | 
			
		||||
                    data['link_to_relocate'].append(rel_path_name)
 | 
			
		||||
 | 
			
		||||
        for filename in files:
 | 
			
		||||
            path_name = os.path.join(root, filename)
 | 
			
		||||
            m_type, m_subtype = relocate.mime_type(path_name)
 | 
			
		||||
 
 | 
			
		||||
@@ -200,12 +200,14 @@ def test_default_rpaths_create_install_default_layout(mirror_dir):
 | 
			
		||||
    into the default directory layout scheme.
 | 
			
		||||
    """
 | 
			
		||||
    gspec, cspec = Spec('garply').concretized(), Spec('corge').concretized()
 | 
			
		||||
    sy_spec = Spec('symly').concretized()
 | 
			
		||||
 | 
			
		||||
    # Install 'corge' without using a cache
 | 
			
		||||
    install_cmd('--no-cache', cspec.name)
 | 
			
		||||
    install_cmd('--no-cache', sy_spec.name)
 | 
			
		||||
 | 
			
		||||
    # Create a buildache
 | 
			
		||||
    buildcache_cmd('create', '-au', '-d', mirror_dir, cspec.name)
 | 
			
		||||
    buildcache_cmd('create', '-au', '-d', mirror_dir, cspec.name, sy_spec.name)
 | 
			
		||||
    # Test force overwrite create buildcache (-f option)
 | 
			
		||||
    buildcache_cmd('create', '-auf', '-d', mirror_dir, cspec.name)
 | 
			
		||||
 | 
			
		||||
@@ -219,7 +221,7 @@ def test_default_rpaths_create_install_default_layout(mirror_dir):
 | 
			
		||||
    uninstall_cmd('-y', '--dependents', gspec.name)
 | 
			
		||||
 | 
			
		||||
    # Test installing from build caches
 | 
			
		||||
    buildcache_cmd('install', '-au', cspec.name)
 | 
			
		||||
    buildcache_cmd('install', '-au', cspec.name, sy_spec.name)
 | 
			
		||||
 | 
			
		||||
    # This gives warning that spec is already installed
 | 
			
		||||
    buildcache_cmd('install', '-au', cspec.name)
 | 
			
		||||
@@ -247,10 +249,12 @@ def test_default_rpaths_install_nondefault_layout(mirror_dir):
 | 
			
		||||
    into the non-default directory layout scheme.
 | 
			
		||||
    """
 | 
			
		||||
    cspec = Spec('corge').concretized()
 | 
			
		||||
    # This guy tests for symlink relocation
 | 
			
		||||
    sy_spec = Spec('symly').concretized()
 | 
			
		||||
 | 
			
		||||
    # Install some packages with dependent packages
 | 
			
		||||
    # test install in non-default install path scheme
 | 
			
		||||
    buildcache_cmd('install', '-au', cspec.name)
 | 
			
		||||
    buildcache_cmd('install', '-au', cspec.name, sy_spec.name)
 | 
			
		||||
 | 
			
		||||
    # Test force install in non-default install path scheme
 | 
			
		||||
    buildcache_cmd('install', '-auf', cspec.name)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user