def _manage_feeds(options, args): from zeroinstall.injector import writer from zeroinstall.injector.handler import Handler from zeroinstall.injector.policy import Policy handler = Handler(dry_run = options.dry_run) if not args: raise UsageError() for x in args: print _("Feed '%s':") % x + '\n' x = model.canonical_iface_uri(x) policy = Policy(x, handler) if options.offline: policy.network_use = model.network_offline feed = 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, iface_cache.iface_cache) print _("Downloading feed; please wait...") handler.wait_for_blocker(blocker) print _("Done") interfaces = policy.get_feed_targets(x) for i in range(len(interfaces)): feed = interfaces[i].get_feed(x) if feed: print _("%(index)d) Remove as feed for '%(uri)s'") % {'index': i + 1, 'uri': interfaces[i].uri} else: print _("%(index)d) Add as feed for '%(uri)s'") % {'index': i + 1, 'uri': interfaces[i].uri} 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 = iface.get_feed(x) if feed: iface.extra_feeds.remove(feed) 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.feeds: for f in iface.feeds: print "- " + f.uri else: print _("(no feeds)")
def handle(config, options, args, add_ok=True, remove_ok=False): if options.offline: config.network_use = model.network_offline if len(args) == 2: iface = config.iface_cache.get_interface( model.canonical_iface_uri(args[0])) feed_url = args[1] if find_feed_import(iface, feed_url): raise SafeException( _('Interface %(interface)s already has feed %(feed)s') % { 'interface': iface.uri, 'feed': feed_url }) feed = config.iface_cache.get_feed(feed_url) if not feed: blocker = config.fetcher.download_and_import_feed( feed_url, config.iface_cache) tasks.wait_for_blocker(blocker) iface.extra_feeds.append( model.Feed(feed_url, arch=None, user_override=True)) writer.save_interface(iface) return elif len(args) != 1: raise UsageError() x = args[0] print _("Feed '%s':") % x + '\n' x = model.canonical_iface_uri(x) policy = Policy(x, config=config) feed = config.iface_cache.get_feed(x) if policy.network_use != model.network_offline and policy.is_stale(feed): blocker = config.fetcher.download_and_import_feed( x, config.iface_cache) tasks.wait_for_blocker(blocker) 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)")
def get_selections(config, options, iface_uri, select_only, download_only, test_callback): """Get selections for iface_uri, according to the options passed. Will switch to GUI mode if necessary. @param options: options from OptionParser @param iface_uri: canonical URI of the interface @param select_only: return immediately even if the selected versions aren't cached @param download_only: wait for stale feeds, and display GUI button as Download, not Run @return: the selected versions, or None if the user cancels @rtype: L{selections.Selections} | None """ if options.offline: config.network_use = model.network_offline # Try to load it as a feed. If it is a feed, it'll get cached. If not, it's a # selections document and we return immediately. maybe_selections = config.iface_cache.get_feed(iface_uri, selections_ok = True) if isinstance(maybe_selections, selections.Selections): if not select_only: blocker = maybe_selections.download_missing(config) if blocker: logging.info(_("Waiting for selected implementations to be downloaded...")) config.handler.wait_for_blocker(blocker) return maybe_selections r = requirements.Requirements(iface_uri) r.parse_options(options) policy = Policy(config = config, requirements = r) # Note that need_download() triggers a solve if options.refresh or options.gui: # We could run immediately, but the user asked us not to can_run_immediately = False else: if select_only: # --select-only: we only care that we've made a selection, not that we've cached the implementations policy.need_download() can_run_immediately = policy.ready else: can_run_immediately = not policy.need_download() stale_feeds = [feed for feed in policy.solver.feeds_used if not feed.startswith('distribution:') and # Ignore (memory-only) PackageKit feeds policy.is_stale(config.iface_cache.get_feed(feed))] if download_only and stale_feeds: can_run_immediately = False if can_run_immediately: if stale_feeds: if policy.network_use == model.network_offline: logging.debug(_("No doing background update because we are in off-line mode.")) else: # There are feeds we should update, but we can run without them. # Do the update in the background while the program is running. from zeroinstall.injector import background background.spawn_background_update(policy, options.verbose > 0) return policy.solver.selections # If the user didn't say whether to use the GUI, choose for them. if options.gui is None and os.environ.get('DISPLAY', None): options.gui = True # If we need to download anything, we might as well # refresh all the feeds first. options.refresh = True logging.info(_("Switching to GUI mode... (use --console to disable)")) if options.gui: gui_args = policy.requirements.get_as_options() if download_only: # Just changes the button's label gui_args.append('--download-only') if options.refresh: gui_args.append('--refresh') if options.verbose: gui_args.insert(0, '--verbose') if options.verbose > 1: gui_args.insert(0, '--verbose') if options.with_store: for x in options.with_store: gui_args += ['--with-store', x] if select_only: gui_args.append('--select-only') from zeroinstall import helpers sels = helpers.get_selections_gui(iface_uri, gui_args, test_callback) if not sels: return None # Aborted else: # Note: --download-only also makes us stop and download stale feeds first. downloaded = policy.solve_and_download_impls(refresh = options.refresh or download_only or False, select_only = select_only) if downloaded: config.handler.wait_for_blocker(downloaded) sels = selections.Selections(policy) return sels
def handle(config, options, args, add_ok = True, remove_ok = False): if options.offline: config.network_use = model.network_offline if len(args) == 2: iface = config.iface_cache.get_interface(model.canonical_iface_uri(args[0])) feed_url = args[1] if find_feed_import(iface, feed_url): raise SafeException(_('Interface %(interface)s already has feed %(feed)s') % {'interface': iface.uri, 'feed': feed_url}) feed = config.iface_cache.get_feed(feed_url) if not feed: blocker = config.fetcher.download_and_import_feed(feed_url, config.iface_cache) tasks.wait_for_blocker(blocker) iface.extra_feeds.append(model.Feed(feed_url, arch = None, user_override = True)) writer.save_interface(iface) return elif len(args) != 1: raise UsageError() x = args[0] print _("Feed '%s':") % x + '\n' x = model.canonical_iface_uri(x) policy = Policy(x, config = config) feed = config.iface_cache.get_feed(x) if policy.network_use != model.network_offline and policy.is_stale(feed): blocker = config.fetcher.download_and_import_feed(x, config.iface_cache) tasks.wait_for_blocker(blocker) 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)")