Pamac 2.0

- complete rewrite in vala
- it now directly depends on libalpm so it is easier to maintain
- it is faster and uses less memory
- alpm bindings for vala, other people could be interested
- a DBus daemon which can perform every tasks which need root access using polkit to check authorization, it can be used by any other program.
- pamac-manager and pamac-updater as you know before but with some new design, try them !
- the progress dialog now includes a terminal, it permits to launch yaourt which is used now to build packages from AUR.
- reinstall a package
- install optional dependencies of a package
- mark a package as explicitly installed
This commit is contained in:
Philip 2014-11-22 09:36:35 +01:00
parent df8ca4fc58
commit b8153ea474
146 changed files with 38364 additions and 31842 deletions

14
.gitignore vendored
View File

@ -1,3 +1,11 @@
__pycache__
refresh-sources.sh
*~
pkgbuild
resources/*.c
src/pamac-daemon
src/pamac-tray
src/pamac-manager
src/pamac-install
src/pamac-updater
data/polkit/org.manjaro.pamac.policy
po/*.mo
po/*~
po/locale

View File

@ -1,8 +1,8 @@
[main]
host = https://www.transifex.com
lang_map = af_ZA: af-ZA, am_ET: am-ET, ar_AE: ar-AE, ar_BH: ar-BH, ar_DZ: ar-DZ, ar_EG: ar-EG, ar_IQ: ar-IQ, ar_JO: ar-JO, ar_KW: ar-KW, ar_LB: ar-LB, ar_LY: ar-LY, ar_MA: ar-MA, ar_OM: ar-OM, ar_QA: ar-QA, ar_SA: ar-SA, ar_SY: ar-SY, ar_TN: ar-TN, ar_YE: ar-YE, arn_CL: arn-CL, as_IN: as-IN, az_AZ: az-AZ, ba_RU: ba-RU, be_BY: be-BY, bg_BG: bg-BG, bn_BD: bn-BD, bn_IN: bn-IN, bo_CN: bo-CN, br_FR: br-FR, bs_BA: bs-BA, ca_ES: ca-ES, co_FR: co-FR, cs_CZ: cs-CZ, cy_GB: cy-GB, da_DK: da-DK, de_AT: de-AT, de_CH: de-CH, de_DE: de-DE, de_LI: de-LI, de_LU: de-LU, dsb_DE: dsb-DE, dv_MV: dv-MV, el_GR: el-GR, en_AU: en-AU, en_BZ: en-BZ, en_CA: en-CA, en_GB: en-GB, en_IE: en-IE, en_IN: en-IN, en_JM: en-JM, en_MY: en-MY, en_NZ: en-NZ, en_PH: en-PH, en_SG: en-SG, en_TT: en-TT, en_US: en-US, en_ZA: en-ZA, en_ZW: en-ZW, es_AR: es-AR, es_BO: es-BO, es_CL: es-CL, es_CO: es-CO, es_CR: es-CR, es_DO: es-DO, es_EC: es-EC, es_ES: es-ES, es_GT: es-GT, es_HN: es-HN, es_MX: es-MX, es_NI: es-NI, es_PA: es-PA, es_PE: es-PE, es_PR: es-PR, es_PY: es-PY, es_SV: es-SV, es_US: es-US, es_UY: es-UY, es_VE: es-VE, et_EE: et-EE, eu_ES: eu-ES, fa_IR: fa-IR, fi_FI: fi-FI, fil_PH: fil-PH, fo_FO: fo-FO, fr_BE: fr-BE, fr_CA: fr-CA, fr_CH: fr-CH, fr_FR: fr-FR, fr_LU: fr-LU, fr_MC: fr-MC, fy_NL: fy-NL, ga_IE: ga-IE, gd_GB: gd-GB, gl_ES: gl-ES, gsw_FR: gsw-FR, gu_IN: gu-IN, ha_NG: ha-NG, he_IL: he-IL, hi_IN: hi-IN, hr_BA: hr-BA, hr_HR: hr-HR, hsb_DE: hsb-DE, hu_HU: hu-HU, hy_AM: hy-AM, id_ID: id-ID, ig_NG: ig-NG, ii_CN: ii-CN, is_IS: is-IS, it_CH: it-CH, it_IT: it-IT, iu_CA: iu-CA, ja_JP: ja-JP, ka_GE: ka-GE, kk_KZ: kk-KZ, kl_GL: kl-GL, km_KH: km-KH, kn_IN: kn-IN, ko_KR: ko-KR, kok_IN: kok-IN, ky_KG: ky-KG, lb_LU: lb-LU, lo_LA: lo-LA, lt_LT: lt-LT, lv_LV: lv-LV, mi_NZ: mi-NZ, mk_MK: mk-MK, ml_IN: ml-IN, mn_CN: mn-CN, mn_MN: mn-MN, moh_CA: moh-CA, mr_IN: mr-IN, ms_BN: ms-BN, ms_MY: ms-MY, mt_MT: mt-MT, nb_NO: nb-NO, ne_NP: ne-NP, nl_BE: nl-BE, nl_NL: nl-NL, nn_NO: nn-NO, nso_ZA: nso-ZA, oc_FR: oc-FR, or_IN: or-IN, pa_IN: pa-IN, pl_PL: pl-PL, prs_AF: prs-AF, ps_AF: ps-AF, pt_BR: pt-BR, pt_PT: pt-PT, qut_GT: qut-GT, quz_BO: quz-BO, quz_EC: quz-EC, quz_PE: quz-PE, rm_CH: rm-CH, ro_RO: ro-RO, ru_RU: ru-RU, rw_RW: rw-RW, sa_IN: sa-IN, sah_RU: sah-RU, se_FI: se-FI, se_NO: se-NO, se_SE: se-SE, si_LK: si-LK, sk_SK: sk-SK, sl_SI: sl-SI, sma_NO: sma-NO, sma_SE: sma-SE, smj_NO: smj-NO, smj_SE: smj-SE, smn_FI: smn-FI, sms_FI: sms-FI, sq_AL: sq-AL, sr_BA: sr-BA, sr_CS: sr-CS, sr_ME: sr-ME, sr_RS: sr-RS, sv_FI: sv-FI, sv_SE: sv-SE, sw_KE: sw-KE, syr_SY: syr-SY, ta_IN: ta-IN, te_IN: te-IN, tg_TJ: tg-TJ, th_TH: th-TH, tk_TM: tk-TM, tn_ZA: tn-ZA, tr_TR: tr-TR, tt_RU: tt-RU, tzm_DZ: tzm-DZ, ug_CN: ug-CN, uk_UA: uk-UA, ur_PK: ur-PK, uz_UZ: uz-UZ, vi_VN: vi-VN, wo_SN: wo-SN, xh_ZA: xh-ZA, yo_NG: yo-NG, zh_CN: zh-CN, zh_HK: zh-HK, zh_MO: zh-MO, zh_SG: zh-SG, zh_TW: zh-TW, zu_ZA: zu-ZA
[manjaro-pamac.pamacpot]
file_filter = po/<lang>.po
source_file = po/pamac.pot
source_lang = en
type = PO

49
Makefile Normal file
View File

@ -0,0 +1,49 @@
all:
cd resources; make resources
cd src; make binaries
cd po; make gettext
clean:
rm -f src/*.c src/pamac-daemon src/pamac-tray src/pamac-updater src/pamac-manager src/pamac-install
rm -r resources/*.c
rm -rf po/locale
rm -f po/*.mo
rm -f data/polkit/org.manjaro.pamac.policy
install:
mkdir -p /usr/share/icons/hicolor
cp -r data/icons/* /usr/share/icons/hicolor
cp -r po/locale /usr/share
install -Dm744 src/pamac-daemon /usr/bin/pamac-daemon
install -Dm755 src/pamac-tray /usr/bin/pamac-tray
install -Dm755 src/pamac-manager /usr/bin/pamac-manager
install -Dm755 src/pamac-updater /usr/bin/pamac-updater
install -Dm755 src/pamac-install /usr/bin/pamac-install
#install -Dm755 src/pamac-refresh /usr/bin/pamac-refresh
install -Dm755 src/pamac-install /usr/bin/pamac-install
install -Dm644 data/applications/pamac-tray.desktop /etc/xdg/autostart/pamac-tray.desktop
install -Dm644 data/applications/pamac-manager.desktop /usr/share/applications/pamac-manager.desktop
install -Dm644 data/applications/pamac-updater.desktop /usr/share/applications/pamac-updater.desktop
install -Dm644 data/applications/pamac-install.desktop /usr/share/applications/pamac-install.desktop
install -Dm644 data/config/pamac.conf /etc/pamac.conf
install -Dm644 data/dbus/org.manjaro.pamac.conf /etc/dbus-1/system.d/org.manjaro.pamac.conf
install -Dm644 data/dbus/org.manjaro.pamac.service /usr/share/dbus-1/system-services/org.manjaro.pamac.service
install -Dm644 data/systemd/pamac.service /usr/lib/systemd/system/pamac.service
#install -Dm744 data/networkmanager/99_update_pamac_tray /etc/NetworkManager/dispatcher.d/99_update_pamac_tray
install -Dm644 data/polkit/org.manjaro.pamac.policy /usr/share/polkit-1/actions/org.manjaro.pamac.policy
uninstall:
rm -f /usr/share/icons/16x16/apps/system-software-install.png
rm -f /usr/share/icons/24x24/status/pamac-tray-no-update.png
rm -f /usr/share/icons/24x24/status/pamac-tray-update.png
rm -f /usr/share/icons/32x32/apps/system-software-install.png
rm -f /usr/share/locale/*/LC_MESSAGES/pamac.mo
rm -f /usr/bin/pamac-daemon /usr/bin/pamac-updater /usr/bin/pamac-tray /usr/bin/pamac-manager /usr/bin/pamac-install
rm -f /etc/xdg/autostart/pamac-tray.desktop
rm -f /usr/share/applications/pamac-manager.desktop /usr/share/applications/pamac-updater.desktop /usr/share/applications/pamac-install.desktop
rm -f /etc/pamac.conf
rm -f /etc/dbus-1/system.d/org.manjaro.pamac.conf
rm -f /usr/share/dbus-1/system-services/org.manjaro.pamac.service
rm -f /usr/lib/systemd/system/pamac.service
rm -f /usr/share/polkit-1/actions/org.manjaro.pamac.policy

11
README
View File

@ -1 +1,12 @@
A DBus daemon and Gtk3 frontend for libalpm written in Vala
Features:
- Alpm bindings for Vala
- a DBus daemon to perform every tasks with root access using polkit to check authorizations
- a Gtk3 Package Manager
- a Gtk3 Updates Manager
- a Tray icon with configurable periodic refresh and updates notifications
- a complete AUR support:
* multiple words search capability
* Enable/Disable check updates from AUR
* Build and update your AUR packages in a integrated terminal using yaourt

View File

@ -128,4 +128,4 @@ Type=Application
Icon=system-software-install
StartupNotify=true
NoDisplay=true
MimeType=application/x-xz-compressed-tar;
MimeType=application/x-alpm-package;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 431 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 488 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 598 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 619 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 745 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 501 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,8 @@
<?xml version="1.0"?>
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
<mime-type type="application/x-alpm-package">
<generic-icon name="package-x-generic"/>
<comment>Alpm Package</comment>
<glob pattern="*.pkg.tar.xz"/>
</mime-type>
</mime-info>

View File

@ -14,12 +14,4 @@
<allow_active>auth_admin_keep</allow_active>
</defaults>
</action>
<action id="org.manjaro.pamac.write_config">
<message>Authentication is required</message>
<defaults>
<allow_any>no</allow_any>
<allow_inactive>no</allow_inactive>
<allow_active>auth_admin_keep</allow_active>
</defaults>
</action>
</policyconfig>

278
examples/pactree.vala Normal file
View File

@ -0,0 +1,278 @@
/*
* pactree.vala - a simple dependency tree viewer translated in Vala
*
* Copyright (C) 2014 Guillaume Benoit <guillaume@manjaro.org>
* Copyright (c) 2010-2011 Pacman Development Team <pacman-dev@archlinux.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// Compile with: valac --pkg=libalpm --vapidir=../vapi --Xcc=-I../util ../util/alpm-util.c pactree.vala -o pactree
using Alpm;
/* output */
string provides;
string unresolvable;
string branch_tip1;
string branch_tip2;
int indent_size;
/* color */
string branch1_color;
string branch2_color;
string leaf1_color;
string leaf2_color;
string color_off;
/* globals */
Handle handle;
unowned DB localdb;
Alpm.List<string?> walked = null;
Alpm.List<string?> provisions = null;
/* options */
bool color;
bool graphviz;
bool linear;
int max_depth;
bool reverse;
bool unique;
string dbpath;
const OptionEntry[] options = {
{ "dbpath", 'b', 0, OptionArg.STRING, ref dbpath, "set an alternate database location", "path" },
{ "color", 'c', 0, OptionArg.NONE, ref color, "colorize output", null },
{ "depth", 'd', 0, OptionArg.INT, ref max_depth, "limit the depth of recursion", "number" },
{ "graph", 'g', 0, OptionArg.NONE, ref graphviz, "generate output for graphviz", null },
{ "linear", 'l', 0, OptionArg.NONE, ref linear, "enable linear output", null },
{ "reverse", 'r', 0, OptionArg.NONE, ref reverse, "show reverse dependencies", null },
{ "unique", 'u', 0, OptionArg.NONE, ref unique, "show dependencies with no duplicates (implies -l)", null },
{ null }
};
static void init_options() {
/* initialize options */
color = false;
graphviz = false;
linear = false;
max_depth = -1;
reverse = false;
unique = false;
dbpath = "/var/lib/pacman";
/* output */
provides = " provides";
unresolvable = " [unresolvable]";
branch_tip1 = "|--";
branch_tip2 = "+--";
indent_size = 3;
/* color */
branch1_color = "\033[0;33m"; /* yellow */
branch2_color = "\033[0;37m"; /* white */
leaf1_color = "\033[1;32m"; /* bold green */
leaf2_color = "\033[0;32m"; /* green */
color_off = "\033[0m";
}
static int parse_options(ref unowned string[] args) {
var opts = new OptionContext("");
opts.set_help_enabled(true);
opts.add_main_entries(options, null);
try {
bool b = opts.parse(ref args);
if (!b) {
stderr.puts(opts.get_help(false, null));
return 1;
}
}
catch (OptionError e)
{
stderr.puts("Unable to parse options : " + e.message + "\n");
return 1;
}
/* there must be (at least) one argument left */
if (args.length == 1) return 1;
/* unique implies linear */
if (unique) linear = true;
/* no color */
if (!color) {
branch1_color = branch2_color = "";
leaf1_color = leaf2_color = "";
color_off = "";
}
/* linear */
if (linear) {
provides = "";
branch_tip1 = branch_tip2 = "";
indent_size = 0;
}
return 0;
}
static void local_init() {
Alpm.Errno error;
handle = new Handle ("/", dbpath, out error);
assert (error == 0);
localdb = handle.localdb;
assert (localdb != null);
}
static int main (string[] args) {
init_options();
int ret = parse_options(ref args);
if (ret != 0) return ret;
local_init();
string? target_name = args[1];
unowned Package? pkg = find_satisfier(localdb.pkgcache, target_name);
if (pkg == null) {
stderr.printf("Error: package '%s' not found\n", target_name);
return 1;
}
/* begin writing */
print_start(pkg.name, target_name);
if(reverse)
walk_reverse_deps(pkg, 1);
else
walk_deps(pkg, 1);
print_end();
return 0;
}
static void print_text(string? pkg, string? provision, int depth)
{
int indent_sz = (depth + 1) * indent_size;
if ((pkg == null) && (provision == null)) return;
if (pkg == null) {
/* we failed to resolve provision */
stdout.printf("%s%*s%s%s%s%s%s\n", branch1_color, indent_sz, branch_tip1,
leaf1_color, provision, branch1_color, unresolvable, color_off);
} else if ((provision != null) && (provision != pkg)) {
/* pkg provides provision */
stdout.printf("%s%*s%s%s%s%s %s%s%s\n", branch2_color, indent_sz, branch_tip2,
leaf1_color, pkg, leaf2_color, provides, leaf1_color, provision,
color_off);
} else {
/* pkg is a normal package */
stdout.printf("%s%*s%s%s%s\n", branch1_color, indent_sz, branch_tip1, leaf1_color,
pkg, color_off);
}
}
/**
* walk dependencies in reverse, showing packages which require the target
*/
static void walk_reverse_deps(Package pkg, int depth) {
if((max_depth >= 0) && (depth > max_depth)) return;
walked.add(pkg.name);
unowned Alpm.List<string?> required_by = pkg.compute_requiredby ();
foreach(string? i in required_by) {
string pkgname = i;
if (walked.find_str(pkgname) != null) {
/* if we've already seen this package, don't print in "unique" output
* and don't recurse */
if (!unique) print(pkg.name, pkgname, null, depth);
} else {
print(pkg.name, pkgname, null, depth);
walk_reverse_deps(localdb.get_pkg(pkgname), depth + 1);
}
}
}
/**
* walk dependencies, showing dependencies of the target
*/
static void walk_deps(Package pkg, int depth)
{
if((max_depth >= 0) && (depth > max_depth)) return;
walked.add(pkg.name);
foreach (unowned Depend depend in pkg.depends) {
string depname = depend.name;
unowned Package? provider = find_satisfier (localdb.pkgcache, depname);
if (provider != null) {
string provname = provider.name;
if (walked.find_str (provname) != null) {
/* if we've already seen this package, don't print in "unique" output
* and don't recurse */
if (!unique) {
print (pkg.name, provname, depname, depth);
}
} else {
print (pkg.name, provname, depname, depth);
walk_deps(provider, depth + 1);
}
} else {
/* unresolvable package */
print(pkg.name, null, depname, depth);
}
}
}
static void print_graph(string parentname, string? pkgname, string? depname)
{
if(depname != null) {
stdout.printf("\"%s\" -> \"%s\" [color=chocolate4];\n", parentname, depname);
if((pkgname != null) && (depname != pkgname) && (provisions.find_str(depname) != null)) {
stdout.printf("\"%s\" -> \"%s\" [arrowhead=none, color=grey];\n", depname, pkgname);
provisions.add(depname);
}
} else if(pkgname != null) {
stdout.printf("\"%s\" -> \"%s\" [color=chocolate4];\n", parentname, pkgname);
}
}
/* parent depends on dep which is satisfied by pkg */
static void print(string? parentname, string? pkgname, string? depname, int depth)
{
if(graphviz) {
print_graph(parentname, pkgname, depname);
} else {
print_text(pkgname, depname, depth);
}
}
static void print_start(string pkgname, string provname)
{
if(graphviz) {
stdout.printf("digraph G { START [color=red, style=filled];\n" +
"node [style=filled, color=green];\n" +
" \"START\" -> \"%s\";\n", pkgname);
} else {
print_text(pkgname, provname, 0);
}
}
static void print_end()
{
if(graphviz) {
/* close graph output */
stdout.printf("}\n");
}
}

View File

@ -1,10 +0,0 @@
./pamac-daemon.py
./pamac-manager.py
./pamac-updater.py
./pamac-tray.py
./pamac-install.py
./pamac/transaction.py
./pamac/common.py
./gui/manager.ui
./gui/updater.ui
./gui/dialogs.ui

View File

@ -1,721 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<interface>
<requires lib="gtk+" version="3.6"/>
<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="icon_name">system-software-install</property>
<property name="type_hint">dialog</property>
<property name="urgency_hint">True</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="icon_name">system-software-install</property>
<property name="type_hint">dialog</property>
<property name="urgency_hint">True</property>
<property name="has_resize_grip">False</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>
<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="shadow_type">in</property>
<property name="min_content_width">400</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="editable">False</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">True</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="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="urgency_hint">True</property>
<property name="has_resize_grip">False</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="modal">True</property>
<property name="window_position">center-on-parent</property>
<property name="type_hint">dialog</property>
<property name="urgency_hint">True</property>
<property name="has_resize_grip">False</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="GtkAdjustment" id="adjustment1">
<property name="lower">1</property>
<property name="upper">10000</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkWindow" id="PreferencesWindow">
<property name="can_focus">False</property>
<property name="border_width">5</property>
<property name="title" translatable="yes">Pamac Preferences</property>
<property name="window_position">center</property>
<property name="default_width">300</property>
<property name="default_height">250</property>
<property name="icon_name">system-software-install</property>
<signal name="delete-event" handler="on_PreferencesWindow_delete_event" swapped="no"/>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkNotebook" id="notebook1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<object class="GtkBox" id="box2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkCheckButton" id="EnableAURButton">
<property name="label" translatable="yes">Enable AUR support</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">Allow Pamac to search and install packages from AUR</property>
<property name="focus_on_click">False</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="RemoveUnrequiredDepsButton">
<property name="label" translatable="yes">Remove unrequired dependencies</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">When removing a package, also remove those dependencies that are not required by other packages</property>
<property name="focus_on_click">False</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox" id="box3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel" id="RefreshPeriodLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">3</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="RefreshPeriodSpinButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="tooltip_text" translatable="yes">How often to check for updates, value in hours</property>
<property name="margin_right">3</property>
<property name="caps_lock_warning">False</property>
<property name="input_purpose">number</property>
<property name="adjustment">adjustment1</property>
<property name="numeric">True</property>
<property name="update_policy">if-valid</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">2</property>
</packing>
</child>
</object>
</child>
<child type="tab">
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Options</property>
</object>
<packing>
<property name="tab_fill">False</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButtonBox" id="buttonbox2">
<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="PreferencesValidButton">
<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_PreferencesValidButton_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="PreferencesCloseButton">
<property name="label">gtk-close</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_PreferencesCloseButton_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">1</property>
</packing>
</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="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>
<property name="show_expanders">False</property>
<child internal-child="selection">
<object class="GtkTreeSelection" id="treeview-selection5">
<property name="mode">none</property>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="treeviewcolumn1">
<property name="sizing">autosize</property>
<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="GtkListStore" id="transaction_sum">
<columns>
<!-- column-name action -->
<column type="gchararray"/>
<!-- column-name packages -->
<column type="gchararray"/>
</columns>
</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">
<property name="mode">none</property>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="_action">
<property name="sizing">autosize</property>
<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">
<property name="sizing">autosize</property>
<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>
</interface>

View File

@ -1,40 +0,0 @@
#! /usr/bin/python3
# -*- coding:utf-8 -*-
# pamac - A Python implementation of alpm
# Copyright (C) 2013 Guillaume Benoit <guillaume@manjaro.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
from gi.repository import GObject
from pamac import common, transaction
import dbus
def handle_updates(updates):
transaction.StopDaemon()
loop.quit()
loop = GObject.MainLoop()
if not common.pid_file_exists():
bus = dbus.SystemBus()
bus.add_signal_receiver(handle_updates, dbus_interface = "org.manjaro.pamac", signal_name = "EmitAvailableUpdates")
transaction.get_dbus_methods()
try:
transaction.CheckUpdates()
except:
pass
else:
loop.run()

View File

@ -1,833 +0,0 @@
#! /usr/bin/python3
# -*- coding:utf-8 -*-
# pamac - A Python implementation of alpm
# Copyright (C) 2013-2014 Guillaume Benoit <guillaume@manjaro.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
from gi.repository import GObject
import re
import pyalpm
from multiprocessing import Process
from pamac import config, common, aur
# i18n
import locale
locale.setlocale(locale.LC_ALL, '')
import gettext
gettext.bindtextdomain('pamac', '/usr/share/locale')
gettext.textdomain('pamac')
_ = gettext.gettext
def format_error(data):
errstr = data[0].strip('\n')
errno = data[1]
detail = data[2]
if detail:
# detail is a list of '\n' terminated strings
return '{}:\n'.format(errstr) + ''.join(i for i in detail)
else:
return errstr
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.providers = []
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.local_packages = set()
self.aur_updates_checked = False
self.aur_updates_pkgs = []
self.localdb = None
self.syncdbs = None
self.get_handle()
def get_handle(self):
self.handle = config.handle()
self.localdb = self.handle.get_localdb()
self.syncdbs = self.handle.get_syncdbs()
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_local_packages(self):
self.local_packages = set()
sync_pkg = None
for pkg in self.localdb.pkgcache:
for db in self.syncdbs:
sync_pkg = db.get_pkg(pkg.name)
if sync_pkg:
break
if not sync_pkg:
self.local_packages.add(pkg.name)
def check_finished_commit(self):
if self.task.is_alive():
return True
else:
self.get_handle()
return False
@dbus.service.signal('org.manjaro.pamac')
def EmitAction(self, action):
pass
@dbus.service.signal('org.manjaro.pamac')
def EmitActionLong(self, action):
pass
@dbus.service.signal('org.manjaro.pamac')
def EmitNeedDetails(self, need):
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
@dbus.service.signal('org.manjaro.pamac')
def EmitLogError(self, message):
pass
@dbus.service.signal('org.manjaro.pamac')
def EmitLogWarning(self, message):
pass
@dbus.service.signal('org.manjaro.pamac', signature = '(ba(ssssu))')
def EmitAvailableUpdates(self, updates):
pass
@dbus.service.signal('org.manjaro.pamac')
def EmitTransactionStart(self, message):
pass
@dbus.service.signal('org.manjaro.pamac')
def EmitTransactionDone(self, message):
pass
@dbus.service.signal('org.manjaro.pamac')
def EmitTransactionError(self, message):
pass
@dbus.service.signal('org.manjaro.pamac')
def EmitReloadConfig(self, message):
# recheck aur updates next time
self.aur_updates_checked = False
# reload config
config.pamac_conf.reload()
def cb_event(self, event, tupel):
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 = 'pamac-search'
elif event == 'ALPM_EVENT_CHECKDEPS_DONE':
if self.warning:
self.EmitLogWarning(self.warning)
self.warning = ''
elif event == 'ALPM_EVENT_FILECONFLICTS_START':
action = _('Checking file conflicts')+'...'
action_long = action+'\n'
icon = 'pamac-search'
elif event == 'ALPM_EVENT_FILECONFLICTS_DONE':
pass
elif event == 'ALPM_EVENT_RESOLVEDEPS_START':
action = _('Resolving dependencies')+'...'
action_long = action+'\n'
icon = 'pamac-setup'
elif event == 'ALPM_EVENT_RESOLVEDEPS_DONE':
if self.warning:
self.EmitLogWarning(self.warning)
self.warning = ''
elif event == 'ALPM_EVENT_INTERCONFLICTS_START':
action = _('Checking inter conflicts')+'...'
action_long = action+'\n'
icon = 'pamac-search'
elif event == 'ALPM_EVENT_INTERCONFLICTS_DONE':
if self.warning:
self.EmitLogWarning(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 = 'pamac-add'
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 = 'pamac-delete'
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 = 'pamac-update'
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 = '{} ({} => {})...\n'.format(string, tupel[1].version, tupel[0].version)
icon = 'pamac-add'
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 = '{} ({})...\n'.format(string, tupel[0].version)
icon = 'pamac-add'
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 = 'pamac-search'
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 = 'pamac-search'
elif event == 'ALPM_EVENT_LOAD_DONE':
pass
elif event == 'ALPM_EVENT_DELTA_INTEGRITY_START':
action = _('Checking delta integrity')+'...'
action_long = action+'\n'
icon = 'pamac-search'
elif event == 'ALPM_EVENT_DELTA_INTEGRITY_DONE':
pass
elif event == 'ALPM_EVENT_DELTA_PATCHES_START':
action = _('Applying deltas')+'...'
action_long = action+'\n'
icon = 'pamac-setup'
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 = 'pamac-setup'
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 = 'pamac-setup'
self.EmitNeedDetails(True)
elif event == 'ALPM_EVENT_RETRIEVE_START':
action = _('Downloading')+'...'
action_long = action+'\n'
icon = 'pamac-download'
elif event == 'ALPM_EVENT_DISKSPACE_START':
action = _('Checking available disk space')+'...'
action_long = action+'\n'
icon = 'pamac-search'
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 = 'pamac-search'
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
self.EmitAction(action)
if action_long != self.previous_action_long:
self.previous_action_long != action_long
self.EmitActionLong(action_long)
if icon != self.previous_icon:
self.previous_icon = icon
self.EmitIcon(icon)
print(event)
def cb_question(self, 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 be replaced by {pkgname2}').format(pkgname1 = data_tupel[0].name, pkgname2 = data_tupel[1].name)+'\n'
return 1 # Auto-remove conflicts in case of replaces
if event == 'ALPM_QUESTION_CONFLICT_PKG':
self.warning += _('{pkgname1} conflicts with {pkgname2}').format(pkgname1 = data_tupel[0], pkgname2 = data_tupel[1])+'\n'
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':
## In this case we populate providers with different choices
## the client will have to release transaction and re-init one
## with the chosen package added to it
self.providers.append(([pkg.name for pkg in data_tupel[0]], data_tupel[1]))
return 0 # return the first choice, this is not important because the transaction will be released
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 get not revoked key
if data_tupel[0] is 1: # revoked
return 0 # Do not get revoked key
def cb_log(self, level, line):
_logmask = pyalpm.LOG_ERROR | pyalpm.LOG_WARNING
if not (level & _logmask):
return
if level & pyalpm.LOG_ERROR:
#self.EmitLogError(line)
_error = _('Error: ')+line
self.EmitActionLong(_error)
self.EmitNeedDetails(True)
print(line)
elif level & pyalpm.LOG_WARNING:
self.warning += line
_warning = _('Warning: ')+line
self.EmitActionLong(_warning)
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):
if _target.endswith('.db'):
action = _('Refreshing {repo}').format(repo = _target.replace('.db', ''))+'...'
action_long = ''
icon = 'pamac-refresh'
else:
action = _('Downloading {pkgname}').format(pkgname = _target.replace('.pkg.tar.xz', ''))+'...'
action_long = action+'\n'
icon = 'pamac-download'
if self.total_size > 0:
percent = round((_transferred+self.already_transferred)/self.total_size, 2)
if _transferred+self.already_transferred <= self.total_size:
target = '{transferred}/{size}'.format(transferred = common.format_size(_transferred+self.already_transferred), size = common.format_size(self.total_size))
else:
target = ''
else:
percent = round(_transferred/_total, 2)
target = ''
if action != self.previous_action:
self.previous_action = action
self.EmitAction(action)
if action_long != self.previous_action_long:
self.previous_action_long = action_long
self.EmitActionLong(action_long)
if icon != self.previous_icon:
self.previous_icon = icon
self.EmitIcon(icon)
if target != self.previous_target:
self.previous_target = target
self.EmitTarget(target)
if percent != self.previous_percent:
self.previous_percent = percent
self.EmitPercent(percent)
elif _transferred == _total:
self.already_transferred += _total
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 percent == 0:
self.EmitTransactionStart('')
if target != self.previous_target:
self.previous_target = target
if percent != self.previous_percent:
self.EmitTarget('{}/{}'.format(str(i), str(n)))
self.previous_percent = percent
self.EmitPercent(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)})
# We would like an infinite timeout, but dbus-python won't allow it.
# Pass the longest timeout dbus-python will accept
(is_authorized,is_challenge,details) = policykit_authority.CheckAuthorization(Subject, action, {'': ''}, dbus.UInt32(1), '',timeout=2147483)
return is_authorized
@dbus.service.method('org.manjaro.pamac', 'si', 's', sender_keyword='sender', connection_keyword='connexion')
def SetPkgReason(self, pkgname, reason, sender=None, connexion=None):
try:
authorized = self.policykit_test(sender,connexion,'org.manjaro.pamac.commit')
except dbus.exceptions.DBusException as e:
return _('Authentication failed')
else:
if authorized:
error = ''
try:
pkg = self.localdb.get_pkg(pkgname)
if pkg:
self.handle.set_pkgreason(pkg, reason)
except Exception as e:
error = format_error(e.args)
return error
else :
return _('Authentication failed')
@dbus.service.method('org.manjaro.pamac', '', 's', async_callbacks=('success', 'nosuccess'))
def CheckUpdates(self, success, nosuccess):
success('')
syncfirst = False
updates = []
_ignorepkgs = set()
self.get_handle()
for group in self.handle.ignoregrps:
db = self.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:
pkg = self.localdb.get_pkg(name)
if pkg:
_ignorepkgs.add(pkg.name)
if config.syncfirst:
for name in config.syncfirst:
pkg = self.localdb.get_pkg(name)
if pkg:
candidate = pyalpm.sync_newversion(pkg, self.syncdbs)
if candidate:
syncfirst = True
updates.append((candidate.name, candidate.version, candidate.db.name, '', candidate.download_size))
if not updates:
if config.enable_aur:
if not self.aur_updates_checked:
self.get_local_packages()
self.local_packages -= _ignorepkgs
for pkg in self.localdb.pkgcache:
if not pkg.name in _ignorepkgs:
candidate = pyalpm.sync_newversion(pkg, self.syncdbs)
if candidate:
updates.append((candidate.name, candidate.version, candidate.db.name, '', candidate.download_size))
self.local_packages.discard(pkg.name)
if config.enable_aur:
if not self.aur_updates_checked:
if self.local_packages:
self.aur_updates_pkgs = aur.multiinfo(self.local_packages)
self.aur_updates_checked = True
for aur_pkg in self.aur_updates_pkgs:
if self.localdb.get_pkg(aur_pkg.name):
comp = pyalpm.vercmp(aur_pkg.version, self.localdb.get_pkg(aur_pkg.name).version)
if comp == 1:
updates.append((aur_pkg.name, aur_pkg.version, aur_pkg.db.name, aur_pkg.tarpath, aur_pkg.download_size))
self.EmitAvailableUpdates((syncfirst, updates))
@dbus.service.method('org.manjaro.pamac', 'b', '')
def Refresh(self, force_update):
def refresh():
self.target = ''
self.percent = 0
error = ''
for db in self.syncdbs:
try:
self.t = self.handle.init_transaction()
db.update(force = bool(force_update))
self.t.release()
except pyalpm.error as e:
print(e)
error += format_error(e.args)
break
if error:
self.EmitTransactionError(error)
else:
self.EmitTransactionDone('')
self.task = Process(target=refresh)
self.task.start()
GObject.timeout_add(100, self.check_finished_commit)
@dbus.service.method('org.manjaro.pamac', 'a{sb}', 's')
def Init(self, options):
error = ''
try:
self.t = self.handle.init_transaction(**options)
print('Init:',self.t.flags)
except pyalpm.error as e:
error = format_error(e.args)
finally:
return error
@dbus.service.method('org.manjaro.pamac', 'b', 's')
def Sysupgrade(self, downgrade):
error = ''
try:
self.t.sysupgrade(downgrade = bool(downgrade))
except pyalpm.error as e:
error = format_error(e.args)
self.t.release()
finally:
return error
@dbus.service.method('org.manjaro.pamac', 's', 's')
def Remove(self, pkgname):
error = ''
try:
pkg = self.localdb.get_pkg(pkgname)
if pkg is not None:
self.t.remove_pkg(pkg)
except pyalpm.error as e:
error = format_error(e.args)
finally:
return error
@dbus.service.method('org.manjaro.pamac', 's', 's')
def Add(self, pkgname):
error = ''
try:
for db in self.syncdbs:
# this is a security, in case of virtual package it will
# choose the first provider, the choice should have been
# done by the client
pkg = pyalpm.find_satisfier(db.pkgcache, pkgname)
if pkg:
self.t.add_pkg(pkg)
break
except pyalpm.error as e:
error = format_error(e.args)
finally:
return error
@dbus.service.method('org.manjaro.pamac', 's', 's')
def Load(self, tarball_path):
error = ''
try:
pkg = self.handle.load_pkg(tarball_path)
if pkg:
self.t.add_pkg(pkg)
except pyalpm.error:
error = _('{pkgname} is not a valid path or package name').format(pkgname = tarball_path)
finally:
return error
def check_extra_modules(self):
to_add = set(pkg.name for pkg in self.t.to_add)
to_remove = set(pkg.name for pkg in self.t.to_remove)
to_check = [pkg for pkg in self.t.to_add]
already_checked = set(pkg.name for pkg in to_check)
depends = [to_check]
# get installed kernels and modules
pkgs = self.localdb.search('linux')
installed_kernels = set()
installed_modules = set()
for pkg in pkgs:
match = re.match("(linux[0-9]{2,3})(.*)", pkg.name)
if match:
installed_kernels.add(match.group(1))
if match.group(2):
installed_modules.add(match.group(2))
for pkg in self.t.to_add:
match = re.match("(linux[0-9]{2,3})(.*)", pkg.name)
if match:
installed_kernels.add(match.group(1))
if match.group(2):
installed_modules.add(match.group(2))
# check in to_remove if there is a kernel and if so, auto-remove the corresponding modules
for pkg in self.t.to_remove:
match = re.match("(linux[0-9]{2,3})(.*)", pkg.name)
if match:
if not match.group(2):
installed_kernels.discard(match.group(1))
for module in installed_modules:
pkgname = match.group(1)+module
if not pkgname in to_remove:
_pkg = self.localdb.get_pkg(pkgname)
if _pkg:
# Check we won't remove a third party kernel
third_party = False
for provide in _pkg.provides:
if 'linux=' in provide:
third_party = True
if not third_party:
to_remove.add(pkgname)
self.t.remove_pkg(_pkg)
# start loops to check pkgs
i = 0
while depends[i]:
# add a empty list for new pkgs to check next loop
depends.append([])
# start to check one pkg
for pkg in depends[i]:
# check if the current pkg is a kernel and if so, check if a module is required to install
match = re.match("(linux[0-9]{2,3})(.*)", pkg.name)
if match:
if not match.group(2): # match pkg is a kernel
for module in installed_modules:
pkgname = match.group(1) + module
if not self.localdb.get_pkg(pkgname):
for db in self.syncdbs:
_pkg = db.get_pkg(pkgname)
if _pkg:
if not _pkg.name in already_checked:
depends[i+1].append(_pkg)
already_checked.add(_pkg.name)
if not _pkg.name in to_add | to_remove:
to_add.add(_pkg.name)
self.t.add_pkg(_pkg)
break
# check if the current pkg is a kernel module and if so, install it for all installed kernels
match = re.match("(linux[0-9]{2,3})(.*-modules)", pkg.name)
if match:
for kernel in installed_kernels:
pkgname = kernel + match.group(2)
if not self.localdb.get_pkg(pkgname):
for db in self.syncdbs:
_pkg = db.get_pkg(pkgname)
if _pkg:
if not _pkg.name in already_checked:
depends[i+1].append(_pkg)
already_checked.add(_pkg.name)
if not _pkg.name in to_add | to_remove:
to_add.add(_pkg.name)
self.t.add_pkg(_pkg)
break
for depend in pkg.depends:
found_depend = pyalpm.find_satisfier(self.localdb.pkgcache, depend)
if not found_depend:
for db in self.syncdbs:
found_depend = pyalpm.find_satisfier(db.pkgcache, depend)
if found_depend:
break
if found_depend:
# add the dep in list to check its deps in next loop
if not found_depend.name in already_checked:
depends[i+1].append(found_depend)
already_checked.add(found_depend.name)
i += 1
# end of the loop
@dbus.service.method('org.manjaro.pamac', '', 'a(ass)')
def Prepare(self):
error = ''
self.providers.clear()
self.check_extra_modules()
try:
self.t.prepare()
except pyalpm.error as e:
error = format_error(e.args)
self.t.release()
else:
for pkg in self.t.to_remove:
if pkg.name in config.holdpkg:
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:
try:
summ = len(self.t.to_add) + len(self.t.to_remove)
except pyalpm.error:
return [((), error)]
if summ == 0:
self.t.release()
return [((), _('Nothing to do'))]
elif error:
return [((), error)]
elif self.providers:
return self.providers
else:
return [((), '')]
@dbus.service.method('org.manjaro.pamac', '', 'a(ss)')
def To_Remove(self):
_list = []
try:
for pkg in self.t.to_remove:
_list.append((pkg.name, pkg.version))
except:
pass
return _list
@dbus.service.method('org.manjaro.pamac', '', 'a(ssi)')
def To_Add(self):
_list = []
try:
for pkg in self.t.to_add:
_list.append((pkg.name, pkg.version, pkg.download_size))
except:
pass
return _list
@dbus.service.method('org.manjaro.pamac', '', '')
def Interrupt(self):
def interrupt():
try:
self.t.interrupt()
except:
pass
try:
self.t.release()
except:
pass
finally:
common.rm_lock_file()
self.task.terminate()
interrupt()
@dbus.service.method('org.manjaro.pamac', '', '', sender_keyword='sender', connection_keyword='connexion', async_callbacks=('success', 'nosuccess'))
def Commit(self, success, nosuccess, sender=None, connexion=None):
def commit():
error = ''
try:
self.t.commit()
except pyalpm.error as e:
error = format_error(e.args)
#except dbus.exceptions.DBusException:
#pass
finally:
self.t.release()
if self.warning:
self.EmitLogWarning(self.warning)
self.warning = ''
if error:
self.EmitTransactionError(error)
else:
self.EmitTransactionDone(_('Transaction successfully finished'))
success('')
try:
authorized = self.policykit_test(sender,connexion,'org.manjaro.pamac.commit')
except dbus.exceptions.DBusException as e:
self.EmitTransactionError(_('Authentication failed'))
else:
if authorized:
self.task = Process(target=commit)
self.task.start()
GObject.timeout_add(100, self.check_finished_commit)
else :
self.t.release()
self.EmitTransactionError(_('Authentication failed'))
@dbus.service.method('org.manjaro.pamac', '', '')
def Release(self):
try:
self.t.release()
except:
pass
@dbus.service.method('org.manjaro.pamac')
def StopDaemon(self):
try:
self.t.release()
except:
pass
common.rm_pid_file()
mainloop.quit()
@dbus.service.method('org.manjaro.pamac', 'a(ss)', '', sender_keyword='sender', connection_keyword='connexion')
def WriteConfig(self, array, sender=None, connexion=None):
try:
authorized = self.policykit_test(sender,connexion,'org.manjaro.pamac.write_config')
except dbus.exceptions.DBusException as e:
self.EmitLogError(_('Authentication failed'))
else:
if authorized:
with open('/etc/pamac.conf', 'r') as conffile:
data = conffile.readlines()
i = 0
while i < len(data):
line = data[i].strip()
if len(line) == 0:
i += 1
continue
if line[0] == '#':
line = line.lstrip('#')
if line == '\n':
i += 1
continue
old_key, equal, old_value = [x.strip() for x in line.partition('=')]
for tupel in array:
new_key = tupel[0]
new_value = tupel[1]
if old_key == new_key:
# i is equal to the line number where we find the key in the file
if new_key in config.SINGLE_OPTIONS:
data[i] = '{} = {}\n'.format(new_key, new_value)
elif new_key in config.BOOLEAN_OPTIONS:
if new_value == 'False':
data[i] = '#{}\n'.format(new_key)
else:
data[i] = '{}\n'.format(new_key)
i += 1
with open('/etc/pamac.conf', 'w') as conffile:
conffile.writelines(data)
self.EmitReloadConfig('')
else:
self.EmitLogError(_('Authentication failed'))
GObject.threads_init()
DBusGMainLoop(set_as_default = True)
myservice = PamacDBusService()
mainloop = GObject.MainLoop()
mainloop.run()

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -1,56 +0,0 @@
#! /usr/bin/python3
# -*- coding:utf-8 -*-
# pamac - A Python implementation of alpm
# Copyright (C) 2013 Guillaume Benoit <guillaume@manjaro.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
from gi.repository import GObject
from pamac import common, transaction
import dbus
def handle_reply(reply):
print('check updates done')
transaction.CheckUpdates()
def handle_error(error):
transaction.StopDaemon()
common.rm_pid_file()
print('check updates failed')
loop.quit()
def handle_updates(updates):
common.rm_pid_file()
transaction.StopDaemon()
loop.quit()
loop = GObject.MainLoop()
if not common.pid_file_exists():
common.write_pid_file()
print('checking updates')
bus = dbus.SystemBus()
bus.add_signal_receiver(handle_reply, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionDone")
bus.add_signal_receiver(handle_error, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionError")
bus.add_signal_receiver(handle_updates, dbus_interface = "org.manjaro.pamac", signal_name = "EmitAvailableUpdates")
transaction.get_dbus_methods()
try:
transaction.Refresh(False)
except:
pass
else:
loop.run()

View File

@ -1,152 +0,0 @@
#! /usr/bin/python3
# -*- coding:utf-8 -*-
# pamac - A Python implementation of alpm
# Copyright (C) 2013-2014 Guillaume Benoit <guillaume@manjaro.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
from gi.repository import Gtk, GObject, Notify
from subprocess import call
import dbus
from dbus.mainloop.glib import DBusGMainLoop
from threading import Thread
from time import sleep
from pamac import common, config
# i18n
import gettext
gettext.bindtextdomain('pamac', '/usr/share/locale')
gettext.textdomain('pamac')
_ = gettext.gettext
update_icon = 'pamac-tray-update'
update_info = _('{number} available updates')
one_update_info = _('1 available update')
noupdate_icon = 'pamac-tray-no-update'
noupdate_info = _('Your system is up-to-date')
icon = noupdate_icon
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'))
self.menuItem.set_image(Gtk.Image.new_from_icon_name('system-software-update', Gtk.IconSize.MENU))
self.menuItem.connect('activate', self.execute_update, self.statusIcon)
self.menu.append(self.menuItem)
self.menuItem = Gtk.ImageMenuItem(_('Package Manager'))
self.menuItem.set_image(Gtk.Image.new_from_icon_name('system-software-install', Gtk.IconSize.MENU))
self.menuItem.connect('activate', self.execute_manager, self.statusIcon)
self.menu.append(self.menuItem)
self.menuItem = Gtk.ImageMenuItem(_('Quit'))
self.menuItem.set_image(Gtk.Image.new_from_icon_name('application-exit', Gtk.IconSize.MENU))
self.menuItem.connect('activate', self.quit_tray, self.statusIcon)
self.menu.append(self.menuItem)
self.statusIcon.connect('popup-menu', self.popup_menu_cb, self.menu)
self.statusIcon.connect('activate', self.activate_cb)
self.update_icon(icon, info)
def execute_update(self, widget, event, data = None):
Thread(target = call, args = (['/usr/bin/pamac-updater'],)).start()
def execute_manager(self, widget, event, data = None):
Thread(target = call, args = (['/usr/bin/pamac-manager'],)).start()
def quit_tray(self, widget, data = None):
Gtk.main_quit()
def popup_menu_cb(self, widget, button, time, data = None):
if button == 3:
if data:
data.show_all()
data.popup(None, None, Gtk.StatusIcon.position_menu, self.statusIcon, 3, time)
def activate_cb(self, widget, data = None):
if icon == update_icon:
Thread(target = call, args = (['/usr/bin/pamac-updater'],)).start()
def update_icon(self, icon, info):
self.statusIcon.set_from_icon_name(icon)
self.statusIcon.set_tooltip_markup(info)
def set_visible(self, boolean):
self.statusIcon.set_visible(boolean)
def refresh():
Thread(target = call, args = (['/usr/bin/pamac-refresh'],)).start()
return True
def check_updates():
Thread(target = call, args = (['/usr/bin/pamac-check_updates'],)).start()
locked = False
def check_pacman_running():
global locked
if locked:
if not common.lock_file_exists():
locked = False
check_updates()
else:
if common.lock_file_exists():
if not common.pid_file_exists():
locked = True
sleep(0.5)
return True
def set_icon(update_data):
global icon
global info
syncfirst, updates = update_data
if updates:
icon = update_icon
if len(updates) == 1:
info = one_update_info
else:
info = update_info.format(number = len(updates))
if not common.pid_file_exists():
Notify.Notification.new(_('Update Manager'), info, 'system-software-update').show()
else:
icon = noupdate_icon
info = noupdate_info
print(info)
tray.update_icon(icon, info)
def launch_refresh_timeout():
# GObject timeout is in milliseconds
global refresh_timeout_id
refresh_timeout_id = GObject.timeout_add(config.refresh_period*3600*1000, refresh)
def relaunch_refresh_timeout(msg):
config.pamac_conf.reload()
GObject.source_remove(refresh_timeout_id)
launch_refresh_timeout()
DBusGMainLoop(set_as_default = True)
bus = dbus.SystemBus()
bus.add_signal_receiver(set_icon, dbus_interface = "org.manjaro.pamac", signal_name = "EmitAvailableUpdates")
bus.add_signal_receiver(relaunch_refresh_timeout, dbus_interface = "org.manjaro.pamac", signal_name = "EmitReloadConfig")
tray = Tray()
Notify.init(_('Update Manager'))
refresh()
launch_refresh_timeout()
GObject.idle_add(check_pacman_running)
Gtk.main()

View File

@ -1,229 +0,0 @@
#! /usr/bin/python3
# -*- coding:utf-8 -*-
# pamac - A Python implementation of alpm
# Copyright (C) 2013-2014 Guillaume Benoit <guillaume@manjaro.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
from gi.repository import Gtk, Gdk
import pyalpm
import dbus
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')
UpdaterApplyButton = interface.get_object('UpdaterApplyButton')
update_top_label.set_markup('<big><b>{}</b></big>'.format(_('Your system is up-to-date')))
update_bottom_label.set_markup('')
UpdaterApplyButton.set_sensitive(False)
def have_updates():
while Gtk.events_pending():
Gtk.main_iteration()
UpdaterWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
while Gtk.events_pending():
Gtk.main_iteration()
update_listore.clear()
update_top_label.set_justify(Gtk.Justification.CENTER)
updates = transaction.available_updates[1]
if not updates:
update_bottom_label.set_markup('')
update_top_label.set_markup('<big><b>{}</b></big>'.format(_('Your system is up-to-date')))
UpdaterApplyButton.set_sensitive(False)
else:
UpdaterApplyButton.set_sensitive(True)
dsize = 0
for name, version, db, tarpath, size in updates:
dsize += size
if size:
size_str = common.format_size(size)
else:
size_str = ''
update_listore.append([name+' '+version, size_str])
if dsize == 0:
update_bottom_label.set_markup('')
else:
update_bottom_label.set_markup('<b>{} {}</b>'.format(_('Total download size:'), common.format_size(dsize)))
if len(updates) == 1:
update_top_label.set_markup('<big><b>{}</b></big>'.format(_('1 available update')))
else:
update_top_label.set_markup('<big><b>{}</b></big>'.format(_('{number} available updates').format(number = len(updates))))
UpdaterWindow.get_window().set_cursor(None)
def handle_error(error):
UpdaterWindow.get_window().set_cursor(None)
while Gtk.events_pending():
Gtk.main_iteration()
if error:
if not 'DBus.Error.NoReply' in str(error):
print(error)
transaction.ErrorDialog.format_secondary_text(error)
response = transaction.ErrorDialog.run()
if response:
transaction.ErrorDialog.hide()
transaction.ProgressWindow.hide()
transaction.get_handle()
transaction.mark_needed_pkgs_as_dep()
def handle_reply(reply):
while Gtk.events_pending():
Gtk.main_iteration()
if transaction.to_build:
transaction.build_next()
elif reply:
transaction.Release()
transaction.ProgressCloseButton.set_visible(True)
transaction.action_icon.set_from_icon_name('dialog-information', Gtk.IconSize.BUTTON)
transaction.progress_label.set_text(str(reply))
transaction.progress_bar.set_text('')
end_iter = transaction.progress_buffer.get_end_iter()
transaction.progress_buffer.insert(end_iter, str(reply))
transaction.get_handle()
else:
UpdaterWindow.get_window().set_cursor(None)
transaction.get_handle()
transaction.get_updates()
transaction.mark_needed_pkgs_as_dep()
def handle_updates(updates):
transaction.ProgressWindow.hide()
transaction.available_updates = updates
have_updates()
def reload_config(msg):
config.pamac_conf.reload()
transaction.get_updates()
def on_UpdaterWindow_delete_event(*args):
transaction.StopDaemon()
common.rm_pid_file()
Gtk.main_quit()
def on_TransValidButton_clicked(*args):
UpdaterWindow.get_window().set_cursor(None)
transaction.ConfDialog.hide()
while Gtk.events_pending():
Gtk.main_iteration()
transaction.finalize()
def on_TransCancelButton_clicked(*args):
UpdaterWindow.get_window().set_cursor(None)
transaction.ProgressWindow.hide()
transaction.progress_buffer.delete(transaction.progress_buffer.get_start_iter(),transaction.progress_buffer.get_end_iter())
transaction.ConfDialog.hide()
while Gtk.events_pending():
Gtk.main_iteration()
transaction.Release()
transaction.to_add.clear()
transaction.to_update.clear()
transaction.to_build.clear()
def on_ProgressCloseButton_clicked(*args):
UpdaterWindow.get_window().set_cursor(None)
transaction.progress_buffer.delete(transaction.progress_buffer.get_start_iter(),transaction.progress_buffer.get_end_iter())
transaction.need_details_handler(False)
transaction.get_updates()
def on_ProgressCancelButton_clicked(*args):
transaction.to_add.clear()
transaction.to_update.clear()
transaction.to_build.clear()
transaction.Interrupt()
UpdaterWindow.get_window().set_cursor(None)
transaction.ProgressWindow.hide()
while Gtk.events_pending():
Gtk.main_iteration()
def on_UpdaterPreferencesButton_clicked(*args):
transaction.EnableAURButton.set_active(config.enable_aur)
transaction.RemoveUnrequiredDepsButton.set_active(config.recurse)
transaction.RefreshPeriodSpinButton.set_value(config.refresh_period)
transaction.PreferencesWindow.show()
def on_Updater_ApplyButton_clicked(*args):
UpdaterWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
while Gtk.events_pending():
Gtk.main_iteration()
error = transaction.sysupgrade(show_updates = False)
if error:
handle_error(error)
def on_Updater_RefreshButton_clicked(*args):
UpdaterWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
while Gtk.events_pending():
Gtk.main_iteration()
transaction.refresh()
def on_Updater_CloseButton_clicked(*args):
transaction.StopDaemon()
common.rm_pid_file()
Gtk.main_quit()
signals = {'on_ChooseButton_clicked' : transaction.on_ChooseButton_clicked,
'on_progress_textview_size_allocate' : transaction.on_progress_textview_size_allocate,
'on_choose_renderertoggle_toggled' : transaction.on_choose_renderertoggle_toggled,
'on_PreferencesCloseButton_clicked' : transaction.on_PreferencesCloseButton_clicked,
'on_PreferencesWindow_delete_event' : transaction.on_PreferencesWindow_delete_event,
'on_PreferencesValidButton_clicked' : transaction.on_PreferencesValidButton_clicked,
'on_TransValidButton_clicked' :on_TransValidButton_clicked,
'on_TransCancelButton_clicked' :on_TransCancelButton_clicked,
'on_ProgressCloseButton_clicked' : on_ProgressCloseButton_clicked,
'on_ProgressCancelButton_clicked' : on_ProgressCancelButton_clicked,
'on_UpdaterWindow_delete_event' : on_UpdaterWindow_delete_event,
'on_UpdaterPreferencesButton_clicked': on_UpdaterPreferencesButton_clicked,
'on_Updater_ApplyButton_clicked' : on_Updater_ApplyButton_clicked,
'on_Updater_RefreshButton_clicked' : on_Updater_RefreshButton_clicked,
'on_Updater_CloseButton_clicked' : on_Updater_CloseButton_clicked}
def config_dbus_signals():
bus = dbus.SystemBus()
bus.add_signal_receiver(handle_reply, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionDone")
bus.add_signal_receiver(handle_error, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionError")
bus.add_signal_receiver(handle_updates, dbus_interface = "org.manjaro.pamac", signal_name = "EmitAvailableUpdates")
bus.add_signal_receiver(reload_config, dbus_interface = "org.manjaro.pamac", signal_name = "EmitReloadConfig")
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)
transaction.get_dbus_methods()
transaction.config_dbus_signals()
config_dbus_signals()
UpdaterWindow.show()
UpdaterWindow.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.WATCH))
while Gtk.events_pending():
Gtk.main_iteration()
transaction.refresh()
Gtk.main()

551
pamac.pot
View File

@ -1,551 +0,0 @@
# Translation of Pamac.
# Copyright (C) 2007-2012 Free Software Foundation, Inc.
# This file is distributed under the same license as the Pamac package.
# Guillaume Benoit <guillaume@manjaro.org>, 2013-2014.
#
msgid ""
msgstr ""
"Project-Id-Version: pamac 0.9.8\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-03-30 15:09+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: data/polkit/org.manjaro.pamac.policy:10
msgid "Authentication is required"
msgstr ""
#: pamac-daemon.py:162
msgid "Checking dependencies"
msgstr ""
#: pamac-daemon.py:170
msgid "Checking file conflicts"
msgstr ""
#: pamac-daemon.py:176
msgid "Resolving dependencies"
msgstr ""
#: pamac-daemon.py:184
msgid "Checking inter conflicts"
msgstr ""
#: pamac-daemon.py:192
#, python-brace-format
msgid "Installing {pkgname}"
msgstr ""
#: pamac-daemon.py:200
#, python-brace-format
msgid "Removing {pkgname}"
msgstr ""
#: pamac-daemon.py:208
#, python-brace-format
msgid "Upgrading {pkgname}"
msgstr ""
#: pamac-daemon.py:216
#, python-brace-format
msgid "Downgrading {pkgname}"
msgstr ""
#: pamac-daemon.py:224
#, python-brace-format
msgid "Reinstalling {pkgname}"
msgstr ""
#: pamac-daemon.py:232
msgid "Checking integrity"
msgstr ""
#: pamac-daemon.py:239
msgid "Loading packages files"
msgstr ""
#: pamac-daemon.py:245
msgid "Checking delta integrity"
msgstr ""
#: pamac-daemon.py:251
msgid "Applying deltas"
msgstr ""
#: pamac-daemon.py:257
msgid "Generating {} with {}"
msgstr ""
#: pamac-daemon.py:261
msgid "Generation succeeded!"
msgstr ""
#: pamac-daemon.py:264
msgid "Generation failed."
msgstr ""
#: pamac-daemon.py:267
#, python-brace-format
msgid "Configuring {pkgname}"
msgstr ""
#: pamac-daemon.py:272
msgid "Downloading"
msgstr ""
#: pamac-daemon.py:276
msgid "Checking available disk space"
msgstr ""
#: pamac-daemon.py:286
msgid "Checking keyring"
msgstr ""
#: pamac-daemon.py:292
msgid "Downloading required keys"
msgstr ""
#: pamac-daemon.py:311
#, python-brace-format
msgid "{pkgname1} will be replaced by {pkgname2}"
msgstr ""
#: pamac-daemon.py:314
#, python-brace-format
msgid "{pkgname1} conflicts with {pkgname2}"
msgstr ""
#: pamac-daemon.py:339
msgid "Error: "
msgstr ""
#: pamac-daemon.py:345
msgid "Warning: "
msgstr ""
#: pamac-daemon.py:359
#, python-brace-format
msgid "Refreshing {repo}"
msgstr ""
#: pamac-daemon.py:363 pamac/transaction.py:608
#, python-brace-format
msgid "Downloading {pkgname}"
msgstr ""
#: pamac-daemon.py:427 pamac-daemon.py:439 pamac-daemon.py:762
#: pamac-daemon.py:770 pamac-daemon.py:793 pamac-daemon.py:827
msgid "Authentication failed"
msgstr ""
#: pamac-daemon.py:572 pamac-install.py:127
#, python-brace-format
msgid "{pkgname} is not a valid path or package name"
msgstr ""
#: pamac-daemon.py:685
#, python-brace-format
msgid ""
"The transaction cannot be performed because it needs to remove {pkgname1} "
"which is a locked package"
msgstr ""
#: pamac-daemon.py:695 pamac/transaction.py:449
msgid "Nothing to do"
msgstr ""
#: pamac-daemon.py:757
msgid "Transaction successfully finished"
msgstr ""
#: pamac-manager.py:103 pamac-manager.py:134 pamac-manager.py:135
#: pamac-manager.py:150 pamac-manager.py:159 pamac-manager.py:180
#: pamac-manager.py:305 pamac-manager.py:657 pamac-manager.py:715
#: pamac-manager.py:785
msgid "No package found"
msgstr ""
#: pamac-manager.py:204 pamac-manager.py:266
msgid "local"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:249 pamac-manager.py:371
msgid "Installed"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:252
msgid "Uninstalled"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:255
msgid "Orphans"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:227 pamac/transaction.py:757
msgid "To install"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:238 pamac/transaction.py:737
msgid "To remove"
msgstr ""
#: pamac-manager.py:361
msgid "Licenses"
msgstr ""
#: pamac-manager.py:366
msgid "Depends On"
msgstr ""
#: pamac-manager.py:374
msgid "Optional Deps"
msgstr ""
#: pamac-manager.py:377
msgid "Required By"
msgstr ""
#: pamac-manager.py:379
msgid "Provides"
msgstr ""
#: pamac-manager.py:381
msgid "Replaces"
msgstr ""
#: pamac-manager.py:383
msgid "Conflicts With"
msgstr ""
#: pamac-manager.py:388
msgid "Repository"
msgstr ""
#: pamac-manager.py:390 gui/manager.ui:557
msgid "Groups"
msgstr ""
#: pamac-manager.py:392
msgid "Compressed Size"
msgstr ""
#: pamac-manager.py:393
msgid "Download Size"
msgstr ""
#: pamac-manager.py:395
msgid "Installed Size"
msgstr ""
#: pamac-manager.py:396
msgid "Packager"
msgstr ""
#: pamac-manager.py:397
msgid "Architecture"
msgstr ""
#: pamac-manager.py:400
msgid "Install Date"
msgstr ""
#: pamac-manager.py:402
msgid "Explicitly installed"
msgstr ""
#: pamac-manager.py:404
msgid "Installed as a dependency for another package"
msgstr ""
#: pamac-manager.py:406
msgid "Unknown"
msgstr ""
#: pamac-manager.py:407
msgid "Install Reason"
msgstr ""
#: pamac-manager.py:412
msgid "Signatures"
msgstr ""
#: pamac-manager.py:416
msgid "Backup files"
msgstr ""
#: pamac-manager.py:597
#, python-brace-format
msgid ""
"{pkgname} has {number} uninstalled optional deps.\n"
"Please choose those you would like to install:"
msgstr ""
#: pamac-manager.py:660
msgid "Deselect"
msgstr ""
#: pamac-manager.py:665
msgid "Remove"
msgstr ""
#: pamac-manager.py:671
msgid "Reinstall"
msgstr ""
#: pamac-manager.py:682
msgid "Install optional deps"
msgstr ""
#: pamac-manager.py:687
msgid "Mark as explicitly installed"
msgstr ""
#: pamac-manager.py:691
msgid "Install"
msgstr ""
#: pamac-manager.py:702
msgid "Install with optional deps"
msgstr ""
#: pamac-manager.py:1009 pamac-updater.py:214 pamac-install.py:160
msgid "Pamac is already running"
msgstr ""
#: pamac-updater.py:44 pamac-updater.py:59 pamac-tray.py:40
msgid "Your system is up-to-date"
msgstr ""
#: pamac-updater.py:74 pamac/transaction.py:787
msgid "Total download size:"
msgstr ""
#: pamac-updater.py:76 pamac-tray.py:38
msgid "1 available update"
msgstr ""
#: pamac-updater.py:78 pamac-tray.py:37
#, python-brace-format
msgid "{number} available updates"
msgstr ""
#: pamac-tray.py:50 pamac-tray.py:126 pamac-tray.py:148 gui/updater.ui:24
msgid "Update Manager"
msgstr ""
#: pamac-tray.py:54 gui/manager.ui:324
msgid "Package Manager"
msgstr ""
#: pamac-tray.py:58
msgid "Quit"
msgstr ""
#: pamac-install.py:66
msgid ""
"Some updates are available.\n"
"Please update your system first"
msgstr ""
#: pamac-install.py:72 pamac/transaction.py:406 pamac/transaction.py:799
msgid "Preparing"
msgstr ""
#: pamac/transaction.py:94 gui/dialogs.ui:369
msgid "How often to check for updates, value in hours"
msgstr ""
#: pamac/transaction.py:192
#, python-brace-format
msgid ""
"{pkgname} is provided by {number} packages.\n"
"Please choose those you would like to install:"
msgstr ""
#: pamac/transaction.py:257
msgid "Refreshing"
msgstr ""
#: pamac/transaction.py:341 pamac/transaction.py:380
#, python-brace-format
msgid "{pkgname} depends on {dependname} but it is not installable"
msgstr ""
#: pamac/transaction.py:384
#, python-brace-format
msgid "Failed to get {pkgname} archive from AUR"
msgstr ""
#: pamac/transaction.py:552 pamac/transaction.py:558
msgid "Build process failed."
msgstr ""
#: pamac/transaction.py:644
#, python-brace-format
msgid "Building {pkgname}"
msgstr ""
#: pamac/transaction.py:685
msgid "Checking for updates"
msgstr ""
#: pamac/transaction.py:735
msgid "Transaction Summary"
msgstr ""
#: pamac/transaction.py:743
msgid "To downgrade"
msgstr ""
#: pamac/transaction.py:751
msgid "To build"
msgstr ""
#: pamac/transaction.py:765
msgid "To reinstall"
msgstr ""
#: pamac/transaction.py:774
msgid "To update"
msgstr ""
#: pamac/common.py:30
#, python-format
msgid "%.1f KiB"
msgstr ""
#: pamac/common.py:33
#, python-format
msgid "%.2f MiB"
msgstr ""
#: gui/manager.ui:8
msgid "About Pamac"
msgstr ""
#: gui/manager.ui:13
msgid "Copyright © 2013 Guillaume Benoit"
msgstr ""
#: gui/manager.ui:14
msgid "A gtk3 frontend for pyalpm"
msgstr ""
#: gui/manager.ui:44
msgid "Pamac History"
msgstr ""
#: gui/manager.ui:160
msgid "View History"
msgstr ""
#: gui/manager.ui:170 gui/manager.ui:212
msgid "Install local packages"
msgstr ""
#: gui/manager.ui:344
msgid "Refresh"
msgstr ""
#: gui/manager.ui:362
msgid "Apply changes"
msgstr ""
#: gui/manager.ui:380
msgid "Cancel"
msgstr ""
#: gui/manager.ui:453
msgid "Search in AUR"
msgstr ""
#: gui/manager.ui:511
msgid "Search"
msgstr ""
#: gui/manager.ui:604 gui/manager.ui:696
msgid "State"
msgstr ""
#: gui/manager.ui:651
msgid "Repos"
msgstr ""
#: gui/manager.ui:709
msgid "Name"
msgstr ""
#: gui/manager.ui:722
msgid "Version"
msgstr ""
#: gui/manager.ui:735
msgid "Repo"
msgstr ""
#: gui/manager.ui:748
msgid "Size"
msgstr ""
#: gui/manager.ui:850
msgid "Infos"
msgstr ""
#: gui/manager.ui:914
msgid "Deps"
msgstr ""
#: gui/manager.ui:983
msgid "Details"
msgstr ""
#: gui/manager.ui:1012
msgid "Files"
msgstr ""
#: gui/dialogs.ui:70
msgid "Progress"
msgstr ""
#: gui/dialogs.ui:162
msgid "details"
msgstr ""
#: gui/dialogs.ui:292
msgid "Pamac Preferences"
msgstr ""
#: gui/dialogs.ui:316
msgid "Enable AUR support"
msgstr ""
#: gui/dialogs.ui:320
msgid "Allow Pamac to search and install packages from AUR"
msgstr ""
#: gui/dialogs.ui:333
msgid "Remove unrequired dependencies"
msgstr ""
#: gui/dialogs.ui:337
msgid ""
"When removing a package, also remove those dependencies that are not "
"required by other packages"
msgstr ""
#: gui/dialogs.ui:396
msgid "Options"
msgstr ""
#: gui/dialogs.ui:465
msgid "Choose"
msgstr ""
#: gui/dialogs.ui:579
msgid "Summary"
msgstr ""

View File

View File

@ -1,221 +0,0 @@
#! /usr/bin/python3
# -*- coding:utf-8 -*-
# pamac - A Python implementation of alpm
# Copyright (C) 2013 Guillaume Benoit <guillaume@manjaro.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
import os
import urllib
import Namcap
import requests
import tarfile
# i18n
import gettext
import locale
locale.bindtextdomain('pamac', '/usr/share/locale')
gettext.bindtextdomain('pamac', '/usr/share/locale')
gettext.textdomain('pamac')
_ = gettext.gettext
aur_url = 'http://aur.archlinux.org'
rpc_url = aur_url + '/rpc.php'
srcpkgdir = '/tmp/pamac'
class AURPkg():
def __init__(self, pkginfo):
self.db = FakeDB()
self.isize = None
self.size = None
self.download_size = 0
keys = pkginfo.keys()
if 'URL' in keys:
self.url = pkginfo['URL']
if 'URLPath' in keys:
self.tarpath = pkginfo['URLPath']
if 'name' in keys:
self.name = pkginfo['name']
else:
self.name = pkginfo['Name']
if 'version' in keys:
self.version = pkginfo['version']
else:
self.version = pkginfo['Version']
if 'desc' in keys:
self.desc = pkginfo['desc']
else:
self.desc = pkginfo['Description']
if 'licenses' in keys:
self.licenses = pkginfo['licenses']
elif 'License' in keys:
self.licenses = [pkginfo['License']]
else:
self.licenses = []
if 'source' in keys:
self.source = pkginfo['source']
else:
self.source = []
if 'orig_depends' in keys:
self.depends = pkginfo['orig_depends']
else:
self.depends = []
if 'orig_optdepends' in keys:
self.optdepends = pkginfo['orig_optdepends']
else:
self.optdepends = []
#~ if 'orig_provides' in keys:
#~ self.provides = pkginfo['orig_provides']
#~ else:
#~ self.provides = []
if 'orig_makedepends' in keys:
self.makedepends = pkginfo['orig_makedepends']
else:
self.makedepends = []
#~ if 'replaces' in keys:
#~ self.replaces = pkginfo['replaces']
#~ else:
#~ self.replaces = []
#~ if 'conflicts' in keys:
#~ self.conflicts = pkginfo['conflicts']
#~ else:
#~ self.conflicts = []
#~ if 'groups' in keys:
#~ self.groups = pkginfo['groups']
#~ else:
#~ self.groups = []
def __repr__(self):
return '{}-{}'.format(self.name, self.version)
def __eq__(self, other):
if hasattr(other, 'name') and hasattr(other, 'version'):
if self.name == other.name and self.version == other.version:
return True
return False
class FakeDB():
def __init__(self):
self.name = 'AUR'
def get_pkgs(pkgbuild_path):
pkgbuild_info = Namcap.package.load_from_pkgbuild(pkgbuild_path)
pkgs = []
if pkgbuild_info.is_split:
for infos in pkgbuild_info.subpackages:
pkg = AURPkg(infos)
pkgs.append(pkg)
else:
pkg = AURPkg(pkgbuild_info)
pkgs.append(pkg)
return pkgs
def search(args):
spec = {'type':'search', 'arg':args}
try:
r = requests.get(rpc_url, params = spec)
r.raise_for_status()
except Exception as e:
print(e)
return []
else:
results_dict = r.json()
results = results_dict['results']
pkgs = []
if results:
for result in results:
pkgs.append(AURPkg(result))
return pkgs
def info(pkgname):
spec = {'type':'info', 'arg':pkgname}
try:
r = requests.get(rpc_url, params = spec)
r.raise_for_status()
except Exception as e:
print(e)
return []
else:
results_dict = r.json()
if results_dict['type'] == 'error':
print('failed to get infos about {} from AUR'.format(pkgname))
return None
else:
result = results_dict['results']
if result:
pkg = AURPkg(result)
return pkg
else:
print('failed to get infos about {} from AUR'.format(pkgname))
return None
def multiinfo(pkgnames):
spec = {'type':'multiinfo', 'arg[]':pkgnames}
try:
r = requests.get(rpc_url, params = spec)
r.raise_for_status()
except Exception as e:
print(e)
return []
else:
results_dict = r.json()
if results_dict['type'] == 'error':
print('failed to get infos about {} from AUR'.format(pkgnames))
return []
else:
pkgs = []
results = results_dict['results']
if results:
for result in results:
pkgs.append(AURPkg(result))
else:
print('failed to get infos about {} from AUR'.format(pkgnames))
return pkgs
def get_extract_tarball(pkg):
try:
r = requests.get(aur_url + pkg.tarpath)
r.raise_for_status()
except Exception as e:
print(e)
return None
else:
if not os.path.exists(srcpkgdir):
os.makedirs(srcpkgdir)
full_tarpath = os.path.join(srcpkgdir, os.path.basename(pkg.tarpath))
try:
with open(full_tarpath, 'wb') as f:
f.write(r.content)
except Exception as e:
print(e)
return None
else:
try:
tar = tarfile.open(full_tarpath)
tar.extractall(path = srcpkgdir)
except Exception as e:
print(e)
return None
else:
return os.path.join(srcpkgdir, get_name(pkg))
def get_name(pkg):
# the splitext is to remove the original extension
# which is tar.foo - currently foo is gz, but this can change
# the rstrip is to remove the trailing tar part.
if pkg.name not in pkg.tarpath:
return os.path.splitext(os.path.basename(pkg.tarpath))[0].rstrip('.tar')
return pkg.name

View File

@ -1,74 +0,0 @@
#! /usr/bin/python3
# -*- coding:utf-8 -*-
# pamac - A Python implementation of alpm
# Copyright (C) 2013 Guillaume Benoit <guillaume@manjaro.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# i18n
import gettext
gettext.bindtextdomain('pamac', '/usr/share/locale')
gettext.textdomain('pamac')
_ = gettext.gettext
def format_size(size):
KiB_size = size / 1024
if KiB_size < 1000:
size_string = _('%.1f KiB') % (KiB_size)
return size_string
else:
size_string = _('%.2f MiB') % (KiB_size / 1024)
return size_string
def format_pkg_name(name):
unwanted = ['>','<','=']
for i in unwanted:
index = name.find(i)
if index != -1:
name = name[0:index]
return name
from os.path import isfile, join
from os import getpid, remove
from pamac import config
pid_file = '/tmp/pamac.pid'
lock_file = join(config.pacman_conf.options['DBPath'], 'db.lck')
def lock_file_exists():
return isfile(lock_file)
def pid_file_exists():
return isfile(pid_file)
def write_pid_file():
with open(pid_file, "w") as _file:
_file.write(str(getpid()))
def rm_pid_file():
if isfile(pid_file):
remove(pid_file)
def rm_lock_file():
if isfile(lock_file):
remove(lock_file)
import time
def write_log_file(string):
with open('/var/log/pamac.log', 'a') as logfile:
logfile.write(time.strftime('[%Y-%m-%d %H:%M]') + ' {}\n'.format(string))

View File

@ -1,376 +0,0 @@
#! /usr/bin/python3
# -*- coding:utf-8 -*-
# pamac - A Python implementation of alpm
# Copyright (C) 2011 Rémy Oudompheng <remy@archlinux.org>
# Copyright (C) 2013-2014 Guillaume Benoit <guillaume@manjaro.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
import os
import glob
import argparse
import collections
import warnings
import pyalpm
class InvalidSyntax(Warning):
def __init__(self, filename, problem, arg):
self.filename = filename
self.problem = problem
self.arg = arg
def __str__(self):
return "unable to parse %s, %s: %r" % (self.filename, self.problem, self.arg)
# Options that may occur several times in a section. Their values should be
# accumulated in a list.
LIST_OPTIONS = (
'CacheDir',
'HoldPkg',
'SyncFirst',
'IgnoreGroup',
'IgnorePkg',
'NoExtract',
'NoUpgrade',
'Server'
)
SINGLE_OPTIONS = (
'RootDir',
'DBPath',
'GPGDir',
'LogFile',
'UseDelta',
'Architecture',
'XferCommand',
'CleanMethod',
'SigLevel',
'LocalFileSigLevel',
'RemoteFileSigLevel',
'RefreshPeriod'
)
BOOLEAN_OPTIONS = (
'UseSyslog',
'TotalDownload',
'CheckSpace',
'VerbosePkgLists',
'ILoveCandy',
'Color',
'EnableAUR',
'RemoveUnrequiredDeps'
)
def define_siglevel(default_level, conf_string):
for directive in conf_string.split():
affect_package = False
affect_database = False
if 'Package' in directive:
affect_package = True
elif 'Database' in directive:
affect_database = True
else:
affect_package = True
affect_database = True
if 'Never' in directive:
if affect_package:
default_level &= ~pyalpm.SIG_PACKAGE
default_level |= pyalpm.SIG_PACKAGE_SET
if affect_database:
default_level &= ~pyalpm.SIG_DATABASE
elif 'Optional' in directive:
if affect_package:
default_level |= pyalpm.SIG_PACKAGE
default_level |= pyalpm.SIG_PACKAGE_OPTIONAL
default_level |= pyalpm.SIG_PACKAGE_SET
if affect_database:
default_level |= pyalpm.SIG_DATABASE
default_level |= pyalpm.SIG_DATABASE_OPTIONAL
elif 'Required' in directive:
if affect_package:
default_level |= pyalpm.SIG_PACKAGE
default_level &= ~pyalpm.SIG_PACKAGE_OPTIONAL
default_level |= pyalpm.SIG_PACKAGE_SET
if affect_database:
default_level |= pyalpm.SIG_DATABASE
default_level &= ~pyalpm.SIG_DATABASE_OPTIONAL
elif 'TrustedOnly' in directive:
if affect_package:
default_level &= ~pyalpm.SIG_PACKAGE_MARGINAL_OK
default_level &= ~pyalpm.SIG_PACKAGE_UNKNOWN_OK
default_level |= pyalpm.SIG_PACKAGE_TRUST_SET
if affect_database:
default_level &= ~pyalpm.SIG_DATABASE_MARGINAL_OK
default_level &= ~pyalpm.SIG_DATABASE_UNKNOWN_OK
elif 'TrustAll' in directive:
if affect_package:
default_level |= pyalpm.SIG_PACKAGE_MARGINAL_OK
default_level |= pyalpm.SIG_PACKAGE_UNKNOWN_OK
default_level |= pyalpm.SIG_PACKAGE_TRUST_SET
if affect_database:
default_level |= pyalpm.SIG_DATABASE_MARGINAL_OK
default_level |= pyalpm.SIG_DATABASE_UNKNOWN_OK
else:
print('unrecognized siglevel: {}'.format(conf_string))
return default_level
def merge_siglevel(base_level, over_level):
if not over_level & pyalpm.SIG_PACKAGE_SET:
over_level |= base_level & pyalpm.SIG_PACKAGE
over_level |= base_level & pyalpm.SIG_PACKAGE_OPTIONAL
if not over_level & pyalpm.SIG_PACKAGE_TRUST_SET:
over_level |= base_level & pyalpm.SIG_PACKAGE_MARGINAL_OK
over_level |= base_level & pyalpm.SIG_PACKAGE_UNKNOWN_OK
return over_level
def pacman_conf_enumerator(path):
filestack = []
current_section = None
filestack.append(open(path))
while len(filestack) > 0:
f = filestack[-1]
line = f.readline()
if len(line) == 0:
# end of file
filestack.pop()
continue
line = line.strip()
if len(line) == 0:
continue
if line[0] == '#':
continue
if line[0] == '[' and line[-1] == ']':
current_section = line[1:-1]
continue
if not current_section:
raise InvalidSyntax(f.name, 'statement outside of a section', line)
# read key, value
key, equal, value = [x.strip() for x in line.partition('=')]
# include files
if equal == '=' and key == 'Include':
filestack.extend(open(f) for f in glob.glob(value))
continue
if current_section != 'options':
# repos only have the Server option
if key == 'Server' and equal == '=':
yield (current_section, 'Server', value)
elif key == 'SigLevel' and equal == '=':
yield (current_section, 'SigLevel', value)
else:
raise InvalidSyntax(f.name, 'invalid key for repository configuration', line)
continue
if equal == '=':
if key in LIST_OPTIONS:
for val in value.split():
yield (current_section, key, val)
elif key in SINGLE_OPTIONS:
yield (current_section, key, value)
else:
warnings.warn(InvalidSyntax(f.name, 'unrecognized option', key))
else:
if key in BOOLEAN_OPTIONS:
yield (current_section, key, 1)
else:
warnings.warn(InvalidSyntax(f.name, 'unrecognized option', key))
class PacmanConfig():
def __init__(self, conf = None, options = None):
self.options = {}
self.repos = collections.OrderedDict()
self.options["RootDir"] = "/"
self.options["DBPath"] = "/var/lib/pacman"
self.options["GPGDir"] = "/etc/pacman.d/gnupg/"
self.options["LogFile"] = "/var/log/pacman.log"
self.options["Architecture"] = os.uname()[-1]
self.default_siglevel = pyalpm.SIG_PACKAGE | pyalpm.SIG_PACKAGE_OPTIONAL | pyalpm.SIG_DATABASE | pyalpm.SIG_DATABASE_OPTIONAL
if conf:
self.load_from_file(conf)
if options:
self.load_from_options(options)
def load_from_file(self, filename):
for section, key, value in pacman_conf_enumerator(filename):
if section == 'options':
if key == 'Architecture' and value == 'auto':
continue
if key in LIST_OPTIONS:
self.options.setdefault(key, []).append(value)
else:
self.options[key] = value
# define here default_siglevel to make it usable for servers
if key == 'SigLevel':
self.default_siglevel = define_siglevel(self.default_siglevel, self.options["SigLevel"])
else:
if not self.repos.get(section):
self.repos[section] = ([], self.default_siglevel)
if key == 'Server':
self.repos[section][0].append(value)
elif key == 'SigLevel':
urls = self.repos[section][0].copy()
new_siglevel = define_siglevel(self.repos[section][1], value)
self.repos[section] = (urls, new_siglevel)
if not "CacheDir" in self.options:
self.options["CacheDir"]= ["/var/cache/pacman/pkg"]
def load_from_options(self, options):
global _logmask
if options.root:
self.options["RootDir"] = options.root
if options.dbpath:
self.options["DBPath"] = options.dbpath
if options.gpgdir:
self.options["GPGDir"] = options.gpgdir
if options.arch:
self.options["Architecture"] = options.arch
if options.logfile:
self.options["LogFile"] = options.logfile
if options.cachedir:
self.options["CacheDir"] = [option.cachedir]
if options.debug:
_logmask = 0xffff
def initialize_alpm(self):
h = pyalpm.Handle(self.options["RootDir"], self.options["DBPath"])
h.arch = self.options["Architecture"]
h.logfile = self.options["LogFile"]
h.gpgdir = self.options["GPGDir"]
h.cachedirs = self.options["CacheDir"]
if "IgnoreGroup" in self.options:
h.ignoregrps = self.options["IgnoreGroup"]
if "IgnorePkg" in self.options:
h.ignorepkgs = self.options["IgnorePkg"]
if "NoExtract" in self.options:
h.noextracts = self.options["NoExtract"]
if "NoUpgrade" in self.options:
h.noupgrades = self.options["NoUpgrade"]
if "UseSyslog" in self.options:
h.usesyslog = self.options["UseSyslog"]
if "CheckSpace" in self.options:
h.checkspace = self.options["CheckSpace"]
# register default siglevel, it should have been updated previously
h.siglevel = self.default_siglevel
# update localsiglevel
if "LocalFileSigLevel" in self.options:
localsiglevel = define_siglevel(self.default_siglevel, self.options["LocalFileSigLevel"])
localsiglevel = merge_siglevel(self.default_siglevel, localsiglevel)
else:
localsiglevel = self.default_siglevel
# define localsiglevel
h.localsiglevel = localsiglevel
# update remotesiglevel
if "RemoteFileSigLevel" in self.options:
remotesiglevel = define_siglevel(self.default_siglevel, self.options["RemoteFileSigLevel"])
remotesiglevel = merge_siglevel(self.default_siglevel, remotesiglevel)
else:
remotesiglevel = self.default_siglevel
# define remotesiglevel
h.remotesiglevel = remotesiglevel
# set sync databases
for repo, servers in self.repos.items():
db = h.register_syncdb(repo, servers[1])
db_servers = []
for rawurl in servers[0]:
url = rawurl.replace("$repo", repo)
url = url.replace("$arch", self.options["Architecture"])
db_servers.append(url)
db.servers = db_servers
return h
def __str__(self):
return("PacmanConfig(options={}, repos={})".format(self.options, self.repos))
def pamac_conf_enumerator(path):
filestack = []
current_section = None
filestack.append(open(path))
while len(filestack) > 0:
f = filestack[-1]
line = f.readline()
if len(line) == 0:
# end of file
filestack.pop()
continue
line = line.strip()
if len(line) == 0:
continue
if line[0] == '#':
continue
# read key, value
key, equal, value = [x.strip() for x in line.partition('=')]
if equal == '=':
if key in LIST_OPTIONS:
for val in value.split():
yield (current_section, key, val)
elif key in SINGLE_OPTIONS:
if key == 'RefreshPeriod':
yield (current_section, key, int(value))
else:
yield (current_section, key, value)
else:
warnings.warn(InvalidSyntax(f.name, 'unrecognized option', key))
else:
if key in BOOLEAN_OPTIONS:
yield (current_section, key, True)
else:
warnings.warn(InvalidSyntax(f.name, 'unrecognized option', key))
class PamacConfig():
def __init__(self, conf = None):
self.options = {}
self.options["RefreshPeriod"] = 3600*3
self.options["EnableAUR"] = False
self.options["RemoveUnrequiredDeps"] = False
if conf:
self.load_from_file(conf)
def load_from_file(self, filename):
for section, key, value in pamac_conf_enumerator(filename):
if key in LIST_OPTIONS:
self.options.setdefault(key, []).append(value)
else:
self.options[key] = value
self.set_global_variables()
def set_global_variables(self):
global refresh_period
global enable_aur
global recurse
refresh_period = self.options['RefreshPeriod']
enable_aur = self.options['EnableAUR']
recurse = self.options['RemoveUnrequiredDeps']
def reload(self):
self.options["EnableAUR"] = False
self.options["RemoveUnrequiredDeps"] = False
self.load_from_file("/etc/pamac.conf")
def __str__(self):
return("PamacConfig(options={})".format(self.options))
pacman_conf = PacmanConfig(conf = "/etc/pacman.conf")
handle = pacman_conf.initialize_alpm
pamac_conf = PamacConfig(conf = "/etc/pamac.conf")
holdpkg = []
syncfirst = []
if 'HoldPkg' in pacman_conf.options:
holdpkg = pacman_conf.options['HoldPkg']
if 'SyncFirst' in pacman_conf.options:
syncfirst = pacman_conf.options['SyncFirst']

View File

@ -1,864 +0,0 @@
#! /usr/bin/python3
# -*- coding:utf-8 -*-
# pamac - A Python implementation of alpm
# Copyright (C) 2013-2014 Guillaume Benoit <guillaume@manjaro.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
import pyalpm
from gi.repository import Gtk, GObject
from time import sleep
import subprocess
import os
import fnmatch
#import requests
#from ftplib import FTP
#from urllib.parse import urlparse
import dbus
from dbus.mainloop.glib import DBusGMainLoop
import signal
import re
from pamac import config, common, aur
to_remove = set()
to_add = set()
to_mark_as_dep = set()
to_update = set()
to_load = set()
available_updates = (False, [])
to_build = []
cancel_download = False
build_proc = None
make_depends = set()
base_devel = ('autoconf', 'automake', 'binutils', 'bison', 'fakeroot',
'file', 'findutils', 'flex', 'gawk', 'gcc', 'gettext',
'grep', 'groff', 'gzip', 'libtool', 'm4', 'make', 'patch',
'pkg-config', 'sed', 'sudo', 'texinfo', 'util-linux', 'which')
build_depends = set()
handle = None
syncdbs = None
localdb = None
colors_regexp = re.compile('\\033\[(\d;)?\d*m')
# i18n
import gettext
import locale
locale.bindtextdomain('pamac', '/usr/share/locale')
gettext.bindtextdomain('pamac', '/usr/share/locale')
gettext.textdomain('pamac')
_ = gettext.gettext
interface = Gtk.Builder()
interface.set_translation_domain('pamac')
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_expander = interface.get_object('progress_expander')
progress_textview = interface.get_object('progress_textview')
PreferencesWindow = interface.get_object('PreferencesWindow')
EnableAURButton = interface.get_object('EnableAURButton')
RemoveUnrequiredDepsButton = interface.get_object('RemoveUnrequiredDepsButton')
RefreshPeriodSpinButton = interface.get_object('RefreshPeriodSpinButton')
RefreshPeriodLabel = interface.get_object('RefreshPeriodLabel')
# Do it for transalation ease
RefreshPeriodLabel.set_markup(_('How often to check for updates, value in hours')+':')
progress_buffer = progress_textview.get_buffer()
DBusGMainLoop(set_as_default = True)
bus = dbus.SystemBus()
def get_dbus_methods():
proxy = bus.get_object('org.manjaro.pamac','/org/manjaro/pamac', introspect = False)
global Refresh
global CheckUpdates
global Init
global Sysupgrade
global Remove
global Add
global Load
global Prepare
global To_Remove
global To_Add
global Commit
global Interrupt
global Release
global StopDaemon
global SetPkgReason
global WriteConfig
SetPkgReason = proxy.get_dbus_method('SetPkgReason','org.manjaro.pamac')
Refresh = proxy.get_dbus_method('Refresh','org.manjaro.pamac')
CheckUpdates = proxy.get_dbus_method('CheckUpdates','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')
WriteConfig = proxy.get_dbus_method('WriteConfig','org.manjaro.pamac')
def config_dbus_signals():
bus.add_signal_receiver(action_handler, dbus_interface = "org.manjaro.pamac", signal_name = "EmitAction")
bus.add_signal_receiver(action_long_handler, dbus_interface = "org.manjaro.pamac", signal_name = "EmitActionLong")
bus.add_signal_receiver(icon_handler, dbus_interface = "org.manjaro.pamac", signal_name = "EmitIcon")
bus.add_signal_receiver(target_handler, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTarget")
bus.add_signal_receiver(percent_handler, dbus_interface = "org.manjaro.pamac", signal_name = "EmitPercent")
bus.add_signal_receiver(need_details_handler, dbus_interface = "org.manjaro.pamac", signal_name = "EmitNeedDetails")
bus.add_signal_receiver(transaction_start_handler, dbus_interface = "org.manjaro.pamac", signal_name = "EmitTransactionStart")
bus.add_signal_receiver(log_error, dbus_interface = "org.manjaro.pamac", signal_name = "EmitLogError")
bus.add_signal_receiver(log_warning, dbus_interface = "org.manjaro.pamac", signal_name = "EmitLogWarning")
def action_handler(action):
progress_label.set_text(action)
def action_long_handler(action_long):
global progress_buffer
end_iter = progress_buffer.get_end_iter()
progress_buffer.insert(end_iter, action_long)
def need_details_handler(need):
progress_expander.set_expanded(need)
def icon_handler(icon):
action_icon.set_from_icon_name(icon, Gtk.IconSize.BUTTON)
def target_handler(target):
progress_bar.set_text(target)
def percent_handler(percent):
if percent > 1:
progress_bar.pulse()
else:
progress_bar.set_fraction(percent)
def transaction_start_handler(msg):
ProgressCancelButton.set_visible(False)
def log_error(msg):
ErrorDialog.format_secondary_text(msg)
response = ErrorDialog.run()
while Gtk.events_pending():
Gtk.main_iteration()
if response:
ErrorDialog.hide()
def log_warning(msg):
WarningDialog.format_secondary_text(msg)
response = WarningDialog.run()
while Gtk.events_pending():
Gtk.main_iteration()
if response:
WarningDialog.hide()
def choose_provides(data):
virtual_dep = str(data[1])
providers = data[0]
choose_label.set_markup('<b>{}</b>'.format(_('{pkgname} is provided by {number} packages.\nPlease choose those you would like to install:').format(pkgname = virtual_dep, number = str(len(providers)))))
choose_list.clear()
for name in providers:
choose_list.append([False, str(name)])
lenght = len(to_add)
ChooseDialog.run()
if len(to_add) == lenght: # no choice was done by the user
to_add.add(choose_list.get(choose_list.get_iter_first(), 1)[0]) # add first provider
def on_choose_renderertoggle_toggled(widget, line):
choose_list[line][0] = not choose_list[line][0]
def on_ChooseButton_clicked(*args):
ChooseDialog.hide()
while Gtk.events_pending():
Gtk.main_iteration()
for row in choose_list:
if row[0] is True:
to_add.add(row[1].split(':')[0]) # split done in case of optdep choice
def on_progress_textview_size_allocate(*args):
#auto-scrolling method
adj = progress_textview.get_vadjustment()
adj.set_value(adj.get_upper() - adj.get_page_size())
def on_PreferencesValidButton_clicked(*args):
data = []
if EnableAURButton.get_active() != config.enable_aur:
data.append(('EnableAUR', str(EnableAURButton.get_active())))
if RemoveUnrequiredDepsButton.get_active() != config.recurse:
data.append(('RemoveUnrequiredDeps', str(RemoveUnrequiredDepsButton.get_active())))
if RefreshPeriodSpinButton.get_value() != config.refresh_period:
data.append(('RefreshPeriod', str(RefreshPeriodSpinButton.get_value_as_int())))
if data:
WriteConfig(data)
PreferencesWindow.hide()
def on_PreferencesCloseButton_clicked(*args):
PreferencesWindow.hide()
def on_PreferencesWindow_delete_event(*args):
PreferencesWindow.hide()
# return True is needed to not destroy the window
return True
def get_handle():
global handle
global syncdbs
global localdb
handle = config.handle()
syncdbs = handle.get_syncdbs()
localdb = handle.get_localdb()
def get_localpkg(name):
return localdb.get_pkg(name)
def get_syncpkg(name):
for repo in syncdbs:
pkg = repo.get_pkg(name)
if pkg:
return pkg
def refresh(force_update = False):
while Gtk.events_pending():
Gtk.main_iteration()
action_handler(_('Refreshing')+'...')
icon_handler('pamac-refresh')
target_handler('')
percent_handler(0)
ProgressCancelButton.set_visible(True)
ProgressCloseButton.set_visible(False)
progress_expander.set_visible(True)
ProgressWindow.show()
while Gtk.events_pending():
Gtk.main_iteration()
Refresh(force_update)
def init_transaction(**options):
return Init(dbus.Dictionary(options, signature='sb'))
def check_to_build():
global to_build
global to_add
global to_mark_as_dep
global make_depends
global build_depends
make_depends = set()
builds_depends = set()
# check if base_devel packages are installed
for name in base_devel:
if not pyalpm.find_satisfier(localdb.pkgcache, name):
make_depends.add(name)
already_checked = set()
build_order = []
i = 0
error = ''
while i < len(to_build):
while Gtk.events_pending():
Gtk.main_iteration()
pkg = to_build[i]
# if current pkg is not in build_order add it at the end of the list
if not pkg.name in build_order:
build_order.append(pkg.name)
# download end extract tarball from AUR
srcdir = aur.get_extract_tarball(pkg)
if srcdir:
# get PKGBUILD and parse it to create a new pkg object with makedeps and deps
new_pkgs = aur.get_pkgs(srcdir + '/PKGBUILD')
for new_pkg in new_pkgs:
while Gtk.events_pending():
Gtk.main_iteration()
print('checking', new_pkg.name)
# check if some makedeps must be installed
for makedepend in new_pkg.makedepends:
while Gtk.events_pending():
Gtk.main_iteration()
if not makedepend in already_checked:
if not pyalpm.find_satisfier(localdb.pkgcache, makedepend):
print('found make dep:',makedepend)
for db in syncdbs:
provider = pyalpm.find_satisfier(db.pkgcache, makedepend)
if provider:
break
if provider:
make_depends.add(provider.name)
already_checked.add(makedepend)
else:
# current makedep need to be built
raw_makedepend = common.format_pkg_name(makedepend)
if raw_makedepend in build_order:
# add it in build_order before pkg
build_order.remove(raw_makedepend)
index = build_order.index(pkg.name)
build_order.insert(index, raw_makedepend)
else:
# get infos about it
makedep_pkg = aur.info(raw_makedepend)
if makedep_pkg:
# add it in to_build so it will be checked
to_build.append(makedep_pkg)
# add it in build_order before pkg
index = build_order.index(pkg.name)
build_order.insert(index, raw_makedepend)
# add it in already_checked and to_add_as_as_dep
already_checked.add(raw_makedepend)
to_mark_as_dep.add(raw_makedepend)
else:
if error:
error += '\n'
error += _('{pkgname} depends on {dependname} but it is not installable').format(pkgname = pkg.name, dependname = makedepend)
# check if some deps must be installed or built
for depend in new_pkg.depends:
while Gtk.events_pending():
Gtk.main_iteration()
if not depend in already_checked:
if not pyalpm.find_satisfier(localdb.pkgcache, depend):
print('found dep:',depend)
for db in syncdbs:
provider = pyalpm.find_satisfier(db.pkgcache, depend)
if provider:
break
if provider:
# current dep need to be installed
build_depends.add(provider.name)
already_checked.add(depend)
else:
# current dep need to be built
raw_depend = common.format_pkg_name(depend)
if raw_depend in build_order:
# add it in build_order before pkg
build_order.remove(raw_depend)
index = build_order.index(pkg.name)
build_order.insert(index, raw_depend)
else:
# get infos about it
dep_pkg = aur.info(raw_depend)
if dep_pkg:
# add it in to_build so it will be checked
to_build.append(dep_pkg)
# add it in build_order before pkg
index = build_order.index(pkg.name)
build_order.insert(index, raw_depend)
# add it in already_checked and to_add_as_as_dep
already_checked.add(raw_depend)
to_mark_as_dep.add(raw_depend)
else:
if error:
error += '\n'
error += _('{pkgname} depends on {dependname} but it is not installable').format(pkgname = pkg.name, dependname = depend)
else:
if error:
error += '\n'
error += _('Failed to get {pkgname} archive from AUR').format(pkgname = pkg.name)
i += 1
if error:
return error
# add pkgname in make_depends and build_depends in to_add and to_mark_as_dep
for name in make_depends:
to_add.add(name)
to_mark_as_dep.add(name)
for name in build_depends:
to_add.add(name)
to_mark_as_dep.add(name)
# reorder to_build following build_order
to_build.sort(key = lambda pkg: build_order.index(pkg.name))
#print('order:', build_order)
print('to build:',to_build)
print('makedeps:',make_depends)
print('builddeps:',build_depends)
return error
def run(cascade = True, recurse = False):
if to_add or to_remove or to_load or to_build:
global progress_buffer
action_handler(_('Preparing')+'...')
icon_handler('pamac-setup')
target_handler('')
percent_handler(0)
progress_buffer.delete(progress_buffer.get_start_iter(), progress_buffer.get_end_iter())
ProgressCancelButton.set_visible(False)
ProgressCloseButton.set_visible(False)
progress_expander.set_visible(True)
ProgressWindow.show()
while Gtk.events_pending():
Gtk.main_iteration()
# we need to give some time to the window to refresh
sleep(0.1)
error = ''
if to_build:
# check if packages in to_build have deps or makedeps which need to be install first
error += check_to_build()
if not error:
if to_add or to_remove or to_load:
ProgressCancelButton.set_visible(True)
while Gtk.events_pending():
Gtk.main_iteration()
trans_flags = {'cascade': cascade, 'recurse': recurse}
error += init_transaction(**trans_flags)
if not error:
for name in to_add:
error += Add(name)
for name in to_remove:
error += Remove(name)
for path in to_load:
error += Load(path)
if not error:
error += prepare(**trans_flags)
if not error:
set_transaction_sum()
ConfDialog.show_all()
while Gtk.events_pending():
Gtk.main_iteration()
if error:
ProgressWindow.hide()
Release()
return(error)
else:
return (_('Nothing to do'))
def prepare(**trans_flags):
error = ''
ret = Prepare()
# ret type is a(ass) so [([''], '')]
if ret[0][0]: # providers are emitted
Release()
for item in ret:
choose_provides(item)
error += init_transaction(**trans_flags)
if not error:
for name in to_add:
error += Add(name)
for name in to_remove:
error += Remove(name)
for path in to_load:
error += Load(path)
if not error:
ret = Prepare()
if ret[0][1]:
error = str(ret[0][1])
elif ret[0][1]: # an error is emitted
error = str(ret[0][1])
return(error)
def check_finished_build(data):
def handle_timeout(*args):
raise Exception('timeout')
def no_handle_timeout(*args):
try:
pass
except:
pass
global to_build
global build_proc
path = data[0]
pkg = data[1]
if build_proc.poll() is None:
# Build no finished : read stdout to push it to text_buffer
# add a timeout to stop reading stdout if too long
# so the gui won't freeze
signal.signal(signal.SIGALRM, handle_timeout)
signal.setitimer(signal.ITIMER_REAL, 0.05) # 50 ms timeout
try:
line = build_proc.stdout.readline().decode(encoding='UTF-8')
line = re.sub(colors_regexp, '', line)
#print(line.rstrip('\n'))
progress_buffer.insert_at_cursor(line)
except Exception:
pass
else:
signal.signal(signal.SIGALRM, no_handle_timeout)
finally:
progress_bar.pulse()
while Gtk.events_pending():
Gtk.main_iteration()
return True
elif build_proc.poll() == 0:
# Build successfully finished
built = []
# parse again PKGBUILD to have new pkg objects in case of a pkgver() function
# was used so pkgver was changed during build process
new_pkgs = aur.get_pkgs(path + '/PKGBUILD')
# find built packages
for new_pkg in new_pkgs:
for item in os.listdir(path):
if os.path.isfile(os.path.join(path, item)):
# add a * before pkgver if there an epoch variable
if fnmatch.fnmatch(item, '{}-*{}-*.pkg.tar.?z'.format(new_pkg.name, new_pkg.version)):
built.append(os.path.join(path, item))
break
if built:
print('successfully built:', built)
build_proc = None
if pkg in to_build:
to_build.remove(pkg)
# install built packages
error = ''
error += init_transaction()
if not error:
for pkg_path in built:
error += Load(pkg_path)
if not error:
error += prepare()
if not error:
if To_Remove():
set_transaction_sum()
ConfDialog.show_all()
while Gtk.events_pending():
Gtk.main_iteration()
else:
finalize()
if error:
Release()
ProgressCancelButton.set_visible(False)
ProgressCloseButton.set_visible(True)
ErrorDialog.format_secondary_text(error)
response = ErrorDialog.run()
if response:
ErrorDialog.hide()
else:
ProgressCancelButton.set_visible(False)
ProgressCloseButton.set_visible(True)
action_long_handler(_('Build process failed.'))
return False
elif build_proc.poll() == 1:
# Build finish with an error
ProgressCancelButton.set_visible(False)
ProgressCloseButton.set_visible(True)
action_long_handler(_('Build process failed.'))
return False
def download(url_list, path):
def write_file(chunk):
nonlocal transferred
nonlocal f
if cancel_download:
if ftp:
ftp.quit()
raise Exception('Download cancelled')
return
f.write(chunk)
transferred += len(chunk)
if total_size > 0:
percent = round(transferred/total_size, 2)
percent_handler(percent)
if transferred <= total_size:
target = '{transferred}/{size}'.format(transferred = common.format_size(transferred), size = common.format_size(total_size))
else:
target = ''
target_handler(target)
while Gtk.events_pending():
Gtk.main_iteration()
global cancel_download
cancel_download = False
ftp = None
total_size = 0
transferred = 0
icon_handler('pamac-download')
ProgressCancelButton.set_visible(True)
ProgressCloseButton.set_visible(False)
parsed_urls = []
for url in url_list:
url_components = urlparse(url)
if url_components.scheme:
parsed_urls.append(url_components)
print(parsed_urls)
for url_components in parsed_urls:
if url_components.scheme == 'http':
total_size += int(requests.get(url).headers['Content-Length'])
elif url_components.scheme == 'ftp':
ftp = FTP(url_components.netloc)
ftp.login('anonymous', '')
total_size += int(ftp.size(url_components.path))
print(total_size)
for url_components in parsed_urls:
filename = url_components.path.split('/')[-1]
print(filename)
action = _('Downloading {pkgname}').format(pkgname = filename)+'...'
action_long = action+'\n'
action_handler(action)
action_long_handler(action_long)
ProgressWindow.show()
while Gtk.events_pending():
Gtk.main_iteration()
with open(os.path.join(path, filename), 'wb') as f:
if url_components.scheme == 'http':
try:
r = requests.get(url, stream = True)
for chunk in r.iter_content(1024):
if cancel_download:
raise Exception('Download cancelled')
break
else:
write_file(chunk)
except Exception as e:
print(e)
cancel_download = False
elif url_components.scheme == 'ftp':
try:
ftp = FTP(url_components.netloc)
ftp.login('anonymous', '')
ftp.retrbinary('RETR '+url_components.path, write_file, blocksize=1024)
except Exception as e:
print(e)
cancel_download = False
def build_next():
global build_proc
pkg = to_build[0]
path = os.path.join(aur.srcpkgdir, aur.get_name(pkg))
new_pkgs = aur.get_pkgs(path + '/PKGBUILD')
# sources are identicals for splitted packages
# (not complete) download(new_pkgs[0].source, path)
action = _('Building {pkgname}').format(pkgname = pkg.name)+'...'
action_handler(action)
action_long_handler(action+'\n')
icon_handler('pamac-setup')
target_handler('')
percent_handler(0)
ProgressCancelButton.set_visible(True)
ProgressCloseButton.set_visible(False)
progress_expander.set_visible(True)
progress_expander.set_expanded(True)
ProgressWindow.show()
build_proc = subprocess.Popen(["makepkg", "-cf"], cwd = path, stdout = subprocess.PIPE, stderr=subprocess.STDOUT)
while Gtk.events_pending():
Gtk.main_iteration()
GObject.timeout_add(100, check_finished_build, (path, pkg))
def finalize():
if To_Add() or To_Remove():
try:
Commit()
except dbus.exceptions.DBusException as e:
Release()
elif to_build:
# packages in to_build have no deps or makedeps
# so we build and install the first one
# the next ones will be built by the caller
build_next()
def mark_needed_pkgs_as_dep():
global to_mark_as_dep
for name in to_mark_as_dep.copy():
if get_localpkg(name):
error = SetPkgReason(name, pyalpm.PKG_REASON_DEPEND)
if error:
print(error)
else:
to_mark_as_dep.discard(name)
def get_updates():
while Gtk.events_pending():
Gtk.main_iteration()
action_handler(_('Checking for updates')+'...')
icon_handler('pamac-search')
target_handler('')
percent_handler(0)
ProgressCancelButton.set_visible(False)
ProgressCloseButton.set_visible(False)
progress_expander.set_visible(False)
ProgressWindow.show()
while Gtk.events_pending():
Gtk.main_iteration()
CheckUpdates()
def get_transaction_sum():
transaction_dict = {'to_remove': [], 'to_build': [], 'to_install': [], 'to_update': [], 'to_reinstall': [], 'to_downgrade': []}
for pkg in to_build:
transaction_dict['to_build'].append(pkg.name+' '+pkg.version)
_to_remove = sorted(To_Remove())
for name, version in _to_remove:
transaction_dict['to_remove'].append(name+' '+version)
others = sorted(To_Add())
for name, version, dsize in others:
pkg = get_localpkg(name)
if pkg:
comp = pyalpm.vercmp(version, pkg.version)
if comp == 1:
transaction_dict['to_update'].append((name+' '+version, dsize))
elif comp == 0:
transaction_dict['to_reinstall'].append((name+' '+version, dsize))
elif comp == -1:
transaction_dict['to_downgrade'].append((name+' '+version, dsize))
else:
transaction_dict['to_install'].append((name+' '+version, dsize))
#~ if transaction_dict['to_build']:
#~ print('To build:', [name for name in transaction_dict['to_build']])
#~ if transaction_dict['to_install']:
#~ print('To install:', [name for name, size in transaction_dict['to_install']])
#~ if transaction_dict['to_reinstall']:
#~ print('To reinstall:', [name for name, size in transaction_dict['to_reinstall']])
#~ if transaction_dict['to_downgrade']:
#~ print('To downgrade:', [name for name, size in transaction_dict['to_downgrade']])
#~ if transaction_dict['to_remove']:
#~ print('To remove:', [name for name in transaction_dict['to_remove']])
#~ if transaction_dict['to_update']:
#~ print('To update:', [name for name, size in transaction_dict['to_update']])
return transaction_dict
def set_transaction_sum(show_updates = True):
dsize = 0
transaction_sum.clear()
transaction_dict = get_transaction_sum()
sum_top_label.set_markup('<big><b>{}</b></big>'.format(_('Transaction Summary')))
if transaction_dict['to_remove']:
transaction_sum.append([_('To remove')+':', transaction_dict['to_remove'][0]])
i = 1
while i < len(transaction_dict['to_remove']):
transaction_sum.append(['', transaction_dict['to_remove'][i]])
i += 1
if transaction_dict['to_downgrade']:
transaction_sum.append([_('To downgrade')+':', transaction_dict['to_downgrade'][0][0]])
dsize += transaction_dict['to_downgrade'][0][1]
i = 1
while i < len(transaction_dict['to_downgrade']):
transaction_sum.append(['', transaction_dict['to_downgrade'][i][0]])
dsize += transaction_dict['to_downgrade'][i][1]
i += 1
if transaction_dict['to_build']:
transaction_sum.append([_('To build')+':', transaction_dict['to_build'][0]])
i = 1
while i < len(transaction_dict['to_build']):
transaction_sum.append(['', transaction_dict['to_build'][i]])
i += 1
if transaction_dict['to_install']:
transaction_sum.append([_('To install')+':', transaction_dict['to_install'][0][0]])
dsize += transaction_dict['to_install'][0][1]
i = 1
while i < len(transaction_dict['to_install']):
transaction_sum.append(['', transaction_dict['to_install'][i][0]])
dsize += transaction_dict['to_install'][i][1]
i += 1
if transaction_dict['to_reinstall']:
transaction_sum.append([_('To reinstall')+':', transaction_dict['to_reinstall'][0][0]])
dsize += transaction_dict['to_reinstall'][0][1]
i = 1
while i < len(transaction_dict['to_reinstall']):
transaction_sum.append(['', transaction_dict['to_reinstall'][i][0]])
dsize += transaction_dict['to_reinstall'][i][1]
i += 1
if show_updates:
if transaction_dict['to_update']:
transaction_sum.append([_('To update')+':', transaction_dict['to_update'][0][0]])
dsize += transaction_dict['to_update'][0][1]
i = 1
while i < len(transaction_dict['to_update']):
transaction_sum.append(['', transaction_dict['to_update'][i][0]])
dsize += transaction_dict['to_update'][i][1]
i += 1
else:
for name, size in transaction_dict['to_update']:
dsize += size
if dsize == 0:
sum_bottom_label.set_markup('')
else:
sum_bottom_label.set_markup('<b>{} {}</b>'.format(_('Total download size:'), common.format_size(dsize)))
def sysupgrade(show_updates = True, downgrade = False):
syncfirst, updates = available_updates
if updates:
global to_update
global to_add
global to_remove
global progress_buffer
to_update.clear()
to_add.clear()
to_remove.clear()
action_handler(_('Preparing')+'...')
icon_handler('pamac-setup')
target_handler('')
percent_handler(0)
progress_buffer.delete(progress_buffer.get_start_iter(), progress_buffer.get_end_iter())
ProgressCancelButton.set_visible(False)
ProgressCloseButton.set_visible(False)
progress_expander.set_visible(True)
ProgressWindow.show()
while Gtk.events_pending():
Gtk.main_iteration()
for name, version, db, tarpath, size in updates:
if db == 'AUR':
# call AURPkg constructor directly to avoid a request to AUR
infos = {'name': name, 'version': version, 'Description': '', 'URLPath': tarpath}
pkg = aur.AURPkg(infos)
to_build.append(pkg)
else:
to_update.add(name)
error = ''
if syncfirst:
ProgressCancelButton.set_visible(True)
error += init_transaction()
if not error:
for name in to_update:
error += Add(name)
if not error:
error += prepare()
else:
if to_build:
# check if packages in to_build have deps or makedeps which need to be install first
# grab errors differently here to not break regular updates
_error = check_to_build()
if to_update or to_add:
ProgressCancelButton.set_visible(True)
error += init_transaction()
if not error:
if to_update:
error += Sysupgrade(downgrade)
_error = ''
for name in to_add:
_error += Add(name)
if _error:
print(_error)
if not error:
error += prepare()
if not error:
set_transaction_sum(show_updates = 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:
finalize()
if error:
ProgressWindow.hide()
Release()
return error

12
po/Makefile Normal file
View File

@ -0,0 +1,12 @@
MSGLANGS=$(notdir $(wildcard *.po))
MSGOBJS=$(addprefix locale/,$(MSGLANGS:.po=/LC_MESSAGES/pamac.mo))
locale/%/LC_MESSAGES/pamac.mo: %.po
msgfmt -c -o $*.mo $*.po
mkdir -p $(dir $@)
cp $*.mo $(dir $@)pamac.mo
gettext: $(MSGOBJS)
itstool -j ../data/polkit/org.manjaro.pamac.policy.in -o ../data/polkit/org.manjaro.pamac.policy $(MSGLANGS:.po=.mo)

1148
po/ar.po

File diff suppressed because it is too large Load Diff

1155
po/ast.po

File diff suppressed because it is too large Load Diff

1155
po/bg.po

File diff suppressed because it is too large Load Diff

553
po/bn.po
View File

@ -1,553 +0,0 @@
# Translation of Pamac.
# Copyright (C) 2007-2012 Free Software Foundation, Inc.
# This file is distributed under the same license as the Pamac package.
# Guillaume Benoit <guillaume@manjaro.org>, 2013-2014.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: manjaro-pamac\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-03-30 15:09+0100\n"
"PO-Revision-Date: 2014-03-05 22:14+0000\n"
"Last-Translator: manjarolinux <philm@manjaro.org>\n"
"Language-Team: Bengali (http://www.transifex.com/projects/p/manjaro-pamac/language/bn/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bn\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: data/polkit/org.manjaro.pamac.policy:10
msgid "Authentication is required"
msgstr ""
#: pamac-daemon.py:162
msgid "Checking dependencies"
msgstr ""
#: pamac-daemon.py:170
msgid "Checking file conflicts"
msgstr ""
#: pamac-daemon.py:176
msgid "Resolving dependencies"
msgstr ""
#: pamac-daemon.py:184
msgid "Checking inter conflicts"
msgstr ""
#: pamac-daemon.py:192
#, python-brace-format
msgid "Installing {pkgname}"
msgstr ""
#: pamac-daemon.py:200
#, python-brace-format
msgid "Removing {pkgname}"
msgstr ""
#: pamac-daemon.py:208
#, python-brace-format
msgid "Upgrading {pkgname}"
msgstr ""
#: pamac-daemon.py:216
#, python-brace-format
msgid "Downgrading {pkgname}"
msgstr ""
#: pamac-daemon.py:224
#, python-brace-format
msgid "Reinstalling {pkgname}"
msgstr ""
#: pamac-daemon.py:232
msgid "Checking integrity"
msgstr ""
#: pamac-daemon.py:239
msgid "Loading packages files"
msgstr ""
#: pamac-daemon.py:245
msgid "Checking delta integrity"
msgstr ""
#: pamac-daemon.py:251
msgid "Applying deltas"
msgstr ""
#: pamac-daemon.py:257
msgid "Generating {} with {}"
msgstr ""
#: pamac-daemon.py:261
msgid "Generation succeeded!"
msgstr ""
#: pamac-daemon.py:264
msgid "Generation failed."
msgstr ""
#: pamac-daemon.py:267
#, python-brace-format
msgid "Configuring {pkgname}"
msgstr ""
#: pamac-daemon.py:272
msgid "Downloading"
msgstr ""
#: pamac-daemon.py:276
msgid "Checking available disk space"
msgstr ""
#: pamac-daemon.py:286
msgid "Checking keyring"
msgstr ""
#: pamac-daemon.py:292
msgid "Downloading required keys"
msgstr ""
#: pamac-daemon.py:311
#, python-brace-format
msgid "{pkgname1} will be replaced by {pkgname2}"
msgstr ""
#: pamac-daemon.py:314
#, python-brace-format
msgid "{pkgname1} conflicts with {pkgname2}"
msgstr ""
#: pamac-daemon.py:339
msgid "Error: "
msgstr ""
#: pamac-daemon.py:345
msgid "Warning: "
msgstr ""
#: pamac-daemon.py:359
#, python-brace-format
msgid "Refreshing {repo}"
msgstr ""
#: pamac-daemon.py:363 pamac/transaction.py:608
#, python-brace-format
msgid "Downloading {pkgname}"
msgstr ""
#: pamac-daemon.py:427 pamac-daemon.py:439 pamac-daemon.py:762
#: pamac-daemon.py:770 pamac-daemon.py:793 pamac-daemon.py:827
msgid "Authentication failed"
msgstr ""
#: pamac-daemon.py:572 pamac-install.py:127
#, python-brace-format
msgid "{pkgname} is not a valid path or package name"
msgstr ""
#: pamac-daemon.py:685
#, python-brace-format
msgid ""
"The transaction cannot be performed because it needs to remove {pkgname1} "
"which is a locked package"
msgstr ""
#: pamac-daemon.py:695 pamac/transaction.py:449
msgid "Nothing to do"
msgstr ""
#: pamac-daemon.py:757
msgid "Transaction successfully finished"
msgstr ""
#: pamac-manager.py:103 pamac-manager.py:134 pamac-manager.py:135
#: pamac-manager.py:150 pamac-manager.py:159 pamac-manager.py:180
#: pamac-manager.py:305 pamac-manager.py:657 pamac-manager.py:715
#: pamac-manager.py:785
msgid "No package found"
msgstr ""
#: pamac-manager.py:204 pamac-manager.py:266
msgid "local"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:249 pamac-manager.py:371
msgid "Installed"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:252
msgid "Uninstalled"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:255
msgid "Orphans"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:227 pamac/transaction.py:757
msgid "To install"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:238 pamac/transaction.py:737
msgid "To remove"
msgstr ""
#: pamac-manager.py:361
msgid "Licenses"
msgstr ""
#: pamac-manager.py:366
msgid "Depends On"
msgstr ""
#: pamac-manager.py:374
msgid "Optional Deps"
msgstr ""
#: pamac-manager.py:377
msgid "Required By"
msgstr ""
#: pamac-manager.py:379
msgid "Provides"
msgstr ""
#: pamac-manager.py:381
msgid "Replaces"
msgstr ""
#: pamac-manager.py:383
msgid "Conflicts With"
msgstr ""
#: pamac-manager.py:388
msgid "Repository"
msgstr ""
#: pamac-manager.py:390 gui/manager.ui:557
msgid "Groups"
msgstr ""
#: pamac-manager.py:392
msgid "Compressed Size"
msgstr ""
#: pamac-manager.py:393
msgid "Download Size"
msgstr ""
#: pamac-manager.py:395
msgid "Installed Size"
msgstr ""
#: pamac-manager.py:396
msgid "Packager"
msgstr ""
#: pamac-manager.py:397
msgid "Architecture"
msgstr ""
#: pamac-manager.py:400
msgid "Install Date"
msgstr ""
#: pamac-manager.py:402
msgid "Explicitly installed"
msgstr ""
#: pamac-manager.py:404
msgid "Installed as a dependency for another package"
msgstr ""
#: pamac-manager.py:406
msgid "Unknown"
msgstr ""
#: pamac-manager.py:407
msgid "Install Reason"
msgstr ""
#: pamac-manager.py:412
msgid "Signatures"
msgstr ""
#: pamac-manager.py:416
msgid "Backup files"
msgstr ""
#: pamac-manager.py:597
#, python-brace-format
msgid ""
"{pkgname} has {number} uninstalled optional deps.\n"
"Please choose those you would like to install:"
msgstr ""
#: pamac-manager.py:660
msgid "Deselect"
msgstr ""
#: pamac-manager.py:665
msgid "Remove"
msgstr ""
#: pamac-manager.py:671
msgid "Reinstall"
msgstr ""
#: pamac-manager.py:682
msgid "Install optional deps"
msgstr ""
#: pamac-manager.py:687
msgid "Mark as explicitly installed"
msgstr ""
#: pamac-manager.py:691
msgid "Install"
msgstr ""
#: pamac-manager.py:702
msgid "Install with optional deps"
msgstr ""
#: pamac-manager.py:1009 pamac-updater.py:214 pamac-install.py:160
msgid "Pamac is already running"
msgstr ""
#: pamac-updater.py:44 pamac-updater.py:59 pamac-tray.py:40
msgid "Your system is up-to-date"
msgstr ""
#: pamac-updater.py:74 pamac/transaction.py:787
msgid "Total download size:"
msgstr ""
#: pamac-updater.py:76 pamac-tray.py:38
msgid "1 available update"
msgstr ""
#: pamac-updater.py:78 pamac-tray.py:37
#, python-brace-format
msgid "{number} available updates"
msgstr ""
#: pamac-tray.py:50 pamac-tray.py:126 pamac-tray.py:148 gui/updater.ui:24
msgid "Update Manager"
msgstr ""
#: pamac-tray.py:54 gui/manager.ui:324
msgid "Package Manager"
msgstr ""
#: pamac-tray.py:58
msgid "Quit"
msgstr ""
#: pamac-install.py:66
msgid ""
"Some updates are available.\n"
"Please update your system first"
msgstr ""
#: pamac-install.py:72 pamac/transaction.py:406 pamac/transaction.py:799
msgid "Preparing"
msgstr ""
#: pamac/transaction.py:94 gui/dialogs.ui:369
msgid "How often to check for updates, value in hours"
msgstr ""
#: pamac/transaction.py:192
#, python-brace-format
msgid ""
"{pkgname} is provided by {number} packages.\n"
"Please choose those you would like to install:"
msgstr ""
#: pamac/transaction.py:257
msgid "Refreshing"
msgstr ""
#: pamac/transaction.py:341 pamac/transaction.py:380
#, python-brace-format
msgid "{pkgname} depends on {dependname} but it is not installable"
msgstr ""
#: pamac/transaction.py:384
#, python-brace-format
msgid "Failed to get {pkgname} archive from AUR"
msgstr ""
#: pamac/transaction.py:552 pamac/transaction.py:558
msgid "Build process failed."
msgstr ""
#: pamac/transaction.py:644
#, python-brace-format
msgid "Building {pkgname}"
msgstr ""
#: pamac/transaction.py:685
msgid "Checking for updates"
msgstr ""
#: pamac/transaction.py:735
msgid "Transaction Summary"
msgstr ""
#: pamac/transaction.py:743
msgid "To downgrade"
msgstr ""
#: pamac/transaction.py:751
msgid "To build"
msgstr ""
#: pamac/transaction.py:765
msgid "To reinstall"
msgstr ""
#: pamac/transaction.py:774
msgid "To update"
msgstr ""
#: pamac/common.py:30
#, python-format
msgid "%.1f KiB"
msgstr ""
#: pamac/common.py:33
#, python-format
msgid "%.2f MiB"
msgstr ""
#: gui/manager.ui:8
msgid "About Pamac"
msgstr ""
#: gui/manager.ui:13
msgid "Copyright © 2013 Guillaume Benoit"
msgstr ""
#: gui/manager.ui:14
msgid "A gtk3 frontend for pyalpm"
msgstr ""
#: gui/manager.ui:44
msgid "Pamac History"
msgstr ""
#: gui/manager.ui:160
msgid "View History"
msgstr ""
#: gui/manager.ui:170 gui/manager.ui:212
msgid "Install local packages"
msgstr ""
#: gui/manager.ui:344
msgid "Refresh"
msgstr ""
#: gui/manager.ui:362
msgid "Apply changes"
msgstr ""
#: gui/manager.ui:380
msgid "Cancel"
msgstr ""
#: gui/manager.ui:453
msgid "Search in AUR"
msgstr ""
#: gui/manager.ui:511
msgid "Search"
msgstr ""
#: gui/manager.ui:604 gui/manager.ui:696
msgid "State"
msgstr ""
#: gui/manager.ui:651
msgid "Repos"
msgstr ""
#: gui/manager.ui:709
msgid "Name"
msgstr ""
#: gui/manager.ui:722
msgid "Version"
msgstr ""
#: gui/manager.ui:735
msgid "Repo"
msgstr ""
#: gui/manager.ui:748
msgid "Size"
msgstr ""
#: gui/manager.ui:850
msgid "Infos"
msgstr ""
#: gui/manager.ui:914
msgid "Deps"
msgstr ""
#: gui/manager.ui:983
msgid "Details"
msgstr ""
#: gui/manager.ui:1012
msgid "Files"
msgstr ""
#: gui/dialogs.ui:70
msgid "Progress"
msgstr ""
#: gui/dialogs.ui:162
msgid "details"
msgstr ""
#: gui/dialogs.ui:292
msgid "Pamac Preferences"
msgstr ""
#: gui/dialogs.ui:316
msgid "Enable AUR support"
msgstr ""
#: gui/dialogs.ui:320
msgid "Allow Pamac to search and install packages from AUR"
msgstr ""
#: gui/dialogs.ui:333
msgid "Remove unrequired dependencies"
msgstr ""
#: gui/dialogs.ui:337
msgid ""
"When removing a package, also remove those dependencies that are not "
"required by other packages"
msgstr ""
#: gui/dialogs.ui:396
msgid "Options"
msgstr ""
#: gui/dialogs.ui:465
msgid "Choose"
msgstr ""
#: gui/dialogs.ui:579
msgid "Summary"
msgstr ""

View File

@ -1,553 +0,0 @@
# Translation of Pamac.
# Copyright (C) 2007-2012 Free Software Foundation, Inc.
# This file is distributed under the same license as the Pamac package.
# Guillaume Benoit <guillaume@manjaro.org>, 2013-2014.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: manjaro-pamac\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-03-30 15:09+0100\n"
"PO-Revision-Date: 2013-04-16 23:37+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Catalan (Spain) (http://www.transifex.com/projects/p/manjaro-pamac/language/ca_ES/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ca_ES\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: data/polkit/org.manjaro.pamac.policy:10
msgid "Authentication is required"
msgstr ""
#: pamac-daemon.py:162
msgid "Checking dependencies"
msgstr ""
#: pamac-daemon.py:170
msgid "Checking file conflicts"
msgstr ""
#: pamac-daemon.py:176
msgid "Resolving dependencies"
msgstr ""
#: pamac-daemon.py:184
msgid "Checking inter conflicts"
msgstr ""
#: pamac-daemon.py:192
#, python-brace-format
msgid "Installing {pkgname}"
msgstr ""
#: pamac-daemon.py:200
#, python-brace-format
msgid "Removing {pkgname}"
msgstr ""
#: pamac-daemon.py:208
#, python-brace-format
msgid "Upgrading {pkgname}"
msgstr ""
#: pamac-daemon.py:216
#, python-brace-format
msgid "Downgrading {pkgname}"
msgstr ""
#: pamac-daemon.py:224
#, python-brace-format
msgid "Reinstalling {pkgname}"
msgstr ""
#: pamac-daemon.py:232
msgid "Checking integrity"
msgstr ""
#: pamac-daemon.py:239
msgid "Loading packages files"
msgstr ""
#: pamac-daemon.py:245
msgid "Checking delta integrity"
msgstr ""
#: pamac-daemon.py:251
msgid "Applying deltas"
msgstr ""
#: pamac-daemon.py:257
msgid "Generating {} with {}"
msgstr ""
#: pamac-daemon.py:261
msgid "Generation succeeded!"
msgstr ""
#: pamac-daemon.py:264
msgid "Generation failed."
msgstr ""
#: pamac-daemon.py:267
#, python-brace-format
msgid "Configuring {pkgname}"
msgstr ""
#: pamac-daemon.py:272
msgid "Downloading"
msgstr ""
#: pamac-daemon.py:276
msgid "Checking available disk space"
msgstr ""
#: pamac-daemon.py:286
msgid "Checking keyring"
msgstr ""
#: pamac-daemon.py:292
msgid "Downloading required keys"
msgstr ""
#: pamac-daemon.py:311
#, python-brace-format
msgid "{pkgname1} will be replaced by {pkgname2}"
msgstr ""
#: pamac-daemon.py:314
#, python-brace-format
msgid "{pkgname1} conflicts with {pkgname2}"
msgstr ""
#: pamac-daemon.py:339
msgid "Error: "
msgstr ""
#: pamac-daemon.py:345
msgid "Warning: "
msgstr ""
#: pamac-daemon.py:359
#, python-brace-format
msgid "Refreshing {repo}"
msgstr ""
#: pamac-daemon.py:363 pamac/transaction.py:608
#, python-brace-format
msgid "Downloading {pkgname}"
msgstr ""
#: pamac-daemon.py:427 pamac-daemon.py:439 pamac-daemon.py:762
#: pamac-daemon.py:770 pamac-daemon.py:793 pamac-daemon.py:827
msgid "Authentication failed"
msgstr ""
#: pamac-daemon.py:572 pamac-install.py:127
#, python-brace-format
msgid "{pkgname} is not a valid path or package name"
msgstr ""
#: pamac-daemon.py:685
#, python-brace-format
msgid ""
"The transaction cannot be performed because it needs to remove {pkgname1} "
"which is a locked package"
msgstr ""
#: pamac-daemon.py:695 pamac/transaction.py:449
msgid "Nothing to do"
msgstr ""
#: pamac-daemon.py:757
msgid "Transaction successfully finished"
msgstr ""
#: pamac-manager.py:103 pamac-manager.py:134 pamac-manager.py:135
#: pamac-manager.py:150 pamac-manager.py:159 pamac-manager.py:180
#: pamac-manager.py:305 pamac-manager.py:657 pamac-manager.py:715
#: pamac-manager.py:785
msgid "No package found"
msgstr ""
#: pamac-manager.py:204 pamac-manager.py:266
msgid "local"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:249 pamac-manager.py:371
msgid "Installed"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:252
msgid "Uninstalled"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:255
msgid "Orphans"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:227 pamac/transaction.py:757
msgid "To install"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:238 pamac/transaction.py:737
msgid "To remove"
msgstr ""
#: pamac-manager.py:361
msgid "Licenses"
msgstr ""
#: pamac-manager.py:366
msgid "Depends On"
msgstr ""
#: pamac-manager.py:374
msgid "Optional Deps"
msgstr ""
#: pamac-manager.py:377
msgid "Required By"
msgstr ""
#: pamac-manager.py:379
msgid "Provides"
msgstr ""
#: pamac-manager.py:381
msgid "Replaces"
msgstr ""
#: pamac-manager.py:383
msgid "Conflicts With"
msgstr ""
#: pamac-manager.py:388
msgid "Repository"
msgstr ""
#: pamac-manager.py:390 gui/manager.ui:557
msgid "Groups"
msgstr ""
#: pamac-manager.py:392
msgid "Compressed Size"
msgstr ""
#: pamac-manager.py:393
msgid "Download Size"
msgstr ""
#: pamac-manager.py:395
msgid "Installed Size"
msgstr ""
#: pamac-manager.py:396
msgid "Packager"
msgstr ""
#: pamac-manager.py:397
msgid "Architecture"
msgstr ""
#: pamac-manager.py:400
msgid "Install Date"
msgstr ""
#: pamac-manager.py:402
msgid "Explicitly installed"
msgstr ""
#: pamac-manager.py:404
msgid "Installed as a dependency for another package"
msgstr ""
#: pamac-manager.py:406
msgid "Unknown"
msgstr ""
#: pamac-manager.py:407
msgid "Install Reason"
msgstr ""
#: pamac-manager.py:412
msgid "Signatures"
msgstr ""
#: pamac-manager.py:416
msgid "Backup files"
msgstr ""
#: pamac-manager.py:597
#, python-brace-format
msgid ""
"{pkgname} has {number} uninstalled optional deps.\n"
"Please choose those you would like to install:"
msgstr ""
#: pamac-manager.py:660
msgid "Deselect"
msgstr ""
#: pamac-manager.py:665
msgid "Remove"
msgstr ""
#: pamac-manager.py:671
msgid "Reinstall"
msgstr ""
#: pamac-manager.py:682
msgid "Install optional deps"
msgstr ""
#: pamac-manager.py:687
msgid "Mark as explicitly installed"
msgstr ""
#: pamac-manager.py:691
msgid "Install"
msgstr ""
#: pamac-manager.py:702
msgid "Install with optional deps"
msgstr ""
#: pamac-manager.py:1009 pamac-updater.py:214 pamac-install.py:160
msgid "Pamac is already running"
msgstr ""
#: pamac-updater.py:44 pamac-updater.py:59 pamac-tray.py:40
msgid "Your system is up-to-date"
msgstr ""
#: pamac-updater.py:74 pamac/transaction.py:787
msgid "Total download size:"
msgstr ""
#: pamac-updater.py:76 pamac-tray.py:38
msgid "1 available update"
msgstr ""
#: pamac-updater.py:78 pamac-tray.py:37
#, python-brace-format
msgid "{number} available updates"
msgstr ""
#: pamac-tray.py:50 pamac-tray.py:126 pamac-tray.py:148 gui/updater.ui:24
msgid "Update Manager"
msgstr ""
#: pamac-tray.py:54 gui/manager.ui:324
msgid "Package Manager"
msgstr ""
#: pamac-tray.py:58
msgid "Quit"
msgstr ""
#: pamac-install.py:66
msgid ""
"Some updates are available.\n"
"Please update your system first"
msgstr ""
#: pamac-install.py:72 pamac/transaction.py:406 pamac/transaction.py:799
msgid "Preparing"
msgstr ""
#: pamac/transaction.py:94 gui/dialogs.ui:369
msgid "How often to check for updates, value in hours"
msgstr ""
#: pamac/transaction.py:192
#, python-brace-format
msgid ""
"{pkgname} is provided by {number} packages.\n"
"Please choose those you would like to install:"
msgstr ""
#: pamac/transaction.py:257
msgid "Refreshing"
msgstr ""
#: pamac/transaction.py:341 pamac/transaction.py:380
#, python-brace-format
msgid "{pkgname} depends on {dependname} but it is not installable"
msgstr ""
#: pamac/transaction.py:384
#, python-brace-format
msgid "Failed to get {pkgname} archive from AUR"
msgstr ""
#: pamac/transaction.py:552 pamac/transaction.py:558
msgid "Build process failed."
msgstr ""
#: pamac/transaction.py:644
#, python-brace-format
msgid "Building {pkgname}"
msgstr ""
#: pamac/transaction.py:685
msgid "Checking for updates"
msgstr ""
#: pamac/transaction.py:735
msgid "Transaction Summary"
msgstr ""
#: pamac/transaction.py:743
msgid "To downgrade"
msgstr ""
#: pamac/transaction.py:751
msgid "To build"
msgstr ""
#: pamac/transaction.py:765
msgid "To reinstall"
msgstr ""
#: pamac/transaction.py:774
msgid "To update"
msgstr ""
#: pamac/common.py:30
#, python-format
msgid "%.1f KiB"
msgstr ""
#: pamac/common.py:33
#, python-format
msgid "%.2f MiB"
msgstr ""
#: gui/manager.ui:8
msgid "About Pamac"
msgstr ""
#: gui/manager.ui:13
msgid "Copyright © 2013 Guillaume Benoit"
msgstr ""
#: gui/manager.ui:14
msgid "A gtk3 frontend for pyalpm"
msgstr ""
#: gui/manager.ui:44
msgid "Pamac History"
msgstr ""
#: gui/manager.ui:160
msgid "View History"
msgstr ""
#: gui/manager.ui:170 gui/manager.ui:212
msgid "Install local packages"
msgstr ""
#: gui/manager.ui:344
msgid "Refresh"
msgstr ""
#: gui/manager.ui:362
msgid "Apply changes"
msgstr ""
#: gui/manager.ui:380
msgid "Cancel"
msgstr ""
#: gui/manager.ui:453
msgid "Search in AUR"
msgstr ""
#: gui/manager.ui:511
msgid "Search"
msgstr ""
#: gui/manager.ui:604 gui/manager.ui:696
msgid "State"
msgstr ""
#: gui/manager.ui:651
msgid "Repos"
msgstr ""
#: gui/manager.ui:709
msgid "Name"
msgstr ""
#: gui/manager.ui:722
msgid "Version"
msgstr ""
#: gui/manager.ui:735
msgid "Repo"
msgstr ""
#: gui/manager.ui:748
msgid "Size"
msgstr ""
#: gui/manager.ui:850
msgid "Infos"
msgstr ""
#: gui/manager.ui:914
msgid "Deps"
msgstr ""
#: gui/manager.ui:983
msgid "Details"
msgstr ""
#: gui/manager.ui:1012
msgid "Files"
msgstr ""
#: gui/dialogs.ui:70
msgid "Progress"
msgstr ""
#: gui/dialogs.ui:162
msgid "details"
msgstr ""
#: gui/dialogs.ui:292
msgid "Pamac Preferences"
msgstr ""
#: gui/dialogs.ui:316
msgid "Enable AUR support"
msgstr ""
#: gui/dialogs.ui:320
msgid "Allow Pamac to search and install packages from AUR"
msgstr ""
#: gui/dialogs.ui:333
msgid "Remove unrequired dependencies"
msgstr ""
#: gui/dialogs.ui:337
msgid ""
"When removing a package, also remove those dependencies that are not "
"required by other packages"
msgstr ""
#: gui/dialogs.ui:396
msgid "Options"
msgstr ""
#: gui/dialogs.ui:465
msgid "Choose"
msgstr ""
#: gui/dialogs.ui:579
msgid "Summary"
msgstr ""

1157
po/ca.po

File diff suppressed because it is too large Load Diff

1158
po/cs.po

File diff suppressed because it is too large Load Diff

1157
po/da.po

File diff suppressed because it is too large Load Diff

1155
po/de.po

File diff suppressed because it is too large Load Diff

1147
po/el.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1091
po/eo.po

File diff suppressed because it is too large Load Diff

1154
po/es.po

File diff suppressed because it is too large Load Diff

1111
po/et.po

File diff suppressed because it is too large Load Diff

554
po/eu.po
View File

@ -1,554 +0,0 @@
# Translation of Pamac.
# Copyright (C) 2007-2012 Free Software Foundation, Inc.
# This file is distributed under the same license as the Pamac package.
# Guillaume Benoit <guillaume@manjaro.org>, 2013-2014.
#
# Translators:
# tarteka <semosa@gmail.com>, 2014
msgid ""
msgstr ""
"Project-Id-Version: manjaro-pamac\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-03-30 15:09+0100\n"
"PO-Revision-Date: 2014-03-05 22:14+0000\n"
"Last-Translator: manjarolinux <philm@manjaro.org>\n"
"Language-Team: Basque (http://www.transifex.com/projects/p/manjaro-pamac/language/eu/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: eu\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: data/polkit/org.manjaro.pamac.policy:10
msgid "Authentication is required"
msgstr ""
#: pamac-daemon.py:162
msgid "Checking dependencies"
msgstr "Mendekotasunak egiaztatzen"
#: pamac-daemon.py:170
msgid "Checking file conflicts"
msgstr ""
#: pamac-daemon.py:176
msgid "Resolving dependencies"
msgstr ""
#: pamac-daemon.py:184
msgid "Checking inter conflicts"
msgstr ""
#: pamac-daemon.py:192
#, python-brace-format
msgid "Installing {pkgname}"
msgstr ""
#: pamac-daemon.py:200
#, python-brace-format
msgid "Removing {pkgname}"
msgstr ""
#: pamac-daemon.py:208
#, python-brace-format
msgid "Upgrading {pkgname}"
msgstr ""
#: pamac-daemon.py:216
#, python-brace-format
msgid "Downgrading {pkgname}"
msgstr ""
#: pamac-daemon.py:224
#, python-brace-format
msgid "Reinstalling {pkgname}"
msgstr ""
#: pamac-daemon.py:232
msgid "Checking integrity"
msgstr ""
#: pamac-daemon.py:239
msgid "Loading packages files"
msgstr ""
#: pamac-daemon.py:245
msgid "Checking delta integrity"
msgstr ""
#: pamac-daemon.py:251
msgid "Applying deltas"
msgstr ""
#: pamac-daemon.py:257
msgid "Generating {} with {}"
msgstr ""
#: pamac-daemon.py:261
msgid "Generation succeeded!"
msgstr ""
#: pamac-daemon.py:264
msgid "Generation failed."
msgstr ""
#: pamac-daemon.py:267
#, python-brace-format
msgid "Configuring {pkgname}"
msgstr ""
#: pamac-daemon.py:272
msgid "Downloading"
msgstr ""
#: pamac-daemon.py:276
msgid "Checking available disk space"
msgstr ""
#: pamac-daemon.py:286
msgid "Checking keyring"
msgstr ""
#: pamac-daemon.py:292
msgid "Downloading required keys"
msgstr ""
#: pamac-daemon.py:311
#, python-brace-format
msgid "{pkgname1} will be replaced by {pkgname2}"
msgstr ""
#: pamac-daemon.py:314
#, python-brace-format
msgid "{pkgname1} conflicts with {pkgname2}"
msgstr ""
#: pamac-daemon.py:339
msgid "Error: "
msgstr ""
#: pamac-daemon.py:345
msgid "Warning: "
msgstr ""
#: pamac-daemon.py:359
#, python-brace-format
msgid "Refreshing {repo}"
msgstr ""
#: pamac-daemon.py:363 pamac/transaction.py:608
#, python-brace-format
msgid "Downloading {pkgname}"
msgstr ""
#: pamac-daemon.py:427 pamac-daemon.py:439 pamac-daemon.py:762
#: pamac-daemon.py:770 pamac-daemon.py:793 pamac-daemon.py:827
msgid "Authentication failed"
msgstr ""
#: pamac-daemon.py:572 pamac-install.py:127
#, python-brace-format
msgid "{pkgname} is not a valid path or package name"
msgstr ""
#: pamac-daemon.py:685
#, python-brace-format
msgid ""
"The transaction cannot be performed because it needs to remove {pkgname1} "
"which is a locked package"
msgstr ""
#: pamac-daemon.py:695 pamac/transaction.py:449
msgid "Nothing to do"
msgstr ""
#: pamac-daemon.py:757
msgid "Transaction successfully finished"
msgstr ""
#: pamac-manager.py:103 pamac-manager.py:134 pamac-manager.py:135
#: pamac-manager.py:150 pamac-manager.py:159 pamac-manager.py:180
#: pamac-manager.py:305 pamac-manager.py:657 pamac-manager.py:715
#: pamac-manager.py:785
msgid "No package found"
msgstr ""
#: pamac-manager.py:204 pamac-manager.py:266
msgid "local"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:249 pamac-manager.py:371
msgid "Installed"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:252
msgid "Uninstalled"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:255
msgid "Orphans"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:227 pamac/transaction.py:757
msgid "To install"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:238 pamac/transaction.py:737
msgid "To remove"
msgstr ""
#: pamac-manager.py:361
msgid "Licenses"
msgstr ""
#: pamac-manager.py:366
msgid "Depends On"
msgstr ""
#: pamac-manager.py:374
msgid "Optional Deps"
msgstr ""
#: pamac-manager.py:377
msgid "Required By"
msgstr ""
#: pamac-manager.py:379
msgid "Provides"
msgstr ""
#: pamac-manager.py:381
msgid "Replaces"
msgstr ""
#: pamac-manager.py:383
msgid "Conflicts With"
msgstr ""
#: pamac-manager.py:388
msgid "Repository"
msgstr ""
#: pamac-manager.py:390 gui/manager.ui:557
msgid "Groups"
msgstr ""
#: pamac-manager.py:392
msgid "Compressed Size"
msgstr ""
#: pamac-manager.py:393
msgid "Download Size"
msgstr ""
#: pamac-manager.py:395
msgid "Installed Size"
msgstr ""
#: pamac-manager.py:396
msgid "Packager"
msgstr ""
#: pamac-manager.py:397
msgid "Architecture"
msgstr ""
#: pamac-manager.py:400
msgid "Install Date"
msgstr ""
#: pamac-manager.py:402
msgid "Explicitly installed"
msgstr ""
#: pamac-manager.py:404
msgid "Installed as a dependency for another package"
msgstr ""
#: pamac-manager.py:406
msgid "Unknown"
msgstr ""
#: pamac-manager.py:407
msgid "Install Reason"
msgstr ""
#: pamac-manager.py:412
msgid "Signatures"
msgstr ""
#: pamac-manager.py:416
msgid "Backup files"
msgstr ""
#: pamac-manager.py:597
#, python-brace-format
msgid ""
"{pkgname} has {number} uninstalled optional deps.\n"
"Please choose those you would like to install:"
msgstr ""
#: pamac-manager.py:660
msgid "Deselect"
msgstr ""
#: pamac-manager.py:665
msgid "Remove"
msgstr ""
#: pamac-manager.py:671
msgid "Reinstall"
msgstr ""
#: pamac-manager.py:682
msgid "Install optional deps"
msgstr ""
#: pamac-manager.py:687
msgid "Mark as explicitly installed"
msgstr ""
#: pamac-manager.py:691
msgid "Install"
msgstr ""
#: pamac-manager.py:702
msgid "Install with optional deps"
msgstr ""
#: pamac-manager.py:1009 pamac-updater.py:214 pamac-install.py:160
msgid "Pamac is already running"
msgstr ""
#: pamac-updater.py:44 pamac-updater.py:59 pamac-tray.py:40
msgid "Your system is up-to-date"
msgstr ""
#: pamac-updater.py:74 pamac/transaction.py:787
msgid "Total download size:"
msgstr ""
#: pamac-updater.py:76 pamac-tray.py:38
msgid "1 available update"
msgstr ""
#: pamac-updater.py:78 pamac-tray.py:37
#, python-brace-format
msgid "{number} available updates"
msgstr ""
#: pamac-tray.py:50 pamac-tray.py:126 pamac-tray.py:148 gui/updater.ui:24
msgid "Update Manager"
msgstr ""
#: pamac-tray.py:54 gui/manager.ui:324
msgid "Package Manager"
msgstr ""
#: pamac-tray.py:58
msgid "Quit"
msgstr ""
#: pamac-install.py:66
msgid ""
"Some updates are available.\n"
"Please update your system first"
msgstr ""
#: pamac-install.py:72 pamac/transaction.py:406 pamac/transaction.py:799
msgid "Preparing"
msgstr "Prestatzen"
#: pamac/transaction.py:94 gui/dialogs.ui:369
msgid "How often to check for updates, value in hours"
msgstr ""
#: pamac/transaction.py:192
#, python-brace-format
msgid ""
"{pkgname} is provided by {number} packages.\n"
"Please choose those you would like to install:"
msgstr ""
#: pamac/transaction.py:257
msgid "Refreshing"
msgstr ""
#: pamac/transaction.py:341 pamac/transaction.py:380
#, python-brace-format
msgid "{pkgname} depends on {dependname} but it is not installable"
msgstr ""
#: pamac/transaction.py:384
#, python-brace-format
msgid "Failed to get {pkgname} archive from AUR"
msgstr ""
#: pamac/transaction.py:552 pamac/transaction.py:558
msgid "Build process failed."
msgstr ""
#: pamac/transaction.py:644
#, python-brace-format
msgid "Building {pkgname}"
msgstr ""
#: pamac/transaction.py:685
msgid "Checking for updates"
msgstr ""
#: pamac/transaction.py:735
msgid "Transaction Summary"
msgstr ""
#: pamac/transaction.py:743
msgid "To downgrade"
msgstr ""
#: pamac/transaction.py:751
msgid "To build"
msgstr ""
#: pamac/transaction.py:765
msgid "To reinstall"
msgstr ""
#: pamac/transaction.py:774
msgid "To update"
msgstr ""
#: pamac/common.py:30
#, python-format
msgid "%.1f KiB"
msgstr ""
#: pamac/common.py:33
#, python-format
msgid "%.2f MiB"
msgstr ""
#: gui/manager.ui:8
msgid "About Pamac"
msgstr ""
#: gui/manager.ui:13
msgid "Copyright © 2013 Guillaume Benoit"
msgstr ""
#: gui/manager.ui:14
msgid "A gtk3 frontend for pyalpm"
msgstr ""
#: gui/manager.ui:44
msgid "Pamac History"
msgstr ""
#: gui/manager.ui:160
msgid "View History"
msgstr ""
#: gui/manager.ui:170 gui/manager.ui:212
msgid "Install local packages"
msgstr ""
#: gui/manager.ui:344
msgid "Refresh"
msgstr ""
#: gui/manager.ui:362
msgid "Apply changes"
msgstr ""
#: gui/manager.ui:380
msgid "Cancel"
msgstr ""
#: gui/manager.ui:453
msgid "Search in AUR"
msgstr ""
#: gui/manager.ui:511
msgid "Search"
msgstr ""
#: gui/manager.ui:604 gui/manager.ui:696
msgid "State"
msgstr ""
#: gui/manager.ui:651
msgid "Repos"
msgstr ""
#: gui/manager.ui:709
msgid "Name"
msgstr ""
#: gui/manager.ui:722
msgid "Version"
msgstr ""
#: gui/manager.ui:735
msgid "Repo"
msgstr ""
#: gui/manager.ui:748
msgid "Size"
msgstr ""
#: gui/manager.ui:850
msgid "Infos"
msgstr ""
#: gui/manager.ui:914
msgid "Deps"
msgstr ""
#: gui/manager.ui:983
msgid "Details"
msgstr ""
#: gui/manager.ui:1012
msgid "Files"
msgstr ""
#: gui/dialogs.ui:70
msgid "Progress"
msgstr ""
#: gui/dialogs.ui:162
msgid "details"
msgstr ""
#: gui/dialogs.ui:292
msgid "Pamac Preferences"
msgstr ""
#: gui/dialogs.ui:316
msgid "Enable AUR support"
msgstr ""
#: gui/dialogs.ui:320
msgid "Allow Pamac to search and install packages from AUR"
msgstr "Pamac AURtik paketeak bilatzeko eta instalatzeko baimendu"
#: gui/dialogs.ui:333
msgid "Remove unrequired dependencies"
msgstr ""
#: gui/dialogs.ui:337
msgid ""
"When removing a package, also remove those dependencies that are not "
"required by other packages"
msgstr ""
#: gui/dialogs.ui:396
msgid "Options"
msgstr "Aukerak"
#: gui/dialogs.ui:465
msgid "Choose"
msgstr ""
#: gui/dialogs.ui:579
msgid "Summary"
msgstr ""

File diff suppressed because it is too large Load Diff

1109
po/fa.po

File diff suppressed because it is too large Load Diff

1149
po/fi.po

File diff suppressed because it is too large Load Diff

26
po/files_to_translate Normal file
View File

@ -0,0 +1,26 @@
../resources/choose_provider_dialog.ui
../resources/packages_chooser_dialog.ui
../resources/progress_dialog.ui
../resources/history_dialog.ui
../resources/transaction_info_dialog.ui
../resources/transaction_sum_dialog.ui
../resources/manager_window.ui
../resources/updater_window.ui
../resources/preferences_dialog.ui
../src/packages_chooser_dialog.vala
../src/transaction_info_dialog.vala
../src/history_dialog.vala
../src/transaction_sum_dialog.vala
../src/daemon.vala
../src/transaction.vala
../src/installer.vala
../src/tray.vala
../src/manager.vala
../src/preferences_dialog.vala
../src/updater.vala
../src/choose_provider_dialog.vala
../src/manager_window.vala
../src/progress_dialog.vala
../src/updater_window.vala
../src/common.vala

1035
po/fo.po

File diff suppressed because it is too large Load Diff

1144
po/fr.po

File diff suppressed because it is too large Load Diff

1149
po/he.po

File diff suppressed because it is too large Load Diff

1142
po/hi.po

File diff suppressed because it is too large Load Diff

1090
po/hr.po

File diff suppressed because it is too large Load Diff

1146
po/hu.po

File diff suppressed because it is too large Load Diff

1156
po/id.po

File diff suppressed because it is too large Load Diff

1157
po/it.po

File diff suppressed because it is too large Load Diff

1155
po/ja.po

File diff suppressed because it is too large Load Diff

553
po/ka.po
View File

@ -1,553 +0,0 @@
# Translation of Pamac.
# Copyright (C) 2007-2012 Free Software Foundation, Inc.
# This file is distributed under the same license as the Pamac package.
# Guillaume Benoit <guillaume@manjaro.org>, 2013-2014.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: manjaro-pamac\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-03-30 15:09+0100\n"
"PO-Revision-Date: 2014-03-07 23:43+0000\n"
"Last-Translator: manjarolinux <philm@manjaro.org>\n"
"Language-Team: Georgian (http://www.transifex.com/projects/p/manjaro-pamac/language/ka/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ka\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: data/polkit/org.manjaro.pamac.policy:10
msgid "Authentication is required"
msgstr ""
#: pamac-daemon.py:162
msgid "Checking dependencies"
msgstr ""
#: pamac-daemon.py:170
msgid "Checking file conflicts"
msgstr ""
#: pamac-daemon.py:176
msgid "Resolving dependencies"
msgstr ""
#: pamac-daemon.py:184
msgid "Checking inter conflicts"
msgstr ""
#: pamac-daemon.py:192
#, python-brace-format
msgid "Installing {pkgname}"
msgstr ""
#: pamac-daemon.py:200
#, python-brace-format
msgid "Removing {pkgname}"
msgstr ""
#: pamac-daemon.py:208
#, python-brace-format
msgid "Upgrading {pkgname}"
msgstr ""
#: pamac-daemon.py:216
#, python-brace-format
msgid "Downgrading {pkgname}"
msgstr ""
#: pamac-daemon.py:224
#, python-brace-format
msgid "Reinstalling {pkgname}"
msgstr ""
#: pamac-daemon.py:232
msgid "Checking integrity"
msgstr ""
#: pamac-daemon.py:239
msgid "Loading packages files"
msgstr ""
#: pamac-daemon.py:245
msgid "Checking delta integrity"
msgstr ""
#: pamac-daemon.py:251
msgid "Applying deltas"
msgstr ""
#: pamac-daemon.py:257
msgid "Generating {} with {}"
msgstr ""
#: pamac-daemon.py:261
msgid "Generation succeeded!"
msgstr ""
#: pamac-daemon.py:264
msgid "Generation failed."
msgstr ""
#: pamac-daemon.py:267
#, python-brace-format
msgid "Configuring {pkgname}"
msgstr ""
#: pamac-daemon.py:272
msgid "Downloading"
msgstr ""
#: pamac-daemon.py:276
msgid "Checking available disk space"
msgstr ""
#: pamac-daemon.py:286
msgid "Checking keyring"
msgstr ""
#: pamac-daemon.py:292
msgid "Downloading required keys"
msgstr ""
#: pamac-daemon.py:311
#, python-brace-format
msgid "{pkgname1} will be replaced by {pkgname2}"
msgstr ""
#: pamac-daemon.py:314
#, python-brace-format
msgid "{pkgname1} conflicts with {pkgname2}"
msgstr ""
#: pamac-daemon.py:339
msgid "Error: "
msgstr ""
#: pamac-daemon.py:345
msgid "Warning: "
msgstr ""
#: pamac-daemon.py:359
#, python-brace-format
msgid "Refreshing {repo}"
msgstr ""
#: pamac-daemon.py:363 pamac/transaction.py:608
#, python-brace-format
msgid "Downloading {pkgname}"
msgstr ""
#: pamac-daemon.py:427 pamac-daemon.py:439 pamac-daemon.py:762
#: pamac-daemon.py:770 pamac-daemon.py:793 pamac-daemon.py:827
msgid "Authentication failed"
msgstr ""
#: pamac-daemon.py:572 pamac-install.py:127
#, python-brace-format
msgid "{pkgname} is not a valid path or package name"
msgstr ""
#: pamac-daemon.py:685
#, python-brace-format
msgid ""
"The transaction cannot be performed because it needs to remove {pkgname1} "
"which is a locked package"
msgstr ""
#: pamac-daemon.py:695 pamac/transaction.py:449
msgid "Nothing to do"
msgstr ""
#: pamac-daemon.py:757
msgid "Transaction successfully finished"
msgstr ""
#: pamac-manager.py:103 pamac-manager.py:134 pamac-manager.py:135
#: pamac-manager.py:150 pamac-manager.py:159 pamac-manager.py:180
#: pamac-manager.py:305 pamac-manager.py:657 pamac-manager.py:715
#: pamac-manager.py:785
msgid "No package found"
msgstr ""
#: pamac-manager.py:204 pamac-manager.py:266
msgid "local"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:249 pamac-manager.py:371
msgid "Installed"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:252
msgid "Uninstalled"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:255
msgid "Orphans"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:227 pamac/transaction.py:757
msgid "To install"
msgstr ""
#: pamac-manager.py:208 pamac-manager.py:238 pamac/transaction.py:737
msgid "To remove"
msgstr ""
#: pamac-manager.py:361
msgid "Licenses"
msgstr ""
#: pamac-manager.py:366
msgid "Depends On"
msgstr ""
#: pamac-manager.py:374
msgid "Optional Deps"
msgstr ""
#: pamac-manager.py:377
msgid "Required By"
msgstr ""
#: pamac-manager.py:379
msgid "Provides"
msgstr ""
#: pamac-manager.py:381
msgid "Replaces"
msgstr ""
#: pamac-manager.py:383
msgid "Conflicts With"
msgstr ""
#: pamac-manager.py:388
msgid "Repository"
msgstr ""
#: pamac-manager.py:390 gui/manager.ui:557
msgid "Groups"
msgstr ""
#: pamac-manager.py:392
msgid "Compressed Size"
msgstr ""
#: pamac-manager.py:393
msgid "Download Size"
msgstr ""
#: pamac-manager.py:395
msgid "Installed Size"
msgstr ""
#: pamac-manager.py:396
msgid "Packager"
msgstr ""
#: pamac-manager.py:397
msgid "Architecture"
msgstr ""
#: pamac-manager.py:400
msgid "Install Date"
msgstr ""
#: pamac-manager.py:402
msgid "Explicitly installed"
msgstr ""
#: pamac-manager.py:404
msgid "Installed as a dependency for another package"
msgstr ""
#: pamac-manager.py:406
msgid "Unknown"
msgstr ""
#: pamac-manager.py:407
msgid "Install Reason"
msgstr ""
#: pamac-manager.py:412
msgid "Signatures"
msgstr ""
#: pamac-manager.py:416
msgid "Backup files"
msgstr ""
#: pamac-manager.py:597
#, python-brace-format
msgid ""
"{pkgname} has {number} uninstalled optional deps.\n"
"Please choose those you would like to install:"
msgstr ""
#: pamac-manager.py:660
msgid "Deselect"
msgstr ""
#: pamac-manager.py:665
msgid "Remove"
msgstr ""
#: pamac-manager.py:671
msgid "Reinstall"
msgstr ""
#: pamac-manager.py:682
msgid "Install optional deps"
msgstr ""
#: pamac-manager.py:687
msgid "Mark as explicitly installed"
msgstr ""
#: pamac-manager.py:691
msgid "Install"
msgstr ""
#: pamac-manager.py:702
msgid "Install with optional deps"
msgstr ""
#: pamac-manager.py:1009 pamac-updater.py:214 pamac-install.py:160
msgid "Pamac is already running"
msgstr ""
#: pamac-updater.py:44 pamac-updater.py:59 pamac-tray.py:40
msgid "Your system is up-to-date"
msgstr ""
#: pamac-updater.py:74 pamac/transaction.py:787
msgid "Total download size:"
msgstr ""
#: pamac-updater.py:76 pamac-tray.py:38
msgid "1 available update"
msgstr ""
#: pamac-updater.py:78 pamac-tray.py:37
#, python-brace-format
msgid "{number} available updates"
msgstr ""
#: pamac-tray.py:50 pamac-tray.py:126 pamac-tray.py:148 gui/updater.ui:24
msgid "Update Manager"
msgstr ""
#: pamac-tray.py:54 gui/manager.ui:324
msgid "Package Manager"
msgstr ""
#: pamac-tray.py:58
msgid "Quit"
msgstr ""
#: pamac-install.py:66
msgid ""
"Some updates are available.\n"
"Please update your system first"
msgstr ""
#: pamac-install.py:72 pamac/transaction.py:406 pamac/transaction.py:799
msgid "Preparing"
msgstr ""
#: pamac/transaction.py:94 gui/dialogs.ui:369
msgid "How often to check for updates, value in hours"
msgstr ""
#: pamac/transaction.py:192
#, python-brace-format
msgid ""
"{pkgname} is provided by {number} packages.\n"
"Please choose those you would like to install:"
msgstr ""
#: pamac/transaction.py:257
msgid "Refreshing"
msgstr ""
#: pamac/transaction.py:341 pamac/transaction.py:380
#, python-brace-format
msgid "{pkgname} depends on {dependname} but it is not installable"
msgstr ""
#: pamac/transaction.py:384
#, python-brace-format
msgid "Failed to get {pkgname} archive from AUR"
msgstr ""
#: pamac/transaction.py:552 pamac/transaction.py:558
msgid "Build process failed."
msgstr ""
#: pamac/transaction.py:644
#, python-brace-format
msgid "Building {pkgname}"
msgstr ""
#: pamac/transaction.py:685
msgid "Checking for updates"
msgstr ""
#: pamac/transaction.py:735
msgid "Transaction Summary"
msgstr ""
#: pamac/transaction.py:743
msgid "To downgrade"
msgstr ""
#: pamac/transaction.py:751
msgid "To build"
msgstr ""
#: pamac/transaction.py:765
msgid "To reinstall"
msgstr ""
#: pamac/transaction.py:774
msgid "To update"
msgstr ""
#: pamac/common.py:30
#, python-format
msgid "%.1f KiB"
msgstr ""
#: pamac/common.py:33
#, python-format
msgid "%.2f MiB"
msgstr ""
#: gui/manager.ui:8
msgid "About Pamac"
msgstr ""
#: gui/manager.ui:13
msgid "Copyright © 2013 Guillaume Benoit"
msgstr ""
#: gui/manager.ui:14
msgid "A gtk3 frontend for pyalpm"
msgstr ""
#: gui/manager.ui:44
msgid "Pamac History"
msgstr ""
#: gui/manager.ui:160
msgid "View History"
msgstr ""
#: gui/manager.ui:170 gui/manager.ui:212
msgid "Install local packages"
msgstr ""
#: gui/manager.ui:344
msgid "Refresh"
msgstr ""
#: gui/manager.ui:362
msgid "Apply changes"
msgstr ""
#: gui/manager.ui:380
msgid "Cancel"
msgstr ""
#: gui/manager.ui:453
msgid "Search in AUR"
msgstr ""
#: gui/manager.ui:511
msgid "Search"
msgstr ""
#: gui/manager.ui:604 gui/manager.ui:696
msgid "State"
msgstr ""
#: gui/manager.ui:651
msgid "Repos"
msgstr ""
#: gui/manager.ui:709
msgid "Name"
msgstr ""
#: gui/manager.ui:722
msgid "Version"
msgstr ""
#: gui/manager.ui:735
msgid "Repo"
msgstr ""
#: gui/manager.ui:748
msgid "Size"
msgstr ""
#: gui/manager.ui:850
msgid "Infos"
msgstr ""
#: gui/manager.ui:914
msgid "Deps"
msgstr ""
#: gui/manager.ui:983
msgid "Details"
msgstr ""
#: gui/manager.ui:1012
msgid "Files"
msgstr ""
#: gui/dialogs.ui:70
msgid "Progress"
msgstr ""
#: gui/dialogs.ui:162
msgid "details"
msgstr ""
#: gui/dialogs.ui:292
msgid "Pamac Preferences"
msgstr ""
#: gui/dialogs.ui:316
msgid "Enable AUR support"
msgstr ""
#: gui/dialogs.ui:320
msgid "Allow Pamac to search and install packages from AUR"
msgstr ""
#: gui/dialogs.ui:333
msgid "Remove unrequired dependencies"
msgstr ""
#: gui/dialogs.ui:337
msgid ""
"When removing a package, also remove those dependencies that are not "
"required by other packages"
msgstr ""
#: gui/dialogs.ui:396
msgid "Options"
msgstr ""
#: gui/dialogs.ui:465
msgid "Choose"
msgstr ""
#: gui/dialogs.ui:579
msgid "Summary"
msgstr ""

1036
po/ko.po

File diff suppressed because it is too large Load Diff

1134
po/ms.po

File diff suppressed because it is too large Load Diff

1152
po/nb.po

File diff suppressed because it is too large Load Diff

1152
po/nl.po

File diff suppressed because it is too large Load Diff

590
po/pamac.pot Normal file
View File

@ -0,0 +1,590 @@
# Translation of Pamac.
# Copyright (C) 2007-2012 Free Software Foundation, Inc.
# This file is distributed under the same license as the Pamac package.
# Guillaume Benoit <guillaume@manjaro.org>, 2013-2014.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: pamac 2.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-10-23 15:09+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: data/polkit/org.manjaro.pamac.policy:10
msgid "Authentication is required"
msgstr ""
#: resources/choose_provider_dialog.ui:6
msgid "Choose a Provider"
msgstr ""
#: resources/choose_provider_dialog.ui:22
#: resources/transaction_sum_dialog.ui:34 resources/preferences_dialog.ui:22
msgid "_OK"
msgstr ""
#: resources/packages_chooser_dialog.ui:6 resources/manager_window.ui:765
msgid "Install local packages"
msgstr ""
#: resources/packages_chooser_dialog.ui:28 resources/progress_dialog.ui:28
#: resources/transaction_sum_dialog.ui:20
msgid "_Cancel"
msgstr ""
#: resources/packages_chooser_dialog.ui:40
msgid "_Open"
msgstr ""
#: resources/progress_dialog.ui:6
msgid "Progress"
msgstr ""
#: resources/progress_dialog.ui:41 resources/history_dialog.ui:22
#: resources/transaction_info_dialog.ui:20 resources/updater_window.ui:153
#: resources/preferences_dialog.ui:36
msgid "_Close"
msgstr ""
#: resources/progress_dialog.ui:92 resources/transaction_info_dialog.ui:79
#: resources/manager_window.ui:695
msgid "Details"
msgstr ""
#: resources/history_dialog.ui:6
msgid "Pamac History"
msgstr ""
#: resources/transaction_sum_dialog.ui:5 src/transaction.vala:387
msgid "Transaction Summary"
msgstr ""
#: resources/manager_window.ui:7 src/tray.vala:74
msgid "Package Manager"
msgstr ""
#: resources/manager_window.ui:25
msgid "Refresh databases"
msgstr ""
#: resources/manager_window.ui:48
msgid "Apply changes"
msgstr ""
#: resources/manager_window.ui:71
msgid "Cancel all planned changes"
msgstr ""
#: resources/manager_window.ui:156 resources/manager_window.ui:168
msgid "Search in AUR"
msgstr ""
#: resources/manager_window.ui:221
msgid "Search"
msgstr ""
#: resources/manager_window.ui:266 src/manager_window.vala:397
msgid "Groups"
msgstr ""
#: resources/manager_window.ui:312 resources/manager_window.ui:406
msgid "State"
msgstr ""
#: resources/manager_window.ui:358
msgid "Repositories"
msgstr ""
#: resources/manager_window.ui:421
msgid "Name"
msgstr ""
#: resources/manager_window.ui:436
msgid "Version"
msgstr ""
#: resources/manager_window.ui:451 src/manager_window.vala:389
msgid "Repository"
msgstr ""
#: resources/manager_window.ui:466
msgid "Size"
msgstr ""
#: resources/manager_window.ui:570
msgid "Description"
msgstr ""
#: resources/manager_window.ui:630
msgid "Dependencies"
msgstr ""
#: resources/manager_window.ui:728
msgid "Files"
msgstr ""
#: resources/manager_window.ui:757
msgid "View History"
msgstr ""
#: resources/manager_window.ui:773 resources/updater_window.ui:101
msgid "_Preferences"
msgstr ""
#: resources/manager_window.ui:782
msgid "_About"
msgstr ""
#: resources/updater_window.ui:6 src/tray.vala:71 src/tray.vala:157
#: src/tray.vala:229
msgid "Update Manager"
msgstr ""
#: resources/updater_window.ui:126
msgid "_Refresh"
msgstr ""
#: resources/updater_window.ui:139
msgid "_Apply"
msgstr ""
#: resources/preferences_dialog.ui:6
msgid "Preferences"
msgstr ""
#: resources/preferences_dialog.ui:71
msgid "Enable AUR support"
msgstr ""
#: resources/preferences_dialog.ui:84
msgid "Allow Pamac to search and install packages from AUR"
msgstr ""
#: resources/preferences_dialog.ui:102
msgid "Remove unrequired dependencies"
msgstr ""
#: resources/preferences_dialog.ui:115
msgid ""
"When removing a package, also remove its dependencies that are not required "
"by other packages"
msgstr ""
#: resources/preferences_dialog.ui:149 src/preferences_dialog.vala:37
msgid "How often to check for updates, value in hours"
msgstr ""
#: resources/preferences_dialog.ui:173
msgid "Options"
msgstr ""
#: src/packages_chooser_dialog.vala:32
msgid "Alpm Package"
msgstr ""
#: src/daemon.vala:64
msgid "Failed to initialize alpm library"
msgstr ""
#: src/daemon.vala:135 src/daemon.vala:141
msgid "Failed to synchronize any databases"
msgstr ""
#: src/daemon.vala:184
msgid "Failed to init transaction"
msgstr ""
#: src/daemon.vala:196 src/daemon.vala:214 src/daemon.vala:226
#: src/daemon.vala:240 src/daemon.vala:252 src/daemon.vala:269
#: src/daemon.vala:276 src/daemon.vala:290 src/daemon.vala:340
msgid "Failed to prepare transaction"
msgstr ""
#: src/daemon.vala:215 src/daemon.vala:270
#, c-format
msgid "target not found: %s"
msgstr ""
#: src/daemon.vala:298
#, c-format
msgid "package %s does not have a valid architecture"
msgstr ""
#: src/daemon.vala:307
#, c-format
msgid "%s: requires %s"
msgstr ""
#: src/daemon.vala:315
#, c-format
msgid "%s and %s are in conflict"
msgstr ""
#: src/daemon.vala:334
#, c-format
msgid "%s needs to be removed but it is a locked package"
msgstr ""
#: src/daemon.vala:403
msgid "Failed to commit transaction"
msgstr ""
#: src/daemon.vala:417
#, c-format
msgid "%s exists in both %s and %s"
msgstr ""
#: src/daemon.vala:420
#, c-format
msgid "%s: %s already exists in filesystem"
msgstr ""
#: src/daemon.vala:433
#, c-format
msgid "%s is invalid or corrupted"
msgstr ""
#: src/daemon.vala:465
msgid "Authentication failed"
msgstr ""
#: src/transaction.vala:177
msgid "Synchronizing package databases"
msgstr ""
#: src/transaction.vala:231
msgid "Starting full system upgrade"
msgstr ""
#: src/transaction.vala:286
msgid "Preparing"
msgstr ""
#: src/transaction.vala:359
#, c-format
msgid "Choose a provider for %s"
msgstr ""
#: src/transaction.vala:417 src/manager_window.vala:245
#: src/manager_window.vala:974
msgid "To remove"
msgstr ""
#: src/transaction.vala:430
msgid "To downgrade"
msgstr ""
#: src/transaction.vala:443
msgid "To build"
msgstr ""
#: src/transaction.vala:456 src/manager_window.vala:244
#: src/manager_window.vala:963
msgid "To install"
msgstr ""
#: src/transaction.vala:469
msgid "To reinstall"
msgstr ""
#: src/transaction.vala:483
msgid "To update"
msgstr ""
#: src/transaction.vala:496 src/updater_window.vala:182
msgid "Total download size"
msgstr ""
#: src/transaction.vala:513
msgid "Building packages"
msgstr ""
#: src/transaction.vala:570
msgid "Checking dependencies"
msgstr ""
#: src/transaction.vala:575
msgid "Checking file conflicts"
msgstr ""
#: src/transaction.vala:580
msgid "Resolving dependencies"
msgstr ""
#: src/transaction.vala:585
msgid "Checking inter-conflicts"
msgstr ""
#: src/transaction.vala:592 src/transaction.vala:594
#, c-format
msgid "Installing %s"
msgstr ""
#: src/transaction.vala:600 src/transaction.vala:602
#, c-format
msgid "Reinstalling %s"
msgstr ""
#: src/transaction.vala:608 src/transaction.vala:610
#, c-format
msgid "Removing %s"
msgstr ""
#: src/transaction.vala:616 src/transaction.vala:618
#, c-format
msgid "Upgrading %s"
msgstr ""
#: src/transaction.vala:624 src/transaction.vala:626
#, c-format
msgid "Downgrading %s"
msgstr ""
#: src/transaction.vala:630
msgid "Checking integrity"
msgstr ""
#: src/transaction.vala:636
msgid "Checking keyring"
msgstr ""
#: src/transaction.vala:641
msgid "Downloading required keys"
msgstr ""
#: src/transaction.vala:646
msgid "Loading packages files"
msgstr ""
#: src/transaction.vala:651
msgid "Checking delta integrity"
msgstr ""
#: src/transaction.vala:656
msgid "Applying deltas"
msgstr ""
#: src/transaction.vala:661
#, c-format
msgid "Generating %s with %s"
msgstr ""
#: src/transaction.vala:666
msgid "Generation succeeded"
msgstr ""
#: src/transaction.vala:671
msgid "Generation failed"
msgstr ""
#: src/transaction.vala:676
#, c-format
msgid "Configuring %s"
msgstr ""
#: src/transaction.vala:682
msgid "Downloading"
msgstr ""
#: src/transaction.vala:687
msgid "Checking available disk space"
msgstr ""
#: src/transaction.vala:692
#, c-format
msgid "%s optionally requires %s"
msgstr ""
#: src/transaction.vala:695
#, c-format
msgid "Database file for %s does not exist"
msgstr ""
#: src/transaction.vala:747
#, c-format
msgid "Refreshing %s"
msgstr ""
#: src/transaction.vala:749
#, c-format
msgid "Downloading %s"
msgstr ""
#: src/transaction.vala:797 src/transaction.vala:799 src/transaction.vala:816
msgid "Warning"
msgstr ""
#: src/transaction.vala:804 src/transaction.vala:806 src/transaction.vala:837
#: src/installer.vala:41 src/manager.vala:41 src/updater.vala:41
msgid "Error"
msgstr ""
#: src/transaction.vala:904 src/transaction.vala:920
#: src/progress_dialog.vala:55
msgid "Transaction cancelled"
msgstr ""
#: src/transaction.vala:934
msgid "Nothing to do"
msgstr ""
#: src/transaction.vala:956 src/transaction.vala:972
msgid "Transaction successfully finished"
msgstr ""
#: src/installer.vala:43 src/manager.vala:43 src/updater.vala:43
msgid "Pamac is already running"
msgstr ""
#: src/tray.vala:25 src/updater_window.vala:175
msgid "Your system is up-to-date"
msgstr ""
#: src/tray.vala:77
msgid "_Quit"
msgstr ""
#: src/tray.vala:136 src/updater_window.vala:178
#, c-format
msgid "%u available update"
msgid_plural "%u available updates"
msgstr[0] ""
msgstr[1] ""
#: src/tray.vala:158
msgid "Show available updates"
msgstr ""
#: src/manager_window.vala:132
msgid "Deselect"
msgstr ""
#: src/manager_window.vala:135
msgid "Install"
msgstr ""
#: src/manager_window.vala:138
msgid "Remove"
msgstr ""
#: src/manager_window.vala:143
msgid "Reinstall"
msgstr ""
#: src/manager_window.vala:146
msgid "Install optional dependencies"
msgstr ""
#: src/manager_window.vala:149
msgid "Mark as explicitly installed"
msgstr ""
#: src/manager_window.vala:225 src/manager_window.vala:1016
msgid "local"
msgstr ""
#: src/manager_window.vala:241 src/manager_window.vala:311
#: src/manager_window.vala:323 src/manager_window.vala:980
msgid "Installed"
msgstr ""
#: src/manager_window.vala:243 src/manager_window.vala:990
msgid "Orphans"
msgstr ""
#: src/manager_window.vala:271
msgid "Licenses"
msgstr ""
#: src/manager_window.vala:293
msgid "Depends On"
msgstr ""
#: src/manager_window.vala:313
msgid "Optional Dependencies"
msgstr ""
#: src/manager_window.vala:333
msgid "Required By"
msgstr ""
#: src/manager_window.vala:347
msgid "Provides"
msgstr ""
#: src/manager_window.vala:360
msgid "Replaces"
msgstr ""
#: src/manager_window.vala:373
msgid "Conflicts With"
msgstr ""
#: src/manager_window.vala:407
msgid "Packager"
msgstr ""
#: src/manager_window.vala:413
msgid "Install Date"
msgstr ""
#: src/manager_window.vala:417
msgid "Explicitly installed"
msgstr ""
#: src/manager_window.vala:419
msgid "Installed as a dependency for another package"
msgstr ""
#: src/manager_window.vala:421
msgid "Unknown"
msgstr ""
#: src/manager_window.vala:423
msgid "Install Reason"
msgstr ""
#: src/manager_window.vala:428
msgid "Signatures"
msgstr ""
#: src/manager_window.vala:436
msgid "Backup files"
msgstr ""
#: src/manager_window.vala:559 src/manager_window.vala:700
msgid "No package found"
msgstr ""
#: src/manager_window.vala:653
#, c-format
msgid ""
"%s has %u uninstalled optional dependencies.\n"
"Choose those you would like to install:"
msgstr ""
#: src/manager_window.vala:982
msgid "Uninstalled"
msgstr ""
#: src/manager_window.vala:1134
msgid "A Gtk3 frontend for libalpm"
msgstr ""
#: src/common.vala:48
#, c-format
msgid "%.0f KiB"
msgstr ""
#: src/common.vala:51
#, c-format
msgid "%.2f MiB"
msgstr ""

1161
po/pl.po

File diff suppressed because it is too large Load Diff

View File

@ -3,11 +3,12 @@
# This file is distributed under the same license as the Pamac package.
# Guillaume Benoit <guillaume@manjaro.org>, 2013-2014.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: pamac 0.9\n"
"Project-Id-Version: pamac 2.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-03-30 15:09+0100\n"
"POT-Creation-Date: 2014-10-23 15:09+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -15,6 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: data/polkit/org.manjaro.pamac.policy:10
msgid "Authentication is required"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1157
po/ro.po

File diff suppressed because it is too large Load Diff

1156
po/ru.po

File diff suppressed because it is too large Load Diff

1042
po/si.po

File diff suppressed because it is too large Load Diff

1155
po/sk.po

File diff suppressed because it is too large Load Diff

1151
po/sl.po

File diff suppressed because it is too large Load Diff

1036
po/sr.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1153
po/sv.po

File diff suppressed because it is too large Load Diff

1149
po/tr.po

File diff suppressed because it is too large Load Diff

1142
po/uk.po

File diff suppressed because it is too large Load Diff

5
po/update_po_files.sh Executable file
View File

@ -0,0 +1,5 @@
#! /bin/sh
for i in `ls po | sed s'|.po||'` ; do
msgmerge --update ./$i.po pamac.pot
done

File diff suppressed because it is too large Load Diff

1134
po/uz.po

File diff suppressed because it is too large Load Diff

1143
po/vi.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1031
po/zh.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

45
resources/Makefile Normal file
View File

@ -0,0 +1,45 @@
MANAGER_GRESOURCE_FILE = pamac.manager.gresource.xml
MANAGER_RESOURCES_FILES = manager_window.ui \
packages_chooser_dialog.ui \
choose_dep_dialog.ui \
history_dialog.ui \
preferences_dialog.ui \
progress_dialog.ui \
choose_provider_dialog.ui \
transaction_sum_dialog.ui \
transaction_info_dialog.ui \
package-available.png \
package-install.png \
package-installed-locked.png \
package-installed-updated.png \
package-reinstall.png \
package-remove.png
UPDATER_GRESOURCE_FILE = pamac.updater.gresource.xml
UPDATER_RESOURCES_FILES = updater_window.ui \
preferences_dialog.ui \
progress_dialog.ui \
choose_provider_dialog.ui \
transaction_sum_dialog.ui \
transaction_info_dialog.ui
INSTALLER_GRESOURCE_FILE = pamac.installer.gresource.xml
INSTALLER_RESOURCES_FILES = progress_dialog.ui \
choose_provider_dialog.ui \
transaction_sum_dialog.ui \
transaction_info_dialog.ui
manager_resources.c: $(MANAGER_GRESOURCE_FILE) $(MANAGER_RESOURCES_FILES)
glib-compile-resources $(MANAGER_GRESOURCE_FILE) --target=manager_resources.c --generate-source
updater_resources.c: $(UPDATER_GRESOURCE_FILE) $(UPDATER_RESOURCES_FILES)
glib-compile-resources $(UPDATER_GRESOURCE_FILE) --target=updater_resources.c --generate-source
installer_resources.c: $(INSTALLER_GRESOURCE_FILE) $(INSTALLER_RESOURCES_FILES)
glib-compile-resources $(INSTALLER_GRESOURCE_FILE) --target=installer_resources.c --generate-source
resources: manager_resources.c updater_resources.c installer_resources.c

View File

@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="3.12"/>
<template class="PamacChooseDependenciesDialog" parent="GtkDialog">
<property name="border_width">6</property>
<property name="title" translatable="yes">Choose Optional Dependencies</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>
<child internal-child="vbox">
<object class="GtkBox" id="dialog-vbox1">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">12</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="valid_button">
<property name="label" translatable="yes">_OK</property>
<property name="use_underline">True</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="has_focus">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</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="treeview">
<property name="visible">True</property>
<property name="can_focus">True</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-selection5">
<property name="mode">none</property>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="treeviewcolumn1">
<property name="sizing">autosize</property>
<child>
<object class="GtkCellRendererToggle" id="renderertoggle">
<signal name="toggled" handler="on_renderertoggle_toggled" swapped="no"/>
</object>
<attributes>
<attribute name="active">0</attribute>
</attributes>
</child>
<child>
<object class="GtkCellRendererText" id="renderertext1"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
<child>
<object class="GtkCellRendererText" id="renderertext2"/>
<attributes>
<attribute name="text">2</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-5">valid_button</action-widget>
</action-widgets>
</template>
</interface>

View File

@ -0,0 +1,79 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="3.12"/>
<template class="PamacChooseProviderDialog" parent="GtkDialog">
<property name="border_width">6</property>
<property name="title" translatable="yes">Choose a Provider</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>
<child internal-child="vbox">
<object class="GtkBox" id="dialog-vbox2">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area2">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="valid_button">
<property name="label" translatable="yes">_OK</property>
<property name="use_underline">True</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="has_focus">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
</packing>
</child>
<child>
<object class="GtkBox" id="box4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="track_visited_links">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<object class="GtkComboBoxText" id="comboboxtext">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-5">valid_button</action-widget>
</action-widgets>
</template>
</interface>

Some files were not shown because too many files have changed in this diff Show More