PORTAGE_RSYNC_OPTS="--recursive --links --safe-links --perms --times --compress --force --whole-file --delete --stats --timeout=180 --exclude=/distfiles --exclude=/local --exclude=/packages"
+# The number of days after the last `emerge --sync` that a warning
+# message should be produced.
+PORTAGE_SYNC_STALE="30"
+
# Minimal CONFIG_PROTECT
CONFIG_PROTECT="/etc"
.br
Defaults to 3.
.TP
+\fBPORTAGE_SYNC_STALE\fR = \fI[NUMBER]\fR
+Defines the number of days after the last `emerge \-\-sync` that a warning
+message should be produced. A value of 0 will disable warnings.
+.br
+Defaults to 30.
+.TP
\fBPORTAGE_TMPDIR\fR = \fI[path]\fR
Defines the location of the temporary build directories.
.br
from _emerge.search import search
from _emerge.SetArg import SetArg
from _emerge.show_invalid_depstring_notice import show_invalid_depstring_notice
+from _emerge.sync.old_tree_timestamp import old_tree_timestamp_warn
from _emerge.unmerge import unmerge
from _emerge.UnmergeDepPriority import UnmergeDepPriority
from _emerge.UseFlagDisplay import UseFlagDisplay
def action_build(settings, trees, mtimedb,
myopts, myaction, myfiles, spinner):
+ old_tree_timestamp_warn(settings['PORTDIR'], settings)
+
# validate the state of the resume data
# so that we can make assumptions later.
for k in ("resume", "resume_backup"):
--- /dev/null
+# Copyright 2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+import locale
+import logging
+import time
+
+from portage import os
+from portage.exception import PortageException
+from portage.localization import _
+from portage.util import grabfile, writemsg_level, writemsg_stdout
+
+def have_english_locale():
+ lang, enc = locale.getdefaultlocale()
+ if lang is not None:
+ lang = lang.lower()
+ lang = lang.split('_', 1)[0]
+ return lang is None or lang in ('c', 'en')
+
+def whenago(seconds):
+ sec = int(seconds)
+ mins = 0
+ days = 0
+ hrs = 0
+ years = 0
+ out = []
+
+ if sec > 60:
+ mins = sec / 60
+ sec = sec % 60
+ if mins > 60:
+ hrs = mins / 60
+ mins = mins % 60
+ if hrs > 24:
+ days = hrs / 24
+ hrs = hrs % 24
+ if days > 365:
+ years = days / 365
+ days = days % 365
+
+ if years:
+ out.append(str(years)+"y ")
+ if days:
+ out.append(str(days)+"d ")
+ if hrs:
+ out.append(str(hrs)+"h ")
+ if mins:
+ out.append(str(mins)+"m ")
+ if sec:
+ out.append(str(sec)+"s ")
+
+ return "".join(out).strip()
+
+def old_tree_timestamp_warn(portdir, settings):
+ unixtime = time.time()
+ default_warnsync = 30
+
+ timestamp_file = os.path.join(portdir, "metadata/timestamp.x")
+ try:
+ lastsync = grabfile(timestamp_file)
+ except PortageException:
+ return False
+
+ if not lastsync:
+ return False
+
+ lastsync = lastsync[0].split()
+ if not lastsync:
+ return False
+
+ try:
+ lastsync = int(lastsync[0])
+ except ValueError:
+ return False
+
+ var_name = 'PORTAGE_SYNC_STALE'
+ try:
+ warnsync = float(settings.get(var_name, default_warnsync))
+ except ValueError:
+ writemsg_level("!!! %s contains non-numeric value: %s\n" % \
+ (var_name, settings[var_name]),
+ level=logging.ERROR, noiselevel=-1)
+ return False
+
+ if warnsync <= 0:
+ return False
+
+ if (unixtime - 86400 * warnsync) > lastsync:
+ if have_english_locale():
+ writemsg_stdout(">>> Last emerge --sync was %s ago\n" % \
+ whenago(unixtime - lastsync), noiselevel=-1)
+ else:
+ writemsg_stdout(">>> %s\n" % \
+ _("Last emerge --sync was %s") % \
+ time.strftime('%c', time.localtime(lastsync)),
+ noiselevel=-1)
+ return True
+ return False
from portage import os
from portage import _encodings
-from portage import _unicode_encode
+from portage import _unicode_decode, _unicode_encode
from portage.localization import _
import portage
myconn = smtplib.SMTP(mymailhost, mymailport)
if mymailuser != "" and mymailpasswd != "":
myconn.login(mymailuser, mymailpasswd)
- myconn.sendmail(myfrom, myrecipient, message.as_string())
+
+ message_str = message.as_string()
+ if sys.hexversion >= 0x3000000:
+ # Force ascii encoding in order to avoid UnicodeEncodeError
+ # from smtplib.sendmail with python3 (bug #291331).
+ message_str = _unicode_encode(message_str,
+ encoding='ascii', errors='backslashreplace')
+ message_str = _unicode_decode(message_str,
+ encoding='ascii', errors='replace')
+
+ myconn.sendmail(myfrom, myrecipient, message_str)
myconn.quit()
except smtplib.SMTPException as e:
raise portage.exception.PortageException(_("!!! An error occured while trying to send logmail:\n")+str(e))
mydo not in ("digest", "manifest") and "noauto" not in features)
alist = mysettings.configdict["pkg"].get("A")
aalist = mysettings.configdict["pkg"].get("AA")
- if alist is None or aalist is None:
+ if alist is None or aalist is None or \
+ (not emerge_skip_distfiles and need_distfiles):
# Make sure we get the correct tree in case there are overlays.
mytree = os.path.realpath(
os.path.dirname(os.path.dirname(mysettings["O"])))
return 1
mysettings.configdict["pkg"]["A"] = " ".join(alist)
mysettings.configdict["pkg"]["AA"] = " ".join(aalist)
+
+ if not emerge_skip_distfiles and need_distfiles:
+ if "mirror" in features or fetchall:
+ fetchme = aalist
+ else:
+ fetchme = alist
+ if not fetch(fetchme, mysettings, listonly=listonly,
+ fetchonly=fetchonly):
+ return 1
+
else:
alist = set(alist.split())
aalist = set(aalist.split())
- if ("mirror" in features) or fetchall:
- fetchme = aalist
- checkme = aalist
- else:
- fetchme = alist
- checkme = alist
if mydo == "fetch":
# Files are already checked inside fetch(),
# so do not check them again.
checkme = []
-
- if not emerge_skip_distfiles and \
- need_distfiles and not fetch(
- fetchme, mysettings, listonly=listonly, fetchonly=fetchonly):
- return 1
+ else:
+ checkme = alist
if mydo == "fetch" and listonly:
return 0