Commit 409b2735 authored by Philip Müller's avatar Philip Müller

Merge branch 'master' of github.com:manjaro/pamac

parents 44c45e21 57a38b30
......@@ -2,7 +2,6 @@
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 \
......
......@@ -52,7 +52,6 @@
<property name="pixels_below_lines">2</property>
<property name="editable">False</property>
<property name="cursor_visible">False</property>
<signal name="size-allocate" handler="on_textview_size_allocate" swapped="no"/>
</object>
</child>
</object>
......
......@@ -561,6 +561,8 @@
</child>
<child>
<object class="GtkNotebook" id="properties_notebook">
<property name="width_request">500</property>
<property name="height_request">150</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<signal name="switch-page" handler="on_properties_notebook_switch_page" after="yes" swapped="no"/>
......@@ -584,6 +586,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">start</property>
<property name="margin">6</property>
<property name="selectable">True</property>
</object>
<packing>
......@@ -597,6 +600,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">start</property>
<property name="margin">6</property>
<property name="selectable">True</property>
</object>
<packing>
......@@ -611,6 +615,7 @@
<property name="can_focus">True</property>
<property name="has_focus">True</property>
<property name="halign">start</property>
<property name="margin">6</property>
</object>
<packing>
<property name="expand">False</property>
......@@ -623,6 +628,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">start</property>
<property name="margin">6</property>
<property name="selectable">True</property>
</object>
<packing>
......
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="3.12"/>
<template class="PamacPackagesChooserDialog" parent="GtkFileChooserDialog">
<property name="border_width">6</property>
<property name="title" translatable="yes">Install local packages</property>
<property name="role">GtkFileChooserDialog</property>
<property name="modal">True</property>
<property name="window_position">center-on-parent</property>
<property name="default_width">900</property>
<property name="icon_name">system-software-install</property>
<property name="type_hint">dialog</property>
<property name="create_folders">False</property>
<property name="local_only">False</property>
<property name="select_multiple">True</property>
<signal name="file-activated" handler="on_file_activated" swapped="no"/>
<child internal-child="vbox">
<object class="GtkBox" id="filechooserdialog-vbox1">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="filechooserdialog-action_area1">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="package_cancel_button">
<property name="label" translatable="yes">_Cancel</property>
<property name="use_underline">True</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<object class="GtkButton" id="package_open_button">
<property name="label" translatable="yes">_Open</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>
</object>
</child>
<action-widgets>
<action-widget response="-6">package_cancel_button</action-widget>
<action-widget response="-3">package_open_button</action-widget>
</action-widgets>
</template>
</interface>
......@@ -3,7 +3,6 @@
<gresource prefix="/org/manjaro/pamac/manager">
<file preprocess="xml-stripblanks">manager_window.ui</file>
<file preprocess="xml-stripblanks">history_dialog.ui</file>
<file preprocess="xml-stripblanks">packages_chooser_dialog.ui</file>
<file preprocess="xml-stripblanks">choose_dep_dialog.ui</file>
<file preprocess="to-pixdata">package-available.png</file>
<file preprocess="to-pixdata">package-install.png</file>
......
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<interface>
<requires lib="gtk+" version="3.12"/>
<template class="PamacUpdaterWindow" parent="GtkApplicationWindow">
<property name="visible">True</property>
<property name="title" translatable="yes">Update Manager</property>
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="title" translatable="yes">Update Manager</property>
<property name="window_position">center</property>
<property name="default_width">500</property>
<property name="icon_name">system-software-update</property>
<property name="show_menubar">True</property>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
......@@ -25,6 +26,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
......@@ -48,16 +50,28 @@
<property name="mode">none</property>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="treeviewcolumn3">
<child>
<object class="GtkCellRendererToggle" id="select_update">
<signal name="toggled" handler="on_select_update_toggled" swapped="no"/>
</object>
<attributes>
<attribute name="active">0</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="treeviewcolumn1">
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="_name">
<object class="GtkCellRendererText" id="update_name">
<property name="width">200</property>
<property name="height">22</property>
</object>
<attributes>
<attribute name="text">0</attribute>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
......@@ -65,12 +79,12 @@
<child>
<object class="GtkTreeViewColumn" id="treeviewcolumn2">
<child>
<object class="GtkCellRendererText" id="_size">
<object class="GtkCellRendererText" id="download_size">
<property name="width">80</property>
<property name="height">22</property>
</object>
<attributes>
<attribute name="text">1</attribute>
<attribute name="text">2</attribute>
</attributes>
</child>
</object>
......@@ -81,6 +95,7 @@
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
......@@ -91,6 +106,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
......@@ -108,18 +124,21 @@
<property name="label" translatable="yes">_Preferences</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_preferences_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
......@@ -133,12 +152,14 @@
<property name="label" translatable="yes">_Refresh</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_refresh_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
......@@ -147,12 +168,14 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="has_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_apply_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
......@@ -160,12 +183,14 @@
<property name="label" translatable="yes">_Close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="on_close_button_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
......@@ -173,12 +198,14 @@
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</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>
......
......@@ -39,29 +39,24 @@ clean:
rm -f *.c pamac-refresh pamac-daemon pamac-tray pamac-updater pamac-manager pamac-install
pamac-refresh: refresh.vala
valac -X -w -X -I/usr/include/glib-2.0 -X -I/usr/lib/glib-2.0/include -X -lglib-2.0 -o pamac-refresh \
valac -o pamac-refresh \
--pkg=gio-2.0 \
refresh.vala
pamac-tray: ../util/alpm-util.c common.vala alpm_config.vala pamac_config.vala tray.vala
valac -X -w -X -I/usr/include/glib-2.0 -X -I/usr/lib/glib-2.0/include -X -lglib-2.0 -o pamac-tray \
pamac-tray: ../vapi/libalpm.vapi ../util/alpm-util.c common.vala alpm_config.vala pamac_config.vala tray.vala
valac -o pamac-tray \
$(COMMON_VALA_FLAGS) \
../util/alpm-util.c \
--pkg=posix \
--pkg=libalpm \
--pkg=gio-2.0 \
--pkg=gtk+-3.0 \
--pkg=libnotify \
--vapidir=../vapi \
--Xcc=-I../util \
-X -D_FILE_OFFSET_BITS=64 \
-X -DGETTEXT_PACKAGE="pamac" \
../util/alpm-util.c \
common.vala \
alpm_config.vala \
pamac_config.vala \
tray.vala
pamac-daemon: ../vapi/libalpm.vapi ../vapi/polkit-gobject-1.vapi $(COMMON_SOURCES) alpm_config.vala alpm_utils.vala aur.vala daemon.vala
valac -X -w -X -I/usr/include/glib-2.0 -X -I/usr/lib/glib-2.0/include -X -lglib-2.0 -o pamac-daemon \
valac -o pamac-daemon \
$(COMMON_VALA_FLAGS) \
--pkg=posix \
--pkg=json-glib-1.0 \
......@@ -74,8 +69,8 @@ pamac-daemon: ../vapi/libalpm.vapi ../vapi/polkit-gobject-1.vapi $(COMMON_SOURCE
alpm_utils.vala \
daemon.vala
pamac-manager: ../vapi/libalpm.vapi $(COMMON_SOURCES) $(TRANSACTION_SOURCES) choose_dep_dialog.vala history_dialog.vala packages_chooser_dialog.vala ../resources/manager_resources.c packages_model.vala manager_window.vala manager.vala
valac -X -w -X -I/usr/include/glib-2.0 -X -I/usr/lib/glib-2.0/include -X -lglib-2.0 -o pamac-manager \
pamac-manager: ../vapi/libalpm.vapi $(COMMON_SOURCES) $(TRANSACTION_SOURCES) choose_dep_dialog.vala history_dialog.vala ../resources/manager_resources.c packages_model.vala manager_window.vala manager.vala
valac -o pamac-manager \
$(COMMON_VALA_FLAGS) \
$(TRANSACTION_VALA_FLAGS) \
--gresources=$(MANAGER_GRESOURCE_FILE) \
......@@ -83,14 +78,13 @@ pamac-manager: ../vapi/libalpm.vapi $(COMMON_SOURCES) $(TRANSACTION_SOURCES) cho
$(TRANSACTION_SOURCES) \
choose_dep_dialog.vala \
history_dialog.vala \
packages_chooser_dialog.vala \
../resources/manager_resources.c \
packages_model.vala \
manager_window.vala \
manager.vala
pamac-updater: ../vapi/libalpm.vapi $(COMMON_SOURCES) $(TRANSACTION_SOURCES) ../resources/updater_resources.c updater_window.vala updater.vala
valac -X -w -X -I/usr/include/glib-2.0 -X -I/usr/lib/glib-2.0/include -X -lglib-2.0 -o pamac-updater \
valac -o pamac-updater \
$(COMMON_VALA_FLAGS) \
$(TRANSACTION_VALA_FLAGS) \
--gresources=$(UPDATER_GRESOURCE_FILE) \
......@@ -101,7 +95,7 @@ pamac-updater: ../vapi/libalpm.vapi $(COMMON_SOURCES) $(TRANSACTION_SOURCES) ../
updater.vala
pamac-install: ../vapi/libalpm.vapi $(COMMON_SOURCES) $(TRANSACTION_SOURCES) ../resources/installer_resources.c installer.vala
valac -X -w -X -I/usr/include/glib-2.0 -X -I/usr/lib/glib-2.0/include -X -lglib-2.0 -o pamac-install \
valac -o pamac-install \
$(COMMON_VALA_FLAGS) \
$(TRANSACTION_VALA_FLAGS) \
--gresources=$(INSTALLER_GRESOURCE_FILE) \
......
......@@ -95,7 +95,6 @@ namespace Alpm {
repo_order = {};
// parse conf file
parse_file (conf_path);
get_handle ();
}
public void get_handle () {
......
......@@ -114,6 +114,9 @@ namespace AUR {
public Json.Array multiinfo (string[] pkgnames) {
Json.Array results = new Json.Array ();
if (pkgnames.length == 0) {
return results;
}
var builder = new StringBuilder ();
builder.append (rpc_url);
builder.append (rpc_multiinfo);
......
......@@ -46,8 +46,7 @@ namespace Pamac {
if (deps_list.get_iter_from_string (out iter, path)) {;
deps_list.get_value (iter, 0, out val);
selected = val.get_boolean ();
selected = (!selected);
deps_list.set_value (iter, 0, selected);
deps_list.set_value (iter, 0, !selected);
}
}
}
......
This diff is collapsed.
......@@ -28,13 +28,5 @@ namespace Pamac {
public HistoryDialog (ManagerWindow window) {
Object (transient_for: window, use_header_bar: 0);
}
[GtkCallback]
public void on_textview_size_allocate () {
// auto-scrolling method
var scrollable = textview as Gtk.Scrollable;
var adj = scrollable.get_vadjustment ();
adj.set_value (adj.get_upper () - adj.get_page_size ());
}
}
}
......@@ -63,7 +63,7 @@ namespace Pamac {
if (pamac_run == false) {
foreach (File file in files) {
string? path = file.get_path ();
transaction.to_load.insert (path, path);
transaction.to_load.add ((owned) path);
}
transaction.run ();
}
......
This diff is collapsed.
/*
* pamac-vala
*
* Copyright (C) 2014-2015 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 3 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 get of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Pamac {
[GtkTemplate (ui = "/org/manjaro/pamac/manager/packages_chooser_dialog.ui")]
public class PackagesChooserDialog : Gtk.FileChooserDialog {
ManagerWindow window;
Transaction transaction;
public PackagesChooserDialog (ManagerWindow window, Transaction transaction) {
Object (transient_for: window, use_header_bar: 0);
Gtk.FileFilter package_filter = new Gtk.FileFilter ();
package_filter.set_filter_name (dgettext (null, "Alpm Package"));
package_filter.add_pattern ("*.pkg.tar.xz");
this.add_filter (package_filter);
this.window = window;
this.transaction = transaction;
}
[GtkCallback]
public void on_file_activated () {
SList<string> packages_paths = this.get_filenames ();
if (packages_paths.length () != 0) {
foreach (string path in packages_paths) {
transaction.to_load.insert (path, path);
}
window.get_window ().set_cursor (new Gdk.Cursor (Gdk.CursorType.WATCH));
this.hide ();
while (Gtk.events_pending ()) {
Gtk.main_iteration ();
}
transaction.run ();
}
}
}
}
......@@ -20,18 +20,53 @@
namespace Pamac {
[DBus (name = "org.manjaro.pamac")]
public interface Daemon : Object {
public abstract void start_refresh (int force, bool emit_signal) throws IOError;
public abstract void start_refresh (int force) throws IOError;
}
}
bool check_pamac_running () {
Application app;
bool run = false;
app = new Application ("org.manjaro.pamac.manager", 0);
try {
app.register ();
} catch (GLib.Error e) {
stderr.printf ("%s\n", e.message);
}
run = app.get_is_remote ();
if (run) {
return run;
}
app = new Application ("org.manjaro.pamac.updater", 0);
try {
app.register ();
} catch (GLib.Error e) {
stderr.printf ("%s\n", e.message);
}
run = app.get_is_remote ();
if (run) {
return run;
}
app = new Application ("org.manjaro.pamac.install", 0);
try {
app.register ();
} catch (GLib.Error e) {
stderr.printf ("%s\n", e.message);
}
run = app.get_is_remote ();
return run;
}
int main (string[] args) {
Pamac.Daemon daemon;
try {
daemon = Bus.get_proxy_sync (BusType.SYSTEM, "org.manjaro.pamac",
"/org/manjaro/pamac");
daemon.start_refresh (0, false);
} catch (IOError e) {
stderr.printf ("IOError: %s\n", e.message);
if (check_pamac_running () == false) {
try {
daemon = Bus.get_proxy_sync (BusType.SYSTEM, "org.manjaro.pamac",
"/org/manjaro/pamac");
daemon.start_refresh (0);
} catch (IOError e) {
stderr.printf ("IOError: %s\n", e.message);
}
}
return 0;
}
This diff is collapsed.
......@@ -27,16 +27,17 @@ const string noupdate_info = _("Your system is up-to-date");
namespace Pamac {
[DBus (name = "org.manjaro.pamac")]
public interface Daemon : Object {
public abstract void start_refresh (int force, bool emit_signal) throws IOError;
public abstract void start_refresh (int force) throws IOError;
public abstract async Updates get_updates (bool enable_aur) throws IOError;
[DBus (no_reply = true)]
public abstract void quit () throws IOError;
public abstract async void quit () throws IOError;
public signal void refresh_finished (ErrorInfos error);
}
public class TrayIcon: Gtk.Application {
Notify.Notification notification;
Daemon daemon;
bool locked;
bool intern_lock;
bool extern_lock;
uint refresh_timeout_id;
Gtk.StatusIcon status_icon;
Gtk.Menu menu;
......@@ -54,15 +55,13 @@ namespace Pamac {
} catch (IOError e) {
stderr.printf ("IOError: %s\n", e.message);
}
// Connecting to signal
daemon.refresh_finished.connect (on_refresh_finished);
}
void stop_daemon () {
if (check_pamac_running () == false && lockfile.query_exists () == false) {
try {
daemon.quit ();
} catch (IOError e) {
stderr.printf ("IOError: %s\n", e.message);
}
daemon.quit.begin ();
}
}
......@@ -97,7 +96,7 @@ namespace Pamac {
try {
Process.spawn_command_line_async ("pamac-updater");
} catch (SpawnError e) {
print(e.message);
stderr.printf ("SpawnError: %s\n", e.message);
}
}
......@@ -105,7 +104,7 @@ namespace Pamac {
try {
Process.spawn_command_line_async ("pamac-manager");
} catch (SpawnError e) {
print(e.message);
stderr.printf ("SpawnError: %s\n", e.message);
}
}
......@@ -114,11 +113,12 @@ namespace Pamac {
status_icon.set_tooltip_markup (info);
}
bool refresh () {
bool start_refresh () {
if (check_pamac_running () == false) {
start_daemon ();
try {
daemon.start_refresh (0, false);
daemon.start_refresh (0);
intern_lock = true;
} catch (IOError e) {
stderr.printf ("IOError: %s\n", e.message);
}
......@@ -126,6 +126,11 @@ namespace Pamac {
return true;
}
void on_refresh_finished () {
intern_lock = false;
check_updates ();
}
void check_updates () {
var pamac_config = new Pamac.Config ("/etc/pamac.conf");
daemon.get_updates.begin (pamac_config.enable_aur, (obj, res) => {
......@@ -203,9 +208,9 @@ namespace Pamac {
}
bool check_pacman_running () {
if (locked) {
if (extern_lock) {
if (lockfile.query_exists () == false) {
locked = false;
extern_lock = false;
// let the time to the daemon to update packages
Timeout.add (1000, () => {
check_updates ();
......@@ -214,7 +219,9 @@ namespace Pamac {
}
} else {
if (lockfile.query_exists () == true) {
locked = true;
if (intern_lock == false) {
extern_lock = true;
}
}
}
return true;
......@@ -224,7 +231,7 @@ namespace Pamac {
if (refresh_timeout_id != 0) {
Source.remove (refresh_timeout_id);
}
refresh_timeout_id = Timeout.add_seconds (refresh_period_in_hours*3600, refresh);
refresh_timeout_id = Timeout.add_seconds (refresh_period_in_hours*3600, start_refresh);
}
public override void startup () {
......@@ -234,7 +241,8 @@ namespace Pamac {
base.startup ();
locked = false;
intern_lock = false;
extern_lock = false;
refresh_timeout_id = 0;
status_icon = new Gtk.StatusIcon ();
......@@ -249,7 +257,7 @@ namespace Pamac {
var alpm_config = new Alpm.Config ("/etc/pacman.conf");
lockfile = GLib.File.new_for_path (alpm_config.handle.lockfile);
Timeout.add (500, check_pacman_running);
refresh ();
start_refresh ();
var pamac_config = new Pamac.Config ("/etc/pamac.conf");
launch_refresh_timeout ((uint) pamac_config.refresh_period);
......
......@@ -27,6 +27,8 @@ namespace Pamac {
[GtkChild]
public Gtk.TreeView updates_treeview;
[GtkChild]
public Gtk.CellRendererToggle select_update;
[GtkChild]
public Gtk.Label bottom_label;
[GtkChild]
public Gtk.Button apply_button;
......@@ -38,7 +40,7 @@ namespace Pamac {
public UpdaterWindow (Gtk.Application application) {
Object (application: application);
updates_list = new Gtk.ListStore (2, typeof (string), typeof (string));
updates_list = new Gtk.ListStore (3, typeof (bool), typeof (string), typeof (string));
updates_treeview.set_model (updates_list);
transaction = new Transaction (this as Gtk.ApplicationWindow);
......@@ -51,6 +53,14 @@ namespace Pamac {
on_refresh_button_clicked ();
}
[GtkCallback]
public void on_select_update_toggled (string path) {
Gtk.TreePath treepath = new Gtk.TreePath.from_string (path);
Gtk.TreeIter iter;
updates_list.get_iter (out iter, treepath);
updates_list.set (iter, 0, !select_update.active);
}
[GtkCallback]
public void on_preferences_button_clicked () {
transaction.run_preferences_dialog.begin (() => {
......@@ -60,16 +70,33 @@ namespace Pamac {
[GtkCallback]
public void on_apply_button_clicked () {
this.get_window ().set_cursor (new Gdk.Cursor (Gdk.CursorType.WATCH));
this.get_window ().set_cursor (new Gdk.Cursor.for_display (Gdk.Display.get_default (), Gdk.CursorType.WATCH));
while (Gtk.events_pending ()) {
Gtk.main_iteration ();
}
updates_list.foreach ((model, path, iter) => {
GLib.Value val;
updates_list.get_value (iter, 0, out val);
bool selected = val.get_boolean ();
if (selected) {
updates_list.get_value (iter, 1, out val);
// string has the form "pkgname pkgversion"
string pkgname = val.get_string ().split (" ", 2)[0];
transaction.special_ignorepkgs.remove (pkgname);
} else {
updates_list.get_value (iter, 1, out val);
// string has the form "pkgname pkgversion"
string pkgname = val.get_string ().split (" ", 2)[0];
transaction.special_ignorepkgs.add ((owned) pkgname);
}
return false;