Replace GPL license entry with options for versions 2 and 3.
[0publish-gui.git] / implementation.py
blobfc4ca900e221839bca6c32c5566ce50b0b61b074
1 from xml.dom import Node, minidom
3 import rox, os, pango, sys, textwrap, traceback, subprocess, time, urlparse
4 from rox import g, tasks, loading
5 import gtk.glade
7 import main
8 from xmltools import *
10 from zeroinstall.injector import model
11 from zeroinstall.zerostore import unpack, NotStored
13 RESPONSE_SAVE_AND_TEST = 1
15 class ImplementationProperties:
16 def __init__(self, feed_editor, element = None, is_group = False):
17 self.feed_editor = feed_editor
18 self.element = element
20 widgets = gtk.glade.XML(main.gladefile, 'version')
22 #attributes = g.ListStore(str, str)
23 #attr_view = widgets.get_widget('attributes')
24 #attr_view.set_model(attributes)
26 #attr_view.append_column(g.TreeViewColumn('Name'))
27 #attr_view.append_column(g.TreeViewColumn('Value'))
29 inherit_arch = widgets.get_widget('inherit_arch')
30 def shade_os_cpu():
31 s = not inherit_arch.get_active()
32 widgets.get_widget('cpu').set_sensitive(s)
33 widgets.get_widget('os').set_sensitive(s)
34 if s and widgets.get_widget('cpu').get_active_text() == 'src':
35 widgets.get_widget('source_frame').show()
36 else:
37 widgets.get_widget('source_frame').hide()
38 command = widgets.get_widget('compile_command')
39 if command.get_text() == '':
40 command.set_text('"$SRCDIR/configure" --prefix="$DISTDIR" && make install')
41 inherit_arch.connect('toggled', lambda cb: shade_os_cpu())
42 widgets.get_widget('cpu').connect('changed', lambda cb: shade_os_cpu())
44 main_menu = widgets.get_widget('main_binary')
45 doc_menu = widgets.get_widget('doc_dir')
47 if element:
48 if element.localName == 'group':
49 is_group = True
50 id = None
51 else:
52 id = element.getAttribute('id')
54 version = element.getAttribute('version') + \
55 (element.getAttribute('version-modifier') or '')
56 widgets.get_widget('version_number').set_text(version)
57 widgets.get_widget('released').set_text(element.getAttribute('released'))
59 widgets.get_widget('compile_command').set_text(element.getAttributeNS(XMLNS_COMPILE, 'command'))
60 widgets.get_widget('compile_binary_main').set_text(element.getAttributeNS(XMLNS_COMPILE, 'binary-main'))
62 main_binary = element.getAttribute('main')
63 doc_dir = element.getAttribute('doc-dir')
65 stability_menu = widgets.get_widget('stability')
66 stability = element.getAttribute('stability')
67 if stability:
68 i = 0
69 for row in stability_menu.get_model():
70 if row[0].lower() == stability:
71 stability_menu.set_active(i)
72 break
73 i += 1
74 else:
75 stability_menu.set_active(0)
77 main.combo_set_text(widgets.get_widget('license'), element.getAttribute('license'))
78 arch = element.getAttribute('arch')
79 if arch:
80 arch_os, arch_cpu = arch.split('-')
81 main.combo_set_text(widgets.get_widget('os'), arch_os)
82 main.combo_set_text(widgets.get_widget('cpu'), arch_cpu)
83 inherit_arch.set_active(False)
84 else:
85 widgets.get_widget('os').set_active(0)
86 widgets.get_widget('cpu').set_active(0)
88 def ok():
89 self.update_impl(element, widgets)
90 else:
91 released = widgets.get_widget('released')
93 id = '.'
94 if is_group:
95 widgets.get_widget('version_number').set_text('')
96 released.set_text('')
97 else:
98 widgets.get_widget('version_number').set_text('1.0')
99 released.set_text(time.strftime('%Y-%m-%d'))
101 widgets.get_widget('cpu').set_active(0)
102 widgets.get_widget('os').set_active(0)
103 widgets.get_widget('stability').set_active(0)
104 main_binary = None
105 doc_dir = None
107 def ok():
108 if is_group:
109 element_name = 'group'
110 else:
111 element_name = 'implementation'
112 element = create_element(self.feed_editor.doc.documentElement, element_name)
113 if not is_group:
114 element.setAttribute('id', '.')
115 try:
116 self.update_impl(element, widgets)
117 except:
118 remove_element(element)
119 raise
121 shade_os_cpu()
123 self.is_group = is_group
125 id_label = widgets.get_widget('id_label')
127 if is_group:
128 id_label.set_text('(group)')
129 elif id:
130 id_label.set_text(id)
131 if id.startswith('.') or id.startswith('/'):
132 id_label.set_sensitive(True)
133 else:
134 id_label.set_text('-')
136 def resp(dialog, r):
137 if r in (g.RESPONSE_OK, RESPONSE_SAVE_AND_TEST):
138 ok()
139 self.feed_editor.update_version_model()
140 if r == RESPONSE_SAVE_AND_TEST:
141 is_src = bool(widgets.get_widget('source_frame').flags() & gtk.VISIBLE)
142 self.feed_editor.save(lambda: self.test(element, is_src))
143 else:
144 dialog.destroy()
146 if is_group and element:
147 # Find a cached implementation for getting main
148 for x in child_elements(element):
149 if x.localName == 'implementation' and x.namespaceURI == XMLNS_INTERFACE:
150 id = x.getAttribute('id')
151 try:
152 if id and (id.startswith('.') or id.startswith('/') or main.stores.lookup(id)):
153 break
154 except NotStored, ex:
155 pass
156 if id and (element or id != '.'):
157 # Find possible main settings, if possible
158 if id.startswith('/') or id.startswith('.'):
159 cached_impl = os.path.abspath(os.path.join(os.path.dirname(feed_editor.pathname), id))
160 else:
161 try:
162 cached_impl = main.stores.lookup(id)
163 except NotStored, ex:
164 cached_impl = None
165 if cached_impl:
166 for (dirpath, dirnames, filenames) in os.walk(cached_impl):
167 relbasedir = dirpath[len(cached_impl) + 1:]
168 for file in filenames:
169 info = os.lstat(os.path.join(dirpath, file))
170 if info.st_mode & 0111:
171 new = os.path.join(relbasedir, file)
172 main_menu.append_text(new)
173 for d in dirnames[:]:
174 if d.startswith('.'):
175 dirnames.remove(d)
176 else:
177 doc_menu.append_text(os.path.join(relbasedir, d))
178 main.combo_set_text(main_menu, main_binary)
179 main.combo_set_text(doc_menu, doc_dir)
181 dialog = widgets.get_widget('version')
182 dialog.connect('response', resp)
184 def update_impl(self, element, widgets):
185 version = widgets.get_widget('version_number').get_text()
186 released = widgets.get_widget('released').get_text()
187 inherit_arch = widgets.get_widget('inherit_arch')
189 def get_combo(name):
190 widget = widgets.get_widget(name)
191 return widget.get_active_text()
193 cpu = get_combo('cpu')
194 os = get_combo('os')
195 license = get_combo('license')
197 widget = widgets.get_widget('stability')
198 if widget.get_active() == 0:
199 stability = None
200 else:
201 stability = get_combo('stability').lower()
203 if inherit_arch.get_active():
204 arch = None
205 else:
206 arch = os + '-' + cpu
208 main = widgets.get_widget('main_binary').get_active_text()
209 docs = widgets.get_widget('doc_dir').get_active_text()
211 old_id = element.getAttribute('id')
212 if old_id.startswith('/') or old_id.startswith('.'):
213 # Local paths are editable
214 new_id = widgets.get_widget('id_label').get_text()
215 if new_id.startswith('.') or new_id.startswith('/'):
216 element.setAttribute('id', new_id)
217 else:
218 raise Exception('Local IDs must start with "." or "/"')
220 version_modifier = None
221 if version:
222 model.parse_version(version)
223 if '-' in version:
224 version, version_modifier = version.split('-', 1)
225 version_modifier = '-' + version_modifier
227 for name, value in [('version', version),
228 ('version-modifier', version_modifier),
229 ('arch', arch),
230 ('main', main),
231 ('doc-dir', docs),
232 ('released', released),
233 ('license', license),
234 ('stability', stability)]:
235 if value:
236 element.setAttribute(name, value)
237 elif element.hasAttribute(name):
238 element.removeAttribute(name)
240 # Source packages
241 if widgets.get_widget('source_frame').flags() & gtk.VISIBLE:
242 compile_command = widgets.get_widget('compile_command').get_text()
243 compile_binary_main = widgets.get_widget('compile_binary_main').get_text()
244 self.feed_editor.doc.documentElement.setAttribute('xmlns:compile', XMLNS_COMPILE)
245 else:
246 compile_command = compile_binary_main = None
248 for name, value in [('command', compile_command),
249 ('binary-main', compile_binary_main)]:
250 if value:
251 element.setAttributeNS(XMLNS_COMPILE, 'compile:' + name, value)
252 elif element.hasAttributeNS(XMLNS_COMPILE, name):
253 element.removeAttributeNS(XMLNS_COMPILE, name)
255 def test(self, element, compile):
256 version = None
257 while element:
258 if element.hasAttribute('version'):
259 version = element.getAttribute('version')
260 break
261 element = element.parentNode
262 if element.namespaceURI != XMLNS_INTERFACE:
263 break
264 if element.localName != 'group':
265 break
267 if compile:
268 # TODO: 0compile doesn't allow setting the version
269 self.feed_editor.test_compile([])
270 else:
271 if version:
272 args = ['--not-before', version, '--before', version + '-0-pre9999']
273 else:
274 args = []
275 self.feed_editor.test(args)