Added '0install import' sub-command
[zeroinstall/solver.git] / zeroinstall / cmd / import.py
blobd97f94fbf7f0e4caf5b2a1d309f3fbbb7ddcae44
1 """
2 The B{0install import} 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, sys
9 import logging
11 from zeroinstall import cmd, SafeException, _
12 from zeroinstall.cmd import UsageError
13 from zeroinstall.injector import model, autopolicy, selections, handler, gpg, fetch
14 from zeroinstall.injector.iface_cache import iface_cache, PendingFeed
15 from zeroinstall.support import tasks
16 from xml.dom import minidom
18 syntax = "FEED"
20 def add_options(parser):
21 pass
23 def handle(options, args):
24 h = handler.Handler()
26 for x in args:
27 if not os.path.isfile(x):
28 raise SafeException(_("File '%s' does not exist") % x)
29 logging.info(_("Importing from file '%s'"), x)
30 signed_data = file(x)
31 data, sigs = gpg.check_stream(signed_data)
32 doc = minidom.parseString(data.read())
33 uri = doc.documentElement.getAttribute('uri')
34 if not uri:
35 raise SafeException(_("Missing 'uri' attribute on root element in '%s'") % x)
36 logging.info(_("Importing information about interface %s"), uri)
37 signed_data.seek(0)
39 pending = PendingFeed(uri, signed_data)
41 def run():
42 keys_downloaded = tasks.Task(pending.download_keys(h), "download keys")
43 yield keys_downloaded.finished
44 tasks.check(keys_downloaded.finished)
45 if not iface_cache.update_feed_if_trusted(uri, pending.sigs, pending.new_xml):
46 fetcher = fetch.Fetcher(h)
47 blocker = h.confirm_keys(pending, fetcher.fetch_key_info)
48 if blocker:
49 yield blocker
50 tasks.check(blocker)
51 if not iface_cache.update_feed_if_trusted(uri, pending.sigs, pending.new_xml):
52 raise SafeException(_("No signing keys trusted; not importing"))
54 task = tasks.Task(run(), "import feed")
56 errors = h.wait_for_blocker(task.finished)
57 if errors:
58 raise SafeException(_("Errors during download: ") + '\n'.join(errors))