linker: Drop ability to link dirs recursively

Nothing in the code base uses this functionality, and the semantins are
not well defined anyway when it comes to symlinks.

Now the tests are failing in Python 3.14 rebuild when hardlinking
symlinks. Rather than trying to fix the unused code, we could just drop
it.

Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2367780
Signed-off-by: Lubomír Sedlář <lsedlar@redhat.com>
(cherry picked from commit ab11e0e4a9e0b70e1b78399931d357f92f3a27aa)
This commit is contained in:
Lubomír Sedlář 2025-05-21 15:42:51 +02:00 committed by Stepan Oksanichenko
parent 37479bbc6a
commit e765db157f
2 changed files with 3 additions and 83 deletions

View File

@ -228,20 +228,7 @@ class Linker(kobo.log.LoggingBase):
raise ValueError("Unknown link_type: %s" % link_type) raise ValueError("Unknown link_type: %s" % link_type)
def link(self, src, dst, link_type="hardlink-or-copy"): def link(self, src, dst, link_type="hardlink-or-copy"):
"""Link directories recursively.""" if os.path.isdir(src):
if os.path.isfile(src) or os.path.islink(src): raise RuntimeError("Linking directories recursively is not supported")
self._link_file(src, dst, link_type) self._link_file(src, dst, link_type)
return
if os.path.isfile(dst):
raise OSError(errno.EEXIST, "File exists")
if not self.test:
if not os.path.exists(dst):
makedirs(dst)
shutil.copystat(src, dst)
for i in os.listdir(src):
src_path = os.path.join(src, i)
dst_path = os.path.join(dst, i)
self.link(src_path, dst_path, link_type)

View File

@ -280,70 +280,3 @@ class TestLinkerLink(TestLinkerBase):
self.file2, self.file2,
link_type="hardlink-or-copy", link_type="hardlink-or-copy",
) )
def test_link_dir_hardlink(self):
self.linker.link(self.src_dir, self.dst_dir, link_type="hardlink")
self.assertTrue(os.path.isfile(self.dst_file1))
self.assertTrue(self.same_inode(self.file1, self.dst_file1))
self.assertTrue(self.same_inode(self.file3, self.dst_file3))
self.assertSameStat(
os.path.dirname(self.file3), os.path.dirname(self.dst_file3)
)
# always preserve symlinks
self.assertEqual(os.readlink(self.dst_symlink1), "../file1")
self.assertEqual(os.readlink(self.dst_symlink2), "subdir")
self.assertEqual(os.readlink(self.dst_symlink3), "does-not-exist")
def test_link_dir_copy(self):
self.linker.link(self.src_dir, self.dst_dir, link_type="copy")
self.assertTrue(os.path.isfile(self.dst_file1))
self.assertFalse(self.same_inode(self.file1, self.dst_file1))
self.assertFalse(self.same_inode(self.file3, self.dst_file3))
self.assertSameStat(
os.path.dirname(self.file3), os.path.dirname(self.dst_file3)
)
# always preserve symlinks
self.assertEqual(os.readlink(self.dst_symlink1), "../file1")
self.assertEqual(os.readlink(self.dst_symlink2), "subdir")
self.assertEqual(os.readlink(self.dst_symlink3), "does-not-exist")
def test_link_dir_copy_test_mode(self):
# turn test mode on
self.linker = linker.Linker(logger=self.logger, test=True)
self.linker.link(self.src_dir, self.dst_dir, link_type="copy")
# dst_dir should not even exist
self.assertFalse(os.path.isdir(self.dst_dir))
def test_link_dir_symlink(self):
self.linker.link(self.src_dir, self.dst_dir, link_type="symlink")
self.assertTrue(os.path.isfile(self.dst_file1))
self.assertTrue(os.path.islink(self.dst_file1))
self.assertTrue(os.path.isdir(os.path.dirname(self.file3)))
# always preserve symlinks
self.assertEqual(os.readlink(self.dst_symlink1), "../file1")
self.assertEqual(os.readlink(self.dst_symlink2), "subdir")
self.assertEqual(os.readlink(self.dst_symlink3), "does-not-exist")
def test_link_dir_abspath_symlink(self):
self.linker.link(self.src_dir, self.dst_dir, link_type="abspath-symlink")
self.assertTrue(os.path.isfile(self.dst_file1))
self.assertTrue(os.path.islink(self.dst_file1))
self.assertEqual(os.readlink(self.dst_file1), self.file1)
self.assertSameStat(
os.path.dirname(self.file3), os.path.dirname(self.dst_file3)
)
self.assertTrue(os.path.isdir(os.path.dirname(self.file3)))
# always preserve symlinks
self.assertEqual(os.readlink(self.dst_symlink1), "../file1")
self.assertEqual(os.readlink(self.dst_symlink2), "subdir")
self.assertEqual(os.readlink(self.dst_symlink3), "does-not-exist")
def test_copy_preserve_hardlinks(self):
self.assertTrue(self.same_inode(self.file1, self.hardlink1))
self.linker.link(self.src_dir, self.dst_dir, link_type="copy")
self.assertTrue(self.same_inode(self.dst_file1, self.dst_hardlink1))