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() |