diff options
-rw-r--r-- | pym/portage/dbapi/vartree.py | 72 |
1 files changed, 37 insertions, 35 deletions
diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index abc557583..6c10b7866 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -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) |