unset BIN_PATH BIN BODY FUNC_SRC
fi
-if hasq ${EBUILD_SH_ARGS} clean ; then
- true
-elif ! hasq ${EBUILD_PHASE} depend && [ -f "${T}"/environment ] ; then
+if ! hasq ${EBUILD_PHASE} clean depend && \
+ [ -f "${T}"/environment ] ; then
# The environment may have been extracted from environment.bz2 or
# may have come from another version of ebuild.sh or something.
# In any case, preprocess it to prevent any potential interference.
export SANDBOX_ON=${PORTAGE_SANDBOX_ON}
unset PORTAGE_SANDBOX_ON
source_all_bashrcs
-else
+fi
+if ! hasq ${EBUILD_PHASE} clean && \
+ ( [ ! -f "${T}"/environment ] || hasq noauto ${FEATURES} ) ; then
# The bashrcs get an opportunity here to set aliases that will be expanded
# during sourcing of ebuilds and eclasses.
source_all_bashrcs
emerge --metadata
fi
[ -x "${EPREFIX}"/etc/portage/bin/post_sync ] && "${EPREFIX}"/etc/portage/bin/post_sync
+ return 0
}
do_snapshot() {
fails["digest.partial"].append(y+"::"+myf)
elif "assume-digests" not in repoman_settings.features:
if os.path.exists(myff):
- if not portage.checksum.verify_all(myff, mydigests[myf]):
+ if not portage.checksum.verify_all(myff, mydigests[myf])[0]:
stats["digest.fail"] += 1
fails["digest.fail"].append(y+"::"+myf)
elif repolevel == 3:
print " "+yellow("*")+" Processed",icount,"info files;",badcount,"errors."
print errmsg
else:
- print " "+green("*")+" Processed",icount,"info files."
+ if icount > 0:
+ print " "+green("*")+" Processed",icount,"info files."
def display_news_notification(trees):
xterm_titles = "notitles" not in settings.features
emergelog(xterm_titles, " === regen")
#regenerate cache entries
- print "Regenerating cache entries... "
+ portage.writemsg_stdout("Regenerating cache entries...\n")
try:
os.close(sys.stdin.fileno())
except SystemExit, e:
try:
dead_nodes[mytree] = set(portdb.auxdb[mytree].iterkeys())
except CacheError, e:
- print "\n error listing cache entries for " + \
+ print "Error listing cache entries for " + \
"'%s': %s, continuing..." % (mytree, e)
del e
dead_nodes = None
break
for x in mynodes:
mymatches = portdb.cp_list(x)
- portage.writemsg_stdout("processing %s\n" % x)
+ portage.writemsg_stdout("Processing %s\n" % x)
for y in mymatches:
try:
foo = portdb.aux_get(y,["DEPEND"])
# sys.exit is an exception... And consequently, we can't catch it.
raise
except Exception, e:
- print "\n error processing %(cpv)s, continuing... (%(e)s)" % {"cpv":y,"e":str(e)}
+ print "Error processing %(cpv)s, continuing... (%(e)s)" % {"cpv":y,"e":str(e)}
if dead_nodes:
for mytree in portdb.porttrees:
if portdb.findname2(y, mytree=mytree)[0]:
del auxdb[y]
except (KeyError, CacheError):
pass
- print "done!"
+ portage.writemsg_stdout("done!\n")
def action_config(settings, trees, myopts, myfiles):
if len(myfiles) != 1:
chunk_size = 8
except (ValueError, KeyError):
chunk_size = 3000
- writemsg_stdout("\n\n")
- writemsg_stdout(green("Fetching binary packages info...\n"))
+ writemsg_stdout("\n")
+ writemsg_stdout(green("Fetching bininfo from ")+base_url+"\n")
self.remotepkgs = portage.getbinpkg.dir_get_metadata(
self.settings["PORTAGE_BINHOST"], chunk_size=chunk_size)
- writemsg(green(" -- DONE!\n\n"))
+ #writemsg(green(" -- DONE!\n\n"))
for mypkg in self.remotepkgs.keys():
if not self.remotepkgs[mypkg].has_key("CATEGORY"):
return self.counter_tick_core(myroot, incrementing=1, mycpv=mycpv)
def get_counter_tick_core(self, myroot, mycpv=None):
- return self.counter_tick_core(myroot, incrementing=0, mycpv=mycpv) + 1
+ """
+ Use this method to retrieve the counter instead
+ of having to trust the value of a global counter
+ file that can lead to invalid COUNTER
+ generation. When cache is valid, the package COUNTER
+ files are not read and we rely on the timestamp of
+ the package directory to validate cache. The stat
+ calls should only take a short time, so performance
+ is sufficient without having to rely on a potentially
+ corrupt global counter file.
+ """
+ cp_list = self.cp_list
+ max_counter = 0
+ for cp in self.cp_all():
+ for cpv in cp_list(cp):
+ try:
+ counter = int(self.aux_get(cpv, ["COUNTER"])[0])
+ except (KeyError, OverflowError, ValueError):
+ continue
+ if counter > max_counter:
+ max_counter = counter
+ return max_counter + 1
def counter_tick_core(self, myroot, incrementing=1, mycpv=None):
"This method will grab the next COUNTER value and record it back to the global file. Returns new counter value."
writemsg("!!! COUNTER file is corrupt: '%s'\n" % cpath,
noiselevel=-1)
+ real_counter = self.get_counter_tick_core(myroot, mycpv=mycpv) - 1
+
if counter < 0:
changed = True
- max_counter = 0
- cp_list = self.cp_list
- for cp in self.cp_all():
- for cpv in cp_list(cp):
- try:
- counter = int(self.aux_get(cpv, ["COUNTER"])[0])
- except (KeyError, OverflowError, ValueError):
- continue
- if counter > max_counter:
- max_counter = counter
- counter = max_counter
writemsg("!!! Initializing COUNTER to " + \
"value of %d\n" % counter, noiselevel=-1)
+ if counter != real_counter:
+ changed = True
+ writemsg("!!! Initializing COUNTER to " + \
+ "value of %d\n" % real_counter, noiselevel=-1)
+
+ # Never trust the counter file, since having a
+ # corrupt value that is too low there can trigger
+ # incorrect AUTOCLEAN behavior due to newly installed
+ # packages having lower counters than the previous
+ # version in the same slot.
+ counter = real_counter
+
if incrementing or changed:
#increment counter
raise
return None
try:
- lex = shlex.shlex(f, posix=True)
+ # The default shlex.sourcehook() implementation
+ # only joins relative paths when the infile
+ # attribute is properly set.
+ lex = shlex.shlex(f, infile=mycfg, posix=True)
lex.wordchars=string.digits+string.letters+"~!@#$%*_\:;?,./-+{}"
lex.quotes="\"'"
if allow_sourcing: