Rewrite the dblink.getcontents() code to use str.split(" ")
authorZac Medico <zmedico@gentoo.org>
Mon, 29 Oct 2007 05:22:39 +0000 (05:22 -0000)
committerZac Medico <zmedico@gentoo.org>
Mon, 29 Oct 2007 05:22:39 +0000 (05:22 -0000)
for splitting CONTENTS lines so that even file paths that
end with spaces can be handled. This patch makes the fix for
bug #196836#c6 more complete. Some code for parsing old
malformed symlink entries has been removed sinces it's
probably not useful or worth maintaining anymore.

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

pym/portage/dbapi/vartree.py

index abc557583bf5b771b470d156a7a4d7742a2e9f1c..6c10b786682738dbcc869906979e09ce8a4a43d2 100644 (file)
@@ -970,23 +970,38 @@ class dblink(object):
                                        "file, line %d: '%s'\n" % (pos, contents_file),
                                        noiselevel=-1)
                                continue
-                       mydat = line.split()
-                       correct_split_count = None
-                       if mydat:
-                               correct_split_count = contents_split_counts.get(mydat[0])
-                       if correct_split_count and len(mydat) != correct_split_count:
-                               if mydat[0] == "obj" and \
-                                       len(mydat) > contents_split_counts["obj"]:
-                                       # File name contains spaces. Use field widths to infer the
-                                       # start and end points so that even multiple consecutive
-                                       # spaces are parsed correctly.
-                                       newsplit = ["obj"]
-                                       filename_start = len(mydat[0]) + 1
-                                       filename_end = len(line.rstrip()) - \
-                                               len(mydat[-1]) - len(mydat[-2]) - 2
-                                       newsplit.append(line[filename_start:filename_end])
-                                       newsplit.extend(mydat[-2:])
-                                       mydat = newsplit
+                       if line.endswith("\n"):
+                               line = line[:-1]
+                       # Split on " " so that even file paths that
+                       # end with spaces can be handled.
+                       mydat = line.split(" ")
+                       entry_type = mydat[0] # empty string if line is empty
+                       correct_split_count = contents_split_counts.get(entry_type)
+                       if correct_split_count and len(mydat) > correct_split_count:
+                               # Apparently file paths contain spaces, so reassemble
+                               # the split have the correct_split_count.
+                               newsplit = [entry_type]
+                               spaces_total = len(mydat) - correct_split_count
+                               if entry_type == "sym":
+                                       try:
+                                               splitter = mydat.index("->", 2, len(mydat) - 2)
+                                       except ValueError:
+                                               writemsg("!!! Unrecognized CONTENTS entry on " + \
+                                                       "line %d: '%s'\n" % (pos, line), noiselevel=-1)
+                                               continue
+                                       spaces_in_path = splitter - 2
+                                       spaces_in_target = spaces_total - spaces_in_path
+                                       newsplit.append(" ".join(mydat[1:splitter]))
+                                       newsplit.append("->")
+                                       target_end = splitter + spaces_in_target + 2
+                                       newsplit.append(" ".join(mydat[splitter + 1:target_end]))
+                                       newsplit.extend(mydat[target_end:])
+                               else:
+                                       path_end = spaces_total + 2
+                                       newsplit.append(" ".join(mydat[1:path_end]))
+                                       newsplit.extend(mydat[path_end:])
+                               mydat = newsplit
+
                        # we do this so we can remove from non-root filesystems
                        # (use the ROOT var to allow maintenance on other partitions)
                        try:
@@ -998,32 +1013,19 @@ class dblink(object):
                                        mydat[1] = os.path.join(myroot, mydat[1].lstrip(os.path.sep))
                                if mydat[0] == "obj":
                                        #format: type, mtime, md5sum
-                                       pkgfiles[mydat[1]] = [mydat[0], mydat[-1], mydat[-2]]
+                                       pkgfiles[mydat[1]] = [mydat[0], mydat[3], mydat[2]]
                                elif mydat[0] == "dir":
                                        #format: type
-                                       pkgfiles[" ".join(mydat[1:])] = [mydat[0] ]
+                                       pkgfiles[mydat[1]] = [mydat[0]]
                                elif mydat[0] == "sym":
                                        #format: type, mtime, dest
-                                       x = len(mydat) - 1
-                                       if (x >= 13) and (mydat[-1][-1] == ')'): # Old/Broken symlink entry
-                                               mydat = mydat[:-10] + [mydat[-10:][stat.ST_MTIME][:-1]]
-                                               writemsg("FIXED SYMLINK LINE: %s\n" % mydat, 1)
-                                               x = len(mydat) - 1
-                                       splitter = -1
-                                       while (x >= 0):
-                                               if mydat[x] == "->":
-                                                       splitter = x
-                                                       break
-                                               x = x - 1
-                                       if splitter == -1:
-                                               return None
-                                       pkgfiles[" ".join(mydat[1:splitter])] = [mydat[0], mydat[-1], " ".join(mydat[(splitter+1):-1])]
+                                       pkgfiles[mydat[1]] = [mydat[0], mydat[4], mydat[3]]
                                elif mydat[0] == "dev":
                                        #format: type
-                                       pkgfiles[" ".join(mydat[1:])] = [mydat[0] ]
+                                       pkgfiles[mydat[1]] = [mydat[0]]
                                elif mydat[0]=="fif":
                                        #format: type
-                                       pkgfiles[" ".join(mydat[1:])] = [mydat[0]]
+                                       pkgfiles[mydat[1]] = [mydat[0]]
                                else:
                                        writemsg("!!! Unrecognized CONTENTS entry on " + \
                                                "line %d: '%s'\n" % (pos, line), noiselevel=-1)