forked from cromer/pamac-classic
brand new pamac
This commit is contained in:
parent
13497e5c7a
commit
c7735f173d
@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
|
||||
<busconfig>
|
||||
<!-- Only root can own the service -->
|
||||
<policy user="root">
|
||||
<allow own="org.manjaro.pamac"/>
|
||||
</policy>
|
||||
|
||||
<!-- Allow anyone to invoke methods on the interfaces -->
|
||||
<policy context="default">
|
||||
<allow send_destination="org.manjaro.pamac"
|
||||
send_interface="org.manjaro.pamac"/>
|
||||
</policy>
|
||||
</busconfig>
|
||||
|
@ -1,5 +0,0 @@
|
||||
[D-BUS Service]
|
||||
Name=org.manjaro.pamac
|
||||
Exec=/usr/bin/pamac-daemon
|
||||
User=root
|
||||
SystemdService=pamac.service
|
@ -6,21 +6,46 @@
|
||||
<vendor>Manjaro</vendor>
|
||||
<vendor_url>http://manjaro.org/</vendor_url>
|
||||
<icon_name>package-x-generic</icon_name>
|
||||
<action id="org.manjaro.pamac.commit">
|
||||
<action id="org.manjaro.pamac.pkexec.pamac-manager">
|
||||
<message>Authentication is required</message>
|
||||
<defaults>
|
||||
<allow_any>no</allow_any>
|
||||
<allow_inactive>no</allow_inactive>
|
||||
<allow_active>auth_admin_keep</allow_active>
|
||||
</defaults>
|
||||
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/python3</annotate>
|
||||
<annotate key="org.freedesktop.policykit.exec.argv1">/usr/bin/pamac-manager</annotate>
|
||||
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
|
||||
</action>
|
||||
|
||||
<action id="org.manjaro.pamac.init_release">
|
||||
<action id="org.manjaro.pamac.pkexec.pamac-updater">
|
||||
<message>Authentication is required</message>
|
||||
<defaults>
|
||||
<allow_any>no</allow_any>
|
||||
<allow_inactive>no</allow_inactive>
|
||||
<allow_active>auth_admin_keep</allow_active>
|
||||
</defaults>
|
||||
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/python3</annotate>
|
||||
<annotate key="org.freedesktop.policykit.exec.argv1">/usr/bin/pamac-updater</annotate>
|
||||
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
|
||||
</action>
|
||||
<action id="org.manjaro.pamac.pkexec.pamac-install">
|
||||
<message>Authentication is required</message>
|
||||
<defaults>
|
||||
<allow_any>no</allow_any>
|
||||
<allow_inactive>no</allow_inactive>
|
||||
<allow_active>auth_admin_keep</allow_active>
|
||||
</defaults>
|
||||
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/python3</annotate>
|
||||
<annotate key="org.freedesktop.policykit.exec.argv1">/usr/bin/pamac-install</annotate>
|
||||
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
|
||||
</action>
|
||||
<action id="org.manjaro.pamac.pkexec.pamac-refresh">
|
||||
<defaults>
|
||||
<allow_any>no</allow_any>
|
||||
<allow_inactive>no</allow_inactive>
|
||||
<allow_active>yes</allow_active>
|
||||
</defaults>
|
||||
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/python3</annotate>
|
||||
<annotate key="org.freedesktop.policykit.exec.argv1">/usr/bin/pamac-refresh</annotate>
|
||||
</action>
|
||||
|
||||
</policyconfig>
|
||||
|
@ -1,7 +0,0 @@
|
||||
[Unit]
|
||||
Description=Pamac
|
||||
|
||||
[Service]
|
||||
Type=dbus
|
||||
BusName=org.manjaro.pamac
|
||||
ExecStart=/usr/bin/pamac-daemon
|
@ -1,7 +1,9 @@
|
||||
./pamac-daemon.py
|
||||
./pamac-manager.py
|
||||
./pamac-updater.py
|
||||
./pamac-tray.py
|
||||
./pamac-install.py
|
||||
./pamac/main.py
|
||||
./pamac/common.py
|
||||
./gui/manager.glade
|
||||
./gui/updater.glade
|
||||
./pamac/transaction.py
|
||||
./gui/manager.ui
|
||||
./gui/updater.ui
|
||||
./gui/dialogs.ui
|
||||
|
@ -1,118 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<!-- interface-requires gtk+ 3.0 -->
|
||||
<object class="GtkMessageDialog" id="ErrorDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="has_resize_grip">False</property>
|
||||
<property name="message_type">error</property>
|
||||
<property name="buttons">ok</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="messagedialog-action_area">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkMessageDialog" id="InfoDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="buttons">ok</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox9">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="messagedialog-action_area9">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkMessageDialog" id="QuestionDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="message_type">question</property>
|
||||
<property name="buttons">yes-no</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox8">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="messagedialog-action_area8">
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkMessageDialog" id="WarningDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="message_type">warning</property>
|
||||
<property name="buttons">ok</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox7">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="messagedialog-action_area7">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</interface>
|
528
gui/dialogs.ui
Normal file
528
gui/dialogs.ui
Normal file
@ -0,0 +1,528 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<!-- interface-requires gtk+ 3.6 -->
|
||||
<object class="GtkDialog" id="ChooseDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="title" translatable="yes">Choose</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="icon_name">system-software-install</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="deletable">False</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="dialog-vbox1">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="dialog-action_area1">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="ChooseButton">
|
||||
<property name="label">gtk-ok</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_ChooseButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="choose_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="scrolledwindow5">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<property name="min_content_width">300</property>
|
||||
<property name="min_content_height">250</property>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="treeview5">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="model">choose_list</property>
|
||||
<property name="headers_visible">False</property>
|
||||
<property name="headers_clickable">False</property>
|
||||
<property name="enable_search">False</property>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection" id="treeview-selection5"/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="treeviewcolumn1">
|
||||
<child>
|
||||
<object class="GtkCellRendererToggle" id="choose_renderertoggle">
|
||||
<signal name="toggled" handler="on_choose_renderertoggle_toggled" swapped="no"/>
|
||||
</object>
|
||||
<attributes>
|
||||
<attribute name="active">0</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="choose_renderertext"/>
|
||||
<attributes>
|
||||
<attribute name="text">1</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<action-widgets>
|
||||
<action-widget response="0">ChooseButton</action-widget>
|
||||
</action-widgets>
|
||||
</object>
|
||||
<object class="GtkWindow" id="ConfDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="border_width">5</property>
|
||||
<property name="title" translatable="yes">Summary</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="icon_name">system-software-install</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="deletable">False</property>
|
||||
<child>
|
||||
<object class="GtkBox" id="box7">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">5</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="sum_top_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="scrolledwindow4">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="vexpand">True</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<property name="min_content_width">330</property>
|
||||
<property name="min_content_height">250</property>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="treeview4">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="vexpand">True</property>
|
||||
<property name="model">transaction_sum</property>
|
||||
<property name="headers_visible">False</property>
|
||||
<property name="headers_clickable">False</property>
|
||||
<property name="enable_search">False</property>
|
||||
<property name="show_expanders">False</property>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection" id="treeview-selection"/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="_action">
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="cellrenderertext5">
|
||||
<property name="yalign">0</property>
|
||||
<property name="weight">600</property>
|
||||
</object>
|
||||
<attributes>
|
||||
<attribute name="text">0</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="_packages">
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="cellrenderertext6"/>
|
||||
<attributes>
|
||||
<attribute name="text">1</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="sum_bottom_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButtonBox" id="buttonbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">7</property>
|
||||
<property name="homogeneous">True</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="TransCancelButton">
|
||||
<property name="label">gtk-cancel</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="has_focus">True</property>
|
||||
<property name="is_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_TransCancelButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="TransValidButton">
|
||||
<property name="label">gtk-ok</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_TransValidButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkMessageDialog" id="ErrorDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="has_resize_grip">False</property>
|
||||
<property name="message_type">error</property>
|
||||
<property name="buttons">ok</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="messagedialog-action_area">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkMessageDialog" id="InfoDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="buttons">ok</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox9">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="messagedialog-action_area9">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkWindow" id="ProgressWindow">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="border_width">5</property>
|
||||
<property name="title" translatable="yes">Progress</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="default_width">450</property>
|
||||
<property name="icon_name">system-software-install</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="deletable">False</property>
|
||||
<property name="has_resize_grip">False</property>
|
||||
<child>
|
||||
<object class="GtkBox" id="box8">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">5</property>
|
||||
<child>
|
||||
<object class="GtkBox" id="box9">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">5</property>
|
||||
<child>
|
||||
<object class="GtkImage" id="action_icon">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="progresslabel2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkProgressBar" id="progressbar2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="pulse_step">0.050000000000000003</property>
|
||||
<property name="show_text">True</property>
|
||||
<property name="ellipsize">end</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkExpander" id="progress_expander">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resize_toplevel">True</property>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="scrolledwindow11">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="vexpand">True</property>
|
||||
<property name="window_placement">bottom-left</property>
|
||||
<property name="window_placement_set">True</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<property name="min_content_height">200</property>
|
||||
<child>
|
||||
<object class="GtkTextView" id="progress_textview">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="wrap_mode">word</property>
|
||||
<property name="cursor_visible">False</property>
|
||||
<signal name="size-allocate" handler="on_progress_textview_size_allocate" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child type="label">
|
||||
<object class="GtkLabel" id="label4">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">details</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButtonBox" id="buttonbox3">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">5</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="ProgressCancelButton">
|
||||
<property name="label">gtk-cancel</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_ProgressCancelButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="ProgressCloseButton">
|
||||
<property name="label">gtk-close</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="has_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_ProgressCloseButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkMessageDialog" id="QuestionDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="message_type">question</property>
|
||||
<property name="buttons">yes-no</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox8">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="messagedialog-action_area8">
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkMessageDialog" id="WarningDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="message_type">warning</property>
|
||||
<property name="buttons">ok</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox7">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="messagedialog-action_area7">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkListStore" id="choose_list">
|
||||
<columns>
|
||||
<!-- column-name gboolean1 -->
|
||||
<column type="gboolean"/>
|
||||
<!-- column-name gchararray1 -->
|
||||
<column type="gchararray"/>
|
||||
</columns>
|
||||
</object>
|
||||
<object class="GtkListStore" id="transaction_sum">
|
||||
<columns>
|
||||
<!-- column-name action -->
|
||||
<column type="gchararray"/>
|
||||
<!-- column-name packages -->
|
||||
<column type="gchararray"/>
|
||||
</columns>
|
||||
</object>
|
||||
</interface>
|
@ -1,38 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<!-- interface-requires gtk+ 3.0 -->
|
||||
<object class="GtkDialog" id="ChooseDialog">
|
||||
<!-- interface-requires gtk+ 3.6 -->
|
||||
<object class="GtkAboutDialog" id="AboutDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="title" translatable="yes">Choose</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="icon_name">system-software-install</property>
|
||||
<property name="border_width">5</property>
|
||||
<property name="title" translatable="yes">About Pamac</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="deletable">False</property>
|
||||
<property name="transient_for">ManagerWindow</property>
|
||||
<property name="program_name">Pamac</property>
|
||||
<property name="copyright" translatable="yes">Copyright © 2013 Guillaume Benoit</property>
|
||||
<property name="comments" translatable="yes">A gtk3 frontend for pyalpm</property>
|
||||
<property name="website">http://manjaro.org</property>
|
||||
<property name="logo_icon_name">system-software-install</property>
|
||||
<property name="license_type">gpl-3-0</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="dialog-vbox1">
|
||||
<object class="GtkBox" id="aboutdialog-vbox1">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">2</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="dialog-action_area1">
|
||||
<object class="GtkButtonBox" id="aboutdialog-action_area1">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="ChooseButton">
|
||||
<property name="label">gtk-ok</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_ChooseButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
@ -42,205 +30,7 @@
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="choose_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="scrolledwindow5">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<property name="min_content_width">300</property>
|
||||
<property name="min_content_height">250</property>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="treeview5">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="model">choose_list</property>
|
||||
<property name="headers_visible">False</property>
|
||||
<property name="headers_clickable">False</property>
|
||||
<property name="enable_search">False</property>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection" id="treeview-selection5"/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="treeviewcolumn1">
|
||||
<child>
|
||||
<object class="GtkCellRendererToggle" id="cellrenderertoggle2">
|
||||
<signal name="toggled" handler="on_cellrenderertoggle2_toggled" swapped="no"/>
|
||||
</object>
|
||||
<attributes>
|
||||
<attribute name="active">0</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="cellrenderertext7"/>
|
||||
<attributes>
|
||||
<attribute name="text">1</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<action-widgets>
|
||||
<action-widget response="0">ChooseButton</action-widget>
|
||||
</action-widgets>
|
||||
</object>
|
||||
<object class="GtkWindow" id="ConfDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="border_width">5</property>
|
||||
<property name="title" translatable="yes">Summary</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="icon_name">system-software-install</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="deletable">False</property>
|
||||
<property name="transient_for">ManagerWindow</property>
|
||||
<child>
|
||||
<object class="GtkBox" id="box7">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">5</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="sum_top_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="scrolledwindow4">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="vexpand">True</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<property name="min_content_width">330</property>
|
||||
<property name="min_content_height">250</property>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="treeview4">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="vexpand">True</property>
|
||||
<property name="model">transaction_sum</property>
|
||||
<property name="headers_visible">False</property>
|
||||
<property name="headers_clickable">False</property>
|
||||
<property name="enable_search">False</property>
|
||||
<property name="show_expanders">False</property>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection" id="treeview-selection"/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="_action">
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="cellrenderertext5">
|
||||
<property name="yalign">0</property>
|
||||
<property name="weight">600</property>
|
||||
</object>
|
||||
<attributes>
|
||||
<attribute name="text">0</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="_packages">
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="cellrenderertext6"/>
|
||||
<attributes>
|
||||
<attribute name="text">1</attribute>
|
||||
</attributes>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="sum_bottom_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButtonBox" id="buttonbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">7</property>
|
||||
<property name="homogeneous">True</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="TransCancelButton">
|
||||
<property name="label">gtk-cancel</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="has_focus">True</property>
|
||||
<property name="is_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_TransCancelButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="TransValidButton">
|
||||
<property name="label">gtk-ok</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_TransValidButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
@ -259,6 +49,68 @@
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkBox" id="box4">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="manager_valid_button">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="image">valid_icon</property>
|
||||
<property name="relief">none</property>
|
||||
<property name="focus_on_click">False</property>
|
||||
<property name="always_show_image">True</property>
|
||||
<signal name="clicked" handler="on_manager_valid_button_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="manager_cancel_button">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="image">cancel_icon</property>
|
||||
<property name="relief">none</property>
|
||||
<property name="focus_on_click">False</property>
|
||||
<property name="always_show_image">True</property>
|
||||
<signal name="clicked" handler="on_manager_cancel_button_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkMenuButton" id="menu_button">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="halign">end</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="image">menu_icon</property>
|
||||
<property name="relief">none</property>
|
||||
<property name="always_show_image">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkPaned" id="paned1">
|
||||
<property name="visible">True</property>
|
||||
@ -395,17 +247,17 @@
|
||||
<property name="can_focus">True</property>
|
||||
<property name="margin_top">2</property>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="state_treeview">
|
||||
<object class="GtkTreeView" id="states_treeview">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="model">state_list</property>
|
||||
<property name="model">states_list</property>
|
||||
<property name="headers_visible">False</property>
|
||||
<property name="headers_clickable">False</property>
|
||||
<property name="enable_search">False</property>
|
||||
<property name="show_expanders">False</property>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection" id="state_treeview_selection">
|
||||
<signal name="changed" handler="on_state_treeview_selection_changed" swapped="no"/>
|
||||
<object class="GtkTreeSelection" id="states_treeview_selection">
|
||||
<signal name="changed" handler="on_states_treeview_selection_changed" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
@ -502,14 +354,13 @@
|
||||
<property name="vexpand">True</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="list_treeview">
|
||||
<object class="GtkTreeView" id="packages_list_treeview">
|
||||
<property name="width_request">500</property>
|
||||
<property name="height_request">300</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="vexpand">True</property>
|
||||
<property name="model">packages_list</property>
|
||||
<property name="search_column">0</property>
|
||||
<signal name="button-press-event" handler="on_list_treeview_button_press_event" swapped="no"/>
|
||||
<signal name="row-activated" handler="on_list_treeview_row_activated" swapped="no"/>
|
||||
@ -519,64 +370,54 @@
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="installed_column">
|
||||
<object class="GtkTreeViewColumn" id="state_column">
|
||||
<property name="resizable">True</property>
|
||||
<property name="sizing">autosize</property>
|
||||
<property name="title" translatable="yes">State</property>
|
||||
<property name="clickable">True</property>
|
||||
<property name="sort_indicator">True</property>
|
||||
<property name="sort_column_id">1</property>
|
||||
<property name="sort_column_id">0</property>
|
||||
<signal name="clicked" handler="on_state_column_clicked" swapped="no"/>
|
||||
<child>
|
||||
<object class="GtkCellRendererPixbuf" id="cellrendererpixbuf1"/>
|
||||
<attributes>
|
||||
<attribute name="pixbuf">2</attribute>
|
||||
</attributes>
|
||||
<object class="GtkCellRendererPixbuf" id="state_rendererpixbuf"/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="name_column">
|
||||
<property name="resizable">True</property>
|
||||
<property name="sizing">autosize</property>
|
||||
<property name="title" translatable="yes">Name</property>
|
||||
<property name="clickable">True</property>
|
||||
<property name="sort_indicator">True</property>
|
||||
<property name="sort_column_id">0</property>
|
||||
<signal name="clicked" handler="on_name_column_clicked" swapped="no"/>
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="cellrenderertext3">
|
||||
<property name="xalign">0</property>
|
||||
</object>
|
||||
<attributes>
|
||||
<attribute name="text">0</attribute>
|
||||
</attributes>
|
||||
<object class="GtkCellRendererText" id="name_renderertext"/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="version_column">
|
||||
<property name="resizable">True</property>
|
||||
<property name="sizing">autosize</property>
|
||||
<property name="title" translatable="yes">Version</property>
|
||||
<property name="clickable">True</property>
|
||||
<property name="sort_indicator">True</property>
|
||||
<property name="sort_column_id">7</property>
|
||||
<property name="sort_column_id">0</property>
|
||||
<signal name="clicked" handler="on_version_column_clicked" swapped="no"/>
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="cellrenderertext15"/>
|
||||
<attributes>
|
||||
<attribute name="text">5</attribute>
|
||||
</attributes>
|
||||
<object class="GtkCellRendererText" id="version_renderertext"/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="size_column">
|
||||
<property name="resizable">True</property>
|
||||
<property name="sizing">autosize</property>
|
||||
<property name="title" translatable="yes">Size</property>
|
||||
<property name="clickable">True</property>
|
||||
<property name="sort_indicator">True</property>
|
||||
<property name="sort_column_id">6</property>
|
||||
<property name="sort_column_id">0</property>
|
||||
<signal name="clicked" handler="on_size_column_clicked" swapped="no"/>
|
||||
<child>
|
||||
<object class="GtkCellRendererText" id="cellrenderertext11"/>
|
||||
<attributes>
|
||||
<attribute name="text">3</attribute>
|
||||
</attributes>
|
||||
<object class="GtkCellRendererText" id="size_renderertext"/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
@ -865,131 +706,41 @@
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">5</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="box5">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkButtonBox" id="buttonbox2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">5</property>
|
||||
<property name="homogeneous">True</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="ManagerRefreshButton">
|
||||
<property name="label">gtk-refresh</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_Manager_RefreshButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="ManagerValidButton">
|
||||
<property name="label">gtk-apply</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_Manager_ValidButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="ManagerEraseButton">
|
||||
<property name="label">gtk-undo</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_Manager_EraseButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="ManagerQuitButton">
|
||||
<property name="label">gtk-quit</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_Manager_QuitButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="padding">4</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">3</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkWindow" id="ProgressWindow">
|
||||
<property name="width_request">250</property>
|
||||
<property name="height_request">60</property>
|
||||
<object class="GtkFileChooserDialog" id="PackagesChooserDialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="border_width">5</property>
|
||||
<property name="title" translatable="yes">Progress</property>
|
||||
<property name="resizable">False</property>
|
||||
<property name="title" translatable="yes">Install local packages</property>
|
||||
<property name="role">GtkFileChooserDialog</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">center-on-parent</property>
|
||||
<property name="default_width">250</property>
|
||||
<property name="default_height">60</property>
|
||||
<property name="icon_name">system-software-install</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="deletable">False</property>
|
||||
<property name="transient_for">ManagerWindow</property>
|
||||
<property name="has_resize_grip">False</property>
|
||||
<child>
|
||||
<object class="GtkBox" id="box8">
|
||||
<property name="visible">True</property>
|
||||
<property name="create_folders">False</property>
|
||||
<property name="filter">package_filter</property>
|
||||
<property name="select_multiple">True</property>
|
||||
<signal name="file-activated" handler="on_PackagesChooserDialog_file_activated" swapped="no"/>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="filechooserdialog-vbox1">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">5</property>
|
||||
<child>
|
||||
<object class="GtkBox" id="box9">
|
||||
<property name="visible">True</property>
|
||||
<property name="spacing">2</property>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkButtonBox" id="filechooserdialog-action_area1">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">5</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkImage" id="action_icon">
|
||||
<object class="GtkButton" id="package_cancel_button">
|
||||
<property name="label">gtk-cancel</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_package_cancel_button_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
@ -998,9 +749,13 @@
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="progresslabel2">
|
||||
<object class="GtkButton" id="package_open_button">
|
||||
<property name="label">gtk-open</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_package_open_button_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
@ -1012,60 +767,24 @@
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkProgressBar" id="progressbar2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="pulse_step">0.050000000000000003</property>
|
||||
<property name="show_text">True</property>
|
||||
<property name="ellipsize">end</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButtonBox" id="buttonbox3">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="ProgressCancelButton">
|
||||
<property name="label">gtk-cancel</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<property name="xalign">1</property>
|
||||
<signal name="clicked" handler="on_ProgressCancelButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
<placeholder/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<action-widgets>
|
||||
<action-widget response="0">package_cancel_button</action-widget>
|
||||
<action-widget response="0">package_open_button</action-widget>
|
||||
</action-widgets>
|
||||
</object>
|
||||
<object class="GtkListStore" id="choose_list">
|
||||
<columns>
|
||||
<!-- column-name gboolean1 -->
|
||||
<column type="gboolean"/>
|
||||
<!-- column-name gchararray1 -->
|
||||
<column type="gchararray"/>
|
||||
</columns>
|
||||
<object class="GtkImage" id="cancel_icon">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="stock">gtk-cancel</property>
|
||||
</object>
|
||||
<object class="GtkListStore" id="deps_list">
|
||||
<columns>
|
||||
@ -1101,18 +820,78 @@
|
||||
<column type="gchararray"/>
|
||||
</columns>
|
||||
</object>
|
||||
<object class="GtkImage" id="local_icon">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="pixel_size">16</property>
|
||||
<property name="icon_name">emblem-package</property>
|
||||
</object>
|
||||
<object class="GtkMenu" id="main_menu">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="refresh_item">
|
||||
<property name="label">gtk-refresh</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="activate" handler="on_refresh_item_activate" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparatorMenuItem" id="separatormenuitem1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="local_item">
|
||||
<property name="label">Install local packages</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="image">local_icon</property>
|
||||
<property name="use_stock">False</property>
|
||||
<signal name="activate" handler="on_local_item_activate" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSeparatorMenuItem" id="separatormenuitem2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="about_item">
|
||||
<property name="label">gtk-about</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="activate" handler="on_about_item_activate" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkImage" id="menu_icon">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="stock">gtk-execute</property>
|
||||
</object>
|
||||
<object class="GtkFileFilter" id="package_filter">
|
||||
<mime-types>
|
||||
<mime-type>application/x-xz-compressed-tar</mime-type>
|
||||
</mime-types>
|
||||
</object>
|
||||
<object class="GtkListStore" id="packages_list">
|
||||
<columns>
|
||||
<!-- column-name name -->
|
||||
<column type="gchararray"/>
|
||||
<!-- column-name installed -->
|
||||
<column type="gboolean"/>
|
||||
<!-- column-name icon -->
|
||||
<column type="GdkPixbuf"/>
|
||||
<!-- column-name size_string -->
|
||||
<column type="gchararray"/>
|
||||
<!-- column-name real_size -->
|
||||
<column type="gint"/>
|
||||
<column type="gdouble"/>
|
||||
<!-- column-name version -->
|
||||
<column type="gchararray"/>
|
||||
</columns>
|
||||
@ -1129,18 +908,15 @@
|
||||
<column type="gchararray"/>
|
||||
</columns>
|
||||
</object>
|
||||
<object class="GtkListStore" id="state_list">
|
||||
<object class="GtkListStore" id="states_list">
|
||||
<columns>
|
||||
<!-- column-name state -->
|
||||
<column type="gchararray"/>
|
||||
</columns>
|
||||
</object>
|
||||
<object class="GtkListStore" id="transaction_sum">
|
||||
<columns>
|
||||
<!-- column-name action -->
|
||||
<column type="gchararray"/>
|
||||
<!-- column-name packages -->
|
||||
<column type="gchararray"/>
|
||||
</columns>
|
||||
<object class="GtkImage" id="valid_icon">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="stock">gtk-ok</property>
|
||||
</object>
|
||||
</interface>
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<!-- interface-requires gtk+ 3.0 -->
|
||||
<!-- interface-requires gtk+ 3.6 -->
|
||||
<object class="GtkWindow" id="UpdaterWindow">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="border_width">5</property>
|
||||
@ -21,7 +21,7 @@
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">5</property>
|
||||
<child>
|
||||
<object class="GtkImage" id="image1">
|
||||
<object class="GtkImage" id="updater_image">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="pixel_size">48</property>
|
||||
@ -87,21 +87,6 @@
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="UpdaterQuitButton">
|
||||
<property name="label">gtk-quit</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="on_Updater_QuitButton_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
488
pamac-daemon.py
488
pamac-daemon.py
@ -1,488 +0,0 @@
|
||||
#! /usr/bin/python3
|
||||
# -*- coding:utf-8 -*-
|
||||
|
||||
import dbus
|
||||
import dbus.service
|
||||
from dbus.mainloop.glib import DBusGMainLoop
|
||||
from gi.repository import GObject
|
||||
|
||||
import pyalpm
|
||||
from multiprocessing import Process
|
||||
from pamac import config, common
|
||||
|
||||
# i18n
|
||||
import gettext
|
||||
gettext.bindtextdomain('pamac', '/usr/share/locale')
|
||||
gettext.textdomain('pamac')
|
||||
_ = gettext.gettext
|
||||
|
||||
class PamacDBusService(dbus.service.Object):
|
||||
def __init__(self):
|
||||
bus=dbus.SystemBus()
|
||||
bus_name = dbus.service.BusName('org.manjaro.pamac', bus)
|
||||
dbus.service.Object.__init__(self, bus_name, '/org/manjaro/pamac')
|
||||
self.t = None
|
||||
self.task = None
|
||||
self.error = ''
|
||||
self.warning = ''
|
||||
self.previous_action = ''
|
||||
self.action = _('Preparing')+'...'
|
||||
self.previous_icon = ''
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-setup.png'
|
||||
self.previous_target = ''
|
||||
self.target = ''
|
||||
self.previous_percent = 0
|
||||
self.percent = 0
|
||||
self.total_size = 0
|
||||
self.already_transferred = 0
|
||||
self.handle = config.handle()
|
||||
|
||||
def get_handle(self):
|
||||
print('daemon get handle')
|
||||
self.handle = config.handle()
|
||||
self.handle.dlcb = self.cb_dl
|
||||
self.handle.totaldlcb = self.totaldlcb
|
||||
self.handle.eventcb = self.cb_event
|
||||
self.handle.questioncb = self.cb_conv
|
||||
self.handle.progresscb = self.cb_progress
|
||||
self.handle.logcb = self.cb_log
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitAction(self, action):
|
||||
pass
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitIcon(self, icon):
|
||||
pass
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitTarget(self, target):
|
||||
pass
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitPercent(self, percent):
|
||||
pass
|
||||
|
||||
def cb_event(self, ID, event, tupel):
|
||||
if ID is 1:
|
||||
self.action = _('Checking dependencies')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
elif ID is 2:
|
||||
if self.warning:
|
||||
self.EmitLogWarning(self.warning)
|
||||
self.warning = ''
|
||||
elif ID is 3:
|
||||
self.action = _('Checking file conflicts')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
elif ID is 5:
|
||||
self.action = _('Resolving dependencies')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-setup.png'
|
||||
elif ID is 6:
|
||||
if self.warning:
|
||||
self.EmitLogWarning(self.warning)
|
||||
self.warning = ''
|
||||
elif ID is 7:
|
||||
self.action = _('Checking inter conflicts')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
elif ID is 9:
|
||||
self.action = _('Installing')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-add.png'
|
||||
elif ID is 10:
|
||||
formatted_event = 'Installed {pkgname} ({pkgversion})'.format(pkgname = tupel[0].name, pkgversion = tupel[0].version)
|
||||
common.write_log_file(formatted_event)
|
||||
print(formatted_event)
|
||||
elif ID is 11:
|
||||
self.action = _('Removing')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-delete.png'
|
||||
elif ID is 12:
|
||||
formatted_event = 'Removed {pkgname} ({pkgversion})'.format(pkgname = tupel[0].name, pkgversion = tupel[0].version)
|
||||
common.write_log_file(formatted_event)
|
||||
print(formatted_event)
|
||||
elif ID is 13:
|
||||
self.action = _('Upgrading')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-update.png'
|
||||
elif ID is 14:
|
||||
formatted_event = 'Upgraded {pkgname} ({oldversion} -> {newversion})'.format(pkgname = tupel[1].name, oldversion = tupel[1].version, newversion = tupel[0].version)
|
||||
common.write_log_file(formatted_event)
|
||||
print(formatted_event)
|
||||
elif ID is 15:
|
||||
self.action = _('Downgrading')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-add.png'
|
||||
print('Downgrading a package')
|
||||
#elif ID is 16:
|
||||
#formatted_event = 'Downgraded {pkgname} ({oldversion} -> {newversion})'.format(pkgname = tupel[1].name, oldversion = tupel[1].version, newversion = tupel[0].version)
|
||||
#common.write_log_file(formatted_event)
|
||||
#print(formatted_event)
|
||||
elif ID is 17:
|
||||
self.action = _('Reinstalling')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-add.png'
|
||||
print('Reinstalling a package')
|
||||
#elif ID is 18:
|
||||
#formatted_event = 'Reinstalled {pkgname} ({pkgversion})'.format(pkgname = tupel[0].name, pkgversion = tupel[0].version)
|
||||
#common.write_log_file(formatted_event)
|
||||
#print(formatted_event)
|
||||
elif ID is 19:
|
||||
self.action = _('Checking integrity')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
self.already_transferred = 0
|
||||
elif ID is 21:
|
||||
self.action = _('Loading packages files')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
print('Loading packages files')
|
||||
elif ID is 30:
|
||||
self.action = _('Configuring')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-setup.png'
|
||||
self.EmitPercent(2)
|
||||
print('Configuring a package')
|
||||
elif ID is 31:
|
||||
print('Downloading a file')
|
||||
elif ID is 36:
|
||||
self.action = _('Checking keys in keyring')+'...'
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
print('Checking keys in keyring')
|
||||
else :
|
||||
self.action = ''
|
||||
#self.EmitTarget('')
|
||||
#self.EmitPercent(0)
|
||||
if self.action != self.previous_action:
|
||||
self.previous_action = self.action
|
||||
self.EmitAction(self.action)
|
||||
if self.icon != self.previous_icon:
|
||||
self.previous_icon = self.icon
|
||||
self.EmitIcon(self.icon)
|
||||
print(ID,event)
|
||||
|
||||
def cb_conv(self, *args):
|
||||
print("conversation", args)
|
||||
|
||||
def cb_log(self, level, line):
|
||||
_logmask = pyalpm.LOG_ERROR | pyalpm.LOG_WARNING
|
||||
if not (level & _logmask):
|
||||
return
|
||||
if level & pyalpm.LOG_ERROR:
|
||||
#self.error += "ERROR: "+line
|
||||
#self.EmitLogError(line)
|
||||
print(line)
|
||||
elif level & pyalpm.LOG_WARNING:
|
||||
self.warning += "WARNING: "+line
|
||||
#self.EmitLogWarning(line)
|
||||
elif level & pyalpm.LOG_DEBUG:
|
||||
line = "DEBUG: " + line
|
||||
print(line)
|
||||
elif level & pyalpm.LOG_FUNCTION:
|
||||
line = "FUNC: " + line
|
||||
print(line)
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitLogError(self, message):
|
||||
pass
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitLogWarning(self, message):
|
||||
pass
|
||||
|
||||
def totaldlcb(self, _total_size):
|
||||
self.total_size = _total_size
|
||||
|
||||
def cb_dl(self, _target, _transferred, total):
|
||||
if self.total_size > 0:
|
||||
fraction = (_transferred+self.already_transferred)/self.total_size
|
||||
size = 0
|
||||
try:
|
||||
if (self.t.to_remove or self.t.to_add):
|
||||
for pkg in self.t.to_remove+self.t.to_add:
|
||||
if pkg.filename == _target:
|
||||
size = pkg.size
|
||||
if _transferred == size:
|
||||
self.already_transferred += size
|
||||
self.action = _('Downloading {size}').format(size = common.format_size(self.total_size))
|
||||
self.target = _target
|
||||
self.percent = round(fraction, 2)
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/package-download.png'
|
||||
else:
|
||||
self.action = _('Refreshing')+'...'
|
||||
self.target = _target
|
||||
self.percent = 2
|
||||
self.icon = '/usr/share/pamac/icons/24x24/status/refresh-cache.png'
|
||||
if self.action != self.previous_action:
|
||||
self.previous_action = self.action
|
||||
self.EmitAction(self.action)
|
||||
if self.icon != self.previous_icon:
|
||||
self.previous_icon = self.icon
|
||||
self.EmitIcon(self.icon)
|
||||
if self.target != self.previous_target:
|
||||
self.previous_target = self.target
|
||||
self.EmitTarget(self.target)
|
||||
if self.percent != self.previous_percent:
|
||||
self.previous_percent = self.percent
|
||||
self.EmitPercent(self.percent)
|
||||
except pyalpm.error:
|
||||
pass
|
||||
|
||||
def cb_progress(self, _target, _percent, n, i):
|
||||
self.target = _target+' ('+str(i)+'/'+str(n)+')'
|
||||
#self.percent = round(_percent/100, 2)
|
||||
self.percent = round(i/n, 2)
|
||||
if self.target != self.previous_target:
|
||||
self.previous_target = self.target
|
||||
self.EmitTarget(self.target)
|
||||
if self.percent != self.previous_percent:
|
||||
self.previous_percent = self.percent
|
||||
self.EmitPercent(self.percent)
|
||||
|
||||
def policykit_test(self, sender, connexion, action):
|
||||
bus = dbus.SystemBus()
|
||||
proxy_dbus = connexion.get_object('org.freedesktop.DBus','/org/freedesktop/DBus/Bus', False)
|
||||
dbus_info = dbus.Interface(proxy_dbus,'org.freedesktop.DBus')
|
||||
sender_pid = dbus_info.GetConnectionUnixProcessID(sender)
|
||||
proxy_policykit = bus.get_object('org.freedesktop.PolicyKit1','/org/freedesktop/PolicyKit1/Authority',False)
|
||||
policykit_authority = dbus.Interface(proxy_policykit,'org.freedesktop.PolicyKit1.Authority')
|
||||
|
||||
Subject = ('unix-process', {'pid': dbus.UInt32(sender_pid, variant_level=1),
|
||||
'start-time': dbus.UInt64(0, variant_level=1)})
|
||||
(is_authorized,is_challenge,details) = policykit_authority.CheckAuthorization(Subject, action, {'': ''}, dbus.UInt32(1), '')
|
||||
return is_authorized
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitAvailableUpdates(self, updates_nb):
|
||||
pass
|
||||
|
||||
def CheckUpdates(self):
|
||||
updates = 0
|
||||
_ignorepkgs = []
|
||||
for group in self.handle.ignoregrps:
|
||||
db = self.handle.get_localdb()
|
||||
grp = db.read_grp(group)
|
||||
if grp:
|
||||
name, pkg_list = grp
|
||||
for pkg in pkg_list:
|
||||
if not pkg.name in _ignorepkgs:
|
||||
_ignorepkgs.append(pkg.name)
|
||||
for name in self.handle.ignorepkgs:
|
||||
pkg = self.handle.get_localdb().get_pkg(name)
|
||||
if pkg:
|
||||
if not pkg.name in _ignorepkgs:
|
||||
_ignorepkgs.append(pkg.name)
|
||||
if config.syncfirst:
|
||||
for name in config.syncfirst:
|
||||
pkg = self.handle.get_localdb().get_pkg(name)
|
||||
if pkg:
|
||||
candidate = pyalpm.sync_newversion(pkg, self.handle.get_syncdbs())
|
||||
if candidate:
|
||||
updates += 1
|
||||
if not updates:
|
||||
for pkg in self.handle.get_localdb().pkgcache:
|
||||
candidate = pyalpm.sync_newversion(pkg, self.handle.get_syncdbs())
|
||||
if candidate:
|
||||
if not candidate.name in _ignorepkgs:
|
||||
updates += 1
|
||||
self.EmitAvailableUpdates(updates)
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', '', 's', async_callbacks=('success', 'nosuccess'))
|
||||
def Refresh(self, success, nosuccess):
|
||||
def refresh():
|
||||
self.target = ''
|
||||
self.percent = 0
|
||||
self.error = ''
|
||||
self.get_handle()
|
||||
for db in self.handle.get_syncdbs():
|
||||
try:
|
||||
self.t = self.handle.init_transaction()
|
||||
db.update(force = False)
|
||||
except pyalpm.error as e:
|
||||
self.error += ' --> '+str(e)+'\n'
|
||||
break
|
||||
finally:
|
||||
try:
|
||||
self.t.release()
|
||||
except:
|
||||
pass
|
||||
if self.error:
|
||||
self.EmitTransactionError(self.error)
|
||||
else:
|
||||
self.CheckUpdates()
|
||||
self.EmitTransactionDone('')
|
||||
self.task = Process(target=refresh)
|
||||
self.task.start()
|
||||
success('')
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', 'a{sb}', 's')#, sender_keyword='sender', connection_keyword='connexion')
|
||||
def Init(self, options):#, sender=None, connexion=None):
|
||||
self.error = ''
|
||||
#if self.policykit_test(sender,connexion,'org.manjaro.pamac.init_release'):
|
||||
try:
|
||||
self.get_handle()
|
||||
self.t = self.handle.init_transaction(**options)
|
||||
print('Init:',self.t.flags)
|
||||
except pyalpm.error as e:
|
||||
self.error += ' --> '+str(e)+'\n'
|
||||
finally:
|
||||
if self.error:
|
||||
self.EmitTransactionError(self.error)
|
||||
return self.error
|
||||
#else:
|
||||
# return _('Authentication failed')
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', '', 's')
|
||||
def Sysupgrade(self):
|
||||
self.error = ''
|
||||
try:
|
||||
self.t.sysupgrade(downgrade=False)
|
||||
print('to_upgrade:',self.t.to_add)
|
||||
except pyalpm.error as e:
|
||||
self.error += ' --> '+str(e)+'\n'
|
||||
finally:
|
||||
return self.error
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', 's', 's')
|
||||
def Remove(self, pkgname):
|
||||
self.error = ''
|
||||
try:
|
||||
pkg = self.handle.get_localdb().get_pkg(pkgname)
|
||||
if pkg is not None:
|
||||
self.t.remove_pkg(pkg)
|
||||
except pyalpm.error as e:
|
||||
self.error += ' --> '+str(e)+'\n'
|
||||
finally:
|
||||
return self.error
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', 's', 's')
|
||||
def Add(self, pkgname):
|
||||
self.error = ''
|
||||
try:
|
||||
for repo in self.handle.get_syncdbs():
|
||||
pkg = repo.get_pkg(pkgname)
|
||||
if pkg:
|
||||
self.t.add_pkg(pkg)
|
||||
break
|
||||
except pyalpm.error as e:
|
||||
self.error += ' --> '+str(e)+'\n'
|
||||
finally:
|
||||
return self.error
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', 's', 's')
|
||||
def Load(self, tarball_path):
|
||||
self.error = ''
|
||||
try:
|
||||
pkg = self.handle.load_pkg(tarball_path)
|
||||
if pkg:
|
||||
self.t.add_pkg(pkg)
|
||||
except pyalpm.error:
|
||||
self.error += _('{pkgname} is not a valid path or package name').format(pkgname = tarball_path)
|
||||
finally:
|
||||
return self.error
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', '', 's')
|
||||
def Prepare(self):
|
||||
self.error = ''
|
||||
try:
|
||||
self.t.prepare()
|
||||
except pyalpm.error as e:
|
||||
self.error += ' --> '+str(e)+'\n'
|
||||
finally:
|
||||
return self.error
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', '', 'a(ss)')
|
||||
def To_Remove(self):
|
||||
liste = []
|
||||
for pkg in self.t.to_remove:
|
||||
liste.append((pkg.name, pkg.version))
|
||||
return liste
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', '', 'a(ssi)')
|
||||
def To_Add(self):
|
||||
liste = []
|
||||
for pkg in self.t.to_add:
|
||||
liste.append((pkg.name, pkg.version, pkg.download_size))
|
||||
return liste
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', '', 's', async_callbacks=('success', 'nosuccess'))
|
||||
def Interrupt(self, success, nosuccess):
|
||||
def interrupt():
|
||||
self.error = ''
|
||||
#try:
|
||||
# self.t.interrupt()
|
||||
#except pyalpm.error as e:
|
||||
# self.error += ' --> '+str(e)+'\n'
|
||||
try:
|
||||
self.t.release()
|
||||
#except pyalpm.error as e:
|
||||
#self.error += ' --> '+str(e)+'\n'
|
||||
except:
|
||||
pass
|
||||
#finally:
|
||||
#if self.error:
|
||||
#self.EmitTransactionError(self.error)
|
||||
self.task.terminate()
|
||||
interrupt()
|
||||
success('')
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', '', 's', sender_keyword='sender', connection_keyword='connexion', async_callbacks=('success', 'nosuccess'))
|
||||
def Commit(self, success, nosuccess, sender=None, connexion=None):
|
||||
def commit():
|
||||
self.error = ''
|
||||
try:
|
||||
self.t.commit()
|
||||
except pyalpm.error as e:
|
||||
self.error += ' --> '+str(e)+'\n'
|
||||
#except dbus.exceptions.DBusException:
|
||||
#pass
|
||||
finally:
|
||||
self.CheckUpdates()
|
||||
if self.warning:
|
||||
self.EmitLogWarning(self.warning)
|
||||
self.warning = ''
|
||||
if self.error:
|
||||
self.EmitTransactionError(self.error)
|
||||
else:
|
||||
self.EmitTransactionDone(_('Transaction successfully finished'))
|
||||
try:
|
||||
authorized = self.policykit_test(sender,connexion,'org.manjaro.pamac.commit')
|
||||
except dbus.exceptions.DBusException as e:
|
||||
self.EmitTransactionError(_('Authentication failed'))
|
||||
success('')
|
||||
else:
|
||||
if authorized:
|
||||
self.task = Process(target=commit)
|
||||
self.task.start()
|
||||
else :
|
||||
self.t.release()
|
||||
self.EmitTransactionError(_('Authentication failed'))
|
||||
success('')
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitTransactionDone(self, message):
|
||||
pass
|
||||
|
||||
@dbus.service.signal('org.manjaro.pamac')
|
||||
def EmitTransactionError(self, message):
|
||||
pass
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac', '', 's')#, sender_keyword='sender', connection_keyword='connexion')
|
||||
def Release(self):#, sender=None, connexion=None):
|
||||
self.error = ''
|
||||
#if self.policykit_test(sender,connexion,'org.manjaro.pamac.init_release'):
|
||||
try:
|
||||
self.t.release()
|
||||
except pyalpm.error as e:
|
||||
self.error += ' --> '+str(e)+'\n'
|
||||
finally:
|
||||
return self.error
|
||||
#else :
|
||||
# return _('Authentication failed')
|
||||
|
||||
@dbus.service.method('org.manjaro.pamac')
|
||||
def StopDaemon(self):
|
||||
try:
|
||||
self.t.release()
|
||||
except:
|
||||
pass
|
||||
common.rm_pid_file()
|
||||
mainloop.quit()
|
||||
|
||||
GObject.threads_init()
|
||||
DBusGMainLoop(set_as_default = True)
|
||||
myservice = PamacDBusService()
|
||||
common.write_pid_file()
|
||||
mainloop = GObject.MainLoop()
|
||||
mainloop.run()
|
144
pamac-install.py
Executable file → Normal file
144
pamac-install.py
Executable file → Normal file
@ -1,11 +1,10 @@
|
||||
#! /usr/bin/python3
|
||||
#! /usr/bin/pkexec /usr/bin/python3
|
||||
# -*- coding:utf-8 -*-
|
||||
|
||||
from gi.repository import GObject
|
||||
from gi.repository import Gtk
|
||||
from sys import argv
|
||||
import dbus
|
||||
from os.path import abspath
|
||||
from pamac import common
|
||||
from pamac import common, transaction
|
||||
|
||||
# i18n
|
||||
import gettext
|
||||
@ -16,97 +15,84 @@ gettext.textdomain('pamac')
|
||||
_ = gettext.gettext
|
||||
|
||||
def exiting(msg):
|
||||
transaction.StopDaemon()
|
||||
print('exiting')
|
||||
loop.quit()
|
||||
|
||||
def new_on_TransCancelButton_clicked(self, *arg):
|
||||
main.ProgressWindow.hide()
|
||||
main.ConfDialog.hide()
|
||||
transaction.Release()
|
||||
exiting('')
|
||||
def on_ProgressCloseButton_clicked(*args):
|
||||
transaction.ProgressWindow.hide()
|
||||
transaction.progress_buffer.delete(transaction.progress_buffer.get_start_iter(),transaction.progress_buffer.get_end_iter())
|
||||
common.rm_pid_file()
|
||||
Gtk.main_quit()
|
||||
|
||||
def new_on_TransValidButton_clicked(self, *arg):
|
||||
main.ConfDialog.hide()
|
||||
main.finalize()
|
||||
def on_ProgressCancelButton_clicked(*args):
|
||||
trans.interrupt()
|
||||
|
||||
def get_pkgs(pkgs):
|
||||
def on_TransCancelButton_clicked(self, *arg):
|
||||
transaction.ConfDialog.hide()
|
||||
trans.release()
|
||||
common.rm_pid_file()
|
||||
Gtk.main_quit()
|
||||
|
||||
def on_TransValidButton_clicked(self, *arg):
|
||||
transaction.ConfDialog.hide()
|
||||
trans.finalize()
|
||||
common.rm_pid_file()
|
||||
Gtk.main_quit()
|
||||
|
||||
def get_pkgs(pkgstr_list):
|
||||
get_error = ''
|
||||
for pkg in pkgs:
|
||||
if '.pkg.tar.' in pkg:
|
||||
full_path = abspath(pkg)
|
||||
transaction.to_load.add(full_path)
|
||||
elif pkg in transaction.syncpkgs.keys():
|
||||
transaction.to_add.add(pkg)
|
||||
for pkgstr in pkgstr_list:
|
||||
if '.pkg.tar.' in pkgstr:
|
||||
full_path = abspath(pkgstr)
|
||||
trans.to_load.append(full_path)
|
||||
else:
|
||||
if get_error:
|
||||
get_error += '\n'
|
||||
get_error += _('{pkgname} is not a valid path or package name').format(pkgname = pkg)
|
||||
pkg = trans.get_syncpkg(pkgstr)
|
||||
if pkg:
|
||||
trans.to_add.append(pkg)
|
||||
else:
|
||||
if get_error:
|
||||
get_error += '\n'
|
||||
get_error += _('{pkgname} is not a valid path or package name').format(pkgname = pkgstr)
|
||||
if get_error:
|
||||
main.handle_error(get_error)
|
||||
exiting(get_error)
|
||||
trans.handle_error(get_error)
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
def install(pkgs):
|
||||
if get_pkgs(pkgs):
|
||||
main.check_conflicts()
|
||||
if transaction.to_add | transaction.to_load:
|
||||
if transaction.init_transaction(noconflicts = True):
|
||||
for pkgname in transaction.to_add:
|
||||
transaction.Add(pkgname)
|
||||
for pkg_path in transaction.to_load:
|
||||
transaction.Load(pkg_path)
|
||||
for pkgname in transaction.to_remove:
|
||||
transaction.Remove(pkgname)
|
||||
_error = transaction.Prepare()
|
||||
if _error:
|
||||
main.handle_error(_error)
|
||||
exiting(_error)
|
||||
else:
|
||||
main.set_transaction_sum()
|
||||
if len(main.transaction_sum) != 0:
|
||||
main.ConfDialog.show_all()
|
||||
loop.run()
|
||||
else:
|
||||
main.WarningDialog.format_secondary_text(_('Nothing to do'))
|
||||
response = main.WarningDialog.run()
|
||||
if response:
|
||||
main.WarningDialog.hide()
|
||||
exiting('')
|
||||
else:
|
||||
main.WarningDialog.format_secondary_text(_('Nothing to do'))
|
||||
response = main.WarningDialog.run()
|
||||
if response:
|
||||
main.WarningDialog.hide()
|
||||
exiting('')
|
||||
signals = {'on_TransValidButton_clicked' : on_TransValidButton_clicked,
|
||||
'on_TransCancelButton_clicked' : on_TransCancelButton_clicked,
|
||||
'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_ProgressCancelButton_clicked' : on_ProgressCancelButton_clicked,
|
||||
'on_ProgressCloseButton_clicked' : on_ProgressCloseButton_clicked}
|
||||
|
||||
if common.pid_file_exists():
|
||||
from pamac.main import ErrorDialog
|
||||
ErrorDialog.format_secondary_text(_('Pamac is already running'))
|
||||
response = ErrorDialog.run()
|
||||
transaction.ErrorDialog.format_secondary_text(_('Pamac is already running'))
|
||||
response = transaction.ErrorDialog.run()
|
||||
if response:
|
||||
ErrorDialog.hide()
|
||||
transaction.ErrorDialog.hide()
|
||||
else:
|
||||
from pamac import transaction, main
|
||||
transaction.get_handle()
|
||||
transaction.update_db()
|
||||
do_syncfirst, updates = transaction.get_updates()
|
||||
trans = transaction.Transaction()
|
||||
do_syncfirst, updates = trans.get_updates()
|
||||
if updates:
|
||||
main.ErrorDialog.format_secondary_text(_('Some updates are available.\nPlease update your system first'))
|
||||
response = main.ErrorDialog.run()
|
||||
transaction.ErrorDialog.format_secondary_text(_('Some updates are available.\nPlease update your system first'))
|
||||
response = transaction.ErrorDialog.run()
|
||||
if response:
|
||||
main.ErrorDialog.hide()
|
||||
transaction.StopDaemon()
|
||||
transaction.ErrorDialog.hide()
|
||||
else:
|
||||
loop = GObject.MainLoop()
|
||||
main.config_signals()
|
||||
bus = dbus.SystemBus()
|
||||
bus.add_signal_receiver(exiting, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionDone")
|
||||
bus.add_signal_receiver(exiting, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionError")
|
||||
main.Handler.on_TransCancelButton_clicked = new_on_TransCancelButton_clicked
|
||||
main.Handler.on_TransValidButton_clicked = new_on_TransValidButton_clicked
|
||||
main.interface.connect_signals(main.Handler())
|
||||
pkgs_to_install = argv[1:]
|
||||
install(pkgs_to_install)
|
||||
transaction.interface.connect_signals(signals)
|
||||
args_str = argv[1:]
|
||||
if get_pkgs(args_str):
|
||||
if trans.to_add or trans.to_load:
|
||||
if trans.init(cascade = True):
|
||||
for pkg in trans.to_add:
|
||||
trans.add(pkg)
|
||||
for path in trans.to_load:
|
||||
trans.load(path)
|
||||
if trans.prepare():
|
||||
common.write_pid_file()
|
||||
trans.set_transaction_sum(True)
|
||||
transaction.ConfDialog.show()
|
||||
Gtk.main()
|
||||
|
||||
|
718
pamac-manager.py
Executable file → Normal file
718
pamac-manager.py
Executable file → Normal file
@ -1,6 +1,718 @@
|
||||
#! /usr/bin/python3
|
||||
#! /usr/bin/pkexec /usr/bin/python3
|
||||
# -*- coding:utf-8 -*-
|
||||
|
||||
from pamac import main
|
||||
version = '0.8.0'
|
||||
|
||||
main.main('manager')
|
||||
from gi.repository import Gtk, Gdk
|
||||
from gi.repository.GdkPixbuf import Pixbuf
|
||||
import pyalpm
|
||||
from time import strftime, localtime
|
||||
|
||||
from pamac import config, common, transaction
|
||||
|
||||
# i18n
|
||||
import gettext
|
||||
import locale
|
||||
locale.bindtextdomain('pamac', '/usr/share/locale')
|
||||
gettext.bindtextdomain('pamac', '/usr/share/locale')
|
||||
gettext.textdomain('pamac')
|
||||
_ = gettext.gettext
|
||||
|
||||
interface = transaction.interface
|
||||
|
||||
interface.add_from_file('/usr/share/pamac/gui/manager.ui')
|
||||
ManagerWindow = interface.get_object("ManagerWindow")
|
||||
details_list = interface.get_object('details_list')
|
||||
deps_list = interface.get_object('deps_list')
|
||||
files_list = interface.get_object('files_list')
|
||||
files_scrolledwindow = interface.get_object('files_scrolledwindow')
|
||||
name_label = interface.get_object('name_label')
|
||||
desc_label = interface.get_object('desc_label')
|
||||
link_label = interface.get_object('link_label')
|
||||
licenses_label = interface.get_object('licenses_label')
|
||||
search_entry = interface.get_object('search_entry')
|
||||
search_list = interface.get_object('search_list')
|
||||
search_selection = interface.get_object('search_treeview_selection')
|
||||
packages_list_treeview = interface.get_object('packages_list_treeview')
|
||||
state_column = interface.get_object('state_column')
|
||||
name_column = interface.get_object('name_column')
|
||||
version_column = interface.get_object('version_column')
|
||||
size_column = interface.get_object('size_column')
|
||||
state_rendererpixbuf = interface.get_object('state_rendererpixbuf')
|
||||
name_renderertext = interface.get_object('name_renderertext')
|
||||
version_renderertext = interface.get_object('version_renderertext')
|
||||
size_renderertext = interface.get_object('size_renderertext')
|
||||
list_selection = interface.get_object('list_treeview_selection')
|
||||
groups_list = interface.get_object('groups_list')
|
||||
groups_selection = interface.get_object('groups_treeview_selection')
|
||||
states_list = interface.get_object('states_list')
|
||||
states_selection = interface.get_object('states_treeview_selection')
|
||||
repos_list = interface.get_object('repos_list')
|
||||
repos_selection = interface.get_object('repos_treeview_selection')
|
||||
AboutDialog = interface.get_object('AboutDialog')
|
||||
menu_button = interface.get_object('menu_button')
|
||||
main_menu = interface.get_object('main_menu')
|
||||
PackagesChooserDialog = interface.get_object('PackagesChooserDialog')
|
||||
|
||||
AboutDialog.set_version(version)
|
||||
menu_button.set_popup(main_menu)
|
||||
|
||||
search_dict = {}
|
||||
groups_dict = {}
|
||||
states_dict = {}
|
||||
repos_dict = {}
|
||||
current_filter = (None, None)
|
||||
right_click_menu = Gtk.Menu()
|
||||
|
||||
installed_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/16x16/actions/package-installed-updated.png')
|
||||
uninstalled_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/16x16/actions/package-available.png')
|
||||
to_install_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/16x16/actions/package-install.png')
|
||||
to_reinstall_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/16x16/actions/package-reinstall.png')
|
||||
to_remove_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/16x16/actions/package-remove.png')
|
||||
locked_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/16x16/actions/package-installed-locked.png')
|
||||
|
||||
def state_column_display_func(column, cell, treemodel, treeiter, data):
|
||||
if treemodel[treeiter][0] == _('No package found'):
|
||||
pixbuf = None
|
||||
elif treemodel[treeiter][0].name in config.holdpkg:
|
||||
pixbuf = locked_icon
|
||||
elif treemodel[treeiter][0].db.name == 'local':
|
||||
if transaction.pkg_in_list(treemodel[treeiter][0], trans.to_add):
|
||||
pixbuf = to_reinstall_icon
|
||||
elif transaction.pkg_in_list(treemodel[treeiter][0], trans.to_remove):
|
||||
pixbuf = to_remove_icon
|
||||
else:
|
||||
pixbuf = installed_icon
|
||||
elif transaction.pkg_in_list(treemodel[treeiter][0], trans.to_add):
|
||||
pixbuf = to_install_icon
|
||||
else:
|
||||
pixbuf = uninstalled_icon
|
||||
cell.set_property("pixbuf", pixbuf)
|
||||
|
||||
def state_column_sort_func(treemodel, treeiter1, treeiter2, data):
|
||||
if treemodel[treeiter1][0].db.name == 'local':
|
||||
num1 = 1
|
||||
else:
|
||||
num1 = 0
|
||||
if treemodel[treeiter2][0].db.name == 'local':
|
||||
num2 = 1
|
||||
else:
|
||||
num2 = 0
|
||||
return num2 - num1
|
||||
|
||||
def name_column_display_func(column, cell, treemodel, treeiter, data):
|
||||
if treemodel[treeiter][0] == _('No package found'):
|
||||
cell.set_property("text", _('No package found'))
|
||||
else:
|
||||
cell.set_property("text", treemodel[treeiter][0].name)
|
||||
|
||||
def name_column_sort_func(treemodel, treeiter1, treeiter2, data):
|
||||
str1 = treemodel[treeiter1][0].name
|
||||
str2 = treemodel[treeiter2][0].name
|
||||
if str1 < str2:
|
||||
return -1
|
||||
elif str1 > str2:
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
|
||||
def version_column_display_func(column, cell, treemodel, treeiter, data):
|
||||
if treemodel[treeiter][0] == _('No package found'):
|
||||
cell.set_property("text", '')
|
||||
else:
|
||||
cell.set_property("text", treemodel[treeiter][0].version)
|
||||
|
||||
def version_column_sort_func(treemodel, treeiter1, treeiter2, data):
|
||||
return pyalpm.vercmp(treemodel[treeiter1][0].version, treemodel[treeiter2][0].version)
|
||||
|
||||
def size_column_display_func(column, cell, treemodel, treeiter, data):
|
||||
if treemodel[treeiter][0] == _('No package found'):
|
||||
cell.set_property("text", '')
|
||||
else:
|
||||
cell.set_property("text", common.format_size(treemodel[treeiter][0].isize))
|
||||
|
||||
def size_column_sort_func(treemodel, treeiter1, treeiter2, data):
|
||||
num1 = treemodel[treeiter1][0].isize
|
||||
num2 = treemodel[treeiter2][0].isize
|
||||
return num1 - num2
|
||||
|
||||
state_column.set_cell_data_func(state_rendererpixbuf, state_column_display_func)
|
||||
name_column.set_cell_data_func(name_renderertext, name_column_display_func)
|
||||
version_column.set_cell_data_func(version_renderertext, version_column_display_func)
|
||||
size_column.set_cell_data_func(size_renderertext, size_column_display_func)
|
||||
|
||||
def update_lists():
|
||||
for db in trans.handle.get_syncdbs():
|
||||
for name, pkgs in db.grpcache:
|
||||
groups_list.append([name])
|
||||
groups_list.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
states = [_('Installed'), _('Uninstalled'), _('Orphans'), _('To install'), _('To remove')]
|
||||
for state in states:
|
||||
states_list.append([state])
|
||||
for db in trans.syncdbs:
|
||||
repos_list.append([db.name])
|
||||
repos_list.append([_('local')])
|
||||
|
||||
def get_group_list(group):
|
||||
global groups_dict
|
||||
if group in groups_dict.keys():
|
||||
return groups_dict[group]
|
||||
else:
|
||||
groups_dict[group] = Gtk.ListStore(object)
|
||||
dbs_list = [trans.localdb]
|
||||
dbs_list.extend(trans.syncdbs.copy())
|
||||
pkgs = pyalpm.find_grp_pkgs(dbs_list, group)
|
||||
for pkg in pkgs:
|
||||
groups_dict[group].append([pkg])
|
||||
return groups_dict[group]
|
||||
|
||||
def get_state_list(state):
|
||||
global states_dict
|
||||
if state == _('To install'):
|
||||
liststore = Gtk.ListStore(object)
|
||||
for pkg in trans.to_add:
|
||||
liststore.append([pkg])
|
||||
return liststore
|
||||
elif state == _('To remove'):
|
||||
liststore = Gtk.ListStore(object)
|
||||
for pkg in trans.to_remove:
|
||||
liststore.append([pkg])
|
||||
return liststore
|
||||
elif state in states_dict.keys():
|
||||
return states_dict[state]
|
||||
else:
|
||||
states_dict[state] = Gtk.ListStore(object)
|
||||
if state == _('Installed'):
|
||||
for pkg in trans.localdb.pkgcache:
|
||||
states_dict[state].append([pkg])
|
||||
elif state == _('Uninstalled'):
|
||||
for pkg in get_uninstalled_pkgs():
|
||||
states_dict[state].append([pkg])
|
||||
elif state == _('Orphans'):
|
||||
for pkg in get_orphan_pkgs():
|
||||
states_dict[state].append([pkg])
|
||||
return states_dict[state]
|
||||
|
||||
|
||||
def get_repo_list(repo):
|
||||
global repos_dict
|
||||
if repo in repos_dict.keys():
|
||||
return repos_dict[repo]
|
||||
else:
|
||||
repos_dict[repo] = Gtk.ListStore(object)
|
||||
if repo == _('local'):
|
||||
for pkg in trans.localdb.pkgcache:
|
||||
if not trans.get_syncpkg(pkg.name):
|
||||
repos_dict[repo].append([pkg])
|
||||
else:
|
||||
for db in trans.syncdbs:
|
||||
if db.name ==repo:
|
||||
for pkg in db.pkgcache:
|
||||
local_pkg = trans.get_localpkg(pkg.name)
|
||||
if local_pkg:
|
||||
repos_dict[repo].append([local_pkg])
|
||||
else:
|
||||
repos_dict[repo].append([pkg])
|
||||
return repos_dict[repo]
|
||||
|
||||
def search_pkgs(search_string):
|
||||
global search_dict
|
||||
if search_string in search_dict.keys():
|
||||
return search_dict[search_string]
|
||||
else:
|
||||
search_dict[search_string] = Gtk.ListStore(object)
|
||||
names_list = []
|
||||
for pkg in trans.localdb.search(*search_string.split()):
|
||||
if not pkg.name in names_list:
|
||||
names_list.append(pkg.name)
|
||||
search_dict[search_string].append([pkg])
|
||||
for db in trans.syncdbs:
|
||||
for pkg in db.search(*search_string.split()):
|
||||
if not pkg.name in names_list:
|
||||
names_list.append(pkg.name)
|
||||
search_dict[search_string].append([pkg])
|
||||
if not names_list:
|
||||
search_dict[search_string].append([_('No package found')])
|
||||
else:
|
||||
if not search_string in [row[0] for row in search_list]:
|
||||
search_list.append([search_string])
|
||||
return search_dict[search_string]
|
||||
|
||||
def get_uninstalled_pkgs():
|
||||
pkgs_list = []
|
||||
names_list = []
|
||||
for repo in trans.syncdbs:
|
||||
for pkg in repo.pkgcache:
|
||||
if not pkg.name in names_list:
|
||||
names_list.append(pkg.name)
|
||||
if not trans.get_localpkg(pkg.name):
|
||||
pkgs_list.append(pkg)
|
||||
return pkgs_list
|
||||
|
||||
def get_orphan_pkgs():
|
||||
pkgs_list = []
|
||||
for pkg in trans.localdb.pkgcache:
|
||||
if pkg.reason == pyalpm.PKG_REASON_DEPEND:
|
||||
if not pkg.compute_requiredby():
|
||||
pkgs_list.append(pkg)
|
||||
return pkgs_list
|
||||
|
||||
def refresh_packages_list(liststore):
|
||||
#~ packages_list_treeview.freeze_child_notify()
|
||||
#~ packages_list_treeview.set_model(None)
|
||||
liststore.set_sort_func(0, name_column_sort_func, None)
|
||||
liststore.set_sort_column_id(0, Gtk.SortType.ASCENDING)
|
||||
packages_list_treeview.set_model(liststore)
|
||||
state_column.set_sort_indicator(False)
|
||||
name_column.set_sort_indicator(True)
|
||||
version_column.set_sort_indicator(False)
|
||||
size_column.set_sort_indicator(False)
|
||||
#~ packages_list_treeview.thaw_child_notify()
|
||||
ManagerWindow.get_window().set_cursor(None)
|
||||
|
||||
def set_infos_list(pkg):
|
||||
name_label.set_markup('<big><b>{} {}</b></big>'.format(pkg.name, pkg.version))
|
||||
# fix &,-,>,< in desc
|
||||
desc = pkg.desc.replace('&', '&')
|
||||
desc = desc.replace('<->', '/')
|
||||
desc_label.set_markup(desc)
|
||||
# fix & in url
|
||||
url = pkg.url.replace('&', '&')
|
||||
link_label.set_markup('<a href=\"{_url}\">{_url}</a>'.format(_url = url))
|
||||
licenses_label.set_markup(_('Licenses')+': {}'.format(' '.join(pkg.licenses)))
|
||||
|
||||
def set_deps_list(pkg, style):
|
||||
deps_list.clear()
|
||||
if pkg.depends:
|
||||
deps_list.append([_('Depends On')+':', '\n'.join(pkg.depends)])
|
||||
if pkg.optdepends:
|
||||
optdeps = []
|
||||
for optdep in pkg.optdepends:
|
||||
if trans.get_localpkg(optdep.split(':')[0]):
|
||||
optdeps.append(optdep+' ['+_('Installed')+']')
|
||||
else:
|
||||
optdeps.append(optdep)
|
||||
deps_list.append([_('Optional Deps')+':', '\n'.join(optdeps)])
|
||||
if style == 'local':
|
||||
if pkg.compute_requiredby():
|
||||
deps_list.append([_('Required By')+':', '\n'.join(pkg.compute_requiredby())])
|
||||
if pkg.provides:
|
||||
deps_list.append([_('Provides')+':', '\n'.join(pkg.provides)])
|
||||
if pkg.replaces:
|
||||
deps_list.append([_('Replaces')+':', '\n'.join(pkg.replaces)])
|
||||
if pkg.conflicts:
|
||||
deps_list.append([_('Conflicts With')+':', '\n'.join(pkg.conflicts)])
|
||||
|
||||
def set_details_list(pkg, style):
|
||||
details_list.clear()
|
||||
if style == 'sync':
|
||||
details_list.append([_('Repository')+':', pkg.db.name])
|
||||
if pkg.groups:
|
||||
details_list.append([_('Groups')+':', ' '.join(pkg.groups)])
|
||||
if style == 'sync':
|
||||
details_list.append([_('Compressed Size')+':', common.format_size(pkg.size)])
|
||||
details_list.append([_('Download Size')+':', common.format_size(pkg.download_size)])
|
||||
if style == 'local':
|
||||
details_list.append([_('Installed Size')+':', common.format_size(pkg.isize)])
|
||||
details_list.append([_('Packager')+':', pkg.packager])
|
||||
details_list.append([_('Architecture')+':', pkg.arch])
|
||||
#details_list.append([_('Build Date')+':', strftime("%a %d %b %Y %X %Z", localtime(pkg.builddate))])
|
||||
if style == 'local':
|
||||
details_list.append([_('Install Date')+':', strftime("%a %d %b %Y %X %Z", localtime(pkg.installdate))])
|
||||
if pkg.reason == pyalpm.PKG_REASON_EXPLICIT:
|
||||
reason = _('Explicitly installed')
|
||||
elif pkg.reason == pyalpm.PKG_REASON_DEPEND:
|
||||
reason = _('Installed as a dependency for another package')
|
||||
else:
|
||||
reason = _('Unknown')
|
||||
details_list.append([_('Install Reason')+':', reason])
|
||||
if style == 'sync':
|
||||
#details_list.append([_('Install Script')':', 'Yes' if pkg.has_scriptlet else 'No'])
|
||||
#details_list.append(['MD5 Sum:', pkg.md5sum])
|
||||
#details_list.append(['SHA256 Sum:', pkg.sha256sum])
|
||||
details_list.append([_('Signatures')+':', 'Yes' if pkg.base64_sig else 'No'])
|
||||
if style == 'local':
|
||||
if len(pkg.backup) != 0:
|
||||
#details_list.append(['_(Backup files)+':', '\n'.join(["%s %s" % (md5, file) for (file, md5) in pkg.backup])])
|
||||
details_list.append([_('Backup files')+':', '\n'.join(["%s" % (file) for (file, md5) in pkg.backup])])
|
||||
|
||||
def set_files_list(pkg):
|
||||
files_list.clear()
|
||||
if len(pkg.files) != 0:
|
||||
for file in pkg.files:
|
||||
files_list.append(['/'+file[0]])
|
||||
|
||||
def on_ManagerWindow_delete_event(*args):
|
||||
Gtk.main_quit()
|
||||
common.rm_pid_file()
|
||||
|
||||
def on_TransValidButton_clicked(*args):
|
||||
global search_dict
|
||||
global groups_dict
|
||||
global states_dict
|
||||
global repos_dict
|
||||
transaction.ConfDialog.hide()
|
||||
trans.finalize()
|
||||
trans.update_dbs()
|
||||
search_dict = {}
|
||||
groups_dict = {}
|
||||
states_dict = {}
|
||||
repos_dict = {}
|
||||
if current_filter[0]:
|
||||
refresh_packages_list(current_filter[0](current_filter[1]))
|
||||
|
||||
def on_TransCancelButton_clicked(*args):
|
||||
transaction.progress_buffer.delete(transaction.progress_buffer.get_start_iter(),transaction.progress_buffer.get_end_iter())
|
||||
transaction.ConfDialog.hide()
|
||||
trans.release()
|
||||
if current_filter[0]:
|
||||
refresh_packages_list(current_filter[0](current_filter[1]))
|
||||
|
||||
def on_ProgressCloseButton_clicked(*args):
|
||||
transaction.ProgressWindow.hide()
|
||||
transaction.progress_buffer.delete(transaction.progress_buffer.get_start_iter(),transaction.progress_buffer.get_end_iter())
|
||||
trans.do_sysupgrade(True)
|
||||
|
||||
def on_ProgressCancelButton_clicked(*args):
|
||||
trans.interrupt()
|
||||
|
||||
def on_search_entry_icon_press(*args):
|
||||
on_search_entry_activate(None)
|
||||
|
||||
def on_search_entry_activate(widget):
|
||||
global current_filter
|
||||
current_filter = (search_pkgs, search_entry.get_text())
|
||||
refresh_packages_list(search_pkgs(search_entry.get_text()))
|
||||
|
||||
def mark_to_install(widget, pkg):
|
||||
trans.to_add.append(pkg)
|
||||
|
||||
def mark_to_reinstall(widget, pkg):
|
||||
trans.to_add.append(pkg)
|
||||
|
||||
def mark_to_remove(widget, pkg):
|
||||
trans.to_remove.append(pkg)
|
||||
|
||||
def mark_to_unselect(widget, pkg):
|
||||
if pkg.db.name == 'local':
|
||||
if trans.pkg_in_list(pkg, trans.to_add):
|
||||
transaction.remove_pkg_from_list(pkg, trans.to_add)
|
||||
elif transaction.pkg_in_list(pkg, trans.to_remove):
|
||||
transaction.remove_pkg_from_list(pkg, trans.to_remove)
|
||||
else:
|
||||
if transaction.pkg_in_list(pkg, trans.to_add):
|
||||
transaction.remove_pkg_from_list(pkg, trans.to_add)
|
||||
|
||||
def select_optdeps(widget, pkg, optdeps):
|
||||
transaction.choose_only_one = False
|
||||
transaction.choose_label.set_markup(_('<b>{pkgname} has {number} uninstalled optional deps.\nPlease choose the one(s) you want to install:</b>').format(pkgname = pkg.name, number = str(len(optdeps))))
|
||||
transaction.choose_list.clear()
|
||||
transaction.choose_renderertoggle.set_radio(False)
|
||||
for long_string in optdeps:
|
||||
transaction.choose_list.append([False, long_string])
|
||||
transaction.ChooseDialog.run()
|
||||
for long_string in trans.to_provide:
|
||||
trans.to_add.append(trans.get_syncpkg(long_string.split(':')[0]))
|
||||
|
||||
def install_with_optdeps(widget, pkg, optdeps):
|
||||
select_optdeps(widget, pkg, optdeps)
|
||||
trans.to_add.append(pkg)
|
||||
|
||||
def on_list_treeview_button_press_event(treeview, event):
|
||||
global right_click_menu
|
||||
liststore = packages_list_treeview.get_model()
|
||||
# Check if right mouse button was clicked
|
||||
if event.type == Gdk.EventType.BUTTON_PRESS and event.button == 3:
|
||||
ManagerWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
treepath, viewcolumn, x, y = treeview.get_path_at_pos(int(event.x), int(event.y))
|
||||
treeiter = liststore.get_iter(treepath)
|
||||
if treeiter:
|
||||
if liststore[treeiter][0] != _('No package found') and not liststore[treeiter][0].name in config.holdpkg:
|
||||
right_click_menu = Gtk.Menu()
|
||||
if transaction.pkg_in_list(liststore[treeiter][0], trans.to_remove) or transaction.pkg_in_list(liststore[treeiter][0], trans.to_add):
|
||||
item = Gtk.ImageMenuItem(_('Unselect'))
|
||||
item.set_image(Gtk.Image.new_from_stock('gtk-undo', Gtk.IconSize.MENU))
|
||||
item.set_always_show_image(True)
|
||||
item.connect('activate', mark_to_unselect, liststore[treeiter][0])
|
||||
right_click_menu.append(item)
|
||||
elif liststore[treeiter][0].db.name == 'local':
|
||||
item = Gtk.ImageMenuItem(_('Remove'))
|
||||
item.set_image(Gtk.Image.new_from_pixbuf(to_remove_icon))
|
||||
item.set_always_show_image(True)
|
||||
item.connect('activate', mark_to_remove, liststore[treeiter][0])
|
||||
right_click_menu.append(item)
|
||||
item = Gtk.ImageMenuItem(_('Reinstall'))
|
||||
item.set_image(Gtk.Image.new_from_pixbuf(to_reinstall_icon))
|
||||
item.set_always_show_image(True)
|
||||
item.connect('activate', mark_to_reinstall, liststore[treeiter][0])
|
||||
right_click_menu.append(item)
|
||||
optdeps_strings = liststore[treeiter][0].optdepends
|
||||
if optdeps_strings:
|
||||
available_optdeps = []
|
||||
for optdep_string in optdeps_strings:
|
||||
optdep = optdep_string.split(':')[0]
|
||||
if not trans.get_localpkg(optdep):
|
||||
available_optdeps.append(optdep_string)
|
||||
if available_optdeps:
|
||||
item = Gtk.ImageMenuItem(_('Install optional deps'))
|
||||
item.set_image(Gtk.Image.new_from_pixbuf(to_install_icon))
|
||||
item.set_always_show_image(True)
|
||||
item.connect('activate', select_optdeps, liststore[treeiter][0], available_optdeps)
|
||||
right_click_menu.append(item)
|
||||
else:
|
||||
item = Gtk.ImageMenuItem(_('Install'))
|
||||
item.set_image(Gtk.Image.new_from_pixbuf(to_install_icon))
|
||||
item.set_always_show_image(True)
|
||||
item.connect('activate', mark_to_install, liststore[treeiter][0])
|
||||
right_click_menu.append(item)
|
||||
optdeps_strings = liststore[treeiter][0].optdepends
|
||||
if optdeps_strings:
|
||||
available_optdeps = []
|
||||
for optdep_string in optdeps_strings:
|
||||
optdep = optdep_string.split(':')[0]
|
||||
if not trans.get_localpkg(optdep):
|
||||
available_optdeps.append(optdep_string)
|
||||
if available_optdeps:
|
||||
item = Gtk.ImageMenuItem(_('Install with optional deps'))
|
||||
item.set_image(Gtk.Image.new_from_pixbuf(to_install_icon))
|
||||
item.set_always_show_image(True)
|
||||
item.connect('activate', install_with_optdeps, liststore[treeiter][0], available_optdeps)
|
||||
right_click_menu.append(item)
|
||||
treeview.grab_focus()
|
||||
treeview.set_cursor(treepath, viewcolumn, 0)
|
||||
ManagerWindow.get_window().set_cursor(None)
|
||||
right_click_menu.show_all()
|
||||
right_click_menu.popup(None, None, None, None, event.button, event.time)
|
||||
return True
|
||||
|
||||
def on_list_treeview_selection_changed(treeview):
|
||||
liststore, treeiter = list_selection.get_selected()
|
||||
if treeiter:
|
||||
if liststore[treeiter][0] != _('No package found'):
|
||||
set_infos_list(liststore[treeiter][0])
|
||||
if liststore[treeiter][0].db.name == 'local':
|
||||
set_deps_list(liststore[treeiter][0], "local")
|
||||
set_details_list(liststore[treeiter][0], "local")
|
||||
set_files_list(liststore[treeiter][0])
|
||||
files_scrolledwindow.set_visible(True)
|
||||
else:
|
||||
set_deps_list(liststore[treeiter][0], "sync")
|
||||
set_details_list(liststore[treeiter][0], "sync")
|
||||
files_scrolledwindow.set_visible(False)
|
||||
|
||||
def on_search_treeview_selection_changed(widget):
|
||||
global current_filter
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
liste, line = search_selection.get_selected()
|
||||
if line:
|
||||
ManagerWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
current_filter = (search_pkgs, search_list[line][0])
|
||||
refresh_packages_list(search_pkgs(search_list[line][0]))
|
||||
|
||||
def on_groups_treeview_selection_changed(widget):
|
||||
global current_filter
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
liste, line = groups_selection.get_selected()
|
||||
if line:
|
||||
ManagerWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
current_filter = (get_group_list, groups_list[line][0])
|
||||
refresh_packages_list(get_group_list(groups_list[line][0]))
|
||||
|
||||
def on_states_treeview_selection_changed(widget):
|
||||
global current_filter
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
liste, line = states_selection.get_selected()
|
||||
if line:
|
||||
ManagerWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
current_filter = (get_state_list, states_list[line][0])
|
||||
refresh_packages_list(get_state_list(states_list[line][0]))
|
||||
|
||||
def on_repos_treeview_selection_changed(widget):
|
||||
global current_filter
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
liste, line = repos_selection.get_selected()
|
||||
if line:
|
||||
ManagerWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
current_filter = (get_repo_list, repos_list[line][0])
|
||||
refresh_packages_list(get_repo_list(repos_list[line][0]))
|
||||
|
||||
def on_list_treeview_row_activated(treeview, treeiter, column):
|
||||
liststore = treeview.get_model()
|
||||
if not liststore[treeiter][0] == _('No package found'):
|
||||
if not liststore[treeiter][0].name in config.holdpkg:
|
||||
if liststore[treeiter][0].db.name == 'local':
|
||||
if transaction.pkg_in_list(liststore[treeiter][0], trans.to_add):
|
||||
transaction.remove_pkg_from_list(liststore[treeiter][0], trans.to_add)
|
||||
elif transaction.pkg_in_list(liststore[treeiter][0], trans.to_remove):
|
||||
transaction.remove_pkg_from_list(liststore[treeiter][0], trans.to_remove)
|
||||
else:
|
||||
trans.to_remove.append(liststore[treeiter][0])
|
||||
else:
|
||||
if transaction.pkg_in_list(liststore[treeiter][0], trans.to_add):
|
||||
transaction.remove_pkg_from_list(liststore[treeiter][0], trans.to_add)
|
||||
else:
|
||||
trans.to_add.append(liststore[treeiter][0])
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
|
||||
def on_notebook1_switch_page(notebook, page, page_num):
|
||||
ManagerWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
if page_num == 0:
|
||||
liste, line = search_selection.get_selected()
|
||||
if line:
|
||||
on_search_treeview_selection_changed(None)
|
||||
elif search_entry.get_text():
|
||||
on_search_entry_activate(None)
|
||||
elif page_num == 1:
|
||||
on_groups_treeview_selection_changed(None)
|
||||
elif page_num == 2:
|
||||
on_states_treeview_selection_changed(None)
|
||||
elif page_num == 3:
|
||||
on_repos_treeview_selection_changed(None)
|
||||
|
||||
def on_manager_valid_button_clicked(*args):
|
||||
trans.run()
|
||||
|
||||
def on_manager_cancel_button_clicked(*args):
|
||||
trans.to_add.clear()
|
||||
trans.to_remove.clear()
|
||||
if current_filter[0]:
|
||||
refresh_packages_list(current_filter[0](current_filter[1]))
|
||||
|
||||
def on_refresh_item_activate(*args):
|
||||
global search_dict
|
||||
global groups_dict
|
||||
global states_dict
|
||||
global repos_dict
|
||||
trans.refresh(False)
|
||||
transaction.ProgressWindow.hide()
|
||||
search_dict = {}
|
||||
groups_dict = {}
|
||||
states_dict = {}
|
||||
repos_dict = {}
|
||||
if current_filter[0]:
|
||||
refresh_packages_list(current_filter[0](current_filter[1]))
|
||||
trans.do_sysupgrade(True)
|
||||
|
||||
def on_local_item_activate(*args):
|
||||
response = PackagesChooserDialog.run()
|
||||
if response:
|
||||
PackagesChooserDialog.hide()
|
||||
|
||||
def on_about_item_activate(*args):
|
||||
response = AboutDialog.run()
|
||||
if response:
|
||||
AboutDialog.hide()
|
||||
|
||||
def on_package_open_button_clicked(*args):
|
||||
packages_paths = PackagesChooserDialog.get_filenames()
|
||||
print(packages_paths)
|
||||
if packages_paths:
|
||||
PackagesChooserDialog.hide()
|
||||
for path in packages_paths:
|
||||
trans.to_load.append(path)
|
||||
trans.run()
|
||||
|
||||
def on_PackagesChooserDialog_file_activated(*args):
|
||||
on_package_open_button_clicked(*args)
|
||||
|
||||
def on_package_cancel_button_clicked(*args):
|
||||
PackagesChooserDialog.hide()
|
||||
|
||||
def on_state_column_clicked(column):
|
||||
liststore = packages_list_treeview.get_model()
|
||||
state_column.set_sort_indicator(True)
|
||||
name_column.set_sort_indicator(False)
|
||||
version_column.set_sort_indicator(False)
|
||||
size_column.set_sort_indicator(False)
|
||||
liststore.set_sort_func(0, state_column_sort_func, None)
|
||||
|
||||
def on_name_column_clicked(column):
|
||||
liststore = packages_list_treeview.get_model()
|
||||
state_column.set_sort_indicator(False)
|
||||
name_column.set_sort_indicator(True)
|
||||
version_column.set_sort_indicator(False)
|
||||
size_column.set_sort_indicator(False)
|
||||
liststore.set_sort_func(0, name_column_sort_func, None)
|
||||
|
||||
def on_version_column_clicked(column):
|
||||
liststore = packages_list_treeview.get_model()
|
||||
state_column.set_sort_indicator(False)
|
||||
name_column.set_sort_indicator(False)
|
||||
version_column.set_sort_indicator(True)
|
||||
size_column.set_sort_indicator(False)
|
||||
liststore.set_sort_func(0, version_column_sort_func, None)
|
||||
|
||||
def on_size_column_clicked(column):
|
||||
liststore = packages_list_treeview.get_model()
|
||||
state_column.set_sort_indicator(False)
|
||||
name_column.set_sort_indicator(False)
|
||||
version_column.set_sort_indicator(False)
|
||||
size_column.set_sort_indicator(True)
|
||||
liststore.set_sort_func(0, size_column_sort_func, None)
|
||||
|
||||
signals = {'on_ManagerWindow_delete_event' : on_ManagerWindow_delete_event,
|
||||
'on_TransValidButton_clicked' : on_TransValidButton_clicked,
|
||||
'on_TransCancelButton_clicked' : on_TransCancelButton_clicked,
|
||||
'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_ProgressCancelButton_clicked' : on_ProgressCancelButton_clicked,
|
||||
'on_ProgressCloseButton_clicked' : on_ProgressCloseButton_clicked,
|
||||
'on_search_entry_icon_press' : on_search_entry_icon_press,
|
||||
'on_search_entry_activate' : on_search_entry_activate,
|
||||
'on_list_treeview_button_press_event' : on_list_treeview_button_press_event,
|
||||
'on_list_treeview_selection_changed' : on_list_treeview_selection_changed,
|
||||
'on_search_treeview_selection_changed' : on_search_treeview_selection_changed,
|
||||
'on_groups_treeview_selection_changed' : on_groups_treeview_selection_changed,
|
||||
'on_states_treeview_selection_changed' : on_states_treeview_selection_changed,
|
||||
'on_repos_treeview_selection_changed' : on_repos_treeview_selection_changed,
|
||||
'on_list_treeview_row_activated' : on_list_treeview_row_activated,
|
||||
'on_notebook1_switch_page' : on_notebook1_switch_page,
|
||||
'on_manager_valid_button_clicked' : on_manager_valid_button_clicked,
|
||||
'on_manager_cancel_button_clicked' : on_manager_cancel_button_clicked,
|
||||
'on_refresh_item_activate' : on_refresh_item_activate,
|
||||
'on_local_item_activate' : on_local_item_activate,
|
||||
'on_about_item_activate' : on_about_item_activate,
|
||||
'on_package_open_button_clicked' : on_package_open_button_clicked,
|
||||
'on_package_cancel_button_clicked' : on_package_cancel_button_clicked,
|
||||
'on_PackagesChooserDialog_file_activated' : on_PackagesChooserDialog_file_activated,
|
||||
'on_state_column_clicked' : on_state_column_clicked,
|
||||
'on_name_column_clicked' : on_name_column_clicked,
|
||||
'on_version_column_clicked' : on_version_column_clicked,
|
||||
'on_size_column_clicked' : on_size_column_clicked}
|
||||
|
||||
if common.pid_file_exists():
|
||||
transaction.ErrorDialog.format_secondary_text(_('Pamac is already running'))
|
||||
response = transaction.ErrorDialog.run()
|
||||
if response:
|
||||
transaction.ErrorDialog.hide()
|
||||
else:
|
||||
common.write_pid_file()
|
||||
interface.connect_signals(signals)
|
||||
ManagerWindow.show_all()
|
||||
trans = transaction.Transaction()
|
||||
ManagerWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
trans.refresh(False)
|
||||
update_lists()
|
||||
trans.do_sysupgrade(True)
|
||||
ManagerWindow.get_window().set_cursor(None)
|
||||
Gtk.main()
|
||||
|
45
pamac-refresh.py
Executable file → Normal file
45
pamac-refresh.py
Executable file → Normal file
@ -1,31 +1,22 @@
|
||||
#! /usr/bin/python3
|
||||
#! /usr/bin/pkexec /usr/bin/python3
|
||||
# -*- coding:utf-8 -*-
|
||||
|
||||
from gi.repository import GObject
|
||||
from pamac import common
|
||||
import dbus
|
||||
|
||||
def reply(reply):
|
||||
transaction.StopDaemon()
|
||||
print('check updates done')
|
||||
loop.quit()
|
||||
|
||||
def error(error):
|
||||
transaction.StopDaemon()
|
||||
print('check updates failed')
|
||||
loop.quit()
|
||||
|
||||
loop = GObject.MainLoop()
|
||||
from pamac import common, config
|
||||
|
||||
if not common.pid_file_exists():
|
||||
print('checking updates')
|
||||
from pamac import transaction
|
||||
bus = dbus.SystemBus()
|
||||
bus.add_signal_receiver(reply, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionDone")
|
||||
bus.add_signal_receiver(error, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionError")
|
||||
try:
|
||||
transaction.Refresh()
|
||||
except:
|
||||
pass
|
||||
else:
|
||||
loop.run()
|
||||
print('refreshing')
|
||||
handle = config.handle()
|
||||
for db in handle.get_syncdbs():
|
||||
try:
|
||||
t = handle.init_transaction()
|
||||
db.update(force = False)
|
||||
t.release()
|
||||
except:
|
||||
try:
|
||||
t.release()
|
||||
except:
|
||||
pass
|
||||
print('refreshing {} failed'.format(db.name))
|
||||
break
|
||||
else:
|
||||
print('refreshing {} succeeded'.format(db.name))
|
||||
|
80
pamac-tray.py
Executable file → Normal file
80
pamac-tray.py
Executable file → Normal file
@ -2,11 +2,12 @@
|
||||
# -*- coding:utf-8 -*-
|
||||
|
||||
from gi.repository import Gtk, GObject
|
||||
from subprocess import Popen
|
||||
import dbus
|
||||
import threading
|
||||
from pamac import common
|
||||
from subprocess import call
|
||||
from time import sleep
|
||||
import threading
|
||||
from pamac import common, transaction
|
||||
|
||||
GObject.threads_init()
|
||||
|
||||
# i18n
|
||||
import gettext
|
||||
@ -14,8 +15,6 @@ gettext.bindtextdomain('pamac', '/usr/share/locale')
|
||||
gettext.textdomain('pamac')
|
||||
_ = gettext.gettext
|
||||
|
||||
GObject.threads_init()
|
||||
|
||||
update_icon = '/usr/share/pamac/icons/24x24/status/pamac-update.png'
|
||||
update_info = _('{number} available updates')
|
||||
one_update_info = _('1 available update')
|
||||
@ -27,6 +26,7 @@ info = noupdate_info
|
||||
class Tray:
|
||||
def __init__(self):
|
||||
self.statusIcon = Gtk.StatusIcon()
|
||||
self.statusIcon.set_visible(True)
|
||||
|
||||
self.menu = Gtk.Menu()
|
||||
self.menuItem = Gtk.ImageMenuItem(_('Update Manager'))
|
||||
@ -46,13 +46,14 @@ class Tray:
|
||||
self.statusIcon.connect('activate', self.activate_cb)
|
||||
|
||||
def execute_update(self, widget, event, data = None):
|
||||
Popen(['/usr/bin/pamac-updater'])
|
||||
call(['/usr/bin/pamac-updater'])
|
||||
|
||||
def execute_manager(self, widget, event, data = None):
|
||||
Popen(['/usr/bin/pamac-manager'])
|
||||
call(['/usr/bin/pamac-manager'])
|
||||
|
||||
def quit_tray(self, widget, data = None):
|
||||
t.shutdown()
|
||||
t1.shutdown()
|
||||
t2.shutdown()
|
||||
Gtk.main_quit()
|
||||
|
||||
def popup_menu_cb(self, widget, button, time, data = None):
|
||||
@ -63,16 +64,16 @@ class Tray:
|
||||
|
||||
def activate_cb(self, widget, data = None):
|
||||
if icon == update_icon:
|
||||
Popen(['/usr/bin/pamac-updater'])
|
||||
call(['/usr/bin/pamac-updater'])
|
||||
|
||||
def update_icon(self, icon, info):
|
||||
self.statusIcon.set_from_file(icon)
|
||||
self.statusIcon.set_tooltip_markup(info)
|
||||
GObject.idle_add(self.statusIcon.set_from_file, icon)
|
||||
GObject.idle_add(self.statusIcon.set_tooltip_markup, info)
|
||||
|
||||
def set_visible(self, boolean):
|
||||
self.statusIcon.set_visible(boolean)
|
||||
|
||||
class PeriodicTask(threading.Thread):
|
||||
class PeriodicRefresh(threading.Thread):
|
||||
"""Thread that executes a task every N seconds"""
|
||||
def __init__(self):
|
||||
threading.Thread.__init__(self)
|
||||
@ -88,15 +89,41 @@ class PeriodicTask(threading.Thread):
|
||||
self._finished.set()
|
||||
|
||||
def run(self):
|
||||
while 1:
|
||||
while True:
|
||||
if self._finished.isSet():
|
||||
return
|
||||
self.task()
|
||||
# sleep for interval or until shutdown
|
||||
call(['/usr/bin/pamac-refresh'])
|
||||
self._finished.wait(self._interval)
|
||||
|
||||
def task(self):
|
||||
Popen(['/usr/bin/pamac-refresh'])
|
||||
class PeriodicCheck(threading.Thread):
|
||||
"""Thread that executes a task every N seconds"""
|
||||
def __init__(self):
|
||||
threading.Thread.__init__(self)
|
||||
self._finished = threading.Event()
|
||||
self._interval = 1
|
||||
self.trans = transaction.Transaction()
|
||||
|
||||
def setInterval(self, interval):
|
||||
"""Set the number of seconds we sleep between executing our task"""
|
||||
self._interval = interval
|
||||
|
||||
def shutdown(self):
|
||||
"""Stop this thread"""
|
||||
self._finished.set()
|
||||
|
||||
def run(self):
|
||||
pid_file = True
|
||||
while True:
|
||||
if self._finished.isSet():
|
||||
return
|
||||
if common.pid_file_exists():
|
||||
pid_file = True
|
||||
elif pid_file:
|
||||
self.trans.update_dbs()
|
||||
set_icon(len(self.trans.get_updates()[1]))
|
||||
pid_file = False
|
||||
else:
|
||||
self._finished.wait(self._interval)
|
||||
|
||||
def set_icon(updates):
|
||||
global icon
|
||||
@ -107,23 +134,18 @@ def set_icon(updates):
|
||||
info = one_update_info
|
||||
else:
|
||||
info = update_info.format(number = updates)
|
||||
tray.set_visible(True)
|
||||
sleep(2)
|
||||
if not common.pid_file_exists():
|
||||
Popen(['notify-send', '-i', '/usr/share/pamac/icons/32x32/apps/pamac-updater.png', '-u', 'normal', _('Update Manager'), info])
|
||||
call(['notify-send', '-i', '/usr/share/pamac/icons/32x32/apps/pamac-updater.png', '-u', 'normal', _('Update Manager'), info])
|
||||
else:
|
||||
icon = noupdate_icon
|
||||
info = noupdate_info
|
||||
tray.set_visible(True)
|
||||
print(info)
|
||||
tray.update_icon(icon, info)
|
||||
|
||||
from pamac import transaction
|
||||
bus = dbus.SystemBus()
|
||||
bus.add_signal_receiver(set_icon, dbus_interface = "org.manjaro.pamac", signal_name = "EmitAvailableUpdates")
|
||||
transaction.StopDaemon()
|
||||
return False
|
||||
|
||||
tray = Tray()
|
||||
t = PeriodicTask()
|
||||
t.start()
|
||||
t1 = PeriodicRefresh()
|
||||
t1.start()
|
||||
t2 = PeriodicCheck()
|
||||
t2.start()
|
||||
Gtk.main()
|
||||
|
112
pamac-updater.py
Executable file → Normal file
112
pamac-updater.py
Executable file → Normal file
@ -1,6 +1,112 @@
|
||||
#! /usr/bin/python3
|
||||
#! /usr/bin/pkexec /usr/bin/python3
|
||||
# -*- coding:utf-8 -*-
|
||||
|
||||
from pamac import main
|
||||
from gi.repository import Gtk, Gdk
|
||||
import pyalpm
|
||||
|
||||
main.main('updater')
|
||||
from pamac import config, common, transaction
|
||||
|
||||
# i18n
|
||||
import gettext
|
||||
import locale
|
||||
locale.bindtextdomain('pamac', '/usr/share/locale')
|
||||
gettext.bindtextdomain('pamac', '/usr/share/locale')
|
||||
gettext.textdomain('pamac')
|
||||
_ = gettext.gettext
|
||||
|
||||
interface = transaction.interface
|
||||
|
||||
interface.add_from_file('/usr/share/pamac/gui/updater.ui')
|
||||
UpdaterWindow = interface.get_object("UpdaterWindow")
|
||||
update_listore = interface.get_object('update_list')
|
||||
update_top_label = interface.get_object('update_top_label')
|
||||
update_bottom_label = interface.get_object('update_bottom_label')
|
||||
|
||||
update_top_label.set_markup(_('<big><b>Your system is up-to-date</b></big>'))
|
||||
update_bottom_label.set_markup('')
|
||||
|
||||
def have_updates():
|
||||
do_syncfirst, updates = trans.get_updates()
|
||||
update_listore.clear()
|
||||
update_top_label.set_justify(Gtk.Justification.CENTER)
|
||||
if not updates:
|
||||
update_bottom_label.set_markup('')
|
||||
update_top_label.set_markup(_('<big><b>Your system is up-to-date</b></big>'))
|
||||
else:
|
||||
dsize = 0
|
||||
for pkg in updates:
|
||||
pkgname = pkg.name+' '+pkg.version
|
||||
update_listore.append([pkgname, common.format_size(pkg.size)])
|
||||
dsize += pkg.download_size
|
||||
if dsize == 0:
|
||||
update_bottom_label.set_markup('')
|
||||
else:
|
||||
update_bottom_label.set_markup(_('<b>Total download size: </b>')+common.format_size(dsize))
|
||||
if len(updates) == 1:
|
||||
update_top_label.set_markup(_('<big><b>1 available update</b></big>'))
|
||||
else:
|
||||
update_top_label.set_markup(_('<big><b>{number} available updates</b></big>').format(number = len(updates)))
|
||||
|
||||
def on_TransValidButton_clicked(*arg):
|
||||
transaction.ConfDialog.hide()
|
||||
trans.finalize()
|
||||
|
||||
def on_TransCancelButton_clicked(*arg):
|
||||
transaction.progress_buffer.delete(transaction.progress_buffer.get_start_iter(),transaction.progress_buffer.get_end_iter())
|
||||
transaction.ConfDialog.hide()
|
||||
trans.release()
|
||||
|
||||
def on_ProgressCloseButton_clicked(*arg):
|
||||
transaction.ProgressWindow.hide()
|
||||
transaction.progress_buffer.delete(transaction.progress_buffer.get_start_iter(),transaction.progress_buffer.get_end_iter())
|
||||
have_updates()
|
||||
|
||||
def on_ProgressCancelButton_clicked(*args):
|
||||
trans.interrupt()
|
||||
|
||||
def on_UpdaterWindow_delete_event(*arg):
|
||||
Gtk.main_quit()
|
||||
common.rm_pid_file()
|
||||
|
||||
def on_Updater_ApplyButton_clicked(*arg):
|
||||
UpdaterWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
trans.do_sysupgrade(False)
|
||||
UpdaterWindow.get_window().set_cursor(None)
|
||||
|
||||
def on_Updater_RefreshButton_clicked(*arg):
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
UpdaterWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
trans.refresh(False)
|
||||
UpdaterWindow.get_window().set_cursor(None)
|
||||
|
||||
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_TransValidButton_clicked' :on_TransValidButton_clicked,
|
||||
'on_TransCancelButton_clicked' :on_TransCancelButton_clicked,
|
||||
'on_ProgressCloseButton_clicked' : on_ProgressCloseButton_clicked,
|
||||
'on_ProgressCancelButton_clicked' : on_ProgressCancelButton_clicked,
|
||||
'on_UpdaterWindow_delete_event' : on_UpdaterWindow_delete_event,
|
||||
'on_Updater_ApplyButton_clicked' : on_Updater_ApplyButton_clicked,
|
||||
'on_Updater_RefreshButton_clicked' : on_Updater_RefreshButton_clicked}
|
||||
|
||||
if common.pid_file_exists():
|
||||
transaction.ErrorDialog.format_secondary_text(_('Pamac is already running'))
|
||||
response = transaction.ErrorDialog.run()
|
||||
if response:
|
||||
transaction.ErrorDialog.hide()
|
||||
else:
|
||||
common.write_pid_file()
|
||||
interface.connect_signals(signals)
|
||||
UpdaterWindow.show_all()
|
||||
trans = transaction.Transaction()
|
||||
UpdaterWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
trans.refresh(False)
|
||||
have_updates()
|
||||
UpdaterWindow.get_window().set_cursor(None)
|
||||
Gtk.main()
|
||||
|
596
pamac.pot
596
pamac.pot
@ -20,312 +20,206 @@ msgstr ""
|
||||
msgid "Authentication is required"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:29 pamac/main.py:503
|
||||
msgid "Preparing"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:68
|
||||
msgid "Checking dependencies"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:75
|
||||
msgid "Checking file conflicts"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:78
|
||||
msgid "Resolving dependencies"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:85
|
||||
msgid "Checking inter conflicts"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:88 pamac/main.py:51
|
||||
msgid "Installing"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:95 pamac/main.py:51
|
||||
msgid "Removing"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:102 pamac/main.py:51
|
||||
msgid "Upgrading"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:109 pamac/main.py:51
|
||||
msgid "Downgrading"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:117 pamac/main.py:51
|
||||
msgid "Reinstalling"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:125
|
||||
msgid "Checking integrity"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:129
|
||||
msgid "Loading packages files"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:133 pamac/main.py:51
|
||||
msgid "Configuring"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:140
|
||||
msgid "Checking keys in keyring"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:198
|
||||
msgid "Downloading {size}"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:203 pamac/main.py:437 pamac/main.py:1126
|
||||
msgid "Refreshing"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:371 pamac-install.py:44 pamac/main.py:531
|
||||
msgid "{pkgname} is not a valid path or package name"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:438
|
||||
msgid "Transaction successfully finished"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-daemon.py:442 pamac-daemon.py:450
|
||||
msgid "Authentication failed"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-tray.py:22
|
||||
msgid "{number} available updates"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-tray.py:23
|
||||
msgid "1 available update"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-tray.py:25
|
||||
msgid "Your system is up-to-date"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-tray.py:113 gui/updater.glade:7
|
||||
msgid "Update Manager"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-install.py:73 pamac-install.py:79 pamac/main.py:915
|
||||
msgid "Nothing to do"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-install.py:87 pamac/main.py:1177
|
||||
msgid "Pamac is already running"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-install.py:97
|
||||
msgid ""
|
||||
"Some updates are available.\n"
|
||||
"Please update your system first"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:88 pamac/main.py:1083
|
||||
msgid "local"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:178 pamac/main.py:973 pamac/main.py:1034
|
||||
#: pamac-manager.py:75 pamac-manager.py:104 pamac-manager.py:105
|
||||
#: pamac-manager.py:120 pamac-manager.py:129 pamac-manager.py:235
|
||||
#: pamac-manager.py:432 pamac-manager.py:493 pamac-manager.py:555
|
||||
msgid "No package found"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:229
|
||||
msgid "Licenses"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:234
|
||||
msgid "Depends On"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:239 pamac/main.py:1066 pamac/main.py:1251
|
||||
#: pamac-manager.py:149 pamac-manager.py:185 pamac-manager.py:292
|
||||
msgid "Installed"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:242
|
||||
msgid "Optional Deps"
|
||||
#: pamac-manager.py:149 pamac-manager.py:188
|
||||
msgid "Uninstalled"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:245
|
||||
msgid "Required By"
|
||||
#: pamac-manager.py:149 pamac-manager.py:191
|
||||
msgid "Orphans"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:247
|
||||
msgid "Provides"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:249
|
||||
msgid "Replaces"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:251
|
||||
msgid "Conflicts With"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:256
|
||||
msgid "Repository"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:258 gui/manager.glade:384
|
||||
msgid "Groups"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:260
|
||||
msgid "Compressed Size"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:261
|
||||
msgid "Download Size"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:263
|
||||
msgid "Installed Size"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:264
|
||||
msgid "Packager"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:265
|
||||
msgid "Architecture"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:268
|
||||
msgid "Install Date"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:270
|
||||
msgid "Explicitly installed"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:272
|
||||
msgid "Installed as a dependency for another package"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:274
|
||||
msgid "Unknown"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:275
|
||||
msgid "Install Reason"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:280
|
||||
msgid "Signatures"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:284
|
||||
msgid "Backup files"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:324
|
||||
msgid "<big><b>Transaction Summary</b></big>"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:326 pamac/main.py:1072 pamac/main.py:1251
|
||||
#: pamac-manager.py:149 pamac-manager.py:171 pamac/transaction.py:668
|
||||
msgid "To install"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:332
|
||||
msgid "To reinstall"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:338
|
||||
msgid "To downgrade"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:344 pamac/main.py:1074 pamac/main.py:1251
|
||||
#: pamac-manager.py:149 pamac-manager.py:176 pamac/transaction.py:660
|
||||
msgid "To remove"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:351
|
||||
msgid "To update"
|
||||
#: pamac-manager.py:154 pamac-manager.py:203
|
||||
msgid "local"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:362 pamac/main.py:459
|
||||
msgid "<b>Total download size: </b>"
|
||||
#: pamac-manager.py:282
|
||||
msgid "Licenses"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:452 pamac/main.py:1263
|
||||
msgid "<big><b>Your system is up-to-date</b></big>"
|
||||
#: pamac-manager.py:287
|
||||
msgid "Depends On"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:461
|
||||
msgid "<big><b>1 available update</b></big>"
|
||||
#: pamac-manager.py:295
|
||||
msgid "Optional Deps"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:463
|
||||
msgid "<big><b>{number} available updates</b></big>"
|
||||
#: pamac-manager.py:298
|
||||
msgid "Required By"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:549 pamac/main.py:550
|
||||
msgid ""
|
||||
"The transaction cannot be performed because it needs to remove {pkgname1} "
|
||||
"which is a locked package"
|
||||
#: pamac-manager.py:300
|
||||
msgid "Provides"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:585 pamac/main.py:586 pamac/main.py:697 pamac/main.py:698
|
||||
msgid "{pkgname1} will be replaced by {pkgname2}"
|
||||
#: pamac-manager.py:302
|
||||
msgid "Replaces"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:714 pamac/main.py:715 pamac/main.py:739 pamac/main.py:740
|
||||
#: pamac/main.py:760 pamac/main.py:761 pamac/main.py:791 pamac/main.py:792
|
||||
#: pamac/main.py:816 pamac/main.py:817 pamac/main.py:837 pamac/main.py:838
|
||||
msgid "{pkgname1} conflicts with {pkgname2}"
|
||||
#: pamac-manager.py:304
|
||||
msgid "Conflicts With"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:772 pamac/main.py:773
|
||||
msgid ""
|
||||
"{pkgname1} conflicts with {pkgname2}\n"
|
||||
"None of them will be installed"
|
||||
#: pamac-manager.py:309
|
||||
msgid "Repository"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:874
|
||||
msgid ""
|
||||
"<b>{pkgname} is provided by {number} packages.\n"
|
||||
"Please choose the one(s) you want to install:</b>"
|
||||
#: pamac-manager.py:311 gui/manager.ui:237
|
||||
msgid "Groups"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:957
|
||||
#: pamac-manager.py:313
|
||||
msgid "Compressed Size"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-manager.py:314
|
||||
msgid "Download Size"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-manager.py:316
|
||||
msgid "Installed Size"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-manager.py:317
|
||||
msgid "Packager"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-manager.py:318
|
||||
msgid "Architecture"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-manager.py:321
|
||||
msgid "Install Date"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-manager.py:323
|
||||
msgid "Explicitly installed"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-manager.py:325
|
||||
msgid "Installed as a dependency for another package"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-manager.py:327
|
||||
msgid "Unknown"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-manager.py:328
|
||||
msgid "Install Reason"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-manager.py:333
|
||||
msgid "Signatures"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-manager.py:337
|
||||
msgid "Backup files"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-manager.py:408
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"<b>{pkgname} has {number} uninstalled optional deps.\n"
|
||||
"Please choose the one(s) you want to install:</b>"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:976
|
||||
#: pamac-manager.py:435
|
||||
msgid "Unselect"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:982
|
||||
#: pamac-manager.py:441
|
||||
msgid "Remove"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:987
|
||||
#: pamac-manager.py:446
|
||||
msgid "Reinstall"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:1000
|
||||
#: pamac-manager.py:459
|
||||
msgid "Install optional deps"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:1006
|
||||
#: pamac-manager.py:465
|
||||
msgid "Install"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:1019
|
||||
#: pamac-manager.py:478
|
||||
msgid "Install with optional deps"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:1068 pamac/main.py:1251
|
||||
msgid "Uninstalled"
|
||||
#: pamac-manager.py:702 pamac-updater.py:97 pamac-install.py:71
|
||||
msgid "Pamac is already running"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/main.py:1070 pamac/main.py:1251
|
||||
msgid "Orphans"
|
||||
#: pamac-updater.py:25 pamac-updater.py:34
|
||||
msgid "<big><b>Your system is up-to-date</b></big>"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-updater.py:44 pamac/transaction.py:655
|
||||
msgid "<b>Total download size: </b>"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-updater.py:46
|
||||
msgid "<big><b>1 available update</b></big>"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-updater.py:48
|
||||
#, python-brace-format
|
||||
msgid "<big><b>{number} available updates</b></big>"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-tray.py:19
|
||||
#, python-brace-format
|
||||
msgid "{number} available updates"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-tray.py:20
|
||||
msgid "1 available update"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-tray.py:22
|
||||
msgid "Your system is up-to-date"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-tray.py:32 pamac-tray.py:138 gui/updater.ui:7
|
||||
msgid "Update Manager"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-tray.py:36 gui/manager.ui:41
|
||||
msgid "Package Manager"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-tray.py:40
|
||||
msgid "Quit"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-install.py:55 pamac/transaction.py:559
|
||||
#, python-brace-format
|
||||
msgid "{pkgname} is not a valid path or package name"
|
||||
msgstr ""
|
||||
|
||||
#: pamac-install.py:79
|
||||
msgid ""
|
||||
"Some updates are available.\n"
|
||||
"Please update your system first"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/common.py:13
|
||||
@ -338,58 +232,236 @@ msgstr ""
|
||||
msgid "%.2f MiB"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.glade:6
|
||||
msgid "Choose"
|
||||
#: pamac/transaction.py:50
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"<b>{pkgname} is provided by {number} packages.\n"
|
||||
"Please choose the one you want to install:</b>"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.glade:109
|
||||
msgid "Summary"
|
||||
#: pamac/transaction.py:174
|
||||
msgid "Checking dependencies"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.glade:250
|
||||
msgid "Package Manager"
|
||||
#: pamac/transaction.py:182
|
||||
msgid "Checking file conflicts"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.glade:338
|
||||
#: pamac/transaction.py:188
|
||||
msgid "Resolving dependencies"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:194
|
||||
msgid "Checking inter conflicts"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:202
|
||||
#, python-brace-format
|
||||
msgid "Installing {pkgname}"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:211
|
||||
#, python-brace-format
|
||||
msgid "Removing {pkgname}"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:220
|
||||
#, python-brace-format
|
||||
msgid "Upgrading {pkgname}"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:229
|
||||
#, python-brace-format
|
||||
msgid "Downgrading {pkgname}"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:238
|
||||
#, python-brace-format
|
||||
msgid "Reinstalling {pkgname}"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:247
|
||||
msgid "Checking integrity"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:254
|
||||
msgid "Loading packages files"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:260
|
||||
msgid "Checking delta integrity"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:266
|
||||
msgid "Applying deltas"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:272
|
||||
msgid "Generating {} with {}"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:276
|
||||
msgid "Generation succeeded!"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:279
|
||||
msgid "Generation failed."
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:282
|
||||
#, python-brace-format
|
||||
msgid "Configuring {pkgname}"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:291
|
||||
msgid "Checking available disk space"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:301
|
||||
msgid "Checking keyring"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:308
|
||||
msgid "Downloading required keys"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:331
|
||||
#, python-brace-format
|
||||
msgid "{pkgname1} will replace by {pkgname2}\n"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:334
|
||||
#, python-brace-format
|
||||
msgid "{pkgname1} conflicts with {pkgname2}\n"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:383
|
||||
#, python-brace-format
|
||||
msgid "Refreshing {repo}"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:387
|
||||
#, python-brace-format
|
||||
msgid "Downloading {pkgname}"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:443
|
||||
msgid "Refreshing"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:581
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"The transaction cannot be performed because it needs to remove {pkgname1} "
|
||||
"which is a locked package"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:600 pamac/transaction.py:603
|
||||
msgid "Transaction successfully finished"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:622
|
||||
msgid ""
|
||||
"The transaction was interrupted.\n"
|
||||
"Now Pamac will quit."
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:632
|
||||
msgid "<big><b>Transaction Summary</b></big>"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:676
|
||||
msgid "To reinstall"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:684
|
||||
msgid "To downgrade"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:693
|
||||
msgid "To update"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:754
|
||||
msgid "Preparing"
|
||||
msgstr ""
|
||||
|
||||
#: pamac/transaction.py:782
|
||||
msgid "Nothing to do"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.ui:7
|
||||
msgid "About Pamac"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.ui:10
|
||||
msgid "Copyright © 2013 Guillaume Benoit"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.ui:11
|
||||
msgid "A gtk3 frontend for pyalpm"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.ui:191
|
||||
msgid "Search"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.glade:431 gui/manager.glade:524
|
||||
#: gui/manager.ui:284 gui/manager.ui:376
|
||||
msgid "State"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.glade:478
|
||||
#: gui/manager.ui:331
|
||||
msgid "Repos"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.glade:540
|
||||
#: gui/manager.ui:389
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.glade:558
|
||||
#: gui/manager.ui:402
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.glade:574
|
||||
#: gui/manager.ui:415
|
||||
msgid "Size"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.glade:675
|
||||
#: gui/manager.ui:513
|
||||
msgid "Infos"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.glade:735
|
||||
#: gui/manager.ui:573
|
||||
msgid "Deps"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.glade:800
|
||||
#: gui/manager.ui:638
|
||||
msgid "Details"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.glade:848
|
||||
#: gui/manager.ui:686
|
||||
msgid "Files"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.glade:970
|
||||
#: gui/manager.ui:718
|
||||
msgid "Install local packages"
|
||||
msgstr ""
|
||||
|
||||
#: gui/manager.ui:806 gui/manager.ui:807
|
||||
msgid " "
|
||||
msgstr ""
|
||||
|
||||
#: gui/dialogs.ui:6
|
||||
msgid "Choose"
|
||||
msgstr ""
|
||||
|
||||
#: gui/dialogs.ui:108
|
||||
msgid "Summary"
|
||||
msgstr ""
|
||||
|
||||
#: gui/dialogs.ui:306
|
||||
msgid "Progress"
|
||||
msgstr ""
|
||||
|
||||
#: gui/dialogs.ui:398
|
||||
msgid "details"
|
||||
msgstr ""
|
||||
|
1269
pamac/main.py
1269
pamac/main.py
File diff suppressed because it is too large
Load Diff
@ -2,97 +2,787 @@
|
||||
# -*- coding:utf-8 -*-
|
||||
|
||||
import pyalpm
|
||||
from collections import OrderedDict
|
||||
import dbus
|
||||
from dbus.mainloop.glib import DBusGMainLoop
|
||||
from gi.repository import Gtk
|
||||
|
||||
from pamac import config, common
|
||||
|
||||
to_remove = set()
|
||||
to_add = set()
|
||||
to_load = set()
|
||||
to_update = set()
|
||||
to_provide = set()
|
||||
handle = None
|
||||
syncpkgs = OrderedDict()
|
||||
localpkgs = OrderedDict()
|
||||
# i18n
|
||||
import gettext
|
||||
import locale
|
||||
locale.bindtextdomain('pamac', '/usr/share/locale')
|
||||
gettext.bindtextdomain('pamac', '/usr/share/locale')
|
||||
gettext.textdomain('pamac')
|
||||
_ = gettext.gettext
|
||||
|
||||
def get_handle():
|
||||
global handle
|
||||
handle = config.handle()
|
||||
print('get handle')
|
||||
interface = Gtk.Builder()
|
||||
interface.set_translation_domain('pamac')
|
||||
|
||||
def update_db():
|
||||
#get_handle()
|
||||
global syncpkgs
|
||||
global localpkgs
|
||||
syncpkgs = OrderedDict()
|
||||
localpkgs = OrderedDict()
|
||||
if handle:
|
||||
for repo in handle.get_syncdbs():
|
||||
for pkg in repo.pkgcache:
|
||||
if not pkg.name in syncpkgs.keys():
|
||||
syncpkgs[pkg.name] = pkg
|
||||
for pkg in handle.get_localdb().pkgcache:
|
||||
if not pkg.name in localpkgs.keys():
|
||||
localpkgs[pkg.name] = pkg
|
||||
interface.add_from_file('/usr/share/pamac/gui/dialogs.ui')
|
||||
ErrorDialog = interface.get_object('ErrorDialog')
|
||||
WarningDialog = interface.get_object('WarningDialog')
|
||||
InfoDialog = interface.get_object('InfoDialog')
|
||||
#QuestionDialog = interface.get_object('QuestionDialog')
|
||||
ConfDialog = interface.get_object('ConfDialog')
|
||||
transaction_sum = interface.get_object('transaction_sum')
|
||||
sum_top_label = interface.get_object('sum_top_label')
|
||||
sum_bottom_label = interface.get_object('sum_bottom_label')
|
||||
ChooseDialog = interface.get_object('ChooseDialog')
|
||||
choose_list = interface.get_object('choose_list')
|
||||
choose_label = interface.get_object('choose_label')
|
||||
choose_renderertoggle = interface.get_object('choose_renderertoggle')
|
||||
ProgressWindow = interface.get_object('ProgressWindow')
|
||||
progress_bar = interface.get_object('progressbar2')
|
||||
progress_label = interface.get_object('progresslabel2')
|
||||
action_icon = interface.get_object('action_icon')
|
||||
ProgressCancelButton = interface.get_object('ProgressCancelButton')
|
||||
ProgressCloseButton = interface.get_object('ProgressCloseButton')
|
||||
progress_textview = interface.get_object('progress_textview')
|
||||
progress_expander = interface.get_object('progress_expander')
|
||||
|
||||
DBusGMainLoop(set_as_default = True)
|
||||
bus = dbus.SystemBus()
|
||||
proxy = bus.get_object('org.manjaro.pamac','/org/manjaro/pamac', introspect = False)
|
||||
Refresh = proxy.get_dbus_method('Refresh','org.manjaro.pamac')
|
||||
Init = proxy.get_dbus_method('Init','org.manjaro.pamac')
|
||||
Sysupgrade = proxy.get_dbus_method('Sysupgrade','org.manjaro.pamac')
|
||||
Remove = proxy.get_dbus_method('Remove','org.manjaro.pamac')
|
||||
Add = proxy.get_dbus_method('Add','org.manjaro.pamac')
|
||||
Load = proxy.get_dbus_method('Load','org.manjaro.pamac')
|
||||
Prepare = proxy.get_dbus_method('Prepare','org.manjaro.pamac')
|
||||
To_Remove = proxy.get_dbus_method('To_Remove','org.manjaro.pamac')
|
||||
To_Add = proxy.get_dbus_method('To_Add','org.manjaro.pamac')
|
||||
Commit = proxy.get_dbus_method('Commit','org.manjaro.pamac')
|
||||
Interrupt = proxy.get_dbus_method('Interrupt','org.manjaro.pamac')
|
||||
Release = proxy.get_dbus_method('Release','org.manjaro.pamac')
|
||||
StopDaemon = proxy.get_dbus_method('StopDaemon','org.manjaro.pamac')
|
||||
progress_buffer = progress_textview.get_buffer()
|
||||
choose_only_one = False
|
||||
|
||||
def init_transaction(**options):
|
||||
error = Init(dbus.Dictionary(options, signature='sb'))
|
||||
if not error:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
def choose_provides(data):
|
||||
global choose_only_one
|
||||
choose_only_one = True
|
||||
providers = data[0]
|
||||
dep_to_provide = data[1]
|
||||
choose_label.set_markup(_('<b>{pkgname} is provided by {number} packages.\nPlease choose the one you want to install:</b>').format(pkgname = dep_to_provide, number = str(len(providers))))
|
||||
choose_list.clear()
|
||||
choose_renderertoggle.set_radio(True)
|
||||
for pkg in providers:
|
||||
choose_list.append([False, pkg.name])
|
||||
ChooseDialog.run()
|
||||
index = 0
|
||||
if to_provide:
|
||||
for pkg in providers:
|
||||
if to_provide[0] == pkg.name:
|
||||
index = providers.index(pkg)
|
||||
return index
|
||||
|
||||
def get_updates():
|
||||
"""Return a list of package objects in local db which can be updated"""
|
||||
do_syncfirst = False
|
||||
list_first = []
|
||||
_ignorepkgs = []
|
||||
update_db()
|
||||
if handle:
|
||||
for group in handle.ignoregrps:
|
||||
db = handle.get_localdb()
|
||||
grp = db.read_grp(group)
|
||||
if grp:
|
||||
name, pkg_list = grp
|
||||
for pkg in pkg_list:
|
||||
if not pkg.name in _ignorepkgs:
|
||||
_ignorepkgs.append(pkg.name)
|
||||
for pkgname in handle.ignorepkgs:
|
||||
if pkgname in localpkgs.keys():
|
||||
if not pkgname in _ignorepkgs:
|
||||
_ignorepkgs.append(pkgname)
|
||||
if config.syncfirst:
|
||||
for name in config.syncfirst:
|
||||
if name in localpkgs.keys():
|
||||
candidate = pyalpm.sync_newversion(localpkgs[name], handle.get_syncdbs())
|
||||
if candidate:
|
||||
list_first.append(candidate)
|
||||
if list_first:
|
||||
do_syncfirst = True
|
||||
return do_syncfirst, list_first
|
||||
result = []
|
||||
for pkg in localpkgs.values():
|
||||
candidate = pyalpm.sync_newversion(pkg, handle.get_syncdbs())
|
||||
if candidate:
|
||||
if not candidate.name in _ignorepkgs:
|
||||
result.append(candidate)
|
||||
return do_syncfirst, result
|
||||
def on_choose_renderertoggle_toggled(widget, line):
|
||||
global choose_only_one
|
||||
choose_list[line][0] = not choose_list[line][0]
|
||||
if choose_only_one:
|
||||
for row in choose_list:
|
||||
if not row[1] == choose_list[line][1]:
|
||||
row[0] = False
|
||||
|
||||
def on_ChooseButton_clicked(*arg):
|
||||
ChooseDialog.hide()
|
||||
line = 0
|
||||
to_provide.clear()
|
||||
while line < len(choose_list):
|
||||
if choose_list[line][0] is True:
|
||||
to_provide.append(choose_list[line][1])
|
||||
line += 1
|
||||
|
||||
def on_progress_textview_size_allocate(*arg):
|
||||
#auto-scrolling method
|
||||
adj = progress_textview.get_vadjustment()
|
||||
adj.set_value(adj.get_upper() - adj.get_page_size())
|
||||
|
||||
#~ def policykit_test(sender, connexion, action):
|
||||
#~ bus = dbus.SystemBus()
|
||||
#~ proxy_dbus = connexion.get_object('org.freedesktop.DBus','/org/freedesktop/DBus/Bus', False)
|
||||
#~ dbus_info = dbus.Interface(proxy_dbus,'org.freedesktop.DBus')
|
||||
#~ sender_pid = dbus_info.GetConnectionUnixProcessID(sender)
|
||||
#~ proxy_policykit = bus.get_object('org.freedesktop.PolicyKit1','/org/freedesktop/PolicyKit1/Authority',False)
|
||||
#~ policykit_authority = dbus.Interface(proxy_policykit,'org.freedesktop.PolicyKit1.Authority')
|
||||
#~
|
||||
#~ Subject = ('unix-process', {'pid': dbus.UInt32(sender_pid, variant_level=1),
|
||||
#~ 'start-time': dbus.UInt64(0, variant_level=1)})
|
||||
#~ (is_authorized,is_challenge,details) = policykit_authority.CheckAuthorization(Subject, action, {'': ''}, dbus.UInt32(1), '')
|
||||
#~ return is_authorized
|
||||
|
||||
#~ def sort_pkgs_list(self, pkgs_list):
|
||||
#~ result = []
|
||||
#~ names_list = sorted([pkg.name for pkg in pkgs_list])
|
||||
#~ for name in names_list:
|
||||
#~ for pkg in pkgs_list:
|
||||
#~ if name == pkg.name:
|
||||
#~ result.append(pkg)
|
||||
#~ return result
|
||||
|
||||
def remove_pkg_from_list(pkg, pkgs_list):
|
||||
if pkgs_list:
|
||||
for _pkg in pkgs_list:
|
||||
if (pkg.name == _pkg.name and pkg.version == _pkg.version and pkg.arch == _pkg.arch):
|
||||
target = _pkg
|
||||
pkgs_list.remove(_pkg)
|
||||
|
||||
def pkg_in_list(pkg, pkgs_list):
|
||||
result = False
|
||||
if pkgs_list:
|
||||
for _pkg in pkgs_list:
|
||||
if (pkg.name == _pkg.name and pkg.version == _pkg.version and pkg.arch == _pkg.arch):
|
||||
result = True
|
||||
return result
|
||||
|
||||
class Transaction():
|
||||
def __init__(self):
|
||||
self.t = None
|
||||
self.to_remove = []
|
||||
self.to_add = []
|
||||
self.to_load = []
|
||||
self.to_provide = []
|
||||
self.error = ''
|
||||
self.warning = ''
|
||||
self.previous_action = ''
|
||||
self.previous_action_long = ''
|
||||
self.previous_icon = ''
|
||||
self.previous_target = ''
|
||||
self.previous_percent = 0
|
||||
self.total_size = 0
|
||||
self.already_transferred = 0
|
||||
self.handle = config.handle()
|
||||
self.syncdbs = self.handle.get_syncdbs()
|
||||
self.localdb = self.handle.get_localdb()
|
||||
self.handle.dlcb = self.cb_dl
|
||||
self.handle.totaldlcb = self.totaldlcb
|
||||
self.handle.eventcb = self.cb_event
|
||||
self.handle.questioncb = self.cb_question
|
||||
self.handle.progresscb = self.cb_progress
|
||||
self.handle.logcb = self.cb_log
|
||||
|
||||
def update_dbs(self):
|
||||
self.handle = config.handle()
|
||||
self.syncdbs = self.handle.get_syncdbs()
|
||||
self.localdb = self.handle.get_localdb()
|
||||
self.handle.dlcb = self.cb_dl
|
||||
self.handle.totaldlcb = self.totaldlcb
|
||||
self.handle.eventcb = self.cb_event
|
||||
self.handle.questioncb = self.cb_question
|
||||
self.handle.progresscb = self.cb_progress
|
||||
self.handle.logcb = self.cb_log
|
||||
|
||||
def get_localpkg(self, name):
|
||||
return self.localdb.get_pkg(name)
|
||||
|
||||
def get_syncpkg(self, name):
|
||||
for repo in self.syncdbs:
|
||||
pkg = repo.get_pkg(name)
|
||||
if pkg:
|
||||
return pkg
|
||||
|
||||
def cb_event(self, event, tupel):
|
||||
global progress_buffer
|
||||
action = self.previous_action
|
||||
action_long = self.previous_action_long
|
||||
icon = self.previous_icon
|
||||
if event == 'ALPM_EVENT_CHECKDEPS_START':
|
||||
action = _('Checking dependencies')+'...'
|
||||
action_long = action+'\n'
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
elif event == 'ALPM_EVENT_CHECKDEPS_DONE':
|
||||
if self.warning:
|
||||
self.handle_warning(self.warning)
|
||||
self.warning = ''
|
||||
elif event == 'ALPM_EVENT_FILECONFLICTS_START':
|
||||
action = _('Checking file conflicts')+'...'
|
||||
action_long = action+'\n'
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
elif event == 'ALPM_EVENT_FILECONFLICTS_DONE':
|
||||
pass
|
||||
elif event == 'ALPM_EVENT_RESOLVEDEPS_START':
|
||||
action = _('Resolving dependencies')+'...'
|
||||
action_long = action+'\n'
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-setup.png'
|
||||
elif event == 'ALPM_EVENT_RESOLVEDEPS_DONE':
|
||||
pass
|
||||
elif event == 'ALPM_EVENT_INTERCONFLICTS_START':
|
||||
action = _('Checking inter conflicts')+'...'
|
||||
action_long = action+'\n'
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
elif event == 'ALPM_EVENT_INTERCONFLICTS_DONE':
|
||||
if self.warning:
|
||||
self.handle_warning(self.warning)
|
||||
self.warning = ''
|
||||
elif event == 'ALPM_EVENT_ADD_START':
|
||||
string = _('Installing {pkgname}').format(pkgname = tupel[0].name)
|
||||
action = string+'...'
|
||||
action_long = '{} ({})\n'.format(string, tupel[0].version)
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-add.png'
|
||||
ProgressCancelButton.set_visible(False)
|
||||
elif event == 'ALPM_EVENT_ADD_DONE':
|
||||
formatted_event = 'Installed {pkgname} ({pkgversion})'.format(pkgname = tupel[0].name, pkgversion = tupel[0].version)
|
||||
common.write_log_file(formatted_event)
|
||||
elif event == 'ALPM_EVENT_REMOVE_START':
|
||||
string = _('Removing {pkgname}').format(pkgname = tupel[0].name)
|
||||
action = string+'...'
|
||||
action_long = '{} ({})\n'.format(string, tupel[0].version)
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-delete.png'
|
||||
ProgressCancelButton.set_visible(False)
|
||||
elif event == 'ALPM_EVENT_REMOVE_DONE':
|
||||
formatted_event = 'Removed {pkgname} ({pkgversion})'.format(pkgname = tupel[0].name, pkgversion = tupel[0].version)
|
||||
common.write_log_file(formatted_event)
|
||||
elif event == 'ALPM_EVENT_UPGRADE_START':
|
||||
string = _('Upgrading {pkgname}').format(pkgname = tupel[1].name)
|
||||
action = string+'...'
|
||||
action_long = '{} ({} -> {})\n'.format(string, tupel[1].version, tupel[0].version)
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-update.png'
|
||||
ProgressCancelButton.set_visible(False)
|
||||
elif event == 'ALPM_EVENT_UPGRADE_DONE':
|
||||
formatted_event = 'Upgraded {pkgname} ({oldversion} -> {newversion})'.format(pkgname = tupel[1].name, oldversion = tupel[1].version, newversion = tupel[0].version)
|
||||
common.write_log_file(formatted_event)
|
||||
elif event == 'ALPM_EVENT_DOWNGRADE_START':
|
||||
string = _('Downgrading {pkgname}').format(pkgname = tupel[1].name)
|
||||
action = string+'...'
|
||||
action_long = '{} ({} -> {})'.format(string, tupel[1].version, tupel[0].version)
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-add.png'
|
||||
ProgressCancelButton.set_visible(False)
|
||||
elif event == 'ALPM_EVENT_DOWNGRADE_DONE':
|
||||
formatted_event = 'Downgraded {pkgname} ({oldversion} -> {newversion})'.format(pkgname = tupel[1].name, oldversion = tupel[1].version, newversion = tupel[0].version)
|
||||
common.write_log_file(formatted_event)
|
||||
elif event == 'ALPM_EVENT_REINSTALL_START':
|
||||
string = _('Reinstalling {pkgname}').format(pkgname = tupel[0].name)
|
||||
action = string+'...'
|
||||
action_long = '{} ({})'.format(string, tupel[0].version)
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-add.png'
|
||||
ProgressCancelButton.set_visible(False)
|
||||
elif event == 'ALPM_EVENT_REINSTALL_DONE':
|
||||
formatted_event = 'Reinstalled {pkgname} ({pkgversion})'.format(pkgname = tupel[0].name, pkgversion = tupel[0].version)
|
||||
common.write_log_file(formatted_event)
|
||||
elif event == 'ALPM_EVENT_INTEGRITY_START':
|
||||
action = _('Checking integrity')+'...'
|
||||
action_long = action+'\n'
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
self.already_transferred = 0
|
||||
elif event == 'ALPM_EVENT_INTEGRITY_DONE':
|
||||
pass
|
||||
elif event == 'ALPM_EVENT_LOAD_START':
|
||||
action = _('Loading packages files')+'...'
|
||||
action_long = action+'\n'
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
elif event == 'ALPM_EVENT_LOAD_DONE':
|
||||
pass
|
||||
elif event == 'ALPM_EVENT_DELTA_INTEGRITY_START':
|
||||
action = _('Checking delta integrity')+'...'
|
||||
action_long = action+'\n'
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
elif event == 'ALPM_EVENT_DELTA_INTEGRITY_DONE':
|
||||
pass
|
||||
elif event == 'ALPM_EVENT_DELTA_PATCHES_START':
|
||||
action = _('Applying deltas')+'...'
|
||||
action_long = action+'\n'
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-setup.png'
|
||||
elif event == 'ALPM_EVENT_DELTA_PATCHES_DONE':
|
||||
pass
|
||||
elif event == 'ALPM_EVENT_DELTA_PATCH_START':
|
||||
action = _('Generating {} with {}').format(tupel[0], tupel[1])+'...'
|
||||
action_long = action+'\n'
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-setup.png'
|
||||
elif event == 'ALPM_EVENT_DELTA_PATCH_DONE':
|
||||
action = _('Generation succeeded!')
|
||||
action_long = action+'\n'
|
||||
elif event == 'ALPM_EVENT_DELTA_PATCH_FAILED':
|
||||
action = _('Generation failed.')
|
||||
action_long = action+'\n'
|
||||
elif event == 'ALPM_EVENT_SCRIPTLET_INFO':
|
||||
action =_('Configuring {pkgname}').format(pkgname = self.previous_target)+'...'
|
||||
action_long = tupel[0]
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-setup.png'
|
||||
progress_bar.pulse()
|
||||
progress_expander.set_expanded(True)
|
||||
elif event == 'ALPM_EVENT_RETRIEVE_START':
|
||||
# handled by download callback
|
||||
ProgressCancelButton.set_visible(True)
|
||||
elif event == 'ALPM_EVENT_DISKSPACE_START':
|
||||
action = _('Checking available disk space')+'...'
|
||||
action_long = action+'\n'
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
elif event == 'ALPM_EVENT_OPTDEP_REQUIRED':
|
||||
print('Optionnal deps exist')
|
||||
elif event == 'ALPM_EVENT_DATABASE_MISSING':
|
||||
#action =_('Database file for {} does not exist').format(tupel[0])+'...'
|
||||
#action_long = action
|
||||
pass
|
||||
elif event == 'ALPM_EVENT_KEYRING_START':
|
||||
action = _('Checking keyring')+'...'
|
||||
action_long = action+'\n'
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-search.png'
|
||||
ProgressCancelButton.set_visible(True)
|
||||
elif event == 'ALPM_EVENT_KEYRING_DONE':
|
||||
pass
|
||||
elif event == 'ALPM_EVENT_KEY_DOWNLOAD_START':
|
||||
action = _('Downloading required keys')+'...'
|
||||
action_long = action+'\n'
|
||||
elif event == 'ALPM_EVENT_KEY_DOWNLOAD_DONE':
|
||||
pass
|
||||
if action != self.previous_action:
|
||||
self.previous_action = action
|
||||
progress_label.set_text(action)
|
||||
if action_long != self.previous_action_long:
|
||||
self.previous_action_long != action_long
|
||||
end_iter = progress_buffer.get_end_iter()
|
||||
progress_buffer.insert(end_iter, action_long)
|
||||
if icon != self.previous_icon:
|
||||
self.previous_icon = icon
|
||||
action_icon.set_from_file(icon)
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
print(event)
|
||||
|
||||
def cb_question(self, event, data_tupel, extra_data):
|
||||
print('question', event, data_tupel, extra_data)
|
||||
if event == 'ALPM_QUESTION_INSTALL_IGNOREPKG':
|
||||
return 0 #Do not install package in IgnorePkg/IgnoreGroup
|
||||
if event == 'ALPM_QUESTION_REPLACE_PKG':
|
||||
self.warning += _('{pkgname1} will replace by {pkgname2}\n').format(pkgname1 = data_tupel[0].name, pkgname2 = data_tupel[1].name)
|
||||
return 1 #Auto-remove conflicts in case of replaces
|
||||
if event == 'ALPM_QUESTION_CONFLICT_PKG':
|
||||
self.warning += _('{pkgname1} conflicts with {pkgname2}\n').format(pkgname1 = data_tupel[0], pkgname2 = data_tupel[1])
|
||||
return 1 #Auto-remove conflicts
|
||||
if event == 'ALPM_QUESTION_CORRUPTED_PKG':
|
||||
return 1 #Auto-remove corrupted pkgs in cache
|
||||
if event == 'ALPM_QUESTION_REMOVE_PKGS':
|
||||
return 1 #Do not upgrade packages which have unresolvable dependencies
|
||||
if event == 'ALPM_QUESTION_SELECT_PROVIDER':
|
||||
return choose_provides(data_tupel)
|
||||
if event == 'ALPM_QUESTION_IMPORT_KEY':
|
||||
# data_tupel = (revoked(int), length(int), pubkey_algo(string), fingerprint(string), uid(string), created_time(int))
|
||||
if data_tupel[0] is 0: # not revoked
|
||||
return 1 #Auto import not revoked key
|
||||
if data_tupel[0] is 1: # revoked
|
||||
return 0 #Do not import revoked key
|
||||
|
||||
def cb_log(self, level, line):
|
||||
global progress_buffer
|
||||
_logmask = pyalpm.LOG_ERROR | pyalpm.LOG_WARNING
|
||||
if not (level & _logmask):
|
||||
return
|
||||
if level & pyalpm.LOG_ERROR:
|
||||
self.error += line
|
||||
_error = "ERROR: "+line
|
||||
end_iter = progress_buffer.get_end_iter()
|
||||
progress_buffer.insert(end_iter, _error)
|
||||
progress_expander.set_expanded(True)
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
print(line)
|
||||
elif level & pyalpm.LOG_WARNING:
|
||||
self.warning += line
|
||||
_warning = "WARNING: "+line
|
||||
end_iter = progress_buffer.get_end_iter()
|
||||
progress_buffer.insert(end_iter, _warning)
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
elif level & pyalpm.LOG_DEBUG:
|
||||
line = "DEBUG: " + line
|
||||
print(line)
|
||||
elif level & pyalpm.LOG_FUNCTION:
|
||||
line = "FUNC: " + line
|
||||
print(line)
|
||||
|
||||
def totaldlcb(self, _total_size):
|
||||
self.total_size = _total_size
|
||||
|
||||
def cb_dl(self, _target, _transferred, _total):
|
||||
global progress_buffer
|
||||
if _target.endswith('.db'):
|
||||
action = _('Refreshing {repo}').format(repo = _target.rstrip('.db'))+'...'
|
||||
action_long = ''
|
||||
icon = '/usr/share/pamac/icons/24x24/status/refresh-cache.png'
|
||||
else:
|
||||
action = _('Downloading {pkgname}').format(pkgname = _target.rstrip('.pkg.tar.xz'))+'...'
|
||||
action_long = action+'\n'
|
||||
icon = '/usr/share/pamac/icons/24x24/status/package-download.png'
|
||||
if self.total_size > 0:
|
||||
percent = round((_transferred+self.already_transferred)/self.total_size, 2)
|
||||
#~ target = '{transferred}/{size}'.format(transferred = common.format_size(_transferred+self.already_transferred), size = common.format_size(self.total_size))
|
||||
else:
|
||||
percent = round(_transferred/_total, 2)
|
||||
#~ percent = 2.0
|
||||
#~ target = ''
|
||||
if action != self.previous_action:
|
||||
self.previous_action = action
|
||||
progress_label.set_text(action)
|
||||
if action_long != self.previous_action_long:
|
||||
self.previous_action_long = action_long
|
||||
end_iter = progress_buffer.get_end_iter()
|
||||
progress_buffer.insert(end_iter, action_long)
|
||||
if icon != self.previous_icon:
|
||||
self.previous_icon = icon
|
||||
action_icon.set_from_file(icon)
|
||||
#~ if target != self.previous_target:
|
||||
#~ self.previous_target = target
|
||||
#~ progress_bar.set_text(target)
|
||||
#~ if percent == 2.0:
|
||||
#~ progress_bar.pulse()
|
||||
elif percent != self.previous_percent:
|
||||
self.previous_percent = percent
|
||||
if 0 <= percent <= 1:
|
||||
progress_bar.set_fraction(percent)
|
||||
else:
|
||||
progress_bar.pulse()
|
||||
elif _transferred == _total:
|
||||
self.already_transferred += _total
|
||||
#~ if self.already_transferred == self.total_size:
|
||||
#~ progress_bar.set_text('')
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
|
||||
def cb_progress(self, event, target, _percent, n, i):
|
||||
if event in ('ALPM_PROGRESS_ADD_START', 'ALPM_PROGRESS_UPGRADE_START', 'ALPM_PROGRESS_DOWNGRADE_START', 'ALPM_PROGRESS_REINSTALL_START', 'ALPM_PROGRESS_REMOVE_START'):
|
||||
percent = round(((i-1)/n)+(_percent/(100*n)), 2)
|
||||
else:
|
||||
percent = round(_percent/100, 2)
|
||||
if target != self.previous_target:
|
||||
self.previous_target = target.format()
|
||||
if percent != self.previous_percent:
|
||||
progress_bar.set_text('{}/{}'.format(str(i), str(n)))
|
||||
self.previous_percent = percent
|
||||
if 0 <= percent <= 1:
|
||||
progress_bar.set_fraction(percent)
|
||||
else:
|
||||
progress_bar.pulse()
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
|
||||
def refresh(self, force_update):
|
||||
progress_label.set_text(_('Refreshing')+'...')
|
||||
action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/refresh-cache.png')
|
||||
progress_bar.set_text('')
|
||||
progress_bar.set_fraction(0)
|
||||
ProgressCloseButton.set_visible(False)
|
||||
ProgressCancelButton.set_visible(True)
|
||||
ProgressWindow.show()
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
self.error = ''
|
||||
for db in self.syncdbs:
|
||||
try:
|
||||
self.t = self.handle.init_transaction()
|
||||
db.update(force = force_update)
|
||||
self.t.release()
|
||||
except pyalpm.error as e:
|
||||
self.release()
|
||||
self.error += str(e)+'\n'
|
||||
break
|
||||
self.update_dbs()
|
||||
ProgressWindow.hide()
|
||||
if self.error:
|
||||
self.handle_error(self.error)
|
||||
|
||||
def get_updates(self):
|
||||
do_syncfirst = False
|
||||
list_first = set()
|
||||
_ignorepkgs = set()
|
||||
if self.handle:
|
||||
for group in self.handle.ignoregrps:
|
||||
db = self.handle.get_localdb()
|
||||
grp = db.read_grp(group)
|
||||
if grp:
|
||||
name, pkg_list = grp
|
||||
for pkg in pkg_list:
|
||||
_ignorepkgs.add(pkg.name)
|
||||
for name in self.handle.ignorepkgs:
|
||||
if self.get_localpkg(name):
|
||||
_ignorepkgs.add(name)
|
||||
if config.syncfirst:
|
||||
for name in config.syncfirst:
|
||||
if self.get_localpkg(name):
|
||||
candidate = pyalpm.sync_newversion(self.get_localpkg(name), self.syncdbs)
|
||||
if candidate:
|
||||
list_first.add(candidate)
|
||||
if list_first:
|
||||
do_syncfirst = True
|
||||
return do_syncfirst, list_first
|
||||
result = set()
|
||||
for pkg in self.localdb.pkgcache:
|
||||
candidate = pyalpm.sync_newversion(pkg, self.syncdbs)
|
||||
if candidate:
|
||||
if not candidate.name in _ignorepkgs:
|
||||
result.add(candidate)
|
||||
return do_syncfirst, result
|
||||
|
||||
def init(self, **options):
|
||||
self.error = ''
|
||||
try:
|
||||
self.t = self.handle.init_transaction(**options)
|
||||
except pyalpm.error as e:
|
||||
self.error += str(e)+'\n'
|
||||
finally:
|
||||
if self.error:
|
||||
self.handle_error(self.error)
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
def sysupgrade(self, force_downgrade):
|
||||
try:
|
||||
self.t.sysupgrade(downgrade = force_downgrade)
|
||||
except pyalpm.error as e:
|
||||
self.error += str(e)+'\n'
|
||||
self.t.release()
|
||||
finally:
|
||||
if self.error:
|
||||
self.handle_error(self.error)
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
def remove(self, pkg):
|
||||
try:
|
||||
self.t.remove_pkg(pkg)
|
||||
except pyalpm.error as e:
|
||||
self.error += str(e)+'\n'
|
||||
self.t.release()
|
||||
finally:
|
||||
if self.error:
|
||||
self.handle_error(self.error)
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
def add(self, pkg):
|
||||
try:
|
||||
self.t.add_pkg(pkg)
|
||||
except pyalpm.error as e:
|
||||
# skip duplicate target error
|
||||
if not 'pm_errno 25' in str(e):
|
||||
self.error += str(e)+'\n'
|
||||
self.t.release()
|
||||
finally:
|
||||
if self.error:
|
||||
self.handle_error(self.error)
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
def load(self, tarball_path):
|
||||
try:
|
||||
pkg = self.handle.load_pkg(tarball_path)
|
||||
if pkg:
|
||||
self.t.add_pkg(pkg)
|
||||
else:
|
||||
self.error += _('{pkgname} is not a valid path or package name').format(pkgname = tarball_path)
|
||||
except pyalpm.error as e:
|
||||
# skip duplicate target error
|
||||
if not 'pm_errno 25' in str(e):
|
||||
self.error += str(e)+'\n'
|
||||
self.t.release()
|
||||
finally:
|
||||
if self.error:
|
||||
self.handle_error(self.error)
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
def prepare(self):
|
||||
try:
|
||||
self.t.prepare()
|
||||
except pyalpm.error as e:
|
||||
self.error += str(e)+'\n'
|
||||
self.t.release()
|
||||
else:
|
||||
for pkg in self.t.to_remove:
|
||||
if pkg.name in config.holdpkg:
|
||||
self.error += _('The transaction cannot be performed because it needs to remove {pkgname1} which is a locked package').format(pkgname1 = pkg.name)
|
||||
self.t.release()
|
||||
break
|
||||
finally:
|
||||
if self.error:
|
||||
self.handle_error(self.error)
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
def commit(self):
|
||||
try:
|
||||
self.t.commit()
|
||||
except pyalpm.error as e:
|
||||
self.error += str(e)+'\n'
|
||||
else:
|
||||
global progress_buffer
|
||||
ProgressCloseButton.set_visible(True)
|
||||
action_icon.set_from_icon_name('dialog-information', Gtk.IconSize.BUTTON)
|
||||
progress_label.set_text(_('Transaction successfully finished'))
|
||||
progress_bar.set_text('')
|
||||
end_iter = progress_buffer.get_end_iter()
|
||||
progress_buffer.insert(end_iter, _('Transaction successfully finished'))
|
||||
finally:
|
||||
self.release()
|
||||
if self.warning:
|
||||
self.handle_warning(self.warning)
|
||||
self.warning = ''
|
||||
if self.error:
|
||||
self.handle_error(self.error)
|
||||
|
||||
def interrupt(self):
|
||||
try:
|
||||
self.t.interrupt()
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
self.t.release()
|
||||
except:
|
||||
pass
|
||||
# Fix me, pyalpm don't stop so we inform and force quit to really interrupt the transaction
|
||||
InfoDialog.format_secondary_text(_('The transaction was interrupted.\nNow Pamac will quit.'))
|
||||
response = InfoDialog.run()
|
||||
if response:
|
||||
InfoDialog.hide()
|
||||
common.rm_pid_file()
|
||||
print('interrupted')
|
||||
exit(0)
|
||||
|
||||
def set_transaction_sum(self, show_updates):
|
||||
transaction_sum.clear()
|
||||
sum_top_label.set_markup(_('<big><b>Transaction Summary</b></big>'))
|
||||
_to_remove = self.t.to_remove
|
||||
_to_install = []
|
||||
_to_reinstall = []
|
||||
_to_downgrade = []
|
||||
_to_update = []
|
||||
dsize = 0
|
||||
for pkg in self.t.to_add:
|
||||
dsize += pkg.download_size
|
||||
installed = self.get_localpkg(pkg.name)
|
||||
if not installed:
|
||||
_to_install.append(pkg)
|
||||
else:
|
||||
comp = pyalpm.vercmp(pkg.version, installed.version)
|
||||
if comp == 0:
|
||||
_to_reinstall.append(pkg)
|
||||
elif comp == -1:
|
||||
_to_downgrade.append(pkg)
|
||||
elif comp == 1:
|
||||
_to_update.append(pkg)
|
||||
if dsize == 0:
|
||||
sum_bottom_label.set_markup('')
|
||||
else:
|
||||
sum_bottom_label.set_markup(_('<b>Total download size: </b>')+common.format_size(dsize))
|
||||
i = 0
|
||||
while i < len(_to_remove):
|
||||
pkg = _to_remove[i]
|
||||
if i == 0:
|
||||
transaction_sum.append([_('To remove')+':', pkg.name+' '+pkg.version])
|
||||
else:
|
||||
transaction_sum.append(['', pkg.name+' '+pkg.version])
|
||||
i += 1
|
||||
i = 0
|
||||
while i < len(_to_install):
|
||||
pkg = _to_install[i]
|
||||
if i == 0:
|
||||
transaction_sum.append([_('To install')+':', pkg.name+' '+pkg.version])
|
||||
else:
|
||||
transaction_sum.append(['', pkg.name+' '+pkg.version])
|
||||
i += 1
|
||||
i = 0
|
||||
while i < len(_to_reinstall):
|
||||
pkg = _to_reinstall[i]
|
||||
if i == 0:
|
||||
transaction_sum.append([_('To reinstall')+':', pkg.name+' '+pkg.version])
|
||||
else:
|
||||
transaction_sum.append(['', pkg.name+' '+pkg.version])
|
||||
i += 1
|
||||
i = 0
|
||||
while i < len(_to_downgrade):
|
||||
pkg = _to_downgrade[i]
|
||||
if i == 0:
|
||||
transaction_sum.append([_('To downgrade')+':', pkg.name+' '+pkg.version])
|
||||
else:
|
||||
transaction_sum.append(['', pkg.name+' '+pkg.version])
|
||||
i += 1
|
||||
if show_updates:
|
||||
i = 0
|
||||
while i < len(_to_update):
|
||||
pkg = _to_update[i]
|
||||
if i == 0:
|
||||
transaction_sum.append([_('To update')+':', pkg.name+' '+pkg.version])
|
||||
else:
|
||||
transaction_sum.append(['', pkg.name+' '+pkg.version])
|
||||
i += 1
|
||||
|
||||
def handle_error(self, error):
|
||||
ProgressWindow.hide()
|
||||
print(error)
|
||||
ErrorDialog.format_secondary_text(error)
|
||||
response = ErrorDialog.run()
|
||||
if response:
|
||||
ErrorDialog.hide()
|
||||
|
||||
def handle_warning(self, warning):
|
||||
WarningDialog.format_secondary_text(warning)
|
||||
response = WarningDialog.run()
|
||||
if response:
|
||||
WarningDialog.hide()
|
||||
|
||||
def do_sysupgrade(self, show_updates):
|
||||
do_syncfirst, to_update = self.get_updates()
|
||||
if to_update:
|
||||
self.to_add.clear()
|
||||
self.to_remove.clear()
|
||||
self.error = ''
|
||||
if do_syncfirst:
|
||||
if self.init(recurse = True):
|
||||
for pkg in to_update:
|
||||
self.add(pkg)
|
||||
if self.prepare():
|
||||
self.set_transaction_sum(show_updates)
|
||||
if show_updates:
|
||||
ConfDialog.show_all()
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
else:
|
||||
if len(transaction_sum) != 0:
|
||||
ConfDialog.show_all()
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
else:
|
||||
self.finalize()
|
||||
else:
|
||||
if self.init():
|
||||
if self.sysupgrade(False):
|
||||
if self.prepare():
|
||||
self.set_transaction_sum(show_updates)
|
||||
if show_updates:
|
||||
ConfDialog.show_all()
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
else:
|
||||
if len(transaction_sum) != 0:
|
||||
ConfDialog.show_all()
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
else:
|
||||
self.finalize()
|
||||
|
||||
def finalize(self):
|
||||
global progress_buffer
|
||||
progress_label.set_text(_('Preparing')+'...')
|
||||
action_icon.set_from_file('/usr/share/pamac/icons/24x24/status/package-setup.png')
|
||||
progress_bar.set_text('')
|
||||
progress_bar.set_fraction(0)
|
||||
progress_buffer.delete(progress_buffer.get_start_iter(),progress_buffer.get_end_iter())
|
||||
ProgressCloseButton.set_visible(False)
|
||||
ProgressWindow.show()
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
self.commit()
|
||||
self.to_add.clear()
|
||||
self.to_remove.clear()
|
||||
|
||||
def run(self):
|
||||
if self.to_add or self.to_remove or self.to_load:
|
||||
if self.init(cascade = True):
|
||||
for pkg in self.to_add:
|
||||
self.add(pkg)
|
||||
for pkg in self.to_remove:
|
||||
self.remove(pkg)
|
||||
for path in self.to_load:
|
||||
self.load(path)
|
||||
if self.prepare():
|
||||
self.set_transaction_sum(True)
|
||||
ConfDialog.show()
|
||||
while Gtk.events_pending():
|
||||
Gtk.main_iteration()
|
||||
else:
|
||||
self.handle_warning(_('Nothing to do'))
|
||||
|
||||
def release(self):
|
||||
try:
|
||||
self.t.release()
|
||||
except:
|
||||
pass
|
||||
|
2
setup.py
2
setup.py
@ -3,7 +3,7 @@
|
||||
from distutils.core import setup
|
||||
|
||||
setup(name='Pamac',
|
||||
version='0.7',
|
||||
version='0.8',
|
||||
description='A gtk3 frontend for pyalpm',
|
||||
license='GPL',
|
||||
author='Guillaume Benoit',
|
||||
|
@ -1,3 +0,0 @@
|
||||
#! /bin/sh
|
||||
|
||||
/usr/bin/pamac-daemon &
|
Loading…
Reference in New Issue
Block a user