API changes: use Feed rather than Interface in many places
[zeroinstall/zeroinstall-afb.git] / zeroinstall / injector / writer.py
blobef75275de68e060096f4ed74e58b24e4d2f9d3f7
1 """
2 Save per-interface configuration information.
3 """
5 # Copyright (C) 2009, Thomas Leonard
6 # See the README file for details, or visit http://0install.net.
8 from zeroinstall import _
9 import os
10 from xml.dom import minidom, XMLNS_NAMESPACE
12 from zeroinstall.support import basedir
14 from zeroinstall.injector.model import escape
15 from zeroinstall.injector.namespaces import config_site, config_prog, XMLNS_IFACE
16 from zeroinstall.injector.iface_cache import iface_cache
18 def _add_impl(parent, impl):
19 if impl.user_stability:
20 doc = parent.ownerDocument
21 node = doc.createElementNS(XMLNS_IFACE, 'implementation')
22 parent.appendChild(node)
23 node.setAttribute('user-stability', str(impl.user_stability))
24 node.setAttribute('id', impl.id)
26 def save_feed(feed):
27 # This is wrong. Feed and interface settings should be saved in separate files.
28 save_interface(iface_cache.get_interface(feed.url))
30 def save_interface(interface):
31 user_overrides = basedir.save_config_path(config_site, config_prog, 'user_overrides')
33 feed = iface_cache.get_feed(interface.uri)
35 impl = minidom.getDOMImplementation()
36 doc = impl.createDocument(XMLNS_IFACE, 'interface-preferences', None)
38 root = doc.documentElement
39 root.setAttributeNS(XMLNS_NAMESPACE, 'xmlns', XMLNS_IFACE)
40 root.setAttribute('uri', interface.uri)
42 if interface.stability_policy:
43 root.setAttribute('stability-policy', str(interface.stability_policy))
45 if feed is not None:
46 if feed.last_checked:
47 root.setAttribute('last-checked', str(feed.last_checked))
49 impls = feed.implementations.values()
50 impls.sort()
51 for impl in impls:
52 _add_impl(root, impl)
54 for feed in interface.extra_feeds:
55 if feed.user_override:
56 elem = doc.createElementNS(XMLNS_IFACE, 'feed')
57 root.appendChild(elem)
58 elem.setAttribute('src', feed.uri)
59 if feed.arch:
60 elem.setAttribute('arch', feed.arch)
62 import tempfile
63 tmp_fd, tmp_name = tempfile.mkstemp(dir = user_overrides)
64 try:
65 tmp_file = os.fdopen(tmp_fd, 'w')
66 doc.writexml(tmp_file, addindent = " ", newl = '\n')
67 tmp_file.close()
68 path = os.path.join(user_overrides, escape(interface.uri))
69 os.rename(tmp_name, path)
70 except:
71 os.unlink(tmp_name)
72 raise