Added --version option.
[0publish-gui.git] / implementation.py
blobf78491bf37033c86eb766bc6f9261c6f1fc77636
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 def get_combo_value(combo):
14 i = combo.get_active()
15 m = combo.get_model()
16 return m[i][0]
18 class ImplementationProperties:
19 def __init__(self, feed_editor, element = None, is_group = False):
20 self.feed_editor = feed_editor
21 self.element = element
23 widgets = gtk.glade.XML(main.gladefile, 'version')
25 #attributes = g.ListStore(str, str)
26 #attr_view = widgets.get_widget('attributes')
27 #attr_view.set_model(attributes)
29 #attr_view.append_column(g.TreeViewColumn('Name'))
30 #attr_view.append_column(g.TreeViewColumn('Value'))
32 inherit_arch = widgets.get_widget('inherit_arch')
33 def shade_os_cpu():
34 s = not inherit_arch.get_active()
35 widgets.get_widget('cpu').set_sensitive(s)
36 widgets.get_widget('os').set_sensitive(s)
37 inherit_arch.connect('toggled', lambda cb: shade_os_cpu())
39 main_menu = widgets.get_widget('main_binary')
41 if element:
42 if element.localName == 'group':
43 is_group = True
44 id = None
45 else:
46 id = element.getAttribute('id')
48 version = element.getAttribute('version') + \
49 (element.getAttribute('version-modifier') or '')
50 widgets.get_widget('version_number').set_text(version)
51 widgets.get_widget('released').set_text(element.getAttribute('released'))
53 main_binary = element.getAttribute('main')
55 stability_menu = widgets.get_widget('stability')
56 stability = element.getAttribute('stability')
57 if stability:
58 i = 0
59 for row in stability_menu.get_model():
60 if row[0].lower() == stability:
61 stability_menu.set_active(i)
62 break
63 i += 1
64 else:
65 stability_menu.set_active(0)
67 main.combo_set_text(widgets.get_widget('license'), element.getAttribute('license'))
68 arch = element.getAttribute('arch')
69 if arch:
70 arch_os, arch_cpu = arch.split('-')
71 main.combo_set_text(widgets.get_widget('os'), arch_os)
72 main.combo_set_text(widgets.get_widget('cpu'), arch_cpu)
73 inherit_arch.set_active(False)
75 def ok():
76 self.update_impl(element, widgets)
77 else:
78 released = widgets.get_widget('released')
80 id = '.'
81 if is_group:
82 widgets.get_widget('version_number').set_text('')
83 released.set_text('')
84 else:
85 widgets.get_widget('version_number').set_text('1.0')
86 released.set_text(time.strftime('%Y-%m-%d'))
88 widgets.get_widget('cpu').set_active(0)
89 widgets.get_widget('os').set_active(0)
90 widgets.get_widget('stability').set_active(0)
91 main_binary = None
93 def ok():
94 if is_group:
95 element_name = 'group'
96 else:
97 element_name = 'implementation'
98 element = create_element(self.feed_editor.doc.documentElement, element_name)
99 if not is_group:
100 element.setAttribute('id', '.')
101 try:
102 self.update_impl(element, widgets)
103 except:
104 remove_element(element)
105 raise
107 shade_os_cpu()
109 self.is_group = is_group
111 id_label = widgets.get_widget('id_label')
113 if is_group:
114 id_label.set_text('(group)')
115 elif id:
116 id_label.set_text(id)
117 if id.startswith('.') or id.startswith('/'):
118 id_label.set_sensitive(True)
119 else:
120 id_label.set_text('-')
122 def resp(dialog, r):
123 if r == g.RESPONSE_OK:
124 ok()
125 self.feed_editor.update_version_model()
126 dialog.destroy()
128 if is_group and element:
129 # Find a cached implementation for getting main
130 for x in child_elements(element):
131 if x.localName == 'implementation' and x.namespaceURI == XMLNS_INTERFACE:
132 id = x.getAttribute('id')
133 try:
134 if id and main.stores.lookup(id):
135 break
136 except NotStored, ex:
137 pass
138 if id:
139 # Find possible main settings, if possible
140 if id.startswith('/') or id.startswith('.'):
141 cached_impl = os.path.abspath(os.path.join(os.path.dirname(feed_editor.pathname), id))
142 else:
143 try:
144 cached_impl = main.stores.lookup(id)
145 except NotStored, ex:
146 cached_impl = None
147 if cached_impl:
148 i = 0
149 for (dirpath, dirnames, filenames) in os.walk(cached_impl):
150 for file in filenames:
151 info = os.stat(os.path.join(dirpath, file))
152 if info.st_mode & 0111:
153 relbasedir = dirpath[len(cached_impl) + 1:]
154 new = os.path.join(relbasedir, file)
155 main_menu.append_text(new)
156 i += 1
157 main.combo_set_text(main_menu, main_binary)
159 dialog = widgets.get_widget('version')
160 dialog.connect('response', resp)
162 def update_impl(self, element, widgets):
163 version = widgets.get_widget('version_number').get_text()
164 released = widgets.get_widget('released').get_text()
165 inherit_arch = widgets.get_widget('inherit_arch')
167 def get_combo(name):
168 widget = widgets.get_widget(name)
169 return widget.get_active_text()
171 cpu = get_combo('cpu')
172 os = get_combo('os')
173 license = get_combo('license')
175 widget = widgets.get_widget('stability')
176 if widget.get_active() == 0:
177 stability = None
178 else:
179 stability = get_combo('stability').lower()
181 if inherit_arch.get_active():
182 arch = None
183 else:
184 arch = os + '-' + cpu
186 main = widgets.get_widget('main_binary').get_active_text()
188 old_id = element.getAttribute('id')
189 if old_id.startswith('/') or old_id.startswith('.'):
190 # Local paths are editable
191 new_id = widgets.get_widget('id_label').get_text()
192 if new_id.startswith('.') or new_id.startswith('/'):
193 element.setAttribute('id', new_id)
194 else:
195 raise Exception('Local IDs must start with "." or "/"')
197 version_modifier = None
198 if version:
199 model.parse_version(version)
200 if '-' in version:
201 version, version_modifier = version.split('-', 1)
202 version_modifier = '-' + version_modifier
204 for name, value in [('version', version),
205 ('version-modifier', version_modifier),
206 ('arch', arch),
207 ('main', main),
208 ('released', released),
209 ('license', license),
210 ('stability', stability)]:
211 if value:
212 element.setAttribute(name, value)
213 elif element.hasAttribute(name):
214 element.removeAttribute(name)