pamac-classic/pamac-install.py

171 lines
5.5 KiB
Python
Executable File

#! /usr/bin/python3
# -*- coding:utf-8 -*-
# pamac - A Python implementation of alpm
# Copyright (C) 2013-2014 Guillaume Benoit <guillaume@manjaro.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
from gi.repository import Gtk
from sys import argv
import dbus
from os.path import abspath
from pamac import common, config, transaction, aur
# i18n
import gettext
import locale
locale.bindtextdomain('pamac', '/usr/share/locale')
gettext.bindtextdomain('pamac', '/usr/share/locale')
gettext.textdomain('pamac')
_ = gettext.gettext
def exiting(msg):
transaction.StopDaemon()
print(msg)
print('exiting')
Gtk.main_quit()
def handle_error(error):
transaction.ProgressWindow.hide()
while Gtk.events_pending():
Gtk.main_iteration()
if error:
if not 'DBus.Error.NoReply' in str(error):
transaction.ErrorDialog.format_secondary_text(error)
response = transaction.ErrorDialog.run()
if response:
transaction.ErrorDialog.hide()
exiting(error)
def handle_reply(reply):
transaction.ProgressCloseButton.set_visible(True)
transaction.action_icon.set_from_icon_name('dialog-information', Gtk.IconSize.BUTTON)
transaction.progress_label.set_text(str(reply))
transaction.progress_bar.set_text('')
end_iter = transaction.progress_buffer.get_end_iter()
transaction.progress_buffer.insert(end_iter, str(reply))
def handle_updates(update_data):
syncfirst, updates = update_data
if transaction_done:
exiting('')
elif updates:
transaction.ErrorDialog.format_secondary_text(_('Some updates are available.\nPlease update your system first'))
response = transaction.ErrorDialog.run()
if response:
transaction.ErrorDialog.hide()
exiting('')
else:
transaction.action_handler(_('Preparing')+'...')
transaction.icon_handler('/usr/share/pamac/icons/24x24/status/package-setup.png')
while Gtk.events_pending():
Gtk.main_iteration()
common.write_pid_file()
transaction.interface.connect_signals(signals)
transaction.config_dbus_signals()
pkgs_to_install = argv[1:]
install(pkgs_to_install)
def on_TransValidButton_clicked(*args):
transaction.ConfDialog.hide()
while Gtk.events_pending():
Gtk.main_iteration()
transaction.finalize()
def on_TransCancelButton_clicked(*args):
transaction.ConfDialog.hide()
while Gtk.events_pending():
Gtk.main_iteration()
transaction.Release()
exiting('')
def on_ProgressCloseButton_clicked(*args):
global transaction_done
transaction.ProgressWindow.hide()
while Gtk.events_pending():
Gtk.main_iteration()
transaction_done = True
transaction.CheckUpdates()
def on_ProgressCancelButton_clicked(*args):
transaction.Interrupt()
transaction.ProgressWindow.hide()
while Gtk.events_pending():
Gtk.main_iteration()
exiting('')
def get_pkgs(pkgs):
error = ''
for name in pkgs:
if '.pkg.tar.' in name:
full_path = abspath(name)
transaction.to_load.add(full_path)
elif transaction.get_syncpkg(name):
transaction.to_add.add(name)
else:
aur_pkg = None
if config.enable_aur:
aur_pkg = aur.info(name)
if aur_pkg:
transaction.to_build.append(aur_pkg)
if not aur_pkg:
if error:
error += '\n'
error += _('{pkgname} is not a valid path or package name').format(pkgname = name)
if error:
handle_error(error)
return False
else:
return True
def install(pkgs):
if get_pkgs(pkgs):
error = transaction.run()
while Gtk.events_pending():
Gtk.main_iteration()
if error:
handle_error(error)
signals = {'on_ChooseButton_clicked' : transaction.on_ChooseButton_clicked,
'on_progress_textview_size_allocate' : transaction.on_progress_textview_size_allocate,
'on_choose_renderertoggle_toggled' : transaction.on_choose_renderertoggle_toggled,
'on_PreferencesCloseButton_clicked' : transaction.on_PreferencesCloseButton_clicked,
'on_PreferencesWindow_delete_event' : transaction.on_PreferencesWindow_delete_event,
'on_PreferencesValidButton_clicked' : transaction.on_PreferencesValidButton_clicked,
'on_TransValidButton_clicked' :on_TransValidButton_clicked,
'on_TransCancelButton_clicked' :on_TransCancelButton_clicked,
'on_ProgressCloseButton_clicked' : on_ProgressCloseButton_clicked,
'on_ProgressCancelButton_clicked' : on_ProgressCancelButton_clicked}
def config_dbus_signals():
bus = dbus.SystemBus()
bus.add_signal_receiver(handle_reply, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionDone")
bus.add_signal_receiver(handle_error, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionError")
bus.add_signal_receiver(handle_updates, dbus_interface = "org.manjaro.pamac", signal_name = "EmitAvailableUpdates")
if common.pid_file_exists():
transaction.ErrorDialog.format_secondary_text(_('Pamac is already running'))
response = transaction.ErrorDialog.run()
if response:
transaction.ErrorDialog.hide()
else:
transaction_done = False
transaction.get_handle()
transaction.get_dbus_methods()
config_dbus_signals()
transaction.get_updates()
Gtk.main()