Only skip <environment insert> bindings for package implementations
[zeroinstall.git] / zeroinstall / cmd / add_feed.py
blobfd26ce361dcda027189b4d51565b77db8ef6e5bd
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 __future__ import print_function
10 from zeroinstall import SafeException, _
11 from zeroinstall.support import tasks
12 from zeroinstall.cmd import UsageError
13 from zeroinstall.injector import model, writer
14 from zeroinstall.injector.policy import Policy
16 syntax = "NEW-FEED"
18 def add_options(parser):
19 parser.add_option("-o", "--offline", help=_("try to avoid using the network"), action='store_true')
21 def find_feed_import(iface, feed_url):
22 for f in iface.extra_feeds:
23 if f.uri == feed_url:
24 return f
25 return None
27 def handle(config, options, args, add_ok = True, remove_ok = False):
28 if len(args) != 1: raise UsageError()
30 x = args[0]
32 print(_("Feed '%s':") % x + '\n')
33 x = model.canonical_iface_uri(x)
34 policy = Policy(x, config = config)
35 if options.offline:
36 config.network_use = model.network_offline
38 feed = config.iface_cache.get_feed(x)
39 if policy.network_use != model.network_offline and policy.is_stale(feed):
40 blocker = policy.fetcher.download_and_import_feed(x, config.iface_cache)
41 print(_("Downloading feed; please wait..."))
42 tasks.wait_for_blocker(blocker)
43 print(_("Done"))
45 candidate_interfaces = policy.get_feed_targets(x)
46 assert candidate_interfaces
47 interfaces = []
48 for i in range(len(candidate_interfaces)):
49 iface = candidate_interfaces[i]
50 if find_feed_import(iface, x):
51 if remove_ok:
52 print(_("%(index)d) Remove as feed for '%(uri)s'") % {'index': i + 1, 'uri': iface.uri})
53 interfaces.append(iface)
54 else:
55 if add_ok:
56 print(_("%(index)d) Add as feed for '%(uri)s'") % {'index': i + 1, 'uri': iface.uri})
57 interfaces.append(iface)
58 if not interfaces:
59 if remove_ok:
60 raise SafeException(_("%(feed)s is not registered as a feed for %(interface)s") %
61 {'feed': x, 'interface': candidate_interfaces[0]})
62 else:
63 raise SafeException(_("%(feed)s already registered as a feed for %(interface)s") %
64 {'feed': x, 'interface': candidate_interfaces[0]})
65 print()
66 while True:
67 try:
68 i = raw_input(_('Enter a number, or CTRL-C to cancel [1]: ')).strip()
69 except KeyboardInterrupt:
70 print()
71 raise SafeException(_("Aborted at user request."))
72 if i == '':
73 i = 1
74 else:
75 try:
76 i = int(i)
77 except ValueError:
78 i = 0
79 if i > 0 and i <= len(interfaces):
80 break
81 print(_("Invalid number. Try again. (1 to %d)") % len(interfaces))
82 iface = interfaces[i - 1]
83 feed_import = find_feed_import(iface, x)
84 if feed_import:
85 iface.extra_feeds.remove(feed_import)
86 else:
87 iface.extra_feeds.append(model.Feed(x, arch = None, user_override = True))
88 writer.save_interface(iface)
89 print('\n' + _("Feed list for interface '%s' is now:") % iface.get_name())
90 if iface.extra_feeds:
91 for f in iface.extra_feeds:
92 print("- " + f.uri)
93 else:
94 print(_("(no feeds)"))