if newconf == mrgconf and \
self.options.get('ignore-previously-merged') != 'yes' and \
- len(commands.getoutput(DIFF_CONTENTS % (conf['current'], mrgconf))) == 0:
+ os.path.exists(archive+'.dist') and \
+ len(commands.getoutput(DIFF_CONTENTS % (archive+'.dist', conf['new']))) == 0:
# The current update is identical to the archived .dist
# version that has previously been merged.
os.unlink(mrgconf)
from portage.manifest import Manifest
from portage.exception import ParseError
-from portage.process import spawn
+from portage.process import find_binary, spawn
from portage.output import bold, darkgreen, darkred, green, nocolor, red, turquoise, yellow
fails[x]=[]
xmllint_capable = False
metadata_dtd = os.path.join(repoman_settings["DISTDIR"], 'metadata.dtd')
-if getstatusoutput('which xmllint')[0] != 0:
+if mymode == "manifest":
+ pass
+elif not find_binary('xmllint'):
print red("!!! xmllint not found. Can't check metadata.xml.\n")
if "--xmlparse" in myoptions or repolevel==3:
print red("!!!")+" sorry, xmllint is needed. failing\n"
def load_best_module(self,property_string):
best_mod = best_from_dict(property_string,self.modules,self.module_priority)
+ mod = None
try:
mod = load_mod(best_mod)
except ImportError:
- dump_traceback(red("Error: Failed to import module '%s'") % best_mod, noiselevel=0)
- sys.exit(1)
+ if best_mod.startswith("cache."):
+ best_mod = "portage." + best_mod
+ try:
+ mod = load_mod(best_mod)
+ except ImportError:
+ pass
+ if mod is None:
+ raise
return mod
def lock(self):
d["MTIME"] = str(long(s.st_mtime))
d["SIZE"] = str(s.st_size)
d["MD5"] = str(md5)
+ keys = ["USE", "IUSE", "DESCRIPTION", "LICENSE", "PROVIDE", \
+ "RDEPEND", "DEPEND", "PDEPEND"]
+ from itertools import izip
+ d.update(izip(keys, self.dbapi.aux_get(cpv, keys)))
+ use = d["USE"].split()
+ iuse = set(d["IUSE"].split())
+ use = [f for f in use if f in iuse]
+ del iuse, d["IUSE"]
+ use.sort()
+ d["USE"] = " ".join(use)
+ d["DESC"] = d["DESCRIPTION"]
+ del d["DESCRIPTION"]
+ from portage.dep import paren_reduce, use_reduce, \
+ paren_normalize, paren_enclose
+ for k in "LICENSE", "RDEPEND", "DEPEND", "PDEPEND", "PROVIDE":
+ deps = paren_reduce(d[k])
+ deps = use_reduce(deps, uselist=use)
+ deps = paren_normalize(deps)
+ deps = paren_enclose(deps)
+ if deps:
+ d[k] = deps
+ else:
+ del d[k]
pkgindex.packages[cpv] = d
from portage.util import atomic_ofstream
f = atomic_ofstream(os.path.join(self.pkgdir, "Packages"))
pass
def close_caches(self):
+ if not hasattr(self, "auxdb"):
+ # unhandled exception thrown from constructor
+ return
for x in self.auxdb.keys():
self.auxdb[x].sync()
self.auxdb.clear()
if gp == "*" or (gp == "-*" and len(mygroups) == 1):
writemsg("--- WARNING: Package '%s' uses '%s' keyword.\n" % (mycpv, gp),
noiselevel=-1)
- match=1
- break
+ if gp == "*":
+ match = 1
+ break
elif gp in pgroups:
match=1
break
mylist = mylist + [subsec]
return mylist
+class paren_normalize(list):
+ """Take a dependency structure as returned by paren_reduce or use_reduce
+ and generate an equivalent structure that has no redundant lists."""
+ def __init__(self, src):
+ list.__init__(self)
+ self._zap_parens(src, self)
+
+ def _zap_parens(self, src, dest, disjunction=False):
+ if not src:
+ return dest
+ i = iter(src)
+ for x in i:
+ if isinstance(x, basestring):
+ if x == '||':
+ x = self._zap_parens(i.next(), [], disjunction=True)
+ if len(x) == 1:
+ dest.append(x[0])
+ else:
+ dest.append("||")
+ dest.append(x)
+ elif x.endswith("?"):
+ dest.append(x)
+ dest.append(self._zap_parens(i.next(), []))
+ else:
+ dest.append(x)
+ else:
+ if disjunction:
+ x = self._zap_parens(x, [])
+ if len(x) == 1:
+ dest.append(x[0])
+ else:
+ dest.append(x)
+ else:
+ self._zap_parens(x, dest)
+ return dest
+
def paren_enclose(mylist):
"""
Convert a list to a string with sublists enclosed with parens.
import time
self.header["TIMESTAMP"] = str(long(time.time()))
self.header["PACKAGES"] = str(len(cpv_all))
- writepkgindex(pkgfile, self.header.iteritems())
+ keys = self.header.keys()
+ keys.sort()
+ writepkgindex(pkgfile, [(k, self.header[k]) for k in keys])
for cpv in cpv_all:
- metadata = self.packages[cpv]
- if metadata["SLOT"] == "0":
- metadata = metadata.copy()
+ metadata = self.packages[cpv].copy()
+ if metadata.get("SLOT") == "0":
del metadata["SLOT"]
- writepkgindex(pkgfile, metadata.iteritems())
+ if metadata.get("USE") == "":
+ del metadata["USE"]
+ keys = metadata.keys()
+ keys.sort()
+ writepkgindex(pkgfile, [(k, metadata[k]) for k in keys])