From 537d7628925b33b2ae72ac994f1ac1313b4e2794 Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Sun, 18 Feb 2007 20:17:19 +0000 Subject: [PATCH] When we start checking for updates on a feed, record the time. In the GUI, if this time is later than the last checked time, display it (indicates that a check is in progress or failed). TODO: We should use this to prevent starting a background check for something that we tried to check recently (in the last hour or so). git-svn-id: file:///home/talex/Backups/sf.net/Subversion/zero-install/trunk/0launch@1530 9f8c893c-44ee-0310-b757-c8ca8341c71e --- zeroinstall/0launch-gui/properties.py | 7 +++++++ zeroinstall/injector/background.py | 15 +++++++++++++++ zeroinstall/injector/model.py | 30 +++++++++++++++++++++--------- zeroinstall/injector/reader.py | 4 ++++ zeroinstall/injector/writer.py | 3 +++ 5 files changed, 50 insertions(+), 9 deletions(-) diff --git a/zeroinstall/0launch-gui/properties.py b/zeroinstall/0launch-gui/properties.py index 4e10981..0726c09 100644 --- a/zeroinstall/0launch-gui/properties.py +++ b/zeroinstall/0launch-gui/properties.py @@ -121,6 +121,13 @@ class Description(gtk.ScrolledWindow): if interface.last_checked: buffer.insert(iter, '\nLast checked: %s' % time.ctime(interface.last_checked)) + if interface.last_check_attempt: + if interface.last_checked and interface.last_checked >= interface.last_check_attempt: + pass # Don't bother reporting successful attempts + else: + buffer.insert(iter, '\nLast check attempt: %s (failed or in progress)' % + time.ctime(interface.last_check_attempt)) + buffer.insert_with_tags(iter, '\n\nDescription\n', heading_style) paragraphs = [format_para(p) for p in (interface.description or "-").split('\n\n')] diff --git a/zeroinstall/injector/background.py b/zeroinstall/injector/background.py index 61aa9b1..32882a9 100644 --- a/zeroinstall/injector/background.py +++ b/zeroinstall/injector/background.py @@ -143,6 +143,21 @@ def _check_for_updates(policy, verbose): loop.run() def spawn_background_update(policy, verbose): + # Mark all feeds as being updated. Do this before forking, so that if someone is + # running lots of 0launch commands in series on the same program we don't start + # huge numbers of processes. + import time + from zeroinstall.injector import writer + now = int(time.time()) + for x in policy.implementation: + x.last_check_attempt = now + writer.save_interface(x) + + for f in policy.usable_feeds(x): + feed_iface = iface_cache.get_interface(f.uri) + feed_iface.last_check_attempt = now + writer.save_interface(feed_iface) + if _detach(): return diff --git a/zeroinstall/injector/model.py b/zeroinstall/injector/model.py index cb08b7d..5694157 100644 --- a/zeroinstall/injector/model.py +++ b/zeroinstall/injector/model.py @@ -247,16 +247,28 @@ class Implementation(object): arch = property(lambda self: _join_arch(self.os, self.machine), set_arch) class Interface(object): - """An Interface represents some contract of behaviour.""" + """An Interface represents some contract of behaviour. + Note: This class is for both feeds and interfaces. Should really have used separate classes. + @ivar uri: the URL for this feed + @ivar implementations: list of Implementations in this feed + @ivar name: human-friendly name + @ivar summary: short textual description + @ivar description: long textual description + @ivar stability_policy: user's configured policy. + Implementations at this level or higher are preferred. + Lower levels are used only if there is no other choice. + @ivar last_modified: timestamp on signature + @ivar last_checked: time feed was last successfully downloaded and updated + @ivar last_check_attempt: time we last tried to check for updates (in the background) + @ivar main: deprecated + @ivar feeds: list of feeds for this interface + @ivar feed_for: interfaces for which this could be a feed + @ivar metadata: extra elements we didn't understand + """ __slots__ = ['uri', 'implementations', 'name', 'description', 'summary', - 'stability_policy', 'last_modified', 'last_local_update', 'last_checked', - 'main', 'feeds', 'feed_for', 'metadata'] + 'stability_policy', 'last_modified', 'last_checked', + 'last_check_attempt', 'main', 'feeds', 'feed_for', 'metadata'] - # last_local_update is deprecated - - # stability_policy: - # Implementations at this level or higher are preferred. - # Lower levels are used only if there is no other choice. def __init__(self, uri): assert uri @@ -274,8 +286,8 @@ class Interface(object): self.description = None self.stability_policy = None self.last_modified = None - self.last_local_update = None self.last_checked = None + self.last_check_attempt = None self.main = None self.feeds = [] self.feed_for = {} # URI -> True diff --git a/zeroinstall/injector/reader.py b/zeroinstall/injector/reader.py index 8087c65..ebe13c1 100644 --- a/zeroinstall/injector/reader.py +++ b/zeroinstall/injector/reader.py @@ -82,6 +82,10 @@ def update_user_overrides(interface): if last_checked: interface.last_checked = int(last_checked) + last_check_attempt = root.getAttribute('last-check-attempt') + if last_check_attempt: + interface.last_check_attempt = int(last_check_attempt) + stability_policy = root.getAttribute('stability-policy') if stability_policy: interface.set_stability_policy(stability_levels[str(stability_policy)]) diff --git a/zeroinstall/injector/writer.py b/zeroinstall/injector/writer.py index 645b7ae..726279c 100644 --- a/zeroinstall/injector/writer.py +++ b/zeroinstall/injector/writer.py @@ -40,6 +40,9 @@ def save_interface(interface): if interface.last_checked: root.setAttribute('last-checked', str(interface.last_checked)) + if interface.last_check_attempt: + root.setAttribute('last-check-attempt', str(interface.last_check_attempt)) + impls = interface.implementations.values() impls.sort() for impl in impls: -- 2.11.4.GIT