ACC SHELL
/**
* Module: packages_proposal.ycp
*
* Author: Arvin Schnell <arvin@suse.de>
*
* Purpose: Let user choose packages during update.
*
* $Id: packages_proposal.ycp 60593 2010-01-28 10:12:45Z locilka $
*/
{
textdomain "update";
import "HTML";
import "Packages";
import "SpaceCalculation";
import "PackagesUI";
import "Update";
string func = (string) WFM::Args(0);
map param = (map) WFM::Args(1);
map ret = $[];
define symbol call_packageselector ()
{
map<string,any> options = $[];
// changing the default mode if there are some unknown packages
if (Update::unknown_packages > 0)
options["mode"] = `summaryMode;
symbol ret = PackagesUI::RunPackageSelector (options);
if (ret == `accept)
{
// FIXME: IT'S A MESS
Update::solve_errors = 0;
Update::unknown_packages = 0;
Packages::base_selection_modified = true;
}
return ret;
}
if ( func == "MakeProposal" )
{
boolean force_reset = param["force_reset" ]:false;
boolean language_changed = param["language_changed"]:false;
// call some function that makes a proposal here:
//
// DummyMod::MakeProposal( force_reset );
// Fill return map
// SpaceCalculation::ShowPartitionWarning ();
list<string> warning = SpaceCalculation::GetPartitionWarning ();
// Count statistics -->
// Pkg::GetPackages()
// `installed all installed packages
// `selected returns all selected but not yet installed packages
// `available returns all available packages (from the installation source)
// `removed all packages selected for removal
// recreate the update summary
list<string> installed = Pkg::GetPackages (`installed, true);
list<string> selected = Pkg::GetPackages (`selected, true);
list<string> removed = Pkg::GetPackages (`removed, true);
integer cnt_installed = size (installed);
integer cnt_selected = size (selected);
integer cnt_removed = size (removed);
y2milestone ("Selected: %1, Installed: %2, Removed: %3", cnt_selected, cnt_installed, cnt_removed);
y2milestone("Removed: %1", removed);
map<string,boolean> installed_m = listmap (string p, installed, {
return $[ p : true ];
});
map<string,boolean> selected_m = listmap (string p, selected, {
return $[ p : true ];
});
// packages that are both 'installed' && 'selected'
Update::packages_to_update = size (filter (string p, selected, {
return haskey (installed_m, p);
}));
// packages that are 'selected' but not 'installed'
Update::packages_to_install = cnt_selected - Update::packages_to_update;
// packages that are 'removed' but not 'selected again'
Update::packages_to_remove = size (filter (string p, removed, {
return ! haskey (selected_m, p);
}));
y2milestone("Update statistics: Updated: %1, Installed: %2, Removed: %3",
Update::packages_to_update, Update::packages_to_install, Update::packages_to_remove);
// <-- Count statistics
list<string> tmp = [];
// proposal for packages during update, %1 is count of packages
tmp = add (tmp, sformat (_("Packages to Update: %1"),
Update::packages_to_update));
// proposal for packages during update, %1 is count of packages
tmp = add (tmp, sformat (_("New Packages to Install: %1"),
Update::packages_to_install));
// proposal for packages during update, %1 is count of packages
tmp = add (tmp, sformat (_("Packages to Remove: %1"),
Update::packages_to_remove));
// part of summary, %1 is size of packages (in MB or GB)
tmp = add (tmp, sformat (_("Total Size of Packages to Update: %1"),
Packages::CountSizeToBeInstalled ()));
if (Update::solve_errors > 0)
{
// the proposal for the packages requires manual invervention
ret = $[ "preformatted_proposal" : HTML::List (tmp),
/* warning text */
"warning" : _("Cannot solve all conflicts. Manual intervention is required."),
"warning_level" : `blocker ];
}
else if (size (warning) > 0)
{
// the proposal for the packages requires manual intervention
ret = $[ "preformatted_proposal" : HTML::List (tmp),
"warning" : mergestring (warning, "<br>"),
"warning_level" : `warning ];
}
else
{
ret = $[ "preformatted_proposal" : HTML::List (tmp) ];
}
y2milestone ("Products: %1", Pkg::ResolvableProperties ("", `product, ""));
Packages::CheckOldAddOns (ret);
}
else if ( func == "AskUser" )
{
boolean has_next = param["has_next"]:false;
// call some function that displays a user dialog
// or a sequence of dialogs here:
//
// sequence = DummyMod::AskUser( has_next );
symbol result = call_packageselector ();
// FIXME: IT'S A MESS
/*
if (Pkg::PkgSolve (!Update::onlyUpdateInstalled))
Update::solve_errors = 0;
else
Update::solve_errors = Pkg::PkgSolveErrors ();
*/
// Fill return map
ret = $[ "workflow_sequence" : result ];
}
else if ( func == "Description" )
{
// Fill return map.
//
// Static values do just nicely here, no need to call a function.
ret =
$[
// this is a heading
"rich_text_title" : _("Packages"),
// this is a menu entry
"menu_title" : _("&Packages"),
"id" : "packages_stuff"
];
}
return ret;
}
ACC SHELL 2018