From 3905b44846c55d2e540de4dad5e4ffaa15e12cfc Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Sun, 27 Mar 2011 17:07:51 +0100 Subject: [PATCH] Explain how to remove unneeded local feeds New syntax for 'remove-feed' to allow this. --- 0install.1 | 7 +- zeroinstall/cmd/add_feed.py | 183 +++++++++++++++++++++-------------------- zeroinstall/cmd/remove_feed.py | 21 ++++- zeroinstall/injector/solver.py | 5 ++ 4 files changed, 119 insertions(+), 97 deletions(-) rewrite zeroinstall/cmd/add_feed.py (76%) diff --git a/0install.1 b/0install.1 index 7685dd8..97dec86 100644 --- a/0install.1 +++ b/0install.1 @@ -24,7 +24,7 @@ .B 0install add-feed \fBFEED\fP -.B 0install remove-feed \fBFEED\fP +.B 0install remove-feed [\fBINTERFACE\fP] \fBFEED\fP .B 0install list-feeds \fBURI\fP @@ -275,10 +275,11 @@ as normal. Use `add-feed' when you want to use the developer version even when using the URI, or if the program is a library (and thus referenced by URI by other programs). -.SS 0install remove-feed FEED +.SS 0install remove-feed [INTERFACE] FEED .PP -Un-register a feed, reversing the effect of `add-feed'. +Un-register a feed, reversing the effect of `add-feed'. If INTERFACE is not +given, you will be prompted to choose which INTERFACE to remove it from. .SS 0install list-feeds URI diff --git a/zeroinstall/cmd/add_feed.py b/zeroinstall/cmd/add_feed.py dissimilarity index 76% index 1898269..0b4cd1f 100644 --- a/zeroinstall/cmd/add_feed.py +++ b/zeroinstall/cmd/add_feed.py @@ -1,91 +1,92 @@ -""" -The B{0install add-feed} command-line interface. -""" - -# Copyright (C) 2011, Thomas Leonard -# See the README file for details, or visit http://0install.net. - -from zeroinstall import SafeException, _ -from zeroinstall.support import tasks -from zeroinstall.cmd import UsageError -from zeroinstall.injector import model, writer -from zeroinstall.injector.policy import Policy - -syntax = "NEW-FEED" - -def add_options(parser): - parser.add_option("-o", "--offline", help=_("try to avoid using the network"), action='store_true') - -def handle(config, options, args, add_ok = True, remove_ok = False): - if not args: raise UsageError() - - def find_feed_import(iface, feed_url): - for f in iface.extra_feeds: - if f.uri == feed_url: - return f - return None - - for x in args: - print _("Feed '%s':") % x + '\n' - x = model.canonical_iface_uri(x) - policy = Policy(x, config = config) - if options.offline: - config.network_use = model.network_offline - - feed = config.iface_cache.get_feed(x) - if policy.network_use != model.network_offline and policy.is_stale(feed): - blocker = policy.fetcher.download_and_import_feed(x, config.iface_cache) - print _("Downloading feed; please wait...") - tasks.wait_for_blocker(blocker) - print _("Done") - - candidate_interfaces = policy.get_feed_targets(x) - assert candidate_interfaces - interfaces = [] - for i in range(len(candidate_interfaces)): - iface = candidate_interfaces[i] - if find_feed_import(iface, x): - if remove_ok: - print _("%(index)d) Remove as feed for '%(uri)s'") % {'index': i + 1, 'uri': iface.uri} - interfaces.append(iface) - else: - if add_ok: - print _("%(index)d) Add as feed for '%(uri)s'") % {'index': i + 1, 'uri': iface.uri} - interfaces.append(iface) - if not interfaces: - if remove_ok: - raise SafeException(_("%(feed)s is not registered as a feed for %(interface)s") % - {'feed': x, 'interface': candidate_interfaces[0]}) - else: - raise SafeException(_("%(feed)s already registered as a feed for %(interface)s") % - {'feed': x, 'interface': candidate_interfaces[0]}) - print - while True: - try: - i = raw_input(_('Enter a number, or CTRL-C to cancel [1]: ')).strip() - except KeyboardInterrupt: - print - raise SafeException(_("Aborted at user request.")) - if i == '': - i = 1 - else: - try: - i = int(i) - except ValueError: - i = 0 - if i > 0 and i <= len(interfaces): - break - print _("Invalid number. Try again. (1 to %d)") % len(interfaces) - iface = interfaces[i - 1] - feed_import = find_feed_import(iface, x) - if feed_import: - iface.extra_feeds.remove(feed_import) - else: - iface.extra_feeds.append(model.Feed(x, arch = None, user_override = True)) - writer.save_interface(iface) - print '\n' + _("Feed list for interface '%s' is now:") % iface.get_name() - if iface.extra_feeds: - for f in iface.extra_feeds: - print "- " + f.uri - else: - print _("(no feeds)") +""" +The B{0install add-feed} command-line interface. +""" + +# Copyright (C) 2011, Thomas Leonard +# See the README file for details, or visit http://0install.net. + +from zeroinstall import SafeException, _ +from zeroinstall.support import tasks +from zeroinstall.cmd import UsageError +from zeroinstall.injector import model, writer +from zeroinstall.injector.policy import Policy + +syntax = "NEW-FEED" + +def add_options(parser): + parser.add_option("-o", "--offline", help=_("try to avoid using the network"), action='store_true') + +def find_feed_import(iface, feed_url): + for f in iface.extra_feeds: + if f.uri == feed_url: + return f + return None + +def handle(config, options, args, add_ok = True, remove_ok = False): + if len(args) != 1: raise UsageError() + + x = args[0] + + print _("Feed '%s':") % x + '\n' + x = model.canonical_iface_uri(x) + policy = Policy(x, config = config) + if options.offline: + config.network_use = model.network_offline + + feed = config.iface_cache.get_feed(x) + if policy.network_use != model.network_offline and policy.is_stale(feed): + blocker = policy.fetcher.download_and_import_feed(x, config.iface_cache) + print _("Downloading feed; please wait...") + tasks.wait_for_blocker(blocker) + print _("Done") + + candidate_interfaces = policy.get_feed_targets(x) + assert candidate_interfaces + interfaces = [] + for i in range(len(candidate_interfaces)): + iface = candidate_interfaces[i] + if find_feed_import(iface, x): + if remove_ok: + print _("%(index)d) Remove as feed for '%(uri)s'") % {'index': i + 1, 'uri': iface.uri} + interfaces.append(iface) + else: + if add_ok: + print _("%(index)d) Add as feed for '%(uri)s'") % {'index': i + 1, 'uri': iface.uri} + interfaces.append(iface) + if not interfaces: + if remove_ok: + raise SafeException(_("%(feed)s is not registered as a feed for %(interface)s") % + {'feed': x, 'interface': candidate_interfaces[0]}) + else: + raise SafeException(_("%(feed)s already registered as a feed for %(interface)s") % + {'feed': x, 'interface': candidate_interfaces[0]}) + print + while True: + try: + i = raw_input(_('Enter a number, or CTRL-C to cancel [1]: ')).strip() + except KeyboardInterrupt: + print + raise SafeException(_("Aborted at user request.")) + if i == '': + i = 1 + else: + try: + i = int(i) + except ValueError: + i = 0 + if i > 0 and i <= len(interfaces): + break + print _("Invalid number. Try again. (1 to %d)") % len(interfaces) + iface = interfaces[i - 1] + feed_import = find_feed_import(iface, x) + if feed_import: + iface.extra_feeds.remove(feed_import) + else: + iface.extra_feeds.append(model.Feed(x, arch = None, user_override = True)) + writer.save_interface(iface) + print '\n' + _("Feed list for interface '%s' is now:") % iface.get_name() + if iface.extra_feeds: + for f in iface.extra_feeds: + print "- " + f.uri + else: + print _("(no feeds)") diff --git a/zeroinstall/cmd/remove_feed.py b/zeroinstall/cmd/remove_feed.py index 12b1c53..77af621 100644 --- a/zeroinstall/cmd/remove_feed.py +++ b/zeroinstall/cmd/remove_feed.py @@ -5,11 +5,26 @@ The B{0install remove-feed} command-line interface. # Copyright (C) 2011, Thomas Leonard # See the README file for details, or visit http://0install.net. -syntax = "FEED" +syntax = "[INTERFACE] FEED" -from zeroinstall.cmd import add_feed +from zeroinstall import SafeException, _ +from zeroinstall.injector import model, writer +from zeroinstall.cmd import add_feed, UsageError add_options = add_feed.add_options def handle(config, options, args): - return add_feed.handle(config, options, args, add_ok = False, remove_ok = True) + if len(args) == 2: + iface = config.iface_cache.get_interface(model.canonical_iface_uri(args[0])) + feed_url = args[1] + + feed_import = add_feed.find_feed_import(iface, feed_url) + if not feed_import: + raise SafeException(_('Interface %(interface)s has no feed %(feed)s') % + {'interface': iface.uri, 'feed': feed_url}) + iface.extra_feeds.remove(feed_import) + writer.save_interface(iface) + elif len(args) == 1: + add_feed.handle(config, options, args, add_ok = False, remove_ok = True) + else: + raise UsageError() diff --git a/zeroinstall/injector/solver.py b/zeroinstall/injector/solver.py index 3d8553c..6eea042 100644 --- a/zeroinstall/injector/solver.py +++ b/zeroinstall/injector/solver.py @@ -9,6 +9,7 @@ from zeroinstall import _ import locale from logging import debug, warn, info +from zeroinstall.injector.reader import MissingLocalFeed from zeroinstall.injector.arch import machine_groups from zeroinstall.injector import model, sat, selections @@ -357,6 +358,10 @@ class SATSolver(Solver): distro_feed = iface_cache.get_feed(distro_feed_url) if distro_feed.implementations: impls.extend(distro_feed.implementations.values()) + except MissingLocalFeed, ex: + warn(_("Missing local feed; if it's no longer required, remove it with:") + + '\n0install remove-feed ' + iface.uri + ' ' + f, + {'feed': f, 'interface': iface, 'exception': ex}) except Exception, ex: warn(_("Failed to load feed %(feed)s for %(interface)s: %(exception)s"), {'feed': f, 'interface': iface, 'exception': ex}) #raise -- 2.11.4.GIT