Entropy/Spritz/Repository Manager:
- use some hacks to avoid crashes when playing with gtk events on different threads (add a strong thread locking system) - complete the 'activator' part Entropy/Spritz/Connection Manager window: - add the ability to save connections for easy retrieval svn ci -m git-svn-id: http://svn.sabayonlinux.org/projects/entropy/trunk@2455 cd1c1023-2f26-0410-ae45-c471fc1f0318
This commit is contained in:
@@ -56,8 +56,11 @@ class MenuSkel:
|
||||
|
||||
class RemoteConnectionMenu(MenuSkel):
|
||||
|
||||
def __init__( self, verification_callback, window ):
|
||||
import dumpTools
|
||||
store_path = 'connection_manager'
|
||||
def __init__( self, Entropy, verification_callback, window ):
|
||||
|
||||
self.Entropy = Entropy
|
||||
# hostname, port, username, password, ssl will be passed as parameters
|
||||
self.verification_callback = verification_callback
|
||||
self.window = window
|
||||
@@ -65,9 +68,123 @@ class RemoteConnectionMenu(MenuSkel):
|
||||
self.cm_ui.signal_autoconnect(self._getAllMethods())
|
||||
self.cm_ui.remoteConnManager.set_transient_for(self.window)
|
||||
self.cm_ui.remoteConnManager.add_events(gtk.gdk.BUTTON_PRESS_MASK)
|
||||
self.connStore = gtk.ListStore( gobject.TYPE_PYOBJECT )
|
||||
self.connView = self.cm_ui.connManagerConnView
|
||||
self.connView.set_model(self.connStore)
|
||||
self.button_pressed = False
|
||||
self.loaded = False
|
||||
self.parameters = None
|
||||
self.connection_data = self.get_stored_connection_data()
|
||||
self.setup_view()
|
||||
|
||||
def on_connManagerAddConnButton_clicked(self, widget):
|
||||
|
||||
def fake_callback(s):
|
||||
return s
|
||||
|
||||
def fake_callback_cb(s):
|
||||
return True
|
||||
|
||||
input_params = [
|
||||
('name',_("Connection name"),fake_callback,False),
|
||||
('hostname',_("Hostname"),fake_callback,False),
|
||||
('port',_("Port"),fake_callback,False),
|
||||
('user',_("Username"),fake_callback,False),
|
||||
('ssl',('checkbox',_('SSL Connection'),),fake_callback_cb,False),
|
||||
]
|
||||
data = self.Entropy.inputBox(
|
||||
_('Choose what kind of test you would like to run'),
|
||||
input_params,
|
||||
cancel_button = True
|
||||
)
|
||||
if data == None: return
|
||||
self.store_connection_data_item(data)
|
||||
self.fill_connection_view()
|
||||
self.store_connection_data()
|
||||
|
||||
def on_connManagerSetConnButton_clicked(self, widget):
|
||||
model, myiter = self.connView.get_selection().get_selected()
|
||||
if not myiter: return
|
||||
obj = model.get_value(myiter, 0)
|
||||
self.cm_ui.connManagerHostnameEntry.set_text(obj['hostname'])
|
||||
self.cm_ui.connManagerPortSpinButton.set_value(float(obj['port']))
|
||||
self.cm_ui.connManagerUsernameEntry.set_text(obj['user'])
|
||||
self.cm_ui.connManagerPasswordEntry.set_text('')
|
||||
self.cm_ui.connManagerSSLCheckButton.set_active(obj['ssl'])
|
||||
#self.cm_ui.remoteConnEventBox.queue_draw()
|
||||
|
||||
def on_connManagerRemoveConnButton_clicked(self, widget):
|
||||
model, myiter = self.connView.get_selection().get_selected()
|
||||
if not myiter: return
|
||||
obj = model.get_value(myiter, 0)
|
||||
self.remove_connection_data_item(obj)
|
||||
self.fill_connection_view()
|
||||
self.store_connection_data()
|
||||
|
||||
def get_stored_connection_data(self):
|
||||
obj = self.dumpTools.loadobj(self.store_path)
|
||||
if not obj: return []
|
||||
return obj
|
||||
|
||||
def remove_connection_data_item(self, item):
|
||||
if item in self.connection_data:
|
||||
self.connection_data.remove(item)
|
||||
|
||||
def store_connection_data_item(self, item):
|
||||
self.connection_data.append(item)
|
||||
|
||||
def store_connection_data(self):
|
||||
self.dumpTools.dumpobj(self.store_path, self.connection_data)
|
||||
|
||||
def fill_connection_view(self):
|
||||
self.connStore.clear()
|
||||
for item in self.connection_data:
|
||||
self.connStore.append( (item,) )
|
||||
self.connView.queue_draw()
|
||||
|
||||
def setup_view(self):
|
||||
|
||||
self.create_text_column( self.connView, _( "Connection" ), 'name', size = 200, expand = True)
|
||||
self.create_text_column( self.connView, _( "Hostname" ), 'hostname', size = 100)
|
||||
self.create_text_column( self.connView, _( "Port" ), 'port', size = 50)
|
||||
|
||||
# SSL
|
||||
cell = gtk.CellRendererPixbuf()
|
||||
column = gtk.TreeViewColumn( _("SSL"), cell ) # Document Type
|
||||
column.set_cell_data_func( cell, self.ssl_pixbuf )
|
||||
column.set_sizing( gtk.TREE_VIEW_COLUMN_FIXED )
|
||||
column.set_fixed_width( 50 )
|
||||
column.set_sort_column_id( -1 )
|
||||
self.connView.append_column( column )
|
||||
|
||||
self.fill_connection_view()
|
||||
|
||||
|
||||
def ssl_pixbuf( self, column, cell, model, myiter ):
|
||||
obj = model.get_value( myiter, 0 )
|
||||
if obj:
|
||||
if obj['ssl']:
|
||||
cell.set_property( 'stock-id', 'gtk-apply' )
|
||||
return
|
||||
cell.set_property( 'stock-id', 'gtk-cancel' )
|
||||
|
||||
def get_data_text( self, column, cell, model, myiter, property ):
|
||||
obj = model.get_value( myiter, 0 )
|
||||
if obj: cell.set_property('markup',obj[property])
|
||||
|
||||
def create_text_column( self, view, hdr, property, size, sortcol = None, expand = False, set_height = 0, cell_data_func = None, sort_col_id = -1):
|
||||
if cell_data_func == None: cell_data_func = self.get_data_text
|
||||
cell = gtk.CellRendererText()
|
||||
if set_height: cell.set_property('height', set_height)
|
||||
column = gtk.TreeViewColumn( hdr, cell )
|
||||
column.set_resizable( True )
|
||||
column.set_cell_data_func( cell, cell_data_func, property )
|
||||
column.set_sizing( gtk.TREE_VIEW_COLUMN_FIXED )
|
||||
column.set_fixed_width( size )
|
||||
column.set_expand(expand)
|
||||
column.set_sort_column_id( sort_col_id )
|
||||
view.append_column( column )
|
||||
return column
|
||||
|
||||
def load( self ):
|
||||
bold_items = [
|
||||
@@ -139,6 +256,7 @@ class RemoteConnectionMenu(MenuSkel):
|
||||
|
||||
class RepositoryManagerMenu(MenuSkel):
|
||||
|
||||
import threading
|
||||
def __init__(self, Entropy, window):
|
||||
self.BufferLock = thread.allocate_lock()
|
||||
import entropyTools
|
||||
@@ -157,7 +275,8 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
self.PinboardData = {}
|
||||
self.Queue = {}
|
||||
self.QueueLock = thread.allocate_lock()
|
||||
self.UpdatesLock = thread.allocate_lock()
|
||||
self.OutputLock = thread.allocate_lock()
|
||||
self.EventLock = self.threading.RLock()
|
||||
self.Output = None
|
||||
self.output_pause = False
|
||||
self.queue_pause = False
|
||||
@@ -181,6 +300,8 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
self.DataView = self.sm_ui.repoManagerDataView
|
||||
self.DataView.set_model(self.DataStore)
|
||||
self.DataViewBox = self.sm_ui.repoManagerDataViewBox
|
||||
self.DataViewButtons = {}
|
||||
self.setup_data_view_buttons()
|
||||
self.data_tree_selection_mode = self.DataView.get_selection().get_mode()
|
||||
|
||||
from entropy import SystemManagerClientInterface, \
|
||||
@@ -195,9 +316,22 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
self.setup_commands_view()
|
||||
self.fill_commands_view(self.Service.get_available_client_commands())
|
||||
self.ServiceStatus = True
|
||||
self.connection_done = False
|
||||
|
||||
self.setup_available_repositories()
|
||||
|
||||
def __del__(self):
|
||||
if hasattr(self,'connection_done'):
|
||||
if self.connection_done:
|
||||
self.Service.kill_all_connections()
|
||||
|
||||
def on_repoManagerEvent_event(self, widget, event):
|
||||
self.EventLock.acquire()
|
||||
return False
|
||||
|
||||
def on_repoManagerEvent_event_after(self, widget, event):
|
||||
self.EventLock.release()
|
||||
|
||||
def set_notebook_page(self, page):
|
||||
self.sm_ui.repoManagerNotebook.set_current_page(page)
|
||||
|
||||
@@ -205,6 +339,118 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
adj.set_value(adj.upper-adj.page_size)
|
||||
scroll.set_vadjustment(adj)
|
||||
|
||||
def setup_data_view_buttons(self):
|
||||
|
||||
glsa_package_info_button = gtk.Button(label = _("Packages information"))
|
||||
glsa_package_info_image = gtk.Image()
|
||||
glsa_package_info_image.set_from_stock(gtk.STOCK_INFO, 4)
|
||||
glsa_package_info_button.set_image(glsa_package_info_image)
|
||||
|
||||
glsa_adv_info_button = gtk.Button(label = _("Advisory information"))
|
||||
glsa_adv_info_image = gtk.Image()
|
||||
glsa_adv_info_image.set_from_stock(gtk.STOCK_EDIT, 4)
|
||||
glsa_adv_info_button.set_image(glsa_adv_info_image)
|
||||
|
||||
#
|
||||
|
||||
mirror_updates_execute_button = gtk.Button(label = _("Execute"))
|
||||
mirror_updates_execute_button_image = gtk.Image()
|
||||
mirror_updates_execute_button_image.set_from_stock(gtk.STOCK_EXECUTE, 4)
|
||||
mirror_updates_execute_button.set_image(mirror_updates_execute_button_image)
|
||||
|
||||
#
|
||||
|
||||
database_updates_package_info_button = gtk.Button(label = _("Packages information"))
|
||||
database_updates_package_info_image = gtk.Image()
|
||||
database_updates_package_info_image.set_from_stock(gtk.STOCK_INFO, 4)
|
||||
database_updates_package_info_button.set_image(database_updates_package_info_image)
|
||||
|
||||
database_updates_change_repo_button = gtk.Button(label = _("Destination repository"))
|
||||
database_updates_change_repo_image = gtk.Image()
|
||||
database_updates_change_repo_image.set_from_stock(gtk.STOCK_CONVERT, 4)
|
||||
database_updates_change_repo_button.set_image(database_updates_change_repo_image)
|
||||
|
||||
database_updates_execute_button = gtk.Button(label = _("Execute"))
|
||||
database_updates_execute_button_image = gtk.Image()
|
||||
database_updates_execute_button_image.set_from_stock(gtk.STOCK_EXECUTE, 4)
|
||||
database_updates_execute_button.set_image(database_updates_execute_button_image)
|
||||
|
||||
#
|
||||
|
||||
available_packages_package_info_button = gtk.Button(label = _("Packages information"))
|
||||
available_packages_package_info_image = gtk.Image()
|
||||
available_packages_package_info_image.set_from_stock(gtk.STOCK_INFO, 4)
|
||||
available_packages_package_info_button.set_image(available_packages_package_info_image)
|
||||
|
||||
available_packages_remove_package_button = gtk.Button(label = _("Remove packages"))
|
||||
available_packages_remove_package_image = gtk.Image()
|
||||
available_packages_remove_package_image.set_from_stock(gtk.STOCK_REMOVE, 4)
|
||||
available_packages_remove_package_button.set_image(available_packages_remove_package_image)
|
||||
|
||||
available_packages_move_package_button = gtk.Button(label = _("Copy/move packages"))
|
||||
available_packages_move_package_image = gtk.Image()
|
||||
available_packages_move_package_image.set_from_stock(gtk.STOCK_COPY, 4)
|
||||
available_packages_move_package_button.set_image(available_packages_move_package_image)
|
||||
|
||||
categories_updates_compile_button = gtk.Button(label = _("Compile selected"))
|
||||
categories_updates_compile_image = gtk.Image()
|
||||
categories_updates_compile_image.set_from_stock(gtk.STOCK_GOTO_BOTTOM, 4)
|
||||
categories_updates_compile_button.set_image(categories_updates_compile_image)
|
||||
|
||||
categories_updates_add_use_button = gtk.Button(label = _("Add USE"))
|
||||
categories_updates_add_use_image = gtk.Image()
|
||||
categories_updates_add_use_image.set_from_stock(gtk.STOCK_ADD, 4)
|
||||
categories_updates_add_use_button.set_image(categories_updates_add_use_image)
|
||||
|
||||
categories_updates_remove_use_button = gtk.Button(label = _("Remove USE"))
|
||||
categories_updates_remove_use_image = gtk.Image()
|
||||
categories_updates_remove_use_image.set_from_stock(gtk.STOCK_REMOVE, 4)
|
||||
categories_updates_remove_use_button.set_image(categories_updates_remove_use_image)
|
||||
|
||||
self.DataViewButtons = {
|
||||
'glsa': {
|
||||
'package_info_button': glsa_package_info_button,
|
||||
'adv_info_button': glsa_adv_info_button,
|
||||
'order': ['package_info_button','adv_info_button']
|
||||
},
|
||||
'mirror_updates': {
|
||||
'execute_button': mirror_updates_execute_button,
|
||||
'order': ['execute_button']
|
||||
},
|
||||
'database_updates': {
|
||||
'package_info_button': database_updates_package_info_button,
|
||||
'change_repo_button': database_updates_change_repo_button,
|
||||
'execute_button': database_updates_execute_button,
|
||||
'order': ['package_info_button','change_repo_button','execute_button']
|
||||
},
|
||||
'available_packages': {
|
||||
'package_info_button': available_packages_package_info_button,
|
||||
'remove_package_button': available_packages_remove_package_button,
|
||||
'move_package_button': available_packages_move_package_button,
|
||||
'order': ['package_info_button','remove_package_button','move_package_button']
|
||||
},
|
||||
'categories_updates': {
|
||||
'compile_button': categories_updates_compile_button,
|
||||
'add_use_button': categories_updates_add_use_button,
|
||||
'remove_use_button': categories_updates_remove_use_button,
|
||||
'order': ['compile_button','add_use_button','remove_use_button']
|
||||
},
|
||||
}
|
||||
|
||||
for cat in self.DataViewButtons:
|
||||
for w_id in self.DataViewButtons[cat]['order']:
|
||||
self.DataViewBox.pack_start(self.DataViewButtons[cat][w_id], False, False, 1)
|
||||
|
||||
def show_data_view_buttons_cat(self, cat):
|
||||
if cat in self.DataViewButtons:
|
||||
for w_id in self.DataViewButtons[cat]['order']:
|
||||
self.DataViewButtons[cat][w_id].show()
|
||||
|
||||
def hide_all_data_view_buttons(self):
|
||||
for cat in self.DataViewButtons:
|
||||
for w_id in self.DataViewButtons[cat]['order']:
|
||||
self.DataViewButtons[cat][w_id].hide()
|
||||
|
||||
def setup_available_repositories(self):
|
||||
self.EntropyRepositories = {}
|
||||
self.EntropyRepositoryCombo = self.sm_ui.repoManagerRepositoryCombo
|
||||
@@ -307,13 +553,6 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
view.append_column( column )
|
||||
return column
|
||||
|
||||
def set_pixbuf_to_cell(self, cell, filename):
|
||||
try:
|
||||
pixbuf = gtk.gdk.pixbuf_new_from_file(filename)
|
||||
cell.set_property( 'pixbuf', pixbuf )
|
||||
except gobject.GError:
|
||||
pass
|
||||
|
||||
def queue_pixbuf( self, column, cell, model, myiter ):
|
||||
obj = model.get_value( myiter, 0 )
|
||||
if isinstance(obj,dict):
|
||||
@@ -445,22 +684,19 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
return False, "%s: %s" % (_("Connection Error"),e,)
|
||||
srv.close_session(session)
|
||||
srv.disconnect()
|
||||
self.connection_done = True
|
||||
return True, None
|
||||
|
||||
def load(self):
|
||||
|
||||
my = RemoteConnectionMenu(self.connection_verification_callback, self.window)
|
||||
my = RemoteConnectionMenu(self.Entropy, self.connection_verification_callback, self.window)
|
||||
my.load()
|
||||
login_data = my.run()
|
||||
if not login_data:
|
||||
return False
|
||||
|
||||
bold_items = []
|
||||
for item in bold_items:
|
||||
t = item.get_text()
|
||||
item.set_markup("<b>%s</b>" % (t,))
|
||||
|
||||
self.sm_ui.repositoryManager.show_all()
|
||||
self.hide_all_data_view_buttons()
|
||||
|
||||
# spawn parallel tasks
|
||||
self.QueueUpdater.start()
|
||||
@@ -472,18 +708,21 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
|
||||
def wait_channel_call(self):
|
||||
self.BufferLock.acquire()
|
||||
context_id = self.sm_ui.repoManagerStatusbar.get_context_id( "Status" )
|
||||
'''
|
||||
# what a mess are gtk statusbars? crashy as hell
|
||||
gtk.gdk.threads_enter()
|
||||
self.sm_ui.repoManagerStatusbar.push(context_id, _("Please wait"))
|
||||
self.sm_ui.repoManagerStatusbar.push(0, _("Please wait"))
|
||||
self.sm_ui.repoManagerStatusbar.queue_draw()
|
||||
gtk.gdk.threads_leave()
|
||||
'''
|
||||
|
||||
def release_channel_call(self):
|
||||
context_id = self.sm_ui.repoManagerStatusbar.get_context_id( "Status" )
|
||||
'''
|
||||
gtk.gdk.threads_enter()
|
||||
self.sm_ui.repoManagerStatusbar.push(context_id, _("Ready"))
|
||||
self.sm_ui.repoManagerStatusbar.push(0, _("Ready"))
|
||||
self.sm_ui.repoManagerStatusbar.queue_draw()
|
||||
gtk.gdk.threads_leave()
|
||||
'''
|
||||
self.BufferLock.release()
|
||||
|
||||
def get_item_by_queue_id(self, queue_id):
|
||||
@@ -505,6 +744,7 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
gtk.gdk.threads_leave()
|
||||
|
||||
def load_available_repositories(self):
|
||||
|
||||
self.wait_channel_call()
|
||||
try:
|
||||
status, repo_info = self.Service.Methods.get_available_repositories()
|
||||
@@ -538,7 +778,6 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
gtk.gdk.threads_leave()
|
||||
|
||||
def update_queue_view(self):
|
||||
self.UpdatesLock.acquire()
|
||||
self.wait_channel_call()
|
||||
try:
|
||||
|
||||
@@ -559,11 +798,9 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
return
|
||||
|
||||
finally:
|
||||
self.UpdatesLock.release()
|
||||
self.release_channel_call()
|
||||
|
||||
|
||||
|
||||
def fill_queue_view(self, queue):
|
||||
gtk.gdk.threads_enter()
|
||||
self.QueueStore.clear()
|
||||
@@ -615,25 +852,21 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
gtk.gdk.threads_leave()
|
||||
|
||||
def update_pinboard_view(self, force = False):
|
||||
self.UpdatesLock.acquire()
|
||||
self.wait_channel_call()
|
||||
pindata = None
|
||||
try:
|
||||
self.wait_channel_call()
|
||||
pindata = None
|
||||
try:
|
||||
status, pindata = self.Service.Methods.get_pinboard_data()
|
||||
except Exception, e:
|
||||
self.service_status_message(e)
|
||||
return
|
||||
finally:
|
||||
self.release_channel_call()
|
||||
if (pindata == self.PinboardData) and (not force):
|
||||
return
|
||||
|
||||
if isinstance(pindata,dict):
|
||||
self.fill_pinboard_view(pindata)
|
||||
self.PinboardData = pindata.copy()
|
||||
status, pindata = self.Service.Methods.get_pinboard_data()
|
||||
except Exception, e:
|
||||
self.service_status_message(e)
|
||||
return
|
||||
finally:
|
||||
self.UpdatesLock.release()
|
||||
self.release_channel_call()
|
||||
if (pindata == self.PinboardData) and (not force):
|
||||
return
|
||||
|
||||
if isinstance(pindata,dict):
|
||||
self.fill_pinboard_view(pindata)
|
||||
self.PinboardData = pindata.copy()
|
||||
|
||||
def fill_pinboard_view(self, pinboard_data):
|
||||
if isinstance(pinboard_data,dict):
|
||||
@@ -657,8 +890,10 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
s += x
|
||||
return s
|
||||
|
||||
self.UpdatesLock.acquire()
|
||||
self.OutputLock.acquire()
|
||||
|
||||
try:
|
||||
|
||||
if self.output_pause and not force: return
|
||||
|
||||
if not queue_id:
|
||||
@@ -681,14 +916,15 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
stdout = stdout[-1*n_bytes:]
|
||||
if stdout == self.Output: return
|
||||
self.Output = stdout
|
||||
|
||||
gtk.gdk.threads_enter()
|
||||
self.OutputBuffer.set_text(clean_output(stdout).encode('utf-8'))
|
||||
self.sm_ui.repoOutputView.queue_draw()
|
||||
while gtk.events_pending():
|
||||
gtk.main_iteration()
|
||||
gtk.gdk.threads_leave()
|
||||
|
||||
finally:
|
||||
self.UpdatesLock.release()
|
||||
|
||||
self.OutputLock.release()
|
||||
|
||||
def load_queue_info_menu(self, obj):
|
||||
my = SmQueueMenu(self.window)
|
||||
@@ -705,16 +941,17 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
|
||||
for col in self.DataView.get_columns():
|
||||
self.DataView.remove_column(col)
|
||||
children = self.DataViewBox.get_children()
|
||||
|
||||
'''
|
||||
children = self.DataViewBox.get_children()
|
||||
for child in children:
|
||||
self.DataViewBox.remove(child)
|
||||
'''
|
||||
|
||||
gtk.gdk.threads_leave()
|
||||
|
||||
def collect_data_view_iters(self):
|
||||
gtk.gdk.threads_enter()
|
||||
model, paths = self.DataView.get_selection().get_selected_rows()
|
||||
gtk.gdk.threads_leave()
|
||||
if not model:
|
||||
return [], model
|
||||
data = []
|
||||
@@ -758,6 +995,8 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
|
||||
self.clear_data_view()
|
||||
gtk.gdk.threads_enter()
|
||||
self.hide_all_data_view_buttons()
|
||||
self.show_data_view_buttons_cat('glsa')
|
||||
self.DataView.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
|
||||
self.DataView.set_rubber_banding(True)
|
||||
gtk.gdk.threads_leave()
|
||||
@@ -811,26 +1050,14 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
item = obj['number'], is_affected(obj), obj
|
||||
my.load(item)
|
||||
|
||||
|
||||
# Package information
|
||||
package_info_button = gtk.Button(label = _("Packages information"))
|
||||
package_info_image = gtk.Image()
|
||||
package_info_image.set_from_stock(gtk.STOCK_INFO, 4)
|
||||
package_info_button.set_image(package_info_image)
|
||||
package_info_button.connect('clicked',package_info_clicked)
|
||||
package_info_button.show()
|
||||
self.DataViewButtons['glsa']['package_info_button'].connect('clicked',package_info_clicked)
|
||||
|
||||
# GLSA information button
|
||||
adv_info_button = gtk.Button(label = _("Advisory information"))
|
||||
adv_info_image = gtk.Image()
|
||||
adv_info_image.set_from_stock(gtk.STOCK_EDIT, 4)
|
||||
adv_info_button.set_image(adv_info_image)
|
||||
adv_info_button.connect('clicked',adv_info_button_clicked)
|
||||
adv_info_button.show()
|
||||
self.DataViewButtons['glsa']['adv_info_button'].connect('clicked',adv_info_button_clicked)
|
||||
|
||||
gtk.gdk.threads_enter()
|
||||
self.DataViewBox.pack_start(package_info_button, False, False, 1)
|
||||
self.DataViewBox.pack_start(adv_info_button, False, False, 1)
|
||||
self.DataViewBox.show_all()
|
||||
|
||||
# selection pixmap
|
||||
cell = gtk.CellRendererPixbuf()
|
||||
@@ -926,29 +1153,11 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
self.set_notebook_page(self.notebook_pages['output'])
|
||||
gtk.gdk.threads_leave()
|
||||
|
||||
def run_entropy_treeupdates(self):
|
||||
|
||||
avail_repos = self.EntropyRepositories['available'].keys()
|
||||
if not avail_repos: return
|
||||
|
||||
def fake_callback_cb(s):
|
||||
return True
|
||||
|
||||
input_params = [
|
||||
('repoid',('combo',(_('Repository'),avail_repos),),fake_callback_cb,False),
|
||||
]
|
||||
|
||||
data = self.Entropy.inputBox(
|
||||
_('Choose the repository'),
|
||||
input_params,
|
||||
cancel_button = True
|
||||
)
|
||||
if data == None: return
|
||||
data['repoid'] = data['repoid'][1]
|
||||
def run_entropy_treeupdates(self, repoid):
|
||||
|
||||
self.wait_channel_call()
|
||||
try:
|
||||
status, queue_id = self.Service.Methods.run_entropy_treeupdates(data['repoid'])
|
||||
status, queue_id = self.Service.Methods.run_entropy_treeupdates(repoid)
|
||||
if not status:
|
||||
self.service_status_message(queue_id)
|
||||
return
|
||||
@@ -965,29 +1174,29 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
self.set_notebook_page(self.notebook_pages['output'])
|
||||
gtk.gdk.threads_leave()
|
||||
|
||||
def run_entropy_mirror_updates(self):
|
||||
def run_entropy_checksum_test(self, repoid, mode):
|
||||
|
||||
avail_repos = self.EntropyRepositories['available'].keys()
|
||||
if not avail_repos: return
|
||||
self.wait_channel_call()
|
||||
try:
|
||||
status, queue_id = self.Service.Methods.run_entropy_checksum_test(repoid, mode)
|
||||
if not status:
|
||||
self.service_status_message(queue_id)
|
||||
return
|
||||
except Exception, e:
|
||||
self.service_status_message(e)
|
||||
return
|
||||
finally:
|
||||
self.release_channel_call()
|
||||
|
||||
def fake_callback_cb(s):
|
||||
return True
|
||||
# enable output
|
||||
self.is_writing_output = True
|
||||
self.is_processing = {'queue_id': queue_id }
|
||||
gtk.gdk.threads_enter()
|
||||
self.set_notebook_page(self.notebook_pages['output'])
|
||||
gtk.gdk.threads_leave()
|
||||
|
||||
input_params = []
|
||||
for repo in avail_repos:
|
||||
input_params.append((repo,('checkbox',"%s: %s" % (_('Repository'),repo,),),fake_callback_cb,False))
|
||||
|
||||
data = self.Entropy.inputBox(
|
||||
_('Choose the repositories you want to scan'),
|
||||
input_params,
|
||||
cancel_button = True
|
||||
)
|
||||
if data == None: return
|
||||
repos = []
|
||||
for key in data:
|
||||
if data[key]:
|
||||
repos.append(key)
|
||||
if not repos: return
|
||||
def run_entropy_mirror_updates(self, repos):
|
||||
|
||||
self.wait_channel_call()
|
||||
try:
|
||||
@@ -1006,38 +1215,6 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
|
||||
def execute_entropy_mirror_updates(self, repo_data):
|
||||
|
||||
gtk.gdk.threads_enter()
|
||||
|
||||
def fake_callback_cb(s):
|
||||
return True
|
||||
|
||||
def fake_callback(s):
|
||||
return True
|
||||
|
||||
# now ask for mirrors
|
||||
for repoid in repo_data.keys():
|
||||
|
||||
input_params = [
|
||||
('commit_msg',_("Commit message"),fake_callback,False,),
|
||||
('do_pretend',('checkbox',_("Pretend mode"),),fake_callback_cb,False,),
|
||||
('pkg_check',('checkbox',_("Packages check"),),fake_callback_cb,False,),
|
||||
]
|
||||
|
||||
data = self.Entropy.inputBox(
|
||||
"[%s] %s" % (repoid,_('Choose sync options'),),
|
||||
input_params,
|
||||
cancel_button = True
|
||||
)
|
||||
if data == None:
|
||||
repo_data.pop(repoid)
|
||||
continue
|
||||
|
||||
repo_data[repoid]['pretend'] = data['do_pretend']
|
||||
repo_data[repoid]['pkg_check'] = data['pkg_check']
|
||||
repo_data[repoid]['commit_msg'] = data['commit_msg']
|
||||
|
||||
gtk.gdk.threads_leave()
|
||||
self.clear_data_view()
|
||||
|
||||
self.wait_channel_call()
|
||||
try:
|
||||
@@ -1051,10 +1228,13 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
finally:
|
||||
self.release_channel_call()
|
||||
|
||||
|
||||
# enable output
|
||||
self.is_writing_output = True
|
||||
self.is_processing = {'queue_id': queue_id }
|
||||
gtk.gdk.threads_enter()
|
||||
self.set_notebook_page(self.notebook_pages['output'])
|
||||
gtk.gdk.threads_leave()
|
||||
|
||||
|
||||
def run_entropy_libtest(self):
|
||||
@@ -1081,6 +1261,7 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
gtk.gdk.threads_leave()
|
||||
|
||||
def run_package_search(self, search_type, search_string, repoid):
|
||||
|
||||
self.wait_channel_call()
|
||||
status = False
|
||||
data = {}
|
||||
@@ -1094,8 +1275,10 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
return
|
||||
finally:
|
||||
self.release_channel_call()
|
||||
|
||||
def reload_func():
|
||||
self.run_package_search(search_type, search_string, repoid)
|
||||
|
||||
self.entropy_available_packages_data_view(data, repoid, reload_func = reload_func)
|
||||
|
||||
def move_entropy_packages(self, matches, reload_function):
|
||||
@@ -1203,7 +1386,9 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
# enable output
|
||||
self.is_writing_output = True
|
||||
self.is_processing = {'queue_id': queue_id }
|
||||
gtk.gdk.threads_enter()
|
||||
self.set_notebook_page(self.notebook_pages['output'])
|
||||
gtk.gdk.threads_leave()
|
||||
self.reload_after_package_move(queue_id, reload_func)
|
||||
|
||||
def entropy_mirror_updates_data_view(self, queue_id):
|
||||
@@ -1213,8 +1398,11 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
status, repo_data = item['result']
|
||||
if not status: return
|
||||
|
||||
|
||||
self.clear_data_view()
|
||||
gtk.gdk.threads_enter()
|
||||
self.hide_all_data_view_buttons()
|
||||
self.show_data_view_buttons_cat('mirror_updates')
|
||||
self.DataView.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
|
||||
self.DataView.set_rubber_banding(True)
|
||||
gtk.gdk.threads_leave()
|
||||
@@ -1294,20 +1482,40 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
}
|
||||
if not run_data: return
|
||||
|
||||
# I am soooooooo coool
|
||||
t = self.entropyTools.parallelTask(self.execute_entropy_mirror_updates, run_data)
|
||||
t.start()
|
||||
def fake_callback_cb(s):
|
||||
return True
|
||||
|
||||
def fake_callback(s):
|
||||
return True
|
||||
|
||||
# now ask for mirrors
|
||||
for repoid in run_data.keys():
|
||||
|
||||
input_params = [
|
||||
('commit_msg',_("Commit message"),fake_callback,False,),
|
||||
('do_pretend',('checkbox',_("Pretend mode"),),fake_callback_cb,False,),
|
||||
('pkg_check',('checkbox',_("Packages check"),),fake_callback_cb,False,),
|
||||
]
|
||||
|
||||
data = self.Entropy.inputBox(
|
||||
"[%s] %s" % (repoid,_('Choose sync options'),),
|
||||
input_params,
|
||||
cancel_button = True
|
||||
)
|
||||
if data == None:
|
||||
run_data.pop(repoid)
|
||||
continue
|
||||
|
||||
run_data[repoid]['pretend'] = data['do_pretend']
|
||||
run_data[repoid]['pkg_check'] = data['pkg_check']
|
||||
run_data[repoid]['commit_msg'] = data['commit_msg']
|
||||
|
||||
if run_data:
|
||||
t = self.entropyTools.parallelTask(self.execute_entropy_mirror_updates, run_data)
|
||||
t.start()
|
||||
|
||||
gtk.gdk.threads_enter()
|
||||
execute_button = gtk.Button(label = _("Execute"))
|
||||
execute_button_image = gtk.Image()
|
||||
execute_button_image.set_from_stock(gtk.STOCK_EXECUTE, 4)
|
||||
execute_button.set_image(execute_button_image)
|
||||
execute_button.connect('clicked',execute_button_clicked)
|
||||
execute_button.show()
|
||||
|
||||
self.DataViewBox.pack_start(execute_button, False, False, 1)
|
||||
self.DataViewBox.show_all()
|
||||
self.DataViewButtons['mirror_updates']['execute_button'].connect('clicked',execute_button_clicked)
|
||||
self.create_text_column( self.DataView, _( "Mirror updates information" ), 'info', size = 300, cell_data_func = my_data_text, expand = True)
|
||||
gtk.gdk.threads_leave()
|
||||
self.fill_mirror_updates_view(repo_data)
|
||||
@@ -1324,6 +1532,8 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
|
||||
self.clear_data_view()
|
||||
gtk.gdk.threads_enter()
|
||||
self.hide_all_data_view_buttons()
|
||||
self.show_data_view_buttons_cat('database_updates')
|
||||
self.DataView.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
|
||||
self.DataView.set_rubber_banding(True)
|
||||
gtk.gdk.threads_leave()
|
||||
@@ -1442,33 +1652,10 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
t.start()
|
||||
|
||||
gtk.gdk.threads_enter()
|
||||
# Package information
|
||||
package_info_button = gtk.Button(label = _("Packages information"))
|
||||
package_info_image = gtk.Image()
|
||||
package_info_image.set_from_stock(gtk.STOCK_INFO, 4)
|
||||
package_info_button.set_image(package_info_image)
|
||||
package_info_button.connect('clicked',package_info_clicked)
|
||||
package_info_button.show()
|
||||
|
||||
# Change repo button
|
||||
change_repo_button = gtk.Button(label = _("Destination repository"))
|
||||
change_repo_image = gtk.Image()
|
||||
change_repo_image.set_from_stock(gtk.STOCK_CONVERT, 4)
|
||||
change_repo_button.set_image(change_repo_image)
|
||||
change_repo_button.connect('clicked',change_repo_clicked)
|
||||
change_repo_button.show()
|
||||
|
||||
execute_button = gtk.Button(label = _("Execute"))
|
||||
execute_button_image = gtk.Image()
|
||||
execute_button_image.set_from_stock(gtk.STOCK_EXECUTE, 4)
|
||||
execute_button.set_image(execute_button_image)
|
||||
execute_button.connect('clicked',execute_button_clicked)
|
||||
execute_button.show()
|
||||
|
||||
self.DataViewBox.pack_start(package_info_button, False, False, 1)
|
||||
self.DataViewBox.pack_start(change_repo_button, False, False, 1)
|
||||
self.DataViewBox.pack_start(execute_button, False, False, 1)
|
||||
self.DataViewBox.show_all()
|
||||
self.DataViewButtons['database_updates']['change_repo_button'].connect('clicked',change_repo_clicked)
|
||||
self.DataViewButtons['database_updates']['package_info_button'].connect('clicked',package_info_clicked)
|
||||
self.DataViewButtons['database_updates']['execute_button'].connect('clicked',execute_button_clicked)
|
||||
|
||||
cell_height = 80
|
||||
|
||||
@@ -1482,6 +1669,7 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
self.set_notebook_page(self.notebook_pages['data'])
|
||||
gtk.gdk.threads_leave()
|
||||
|
||||
|
||||
def fill_db_updates_view(self, data):
|
||||
|
||||
gtk.gdk.threads_enter()
|
||||
@@ -1717,6 +1905,8 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
|
||||
self.clear_data_view()
|
||||
gtk.gdk.threads_enter()
|
||||
self.hide_all_data_view_buttons()
|
||||
self.show_data_view_buttons_cat('available_packages')
|
||||
self.DataView.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
|
||||
self.DataView.set_rubber_banding(True)
|
||||
gtk.gdk.threads_leave()
|
||||
@@ -1771,34 +1961,9 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
|
||||
gtk.gdk.threads_enter()
|
||||
|
||||
# Package information
|
||||
package_info_button = gtk.Button(label = _("Packages information"))
|
||||
package_info_image = gtk.Image()
|
||||
package_info_image.set_from_stock(gtk.STOCK_INFO, 4)
|
||||
package_info_button.set_image(package_info_image)
|
||||
package_info_button.connect('clicked',package_info_clicked)
|
||||
package_info_button.show()
|
||||
|
||||
# Remove package button
|
||||
remove_package_button = gtk.Button(label = _("Remove packages"))
|
||||
remove_package_image = gtk.Image()
|
||||
remove_package_image.set_from_stock(gtk.STOCK_REMOVE, 4)
|
||||
remove_package_button.set_image(remove_package_image)
|
||||
remove_package_button.connect('clicked',remove_package_button_clicked)
|
||||
remove_package_button.show()
|
||||
|
||||
# Move package button
|
||||
move_package_button = gtk.Button(label = _("Copy/move packages"))
|
||||
move_package_image = gtk.Image()
|
||||
move_package_image.set_from_stock(gtk.STOCK_COPY, 4)
|
||||
move_package_button.set_image(move_package_image)
|
||||
move_package_button.connect('clicked',move_package_button_clicked)
|
||||
move_package_button.show()
|
||||
|
||||
self.DataViewBox.pack_start(package_info_button, False, False, 1)
|
||||
self.DataViewBox.pack_start(remove_package_button, False, False, 1)
|
||||
self.DataViewBox.pack_start(move_package_button, False, False, 1)
|
||||
self.DataViewBox.show_all()
|
||||
self.DataViewButtons['available_packages']['package_info_button'].connect('clicked',package_info_clicked)
|
||||
self.DataViewButtons['available_packages']['remove_package_button'].connect('clicked',remove_package_button_clicked)
|
||||
self.DataViewButtons['available_packages']['move_package_button'].connect('clicked',move_package_button_clicked)
|
||||
|
||||
# glsa id
|
||||
self.create_text_column( self.DataView, _( "Package" ), 'package', size = 300, set_height = 60, cell_data_func = my_data_text, expand = True)
|
||||
@@ -1838,6 +2003,7 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
self.set_notebook_page(self.notebook_pages['data'])
|
||||
gtk.gdk.threads_leave()
|
||||
|
||||
|
||||
def categories_updates_data_view(self, queue_id, categories, expand = False, reload_function = None):
|
||||
|
||||
if reload_function == None:
|
||||
@@ -1851,6 +2017,8 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
|
||||
self.clear_data_view()
|
||||
gtk.gdk.threads_enter()
|
||||
self.hide_all_data_view_buttons()
|
||||
self.show_data_view_buttons_cat('categories_updates')
|
||||
self.DataView.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
|
||||
self.DataView.set_rubber_banding(True)
|
||||
gtk.gdk.threads_leave()
|
||||
@@ -1909,35 +2077,9 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
|
||||
gtk.gdk.threads_enter()
|
||||
|
||||
# Compile
|
||||
compile_button = gtk.Button(label = _("Compile selected"))
|
||||
compile_image = gtk.Image()
|
||||
compile_image.set_from_stock(gtk.STOCK_GOTO_BOTTOM, 4)
|
||||
compile_button.set_image(compile_image)
|
||||
compile_button.connect('clicked',compile_button_clicked)
|
||||
compile_button.show()
|
||||
|
||||
# Add USE flag
|
||||
add_use_button = gtk.Button(label = _("Add USE"))
|
||||
add_use_image = gtk.Image()
|
||||
add_use_image.set_from_stock(gtk.STOCK_ADD, 4)
|
||||
add_use_button.set_image(add_use_image)
|
||||
add_use_button.connect('clicked',add_use_button_clicked)
|
||||
add_use_button.show()
|
||||
|
||||
# Remove USE flag
|
||||
remove_use_button = gtk.Button(label = _("Remove USE"))
|
||||
remove_use_image = gtk.Image()
|
||||
remove_use_image.set_from_stock(gtk.STOCK_REMOVE, 4)
|
||||
remove_use_button.set_image(remove_use_image)
|
||||
remove_use_button.connect('clicked',remove_use_button_clicked)
|
||||
remove_use_button.show()
|
||||
|
||||
|
||||
self.DataViewBox.pack_start(compile_button, False, False, 1)
|
||||
self.DataViewBox.pack_start(add_use_button, False, False, 1)
|
||||
self.DataViewBox.pack_start(remove_use_button, False, False, 1)
|
||||
self.DataViewBox.show_all()
|
||||
self.DataViewButtons['categories_updates']['compile_button'].connect('clicked',compile_button_clicked)
|
||||
self.DataViewButtons['categories_updates']['add_use_button'].connect('clicked',add_use_button_clicked)
|
||||
self.DataViewButtons['categories_updates']['remove_use_button'].connect('clicked',remove_use_button_clicked)
|
||||
|
||||
# atom
|
||||
self.create_text_column( self.DataView, _( "Atom" ), 'atom', size = 220, cell_data_func = my_data_text, set_height = 110, expand = True)
|
||||
@@ -2354,15 +2496,15 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
self.wait_channel_call()
|
||||
try:
|
||||
status, queue_id = self.Service.Methods.run_spm_info()
|
||||
if status:
|
||||
self.is_writing_output = True
|
||||
self.is_processing = {'queue_id': queue_id}
|
||||
self.set_notebook_page(self.notebook_pages['output'])
|
||||
except Exception, e:
|
||||
self.service_status_message(e)
|
||||
return
|
||||
finally:
|
||||
self.release_channel_call()
|
||||
if status:
|
||||
self.is_writing_output = True
|
||||
self.is_processing = {'queue_id': queue_id}
|
||||
self.set_notebook_page(self.notebook_pages['output'])
|
||||
|
||||
def handle_uses_for_atoms(self, atoms, use):
|
||||
|
||||
@@ -2766,11 +2908,80 @@ class RepositoryManagerMenu(MenuSkel):
|
||||
t.start()
|
||||
|
||||
def on_repoManagerSpmTreeupdatesButton_clicked(self, widget):
|
||||
t = self.entropyTools.parallelTask(self.run_entropy_treeupdates)
|
||||
|
||||
avail_repos = self.EntropyRepositories['available'].keys()
|
||||
if not avail_repos: return
|
||||
|
||||
def fake_callback_cb(s):
|
||||
return True
|
||||
|
||||
input_params = [
|
||||
('repoid',('combo',(_('Repository'),avail_repos),),fake_callback_cb,False),
|
||||
]
|
||||
|
||||
data = self.Entropy.inputBox(
|
||||
_('Choose the repository'),
|
||||
input_params,
|
||||
cancel_button = True
|
||||
)
|
||||
if data == None: return
|
||||
data['repoid'] = data['repoid'][1]
|
||||
|
||||
t = self.entropyTools.parallelTask(self.run_entropy_treeupdates, data['repoid'])
|
||||
t.start()
|
||||
|
||||
def on_repoManagerMirrorUpdatesButton_clicked(self, widget):
|
||||
t = self.entropyTools.parallelTask(self.run_entropy_mirror_updates)
|
||||
|
||||
avail_repos = self.EntropyRepositories['available'].keys()
|
||||
if not avail_repos: return
|
||||
|
||||
def fake_callback_cb(s):
|
||||
return True
|
||||
|
||||
input_params = []
|
||||
for repo in avail_repos:
|
||||
input_params.append((repo,('checkbox',"%s: %s" % (_('Repository'),repo,),),fake_callback_cb,False))
|
||||
|
||||
data = self.Entropy.inputBox(
|
||||
_('Choose the repositories you want to scan'),
|
||||
input_params,
|
||||
cancel_button = True
|
||||
)
|
||||
if data == None: return
|
||||
repos = []
|
||||
for key in data:
|
||||
if data[key]:
|
||||
repos.append(key)
|
||||
if not repos: return
|
||||
|
||||
t = self.entropyTools.parallelTask(self.run_entropy_mirror_updates, repos)
|
||||
t.start()
|
||||
|
||||
def on_repoManagerChecksumTestButton_clicked(self, widget):
|
||||
|
||||
avail_repos = self.EntropyRepositories['available'].keys()
|
||||
if not avail_repos: return
|
||||
|
||||
def fake_callback(s):
|
||||
return s
|
||||
|
||||
input_params = [
|
||||
('repoid',('combo',(_('Repository'),avail_repos),),fake_callback,False),
|
||||
('mode',('combo',(_('Choose mode'),[_("Server check"),_("Mirrors check")]),),fake_callback,False),
|
||||
]
|
||||
data = self.Entropy.inputBox(
|
||||
_('Choose what kind of test you would like to run'),
|
||||
input_params,
|
||||
cancel_button = True
|
||||
)
|
||||
if data == None: return
|
||||
if data['mode'][0] == 0:
|
||||
mode = "local"
|
||||
else:
|
||||
mode = "remote"
|
||||
data['repoid'] = data['repoid'][1]
|
||||
|
||||
t = self.entropyTools.parallelTask(self.run_entropy_checksum_test, data['repoid'], mode)
|
||||
t.start()
|
||||
|
||||
def destroy(self):
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user