| #!/usr/bin/python |
| # Copyright 1999-2006 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| # $Id$ |
| |
| 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) |
| |