ACC SHELL

Path : /usr/share/YaST2/clients/
File Upload :
Current File : //usr/share/YaST2/clients/packages_proposal.ycp

/**
 * 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