When saving user_overrides, pick a random name for the tmp file, not just
[zeroinstall.git] / zeroinstall / injector / writer.py
blobc922d27afc5f452cf9dae309ff8fecabcf2d2bcf
1 """
2 Save per-interface configuration information.
3 """
5 # Copyright (C) 2006, Thomas Leonard
6 # See the README file for details, or visit http://0install.net.
8 import os
9 from xml.dom import minidom, XMLNS_NAMESPACE
11 import basedir
13 from model import *
15 from namespaces import config_site, config_prog, XMLNS_IFACE
17 def _add_impl(parent, impl):
18 if impl.user_stability:
19 doc = parent.ownerDocument
20 node = doc.createElementNS(XMLNS_IFACE, 'implementation')
21 parent.appendChild(node)
22 node.setAttribute('user-stability', str(impl.user_stability))
23 node.setAttribute('id', impl.id)
25 def save_interface(interface):
26 user_overrides = basedir.save_config_path(config_site, config_prog, 'user_overrides')
28 impl = minidom.getDOMImplementation()
29 doc = impl.createDocument(XMLNS_IFACE, 'interface-preferences', None)
31 root = doc.documentElement
32 root.setAttributeNS(XMLNS_NAMESPACE, 'xmlns', XMLNS_IFACE)
33 root.setAttribute('uri', interface.uri)
35 if interface.stability_policy:
36 root.setAttribute('stability-policy', str(interface.stability_policy))
38 if interface.last_checked:
39 root.setAttribute('last-checked', str(interface.last_checked))
41 if interface.last_check_attempt:
42 root.setAttribute('last-check-attempt', str(interface.last_check_attempt))
44 impls = interface.implementations.values()
45 impls.sort()
46 for impl in impls:
47 _add_impl(root, impl)
49 for feed in interface.feeds:
50 if feed.user_override:
51 elem = doc.createElementNS(XMLNS_IFACE, 'feed')
52 root.appendChild(elem)
53 elem.setAttribute('src', feed.uri)
54 if feed.arch:
55 elem.setAttribute('arch', feed.arch)
57 import tempfile
58 tmp_fd, tmp_name = tempfile.mkstemp(dir = user_overrides)
59 try:
60 doc.writexml(os.fdopen(tmp_fd, 'w'), addindent = " ", newl = '\n')
61 path = os.path.join(user_overrides, escape(interface.uri))
62 os.rename(tmp_name, path)
63 except:
64 os.unlink(tmp_name)
65 raise