Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 35934 | Differences between
and this patch

Collapse All | Expand All

(-)pym/portage.py.orig (-67 / +97 lines)
Lines 650-657 Link Here
650
				newprelink.write("-h "+x+"\n")
650
				newprelink.write("-h "+x+"\n")
651
		newprelink.close()
651
		newprelink.close()
652
652
653
	if not mtimedb.has_key("ldpath"):
653
	if not mtimedbdict["/"].has_key("ldpath"):
654
		mtimedb["ldpath"]={}
654
		mtimedbdict["/"]["ldpath"]={}
655
655
656
	for x in specials["LDPATH"]+['/usr/lib','/lib']:
656
	for x in specials["LDPATH"]+['/usr/lib','/lib']:
657
		if os.path.isdir(x):
657
		if os.path.isdir(x):
Lines 659-672 Link Here
659
				newldpathtime=os.stat(x)[ST_MTIME]
659
				newldpathtime=os.stat(x)[ST_MTIME]
660
			except:
660
			except:
661
				newldpathtime=0
661
				newldpathtime=0
662
			if mtimedb["ldpath"].has_key(x):
662
			if mtimedbdict["/"]["ldpath"].has_key(x):
663
				if mtimedb["ldpath"][x]==newldpathtime:
663
				if mtimedbdict["/"]["ldpath"][x]==newldpathtime:
664
					pass
664
					pass
665
				else:
665
				else:
666
					mtimedb["ldpath"][x]=newldpathtime
666
					mtimedbdict["/"]["ldpath"][x]=newldpathtime
667
					ld_cache_update=True
667
					ld_cache_update=True
668
			else:
668
			else:
669
				mtimedb["ldpath"][x]=newldpathtime
669
				mtimedbdict["/"]["ldpath"][x]=newldpathtime
670
				ld_cache_update=True
670
				ld_cache_update=True
671
671
672
	if (ld_cache_update):
672
	if (ld_cache_update):
Lines 6003-6059 Link Here
6003
		except OSError:
6003
		except OSError:
6004
			pass
6004
			pass
6005
	
6005
	
6006
def flushmtimedb(record):
6006
def flushmtimedb(record,myroot=root):
6007
	if mtimedb:
6007
	if myroot!=None and mtimedbdict.has_key(myroot):
6008
		if record in mtimedb.keys():
6008
		if record in mytimedbdict[myroot].keys():
6009
			del mtimedb[record]
6009
			del mytimedbdict[myroot][record]
6010
			#print "mtimedb["+record+"] is cleared."
6010
			#print "mtimedbdict["+myroot+"]["+record+"] is cleared."
6011
		else:
6011
		else:
6012
			writemsg("Invalid or unset record '"+record+"' in mtimedb.\n")
6012
			writemsg("Invalid or unset record '"+record+"' in mtimedb.\n")
6013
	else:
6014
		writemsg("No mtimedb found for root "+myroot+"\n")
6015
6013
6016
6014
#grab mtimes for eclasses and upgrades
6017
#grab mtimes for eclasses and upgrades
6015
mtimedb={}
6016
mtimedbkeys=[
6018
mtimedbkeys=[
6017
"updates", "info",
6019
"updates", "info",
6018
"version", "starttime",
6020
"version", "starttime",
6019
"resume", "ldpath"
6021
"resume", "ldpath"
6020
]
6022
]
6021
mtimedbfile=root+"var/cache/edb/mtimedb"
6023
mtimedbdict={}
6022
try:
6024
mtimedbdict[root]={}
6023
	mypickle=cPickle.Unpickler(open(mtimedbfile))
6025
if root!="/":
6024
	mypickle.find_global=None
6026
	mtimedbdict["/"]={}
6025
	mtimedb=mypickle.load()
6027
for mymtimedbroot in mtimedbdict.keys():
6026
	if mtimedb.has_key("old"):
6028
	mymtimedbfile=mymtimedbroot+"var/cache/edb/mtimedb"
6027
		mtimedb["updates"]=mtimedb["old"]
6029
	try:
6028
		del mtimedb["old"]
6030
		mypickle=cPickle.Unpickler(open(mymtimedbfile))
6029
	if mtimedb.has_key("cur"):
6031
		mypickle.find_global=None
6030
		del mtimedb["cur"]
6032
		mtimedbdict[mymtimedbroot]=mypickle.load()
6031
except:
6033
		if mtimedbdict[mymtimedbroot].has_key("old"):
6032
	#print "!!!",e
6034
			mtimedbdict[mymtimedbroot]["updates"]=mtimedbdict[mymtimedbroot]["old"]
6033
	mtimedb={"updates":{},"version":"","starttime":0}
6035
			del mtimedbdict[mymtimedbroot]["old"]
6034
6036
		if mtimedbdict[mymtimedbroot].has_key("cur"):
6035
for x in mtimedb.keys():
6037
			del mtimedbdict[mymtimedbroot]["cur"]
6036
	if x not in mtimedbkeys:
6038
	except:
6037
		writemsg("Deleting invalid mtimedb key: "+str(x)+"\n")
6039
		#print "!!!",e
6038
		del mtimedb[x]
6040
		mtimedbdict[mymtimedbroot]={"updates":{},"version":"","starttime":0}
6041
6042
	for x in mtimedbdict[mymtimedbroot].keys():
6043
		if x not in mtimedbkeys:
6044
			writemsg("Deleting invalid "+str(mymtimedbroot)+" mtimedb key: "+str(x)+"\n")
6045
			del mtimedbdict[mymtimedbroot][x]
6046
6047
# set portage.root mtimedb
6048
# XXX BIG WARNING: this is only a reference, set for emerge compatibility... 
6049
# XXX I've checked this vars are never reaffected, and it should be okay.
6050
# XXX But patching emerge would be safer. Sed does it very well:
6051
# XXX sed -i 's:portage\.mtimedb:portage.mtimedbdict[portage.root]:' bin/emerge
6052
mtimedb=mtimedbdict[root]
6039
6053
6040
#,"porttree":portagetree(root,virts),"bintree":binarytree(root,virts)}
6054
#,"porttree":portagetree(root,virts),"bintree":binarytree(root,virts)}
6041
features=settings["FEATURES"].split()
6055
features=settings["FEATURES"].split()
6042
6056
6043
do_upgrade_packagesmessage=0
6057
do_upgrade_packagesmessage=0
6044
def do_upgrade(mykey):
6058
def do_upgrade(mykey,myroot="/"):
6045
	global do_upgrade_packagesmessage
6059
	global do_upgrade_packagesmessage
6046
	writemsg("\n\n")
6060
	writemsg("\n\n")
6047
	writemsg(green("Performing Global Updates: ")+bold(mykey)+"\n")
6061
	writemsg(green("Performing Global Updates: ")+bold(mykey)+"\n")
6048
	writemsg("(Could take a couple minutes if you have a lot of binary packages.)\n")
6062
	writemsg("(Could take a couple minutes if you have a lot of binary packages.)\n")
6049
	writemsg("  "+bold(".")+"='update pass'  "+bold("*")+"='binary update'  "+bold("@")+"='/var/db move'\n"+"  "+bold("s")+"='/var/db SLOT move' "+bold("S")+"='binary SLOT move'\n")
6063
	# binaries updates are only for the "/" tree (no need to do them twice...)
6064
	if myroot=="/":
6065
		writemsg("  "+bold(".")+"='update pass'  "+bold("*")+"='binary update'  "+bold("@")+"='/var/db move'\n"+"  "+bold("s")+"='/var/db SLOT move' "+bold("S")+"='binary SLOT move'\n")
6066
	else:
6067
		writemsg("  "+bold(".")+"='update pass'  "+bold("@")+"='"+myroot+"var/db move'"+"  "+bold("s")+"='"+myroot+"var/db SLOT move'\n")
6050
	processed=1
6068
	processed=1
6051
	#remove stale virtual entries (mappings for packages that no longer exist)
6069
	#remove stale virtual entries (mappings for packages that no longer exist)
6052
	myvirts=grabdict("/var/cache/edb/virtuals")
6070
	myvirts=grabdict(myroot+"var/cache/edb/virtuals")
6053
	
6071
	
6054
	worldlist=grabfile("/var/cache/edb/world")
6072
	worldlist=grabfile(myroot+"var/cache/edb/world")
6055
	myupd=grabfile(mykey)
6073
	myupd=grabfile(mykey)
6056
	db["/"]["bintree"]=binarytree("/",settings["PKGDIR"],virts)
6074
	db[myroot]["bintree"]=binarytree("/",settings["PKGDIR"],virts)
6057
	for myline in myupd:
6075
	for myline in myupd:
6058
		mysplit=myline.split()
6076
		mysplit=myline.split()
6059
		if not len(mysplit):
6077
		if not len(mysplit):
Lines 6074-6081 Link Here
6074
		sys.stdout.flush()
6092
		sys.stdout.flush()
6075
6093
6076
		if mysplit[0]=="move":
6094
		if mysplit[0]=="move":
6077
			db["/"]["vartree"].dbapi.move_ent(mysplit)
6095
			db[myroot]["vartree"].dbapi.move_ent(mysplit)
6078
			db["/"]["bintree"].move_ent(mysplit)
6096
			# Do it only for "/" tree, since binaries are only there.
6097
			if myroot=="/":
6098
				db[myroot]["bintree"].move_ent(mysplit)
6079
			#update world entries:
6099
			#update world entries:
6080
			for x in range(0,len(worldlist)):
6100
			for x in range(0,len(worldlist)):
6081
				#update world entries, if any.
6101
				#update world entries, if any.
Lines 6089-6128 Link Here
6089
						myvirts[myvirt][mypos]=mysplit[2]
6109
						myvirts[myvirt][mypos]=mysplit[2]
6090
6110
6091
		elif mysplit[0]=="slotmove":
6111
		elif mysplit[0]=="slotmove":
6092
			db["/"]["vartree"].dbapi.move_slot_ent(mysplit)
6112
			db[myroot]["vartree"].dbapi.move_slot_ent(mysplit)
6093
			db["/"]["bintree"].move_slot_ent(mysplit,settings["PORTAGE_TMPDIR"]+"/tbz2")
6113
			# Do it only for "/" tree, since binaries are only there.
6114
			if myroot=="/":
6115
				db[myroot]["bintree"].move_slot_ent(mysplit,settings["PORTAGE_TMPDIR"]+"/tbz2")
6094
6116
6095
	# We gotta do the brute force updates for these now.
6117
	# We gotta do the brute force updates for these now.
6096
	if (settings["PORTAGE_CALLER"] in ["fixpackages"]) or \
6118
	# Do it only for "/" tree, since binaries are only there.
6097
	   ("fixpackages" in features):
6119
	if myroot=="/":
6098
		db["/"]["bintree"].update_ents(myupd,settings["PORTAGE_TMPDIR"]+"/tbz2")
6120
		if (settings["PORTAGE_CALLER"] in ["fixpackages"]) or \
6099
	else:
6121
		   ("fixpackages" in features):
6100
		do_upgrade_packagesmessage = 1
6122
			db[myroot]["bintree"].update_ents(myupd,settings["PORTAGE_TMPDIR"]+"/tbz2")
6123
		else:
6124
			do_upgrade_packagesmessage = 1
6101
	
6125
	
6102
	if processed:
6126
	if processed:
6103
		#update our internal mtime since we processed all our directives.
6127
		#update our internal mtime since we processed all our directives.
6104
		mtimedb["updates"][mykey]=os.stat(mykey)[ST_MTIME]
6128
		mtimedbdict[myroot]["updates"][mykey]=os.stat(mykey)[ST_MTIME]
6105
	myworld=open("/var/cache/edb/world","w")
6129
	myworld=open(myroot+"var/cache/edb/world","w")
6106
	for x in worldlist:
6130
	for x in worldlist:
6107
		myworld.write(x+"\n")
6131
		myworld.write(x+"\n")
6108
	myworld.close()
6132
	myworld.close()
6109
	writedict(myvirts,"/var/cache/edb/virtuals")
6133
	writedict(myvirts,myroot+"var/cache/edb/virtuals")
6110
	print ""
6134
	print ""
6111
6135
6112
def portageexit():
6136
def portageexit():
6113
	global uid,portage_gid,portdb
6137
	global uid,portage_gid,portdb
6114
	if secpass and not os.environ.has_key("SANDBOX_ACTIVE"):
6138
	if secpass and not os.environ.has_key("SANDBOX_ACTIVE"):
6115
		if mtimedb:
6139
		# both "/" and root mtimedbs should be saved
6116
		# Store mtimedb
6140
		for mymtimedbroot in mtimedbdict.keys():
6117
			mymfn=mtimedbfile
6141
			if mtimedbdict[mymtimedbroot]:
6118
			try:
6142
				# Store this mtimedb
6119
				mtimedb["version"]=VERSION
6143
				mymfn=mymtimedbroot+"var/cache/edb/mtimedb"
6120
				cPickle.dump(mtimedb,open(mymfn,"w"))
6144
				try:
6121
				#print "*** Wrote out mtimedb data successfully."
6145
					mtimedbdict[mymtimedbroot]["version"]=VERSION
6122
				os.chown(mymfn,uid,portage_gid)
6146
					cPickle.dump(mtimedbdict[mymtimedbroot],open(mymfn,"w"))
6123
				os.chmod(mymfn,0664)
6147
					#print "*** Wrote out "+mymtimedbroot+" mtimedb data successfully."
6124
			except Exception, e:
6148
					os.chown(mymfn,uid,portage_gid)
6125
				pass
6149
					os.chmod(mymfn,0664)
6150
				except Exception, e:
6151
					pass
6126
6152
6127
atexit.register(portageexit)
6153
atexit.register(portageexit)
6128
6154
Lines 6130-6157 Link Here
6130
	if settings["PORTAGE_CALLER"] in ["emerge","fixpackages"]:
6156
	if settings["PORTAGE_CALLER"] in ["emerge","fixpackages"]:
6131
		#only do this if we're root and not running repoman/ebuild digest
6157
		#only do this if we're root and not running repoman/ebuild digest
6132
		updpath=os.path.normpath(settings["PORTDIR"]+"///profiles/updates")
6158
		updpath=os.path.normpath(settings["PORTDIR"]+"///profiles/updates")
6133
		didupdate=0
6134
		if not mtimedb.has_key("updates"):
6135
			mtimedb["updates"]={}
6136
		try:
6159
		try:
6137
			mylist=listdir(updpath,EmptyOnError=1)
6160
			mylist=listdir(updpath,EmptyOnError=1)
6138
			# resort the list
6161
			# resort the list
6139
			mylist=[myfile[3:]+"-"+myfile[:2] for myfile in mylist]
6162
			mylist=[myfile[3:]+"-"+myfile[:2] for myfile in mylist]
6140
			mylist.sort()
6163
			mylist.sort()
6141
			mylist=[myfile[5:]+"-"+myfile[:4] for myfile in mylist]
6164
			mylist=[myfile[5:]+"-"+myfile[:4] for myfile in mylist]
6165
		except OSError:
6166
			#directory doesn't exist
6167
			pass
6168
		# both "/" and "root" trees should be upgraded
6169
		didupdate=0
6170
		for mymtimedbroot in mtimedbdict.keys():
6171
			if not mtimedbdict[mymtimedbroot].has_key("updates"):
6172
				mtimedbdict[mymtimedbroot]["updates"]={}
6142
			for myfile in mylist:
6173
			for myfile in mylist:
6143
				mykey=updpath+"/"+myfile
6174
				mykey=updpath+"/"+myfile
6144
				if not os.path.isfile(mykey):
6175
				if not os.path.isfile(mykey):
6145
					continue
6176
					continue
6146
				if (not mtimedb["updates"].has_key(mykey)) or \
6177
				if (not mtimedbdict[mymtimedbroot]["updates"].has_key(mykey)) or \
6147
					 (mtimedb["updates"][mykey] != os.stat(mykey)[ST_MTIME]) or \
6178
					 (mtimedbdict[mymtimedbroot]["updates"][mykey] != os.stat(mykey)[ST_MTIME]) or \
6148
					 (settings["PORTAGE_CALLER"] == "fixpackages"):
6179
					 (settings["PORTAGE_CALLER"] == "fixpackages"):
6149
					didupdate=1
6180
					didupdate=1
6150
					do_upgrade(mykey)
6181
					do_upgrade(mykey,myroot=mymtimedbroot)
6151
					portageexit() # This lets us save state for C-c.
6182
					portageexit() # This lets us save state for C-c.
6152
		except OSError:
6183
		# do_vartree can be done only once, it already takes care of both vartrees.
6153
			#directory doesn't exist
6184
		# And do_upgrade_packagesmessage is only about the "/" tree.
6154
			pass
6155
		if didupdate:
6185
		if didupdate:
6156
			#make sure our internal databases are consistent; recreate our virts and vartree
6186
			#make sure our internal databases are consistent; recreate our virts and vartree
6157
			do_vartree()
6187
			do_vartree()

Return to bug 35934