"PORTAGE_GID", "PORTAGE_INST_GID", "PORTAGE_INST_UID",
"PORTAGE_IUSE",
"PORTAGE_LOG_FILE", "PORTAGE_MASTER_PID",
- "PORTAGE_PYM_PATH", "PORTAGE_REPO_NAME", "PORTAGE_RESTRICT",
- "PORTAGE_TMPDIR", "PORTAGE_UPDATE_ENV", "PORTAGE_WORKDIR_MODE",
+ "PORTAGE_PYM_PATH", "PORTAGE_QUIET",
+ "PORTAGE_REPO_NAME", "PORTAGE_RESTRICT",
+ "PORTAGE_TMPDIR", "PORTAGE_UPDATE_ENV",
+ "PORTAGE_VERBOSE", "PORTAGE_WORKDIR_MODE",
"PORTDIR", "PORTDIR_OVERLAY", "PREROOTPATH", "PROFILE_PATHS",
"ROOT", "ROOTPATH", "STARTDIR", "T", "TMP", "TMPDIR",
"USE_EXPAND", "USE_ORDER", "WORKDIR",
filedict={}
primaryuri_indexes={}
primaryuri_dict = {}
+ thirdpartymirror_uris = {}
for myfile, myuri in file_uri_tuples:
if myfile not in filedict:
filedict[myfile]=[]
for cmirr in custommirrors[mirrorname]:
filedict[myfile].append(
cmirr.rstrip("/") + "/" + path)
- # remove the mirrors we tried from the list of official mirrors
- if cmirr.strip() in thirdpartymirrors[mirrorname]:
- thirdpartymirrors[mirrorname].remove(cmirr)
+
# now try the official mirrors
if mirrorname in thirdpartymirrors:
shuffle(thirdpartymirrors[mirrorname])
- for locmirr in thirdpartymirrors[mirrorname]:
- filedict[myfile].append(
- locmirr.rstrip("/") + "/" + path)
+ uris = [locmirr.rstrip("/") + "/" + path \
+ for locmirr in thirdpartymirrors[mirrorname]]
+ filedict[myfile].extend(uris)
+ thirdpartymirror_uris.setdefault(myfile, []).extend(uris)
if not filedict[myfile]:
writemsg("No known mirror by the name: %s\n" % (mirrorname))
primaryuri_dict[myfile] = primaryuris
primaryuris.append(myuri)
+ # Prefer thirdpartymirrors over normal mirrors in cases when
+ # the file does not yet exist on the normal mirrors.
+ for myfile, uris in thirdpartymirror_uris.iteritems():
+ primaryuri_dict.setdefault(myfile, []).extend(uris)
+
can_fetch=True
if listonly:
set(["clean", "cleanrm", "help", "prerm", "postrm"])
mycpv = mysettings["CATEGORY"] + "/" + mysettings["PF"]
dep_keys = ["DEPEND", "RDEPEND", "PDEPEND"]
- misc_keys = ["LICENSE", "PROVIDE", "RESTRICT", "SRC_URI"]
+ misc_keys = ["LICENSE", "PROPERTIES", "PROVIDE", "RESTRICT", "SRC_URI"]
other_keys = ["SLOT"]
all_keys = dep_keys + misc_keys + other_keys
metadata = dict(izip(all_keys, mydbapi.aux_get(mycpv, all_keys)))
["write_contents", "tar_contents"]
from portage.checksum import perform_md5
-from portage.const import CACHE_PATH, CONFIG_MEMORY_FILE, PORTAGE_BIN_PATH, \
+from portage.const import CACHE_PATH, CONFIG_MEMORY_FILE, \
PRIVATE_PATH, VDB_PATH, EPREFIX, EPREFIX_LSTRIP
from portage.data import portage_gid, portage_uid, secpass, ostype
from portage.dbapi import dbapi
-from portage.dep import dep_getslot, use_reduce, paren_reduce, isvalidatom, \
- isjustname, dep_getkey, match_from_list
-from portage.exception import InvalidAtom, InvalidData, InvalidPackageName, \
+from portage.dep import use_reduce, paren_reduce, isvalidatom, \
+ isjustname, dep_getkey
+from portage.exception import InvalidData, InvalidPackageName, \
FileNotFound, PermissionDenied, UnsupportedAPIException
from portage.locks import lockdir, unlockdir
from portage.output import bold, red, green
from portage.update import fixdbentries
from portage.util import apply_secpass_permissions, ConfigProtect, ensure_dirs, \
- writemsg, writemsg_stdout, writemsg_level, \
- write_atomic, atomic_ofstream, writedict, \
+ writemsg, writemsg_level, write_atomic, atomic_ofstream, writedict, \
grabfile, grabdict, normalize_path, new_protect_filename, getlibpaths
from portage.versions import pkgsplit, catpkgsplit, catsplit, best, pkgcmp
from portage.elog import elog_process
from portage.elog.filtering import filter_mergephases, filter_unmergephases
-import os, re, sys, stat, errno, commands, copy, time, subprocess
+import os, re, stat, errno, copy, subprocess
import logging
import shlex
from itertools import izip
return long(self.aux_get(mycpv, ["COUNTER"])[0])
except (KeyError, ValueError):
pass
- cdir = self.getpath(mycpv)
- cpath = self.getpath(mycpv, filename="COUNTER")
-
- # We write our new counter value to a new file that gets moved into
- # place to avoid filesystem corruption on XFS (unexpected reboot.)
- corrupted = 0
- if os.path.exists(cpath):
- cfile = open(cpath, "r")
- try:
- counter = long(cfile.readline())
- except ValueError:
- print "portage: COUNTER for", mycpv, "was corrupted; resetting to value of 0"
- counter = long(0)
- corrupted = 1
- cfile.close()
- elif os.path.exists(cdir):
- mys = pkgsplit(mycpv)
- myl = self.match(mys[0], use_cache=0)
- print mys, myl
- if len(myl) == 1:
- try:
- # Only one package... Counter doesn't matter.
- write_atomic(cpath, "1")
- counter = 1
- except SystemExit, e:
- raise
- except Exception, e:
- writemsg("!!! COUNTER file is missing for "+str(mycpv)+" in /var/db.\n",
- noiselevel=-1)
- writemsg("!!! Please run %s/fix-db.py or\n" % PORTAGE_BIN_PATH,
- noiselevel=-1)
- writemsg("!!! unmerge this exact version.\n", noiselevel=-1)
- writemsg("!!! %s\n" % e, noiselevel=-1)
- sys.exit(1)
- else:
- writemsg("!!! COUNTER file is missing for "+str(mycpv)+" in /var/db.\n",
- noiselevel=-1)
- writemsg("!!! Please run %s/fix-db.py or\n" % PORTAGE_BIN_PATH,
- noiselevel=-1)
- writemsg("!!! remerge the package.\n", noiselevel=-1)
- sys.exit(1)
- else:
- counter = long(0)
- if corrupted:
- # update new global counter file
- write_atomic(cpath, str(counter))
- return counter
+ writemsg_level(("portage: COUNTER for %s was corrupted; " + \
+ "resetting to value of 0\n") % (mycpv,),
+ level=logging.ERROR, noiselevel=-1)
+ return 0
def cpv_inject(self, mycpv):
"injects a real package into our on-disk database; assumes mycpv is valid and doesn't already exist"
self._lock_vdb = None
self.settings = mysettings
- if self.settings == 1:
- raise ValueError
+ self._verbose = self.settings.get("PORTAGE_VERBOSE") == "1"
self.myroot=myroot
protect_obj = ConfigProtect(myroot,
return os.EX_OK
def _display_merge(self, msg, level=0, noiselevel=0):
+ if not self._verbose and noiselevel >= 0 and level < logging.WARN:
+ return
if self._scheduler is not None:
self._scheduler.dblinkDisplayMerge(self, msg,
level=level, noiselevel=noiselevel)
# couldn't get merged will be added to thirdhand.
thirdhand = []
- self.mergeme(srcroot, destroot, outfile, thirdhand, secondhand, cfgfiledict, mymtime)
+ if self.mergeme(srcroot, destroot, outfile, thirdhand,
+ secondhand, cfgfiledict, mymtime):
+ return 1
#swap hands
lastlen = len(secondhand)
if len(secondhand):
# force merge of remaining symlinks (broken or circular; oh well)
- self.mergeme(srcroot, destroot, outfile, None, secondhand, cfgfiledict, mymtime)
+ if self.mergeme(srcroot, destroot, outfile, None,
+ secondhand, cfgfiledict, mymtime):
+ return 1
#restore umask
os.umask(prevmask)
"""
showMessage = self._display_merge
+ writemsg = self._display_merge
scheduler = self._scheduler
from os.path import sep, join
writemsg(red("!!! and ensure your filesystem is in a sane state. ")+bold("'shutdown -Fr now'\n"))
writemsg(red("!!! File: ")+str(mysrc)+"\n", noiselevel=-1)
writemsg(red("!!! Error: ")+str(e)+"\n", noiselevel=-1)
- sys.exit(1)
+ return 1
except Exception, e:
writemsg("\n")
writemsg(red("!!! ERROR: An unknown error has occurred during the merge process.\n"))
writemsg( "!!! this as a portage bug at bugs.gentoo.org. Append 'emerge info'.\n")
writemsg( "!!! File: "+str(mysrc)+"\n", noiselevel=-1)
writemsg( "!!! Error: "+str(e)+"\n", noiselevel=-1)
- sys.exit(1)
+ return 1
mymode = mystat[stat.ST_MODE]
showMessage(">>> %s -> %s\n" % (mydest, myto))
outfile.write("sym "+myrealdest+" -> "+myto+" "+str(mymtime)+"\n")
else:
- print "!!! Failed to move file."
- print "!!!", mydest, "->", myto
- sys.exit(1)
+ showMessage("!!! Failed to move file.\n",
+ level=logging.ERROR, noiselevel=-1)
+ showMessage("!!! %s -> %s\n" % (mydest, myto),
+ level=logging.ERROR, noiselevel=-1)
+ return 1
elif stat.S_ISDIR(mymode):
# we are merging a directory
if mydmode != None:
else:
# a non-directory and non-symlink-to-directory. Won't work for us. Move out of the way.
if movefile(mydest, mydest+".backup", mysettings=self.settings) is None:
- sys.exit(1)
- print "bak", mydest, mydest+".backup"
+ return 1
+ showMessage("bak %s %s.backup\n" % (mydest, mydest),
+ level=logging.ERROR, noiselevel=-1)
#now create our directory
if self.settings.selinux_enabled():
import selinux
if moveme:
mymtime = movefile(mysrc, mydest, newmtime=thismtime, sstat=mystat, mysettings=self.settings)
if mymtime is None:
- sys.exit(1)
+ return 1
zing = ">>>"
if mymtime != None:
if movefile(mysrc, mydest, newmtime=thismtime, sstat=mystat, mysettings=self.settings) != None:
zing = ">>>"
else:
- sys.exit(1)
+ return 1
if stat.S_ISFIFO(mymode):
outfile.write("fif %s\n" % myrealdest)
else: