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:
 

Reply via email to