Bug #216190 - Make dblink.treewalk() bail out rather than install a package
authorZac Medico <zmedico@gentoo.org>
Sat, 15 Nov 2008 04:12:00 +0000 (04:12 -0000)
committerZac Medico <zmedico@gentoo.org>
Sat, 15 Nov 2008 04:12:00 +0000 (04:12 -0000)
with file paths containing newlines.

svn path=/main/trunk/; revision=11918

pym/portage/dbapi/vartree.py

index d8e676e8cf7f998cf14e66add63f7e7eab2e643e..38d1081a41a4173eb92caa838ca2f89675b9ab7b 100644 (file)
@@ -3081,19 +3081,40 @@ class dblink(object):
 
                myfilelist = []
                mylinklist = []
+               paths_with_newlines = []
+               srcroot_len = len(srcroot)
                def onerror(e):
                        raise
                for parent, dirs, files in os.walk(srcroot, onerror=onerror):
                        for f in files:
                                file_path = os.path.join(parent, f)
+                               relative_path = file_path[srcroot_len:]
+
+                               if "\n" in relative_path:
+                                       paths_with_newlines.append(relative_path)
+
                                file_mode = os.lstat(file_path).st_mode
                                if stat.S_ISREG(file_mode):
-                                       myfilelist.append(file_path[len(srcroot):])
+                                       myfilelist.append(relative_path)
                                elif stat.S_ISLNK(file_mode):
                                        # Note: os.walk puts symlinks to directories in the "dirs"
                                        # list and it does not traverse them since that could lead
                                        # to an infinite recursion loop.
-                                       mylinklist.append(file_path[len(srcroot):])
+                                       mylinklist.append(relative_path)
+
+               if paths_with_newlines:
+                       msg = []
+                       msg.append("This package installs one or more files containing")
+                       msg.append("a newline (\\n) character:")
+                       msg.append("")
+                       paths_with_newlines.sort()
+                       for f in paths_with_newlines:
+                               msg.append("\t/%s" % (f.replace("\n", "\\n")))
+                       msg.append("")
+                       msg.append("package %s NOT merged" % self.mycpv)
+                       msg.append("")
+                       eerror(msg)
+                       return 1
 
                # If there are no files to merge, and an installed package in the same
                # slot has files, it probably means that something went wrong.