ACC SHELL

Path : /usr/share/YaST2/modules/
File Upload :
Current File : //usr/share/YaST2/modules/PackageInstallation.ycp

/**
 * Module:		PackageInstallation.ycp
 *
 * Authors:		Gabriele Strattner <gs@suse.de>
 *
 * $Id: PackageInstallation.ycp 56678 2009-04-08 09:14:05Z lslezak $
 *
 */

{
    module "PackageInstallation";
    textdomain "packager";

    import "Mode";
    import "Installation";
    import "Directory";
    import "Packages";
    import "SlideShow";
    import "PackageSlideShow";
    import "PackagesUI";

    import "Label";



    global define any FakePackager( list<list> packages, string inst_source,
				    boolean deleting );


    /**
     *  Show a dialog with either the list of failed packages (string a) or
     *  the complete log (string b).
     */
    define void ShowFailedPackages (string a, string b)
    {
	term rbuttons = `RadioButtonGroup (
					   `VBox (
						  `Left(`RadioButton(`id(`a), `opt(`notify),
								     // button label
								     _("&Show Failed Packages List"), true)),
						  `Left(`RadioButton(`id(`b), `opt(`notify),
								     // button label
								     _("&Show Full Log"), false))
						  )
					   );

	UI::OpenDialog (
			`opt(`decorated),
			`VBox(
			      `HSpacing(40),
			      // dialog headline
			      `Left(`Heading(_("Installation of Some Packages Failed"))),
			      rbuttons,
			      `RichText(`id(`text),
					`opt(`plainText),
					a),
			      `PushButton (`id(`ok), `opt(`default, `key_F10),
					   Label::OKButton ())
			      )
			);

	while (true)
	{
	    symbol ret = (symbol) UI::UserInput ();

	    if (ret == `a || ret == `b)
	    {
		UI::ChangeWidget (`id(`text), `Value, (boolean) UI::QueryWidget (`id(`a), `Value) ? a : b);
		continue;
	    }

	    if (ret == `ok)
		break;
	}

	UI::CloseDialog ();
    }


    /**
     *  commitPackages marked for deletion or installation
     *	Return: [ int successful, list failed, list remaining, list srcremaining ]
     *
     **/
    global define list CommitPackages (integer media_number,
				       integer packages_installed)
    {
	y2milestone("CommitPackages called: media nr. %1, packages %2", media_number, packages_installed);

	if ( Mode::test () )
	{
	    FakePackager( [],
			"suse",
			false );		// not deleting packages
	    return [];
	}
	// install packages from this media

	y2milestone ("CommitPackages (%1,%2): Pkg::TargetGetDU() %3",
		     media_number, packages_installed, Pkg::TargetGetDU());

	list <integer> sources = Pkg::SourceGetCurrent (false);
	integer source_id = sources[0]:0;

	PackageSlideShow::InitPkgData(false);

	// structure: [ ["source_name", id] ]
	list< list > src_list = Pkg::PkgMediaNames();

	// get ID of the first repository
	integer first_source = src_list[0,1]:1;

	y2milestone("ID of the first repository: %1", first_source);

	if (media_number == 0)
	{
	    PackageSlideShow::SetCurrentCdNo (first_source, 1);
	}
	else
	{
	    PackageSlideShow::SetCurrentCdNo (first_source, media_number);
	}
	PackageSlideShow::UpdateAllCdProgress (false);
	SlideShow::StartTimer();

	boolean do_commit = true;
	if (media_number != 0)
	{
	    list<map<string,any> > pkgs = Pkg::ResolvableProperties ("", `package, "");
	    pkgs = filter (map<string,any> p, pkgs, {
		return p["status"]:nil == `selected;
	    });
	    do_commit = size (pkgs) > 0;
	}

	integer start_time = time();

	list commit_result = [];
	if (do_commit)
	{
	    // returns [ int successful, list failed, list remaining, list srcremaining ]
	    y2milestone ("Calling PkgCommit (%1)", media_number);
	    commit_result = Pkg::PkgCommit (media_number);

	    SlideShow::StopTimer();

	    if (commit_result == nil)
	    {
		y2error ("Bad media number %1", media_number);
		return [];
	    }
	}
	else
	{
	    y2milestone ("No package from media %1 left for installation", media_number);
	}

	integer installation_time = time() - start_time;
	y2milestone("Installation took %1 seconds", installation_time);

	// see if installation of some packages failed
	list<string> errpacks = (list<string>) (commit_result[1]:[]);
	if (size (errpacks) > 0)
	{
	    string full_log = PackagesUI::GetPackageSummary()["install_log"]:"";
	    ShowFailedPackages (mergestring (errpacks, "\n"), full_log);

	    list<string> old_failed_packs = [];
	    if ((integer)SCR::Read (.target.size,
		"/var/lib/YaST2/failed_packages") > 0)
	    {
		old_failed_packs = (list<string>)
		    SCR::Read (.target.ycp, "/var/lib/YaST2/failed_packages");
	    }
	    SCR::Write (.target.ycp, "/var/lib/YaST2/failed_packages",
		merge (old_failed_packs, errpacks));
	}

	if (Mode::normal())
	{
	    // collect and set installation summary data
	    map<string,any> summary = PackageSlideShow::GetPackageSummary();

	    summary["time_seconds"] = installation_time;
	    summary["success"] = size(errpacks) == 0;
	    summary["remaining"] = commit_result[2]:[];
	    summary["install_log"] = SlideShow::inst_log;

	    if (size(errpacks) > 0)
	    {
		summary["error"] = Pkg::LastError();
		summary["failed"] = errpacks;
	    }

	    PackagesUI::SetPackageSummary(summary);
	}

	return commit_result;
    };


    //
    // Fake progress bars for Mode::test ()
    //
    // NOTE: This is currently completely broken.
    // -- sh 2003-12-15
    //
    global define any FakePackager( list<list> packages, string inst_source,
				    boolean deleting )
    {
	integer disk_usage = 20;
	integer disk_capacity = 10000;
	any ret = nil;
	integer number = 0;

	y2debug( "FakePackager - handling %1 packages", size( packages ) );

	foreach( list pac, packages, {
	    //y2debug( "Fake installing %1 from %2", select(pac,0), inst_source );

	    string pkg_name	= pac[0]:"";

	    integer pkg_size	= 42*1024;
	    integer bytes_installed = 0;

	    if ( pkg_size < 0 )
	    {
		// pkginfo doesn't know anything about the kernel RPM, so its
		// size can't be obtained, e.g. pkg_size is -1. To make up for
		// this, let's assume a negative starting size to keep things
		// going for a while (this is test_mode only, anyway).
		bytes_installed = -857 * 1024;
	    }

	    while  ( bytes_installed < pkg_size && ret != `cancel && ret != `diskfull )
	    {
		integer percent = ( 100 * bytes_installed ) / pkg_size;
		//	if ( deleting )
		//	{
		//	    // Handle deleting packages
		//	}
		//	else
		//	{
		//	    // Handle installing packages
		//	}
		sleep ( 300 ); // millisec
		bytes_installed = bytes_installed + 300 * 1024;
	    }
	    disk_usage = disk_usage+1;
	    number = number+1;

	} );

	if	( ret == `cancel || ret == `abort )	ret = `cancel;
	else if ( ret == `diskfull )			ret = `diskfull;
	else						ret = `ok;

	y2debug( "FakePackager returning with %1", ret );
	return ret;
    }

}

ACC SHELL 2018