fix handling conflicts (I hope)
This commit is contained in:
parent
41d81d5de1
commit
5ecbbbd9c3
0
backend/__init__.py
Executable file → Normal file
0
backend/__init__.py
Executable file → Normal file
0
backend/config.py
Normal file → Executable file
0
backend/config.py
Normal file → Executable file
@ -5,7 +5,7 @@ from gi.repository import Gtk
|
|||||||
|
|
||||||
import pyalpm
|
import pyalpm
|
||||||
import traceback
|
import traceback
|
||||||
import sys
|
|
||||||
from backend import config
|
from backend import config
|
||||||
|
|
||||||
interface = Gtk.Builder()
|
interface = Gtk.Builder()
|
||||||
@ -55,43 +55,30 @@ def init_transaction(handle, **options):
|
|||||||
def check_conflicts():
|
def check_conflicts():
|
||||||
global conflict_to_remove
|
global conflict_to_remove
|
||||||
conflict_to_remove = {}
|
conflict_to_remove = {}
|
||||||
installed_conflicts = {}
|
|
||||||
for pkg in config.handle.get_localdb().pkgcache:
|
|
||||||
if pkg.conflicts:
|
|
||||||
installed_conflicts[pkg.name] = pkg.conflicts
|
|
||||||
targets_conflicts = {}
|
|
||||||
targets_replaces = {}
|
|
||||||
for pkg in t.to_add:
|
|
||||||
if pkg.replaces:
|
|
||||||
targets_replaces[pkg.name] = pkg.replaces
|
|
||||||
if pkg.conflicts:
|
|
||||||
targets_conflicts[pkg.name] = pkg.conflicts
|
|
||||||
warning = ''
|
warning = ''
|
||||||
if targets_replaces:
|
for target in t.to_add:
|
||||||
for key, value in targets_replaces.items():
|
if target.replaces:
|
||||||
for name in value:
|
for name in target.replaces:
|
||||||
pkg = config.handle.get_localdb().get_pkg(name)
|
pkg = config.handle.get_localdb().get_pkg(name)
|
||||||
if pkg:
|
if pkg:
|
||||||
if not pkg.name in conflict_to_remove.keys():
|
if not pkg.name in conflict_to_remove.keys():
|
||||||
conflict_to_remove[pkg.name] = pkg
|
conflict_to_remove[pkg.name] = pkg
|
||||||
if warning:
|
if warning:
|
||||||
warning = warning+'\n'
|
warning = warning+'\n'
|
||||||
warning = warning+pkg.name+' will be replaced by '+key
|
warning = warning+pkg.name+' will be replaced by '+target.name
|
||||||
if targets_conflicts:
|
if target.conflicts:
|
||||||
for key, value in targets_conflicts.items():
|
for name in target.conflicts:
|
||||||
for name in value:
|
|
||||||
pkg = config.handle.get_localdb().get_pkg(name)
|
pkg = config.handle.get_localdb().get_pkg(name)
|
||||||
if pkg:
|
if pkg:
|
||||||
if not pkg.name in conflict_to_remove.keys():
|
if not pkg.name in conflict_to_remove.keys():
|
||||||
conflict_to_remove[pkg.name] = pkg
|
conflict_to_remove[pkg.name] = pkg
|
||||||
if installed_conflicts:
|
for installed_pkg in config.handle.get_localdb().pkgcache:
|
||||||
for key, value in installed_conflicts.items():
|
if installed_pkg.conflicts:
|
||||||
for name in value:
|
for name in installed_pkg.conflicts:
|
||||||
for pkg in t.to_add:
|
if name == target.name:
|
||||||
if pkg.name == name:
|
if not name in conflict_to_remove.keys():
|
||||||
if not pkg.name in conflict_to_remove.keys():
|
conflict_to_remove[installed_pkg.name] = installed_pkg
|
||||||
conflict_to_remove[pkg.name] = pkg
|
if warning:
|
||||||
if conflict_to_remove:
|
|
||||||
WarningDialog.format_secondary_text(warning)
|
WarningDialog.format_secondary_text(warning)
|
||||||
response = WarningDialog.run()
|
response = WarningDialog.run()
|
||||||
if response:
|
if response:
|
||||||
@ -101,7 +88,6 @@ def do_refresh():
|
|||||||
"""Sync databases like pacman -Sy"""
|
"""Sync databases like pacman -Sy"""
|
||||||
global t
|
global t
|
||||||
global t_lock
|
global t_lock
|
||||||
ProgressWindow.show_all()
|
|
||||||
for db in config.handle.get_syncdbs():
|
for db in config.handle.get_syncdbs():
|
||||||
if t_lock is False:
|
if t_lock is False:
|
||||||
t = init_transaction(config.handle)
|
t = init_transaction(config.handle)
|
||||||
@ -116,7 +102,6 @@ def do_refresh():
|
|||||||
ErrorDialog.hide()
|
ErrorDialog.hide()
|
||||||
t_lock = False
|
t_lock = False
|
||||||
break
|
break
|
||||||
ProgressWindow.hide()
|
|
||||||
progress_label.set_text('')
|
progress_label.set_text('')
|
||||||
progress_bar.set_text('')
|
progress_bar.set_text('')
|
||||||
|
|
||||||
@ -164,7 +149,7 @@ def do_sysupgrade():
|
|||||||
print("Nothing to update")
|
print("Nothing to update")
|
||||||
else:
|
else:
|
||||||
t.release()
|
t.release()
|
||||||
t = init_transaction(config.handle, noconflicts = True, nodeps = True, nodepversion = True)
|
t = init_transaction(config.handle, noconflicts = True, nodeps = True)
|
||||||
for pkg in to_add:
|
for pkg in to_add:
|
||||||
t.add_pkg(pkg)
|
t.add_pkg(pkg)
|
||||||
for pkg in conflict_to_remove.values():
|
for pkg in conflict_to_remove.values():
|
||||||
@ -188,6 +173,7 @@ def do_sysupgrade():
|
|||||||
|
|
||||||
def t_finalize(t):
|
def t_finalize(t):
|
||||||
ConfDialog.hide()
|
ConfDialog.hide()
|
||||||
|
ProgressWindow.show_all()
|
||||||
try:
|
try:
|
||||||
t.prepare()
|
t.prepare()
|
||||||
except pyalpm.error:
|
except pyalpm.error:
|
||||||
@ -288,7 +274,6 @@ def set_transaction_desc(mode):
|
|||||||
event_text = ' '
|
event_text = ' '
|
||||||
def cb_event(ID, event, tupel):
|
def cb_event(ID, event, tupel):
|
||||||
global event_text
|
global event_text
|
||||||
ProgressWindow.show_all()
|
|
||||||
while Gtk.events_pending():
|
while Gtk.events_pending():
|
||||||
Gtk.main_iteration()
|
Gtk.main_iteration()
|
||||||
if ID is 1:
|
if ID is 1:
|
||||||
@ -334,10 +319,6 @@ _logmask = pyalpm.LOG_ERROR | pyalpm.LOG_WARNING
|
|||||||
|
|
||||||
def cb_log(level, line):
|
def cb_log(level, line):
|
||||||
#global t
|
#global t
|
||||||
#try:
|
|
||||||
# _line = str(_line, encoding='utf-8').strip("\n")
|
|
||||||
#except:
|
|
||||||
# _line = str(_line, encoding='latin-1').strip("\n")
|
|
||||||
if not (level & _logmask):
|
if not (level & _logmask):
|
||||||
return
|
return
|
||||||
if level & pyalpm.LOG_ERROR:
|
if level & pyalpm.LOG_ERROR:
|
||||||
@ -357,7 +338,6 @@ def cb_log(level, line):
|
|||||||
elif level & pyalpm.LOG_FUNCTION:
|
elif level & pyalpm.LOG_FUNCTION:
|
||||||
line = "FUNC: " + line
|
line = "FUNC: " + line
|
||||||
print(line)
|
print(line)
|
||||||
#sys.stderr.write(line)
|
|
||||||
|
|
||||||
total_size = 0
|
total_size = 0
|
||||||
def totaldlcb(_total_size):
|
def totaldlcb(_total_size):
|
||||||
|
51
backend/tray.py
Executable file
51
backend/tray.py
Executable file
@ -0,0 +1,51 @@
|
|||||||
|
#! /usr/bin/python
|
||||||
|
# -*-coding:utf-8-*-
|
||||||
|
|
||||||
|
from gi.repository import Gtk
|
||||||
|
|
||||||
|
import transaction, update
|
||||||
|
|
||||||
|
class Tray:
|
||||||
|
def __init__(self, icon, info):
|
||||||
|
self.icon = icon
|
||||||
|
self.info = info
|
||||||
|
self.statusIcon = Gtk.StatusIcon()
|
||||||
|
self.statusIcon.set_from_file(icon)
|
||||||
|
self.statusIcon.set_visible(True)
|
||||||
|
self.statusIcon.set_tooltip_markup(info)
|
||||||
|
|
||||||
|
self.menu = Gtk.Menu()
|
||||||
|
self.menuItem = Gtk.ImageMenuItem()
|
||||||
|
self.menuItem.seet_image('/usr/share/icons/hicolor/24x24/status/package-update.png')
|
||||||
|
self.menuItem.connect('activate', self.execute_cb, self.statusIcon)
|
||||||
|
self.menu.append(self.menuItem)
|
||||||
|
self.menuItem = Gtk.ImageMenuItem(Gtk.STOCK_QUIT)
|
||||||
|
self.menuItem.connect('activate', self.quit_cb, self.statusIcon)
|
||||||
|
self.menu.append(self.menuItem)
|
||||||
|
|
||||||
|
self.statusIcon.connect('popup-menu', self.popup_menu_cb, self.menu)
|
||||||
|
self.statusIcon.set_visible(1)
|
||||||
|
|
||||||
|
Gtk.main()
|
||||||
|
|
||||||
|
def execute_cb(self, widget, event, data = None):
|
||||||
|
update.main()
|
||||||
|
|
||||||
|
def quit_cb(self, widget, data = None):
|
||||||
|
Gtk.main_quit()
|
||||||
|
|
||||||
|
def popup_menu_cb(self, widget, button, time, data = None):
|
||||||
|
if button == 3:
|
||||||
|
if data:
|
||||||
|
data.show_all()
|
||||||
|
data.popup(None, None, Gtk.StatusIcon.position_menu, self.statusIcon, 3, time)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
updates = transaction.get_updates()
|
||||||
|
if updates:
|
||||||
|
icon = '/usr/share/icons/hicolor/24x24/status/update-normal.png'
|
||||||
|
info = str(len(updates))+' update(s) available'
|
||||||
|
else:
|
||||||
|
icon = '/usr/share/icons/hicolor/24x24/status/update-enhancement.png'
|
||||||
|
info = ' No update available'
|
||||||
|
tray = Tray(icon, info)
|
60
backend/update.py
Executable file
60
backend/update.py
Executable file
@ -0,0 +1,60 @@
|
|||||||
|
#! /usr/bin/python
|
||||||
|
# -*-coding:utf-8 -*-
|
||||||
|
|
||||||
|
from gi.repository import Gtk
|
||||||
|
|
||||||
|
import pyalpm
|
||||||
|
from os import geteuid
|
||||||
|
|
||||||
|
from backend import transaction
|
||||||
|
|
||||||
|
interface = Gtk.Builder()
|
||||||
|
interface.add_from_file('/usr/share/pamac/pamac_update.glade')
|
||||||
|
interface.add_from_file('/usr/share/pamac/dialogs.glade')
|
||||||
|
|
||||||
|
update_listore = interface.get_object('update_list')
|
||||||
|
top_label = interface.get_object('top_label')
|
||||||
|
|
||||||
|
def have_updates():
|
||||||
|
available_updates = transaction.get_updates()
|
||||||
|
update_listore.clear()
|
||||||
|
top_label.set_justify(Gtk.Justification.CENTER)
|
||||||
|
if not available_updates:
|
||||||
|
update_listore.append(["", ""])
|
||||||
|
top_label.set_markup("<big><b>No update available</b></big>")
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
for pkg in available_updates:
|
||||||
|
pkgname = pkg.name
|
||||||
|
newversion = transaction.get_new_version_available(pkgname)
|
||||||
|
pkgname = pkg.name+" "+newversion
|
||||||
|
update_listore.append([pkgname, transaction.format_size(pkg.size)])
|
||||||
|
top_label.set_markup("<big><b>Available updates</b></big>")
|
||||||
|
return True
|
||||||
|
|
||||||
|
class Handler:
|
||||||
|
def on_UpdateWindow_delete_event(self, *arg):
|
||||||
|
Gtk.main_quit()
|
||||||
|
|
||||||
|
def on_QuitButton_clicked(self, *arg):
|
||||||
|
Gtk.main_quit()
|
||||||
|
|
||||||
|
def on_ApplyButton_clicked(self, *arg):
|
||||||
|
transaction.do_sysupgrade()
|
||||||
|
have_updates()
|
||||||
|
|
||||||
|
def on_RefreshButton_clicked(self, *arg):
|
||||||
|
transaction.do_refresh()
|
||||||
|
have_updates()
|
||||||
|
|
||||||
|
def main():
|
||||||
|
have_updates()
|
||||||
|
interface.connect_signals(Handler())
|
||||||
|
UpdateWindow = interface.get_object("UpdateWindow")
|
||||||
|
UpdateWindow.show_all()
|
||||||
|
Gtk.main()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if geteuid() == 0:
|
||||||
|
transaction.do_refresh()
|
||||||
|
main()
|
@ -49,6 +49,7 @@
|
|||||||
<object class="GtkTreeView" id="treeview4">
|
<object class="GtkTreeView" id="treeview4">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
<property name="vexpand">True</property>
|
<property name="vexpand">True</property>
|
||||||
<property name="model">transaction_desc</property>
|
<property name="model">transaction_desc</property>
|
||||||
<property name="headers_visible">False</property>
|
<property name="headers_visible">False</property>
|
||||||
|
57
pamac
57
pamac
@ -9,6 +9,7 @@ import sys
|
|||||||
from time import strftime, localtime
|
from time import strftime, localtime
|
||||||
from os import geteuid
|
from os import geteuid
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
from backend import transaction, config
|
from backend import transaction, config
|
||||||
|
|
||||||
interface = Gtk.Builder()
|
interface = Gtk.Builder()
|
||||||
@ -210,17 +211,10 @@ class Handler:
|
|||||||
if transaction.t_lock is True:
|
if transaction.t_lock is True:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
transaction.t = transaction.init_transaction(config.handle, cascade = True)
|
|
||||||
if transaction_type is "install":
|
|
||||||
for pkg in transaction_dict.values():
|
|
||||||
transaction.t.add_pkg(pkg)
|
|
||||||
if transaction_type is "remove":
|
if transaction_type is "remove":
|
||||||
|
transaction.t = transaction.init_transaction(config.handle, cascade = True)
|
||||||
for pkg in transaction_dict.values():
|
for pkg in transaction_dict.values():
|
||||||
transaction.t.remove_pkg(pkg)
|
transaction.t.remove_pkg(pkg)
|
||||||
transaction.check_conflicts()
|
|
||||||
if transaction.conflict_to_remove:
|
|
||||||
for pkg in transaction.conflict_to_remove.values():
|
|
||||||
transaction.t.remove_pkg(pkg)
|
|
||||||
try:
|
try:
|
||||||
transaction.t.prepare()
|
transaction.t.prepare()
|
||||||
except pyalpm.error:
|
except pyalpm.error:
|
||||||
@ -236,6 +230,7 @@ class Handler:
|
|||||||
response = transaction.ConfDialog.run()
|
response = transaction.ConfDialog.run()
|
||||||
if response == Gtk.ResponseType.OK:
|
if response == Gtk.ResponseType.OK:
|
||||||
transaction.ConfDialog.hide()
|
transaction.ConfDialog.hide()
|
||||||
|
transaction.ProgressWindow.show_all()
|
||||||
try:
|
try:
|
||||||
transaction.t.commit()
|
transaction.t.commit()
|
||||||
except pyalpm.error:
|
except pyalpm.error:
|
||||||
@ -252,6 +247,47 @@ class Handler:
|
|||||||
transaction.ConfDialog.hide()
|
transaction.ConfDialog.hide()
|
||||||
transaction.t.release()
|
transaction.t.release()
|
||||||
transaction.t_lock = False
|
transaction.t_lock = False
|
||||||
|
if transaction_type is "install":
|
||||||
|
transaction.t = transaction.init_transaction(config.handle, noconflicts = True)
|
||||||
|
for pkg in transaction_dict.values():
|
||||||
|
transaction.t.add_pkg(pkg)
|
||||||
|
try:
|
||||||
|
transaction.t.prepare()
|
||||||
|
except pyalpm.error:
|
||||||
|
transaction.ErrorDialog.format_secondary_text(traceback.format_exc())
|
||||||
|
response = transaction.ErrorDialog.run()
|
||||||
|
if response:
|
||||||
|
transaction.ErrorDialog.hide()
|
||||||
|
transaction.t.release()
|
||||||
|
transaction.t_lock = False
|
||||||
|
transaction.check_conflicts()
|
||||||
|
transaction.to_add = transaction.t.to_add
|
||||||
|
transaction.to_remove = []
|
||||||
|
if transaction.conflict_to_remove:
|
||||||
|
for pkg in transaction.conflict_to_remove.values():
|
||||||
|
transaction.to_remove.append(pkg)
|
||||||
|
transaction.t.release()
|
||||||
|
transaction.set_transaction_desc('normal')
|
||||||
|
response = transaction.ConfDialog.run()
|
||||||
|
if response == Gtk.ResponseType.OK:
|
||||||
|
transaction.ConfDialog.hide()
|
||||||
|
transaction.t = transaction.init_transaction(config.handle, noconflicts = True, nodeps = True)
|
||||||
|
print(transaction.to_add, transaction.to_remove)
|
||||||
|
for pkg in transaction.to_add:
|
||||||
|
print(pkg)
|
||||||
|
transaction.t.add_pkg(pkg)
|
||||||
|
for pkg in transaction.to_remove:
|
||||||
|
print(pkg)
|
||||||
|
transaction.t.remove_pkg(pkg)
|
||||||
|
transaction.t_finalize(transaction.t)
|
||||||
|
transaction_dict.clear()
|
||||||
|
transaction_type = None
|
||||||
|
set_packages_list()
|
||||||
|
if response == Gtk.ResponseType.CANCEL or Gtk.ResponseType.CLOSE or Gtk.ResponseType.DELETE_EVENT:
|
||||||
|
transaction.ProgressWindow.hide()
|
||||||
|
transaction.ConfDialog.hide()
|
||||||
|
transaction.t.release()
|
||||||
|
transaction.t_lock = False
|
||||||
|
|
||||||
def on_EraseButton_clicked(self, *arg):
|
def on_EraseButton_clicked(self, *arg):
|
||||||
global transaction_type
|
global transaction_type
|
||||||
@ -345,7 +381,12 @@ class Handler:
|
|||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
if geteuid() == 0:
|
if geteuid() == 0:
|
||||||
|
transaction.progress_label.set_text('Refreshing...')
|
||||||
|
transaction.progress_bar.pulse()
|
||||||
|
transaction.action_icon.set_from_file('/usr/share/icons/hicolor/24x24/status/refresh-cache.png')
|
||||||
|
transaction.ProgressWindow.show_all()
|
||||||
transaction.do_refresh()
|
transaction.do_refresh()
|
||||||
|
transaction.ProgressWindow.hide()
|
||||||
interface.connect_signals(Handler())
|
interface.connect_signals(Handler())
|
||||||
MainWindow = interface.get_object("MainWindow")
|
MainWindow = interface.get_object("MainWindow")
|
||||||
MainWindow.show_all()
|
MainWindow.show_all()
|
||||||
|
58
pamac-update
58
pamac-update
@ -1,60 +1,16 @@
|
|||||||
#! /usr/bin/python
|
#! /usr/bin/python
|
||||||
# -*-coding:utf-8 -*-
|
# -*-coding:utf-8 -*-
|
||||||
|
|
||||||
from gi.repository import Gtk, GdkPixbuf, Gdk
|
|
||||||
|
|
||||||
import pyalpm
|
|
||||||
from time import strftime, localtime
|
|
||||||
from os import geteuid
|
from os import geteuid
|
||||||
from backend import transaction
|
|
||||||
|
|
||||||
interface = Gtk.Builder()
|
from backend import update, transaction
|
||||||
interface.add_from_file('/usr/share/pamac/pamac_update.glade')
|
|
||||||
interface.add_from_file('/usr/share/pamac/dialogs.glade')
|
|
||||||
|
|
||||||
update_listore = interface.get_object('update_list')
|
|
||||||
top_label = interface.get_object('top_label')
|
|
||||||
|
|
||||||
def have_updates():
|
|
||||||
available_updates = transaction.get_updates()
|
|
||||||
update_listore.clear()
|
|
||||||
top_label.set_justify(Gtk.Justification.CENTER)
|
|
||||||
if not available_updates:
|
|
||||||
update_listore.append(["", ""])
|
|
||||||
top_label.set_markup("<big><b>No update available</b></big>")
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
for pkg in available_updates:
|
|
||||||
pkgname = pkg.name
|
|
||||||
newversion = transaction.get_new_version_available(pkgname)
|
|
||||||
pkgname = pkg.name+" "+newversion
|
|
||||||
update_listore.append([pkgname, transaction.format_size(pkg.size)])
|
|
||||||
top_label.set_markup("<big><b>Available updates</b></big>")
|
|
||||||
return True
|
|
||||||
|
|
||||||
class Handler:
|
|
||||||
def on_UpdateWindow_delete_event(self, *arg):
|
|
||||||
Gtk.main_quit()
|
|
||||||
|
|
||||||
def on_QuitButton_clicked(self, *arg):
|
|
||||||
Gtk.main_quit()
|
|
||||||
|
|
||||||
def on_ApplyButton_clicked(self, *arg):
|
|
||||||
transaction.do_sysupgrade()
|
|
||||||
have_updates()
|
|
||||||
|
|
||||||
def on_RefreshButton_clicked(self, *arg):
|
|
||||||
transaction.do_refresh()
|
|
||||||
have_updates()
|
|
||||||
|
|
||||||
def main():
|
|
||||||
have_updates()
|
|
||||||
interface.connect_signals(Handler())
|
|
||||||
UpdateWindow = interface.get_object("UpdateWindow")
|
|
||||||
UpdateWindow.show_all()
|
|
||||||
Gtk.main()
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
if geteuid() == 0:
|
if geteuid() == 0:
|
||||||
|
transaction.progress_label.set_text('Refreshing...')
|
||||||
|
transaction.progress_bar.pulse()
|
||||||
|
transaction.action_icon.set_from_file('/usr/share/icons/hicolor/24x24/status/refresh-cache.png')
|
||||||
|
transaction.ProgressWindow.show_all()
|
||||||
transaction.do_refresh()
|
transaction.do_refresh()
|
||||||
main()
|
transaction.ProgressWindow.hide()
|
||||||
|
update.main()
|
||||||
|
Loading…
Reference in New Issue
Block a user