Package: piuparts
Version: 0.30
Severity: normal
Tags: patch
When checking for broken symlinks, piuparts does not correctly resolve
symlinks in relative paths. e.g.:
1m59.1s ERROR: Broken symlinks:
/usr/share/doc/libttf2/docs/GPL.txt -> ../../../common-licenses/GPL
This happens, because GPL.txt is a relative symlink and GPL as well,
spanning different directory levels. Resolving the relative symlink
of GPL.txt works, but on the next iteration, the resolving for the
GPL symlink fails.
See the attached patch, containing the unit test testMultiLevelNestedSymlinks()
and a one-line-fix to this problem.
-- System Information:
Debian Release: lenny/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: i386 (i686)
Kernel: Linux 2.6.24-1-686 (SMP w/1 CPU core)
Locale: LANG=de_AT.UTF-8, LC_CTYPE=de_AT.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Versions of packages piuparts depends on:
ii apt 0.7.11 Advanced front-end for dpkg
ii debootstrap 1.0.8 Bootstrap a basic Debian system
ii lsb-release 3.1-24 Linux Standard Base version report
ii lsof 4.78.dfsg.1-4 List open files
ii python 2.4.4-6 An interactive high-level object-o
ii python-debian 0.1.9 python modules to work with Debian
piuparts recommends no packages.
-- no debconf information
Binärdateien piuparts-0.30.orig/piupartslib/conf.pyc and
piuparts-symlinks/piupartslib/conf.pyc sind verschieden.
Binärdateien piuparts-0.30.orig/piupartslib/dependencyparser.pyc and
piuparts-symlinks/piupartslib/dependencyparser.pyc sind verschieden.
Binärdateien piuparts-0.30.orig/piupartslib/__init__.pyc and
piuparts-symlinks/piupartslib/__init__.pyc sind verschieden.
Binärdateien piuparts-0.30.orig/piupartslib/packagesdb.pyc and
piuparts-symlinks/piupartslib/packagesdb.pyc sind verschieden.
diff -Nur piuparts-0.30.orig/piuparts.py piuparts-symlinks/piuparts.py
--- piuparts-0.30.orig/piuparts.py 2008-04-29 23:04:34.000000000 +0200
+++ piuparts-symlinks/piuparts.py 2008-04-29 23:48:30.000000000 +0200
@@ -447,7 +447,7 @@
if os.path.isabs(target):
pathname = os.path.join(root, target[1:]) # Assume Unix filenames
else:
- pathname = os.path.join(dirpath, target)
+ pathname = os.path.join(os.path.dirname(pathname), target)
# The symlink chain, if any, has now been resolved. Does the target
# exist?
@@ -476,9 +476,7 @@
self.symlink("/absolute-works", "absolute-works-to-symlink")
def tearDown(self):
- for symlink in self.symlinks:
- os.remove(symlink)
- os.rmdir(self.testdir)
+ shutil.rmtree(self.testdir)
def testRelativeBroken(self):
self.failUnless(is_broken_symlink(self.testdir, self.testdir,
@@ -512,6 +510,15 @@
self.failIf(is_broken_symlink(self.testdir, self.testdir,
"absolute-works-to-symlink"))
+ def testMultiLevelNestedSymlinks(self):
+ # target/first-link -> ../target/second-link -> ../target
+
+ os.mkdir(os.path.join(self.testdir, "target"))
+ self.symlink("../target", "target/second-link")
+ self.symlink("../target/second-link", "target/first-link")
+ self.failIf(is_broken_symlink(self.testdir, self.testdir,
+ "target/first-link"))
+
class Chroot: