Produce a warning message if the timestamp of the portage tree is more than
authorZac Medico <zmedico@gentoo.org>
Mon, 8 Mar 2010 08:47:02 +0000 (08:47 -0000)
committerZac Medico <zmedico@gentoo.org>
Mon, 8 Mar 2010 08:47:02 +0000 (08:47 -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. (trunk r15756)

svn path=/main/branches/2.1.7/; revision=15761

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 472147ccc1fe40dc81782552843907d204fb95ff..3533b37f3da3f3f0a3b17e02cba5b36328f9eed4 100644 (file)
@@ -80,6 +80,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 b15cad4030268d4617eb4b88b9ab72bf880b7385..64598d44105dcec3fa36f0063ddb7065931dd4c1 100644 (file)
@@ -639,6 +639,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 f4b0f74a24d47ecd85251c182d8f5363b4b9ba93..48e0974b228f6203072cd86526208822063dbdb5 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