Produce a warning message if the timestamp of the portage tree is more than
authorZac Medico <zmedico@gentoo.org>
Mon, 8 Mar 2010 07:43:00 +0000 (07:43 -0000)
committerZac Medico <zmedico@gentoo.org>
Mon, 8 Mar 2010 07:43:00 +0000 (07:43 -0000)
30 days old, and make it adjustable via the PORTAGE_SYNC_STALE variable.
Thanks to Ned Ludd <solar@g.o> for the most of this code.

svn path=/main/trunk/; revision=15756

cnf/make.globals
man/make.conf.5
pym/_emerge/actions.py
pym/_emerge/sync/__init__.py [new file with mode: 0644]
pym/_emerge/sync/old_tree_timestamp.py [new file with mode: 0644]

index 76b48fbf9ce2672597b0027b021fed864921e1f6..b1b2cf49c248af34b3f9b6e7bf621b39e04bb4fc 100644 (file)
@@ -83,6 +83,10 @@ PORTAGE_RSYNC_RETRIES="3"
 
 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"
 CONFIG_PROTECT_MASK="/etc/env.d"
index 18d769f3239d3821c9d321071603c40efe07de35..71a3081390fe03bd659a11eb80bc05842d12dc0a 100644 (file)
@@ -643,6 +643,12 @@ giving up.
 .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.
+.br
+Defaults to 30.
+.TP
 \fBPORTAGE_TMPDIR\fR = \fI[path]\fR
 Defines the location of the temporary build directories.
 .br
index 6cb6904580874f0dacb8b95ccfbe057856b9463e..20868594672883c765b666010396dfeb7c72fed0 100644 (file)
@@ -53,6 +53,7 @@ from _emerge.Scheduler import Scheduler
 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
@@ -64,6 +65,8 @@ if sys.hexversion >= 0x3000000:
 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"):
diff --git a/pym/_emerge/sync/__init__.py b/pym/_emerge/sync/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/pym/_emerge/sync/old_tree_timestamp.py b/pym/_emerge/sync/old_tree_timestamp.py
new file mode 100644 (file)
index 0000000..f962743
--- /dev/null
@@ -0,0 +1,99 @@
+# 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