--- pym.orig/portage.py 2006-10-22 14:03:10.000000000 +0000 +++ pym/portage.py 2006-10-22 19:20:25.000000000 +0000 @@ -916,6 +916,9 @@ self.dirVirtuals = copy.deepcopy(clone.dirVirtuals) self.treeVirtuals = copy.deepcopy(clone.treeVirtuals) self.features = copy.deepcopy(clone.features) + + self.licensedict = copy.deepcopy(clone.licensedict) + self.plicensedict = copy.deepcopy(clone.plicensedict) else: # backupenv is for calculated incremental variables. @@ -1181,6 +1184,7 @@ self.pusedict = {} self.pkeywordsdict = {} + self.plicensedict = {} self.punmaskdict = {} abs_user_config = os.path.join(config_root, USER_CONFIG_PATH.lstrip(os.path.sep)) @@ -1233,6 +1237,16 @@ if not self.pkeywordsdict.has_key(cp): self.pkeywordsdict[cp] = {} self.pkeywordsdict[cp][key] = pkgdict[key] + + #package.license + licdict = grabdict_package( + os.path.join(abs_user_config, "package.license"), + recursive=1) + for key in licdict.keys(): + cp = dep_getkey(key) + if not self.plicensedict.has_key(cp): + self.plicensedict[cp] = {} + self.plicensedict[cp][key] = licdict[key] #package.unmask pkgunmasklines = grabfile_package( @@ -1326,6 +1340,10 @@ self.regenerate() self.features = portage_util.unique_array(self["FEATURES"].split()) + + self.licensedict = {} + for license in self["ACCEPT_LICENSE"].split(): + self.licensedict[license] = True if "gpg" in self.features: if not os.path.exists(self["PORTAGE_GPG_DIR"]) or \ @@ -1507,6 +1525,7 @@ self.modifying() if self.mycpv == mycpv: return + has_changed = False self.mycpv = mycpv cp = dep_getkey(mycpv) pkginternaluse = "" @@ -1523,7 +1542,10 @@ best_match = best_match_to_list(self.mycpv, cpdict.keys()) if best_match: defaults.append(cpdict[best_match]) - self.configdict["defaults"]["USE"] = " ".join(defaults) + defaults = " ".join(defaults) + if defaults != self.configdict["defaults"]["USE"]: + self.configdict["defaults"]["USE"] = defaults + has_changed = True useforce = [] for i in xrange(len(self.profiles)): useforce.append(self.useforce_list[i]) @@ -1532,7 +1554,10 @@ best_match = best_match_to_list(self.mycpv, cpdict.keys()) if best_match: useforce.append(cpdict[best_match]) - self.useforce = set(stack_lists(useforce, incremental=True)) + useforce = set(stack_lists(useforce, incremental=True)) + if useforce.symmetric_difference(self.useforce): + self.useforce = useforce + has_changed = True usemask = [] for i in xrange(len(self.profiles)): usemask.append(self.usemask_list[i]) @@ -1541,17 +1566,24 @@ best_match = best_match_to_list(self.mycpv, cpdict.keys()) if best_match: usemask.append(cpdict[best_match]) - self.usemask = set(stack_lists(usemask, incremental=True)) + usemask = set(stack_lists(usemask, incremental=True)) + if usemask.symmetric_difference(self.usemask): + self.usemask = usemask + has_changed = True + oldpuse = self.puse self.puse = "" if self.pusedict.has_key(cp): self.pusekey = best_match_to_list(self.mycpv, self.pusedict[cp].keys()) if self.pusekey: self.puse = " ".join(self.pusedict[cp][self.pusekey]) + if oldpuse != self.puse: + has_changed = True self.configdict["pkg"]["PKGUSE"] = self.puse[:] # For saving to PUSE file self.configdict["pkg"]["USE"] = self.puse[:] # this gets appended to USE # CATEGORY is essential for doebuild calls self.configdict["pkg"]["CATEGORY"] = mycpv.split("/")[0] - self.reset(keeping_pkg=1,use_cache=use_cache) + if has_changed: + self.reset(keeping_pkg=1,use_cache=use_cache) def setinst(self,mycpv,mydbapi): self.modifying() @@ -3424,9 +3456,7 @@ return_all_deps=False): """Takes an unreduced and reduced deplist and removes satisfied dependencies. Returned deplist contains steps that must be taken to satisfy dependencies.""" - if trees is None: - global db - trees = db + writemsg("ZapDeps -- %s\n" % (use_binaries), 2) if not reduced or unreduced == ["||"] or \ (not return_all_deps and dep_eval(reduced)): @@ -3447,6 +3477,17 @@ deps = unreduced[1:] satisfieds = reduced[1:] + if trees is None: + # We don't have trees to check availability against, so we + # just default to the first choice. + if isinstance(deps[0], list): + atoms = dep_zapdeps(deps[0], satisfieds[0], myroot, + use_binaries=use_binaries, trees=trees, + return_all_deps=return_all_deps) + else: + atoms = [deps[0]] + return atoms + # Our preference order is for an the first item that: # a) contains all unmasked packages with the same key as installed packages # b) contains all unmasked packages @@ -3551,7 +3592,8 @@ mydep, mydb=mydb, use_cache=use_cache, settings=settings) + postfix def dep_check(depstring, mydbapi, mysettings, use="yes", mode=None, myuse=None, - use_cache=1, use_binaries=0, myroot="/", trees=None, return_all_deps=False): + use_cache=1, use_binaries=0, myroot="/", trees=None, str_matches=None, + return_all_deps=False): """Takes a depend string and parses the condition.""" #check_config_instance(mysettings) @@ -3608,7 +3650,7 @@ #dependencies were reduced to nothing return [1,[]] mysplit2=mysplit[:] - mysplit2=dep_wordreduce(mysplit2,mysettings,mydbapi,mode,use_cache=use_cache) + mysplit2=dep_wordreduce(mysplit2,mysettings,mydbapi,mode,str_matches=str_matches,use_cache=use_cache) if mysplit2 is None: return [0,"Invalid token"] @@ -3629,19 +3671,23 @@ writemsg("mydict: %s\n" % (mydict), 1) return [1,mydict.keys()] -def dep_wordreduce(mydeplist,mysettings,mydbapi,mode,use_cache=1): +def dep_wordreduce(mydeplist,mysettings,mydbapi,mode,str_matches=None,use_cache=1): "Reduces the deplist to ones and zeros" mypos=0 deplist=mydeplist[:] while mypos