aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'bin/pkgmerge.new')
-rwxr-xr-xbin/pkgmerge.new84
1 files changed, 84 insertions, 0 deletions
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)
+