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