Warn about tar archives with a leading "./" in the name.
[0publish-gui.git] / requires.py
blob51beaeccd421328fb1e60826bd220ca093c5e5ef
1 import 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.iface_cache import iface_cache
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 env_combo = self.widgets.get_widget('env_mode')
35 main.combo_set_text(env_combo, 'Prepend')
36 def mode_changed(combo):
37 self.widgets.get_widget('env_default').set_sensitive(env_combo.get_active_text() != 'Replace')
38 env_combo.connect('changed', mode_changed)
40 if element:
41 main.combo_set_text(uri, element.getAttribute('interface'))
43 for child in child_elements(element):
44 if child.namespaceURI != XMLNS_INTERFACE: continue
45 if child.localName == 'version':
46 self.version_element = child
47 elif child.localName == 'environment':
48 self.env_element = child
50 if self.version_element:
51 self.widgets.get_widget('before').set_text(self.version_element.getAttribute('before') or '')
52 self.widgets.get_widget('not_before').set_text(self.version_element.getAttribute('not-before') or '')
53 if self.env_element:
54 for x in ['name', 'insert']:
55 main.combo_set_text(self.widgets.get_widget('env_' + x), self.env_element.getAttribute(x))
56 self.widgets.get_widget('env_default').set_text(self.env_element.getAttribute('default') or '')
57 main.combo_set_text(env_combo,
58 self.env_element.getAttribute('mode').capitalize() or 'Prepend')
60 def ok():
61 self.update_element(element, self.widgets)
62 else:
63 def ok():
64 element = create_element(parent, 'requires')
65 self.update_element(element, self.widgets)
67 def resp(dialog, r):
68 if r == g.RESPONSE_OK:
69 ok()
70 self.feed_editor.update_version_model()
71 dialog.destroy()
73 mode_changed(env_combo)
74 dialog = self.widgets.get_widget('requires')
75 dialog.connect('response', resp)
77 def update_uri(self, combo):
78 env_insert = self.widgets.get_widget('env_insert')
79 env_insert.get_model().clear()
81 uri = combo.get_active_text()
82 if uri not in self.known_ifaces: return
84 impls = iface_cache.get_interface(uri).implementations.values()
85 impls.sort()
87 for impl in impls:
88 if impl.id.startswith('/'):
89 cached_impl = impl.id
90 elif impl.id.startswith('package:'):
91 cached_impl = None
92 else:
93 try:
94 cached_impl = main.stores.lookup(impl.id)
95 except NotStored, ex:
96 cached_impl = None
97 if cached_impl:
98 for (dirpath, dirnames, filenames) in os.walk(cached_impl):
99 for d in dirnames[:]:
100 if d in ('.svn', 'CVS'):
101 dirnames.remove(d)
102 new = dirpath[len(cached_impl) + 1:]
103 env_insert.append_text(new)
104 break
106 def update_element(self, element, widgets):
107 element.setAttribute('interface', widgets.get_widget('requires_uri').get_active_text())
109 before = widgets.get_widget('before').get_text() or None
110 not_before = widgets.get_widget('not_before').get_text() or None
112 if before: model.parse_version(before)
113 if not_before: model.parse_version(not_before)
115 if before or not_before:
116 if not self.version_element:
117 self.version_element = create_element(element, 'version')
118 set_or_remove(self.version_element, 'before', before)
119 set_or_remove(self.version_element, 'not-before', not_before)
120 elif self.version_element:
121 remove_element(self.version_element)
122 self.version_element = None
124 env_name = widgets.get_widget('env_name').get_active_text()
125 env_insert = widgets.get_widget('env_insert').get_active_text()
126 env_mode = widgets.get_widget('env_mode').get_active_text().lower()
127 env_default = widgets.get_widget('env_default').get_text()
129 if env_name:
130 if not self.env_element:
131 self.env_element = create_element(element, 'environment')
132 self.env_element.setAttribute('name', env_name)
133 self.env_element.setAttribute('insert', env_insert)
134 self.env_element.setAttribute('mode', env_mode)
135 set_or_remove(self.env_element, 'default', env_default)
136 elif env_insert or env_default:
137 raise Exception('Missing environment variable name!')
138 elif self.env_element:
139 remove_element(self.env_element)
140 self.env_element = None