Explain how to remove unneeded local feeds
[zeroinstall.git] / zeroinstall / cmd / add_feed.py
blob0b4cd1f6859012518f5b119673cb6e2fca0b7c49
1 """
2 The B{0install add-feed} command-line interface.
3 """
5 # Copyright (C) 2011, Thomas Leonard
6 # See the README file for details, or visit http://0install.net.
8 from zeroinstall import SafeException, _
9 from zeroinstall.support import tasks
10 from zeroinstall.cmd import UsageError
11 from zeroinstall.injector import model, writer
12 from zeroinstall.injector.policy import Policy
14 syntax = "NEW-FEED"
16 def add_options(parser):
17 parser.add_option("-o", "--offline", help=_("try to avoid using the network"), action='store_true')
19 def find_feed_import(iface, feed_url):
20 for f in iface.extra_feeds:
21 if f.uri == feed_url:
22 return f
23 return None
25 def handle(config, options, args, add_ok = True, remove_ok = False):
26 if len(args) != 1: raise UsageError()
28 x = args[0]
30 print _("Feed '%s':") % x + '\n'
31 x = model.canonical_iface_uri(x)
32 policy = Policy(x, config = config)
33 if options.offline:
34 config.network_use = model.network_offline
36 feed = config.iface_cache.get_feed(x)
37 if policy.network_use != model.network_offline and policy.is_stale(feed):
38 blocker = policy.fetcher.download_and_import_feed(x, config.iface_cache)
39 print _("Downloading feed; please wait...")
40 tasks.wait_for_blocker(blocker)
41 print _("Done")
43 candidate_interfaces = policy.get_feed_targets(x)
44 assert candidate_interfaces
45 interfaces = []
46 for i in range(len(candidate_interfaces)):
47 iface = candidate_interfaces[i]
48 if find_feed_import(iface, x):
49 if remove_ok:
50 print _("%(index)d) Remove as feed for '%(uri)s'") % {'index': i + 1, 'uri': iface.uri}
51 interfaces.append(iface)
52 else:
53 if add_ok:
54 print _("%(index)d) Add as feed for '%(uri)s'") % {'index': i + 1, 'uri': iface.uri}
55 interfaces.append(iface)
56 if not interfaces:
57 if remove_ok:
58 raise SafeException(_("%(feed)s is not registered as a feed for %(interface)s") %
59 {'feed': x, 'interface': candidate_interfaces[0]})
60 else:
61 raise SafeException(_("%(feed)s already registered as a feed for %(interface)s") %
62 {'feed': x, 'interface': candidate_interfaces[0]})
63 print
64 while True:
65 try:
66 i = raw_input(_('Enter a number, or CTRL-C to cancel [1]: ')).strip()
67 except KeyboardInterrupt:
68 print
69 raise SafeException(_("Aborted at user request."))
70 if i == '':
71 i = 1
72 else:
73 try:
74 i = int(i)
75 except ValueError:
76 i = 0
77 if i > 0 and i <= len(interfaces):
78 break
79 print _("Invalid number. Try again. (1 to %d)") % len(interfaces)
80 iface = interfaces[i - 1]
81 feed_import = find_feed_import(iface, x)
82 if feed_import:
83 iface.extra_feeds.remove(feed_import)
84 else:
85 iface.extra_feeds.append(model.Feed(x, arch = None, user_override = True))
86 writer.save_interface(iface)
87 print '\n' + _("Feed list for interface '%s' is now:") % iface.get_name()
88 if iface.extra_feeds:
89 for f in iface.extra_feeds:
90 print "- " + f.uri
91 else:
92 print _("(no feeds)")