-
Notifications
You must be signed in to change notification settings - Fork 0
/
requires.py
140 lines (114 loc) · 4.56 KB
/
requires.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import rox, os
import gtk.glade
import main
from xmltools import *
from rox import g
from zeroinstall.zerostore import NotStored
from zeroinstall.injector import model
from zeroinstall.injector.iface_cache import iface_cache
class Requires:
def __init__(self, feed_editor, parent, element = None):
self.feed_editor = feed_editor
self.element = element
self.widgets = gtk.glade.XML(main.gladefile, 'requires')
uri = self.widgets.get_widget('requires_uri')
stream = os.popen('0launch --list')
self.known_ifaces = [line.strip() for line in stream if not line.startswith('/')]
self.known_ifaces.sort()
stream.close()
for x in self.known_ifaces:
uri.append_text(x)
uri.connect('changed', self.update_uri)
self.version_element = None # Last <version> child
self.env_element = None # Last <environment> child
env_combo = self.widgets.get_widget('env_mode')
main.combo_set_text(env_combo, 'Prepend')
def mode_changed(combo):
self.widgets.get_widget('env_default').set_sensitive(env_combo.get_active_text() != 'Replace')
env_combo.connect('changed', mode_changed)
if element:
main.combo_set_text(uri, element.getAttribute('interface'))
for child in child_elements(element):
if child.namespaceURI != XMLNS_INTERFACE: continue
if child.localName == 'version':
self.version_element = child
elif child.localName == 'environment':
self.env_element = child
if self.version_element:
self.widgets.get_widget('before').set_text(self.version_element.getAttribute('before') or '')
self.widgets.get_widget('not_before').set_text(self.version_element.getAttribute('not-before') or '')
if self.env_element:
for x in ['name', 'insert']:
main.combo_set_text(self.widgets.get_widget('env_' + x), self.env_element.getAttribute(x))
self.widgets.get_widget('env_default').set_text(self.env_element.getAttribute('default') or '')
main.combo_set_text(env_combo,
self.env_element.getAttribute('mode').capitalize() or 'Prepend')
def ok():
self.update_element(element, self.widgets)
else:
def ok():
element = create_element(parent, 'requires')
self.update_element(element, self.widgets)
def resp(dialog, r):
if r == g.RESPONSE_OK:
ok()
self.feed_editor.update_version_model()
dialog.destroy()
mode_changed(env_combo)
dialog = self.widgets.get_widget('requires')
dialog.connect('response', resp)
def update_uri(self, combo):
env_insert = self.widgets.get_widget('env_insert')
env_insert.get_model().clear()
uri = combo.get_active_text()
if uri not in self.known_ifaces: return
impls = iface_cache.get_interface(uri).implementations.values()
impls.sort()
for impl in impls:
if impl.id.startswith('/'):
cached_impl = impl.id
elif impl.id.startswith('package:'):
cached_impl = None
else:
try:
cached_impl = main.stores.lookup(impl.id)
except NotStored, ex:
cached_impl = None
if cached_impl:
for (dirpath, dirnames, filenames) in os.walk(cached_impl):
for d in dirnames[:]:
if d in ('.svn', 'CVS'):
dirnames.remove(d)
new = dirpath[len(cached_impl) + 1:]
env_insert.append_text(new)
break
def update_element(self, element, widgets):
element.setAttribute('interface', widgets.get_widget('requires_uri').get_active_text())
before = widgets.get_widget('before').get_text() or None
not_before = widgets.get_widget('not_before').get_text() or None
if before: model.parse_version(before)
if not_before: model.parse_version(not_before)
if before or not_before:
if not self.version_element:
self.version_element = create_element(element, 'version')
set_or_remove(self.version_element, 'before', before)
set_or_remove(self.version_element, 'not-before', not_before)
elif self.version_element:
remove_element(self.version_element)
self.version_element = None
env_name = widgets.get_widget('env_name').get_active_text()
env_insert = widgets.get_widget('env_insert').get_active_text()
env_mode = widgets.get_widget('env_mode').get_active_text().lower()
env_default = widgets.get_widget('env_default').get_text()
if env_name:
if not self.env_element:
self.env_element = create_element(element, 'environment')
self.env_element.setAttribute('name', env_name)
self.env_element.setAttribute('insert', env_insert)
self.env_element.setAttribute('mode', env_mode)
set_or_remove(self.env_element, 'default', env_default)
elif env_insert or env_default:
raise Exception('Missing environment variable name!')
elif self.env_element:
remove_element(self.env_element)
self.env_element = None