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
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')
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()
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')
48 if element
.localName
== 'group':
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')
69 for row
in stability_menu
.get_model():
70 if row
[0].lower() == stability
:
71 stability_menu
.set_active(i
)
75 stability_menu
.set_active(0)
77 main
.combo_set_text(widgets
.get_widget('license'), element
.getAttribute('license'))
78 arch
= element
.getAttribute('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)
85 widgets
.get_widget('os').set_active(0)
86 widgets
.get_widget('cpu').set_active(0)
89 self
.update_impl(element
, widgets
)
91 released
= widgets
.get_widget('released')
95 widgets
.get_widget('version_number').set_text('')
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)
109 element_name
= 'group'
111 element_name
= 'implementation'
112 element
= create_element(self
.feed_editor
.doc
.documentElement
, element_name
)
114 element
.setAttribute('id', '.')
116 self
.update_impl(element
, widgets
)
118 remove_element(element
)
123 self
.is_group
= is_group
125 id_label
= widgets
.get_widget('id_label')
128 id_label
.set_text('(group)')
130 id_label
.set_text(id)
131 if id.startswith('.') or id.startswith('/'):
132 id_label
.set_sensitive(True)
134 id_label
.set_text('-')
137 if r
in (g
.RESPONSE_OK
, RESPONSE_SAVE_AND_TEST
):
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
))
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')
152 if id and (id.startswith('.') or id.startswith('/') or main
.stores
.lookup(id)):
154 except NotStored
, ex
:
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))
162 cached_impl
= main
.stores
.lookup(id)
163 except NotStored
, ex
:
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('.'):
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')
190 widget
= widgets
.get_widget(name
)
191 return widget
.get_active_text()
193 cpu
= get_combo('cpu')
195 license
= get_combo('license')
197 widget
= widgets
.get_widget('stability')
198 if widget
.get_active() == 0:
201 stability
= get_combo('stability').lower()
203 if inherit_arch
.get_active():
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
)
218 raise Exception('Local IDs must start with "." or "/"')
220 version_modifier
= None
222 model
.parse_version(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
),
232 ('released', released
),
233 ('license', license
),
234 ('stability', stability
)]:
236 element
.setAttribute(name
, value
)
237 elif element
.hasAttribute(name
):
238 element
.removeAttribute(name
)
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
)
246 compile_command
= compile_binary_main
= None
248 for name
, value
in [('command', compile_command
),
249 ('binary-main', compile_binary_main
)]:
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):
258 if element
.hasAttribute('version'):
259 version
= element
.getAttribute('version')
261 element
= element
.parentNode
262 if element
.namespaceURI
!= XMLNS_INTERFACE
:
264 if element
.localName
!= 'group':
268 # TODO: 0compile doesn't allow setting the version
269 self
.feed_editor
.test_compile([])
272 args
= ['--not-before', version
, '--before', version
+ '-0-pre9999']
275 self
.feed_editor
.test(args
)