Load feed URL correctly.
[0publish-gui.git] / requires.py
blob62035da7d9513eb9ba08a5f69ecf8efb0f1558e5
1 import rox, os
2 import gtk.glade
4 import main
5 from xmltools import *
7 from rox import g
9 from zeroinstall.zerostore import NotStored
10 from zeroinstall.injector import model
11 from zeroinstall.injector.policy import Policy
13 class Requires:
14 def __init__(self, feed_editor, parent, element = None):
15 self.feed_editor = feed_editor
16 self.element = element
18 self.widgets = gtk.glade.XML(main.gladefile, 'requires')
20 uri = self.widgets.get_widget('requires_uri')
21 stream = os.popen('0launch --list')
22 self.known_ifaces = [line.strip() for line in stream if not line.startswith('/')]
23 self.known_ifaces.sort()
24 stream.close()
26 for x in self.known_ifaces:
27 uri.append_text(x)
29 uri.connect('changed', self.update_uri)
31 self.version_element = None # Last <version> child
32 self.env_element = None # Last <environment> child
34 if element:
35 main.combo_set_text(uri, element.getAttribute('interface'))
37 for child in child_elements(element):
38 if child.namespaceURI != XMLNS_INTERFACE: continue
39 if child.localName == 'version':
40 self.version_element = child
41 elif child.localName == 'environment':
42 self.env_element = child
44 if self.version_element:
45 self.widgets.get_widget('before').set_text(self.version_element.getAttribute('before') or '')
46 self.widgets.get_widget('not_before').set_text(self.version_element.getAttribute('not-before') or '')
47 if self.env_element:
48 for x in ['name', 'insert']:
49 main.combo_set_text(self.widgets.get_widget('env_' + x), self.env_element.getAttribute(x))
50 self.widgets.get_widget('env_default').set_text(self.env_element.getAttribute('default') or '')
52 def ok():
53 self.update_element(element, self.widgets)
54 else:
55 def ok():
56 element = create_element(parent, 'requires')
57 self.update_element(element, self.widgets)
59 def resp(dialog, r):
60 if r == g.RESPONSE_OK:
61 ok()
62 self.feed_editor.update_version_model()
63 dialog.destroy()
65 dialog = self.widgets.get_widget('requires')
66 dialog.connect('response', resp)
68 def update_uri(self, combo):
69 env_insert = self.widgets.get_widget('env_insert')
70 env_insert.get_model().clear()
72 uri = combo.get_active_text()
73 if uri not in self.known_ifaces: return
75 policy = Policy(uri)
76 policy.network_use = model.network_offline
77 policy.freshness = 0
78 impls = policy.get_ranked_implementations(policy.get_interface(uri))
80 for impl in impls:
81 if impl.id.startswith('/'):
82 cached_impl = impl.id
83 else:
84 try:
85 cached_impl = main.stores.lookup(impl.id)
86 except NotStored, ex:
87 cached_impl = None
88 if cached_impl:
89 for (dirpath, dirnames, filenames) in os.walk(cached_impl):
90 for d in dirnames[:]:
91 if d in ('.svn', 'CVS'):
92 dirnames.remove(d)
93 new = dirpath[len(cached_impl) + 1:]
94 env_insert.append_text(new)
95 break
97 def update_element(self, element, widgets):
98 element.setAttribute('interface', widgets.get_widget('requires_uri').get_active_text())
100 before = widgets.get_widget('before').get_text() or None
101 not_before = widgets.get_widget('not_before').get_text() or None
103 if before: model.parse_version(before)
104 if not_before: model.parse_version(not_before)
106 if before or not_before:
107 if not self.version_element:
108 self.version_element = create_element(element, 'version')
109 set_or_remove(self.version_element, 'before', before)
110 set_or_remove(self.version_element, 'not-before', not_before)
111 elif self.version_element:
112 remove_element(self.version_element)
113 self.version_element = None
115 env_name = widgets.get_widget('env_name').get_active_text()
116 env_insert = widgets.get_widget('env_insert').get_active_text()
117 env_default = widgets.get_widget('env_default').get_text()
119 if env_name:
120 if not self.env_element:
121 self.env_element = create_element(element, 'environment')
122 self.env_element.setAttribute('name', env_name)
123 self.env_element.setAttribute('insert', env_insert)
124 set_or_remove(self.env_element, 'default', env_default)
125 elif env_insert or env_default:
126 raise Exception('Missing environment variable name!')
127 elif self.env_element:
128 remove_element(self.env_element)
129 self.env_element = None