From d9fc4acc572c6647a4f27b838d35d27d805d190e Mon Sep 17 00:00:00 2001 From: Jason Stubbs Date: Sun, 28 Aug 2005 08:37:44 +0000 Subject: Migration (without history) of the current stable line to subversion. svn path=/main/branches/2.0/; revision=1941 --- bin/pkgmerge.new | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100755 bin/pkgmerge.new (limited to 'bin/pkgmerge.new') diff --git a/bin/pkgmerge.new b/bin/pkgmerge.new new file mode 100755 index 000000000..66dbe1676 --- /dev/null +++ b/bin/pkgmerge.new @@ -0,0 +1,84 @@ +#!/usr/bin/python +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-src/portage/bin/pkgmerge.new,v 1.7 2004/10/04 13:56:50 vapier Exp $ + +import os,string,sys +sys.path = ["/usr/lib/portage/pym"]+sys.path + +import portage,xpak + +#beautiful directed graph functions + +def dig_addnode(digraph,mykey,myprovides): + if not digraph.has_key(mykey): + if myprovides==None: + digraph[mykey]=[0,[]] + else: + digraph[mykey]=[0,[myprovides]] + digraph[myprovides][0]=digraph[myprovides][0]+1 + return + digraph[mykey]=[digraph[mykey][0],digraph[mykey][1].append(myprovides)] + +def dig_delnode(digraph,mykey): + if not digraph.has_key(mykey): + return + for x in digraph[mykey][1]: + digraph[x][0]=digraph[x][0]-1 + del digraph[mykey] + +def dig_firstzero(digraph): + for x in digraph.keys(): + if digraph[x][0]==0: + return x + return None + +#build our package digraph + +def digraph_create(digraph,mykey,myprovides=None): + mytbz2=xpak.tbz2(bintree.getname(mykey)) + mydep=mytbz2.getelements("RDEPEND") + dig_addnode(digraph,mykey,myprovides) + mycheck=roottree.depcheck(string.join(mydep," ")) + if mycheck[0]==0: + print "!!! Error: RDEPEND string formatted incorrectly:",mydep + return None + for x in mycheck[1]: + mymatch=bintree.dep_bestmatch(x) + if mymatch=="": + print "!!! Error: can't resolve dependency --",x + return None + if not digraph_create(digraph,mymatch,mykey): + return None + return 1 + +#main program loop +myvirtuals=portage.getvirtual(portage.root) +roottree=portage.vartree(portage.root,myvirtuals) +bintree=portage.binarytree("/",myvirtuals) +pretend=0 +if len(sys.argv)>=2: + if sys.argv[1]=="--pretend": + print "These are the packages that I would merge, in order:" + pretend=1 + del sys.argv[1] + elif sys.argv[1]=="--help": + print "Usage: pkgmerge [--pretend] pkg1.tbz2 [pkg2.tbz2]..." + sys.exit(1) +for mypkg in sys.argv[1:]: + digraph={} + mytbz2=xpak.tbz2(mypkg) + mykey=mytbz2.getelements("CATEGORY")[0]+"/"+mypkg[:-5] + digraph_create(digraph,mykey) + while (len(digraph)): + mykey=dig_firstzero(digraph) + if not mykey: + print "!!! Error: circular dependencies" + sys.exit(1) + mytbz2=bintree.getname(mykey) + if pretend: + print mytbz2 + else: + portage.pkgmerge(mytbz2) + dig_delnode(digraph,mykey) + -- cgit v1.2.3-1-g7c22