def test_simple_LinkPathAction_softlink(self): if not softlink_supported(__file__, self.prefix) and on_win: pytest.skip("softlink not supported") source_full_path = make_test_file(self.pkgs_dir) target_short_path = source_short_path = basename(source_full_path) correct_sha256 = compute_sha256sum(source_full_path) correct_size_in_bytes = getsize(source_full_path) path_type = PathType.hardlink source_path_data = PathDataV1( _path = source_short_path, path_type=path_type, sha256=correct_sha256, size_in_bytes=correct_size_in_bytes, ) axn = LinkPathAction({}, None, self.pkgs_dir, source_short_path, self.prefix, target_short_path, LinkType.softlink, source_path_data) assert axn.target_full_path == join(self.prefix, target_short_path) axn.verify() axn.execute() assert isfile(axn.target_full_path) assert islink(axn.target_full_path) assert stat_nlink(axn.target_full_path) == 1 axn.reverse() assert not lexists(axn.target_full_path) assert lexists(source_full_path)
def test_simple_LinkPathAction_softlink(self): if not softlink_supported(__file__, self.prefix) and on_win: pytest.skip("softlink not supported") source_full_path = make_test_file(self.pkgs_dir) target_short_path = source_short_path = basename(source_full_path) correct_sha256 = compute_sha256sum(source_full_path) correct_size_in_bytes = getsize(source_full_path) path_type = PathType.hardlink source_path_data = PathDataV1( _path = source_short_path, path_type=path_type, sha256=correct_sha256, size_in_bytes=correct_size_in_bytes, ) axn = LinkPathAction({}, None, self.pkgs_dir, source_short_path, self.prefix, target_short_path, LinkType.softlink, source_path_data) assert axn.target_full_path == join(self.prefix, target_short_path) axn.verify() axn.execute() assert isfile(axn.target_full_path) assert islink(axn.target_full_path) assert stat_nlink(axn.target_full_path) == 1 axn.reverse() assert not lexists(axn.target_full_path) assert lexists(source_full_path)
def test_soft_link(self): path1_real_file = join(self.test_dir, 'path1_real_file') path2_symlink = join(self.test_dir, 'path2_symlink') touch(path1_real_file) assert isfile(path1_real_file) assert not islink(path1_real_file) if not softlink_supported(path1_real_file, self.test_dir) and on_win: pytest.skip("softlink not supported") symlink(path1_real_file, path2_symlink) assert exists(path2_symlink) assert lexists(path2_symlink) assert islink(path2_symlink) assert readlink(path2_symlink).endswith(path1_real_file) # for win py27, readlink actually gives something that starts with \??\ # \??\c:\users\appveyor\appdata\local\temp\1\c571cb0c\path1_real_file assert stat_nlink(path1_real_file) == stat_nlink(path2_symlink) == 1 os.unlink(path1_real_file) assert not isfile(path1_real_file) assert not lexists(path1_real_file) assert not exists(path1_real_file) assert lexists(path2_symlink) if not (on_win and PY2): # I guess I'm not surprised this exist vs lexist is different for win py2 # consider adding a fix in the future assert not exists(path2_symlink) os.unlink(path2_symlink) assert not lexists(path2_symlink) assert not exists(path2_symlink)
def test_soft_link(self): path1_real_file = join(self.test_dir, 'path1_real_file') path2_symlink = join(self.test_dir, 'path2_symlink') touch(path1_real_file) assert isfile(path1_real_file) assert not islink(path1_real_file) if not softlink_supported(path1_real_file, self.test_dir) and on_win: pytest.skip("softlink not supported") symlink(path1_real_file, path2_symlink) assert exists(path2_symlink) assert lexists(path2_symlink) assert islink(path2_symlink) assert readlink(path2_symlink).endswith(path1_real_file) # Windows Python >3.7, readlink actually gives something that starts with \\?\ # \\?\C:\users\appveyor\appdata\local\temp\1\c571cb0c\path1_real_file assert os.lstat(path1_real_file).st_nlink == os.lstat( path2_symlink).st_nlink == 1 os.unlink(path1_real_file) assert not isfile(path1_real_file) assert not lexists(path1_real_file) assert not exists(path1_real_file) assert lexists(path2_symlink) assert not exists(path2_symlink) os.unlink(path2_symlink) assert not lexists(path2_symlink) assert not exists(path2_symlink)
def test_CompilePycAction_noarch_python(self): if not softlink_supported(__file__, self.prefix) and on_win: pytest.skip("softlink not supported") target_python_version = '%d.%d' % sys.version_info[:2] sp_dir = get_python_site_packages_short_path(target_python_version) transaction_context = { 'target_python_version': target_python_version, 'target_site_packages_short_path': sp_dir, } package_info = AttrDict(package_metadata=AttrDict(noarch=AttrDict(type=NoarchType.python))) file_link_actions = [ AttrDict( source_short_path='site-packages/something.py', target_short_path=get_python_noarch_target_path('site-packages/something.py', sp_dir), ), AttrDict( # this one shouldn't get compiled source_short_path='something.py', target_short_path=get_python_noarch_target_path('something.py', sp_dir), ), ] axns = CompilePycAction.create_actions(transaction_context, package_info, self.prefix, None, file_link_actions) assert len(axns) == 1 axn = axns[0] assert axn.source_full_path == join(self.prefix, win_path_ok(get_python_noarch_target_path('site-packages/something.py', sp_dir))) assert axn.target_full_path == join(self.prefix, win_path_ok(pyc_path(get_python_noarch_target_path('site-packages/something.py', sp_dir), target_python_version))) # make .py file in prefix that will be compiled mkdir_p(dirname(axn.source_full_path)) with open(axn.source_full_path, 'w') as fh: fh.write("value = 42\n") # symlink the current python python_full_path = join(self.prefix, get_python_short_path(target_python_version)) mkdir_p(dirname(python_full_path)) create_link(sys.executable, python_full_path, LinkType.softlink) axn.execute() assert isfile(axn.target_full_path) # remove the source .py file so we're sure we're importing the pyc file below rm_rf(axn.source_full_path) assert not isfile(axn.source_full_path) if (3,) > sys.version_info >= (3, 5): # we're probably dropping py34 support soon enough anyway imported_pyc_file = load_python_file(axn.target_full_path) assert imported_pyc_file.value == 42 axn.reverse() assert not isfile(axn.target_full_path)
def test_remove_link_to_file(): with tempdir() as td: dst_link = join(td, "test_link") src_file = join(td, "test_file") _write_file(src_file, "welcome to the ministry of silly walks") if not softlink_supported(src_file, td) and on_win: pytest.skip("softlink not supported") symlink(src_file, dst_link) assert isfile(src_file) assert not islink(src_file) assert islink(dst_link) assert rm_rf(dst_link) assert isfile(src_file) assert rm_rf(src_file) assert not isfile(src_file) assert not islink(dst_link) assert not lexists(dst_link)
def test_rm_rf_does_not_follow_symlinks(): with TemporaryDirectory() as tmp: # make a file in some temp folder real_file = os.path.join(tmp, 'testfile') with open(real_file, 'w') as f: f.write('weee') # make a subfolder subdir = os.path.join(tmp, 'subfolder') os.makedirs(subdir) # link to the file in the subfolder link_path = join(subdir, 'file_link') if not softlink_supported(real_file, tmp) and on_win: pytest.skip("softlink not supported") create_link(real_file, link_path, link_type=LinkType.softlink) assert islink(link_path) # rm_rf the subfolder rm_rf(subdir) # assert that the file still exists in the root folder assert os.path.isfile(real_file)
def test_remove_link_to_dir(): with tempdir() as td: dst_link = join(td, "test_link") src_dir = join(td, "test_dir") test_file = join(td, "test_file") mkdir_p(src_dir) touch(test_file) assert isdir(src_dir) assert not islink(src_dir) assert not islink(dst_link) if not softlink_supported(test_file, td) and on_win: pytest.skip("softlink not supported") symlink(src_dir, dst_link) assert islink(dst_link) assert rm_rf(dst_link) assert not isdir(dst_link) assert not islink(dst_link) assert not lexists(dst_link) assert isdir(src_dir) assert rm_rf(src_dir) assert not isdir(src_dir) assert not islink(src_dir)
def test_soft_link(self): path1_real_file = join(self.test_dir, 'path1_real_file') path2_symlink = join(self.test_dir, 'path2_symlink') touch(path1_real_file) assert isfile(path1_real_file) assert not islink(path1_real_file) if not softlink_supported(path1_real_file, self.test_dir) and on_win: pytest.skip("softlink not supported") symlink(path1_real_file, path2_symlink) assert exists(path2_symlink) assert lexists(path2_symlink) assert islink(path2_symlink) assert readlink(path2_symlink).endswith(path1_real_file) # for win py27, readlink actually gives something that starts with \??\ # \??\c:\users\appveyor\appdata\local\temp\1\c571cb0c\path1_real_file assert stat_nlink(path1_real_file) == stat_nlink(path2_symlink) == 1 os.unlink(path1_real_file) assert not isfile(path1_real_file) assert not lexists(path1_real_file) assert not exists(path1_real_file) assert lexists(path2_symlink) if not (on_win and PY2): # I guess I'm not surprised this exist vs lexist is different for win py2 # consider adding a fix in the future assert not exists(path2_symlink) os.unlink(path2_symlink) assert not lexists(path2_symlink) assert not exists(path2_symlink)
def test_CompileMultiPycAction_noarch_python(self): if not softlink_supported(__file__, self.prefix) and on_win: pytest.skip("softlink not supported") target_python_version = '%d.%d' % sys.version_info[:2] sp_dir = get_python_site_packages_short_path(target_python_version) transaction_context = { 'target_python_version': target_python_version, 'target_site_packages_short_path': sp_dir, } package_info = AttrDict(package_metadata=AttrDict(noarch=AttrDict(type=NoarchType.python))) file_link_actions = [ AttrDict( source_short_path='site-packages/something.py', target_short_path=get_python_noarch_target_path('site-packages/something.py', sp_dir), ), AttrDict( source_short_path='site-packages/another.py', target_short_path=get_python_noarch_target_path('site-packages/another.py', sp_dir), ), AttrDict( # this one shouldn't get compiled source_short_path='something.py', target_short_path=get_python_noarch_target_path('something.py', sp_dir), ), AttrDict( # this one shouldn't get compiled source_short_path='another.py', target_short_path=get_python_noarch_target_path('another.py', sp_dir), ), ] axns = CompileMultiPycAction.create_actions(transaction_context, package_info, self.prefix, None, file_link_actions) assert len(axns) == 1 axn = axns[0] source_full_paths = tuple(axn.source_full_paths) source_full_path0 = source_full_paths[0] source_full_path1 = source_full_paths[1] assert len(source_full_paths) == 2 assert source_full_path0 == join(self.prefix, win_path_ok(get_python_noarch_target_path('site-packages/something.py', sp_dir))) assert source_full_path1 == join(self.prefix, win_path_ok(get_python_noarch_target_path('site-packages/another.py', sp_dir))) target_full_paths = tuple(axn.target_full_paths) target_full_path0 = target_full_paths[0] target_full_path1 = target_full_paths[1] assert len(target_full_paths) == 2 assert target_full_path0 == join(self.prefix, win_path_ok(pyc_path(get_python_noarch_target_path('site-packages/something.py', sp_dir), target_python_version))) assert target_full_path1 == join(self.prefix, win_path_ok(pyc_path(get_python_noarch_target_path('site-packages/another.py', sp_dir), target_python_version))) # make .py file in prefix that will be compiled mkdir_p(dirname(source_full_path0)) with open(source_full_path0, 'w') as fh: fh.write("value = 42\n") mkdir_p(dirname(source_full_path1)) with open(source_full_path1, 'w') as fh: fh.write("value = 43\n") # symlink the current python python_full_path = join(self.prefix, get_python_short_path(target_python_version)) mkdir_p(dirname(python_full_path)) create_link(sys.executable, python_full_path, LinkType.softlink) axn.execute() assert isfile(target_full_path0) assert isfile(target_full_path1) # remove the source .py file so we're sure we're importing the pyc file below rm_rf(source_full_path0) assert not isfile(source_full_path0) rm_rf(source_full_path1) assert not isfile(source_full_path1) if (3,) > sys.version_info >= (3, 5): # we're probably dropping py34 support soon enough anyway imported_pyc_file = load_python_file(target_full_path0) assert imported_pyc_file.value == 42 imported_pyc_file = load_python_file(target_full_path1) assert imported_pyc_file.value == 43 axn.reverse() assert not isfile(target_full_path0) assert not isfile(target_full_path1)