YaST Commits
Threads by month
- ----- 2024 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
May 2011
- 16 participants
- 288 discussions
[yast-commit] r63956 - in /branches/tmp/dmacvicar/zc10/pkg-bindings/src: ProvideProcess.cc ProvideProcess.h Resolvable.cc
by dmacvicar@svn2.opensuse.org 11 May '11
by dmacvicar@svn2.opensuse.org 11 May '11
11 May '11
Author: dmacvicar
Date: Wed May 11 12:20:47 2011
New Revision: 63956
URL: http://svn.opensuse.org/viewcvs/yast?rev=63956&view=rev
Log:
missing file
Removed:
branches/tmp/dmacvicar/zc10/pkg-bindings/src/ProvideProcess.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/ProvideProcess.h
Modified:
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Resolvable.cc
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Resolvable.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Resolvable.cc (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Resolvable.cc Wed May 11 12:20:47 2011
@@ -23,7 +23,6 @@
#include <ycp/y2log.h>
#include <y2util/Y2SLog.h>
#include "PkgModuleFunctions.h"
-#include "ProvideProcess.h"
#include <ycp/YCPVoid.h>
#include <ycp/YCPBoolean.h>
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63955 - /branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am
by dmacvicar@svn2.opensuse.org 11 May '11
by dmacvicar@svn2.opensuse.org 11 May '11
11 May '11
Author: dmacvicar
Date: Wed May 11 12:14:39 2011
New Revision: 63955
URL: http://svn.opensuse.org/viewcvs/yast?rev=63955&view=rev
Log:
missing file
Modified:
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am Wed May 11 12:14:39 2011
@@ -18,6 +18,7 @@
libpy2Pkg_la_SOURCES = \
i18n.h \
+ log.h \
GPGMap.h GPGMap.cc \
PkgError.cc PkgError.h \
Y2PkgComponent.cc Y2PkgComponent.h \
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63954 - /branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am
by dmacvicar@svn2.opensuse.org 11 May '11
by dmacvicar@svn2.opensuse.org 11 May '11
11 May '11
Author: dmacvicar
Date: Wed May 11 12:09:55 2011
New Revision: 63954
URL: http://svn.opensuse.org/viewcvs/yast?rev=63954&view=rev
Log:
missing file
Modified:
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am Wed May 11 12:09:55 2011
@@ -17,6 +17,7 @@
plugin_LTLIBRARIES = libpy2Pkg.la
libpy2Pkg_la_SOURCES = \
+ i18n.h \
GPGMap.h GPGMap.cc \
PkgError.cc PkgError.h \
Y2PkgComponent.cc Y2PkgComponent.h \
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63953 - /branches/tmp/dmacvicar/zc10/pkg-bindings/doc/builtins.xml
by dmacvicar@svn2.opensuse.org 11 May '11
by dmacvicar@svn2.opensuse.org 11 May '11
11 May '11
Author: dmacvicar
Date: Wed May 11 12:05:01 2011
New Revision: 63953
URL: http://svn.opensuse.org/viewcvs/yast?rev=63953&view=rev
Log:
fix doc generation
Modified:
branches/tmp/dmacvicar/zc10/pkg-bindings/doc/builtins.xml
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/doc/builtins.xml
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/doc/builtins.xml (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/doc/builtins.xml Wed May 11 12:05:01 2011
@@ -2,16 +2,20 @@
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"/usr/share/xml/docbook/schema/dtd/4.2/docbookx.dtd"[
-<!ENTITY PkgModuleCallbacks SYSTEM "Callbacks.xml">
-<!ENTITY PkgModule SYSTEM "PkgModule.xml">
-<!ENTITY PkgModuleError SYSTEM "PkgModuleError.xml">
<!ENTITY PkgModuleFunctions SYSTEM "PkgModuleFunctions.xml">
-<!ENTITY PkgModuleFunctionsPackage SYSTEM "Package.xml">
-<!ENTITY PkgModuleFunctionsPatch SYSTEM "Patch.xml">
-<!ENTITY PkgModuleFunctionsResolvable SYSTEM "Resolvable.xml">
+<!ENTITY PkgModuleFunctionsKeyring SYSTEM "Keyring.xml">
+<!ENTITY PkgModuleFunctionsPackage SYSTEM "Package.xml">
+<!ENTITY PkgModuleFunctionsPatch SYSTEM "Patch.xml">
+<!ENTITY PkgModuleFunctionsResolvable SYSTEM "Resolvable.xml">
<!ENTITY PkgModuleFunctionsSelection SYSTEM "Selection.xml">
-<!ENTITY PkgModuleFunctionsSource SYSTEM "Source.xml">
-<!ENTITY PkgModuleFunctionsTarget SYSTEM "Target.xml">
+<!ENTITY PkgModuleFunctionsSource_Create SYSTEM "Source_Create.xml">
+<!ENTITY PkgModuleFunctionsSource_Download SYSTEM "Source_Download.xml">
+<!ENTITY PkgModuleFunctionsSource_Get SYSTEM "Source_Get.xml">
+<!ENTITY PkgModuleFunctionsSource_Installation SYSTEM "Source_Installation.xml">
+<!ENTITY PkgModuleFunctionsSource_Load SYSTEM "Source_Load.xml">
+<!ENTITY PkgModuleFunctionsSource_Save SYSTEM "Source_Save.xml">
+<!ENTITY PkgModuleFunctionsSource_Set SYSTEM "Source_Set.xml">
+<!ENTITY PkgModuleFunctionsTarget SYSTEM "Target.xml">
<!ENTITY pkgbindingssection SYSTEM "pkg-bindings-section.xml">
]>
<book>
@@ -42,13 +46,18 @@
&pkgbindingssection;
</chapter>
- &PkgModuleFunctionsSource;
&PkgModuleFunctions;
- &PkgModuleFunctionsSelection;
+ &PkgModuleFunctionsKeyring;
&PkgModuleFunctionsPackage;
+ &PkgModuleFunctionsPatch;
&PkgModuleFunctionsResolvable;
+ &PkgModuleFunctionsSelection;
+ &PkgModuleFunctionsSource_Create;
+ &PkgModuleFunctionsSource_Download;
+ &PkgModuleFunctionsSource_Get;
+ &PkgModuleFunctionsSource_Installation;
+ &PkgModuleFunctionsSource_Load;
+ &PkgModuleFunctionsSource_Save;
+ &PkgModuleFunctionsSource_Set;
&PkgModuleFunctionsTarget;
- &PkgModuleFunctionsPatch;
- &PkgModuleCallbacks;
-
</book>
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63952 - /branches/tmp/dmacvicar/zc10/pkg-bindings/yast2-pkg-bindings.spec.in
by dmacvicar@svn2.opensuse.org 11 May '11
by dmacvicar@svn2.opensuse.org 11 May '11
11 May '11
Author: dmacvicar
Date: Wed May 11 11:38:08 2011
New Revision: 63952
URL: http://svn.opensuse.org/viewcvs/yast?rev=63952&view=rev
Log:
libzypp version
Modified:
branches/tmp/dmacvicar/zc10/pkg-bindings/yast2-pkg-bindings.spec.in
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/yast2-pkg-bindings.spec.in
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/yast2-pkg-bindings.spec.in (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/yast2-pkg-bindings.spec.in Wed May 11 11:38:08 2011
@@ -2,11 +2,11 @@
@HEADER@
BuildRequires: blocxx-devel docbook-xsl-stylesheets doxygen gcc-c++ libgcrypt-devel libxcrypt-devel libxslt perl-XML-Writer rpm-devel sgml-skel yast2-core-devel yast2-devtools boost boost-devel dbus-1-devel hal-devel
-BuildRequires: libzypp-devel >= 2.4.0
-BuildRequires: libzypp >= 2.4.0
+BuildRequires: libzypp-devel >= 6.35.3
+BuildRequires: libzypp >= 6.35.3
# new API (label of a source, script callbacks...)
-Requires: libzypp >= 2.4.0
+Requires: libzypp >= 6.35.3
Summary: -
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63951 - /tags/branch-Code-11-SP2-2_17_2/snapper/
by jsuchome@svn2.opensuse.org 11 May '11
by jsuchome@svn2.opensuse.org 11 May '11
11 May '11
Author: jsuchome
Date: Wed May 11 11:36:29 2011
New Revision: 63951
URL: http://svn.opensuse.org/viewcvs/yast?rev=63951&view=rev
Log:
Created tag branch-Code-11-SP2-2_17_2 for snapper
Added:
tags/branch-Code-11-SP2-2_17_2/snapper/
- copied from r63950, branches/SuSE-Code-11-SP2-Branch/snapper/
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
11 May '11
Author: jsuchome
Date: Wed May 11 11:36:25 2011
New Revision: 63950
URL: http://svn.opensuse.org/viewcvs/yast?rev=63950&view=rev
Log:
Created tag branch-Code-11-SP2-2_17_2
Added:
tags/branch-Code-11-SP2-2_17_2/
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63949 - in /branches/SuSE-Code-11-SP2-Branch/snapper: VERSION package/yast2-snapper.changes yast2-snapper.spec.in
by jsuchome@svn2.opensuse.org 11 May '11
by jsuchome@svn2.opensuse.org 11 May '11
11 May '11
Author: jsuchome
Date: Wed May 11 11:36:01 2011
New Revision: 63949
URL: http://svn.opensuse.org/viewcvs/yast?rev=63949&view=rev
Log:
- only require libsnapper-devel
- 2.17.2
Modified:
branches/SuSE-Code-11-SP2-Branch/snapper/VERSION
branches/SuSE-Code-11-SP2-Branch/snapper/package/yast2-snapper.changes
branches/SuSE-Code-11-SP2-Branch/snapper/yast2-snapper.spec.in
Modified: branches/SuSE-Code-11-SP2-Branch/snapper/VERSION
URL: http://svn.opensuse.org/viewcvs/yast/branches/SuSE-Code-11-SP2-Branch/snapp…
==============================================================================
--- branches/SuSE-Code-11-SP2-Branch/snapper/VERSION (original)
+++ branches/SuSE-Code-11-SP2-Branch/snapper/VERSION Wed May 11 11:36:01 2011
@@ -1 +1 @@
-2.17.1
+2.17.2
Modified: branches/SuSE-Code-11-SP2-Branch/snapper/package/yast2-snapper.changes
URL: http://svn.opensuse.org/viewcvs/yast/branches/SuSE-Code-11-SP2-Branch/snapp…
==============================================================================
--- branches/SuSE-Code-11-SP2-Branch/snapper/package/yast2-snapper.changes (original)
+++ branches/SuSE-Code-11-SP2-Branch/snapper/package/yast2-snapper.changes Wed May 11 11:36:01 2011
@@ -1,4 +1,10 @@
-------------------------------------------------------------------
+Wed May 11 11:35:31 CEST 2011 - jsuchome(a)suse.cz
+
+- only require libsnapper-devel
+- 2.17.2
+
+-------------------------------------------------------------------
Wed May 11 11:28:15 CEST 2011 - jsuchome(a)suse.cz
- added initialization code to agent, check for exceptions
Modified: branches/SuSE-Code-11-SP2-Branch/snapper/yast2-snapper.spec.in
URL: http://svn.opensuse.org/viewcvs/yast/branches/SuSE-Code-11-SP2-Branch/snapp…
==============================================================================
--- branches/SuSE-Code-11-SP2-Branch/snapper/yast2-snapper.spec.in (original)
+++ branches/SuSE-Code-11-SP2-Branch/snapper/yast2-snapper.spec.in Wed May 11 11:36:01 2011
@@ -1,9 +1,9 @@
@HEADER-COMMENT@
@HEADER@
-Requires: yast2 libsnapper
+Requires: yast2
License: GPL v2 or later
-BuildRequires: update-desktop-files yast2 yast2-devtools yast2-testsuite libsnapper libsnapper-devel doxygen yast2-core-devel gcc-c++ perl-XML-Writer
+BuildRequires: update-desktop-files yast2 yast2-devtools yast2-testsuite libsnapper-devel doxygen yast2-core-devel gcc-c++ perl-XML-Writer
Summary: YaST - file system snapshots review
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63948 - in /trunk/fcoe-client/src: FcoeClient.ycp complex.ycp
by gs@svn2.opensuse.org 11 May '11
by gs@svn2.opensuse.org 11 May '11
11 May '11
Author: gs
Date: Wed May 11 11:35:14 2011
New Revision: 63948
URL: http://svn.opensuse.org/viewcvs/yast?rev=63948&view=rev
Log:
store values from edit dialo
Modified:
trunk/fcoe-client/src/FcoeClient.ycp
trunk/fcoe-client/src/complex.ycp
Modified: trunk/fcoe-client/src/FcoeClient.ycp
URL: http://svn.opensuse.org/viewcvs/yast/trunk/fcoe-client/src/FcoeClient.ycp?r…
==============================================================================
--- trunk/fcoe-client/src/FcoeClient.ycp (original)
+++ trunk/fcoe-client/src/FcoeClient.ycp Wed May 11 11:35:14 2011
@@ -484,6 +484,11 @@
return network_interfaces;
}
+global list <string> GetCurrentNetworkCard()
+{
+ return (list <string>)network_interfaces[ current_card ]:[];
+}
+
global void SetNetworkCardsValue( integer row, list card )
{
network_interfaces[row] = card;
@@ -512,6 +517,14 @@
}
//
+// Set value in fcoe_general_config
+//
+global void SetFcoeConfigValue( string param, string value )
+{
+ fcoe_general_config[ param ] = value;
+}
+
+//
// Returns the map containing general FCoE configuration
//
global map <string, string> GetFcoeConfig()
Modified: trunk/fcoe-client/src/complex.ycp
URL: http://svn.opensuse.org/viewcvs/yast/trunk/fcoe-client/src/complex.ycp?rev=…
==============================================================================
--- trunk/fcoe-client/src/complex.ycp (original)
+++ trunk/fcoe-client/src/complex.ycp Wed May 11 11:35:14 2011
@@ -86,7 +86,8 @@
* Init
**/
void InitServicesDialog (string id) {
-
+ y2milestone( "Init services dialog" );
+
map status_map = FcoeClient::GetServiceStatus();
if ( status_map["fcoe"]:false == true )
@@ -99,7 +100,6 @@
UI::ChangeWidget( `id( "fcoe_startup_auto" ), `Value, false );
UI::ChangeWidget( `id( "fcoe_startup_manual" ), `Value, true );
}
- y2milestone( "Init services dialog" );
}
//
@@ -325,37 +325,49 @@
FcoeClient::SetServiceStatus( "fcoe", true );
y2milestone( "Setting auto start of FCoE to true");
}
- // Check whether FCoE already running and start if required
+ // Check whether FCoE is already running and start if required
integer status = Service::Status("fcoe");
if ( status != 0 )
{
- Service::Start("fcoe");
- y2milestone( "Starting FCoE (/etc/init.d/fcoe start)");
+ boolean success = Service::Start("fcoe");
+ if ( success )
+ {
+ y2milestone( "FCoE started (/etc/init.d/fcoe start)");
+ }
+ else
+ {
+ y2error( "Cannot start FCoE service - '/etc/init.d/fcoe start' failed" );
+ Popup::Error( "Cannot start FCoE service.
+'/etc/init.d/fcoe start' failed" );
+ }
}
else
{
- y2milestone( "FCoE running");
+ y2milestone( "FCoE service is running");
}
-
-
}
-void StoreInterfacesDialog (string id, map event) {
- y2milestone( "Store interfaces dialog" );
+void StoreInterfacesDialog (string id, map event)
+{
+ y2milestone( "Store interfaces dialog" );
}
-void StoreConfigurationDialog (string id, map event) {
- y2milestone( "Store configuration dialog" );
+void StoreConfigurationDialog (string id, map event)
+{
+ y2milestone( "Store configuration dialog" );
}
-void StoreEditDialog (string id, map event) {
- y2milestone( "Store edit dialog" );
-
- string fcoe_enabled = (string)UI::QueryWidget( `id(`fcoe), `Value );
- string dcb_required = (string)UI::QueryWidget( `id(`dcb), `Value );
-
-
+void StoreEditDialog (string id, map event)
+{
+ y2milestone( "Store edit dialog" );
+ list <string> card = FcoeClient::GetCurrentNetworkCard();
+ string fcoe_enabled = (string)UI::QueryWidget( `id(`fcoe), `Value );
+ card[4] = fcoe_enabled;
+ string dcb_required = (string)UI::QueryWidget( `id(`dcb), `Value );
+ card[5] = dcb_required;
+
+ FcoeClient::SetNetworkCardsValue( FcoeClient::current_card, card );
}
/* EOF */
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63947 - /tags/branch-Code-11-SP2-2_17_1/snapper/
by jsuchome@svn2.opensuse.org 11 May '11
by jsuchome@svn2.opensuse.org 11 May '11
11 May '11
Author: jsuchome
Date: Wed May 11 11:31:19 2011
New Revision: 63947
URL: http://svn.opensuse.org/viewcvs/yast?rev=63947&view=rev
Log:
Created tag branch-Code-11-SP2-2_17_1 for snapper
Added:
tags/branch-Code-11-SP2-2_17_1/snapper/
- copied from r63946, branches/SuSE-Code-11-SP2-Branch/snapper/
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
11 May '11
Author: jsuchome
Date: Wed May 11 11:31:15 2011
New Revision: 63946
URL: http://svn.opensuse.org/viewcvs/yast?rev=63946&view=rev
Log:
Created tag branch-Code-11-SP2-2_17_1
Added:
tags/branch-Code-11-SP2-2_17_1/
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63945 - in /branches/SuSE-Code-11-SP2-Branch/snapper: ./ agent-snapper/doc/ agent-snapper/src/ package/ src/
by jsuchome@svn2.opensuse.org 11 May '11
by jsuchome@svn2.opensuse.org 11 May '11
11 May '11
Author: jsuchome
Date: Wed May 11 11:31:04 2011
New Revision: 63945
URL: http://svn.opensuse.org/viewcvs/yast?rev=63945&view=rev
Log:
- added initialization code to agent, check for exceptions
- updated agent documentation
- 2.17.1
Modified:
branches/SuSE-Code-11-SP2-Branch/snapper/VERSION
branches/SuSE-Code-11-SP2-Branch/snapper/agent-snapper/doc/snapper.html
branches/SuSE-Code-11-SP2-Branch/snapper/agent-snapper/src/SnapperAgent.cc
branches/SuSE-Code-11-SP2-Branch/snapper/agent-snapper/src/SnapperAgent.h
branches/SuSE-Code-11-SP2-Branch/snapper/package/yast2-snapper.changes
branches/SuSE-Code-11-SP2-Branch/snapper/src/Snapper.ycp
Modified: branches/SuSE-Code-11-SP2-Branch/snapper/VERSION
URL: http://svn.opensuse.org/viewcvs/yast/branches/SuSE-Code-11-SP2-Branch/snapp…
==============================================================================
--- branches/SuSE-Code-11-SP2-Branch/snapper/VERSION (original)
+++ branches/SuSE-Code-11-SP2-Branch/snapper/VERSION Wed May 11 11:31:04 2011
@@ -1 +1 @@
-2.17.0
+2.17.1
Modified: branches/SuSE-Code-11-SP2-Branch/snapper/agent-snapper/doc/snapper.html
URL: http://svn.opensuse.org/viewcvs/yast/branches/SuSE-Code-11-SP2-Branch/snapp…
==============================================================================
--- branches/SuSE-Code-11-SP2-Branch/snapper/agent-snapper/doc/snapper.html (original)
+++ branches/SuSE-Code-11-SP2-Branch/snapper/agent-snapper/doc/snapper.html Wed May 11 11:31:04 2011
@@ -32,6 +32,8 @@
<ul><tt>.snapper</tt></ul>
+The initialization call of Execute (.snapper) must be done before any other calls.
+
<P>
<h2>Complete Read paths table</h2>
@@ -43,7 +45,18 @@
<th align="left">Result</th>
</tr>
- <tr><td><tt>.snapper.snapshots</td><td></td><td align="left">YCPList</td>
+ <tr><td><tt>.snapper.error</td><td>(none)</td><td align="left">YCPMap</td>
+ <td>Return information about last error.<br>
+ <b>Example of result</b>:
+ <pre>
+ $[
+ "type" : "config_not_found"
+ ]
+ </pre>
+ </td>
+ </tr>
+
+ <tr><td><tt>.snapper.snapshots</td><td>(none)</td><td align="left">YCPList</td>
<td>Return list of current snapshot maps.<br>
<b>Example of result</b>:
<pre>
@@ -75,7 +88,7 @@
</td>
</tr>
- <tr><td><tt>.snapper.diff</td><td>YCPMap</td><td align="left">YCPList</td>
+ <tr><td><tt>.snapper.diff_list</td><td>YCPMap</td><td align="left">YCPList</td>
<td>Returns the list of files modified between given snapshots.
Each file is described by YCPMap which contains file path and type of the change.
Argument map contains 2 integers, identifying the snapshots.<br>
@@ -100,6 +113,93 @@
]
</pre>
</td></tr>
+
+ <tr><td><tt>.snapper.diff_index</td><td>YCPMap</td><td align="left">YCPMap</td>
+ <td>Returns the differences between snapnots num1 and num2 as one-level map
+ (mapping each file to its changes).<br>
+ <b>Example of argument map</b>:
+ <pre>
+ $[
+ "from" : 1,
+ "to" : 2
+ $]
+ </pre>
+ <b>Example of result</b>:
+ <pre>
+ $[
+ "/etc/group" : "c...",
+ "/etc/group.YaST2save" : "c..."
+ ]
+ </pre>
+ </td></tr>
+
+ <tr><td><tt>.snapper.diff_tree</td><td>YCPMap</td><td align="left">YCPMap</td>
+ <td>Returns the differences between snapnots num1 and num2 as a tree.
+ Map is recursively describing the filesystem structure; it is used to build Tree widget contents
+ in yast2-snapper UI.
+ <br>
+ <b>Example of argument map</b>:
+ <pre>
+ $[
+ "from" : 1,
+ "to" : 2
+ $]
+ </pre>
+ <b>Example of result</b>:
+ <pre>
+ $[
+ "etc" : $[
+ "group" : $[],
+ "group.YaST2save" : $[],
+ "passwd" : $[],
+ "passwd.YaST2save" : $[]
+ ],
+ "var" : $[
+ "log" : $[
+ "YaST2" : $[
+ "y2changes" : $[],
+ "y2log" : $[]
+ ],
+ "messages" : $[],
+ "snapper.log" : $[]
+ ]
+ ]
+ ]
+ </pre>
+ </td></tr>
+</table>
+
+<P>
+<h2>Complete Execute paths table</h2>
+
+<table border=3>
+ <tr>
+ <th width="20%" align="left">Path</th>
+ <th width="10%" align="left">Argument</th>
+ <th width="10%" align="left">Type of Result</th>
+ <th align="left">Result</th>
+ </tr>
+
+ <tr><td><tt>.snapper</td><td>(none)</td><td align="left">YCPBoolean</td>
+ <td>Initializes snapper object. In case of init failure, sets the internal error ID.
+ Use Read (.snapper.error) to get the error info.
+ </td>
+ </tr>
+
+ <tr><td><tt>.snapper.rollback</td><td>YCPMap</td><td align="left">YCPBoolean</td>
+ <td>Rollback the list of given files from snapshot num1 to num2. If num2 is not present,
+ current system is used as a default.
+ <b>Example of argument map</b>:
+ <pre>
+ $[
+ "files" : [
+ "/etc/passwd",
+ "/etc/group"
+ ]
+ "from" : 1,
+ $]
+ </pre>
+ </td></tr>
</table>
<P>
Modified: branches/SuSE-Code-11-SP2-Branch/snapper/agent-snapper/src/SnapperAgent.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/SuSE-Code-11-SP2-Branch/snapp…
==============================================================================
--- branches/SuSE-Code-11-SP2-Branch/snapper/agent-snapper/src/SnapperAgent.cc (original)
+++ branches/SuSE-Code-11-SP2-Branch/snapper/agent-snapper/src/SnapperAgent.cc Wed May 11 11:31:04 2011
@@ -86,7 +86,9 @@
*/
SnapperAgent::SnapperAgent() : SCRAgent()
{
- sh = createSnapper();
+ sh = NULL;
+ snapper_initialized = false;
+ snapper_error = "";
}
/**
@@ -94,7 +96,10 @@
*/
SnapperAgent::~SnapperAgent()
{
- deleteSnapper(sh);
+ if (sh)
+ {
+ deleteSnapper(sh);
+ }
}
@@ -133,14 +138,21 @@
YCPMap argmap;
if (!arg.isNull() && arg->isMap())
argmap = arg->asMap();
+
+ if (!snapper_initialized && PC(0) != "error") {
+ y2error ("snapper not initialized: use Execute (.snapper) first!");
+ snapper_error = "not_initialized";
+ return YCPVoid();
+ }
if (path->length() == 1) {
/**
- * error: Read(.snapper.error) -> returns last error message
+ * error: Read (.snapper.error) -> returns last error message
*/
if (PC(0) == "error") {
YCPMap retmap;
+ retmap->add (YCPString ("type"), YCPString (snapper_error));
return retmap;
}
/**
@@ -286,6 +298,38 @@
if (!arg.isNull() && arg->isMap())
argmap = arg->asMap();
+ /**
+ * Execute (.snapper) call: Initialize snapper object
+ */
+ if (path->length() == 0) {
+
+ try {
+ sh = createSnapper();
+ }
+ catch (const ConfigNotFoundException& e)
+ {
+ y2error ("Config not found.");
+ snapper_error = "config_not_found";
+ sh = NULL;
+ return YCPBoolean (false);
+ }
+ catch (const InvalidConfigException& e)
+ {
+ y2error ("Config is invalid.");
+ snapper_error = "config_invalid";
+ sh = NULL;
+ return YCPBoolean (false);
+ }
+ snapper_initialized = true;
+ return ret;
+ }
+
+ if (!snapper_initialized) {
+ y2error ("snapper not initialized: use Execute (.snapper) first!");
+ snapper_error = "not_initialized";
+ return YCPVoid();
+ }
+
if (path->length() == 1) {
/**
Modified: branches/SuSE-Code-11-SP2-Branch/snapper/agent-snapper/src/SnapperAgent.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/SuSE-Code-11-SP2-Branch/snapp…
==============================================================================
--- branches/SuSE-Code-11-SP2-Branch/snapper/agent-snapper/src/SnapperAgent.h (original)
+++ branches/SuSE-Code-11-SP2-Branch/snapper/agent-snapper/src/SnapperAgent.h Wed May 11 11:31:04 2011
@@ -29,6 +29,10 @@
* Agent private variables and methods
*/
+ snapper::Snapper* sh;
+ bool snapper_initialized;
+ string snapper_error;
+
/**
* search the map for value of given key; both key and value have to be strings
* when key is not present, empty string is returned
@@ -92,11 +96,6 @@
* Used for mounting the agent.
*/
virtual YCPValue otherCommand(const YCPTerm& term);
-
-private:
-
- snapper::Snapper* sh;
-
};
#endif /* _SnapperAgent_h */
Modified: branches/SuSE-Code-11-SP2-Branch/snapper/package/yast2-snapper.changes
URL: http://svn.opensuse.org/viewcvs/yast/branches/SuSE-Code-11-SP2-Branch/snapp…
==============================================================================
--- branches/SuSE-Code-11-SP2-Branch/snapper/package/yast2-snapper.changes (original)
+++ branches/SuSE-Code-11-SP2-Branch/snapper/package/yast2-snapper.changes Wed May 11 11:31:04 2011
@@ -1,4 +1,11 @@
-------------------------------------------------------------------
+Wed May 11 11:28:15 CEST 2011 - jsuchome(a)suse.cz
+
+- added initialization code to agent, check for exceptions
+- updated agent documentation
+- 2.17.1
+
+-------------------------------------------------------------------
Tue Apr 19 11:24:05 CEST 2011 - jsuchome(a)suse.cz
- initial version for SP2, based on Factory version 2.21.4
Modified: branches/SuSE-Code-11-SP2-Branch/snapper/src/Snapper.ycp
URL: http://svn.opensuse.org/viewcvs/yast/branches/SuSE-Code-11-SP2-Branch/snapp…
==============================================================================
--- branches/SuSE-Code-11-SP2-Branch/snapper/src/Snapper.ycp (original)
+++ branches/SuSE-Code-11-SP2-Branch/snapper/src/Snapper.ycp Wed May 11 11:31:04 2011
@@ -37,6 +37,7 @@
import "FileUtils";
import "Label";
import "Progress";
+import "Report";
// global list of all snapshot
@@ -163,6 +164,41 @@
return true;
}
+global map LastSnapperErrorMap () {
+
+ return (map) SCR::Read (.snapper.error);
+}
+
+/**
+ * Initialize snapper agent
+ * Return true on success
+ */
+global boolean InitializeSnapper () {
+
+ boolean init = (boolean) SCR::Execute (.snapper);
+ if (!init)
+ {
+ map err_map = LastSnapperErrorMap ();
+ string type = err_map["type"]:"";
+ string details = _("Reason not known.");
+ if (type == "config_not_found")
+ {
+ details = _("Configuration not found.");
+ }
+ else if (type == "config_invalid")
+ {
+ details = _("Configuration is not valid.");
+ }
+
+ y2warning ("init failed with '%1'", err_map);
+ // error popup
+ Report::Error (sformat (_("Failed to initialize snapper library:
+%1"), details));
+ }
+ return init;
+
+}
+
/**
* Read all snapper settings
* @return true on success
@@ -188,7 +224,11 @@
);
Progress::NextStage();
- // read database
+
+ if (!InitializeSnapper ())
+ {
+ return false;
+ }
ReadSnapshots ();
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
11 May '11
Author: jsuchome
Date: Wed May 11 11:26:50 2011
New Revision: 63944
URL: http://svn.opensuse.org/viewcvs/yast?rev=63944&view=rev
Log:
Created tag stable-2_21_5 for snapper
Added:
tags/stable-2_21_5/snapper/
- copied from r63943, trunk/snapper/
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63943 - in /trunk/snapper: VERSION agent-snapper/doc/snapper.html package/yast2-snapper.changes
by jsuchome@svn2.opensuse.org 11 May '11
by jsuchome@svn2.opensuse.org 11 May '11
11 May '11
Author: jsuchome
Date: Wed May 11 11:26:28 2011
New Revision: 63943
URL: http://svn.opensuse.org/viewcvs/yast?rev=63943&view=rev
Log:
- added initialization code to agent, check for exceptions
- updated agent documentation
- 2.21.5
Modified:
trunk/snapper/VERSION
trunk/snapper/agent-snapper/doc/snapper.html
trunk/snapper/package/yast2-snapper.changes
Modified: trunk/snapper/VERSION
URL: http://svn.opensuse.org/viewcvs/yast/trunk/snapper/VERSION?rev=63943&r1=639…
==============================================================================
--- trunk/snapper/VERSION (original)
+++ trunk/snapper/VERSION Wed May 11 11:26:28 2011
@@ -1 +1 @@
-2.21.4
+2.21.5
Modified: trunk/snapper/agent-snapper/doc/snapper.html
URL: http://svn.opensuse.org/viewcvs/yast/trunk/snapper/agent-snapper/doc/snappe…
==============================================================================
--- trunk/snapper/agent-snapper/doc/snapper.html (original)
+++ trunk/snapper/agent-snapper/doc/snapper.html Wed May 11 11:26:28 2011
@@ -32,6 +32,8 @@
<ul><tt>.snapper</tt></ul>
+The initialization call of Execute (.snapper) must be done before any other calls.
+
<P>
<h2>Complete Read paths table</h2>
@@ -43,7 +45,18 @@
<th align="left">Result</th>
</tr>
- <tr><td><tt>.snapper.snapshots</td><td></td><td align="left">YCPList</td>
+ <tr><td><tt>.snapper.error</td><td>(none)</td><td align="left">YCPMap</td>
+ <td>Return information about last error.<br>
+ <b>Example of result</b>:
+ <pre>
+ $[
+ "type" : "config_not_found"
+ ]
+ </pre>
+ </td>
+ </tr>
+
+ <tr><td><tt>.snapper.snapshots</td><td>(none)</td><td align="left">YCPList</td>
<td>Return list of current snapshot maps.<br>
<b>Example of result</b>:
<pre>
@@ -75,7 +88,7 @@
</td>
</tr>
- <tr><td><tt>.snapper.diff</td><td>YCPMap</td><td align="left">YCPList</td>
+ <tr><td><tt>.snapper.diff_list</td><td>YCPMap</td><td align="left">YCPList</td>
<td>Returns the list of files modified between given snapshots.
Each file is described by YCPMap which contains file path and type of the change.
Argument map contains 2 integers, identifying the snapshots.<br>
@@ -100,6 +113,93 @@
]
</pre>
</td></tr>
+
+ <tr><td><tt>.snapper.diff_index</td><td>YCPMap</td><td align="left">YCPMap</td>
+ <td>Returns the differences between snapnots num1 and num2 as one-level map
+ (mapping each file to its changes).<br>
+ <b>Example of argument map</b>:
+ <pre>
+ $[
+ "from" : 1,
+ "to" : 2
+ $]
+ </pre>
+ <b>Example of result</b>:
+ <pre>
+ $[
+ "/etc/group" : "c...",
+ "/etc/group.YaST2save" : "c..."
+ ]
+ </pre>
+ </td></tr>
+
+ <tr><td><tt>.snapper.diff_tree</td><td>YCPMap</td><td align="left">YCPMap</td>
+ <td>Returns the differences between snapnots num1 and num2 as a tree.
+ Map is recursively describing the filesystem structure; it is used to build Tree widget contents
+ in yast2-snapper UI.
+ <br>
+ <b>Example of argument map</b>:
+ <pre>
+ $[
+ "from" : 1,
+ "to" : 2
+ $]
+ </pre>
+ <b>Example of result</b>:
+ <pre>
+ $[
+ "etc" : $[
+ "group" : $[],
+ "group.YaST2save" : $[],
+ "passwd" : $[],
+ "passwd.YaST2save" : $[]
+ ],
+ "var" : $[
+ "log" : $[
+ "YaST2" : $[
+ "y2changes" : $[],
+ "y2log" : $[]
+ ],
+ "messages" : $[],
+ "snapper.log" : $[]
+ ]
+ ]
+ ]
+ </pre>
+ </td></tr>
+</table>
+
+<P>
+<h2>Complete Execute paths table</h2>
+
+<table border=3>
+ <tr>
+ <th width="20%" align="left">Path</th>
+ <th width="10%" align="left">Argument</th>
+ <th width="10%" align="left">Type of Result</th>
+ <th align="left">Result</th>
+ </tr>
+
+ <tr><td><tt>.snapper</td><td>(none)</td><td align="left">YCPBoolean</td>
+ <td>Initializes snapper object. In case of init failure, sets the internal error ID.
+ Use Read (.snapper.error) to get the error info.
+ </td>
+ </tr>
+
+ <tr><td><tt>.snapper.rollback</td><td>YCPMap</td><td align="left">YCPBoolean</td>
+ <td>Rollback the list of given files from snapshot num1 to num2. If num2 is not present,
+ current system is used as a default.
+ <b>Example of argument map</b>:
+ <pre>
+ $[
+ "files" : [
+ "/etc/passwd",
+ "/etc/group"
+ ]
+ "from" : 1,
+ $]
+ </pre>
+ </td></tr>
</table>
<P>
Modified: trunk/snapper/package/yast2-snapper.changes
URL: http://svn.opensuse.org/viewcvs/yast/trunk/snapper/package/yast2-snapper.ch…
==============================================================================
--- trunk/snapper/package/yast2-snapper.changes (original)
+++ trunk/snapper/package/yast2-snapper.changes Wed May 11 11:26:28 2011
@@ -1,4 +1,11 @@
-------------------------------------------------------------------
+Wed May 11 10:41:42 CEST 2011 - jsuchome(a)suse.cz
+
+- added initialization code to agent, check for exceptions
+- updated agent documentation
+- 2.21.5
+
+-------------------------------------------------------------------
Mon Apr 18 09:16:36 CEST 2011 - jsuchome(a)suse.cz
- removed YCP code for Tree recursive selection, widget can do it
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63942 - /branches/tmp/dmacvicar/zc10/pkg-bindings/src/
by dmacvicar@svn2.opensuse.org 11 May '11
by dmacvicar@svn2.opensuse.org 11 May '11
11 May '11
Author: dmacvicar
Date: Wed May 11 11:22:32 2011
New Revision: 63942
URL: http://svn.opensuse.org/viewcvs/yast?rev=63942&view=rev
Log:
It builds
Added:
branches/tmp/dmacvicar/zc10/pkg-bindings/src/GPGMap.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/GPGMap.h
branches/tmp/dmacvicar/zc10/pkg-bindings/src/HelpTexts.h
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Network.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Network.h
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Callbacks.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Create.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Download.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Get.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Installation.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Load.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Misc.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Resolvables.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Save.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Set.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/i18n.h
Removed:
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source.cc
Modified:
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Callbacks.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Callbacks.h
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Package.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.h
branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgProgress.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgProgress.h
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Target.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Utils.cc
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Callbacks.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Callbacks.cc (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Callbacks.cc Wed May 11 11:22:32 2011
@@ -26,16 +26,20 @@
#include <y2util/stringutil.h>
#include "PkgModuleFunctions.h"
+#include "log.h"
#include "Callbacks.h"
#include "Callbacks.YCP.h" // PkgModuleFunctions::CallbackHandler::YCPCallbacks
+#include "GPGMap.h"
-#include <zypp/ZYppCallbacks.h>
-#include <zypp/Package.h>
-#include <zypp/Product.h>
-#include <zypp/KeyRing.h>
-#include <zypp/PublicKey.h>
-#include <zypp/Digest.h>
-#include <zypp/SourceManager.h>
+#include "zypp/ZYppCallbacks.h"
+#include "zypp/Package.h"
+#include "zypp/Patch.h"
+#include "zypp/KeyRing.h"
+#include "zypp/PublicKey.h"
+#include "zypp/Digest.h"
+#include "zypp/base/String.h"
+
+#include <ctime>
// FIXME: do this nicer, source create use this to avoid user feedback
// on probing of source type
@@ -43,7 +47,16 @@
ZyppRecipients::MediaChangeSensitivity _silent_probing = ZyppRecipients::MEDIA_CHANGE_FULL;
// remember redirected URLs
-std::map<zypp::Source_Ref::NumericId, std::map<unsigned, std::string> > redirect_map;
+// FIXME huh?
+
+typedef std::map<unsigned, zypp::Url> MediaMap;
+typedef std::map<zypp::Url, MediaMap> RedirectMap;
+
+RedirectMap redirect_map;
+
+// default timeout for callbacks, evaluate the callbacks after 3 seconds
+// even if the progress percent has not been changed
+static const time_t callback_timeout = 3;
///////////////////////////////////////////////////////////////////
namespace ZyppRecipients {
@@ -108,11 +121,7 @@
CB callback( ycpcb( YCPCallbacks::CB_ProgressConvertDb ) );
if (callback._set) {
callback.addInt( value );
- // TODO adapt callback typeinfo to zypp
- callback.addInt( 100 );
- callback.addInt( 0 /*failed*/ );
- callback.addInt( 0 /* ignored */ );
- callback.addInt( 1 /*alreadyInV4*/ );
+ callback.addStr(pth.asString());
callback.evaluate();
}
@@ -126,7 +135,7 @@
if (callback._set) {
callback.addInt( error );
callback.addStr( reason );
- callback.evaluateStr(); // return value ignored by RpmDb
+ callback.evaluate();
}
}
};
@@ -175,20 +184,23 @@
if (callback._set) {
callback.addInt( error );
callback.addStr( reason );
- callback.evaluateStr(); // return value ignored by RpmDb
+ callback.evaluate();
}
}
};
+
///////////////////////////////////////////////////////////////////
// InstallPkgCallback
///////////////////////////////////////////////////////////////////
struct InstallPkgReceive : public Recipient, public zypp::callback::ReceiveReport<zypp::target::rpm::InstallResolvableReport>
{
zypp::Resolvable::constPtr _last;
+ PkgModuleFunctions &_pkg_ref;
int last_reported;
+ time_t last_reported_time;
- InstallPkgReceive(RecipientCtl & construct_r) : Recipient(construct_r)
+ InstallPkgReceive(RecipientCtl & construct_r, PkgModuleFunctions &pk) : Recipient(construct_r), _last(NULL), _pkg_ref(pk)
{
}
@@ -204,6 +216,7 @@
{
// initialize the counter
last_reported = 0;
+ last_reported_time = time(NULL);
#warning install non-package
zypp::Package::constPtr res =
@@ -213,13 +226,30 @@
if( _last == resolvable )
return;
+ // convert the repo ID
+ PkgModuleFunctions::RepoId source_id = _pkg_ref.logFindAlias(res->repoInfo().alias());
+ int media_nr = res->mediaNr();
+
+ if( source_id != _pkg_ref.LastReportedRepo() || media_nr != _pkg_ref.LastReportedMedium())
+ {
+ CB callback( ycpcb( YCPCallbacks::CB_SourceChange ) );
+ if (callback._set) {
+ callback.addInt( source_id );
+ callback.addInt( media_nr );
+ callback.evaluate();
+ }
+
+ _pkg_ref.SetReportedSource(source_id, media_nr);
+ }
+
CB callback( ycpcb( YCPCallbacks::CB_StartPackage ) );
if (callback._set) {
- callback.addStr(res->location());
+ callback.addStr(res->name());
+ callback.addStr(res->location().filename());
callback.addStr(res->summary());
- callback.addInt(res->size());
+ callback.addInt(res->installSize());
callback.addBool(false); // is_delete = false (package installation)
- callback.evaluateBool();
+ callback.evaluate();
}
_last = resolvable;
@@ -229,8 +259,9 @@
{
CB callback( ycpcb( YCPCallbacks::CB_ProgressPackage) );
// call the callback function only if the difference since the last call is at least 5%
- // or if 100% is reached
- if (callback._set && (value - last_reported >= 5 || last_reported - value >= 5 || value == 100))
+ // or if 100% is reached or at least 3 seconds have elapsed
+ time_t current_time = time(NULL);
+ if (callback._set && (value - last_reported >= 5 || last_reported - value >= 5 || value == 100 || current_time - last_reported_time >= callback_timeout))
{
callback.addInt( value );
bool res = callback.evaluateBool();
@@ -239,6 +270,7 @@
y2milestone( "Package installation callback returned abort" );
last_reported = value;
+ last_reported_time = current_time;
return res;
}
@@ -321,9 +353,10 @@
if (callback._set) {
callback.addStr(resolvable->name());
callback.addStr(std::string());
+ callback.addStr(std::string());
callback.addInt(-1);
callback.addBool(true); // is_delete = true
- callback.evaluateBool();
+ callback.evaluate();
}
}
@@ -347,6 +380,33 @@
return zypp::target::rpm::RemoveResolvableReport::progress(value, resolvable);
}
+ virtual Action problem(
+ zypp::Resolvable::constPtr resolvable
+ , zypp::target::rpm::RemoveResolvableReport::Error error
+ , const std::string &description
+ )
+ {
+ CB callback( ycpcb( YCPCallbacks::CB_DonePackage) );
+ if (callback._set) {
+ callback.addInt( error );
+ callback.addStr( description );
+
+ std::string ret = callback.evaluateStr();
+
+ // "R" = retry
+ if (ret == "R") return zypp::target::rpm::RemoveResolvableReport::RETRY;
+
+ // "C" = cancel
+ if (ret == "C") return zypp::target::rpm::RemoveResolvableReport::ABORT;
+
+ // otherwise ignore
+ return zypp::target::rpm::RemoveResolvableReport::IGNORE;
+ }
+
+ return zypp::target::rpm::RemoveResolvableReport::problem
+ (resolvable, error, description);
+ }
+
virtual void finish(zypp::Resolvable::constPtr resolvable, zypp::target::rpm::RemoveResolvableReport::Error error, const std::string &reason)
{
CB callback( ycpcb( YCPCallbacks::CB_DonePackage) );
@@ -358,19 +418,46 @@
}
};
+
+ struct ProgressReceive : public Recipient, public zypp::callback::ReceiveReport<zypp::ProgressReport>
+ {
+ ProgressReceive( RecipientCtl & construct_r ) : Recipient( construct_r ) {}
+
+ virtual void start(const zypp::ProgressData &task)
+ {
+ }
+
+ virtual bool progress(const zypp::ProgressData &task)
+ {
+ return zypp::ProgressReport::progress(task);
+ }
+
+ virtual void finish( const zypp::ProgressData &task )
+ {
+ }
+ };
+
+
+
///////////////////////////////////////////////////////////////////
// DownloadResolvableCallback
///////////////////////////////////////////////////////////////////
- struct DownloadResolvableReceive : public Recipient, public zypp::callback::ReceiveReport<zypp::source::DownloadResolvableReport>
+ struct DownloadResolvableReceive : public Recipient, public zypp::callback::ReceiveReport<zypp::repo::DownloadResolvableReport>
{
- static int last_source_id;
- static int last_source_media;
+ PkgModuleFunctions &_pkg_ref;
- DownloadResolvableReceive( RecipientCtl & construct_r ) : Recipient( construct_r ) {}
+ DownloadResolvableReceive( RecipientCtl & construct_r, PkgModuleFunctions &pk ) : Recipient( construct_r ), _pkg_ref(pk) {}
int last_reported;
+ time_t last_reported_time;
+
int last_reported_delta_download;
+ time_t last_reported_delta_download_time;
+
int last_reported_delta_apply;
+ time_t last_reported_delta_apply_time;
+
int last_reported_patch_download;
+ time_t last_reported_patch_download_time;
virtual void reportbegin()
{
@@ -384,18 +471,20 @@
{
unsigned size = 0;
last_reported = 0;
+ last_reported_time = time(NULL);
if ( zypp::isKind<zypp::Package> (resolvable_ptr) )
{
zypp::Package::constPtr pkg =
zypp::asKind<zypp::Package>(resolvable_ptr);
- size = pkg->archivesize();
+ size = pkg->downloadSize();
- int source_id = pkg->source().numericId();
- int media_nr = pkg->sourceMediaNr();
+ // convert the repo ID
+ PkgModuleFunctions::RepoId source_id = _pkg_ref.logFindAlias(pkg->repoInfo().alias());
+ int media_nr = pkg->mediaNr();
- if( source_id != last_source_id || media_nr != last_source_media )
+ if( source_id != _pkg_ref.LastReportedRepo() || media_nr != _pkg_ref.LastReportedMedium())
{
CB callback( ycpcb( YCPCallbacks::CB_SourceChange ) );
if (callback._set) {
@@ -403,23 +492,24 @@
callback.addInt( media_nr );
callback.evaluate();
}
- last_source_id = source_id;
- last_source_media = media_nr;
+ _pkg_ref.SetReportedSource(source_id, media_nr);
}
}
CB callback( ycpcb( YCPCallbacks::CB_StartProvide ) );
if (callback._set) {
- bool remote = url.getScheme() != "cd" && url.getScheme() != "dvd"
- && url.getScheme() != "nfs";
+ std::string scheme = zypp::str::toLower(url.getScheme());
+
+ bool remote = scheme != "cd" && scheme != "dvd" && scheme != "nfs" && scheme != "dir" && scheme != "file";
+
callback.addStr(resolvable_ptr->name());
callback.addInt( size );
callback.addBool(remote);
- callback.evaluateBool();
+ callback.evaluate();
}
}
- virtual void finish(zypp::Resolvable::constPtr resolvable, zypp::source::DownloadResolvableReport::Error error, const std::string &reason)
+ virtual void finish(zypp::Resolvable::constPtr resolvable, zypp::repo::DownloadResolvableReport::Error error, const std::string &reason)
{
CB callback( ycpcb( YCPCallbacks::CB_DoneProvide) );
if (callback._set) {
@@ -433,17 +523,19 @@
virtual bool progress(int value, zypp::Resolvable::constPtr resolvable_ptr)
{
CB callback( ycpcb( YCPCallbacks::CB_ProgressProvide) );
- if (callback._set && (value - last_reported >= 5 || last_reported - value >= 5 || value == 100))
+ time_t current_time = time(NULL);
+ if (callback._set && (value - last_reported >= 5 || last_reported - value >= 5 || value == 100 || current_time - last_reported_time >= callback_timeout))
{
last_reported = value;
+ last_reported_time = current_time;
callback.addInt( value );
return callback.evaluateBool(); // return value ignored by RpmDb
}
- return zypp::source::DownloadResolvableReport::progress(value, resolvable_ptr);
+ return zypp::repo::DownloadResolvableReport::progress(value, resolvable_ptr);
}
- virtual Action problem(zypp::Resolvable::constPtr resolvable_ptr, zypp::source::DownloadResolvableReport::Error error, const std::string &description)
+ virtual Action problem(zypp::Resolvable::constPtr resolvable_ptr, zypp::repo::DownloadResolvableReport::Error error, const std::string &description)
{
CB callback( ycpcb( YCPCallbacks::CB_DoneProvide) );
if (callback._set) {
@@ -453,19 +545,19 @@
std::string ret = callback.evaluateStr();
// "R" = retry
- if (ret == "R") return zypp::source::DownloadResolvableReport::RETRY;
+ if (ret == "R") return zypp::repo::DownloadResolvableReport::RETRY;
// "C" = cancel
- if (ret == "C") return zypp::source::DownloadResolvableReport::ABORT;
+ if (ret == "C") return zypp::repo::DownloadResolvableReport::ABORT;
// "I" = ignore
- if (ret == "I") return zypp::source::DownloadResolvableReport::IGNORE;
+ if (ret == "I") return zypp::repo::DownloadResolvableReport::IGNORE;
// otherwise return the default value from the parent class
}
// return the default value from the parent class
- return zypp::source::DownloadResolvableReport::problem(resolvable_ptr, error, description);
+ return zypp::repo::DownloadResolvableReport::problem(resolvable_ptr, error, description);
}
// Download delta rpm:
@@ -477,6 +569,7 @@
{
// reset the counter
last_reported_delta_download = 0;
+ last_reported_delta_download_time = time(NULL);
CB callback( ycpcb( YCPCallbacks::CB_StartDeltaDownload) );
if (callback._set) {
@@ -490,15 +583,17 @@
virtual bool progressDeltaDownload( int value )
{
CB callback( ycpcb( YCPCallbacks::CB_ProgressDeltaDownload) );
- if (callback._set && (value - last_reported_delta_download >= 5 || last_reported_delta_download - value >= 5 || value == 100))
+ time_t current_time = time(NULL);
+ if (callback._set && (value - last_reported_delta_download >= 5 || last_reported_delta_download - value >= 5 || value == 100 || current_time - last_reported_delta_download_time >= callback_timeout))
{
last_reported_delta_download = value;
+ last_reported_delta_download_time = current_time;
callback.addInt( value );
return callback.evaluateBool();
}
- return zypp::source::DownloadResolvableReport::progressDeltaDownload(value);
+ return zypp::repo::DownloadResolvableReport::progressDeltaDownload(value);
}
virtual void problemDeltaDownload( const std::string &description )
@@ -520,7 +615,7 @@
callback.evaluate();
}
}
-
+
// Apply delta rpm:
// - local path of downloaded delta
@@ -530,6 +625,7 @@
{
// reset the counter
last_reported_delta_apply = 0;
+ last_reported_delta_apply_time = time(NULL);
CB callback( ycpcb( YCPCallbacks::CB_StartDeltaApply) );
if (callback._set) {
@@ -542,9 +638,11 @@
virtual void progressDeltaApply( int value )
{
CB callback( ycpcb( YCPCallbacks::CB_ProgressDeltaApply ) );
- if (callback._set && (value - last_reported_delta_apply >= 5 || last_reported_delta_apply - value >= 5 || value == 100))
+ time_t current_time = time(NULL);
+ if (callback._set && (value - last_reported_delta_apply >= 5 || last_reported_delta_apply - value >= 5 || value == 100 || current_time - last_reported_delta_apply_time >= callback_timeout))
{
last_reported_delta_apply = value;
+ last_reported_delta_apply_time = current_time;
callback.addInt( value );
callback.evaluate();
@@ -571,7 +669,7 @@
callback.evaluate();
}
}
-
+
// Download patch rpm:
// - path below url reported on start()
@@ -581,6 +679,7 @@
{
// reset the counter
last_reported_patch_download = 0;
+ last_reported_patch_download_time = time(NULL);
CB callback( ycpcb( YCPCallbacks::CB_StartPatchDownload ) );
if (callback._set) {
@@ -594,15 +693,17 @@
virtual bool progressPatchDownload( int value )
{
CB callback( ycpcb( YCPCallbacks::CB_ProgressPatchDownload) );
- if (callback._set && (value - last_reported_patch_download >= 5 || last_reported_patch_download - value >= 5 || value == 100))
+ time_t current_time = time(NULL);
+ if (callback._set && (value - last_reported_patch_download >= 5 || last_reported_patch_download - value >= 5 || value == 100 || current_time - last_reported_patch_download_time >= callback_timeout))
{
last_reported_patch_download = value;
+ last_reported_patch_download_time = current_time;
callback.addInt( value );
return callback.evaluateBool();
}
- return zypp::source::DownloadResolvableReport::progressPatchDownload(value);
+ return zypp::repo::DownloadResolvableReport::progressPatchDownload(value);
}
virtual void problemPatchDownload( const std::string &description )
@@ -628,22 +729,20 @@
};
- int DownloadResolvableReceive::last_source_id = -1;
- int DownloadResolvableReceive::last_source_media = -1;
-
-
///////////////////////////////////////////////////////////////////
// DownloadProgressReceive
///////////////////////////////////////////////////////////////////
struct DownloadProgressReceive : public Recipient, public zypp::callback::ReceiveReport<zypp::media::DownloadProgressReport>
{
int last_reported;
+ time_t last_reported_time;
DownloadProgressReceive( RecipientCtl & construct_r ) : Recipient( construct_r ) {}
virtual void start( const zypp::Url &file, zypp::Pathname localfile )
{
last_reported = 0;
+ last_reported_time = time(NULL);
CB callback( ycpcb( YCPCallbacks::CB_StartDownload ) );
if ( callback._set )
@@ -654,21 +753,24 @@
}
}
- virtual bool progress(int value, const zypp::Url &file)
+ virtual bool progress(int value, const zypp::Url &file, double bps_avg, double bps_current)
{
CB callback( ycpcb( YCPCallbacks::CB_ProgressDownload ) );
// call the callback function only if the difference since the last call is at least 5%
- // or if 100% is reached
- if (callback._set && (value - last_reported >= 5 || last_reported - value >= 5 || value == 100))
+ // or if 100% is reached or if at least 3 seconds have elapsed
+ time_t current_time = time(NULL);
+ if (callback._set && (value - last_reported >= 5 || last_reported - value >= 5 || value == 100 || current_time - last_reported_time >= callback_timeout))
{
last_reported = value;
+ last_reported_time = current_time;
// report changed values
callback.addInt( value );
- callback.addInt( 100 );
+ callback.addInt( (long long) bps_avg );
+ callback.addInt( (long long) bps_current );
return callback.evaluateBool( true ); // default == continue
}
- return zypp::media::DownloadProgressReport::progress(value, file);
+ return zypp::media::DownloadProgressReport::progress(value, file, bps_avg, bps_current);
}
virtual Action problem( const zypp::Url &file, zypp::media::DownloadProgressReport::Error error, const std::string &description)
@@ -697,12 +799,21 @@
return zypp::media::DownloadProgressReport::problem(file, error, description);
}
- virtual void finish( const zypp::Url &file, zypp::media::DownloadProgressReport::Error error, const std::string &reason)
+ virtual void finish( const zypp::Url &file, zypp::media::DownloadProgressReport::Error error, const std::string &reason)
{
CB callback( ycpcb( YCPCallbacks::CB_DoneDownload ) );
+ zypp::media::DownloadProgressReport::Error err = error;
+
+ // ignore errors for optional files
+ if ( _silent_probing == MEDIA_CHANGE_DISABLE ||
+ _silent_probing == MEDIA_CHANGE_OPTIONALFILE)
+ {
+ err = zypp::media::DownloadProgressReport::NO_ERROR;
+ }
+
if ( callback._set ) {
- callback.addInt( error );
+ callback.addInt( err );
callback.addStr( reason );
callback.evaluate();
}
@@ -713,31 +824,31 @@
///////////////////////////////////////////////////////////////////
// ScriptExecCallbacks
///////////////////////////////////////////////////////////////////
- struct ScriptExecReceive : public Recipient, public zypp::callback::ReceiveReport<zypp::target::ScriptResolvableReport>
+ struct ScriptExecReceive : public Recipient, public zypp::callback::ReceiveReport<zypp::target::PatchScriptReport>
{
ScriptExecReceive( RecipientCtl & construct_r ) : Recipient( construct_r ) {}
- virtual void start( const zypp::Resolvable::constPtr &script_r, const zypp::Pathname &path_r, zypp::target::ScriptResolvableReport::Task task)
+ virtual void start( const zypp::Package::constPtr &pkg, const zypp::Pathname &path_r)
{
CB callback( ycpcb( YCPCallbacks::CB_ScriptStart) );
if ( callback._set )
{
- callback.addStr(script_r->name());
- callback.addStr(script_r->edition().asString());
- callback.addStr(script_r->arch().asString());
+ callback.addStr(pkg->name());
+ callback.addStr(pkg->edition().asString());
+ callback.addStr(pkg->arch().asString());
callback.addStr(path_r);
- callback.addBool(task == zypp::target::ScriptResolvableReport::DO);
+
callback.evaluate();
}
}
-
- virtual bool progress( zypp::target::ScriptResolvableReport::Notify ping, const std::string &out = std::string() )
+
+ virtual bool progress( zypp::target::PatchScriptReport::Notify ping, const std::string &out = std::string() )
{
CB callback( ycpcb( YCPCallbacks::CB_ScriptProgress) );
if ( callback._set )
{
- callback.addBool(ping == zypp::target::ScriptResolvableReport::PING);
+ callback.addBool(ping == zypp::target::PatchScriptReport::PING);
callback.addStr(out);
// false = abort the script
@@ -746,19 +857,35 @@
else
{
// return the default implementation
- return zypp::target::ScriptResolvableReport::progress(ping, out);
+ return zypp::target::PatchScriptReport::progress(ping, out);
}
}
- virtual void problem( const std::string &description )
+ virtual zypp::target::PatchScriptReport::Action problem( const std::string &description )
{
CB callback( ycpcb( YCPCallbacks::CB_ScriptProblem) );
if ( callback._set )
{
callback.addStr(description);
- callback.evaluate();
+
+ std::string ret = callback.evaluateStr();
+
+ // "A" = abort
+ if (ret == "A") return zypp::target::PatchScriptReport::ABORT;
+
+ // "I" = ignore
+ if (ret == "I") return zypp::target::PatchScriptReport::IGNORE;
+
+ // "R" = retry
+ if (ret == "R") return zypp::target::PatchScriptReport::RETRY;
+
+ y2error("Unknown return value: %s", ret.c_str());
}
+
+ // return the defaulf when the callback is not registered
+ // or the returned value is unknown
+ return zypp::target::PatchScriptReport::problem(description);
}
virtual void finish()
@@ -772,28 +899,93 @@
}
};
- struct MessageReceive : public Recipient, public zypp::callback::ReceiveReport<zypp::target::MessageResolvableReport>
+ struct MessageReceive : public Recipient, public zypp::callback::ReceiveReport<zypp::target::PatchMessageReport>
{
MessageReceive( RecipientCtl & construct_r ) : Recipient( construct_r ) {}
- virtual void show(zypp::Message::constPtr message)
+ virtual bool show(zypp::Patch::constPtr &p)
{
CB callback( ycpcb( YCPCallbacks::CB_Message) );
if ( callback._set )
{
- zypp::Patch::constPtr p = message->patch();
-
callback.addStr(p->name());
callback.addStr(p->edition().asString());
callback.addStr(p->arch().asString());
- callback.addStr(message->text().asString());
+ callback.addStr(p->message(zypp::ZConfig::instance().textLocale()));
- callback.evaluate();
+ return callback.evaluateBool();
}
+
+ // return the default
+ return zypp::target::PatchMessageReport::show(p);
}
};
+/*
+ struct AuthReceive : public Recipient, public zypp::callback::ReceiveReport<zypp::media::AuthenticationReport>
+ {
+ AuthReceive( RecipientCtl & construct_r ) : Recipient( construct_r ) {}
+
+ virtual bool prompt(const zypp::Url& url, const std::string& msg, zypp::media::AuthData& auth_data)
+ {
+ CB callback( ycpcb( YCPCallbacks::CB_Authentication ) );
+
+ if (callback._set)
+ {
+ callback.addStr(url.asString());
+ callback.addStr(msg);
+ callback.addStr(auth_data.username());
+ callback.addStr(auth_data.password());
+
+ YCPMap cbk(callback.evaluateMap());
+
+ YCPValue ycp_val = cbk->value(YCPString("username"));
+ if (!ycp_val.isNull() && ycp_val->isString())
+ {
+ // set the entered username
+ auth_data.setUsername(ycp_val->asString()->value());
+ }
+ else
+ {
+ y2error("Invalid/missing value 'username'");
+ }
+
+ ycp_val = cbk->value(YCPString("password"));
+ if (!ycp_val.isNull() && ycp_val->isString())
+ {
+ // set the entered password
+ auth_data.setPassword(ycp_val->asString()->value());
+ }
+ else
+ {
+ y2error("Invalid/missing value 'password'");
+ }
+
+ // authentication confirmed?
+ bool ret = false;
+
+ ycp_val = cbk->value(YCPString("continue"));
+ if (!ycp_val.isNull() && ycp_val->isBoolean())
+ {
+ // continue?
+ ret = ycp_val->asBoolean()->value();
+ y2milestone("Use the authentication data: %s", ret ? "true" : "false");
+ }
+ else
+ {
+ y2error("Invalid/missing value 'continue'");
+ }
+
+ return ret;
+ }
+
+ // return the default value from the parent class
+ return zypp::media::AuthenticationReport::prompt(url, msg, auth_data);
+ }
+ };
+*/
+
///////////////////////////////////////////////////////////////////
// MediaChangeCallback
///////////////////////////////////////////////////////////////////
@@ -801,7 +993,32 @@
{
MediaChangeReceive( RecipientCtl & construct_r ) : Recipient( construct_r ) {}
- virtual Action requestMedia(zypp::Source_Ref source, unsigned mediumNr, zypp::media::MediaChangeReport::Error error, const std::string &description)
+ std::string MediaChangeErrorAsString(zypp::media::MediaChangeReport::Error error)
+ {
+ // convert enum to a string
+ std::string error_str;
+
+ switch(error)
+ {
+ // no error
+ case zypp::media::MediaChangeReport::NO_ERROR : error_str = "NO_ERROR"; break;
+ case zypp::media::MediaChangeReport::NOT_FOUND : error_str = "NOT_FOUND"; break;
+ case zypp::media::MediaChangeReport::IO : error_str = "IO"; break;
+ case zypp::media::MediaChangeReport::INVALID : error_str = "INVALID"; break;
+ case zypp::media::MediaChangeReport::WRONG : error_str = "WRONG"; break;
+ case zypp::media::MediaChangeReport::IO_SOFT : error_str = "IO_SOFT"; break;
+ }
+
+ return error_str;
+ }
+
+ virtual Action requestMedia(zypp::Url &url,
+ unsigned int mediumNr,
+ const std::string & label,
+ zypp::media::MediaChangeReport::Error error,
+ const std::string &description,
+ const std::vector<std::string> & devices,
+ unsigned int &dev_current)
{
if ( _silent_probing == MEDIA_CHANGE_DISABLE )
return zypp::media::MediaChangeReport::ABORT;
@@ -817,14 +1034,14 @@
callback.addStr( description );
// search URL in the redirection map
- std::map<zypp::Source_Ref::NumericId, std::map<unsigned, std::string> >::const_iterator source_it = redirect_map.find(source.numericId());
+ RedirectMap::const_iterator source_it = redirect_map.find(url);
bool found = false;
- std::string report_url;
+ zypp::Url report_url;
if (source_it != redirect_map.end())
{
// search medium in the redirection map
- std::map<unsigned, std::string>::const_iterator media_it = (*source_it).second.find(mediumNr);
+ MediaMap::const_iterator media_it = (*source_it).second.find(mediumNr);
if (media_it != (*source_it).second.end())
{
@@ -832,23 +1049,23 @@
found = true;
// report the redirected URL
report_url = (*media_it).second;
- y2milestone("Using redirected URL %s, original URL: %s", report_url.c_str(), source.url().asString().c_str());
+
+ y2milestone("Using redirected URL %s, original URL: %s", report_url.asString().c_str(), url.asString().c_str());
}
}
if (!found)
{
// the source has not been redirected
- // use URL of the source
- report_url = source.url().asString();
+ // use URL of the source
+ report_url = url;
}
-
// current URL
- callback.addStr( report_url );
+ callback.addStr( report_url.asString() );
- // current product name (use the alias, see #214886)
- callback.addStr( source.alias() );
+ // repo alias (see bnc#330094)
+ callback.addStr( label );
// current medium, -1 means enable [Ignore]
callback.addInt( 0 );
@@ -879,19 +1096,28 @@
// "E" = eject media
if (ret == "E") return zypp::media::MediaChangeReport::EJECT;
+ // "E" + numbure = eject the required device
+ if (ret.size() > 1 && ret[0] == 'E')
+ {
+ // change the device
+ dev_current = zypp::str::strtonum<unsigned int>(ret.c_str() + 1);
+ y2milestone("Ejecting device %d", dev_current);
+ return zypp::media::MediaChangeReport::EJECT;
+ }
+
// "S" = skip (ignore) this media
if (ret == "S") return zypp::media::MediaChangeReport::IGNORE;
// otherwise change media URL
// try/catch to catch invalid URLs
try {
- zypp::Url ret_url (ret);
- source.redirect( mediumNr, ret_url );
+ // set the new URL
+ url = zypp::Url(ret);
- // remember the redirection
- std::map<unsigned, std::string> source_redir = redirect_map[source.numericId()];
- source_redir[mediumNr] = ret;
- redirect_map[source.numericId()] = source_redir;
+ // remember the redirection
+ MediaMap source_redir = redirect_map[url];
+ source_redir[mediumNr] = url;
+ redirect_map[url] = source_redir;
y2milestone("Source redirected to %s", ret.c_str());
@@ -905,18 +1131,18 @@
}
// return default value from the parent class
- return zypp::media::MediaChangeReport::requestMedia(source, mediumNr, error, description);
+ return zypp::media::MediaChangeReport::requestMedia(url, mediumNr, label, error, description, devices, dev_current);
}
};
- struct SourceCreateReceive : public Recipient, public zypp::callback::ReceiveReport<zypp::source::SourceCreateReport>
+ struct SourceCreateReceive : public Recipient, public zypp::callback::ReceiveReport<zypp::repo::RepoCreateReport>
{
SourceCreateReceive( RecipientCtl & construct_r ) : Recipient( construct_r ) {}
virtual void reportbegin()
{
CB callback( ycpcb( YCPCallbacks::CB_SourceCreateInit ) );
- y2debug("Source Create begin");
+ y2debug("Repo Create begin");
if (callback._set)
{
@@ -927,7 +1153,7 @@
virtual void reportend()
{
CB callback( ycpcb( YCPCallbacks::CB_SourceCreateDestroy ) );
- y2debug("Source Create destroy");
+ y2debug("Repo Create destroy");
if (callback._set)
{
@@ -958,10 +1184,10 @@
return callback.evaluateBool();
}
- return zypp::source::SourceCreateReport::progress(value);
+ return zypp::repo::RepoCreateReport::progress(value);
}
- std::string CreateSrcErrorAsString(zypp::source::SourceCreateReport::Error error)
+ std::string CreateSrcErrorAsString(zypp::repo::RepoCreateReport::Error error)
{
// convert enum to string
std::string error_str;
@@ -969,23 +1195,23 @@
switch(error)
{
// no error
- case zypp::source::SourceCreateReport::NO_ERROR : error_str = "NO_ERROR"; break;
+ case zypp::repo::RepoCreateReport::NO_ERROR : error_str = "NO_ERROR"; break;
// the requested Url was not found
- case zypp::source::SourceCreateReport::NOT_FOUND : error_str = "NOT_FOUND"; break;
+ case zypp::repo::RepoCreateReport::NOT_FOUND : error_str = "NOT_FOUND"; break;
// IO error
- case zypp::source::SourceCreateReport::IO : error_str = "IO"; break;
+ case zypp::repo::RepoCreateReport::IO : error_str = "IO"; break;
// the source is invalid
- case zypp::source::SourceCreateReport::INVALID : error_str = "INVALID"; break;
+ case zypp::repo::RepoCreateReport::INVALID : error_str = "INVALID"; break;
// rejected
- case zypp::source::SourceCreateReport::REJECTED : error_str = "REJECTED"; break;
+ case zypp::repo::RepoCreateReport::REJECTED : error_str = "REJECTED"; break;
// unknown error
- case zypp::source::SourceCreateReport::UNKNOWN : error_str = "UNKNOWN"; break;
+ case zypp::repo::RepoCreateReport::UNKNOWN : error_str = "UNKNOWN"; break;
}
return error_str;
}
- virtual Action problem( const zypp::Url &url, zypp::source::SourceCreateReport::Error error, const std::string &description )
+ virtual Action problem( const zypp::Url &url, zypp::repo::RepoCreateReport::Error error, const std::string &description )
{
CB callback( ycpcb( YCPCallbacks::CB_SourceCreateError ) );
@@ -998,8 +1224,8 @@
std::string result = callback.evaluateSymbol();
// check the returned symbol
- if ( result == "ABORT" ) return zypp::source::SourceCreateReport::ABORT;
- if ( result == "RETRY" ) return zypp::source::SourceCreateReport::RETRY;
+ if ( result == "ABORT" ) return zypp::repo::RepoCreateReport::ABORT;
+ if ( result == "RETRY" ) return zypp::repo::RepoCreateReport::RETRY;
// still here?
y2error("Unexpected symbol '%s' returned from callback.", result.c_str());
@@ -1007,10 +1233,10 @@
}
// return the default implementation
- return zypp::source::SourceCreateReport::problem(url, error, description);
+ return zypp::repo::RepoCreateReport::problem(url, error, description);
}
- virtual void finish( const zypp::Url &url, zypp::source::SourceCreateReport::Error error, const std::string &reason )
+ virtual void finish( const zypp::Url &url, zypp::repo::RepoCreateReport::Error error, const std::string &reason )
{
CB callback( ycpcb( YCPCallbacks::CB_SourceCreateEnd ) );
@@ -1025,18 +1251,17 @@
}
};
-
///////////////////////////////////////////////////////////////////
- // ProbeSourceReport
+ // ProbeSourceReceive
///////////////////////////////////////////////////////////////////
- struct ProbeSourceReceive : public Recipient, public zypp::callback::ReceiveReport<zypp::source::ProbeSourceReport>
+ struct ProbeSourceReceive : public Recipient, public zypp::callback::ReceiveReport<zypp::repo::ProbeRepoReport>
{
ProbeSourceReceive( RecipientCtl & construct_r ) : Recipient( construct_r ) {}
virtual void start(const zypp::Url &url)
{
_silent_probing = MEDIA_CHANGE_DISABLE;
-
+
CB callback( ycpcb( YCPCallbacks::CB_SourceProbeStart ) );
if (callback._set)
@@ -1073,7 +1298,7 @@
}
}
- std::string ProbeSrcErrorAsString(zypp::source::ProbeSourceReport::Error error)
+ std::string ProbeSrcErrorAsString(zypp::repo::ProbeRepoReport::Error error)
{
// convert enum to string
std::string error_str;
@@ -1081,21 +1306,21 @@
switch(error)
{
// no error
- case zypp::source::ProbeSourceReport::NO_ERROR : error_str = "NO_ERROR"; break;
+ case zypp::repo::ProbeRepoReport::NO_ERROR : error_str = "NO_ERROR"; break;
// the requested Url was not found
- case zypp::source::ProbeSourceReport::NOT_FOUND : error_str = "NOT_FOUND"; break;
+ case zypp::repo::ProbeRepoReport::NOT_FOUND : error_str = "NOT_FOUND"; break;
// IO error
- case zypp::source::ProbeSourceReport::IO : error_str = "IO"; break;
+ case zypp::repo::ProbeRepoReport::IO : error_str = "IO"; break;
// the source is invalid
- case zypp::source::ProbeSourceReport::INVALID : error_str = "INVALID"; break;
+ case zypp::repo::ProbeRepoReport::INVALID : error_str = "INVALID"; break;
// unknow error
- case zypp::source::ProbeSourceReport::UNKNOWN : error_str = "UNKNOWN"; break;
+ case zypp::repo::ProbeRepoReport::UNKNOWN : error_str = "UNKNOWN"; break;
}
return error_str;
}
- virtual void finish(const zypp::Url &url, zypp::source::ProbeSourceReport::Error error, const std::string &reason )
+ virtual void finish(const zypp::Url &url, zypp::repo::ProbeRepoReport::Error error, const std::string &reason )
{
_silent_probing = MEDIA_CHANGE_FULL;
@@ -1123,10 +1348,11 @@
return callback.evaluateBool();
}
- return zypp::source::ProbeSourceReport::progress(url, value);
+ return zypp::repo::ProbeRepoReport::progress(url, value);
+ return true;
}
- virtual zypp::source::ProbeSourceReport::Action problem( const zypp::Url &url, zypp::source::ProbeSourceReport::Error error, const std::string &description )
+ virtual zypp::repo::ProbeRepoReport::Action problem( const zypp::Url &url, zypp::repo::ProbeRepoReport::Error error, const std::string &description )
{
CB callback( ycpcb( YCPCallbacks::CB_SourceProbeError ) );
@@ -1139,8 +1365,8 @@
std::string result = callback.evaluateSymbol();
// check the returned symbol
- if ( result == "ABORT" ) return zypp::source::ProbeSourceReport::ABORT;
- if ( result == "RETRY" ) return zypp::source::ProbeSourceReport::RETRY;
+ if ( result == "ABORT" ) return zypp::repo::ProbeRepoReport::ABORT;
+ if ( result == "RETRY" ) return zypp::repo::ProbeRepoReport::RETRY;
// still here?
y2error("Unexpected symbol '%s' returned from callback.", result.c_str());
@@ -1148,12 +1374,14 @@
}
// return the default value
- return zypp::source::ProbeSourceReport::problem(url, error, description);
+ return zypp::repo::ProbeRepoReport::problem(url, error, description);
}
};
- struct SourceReport : public Recipient, public zypp::callback::ReceiveReport<zypp::source::SourceReport>
+
+ struct RepoReport : public Recipient, public zypp::callback::ReceiveReport<zypp::repo::RepoReport>
{
+ const PkgModuleFunctions &_pkg_ref;
virtual void reportbegin()
{
CB callback( ycpcb( YCPCallbacks::CB_SourceReportInit ) );
@@ -1176,37 +1404,44 @@
}
}
- SourceReport( RecipientCtl & construct_r ) : Recipient( construct_r ) {}
+ RepoReport( RecipientCtl & construct_r, const PkgModuleFunctions &pk ) : Recipient( construct_r ), _pkg_ref(pk) {}
- virtual void start( zypp::Source_Ref source, const std::string &task )
+ virtual void start(const zypp::ProgressData &task, const zypp::RepoInfo repo)
{
CB callback( ycpcb( YCPCallbacks::CB_SourceReportStart ) );
if (callback._set)
{
- callback.addInt(source.numericId());
- callback.addStr(source.url());
- callback.addStr(task);
+ callback.addInt(_pkg_ref.logFindAlias(repo.alias()));
+
+ std::string url;
+ if (repo.baseUrlsBegin() != repo.baseUrlsEnd())
+ {
+ url = repo.baseUrlsBegin()->asString();
+ }
+
+ callback.addStr(url);
+ callback.addStr(task.name());
callback.evaluate();
}
}
- virtual bool progress( int value )
+ virtual bool progress(const zypp::ProgressData &task)
{
CB callback( ycpcb( YCPCallbacks::CB_SourceReportProgress ) );
if (callback._set)
{
- callback.addInt(value);
+ callback.addInt(task.reportValue());
return callback.evaluateBool();
}
- return zypp::source::SourceReport::progress(value);
+ return zypp::repo::RepoReport::progress(task);
}
- std::string SrcReportErrorAsString(zypp::source::SourceReport::Error error)
+ std::string SrcReportErrorAsString(zypp::repo::RepoReport::Error error)
{
// convert enum to string
std::string error_str;
@@ -1214,42 +1449,51 @@
switch(error)
{
// no error
- case zypp::source::SourceReport::NO_ERROR : error_str = "NO_ERROR"; break;
+ case zypp::repo::RepoReport::NO_ERROR : error_str = "NO_ERROR"; break;
// the requested Url was not found
- case zypp::source::SourceReport::NOT_FOUND : error_str = "NOT_FOUND"; break;
+ case zypp::repo::RepoReport::NOT_FOUND : error_str = "NOT_FOUND"; break;
// IO error
- case zypp::source::SourceReport::IO : error_str = "IO"; break;
+ case zypp::repo::RepoReport::IO : error_str = "IO"; break;
// the source is invalid
- case zypp::source::SourceReport::INVALID : error_str = "INVALID"; break;
+ case zypp::repo::RepoReport::INVALID : error_str = "INVALID"; break;
}
return error_str;
}
- virtual zypp::source::SourceReport::Action problem( zypp::Source_Ref source, zypp::source::SourceReport::Error error, const std::string &description )
+ virtual zypp::repo::RepoReport::Action problem(zypp::Repository source,
+ zypp::repo::RepoReport::Error error, const std::string &description)
{
CB callback( ycpcb( YCPCallbacks::CB_SourceReportError ) );
-
- // the file is optional, ignore the error
+
+ // the file is optional, ignore the error
if (_silent_probing == ZyppRecipients::MEDIA_CHANGE_OPTIONALFILE)
{
y2milestone("The file is optional, ignoring the error");
- return zypp::source::SourceReport::IGNORE;
+ return zypp::repo::RepoReport::IGNORE;
}
if ( callback._set )
{
- callback.addInt(source.numericId());
- callback.addStr(source.url());
+ // search Yast source ID
+ callback.addInt(_pkg_ref.logFindAlias(source.info().alias()));
+
+ std::string url;
+ if (source.info().baseUrlsBegin() != source.info().baseUrlsEnd())
+ {
+ url = source.info().baseUrlsBegin()->asString();
+ }
+
+ callback.addStr(url);
callback.addStr(SrcReportErrorAsString(error));
callback.addStr(description);
std::string result = callback.evaluateSymbol();
// check the returned symbol
- if ( result == "ABORT" ) return zypp::source::SourceReport::ABORT;
- if ( result == "RETRY" ) return zypp::source::SourceReport::RETRY;
- if ( result == "IGNORE" ) return zypp::source::SourceReport::IGNORE;
+ if ( result == "ABORT" ) return zypp::repo::RepoReport::ABORT;
+ if ( result == "RETRY" ) return zypp::repo::RepoReport::RETRY;
+ if ( result == "IGNORE" ) return zypp::repo::RepoReport::IGNORE;
// still here?
y2error("Unexpected symbol '%s' returned from callback.", result.c_str());
@@ -1257,17 +1501,26 @@
}
// return the default value
- return zypp::source::SourceReport::problem(source, error, description);
+ return zypp::repo::RepoReport::problem(source, error, description);
}
- virtual void finish( zypp::Source_Ref source, const std::string &task, zypp::source::SourceReport::Error error, const std::string &reason )
+ virtual void finish(zypp::Repository source, const std::string &task,
+ zypp::repo::RepoReport::Error error, const std::string &reason)
{
CB callback( ycpcb( YCPCallbacks::CB_SourceReportEnd ) );
if (callback._set)
{
- callback.addInt(source.numericId());
- callback.addStr(source.url());
+ // search Yast source ID
+ callback.addInt(_pkg_ref.logFindAlias(source.info().alias()));
+
+ std::string url;
+ if (source.info().baseUrlsBegin() != source.info().baseUrlsEnd())
+ {
+ url = source.info().baseUrlsBegin()->asString();
+ }
+ callback.addStr(url);
+
callback.addStr(task);
callback.addStr(SrcReportErrorAsString(error));
callback.addStr(reason);
@@ -1277,31 +1530,6 @@
}
};
-
- struct ResolvableReport : public Recipient, public zypp::callback::ReceiveReport<zypp::target::MessageResolvableReport>
- {
- ResolvableReport( RecipientCtl & construct_r ) : Recipient( construct_r ) {}
-
- virtual void show(zypp::Message::constPtr message)
- {
- CB callback( ycpcb( YCPCallbacks::CB_ResolvableReport) );
-
- if (callback._set)
- {
- zypp::Patch::constPtr patch = message->patch();
-
- // patch name
- callback.addStr(patch ? patch->name() : message->name());
- // patch summary
- callback.addStr(patch ? patch->summary() : message->summary());
- // message itself
- callback.addStr(message->text().asString());
-
- callback.evaluate();
- }
- }
- };
-
///////////////////////////////////////////////////////////////////
// DigestReport handler
///////////////////////////////////////////////////////////////////
@@ -1353,7 +1581,7 @@
return zypp::DigestReport::askUserToAcceptWrongDigest(file, requested, found);
}
-
+
};
@@ -1362,59 +1590,41 @@
///////////////////////////////////////////////////////////////////
struct KeyRingReceive : public Recipient, public zypp::callback::ReceiveReport<zypp::KeyRingReport>
{
- KeyRingReceive( RecipientCtl & construct_r ) : Recipient( construct_r ) {}
+ const PkgModuleFunctions &_pkg_ref;
+ KeyRingReceive( RecipientCtl & construct_r, const PkgModuleFunctions &pk) : Recipient( construct_r ), _pkg_ref(pk) {}
- virtual bool askUserToImportKey( const zypp::PublicKey &key)
+ virtual zypp::KeyRingReport::KeyTrust askUserToAcceptKey( const zypp::PublicKey &key, const zypp::KeyContext &context)
{
CB callback( ycpcb( YCPCallbacks::CB_ImportGpgKey) );
if (callback._set)
{
- callback.addStr(key.id());
- callback.addStr(key.name());
- callback.addStr(key.fingerprint());
-
- bool res = callback.evaluateBool();
- y2milestone("Callback ImportGpgKey value: %s", res ? "true" : "false");
-
- return res;
- }
-
- y2milestone("Callback ImportGpgKey not registered, using default value: %s", zypp::KeyRingReport::askUserToImportKey(key) ? "true" : "false");
-
- return zypp::KeyRingReport::askUserToImportKey(key);
- }
-
- virtual bool askUserToTrustKey(const zypp::PublicKey& key)
- {
- CB callback( ycpcb( YCPCallbacks::CB_AcceptNonTrustedGpgKey) );
-
- if (callback._set)
- {
- callback.addStr(key.path().asString());
- callback.addStr(key.id());
+ GPGMap gpgmap(key);
- callback.addStr(key.name());
- callback.addStr(key.fingerprint());
+ callback.addMap(gpgmap.getMap());
+ long long srcid = _pkg_ref.logFindAlias(context.repoInfo().alias());
+ callback.addInt(srcid);
bool res = callback.evaluateBool();
- y2milestone("Callback AcceptNonTrustedGpgKey value: %s", res ? "true" : "false");
+ y2milestone("Callback ImportGpgKey value: %s", res ? "true" : "false");
- return res;
+ return res ? KEY_TRUST_AND_IMPORT : KEY_DONT_TRUST;
}
- y2milestone("Callback AcceptNonTrustedGpgKey not registered, using default value: %s", zypp::KeyRingReport::askUserToTrustKey(key) ? "true" : "false");
+ y2milestone("Callback ImportGpgKey not registered, using default value: %s", zypp::KeyRingReport::askUserToAcceptKey(key, context) ? "true" : "false");
- return zypp::KeyRingReport::askUserToTrustKey(key);
+ return zypp::KeyRingReport::askUserToAcceptKey(key, context);
}
- virtual bool askUserToAcceptUnsignedFile(const std::string &file)
+ virtual bool askUserToAcceptUnsignedFile(const std::string &file, const zypp::KeyContext &context)
{
CB callback( ycpcb( YCPCallbacks::CB_AcceptUnsignedFile) );
if (callback._set)
{
callback.addStr(file);
+ long long srcid = _pkg_ref.logFindAlias(context.repoInfo().alias());
+ callback.addInt(srcid);
return callback.evaluateBool();
}
@@ -1422,7 +1632,7 @@
return zypp::KeyRingReport::askUserToAcceptUnsignedFile(file);
}
- virtual bool askUserToAcceptUnknownKey(const std::string &file, const std::string &id)
+ virtual bool askUserToAcceptUnknownKey(const std::string &file, const std::string &id, const zypp::KeyContext &context)
{
CB callback( ycpcb( YCPCallbacks::CB_AcceptUnknownGpgKey) );
@@ -1430,6 +1640,8 @@
{
callback.addStr(file);
callback.addStr(id);
+ long long srcid = _pkg_ref.logFindAlias(context.repoInfo().alias());
+ callback.addInt(srcid);
bool res = callback.evaluateBool();
y2milestone("Callback AcceptUnknownGpgKey value: %s", res ? "true" : "false");
@@ -1442,16 +1654,18 @@
return zypp::KeyRingReport::askUserToAcceptUnknownKey(file,id);
}
- virtual bool askUserToAcceptVerificationFailed(const std::string &file, const zypp::PublicKey &key)
+ virtual bool askUserToAcceptVerificationFailed(const std::string &file, const zypp::PublicKey &key, const zypp::KeyContext &context)
{
CB callback( ycpcb( YCPCallbacks::CB_AcceptVerificationFailed) );
if (callback._set)
{
+ GPGMap gpgmap(key);
+
callback.addStr(file);
- callback.addStr(key.id());
- callback.addStr(key.name());
- callback.addStr(key.fingerprint());
+ callback.addMap(gpgmap.getMap());
+ long long srcid = _pkg_ref.logFindAlias(context.repoInfo().alias());
+ callback.addInt(srcid);
return callback.evaluateBool();
}
@@ -1467,27 +1681,29 @@
{
KeyRingSignal ( RecipientCtl & construct_r ) : Recipient( construct_r ) {}
- virtual void trustedKeyAdded( const zypp::KeyRing &/*keyring*/, const zypp::PublicKey &key )
+ virtual void trustedKeyAdded( const zypp::PublicKey &key )
{
CB callback( ycpcb( YCPCallbacks::CB_TrustedKeyAdded) );
if (callback._set)
{
- callback.addStr(key.id());
- callback.addStr(key.name());
- callback.addStr(key.fingerprint());
+ GPGMap gpgmap(key);
+
+ callback.addMap(gpgmap.getMap());
+ callback.evaluate();
}
}
- virtual void trustedKeyRemoved( const zypp::KeyRing &/*keyring*/, const zypp::PublicKey &key )
+ virtual void trustedKeyRemoved( const zypp::PublicKey &key )
{
CB callback( ycpcb( YCPCallbacks::CB_TrustedKeyRemoved) );
if (callback._set)
{
- callback.addStr(key.id());
- callback.addStr(key.name());
- callback.addStr(key.fingerprint());
+ GPGMap gpgmap(key);
+
+ callback.addMap(gpgmap.getMap());
+ callback.evaluate();
}
}
};
@@ -1527,11 +1743,10 @@
// source manager callback
ZyppRecipients::SourceCreateReceive _sourceCreateReceive;
- ZyppRecipients::SourceReport _sourceReport;
+ ZyppRecipients::RepoReport _sourceReport;
ZyppRecipients::ProbeSourceReceive _probeSourceReceive;
- // resolvable report
- ZyppRecipients::ResolvableReport _resolvableReport;
+ ZyppRecipients::ProgressReceive _progressReceive;
// digest callback
ZyppRecipients::DigestReceive _digestReceive;
@@ -1542,26 +1757,30 @@
// key ring signal callback
ZyppRecipients::KeyRingSignal _keyRingSignal;
+ // authentication callback
+ //ZyppRecipients::AuthReceive _authReceive;
+
public:
- ZyppReceive( const YCPCallbacks & ycpcb_r )
+ ZyppReceive( const YCPCallbacks & ycpcb_r, PkgModuleFunctions &pkg)
: RecipientCtl( ycpcb_r )
, _convertDbReceive( *this )
, _rebuildDbReceive( *this )
- , _installPkgReceive( *this )
+ , _installPkgReceive( *this, pkg )
, _removePkgReceive( *this )
- , _providePkgReceive( *this )
+ , _providePkgReceive( *this, pkg )
, _mediaChangeReceive( *this )
, _downloadProgressReceive( *this )
, _scriptExecReceive( *this )
, _messageReceive( *this )
, _sourceCreateReceive( *this )
- , _sourceReport( *this )
+ , _sourceReport( *this, pkg)
, _probeSourceReceive( *this )
- , _resolvableReport( *this )
+ , _progressReceive( *this )
, _digestReceive( *this )
- , _keyRingReceive( *this )
+ , _keyRingReceive( *this, pkg )
, _keyRingSignal( *this )
+ //, _authReceive( *this )
{
// connect the receivers
_convertDbReceive.connect();
@@ -1571,15 +1790,16 @@
_providePkgReceive.connect();
_mediaChangeReceive.connect();
_downloadProgressReceive.connect();
- _scriptExecReceive.connect();
- _messageReceive.connect();
+ //_scriptExecReceive.connect();
+ //_messageReceive.connect();
_sourceCreateReceive.connect();
_sourceReport.connect();
_probeSourceReceive.connect();
- _resolvableReport.connect();
+ _progressReceive.connect();
_digestReceive.connect();
_keyRingReceive.connect();
_keyRingSignal.connect();
+// _authReceive.connect();
}
virtual ~ZyppReceive()
@@ -1597,10 +1817,11 @@
_sourceCreateReceive.disconnect();
_sourceReport.disconnect();
_probeSourceReceive.disconnect();
- _resolvableReport.disconnect();
+ _progressReceive.disconnect();
_digestReceive.disconnect();
_keyRingReceive.disconnect();
_keyRingSignal.disconnect();
+// _authReceive.disconnect();
}
public:
@@ -1618,9 +1839,9 @@
// METHOD NAME : PkgModuleFunctions::CallbackHandler::CallbackHandler
// METHOD TYPE : Constructor
//
-PkgModuleFunctions::CallbackHandler::CallbackHandler( )
+PkgModuleFunctions::CallbackHandler::CallbackHandler(PkgModuleFunctions &pk)
: _ycpCallbacks( *new YCPCallbacks() )
- , _zyppReceive( *new ZyppReceive( _ycpCallbacks ) )
+ , _zyppReceive( *new ZyppReceive(_ycpCallbacks, pk) )
{
}
@@ -1637,592 +1858,3 @@
delete &_ycpCallbacks;
}
-///////////////////////////////////////////////////////////////////
-//
-// CLASS NAME : PkgModuleFunctions
-//
-// Set YCPCallbacks. _ycpCallbacks
-//
-///////////////////////////////////////////////////////////////////
-
-#define SET_YCP_CB(E,A) _callbackHandler._ycpCallbacks.setYCPCallback( CallbackHandler::YCPCallbacks::E, A );
-
-YCPValue PkgModuleFunctions::CallbackStartProvide( const YCPString& args ) {
- return SET_YCP_CB( CB_StartProvide, args );
-}
-YCPValue PkgModuleFunctions::CallbackProgressProvide( const YCPString& args ) {
- return SET_YCP_CB( CB_ProgressProvide, args );
-}
-YCPValue PkgModuleFunctions::CallbackDoneProvide( const YCPString& args ) {
- return SET_YCP_CB( CB_DoneProvide, args );
-}
-
-YCPValue PkgModuleFunctions::CallbackStartPackage( const YCPString& args ) {
- return SET_YCP_CB( CB_StartPackage, args );
-}
-YCPValue PkgModuleFunctions::CallbackProgressPackage( const YCPString& args ) {
- return SET_YCP_CB( CB_ProgressPackage, args );
-}
-YCPValue PkgModuleFunctions::CallbackDonePackage( const YCPString& args ) {
- return SET_YCP_CB( CB_DonePackage, args );
-}
-
-YCPValue PkgModuleFunctions::CallbackResolvableReport( const YCPString& args ) {
- return SET_YCP_CB( CB_ResolvableReport, args );
-}
-
-/**
- * @builtin CallbackImportGpgKey
- * @short Register callback function
- * @param string args Name of the callback handler function. Required callback prototype is <code>boolean(string keyid, string keyname, string keydetails)</code>. The callback function should ask user whether the key is trusted, returned true value means the key is trusted.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackImportGpgKey( const YCPString& args ) {
- return SET_YCP_CB( CB_ImportGpgKey, args );
-}
-
-/**
- * @builtin CallbackAcceptUnknownGpgKey
- * @short Register callback function
- * @param string args Name of the callback handler function. Required callback prototype is <code>boolean(string filename, string keyid)</code>. The callback function should ask user whether the unknown key can be accepted, returned true value means to accept the key.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackAcceptUnknownGpgKey( const YCPString& args ) {
- return SET_YCP_CB( CB_AcceptUnknownGpgKey, args );
-}
-
-/**
- * @builtin CallbackAcceptNonTrustedGpgKey
- * @short Register callback function
- * @param string args Name of the callback handler function. Required callback prototype is <code>boolean(string filename, string keyid, string keyname, string fingerprint)</code>. The callback function should ask user whether the unknown key can be accepted, returned true value means to accept the file.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackAcceptNonTrustedGpgKey( const YCPString& args ) {
- return SET_YCP_CB( CB_AcceptNonTrustedGpgKey, args );
-}
-
-/**
- * @builtin CallbackAcceptUnsignedFile
- * @short Register callback function
- * @param string args Name of the callback handler function. Required callback prototype is <code>boolean(string filename)</code>. The callback function should ask user whether the unsigned file can be accepted, returned true value means to accept the file.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackAcceptUnsignedFile( const YCPString& args ) {
- return SET_YCP_CB( CB_AcceptUnsignedFile, args );
-}
-
-/**
- * @builtin CallbackAcceptFileWithoutChecksum
- * @short Register callback function
- * @param string args Name of the callback handler function. Required callback prototype is <code>boolean(string filename)</code>. The callback function should ask user whether the unsigned file can be accepted, returned true value means to accept the file.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackAcceptFileWithoutChecksum( const YCPString& args ) {
- return SET_YCP_CB( CB_AcceptFileWithoutChecksum, args );
-}
-
-/**
- * @builtin CallbackAcceptVerificationFailed
- * @short Register callback function
- * @param string args Name of the callback handler function. Required callback prototype is <code>boolean(string filename, string keyid, string keyname)</code>. The callback function should ask user whether the unsigned file can be accepted, returned true value means to accept the file.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackAcceptVerificationFailed( const YCPString& args ) {
- return SET_YCP_CB( CB_AcceptVerificationFailed, args );
-}
-
-/**
- * @builtin CallbackAcceptWrongDigest
- * @short Register callback function
- * @param string args Name of the callback handler function. Required callback prototype is <code>boolean(string filename, string requested_digest, string found_digest)</code>. The callback function should ask user whether the wrong digest can be accepted, returned true value means to accept the file.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackAcceptWrongDigest( const YCPString& func)
-{
- return SET_YCP_CB( CB_AcceptWrongDigest, func );
-}
-
-/**
- * @builtin CallbackAcceptUnknownDigest
- * @short Register callback function
- * @param string args Name of the callback handler function. Required callback prototype is <code>boolean(string filename, string name)</code>. The callback function should ask user whether the uknown digest can be accepted, returned true value means to accept the digest.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackAcceptUnknownDigest( const YCPString& func)
-{
- return SET_YCP_CB( CB_AcceptUnknownDigest, func );
-}
-
-/**
- * @builtin CallbackTrustedKeyAdded
- * @short Register callback function
- * @param string args Name of the callback handler function. Required callback prototype is <code>void(string keyid, string keyname)</code>. The callback function should inform user that a trusted key has been added.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackTrustedKeyAdded( const YCPString& args ) {
- return SET_YCP_CB( CB_TrustedKeyAdded, args );
-}
-
-/**
- * @builtin CallbackTrustedKeyRemoved
- * @short Register callback function
- * @param string args Name of the callback handler function. Required callback prototype is <code>void(string keyid, string keyname)</code>. The callback function should inform user that a trusted key has been removed.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackTrustedKeyRemoved( const YCPString& args ) {
- return SET_YCP_CB( CB_TrustedKeyRemoved, args );
-}
-
-YCPValue PkgModuleFunctions::CallbackMediaChange( const YCPString& args ) {
- // FIXME: Allow omission of 'src' argument in 'src, name'. Since we can
- // handle one callback function at most, passing a src argument
- // implies a per-source callback which isn't implemented anyway.
- return SET_YCP_CB( CB_MediaChange, args );
-}
-
-YCPValue PkgModuleFunctions::CallbackSourceChange( const YCPString& args ) {
- return SET_YCP_CB( CB_SourceChange, args );
-}
-
-
-YCPValue PkgModuleFunctions::CallbackYouProgress( const YCPString& args ) {
- y2warning("Pkg::CallbackYouProgress is obsoleted, do not use it (empty implementation)!");
- return YCPVoid();
-}
-
-YCPValue PkgModuleFunctions::CallbackYouPatchProgress( const YCPString& args ) {
- y2warning("Pkg::CallbackYouPatchProgress is obsoleted, do not use it (empty implementation)!");
- return YCPVoid();
-}
-
-YCPValue PkgModuleFunctions::CallbackYouError( const YCPString& args ) {
- y2warning("Pkg::CallbackYouError is obsoleted, do not use it (empty implementation)!");
- return YCPVoid();
-}
-
-YCPValue PkgModuleFunctions::CallbackYouMessage( const YCPString& args ) {
- y2warning("Pkg::CallbackYouMessage is obsoleted, do not use it (empty implementation)!");
- return YCPVoid();
-}
-
-YCPValue PkgModuleFunctions::CallbackYouLog( const YCPString& args ) {
- y2warning("Pkg::CallbackYouLog is obsoleted, do not use it (empty implementation)!");
- return YCPVoid();
-}
-
-YCPValue PkgModuleFunctions::CallbackYouExecuteYcpScript( const YCPString& args ) {
- y2warning("Pkg::CallbackYouExecuteYcpScript is obsoleted, do not use it (empty implementation)!");
- return YCPVoid();
-}
-YCPValue PkgModuleFunctions::CallbackYouScriptProgress( const YCPString& args ) {
- y2warning("Pkg::CallbackYouScriptProgress is obsoleted, do not use it (empty implementation)!");
- return YCPVoid();
-}
-
-YCPValue PkgModuleFunctions::CallbackStartRebuildDb( const YCPString& args ) {
- return SET_YCP_CB( CB_StartRebuildDb, args );
-}
-YCPValue PkgModuleFunctions::CallbackProgressRebuildDb( const YCPString& args ) {
- return SET_YCP_CB( CB_ProgressRebuildDb, args );
-}
-YCPValue PkgModuleFunctions::CallbackNotifyRebuildDb( const YCPString& args ) {
- return SET_YCP_CB( CB_NotifyRebuildDb, args );
-}
-YCPValue PkgModuleFunctions::CallbackStopRebuildDb( const YCPString& args ) {
- return SET_YCP_CB( CB_StopRebuildDb, args );
-}
-
-YCPValue PkgModuleFunctions::CallbackStartConvertDb( const YCPString& args ) {
- return SET_YCP_CB( CB_StartConvertDb, args );
-}
-YCPValue PkgModuleFunctions::CallbackProgressConvertDb( const YCPString& args ) {
- return SET_YCP_CB( CB_ProgressConvertDb, args );
-}
-YCPValue PkgModuleFunctions::CallbackNotifyConvertDb( const YCPString& args ) {
- return SET_YCP_CB( CB_NotifyConvertDb, args );
-}
-YCPValue PkgModuleFunctions::CallbackStopConvertDb( const YCPString& args ) {
- return SET_YCP_CB( CB_StopConvertDb, args );
-}
-
-
-/**
- * @builtin CallbackStartDeltaDownload
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(string filename, integer download_size)</code>. If the download size is unknown download_size is 0. The callback function is evaluated when a delta RPM download has been started.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackStartDeltaDownload( const YCPString& func ) {
- return SET_YCP_CB( CB_StartDeltaDownload, func );
-}
-
-/**
- * @builtin CallbackProgressDeltaDownload
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>boolean (integer value)</code>. The callback function is evaluated when more than 5% of the size has been downloaded since the last evaluation. If the handler returns false the download is aborted.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackProgressDeltaDownload( const YCPString& func ) {
- return SET_YCP_CB( CB_ProgressDeltaDownload, func );
-}
-
-/**
- * @builtin CallbackProblemDeltaDownload
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(string description)</code>. The callback function should inform user that a problem has occurred during delta file download. This is not fatal, it still may be possible to download the full RPM instead.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackProblemDeltaDownload( const YCPString& func ) {
- return SET_YCP_CB( CB_ProblemDeltaDownload, func );
-}
-
-/**
- * @builtin CallbackStartDeltaApply
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(string filename)</code>. The callback function should inform user that a delta application has been started.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackStartDeltaApply( const YCPString& func ) {
- return SET_YCP_CB( CB_StartDeltaApply, func );
-}
-
-/**
- * @builtin CallbackProgressDeltaApply
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(integer value)</code>. The callback function is evaluated when more than 5% of the delta size has been applied since the last evaluation.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackProgressDeltaApply( const YCPString& func ) {
- return SET_YCP_CB( CB_ProgressDeltaApply, func );
-}
-
-/**
- * @builtin CallbackProblemDeltaApply
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(string description)</code>. The callback function should inform user that a problem has occurred during delta file application. This is not fatal, it still may be possible to use the full RPM instead.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackProblemDeltaApply( const YCPString& func ) {
- return SET_YCP_CB( CB_ProblemDeltaApply, func );
-}
-
-/**
- * @builtin CallbackStartPatchDownload
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(string filename, integer download_size)</code>. If the download size is unknown download_size is 0. The callback function is evaluated when a patch download has been started.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackStartPatchDownload( const YCPString& func ) {
- return SET_YCP_CB( CB_StartPatchDownload, func );
-}
-
-/**
- * @builtin CallbackProgressPatchDownload
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>boolean(integer value)</code>. The callback function is evaluated when more than 5% of the patch size has been downloaded since the last evaluation. If the handler returns false the download is aborted.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackProgressPatchDownload( const YCPString& func ) {
- return SET_YCP_CB( CB_ProgressPatchDownload, func );
-}
-
-/**
- * @builtin CallbackProblemPatchDownload
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(string description)</code>. The callback function should inform user that a problem has occurred during download of the patch.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackProblemPatchDownload( const YCPString& func ) {
- return SET_YCP_CB( CB_ProblemPatchDownload, func );
-}
-
-
-/**
- * @builtin CallbackFinishDeltaDownload
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void()</code>. The callback function is evaluated when the delta download has been finished.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackFinishDeltaDownload( const YCPString& func)
-{
- return SET_YCP_CB( CB_FinishDeltaDownload, func );
-}
-
-/**
- * @builtin CallbackFinishDeltaApply
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void()</code>. The callback function is evaluated when the delta download has been applied.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackFinishDeltaApply( const YCPString& func)
-{
- return SET_YCP_CB( CB_FinishDeltaApply, func );
-}
-
-/**
- * @builtin CallbackFinishPatchDownload
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void()</code>. The callback function is evaluated when the patch download has been finished.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackFinishPatchDownload( const YCPString& func)
-{
- return SET_YCP_CB( CB_FinishPatchDownload, func );
-}
-
-
-/**
- * @builtin CallbackSourceCreateStart
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(string url)</code>. The callback is evaluated when a source creation has been started.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackSourceCreateStart( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceCreateStart, func );
-}
-
-
-/**
- * @builtin CallbackSourceProgressData
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>boolean(integer value)</code>. The callback function is evaluated when more than 5% of the data has been processed since the last evaluation. If the handler returns false the download is aborted.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackSourceCreateProgress( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceCreateProgress, func );
-}
-
-/**
- * @builtin CallbackSourceCreateError
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>string(string url, string err_code, string description)</code>. err_code is "NO_ERROR", "NOT_FOUND" (the URL was not found), "IO" (I/O error) or "INVALID" (the source is not valid). The callback function must return "ABORT" or "RETRY". The callback function is evaluated when an error occurrs during creation of the source.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackSourceCreateError( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceCreateError, func );
-}
-
-/**
- * @builtin CallbackSourceCreateEnd
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(string url, string err_code, string description)</code>. err_code is "NO_ERROR", "NOT_FOUND" (the URL was not found), "IO" (I/O error) or "INVALID" (the source is not valid). The callback function is evaluated when creation of the source has been finished.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackSourceCreateEnd( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceCreateEnd, func );
-}
-
-
-
-
-/**
- * @builtin CallbackSourceProbeStart
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(string url)</code>. The callback function is evaluated when source probing has been started.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackSourceProbeStart( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceProbeStart, func );
-}
-
-/**
- * @builtin CallbackSourceProbeFailed
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(string url, string type)</code>. The callback function is evaluated when the probed source has different type.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackSourceProbeFailed( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceProbeFailed, func );
-}
-
-/**
- * @builtin CallbackSourceProbeSucceeded
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(string url, string type)</code>. The callback function is evaluated when the probed source has type <code>type</code>.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackSourceProbeSucceeded( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceProbeSucceeded, func );
-}
-
-/**
- * @builtin CallbackSourceProbeEnd
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(string url, string error, string reason)</code>. The callback function is evaluated when source probing has been finished.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackSourceProbeEnd( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceProbeEnd, func );
-}
-
-/**
- * @builtin CallbackSourceProbeProgress
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>boolean(integer value)</code>. If the handler returns false the refresh is aborted.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackSourceProbeProgress( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceProbeProgress, func );
-}
-
-/**
- * @builtin CallbackSourceProbeError
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>string(string url, string error, string reason)</code>. The callback function is evaluated when an error occurrs. The callback function must return string "ABORT" or "RETRY".
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackSourceProbeError( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceProbeError, func );
-}
-
-
-YCPValue PkgModuleFunctions::CallbackSourceReportInit( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceReportInit, func );
-}
-
-YCPValue PkgModuleFunctions::CallbackSourceReportDestroy( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceReportDestroy, func );
-}
-
-YCPValue PkgModuleFunctions::CallbackSourceCreateInit( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceCreateInit, func );
-}
-
-YCPValue PkgModuleFunctions::CallbackSourceCreateDestroy( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceCreateDestroy, func );
-}
-
-/**
- * @builtin CallbackSourceProbeStart
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(integer source_id, string url, string task)</code>.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackSourceReportStart( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceReportStart, func );
-}
-
-/**
- * @builtin CallbackSourceReportProgress
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>boolean(integer value)</code>. If the handler returns false the task is aborted.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackSourceReportProgress( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceReportProgress, func );
-}
-
-/**
- * @builtin CallbackSourceReportError
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>string(integer numeric_id, string url, string error, string reason)</code>. Parameter error is "NO_ERROR", "NOT_FOUND", "IO" or "INVALID". The callback function is evaluated when an error occurrs. The callback function must return string "ABORT", "IGNORE" or "RETRY".
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackSourceReportError( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceReportError, func );
-}
-
-/**
- * @builtin CallbackSourceReportEnd
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(integer numeric_id, string url, string error, string reason)</code>. Parameter error is "NO_ERROR", "NOT_FOUND", "IO" or "INVALID". The callback function is evaluated when an error occurrs. The callback function must return string "ABORT", "IGNORE" or "RETRY".
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackSourceReportEnd( const YCPString& func)
-{
- return SET_YCP_CB( CB_SourceReportEnd, func );
-}
-
-
-YCPValue PkgModuleFunctions::CallbackStartDownload( const YCPString& args ) {
- return SET_YCP_CB( CB_StartDownload, args );
-}
-YCPValue PkgModuleFunctions::CallbackProgressDownload( const YCPString& args ) {
- return SET_YCP_CB( CB_ProgressDownload, args );
-}
-YCPValue PkgModuleFunctions::CallbackDoneDownload( const YCPString& args ) {
- return SET_YCP_CB( CB_DoneDownload, args );
-}
-
-
-/**
- * @builtin CallbackScriptStart
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(string patch_name, string patch_version, string patch_arch, string script_path, boolean installation)</code>. Parameter 'installation' is true when the script is called during installation of a patch, false means patch removal. The callback function is evaluated when a script (which is part of a patch) has been started.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackScriptStart( const YCPString& args ) {
- return SET_YCP_CB( CB_ScriptStart, args );
-}
-/**
- * @builtin CallbackScriptProgress
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(boolean ping, string output)</code>. If parameter 'ping' is true than there is no output available, but the script is still running (This functionality enables aborting the script). If it is false, 'output' contains (part of) the script output. The callback function is evaluated when a script is running.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackScriptProgress( const YCPString& args ) {
- return SET_YCP_CB( CB_ScriptProgress, args );
-}
-/**
- * @builtin CallbackScriptProblem
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(string description)</code>. The callback function is evaluated when an error occurrs.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackScriptProblem( const YCPString& args ) {
- return SET_YCP_CB( CB_ScriptProblem, args );
-}
-/**
- * @builtin CallbackScriptFinish
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void()</code>. The callback function is evaluated when the script has been finished.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackScriptFinish( const YCPString& args ) {
- return SET_YCP_CB( CB_ScriptFinish, args );
-}
-/**
- * @builtin CallbackMessage
- * @short Register callback function
- * @param string func Name of the callback handler function. Required callback prototype is <code>void(string patch_name, string patch_version, string patch_arch, string message)</code>. The callback function is evaluated when a message which is part of a patch should be displayed.
- * @return void
- */
-YCPValue PkgModuleFunctions::CallbackMessage( const YCPString& args ) {
- return SET_YCP_CB( CB_Message, args );
-}
-
-YCPValue PkgModuleFunctions::CallbackStartSourceRefresh( const YCPString& args ) {
- y2warning("Pkg::CallbackStartSourceRefresh is obsoleted, do not use it (empty implementation)!");
- return YCPVoid();
-}
-YCPValue PkgModuleFunctions::CallbackProgressSourceRefresh( const YCPString& args ) {
- y2warning("Pkg::CallbackProgressSourceRefresh is obsoleted, do not use it (empty implementation)!");
- return YCPVoid();
-}
-YCPValue PkgModuleFunctions::CallbackErrorSourceRefresh( const YCPString& args ) {
- y2warning("Pkg::CallbackErrorSourceRefresh is obsoleted, do not use it (empty implementation)!");
- return YCPVoid();
-}
-YCPValue PkgModuleFunctions::CallbackDoneSourceRefresh( const YCPString& args ) {
- y2warning("Pkg::CallbackDoneSourceRefresh is obsoleted, do not use it (empty implementation)!");
- return YCPVoid();
-}
-
-#undef SET_YCP_CB
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Callbacks.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Callbacks.h (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Callbacks.h Wed May 11 11:22:32 2011
@@ -87,7 +87,7 @@
* Constructor. Setup handler and redirect Y2PMCallbacks
* to the ZyppReceiver.
**/
- CallbackHandler();
+ CallbackHandler(PkgModuleFunctions &);
/**
* Destructor. Reset Y2PMCallbacks to it's defaults.
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/GPGMap.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/GPGMap.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/GPGMap.cc Wed May 11 11:22:32 2011
@@ -0,0 +1,63 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2008 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id$
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: Class for converting zypp::PublicKey to YCPMap
+*/
+
+#include "GPGMap.h"
+#include "i18n.h"
+
+#include <ycp/YCPString.h>
+#include <ycp/YCPInteger.h>
+#include <ycp/YCPBoolean.h>
+
+#include <zypp/Date.h>
+#include <zypp/PublicKey.h>
+
+/*
+ Textdomain "pkg-bindings"
+*/
+
+GPGMap::GPGMap(const zypp::PublicKey &key)
+{
+ gpg_map->add(YCPString("id"), YCPString(key.id()));
+ gpg_map->add(YCPString("name"), YCPString(key.name()));
+ gpg_map->add(YCPString("fingerprint"), YCPString(key.fingerprint()));
+ gpg_map->add(YCPString("path"), YCPString(key.path().asString()));
+
+ zypp::Date date(key.created());
+ // %x = date only, see man strftime
+ gpg_map->add(YCPString("created"), YCPString(date.form("%x")));
+ gpg_map->add(YCPString("created_raw"), YCPInteger(zypp::Date::ValueType(date)));
+
+ date = key.expires();
+ std::string expires((date == 0) ? _("Never") : date.form("%x"));
+ gpg_map->add(YCPString("expires"), YCPString(expires));
+ gpg_map->add(YCPString("expires_raw"), YCPInteger(zypp::Date::ValueType(date)));
+}
+
+void GPGMap::setTrusted(bool trusted)
+{
+ // is the key trusted?
+ gpg_map->add(YCPString("trusted"), YCPBoolean(trusted));
+}
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/GPGMap.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/GPGMap.h (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/GPGMap.h Wed May 11 11:22:32 2011
@@ -0,0 +1,51 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2008 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id$
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: Class for converting zypp::PublicKey to YCPMap
+*/
+
+namespace zypp
+{
+ class PublicKey;
+}
+
+#include <ycp/YCPMap.h>
+
+class GPGMap
+{
+ public:
+
+ GPGMap(const zypp::PublicKey &key);
+
+ void setTrusted(bool trusted);
+
+ YCPMap getMap() const
+ {
+ return gpg_map;
+ }
+
+ private:
+
+ YCPMap gpg_map;
+};
+
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/HelpTexts.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/HelpTexts.h (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/HelpTexts.h Wed May 11 11:22:32 2011
@@ -0,0 +1,58 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2007 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id$
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: Help texts for callbacks
+*/
+
+/*
+ Textdomain "pkg-bindings"
+*/
+
+#include <i18n.h>
+
+namespace HelpTexts
+{
+ // help text
+ static const char *load_resolvables = _("<P><BIG><B>Loading Available Packages</B></BIG></P>"
+"<P>Loading available objects from the configured repositories is in progress. This "
+"may take a while...</P>");
+
+
+ // help text
+ static const char *load_target = _("<P><BIG><B>Loading Installed Packages</B></BIG></P>"
+"<P>The package manager is reading installed packages...</P>");
+
+
+ // help text
+ static const char *create_help = _("<P><BIG><B>Registering a New Repository</B></BIG></P>"
+"<P>A new repository is being registered. The package manager is reading "
+"the list of available packages in the repository...</P>");
+
+
+ static const char *save_help = _("<P><BIG><B>Saving Repositories</B></BIG></P>"
+"<P>The package manager is updating configured repositories...</P>");
+
+ static const char *refresh_help = _("<P><BIG><B>Refreshing the Repository</B></BIG></P>"
+"<P>The package manager is updating the repository content...</P>");
+}
+
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am Wed May 11 11:22:32 2011
@@ -17,6 +17,7 @@
plugin_LTLIBRARIES = libpy2Pkg.la
libpy2Pkg_la_SOURCES = \
+ GPGMap.h GPGMap.cc \
PkgError.cc PkgError.h \
Y2PkgComponent.cc Y2PkgComponent.h \
Y2CCPkg.cc Y2CCPkg.h \
@@ -27,6 +28,7 @@
Utils.h Utils.cc \
ServiceManager.cc ServiceManager.h \
PkgService.cc PkgService.h \
+ Network.cc Network.h \
PkgModuleFunctions.h \
PkgModuleFunctions.cc \
Package.cc \
@@ -34,7 +36,16 @@
Resolvable.cc \
Selection.cc \
Target.cc \
- Source.cc \
+ Source_Callbacks.cc \
+ Source_Create.cc \
+ Source_Download.cc \
+ Source_Get.cc \
+ Source_Installation.cc \
+ Source_Load.cc \
+ Source_Misc.cc \
+ Source_Resolvables.cc \
+ Source_Save.cc \
+ Source_Set.cc \
Keyring.cc \
Callbacks.h \
Callbacks.YCP.h \
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Network.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Network.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Network.cc Wed May 11 11:22:32 2011
@@ -0,0 +1,62 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2008 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id: Source_Load.cc 49526 2008-07-30 13:28:18Z mvidner $
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: Network related functions
+ Namespace: Pkg
+*/
+
+#include "log.h"
+
+// system()
+#include <cstdlib>
+
+#include "Network.h"
+
+/*
+ Textdomain "pkg-bindings"
+*/
+
+/*
+ A helper function
+ Detect whether there is a network connection.
+ See isNetworkRunning() function in NetworkService.ycp
+*/
+bool NetworkDetected()
+{
+ y2milestone("Checking the network status...");
+ // check IPv4 network
+ int result = ::system("ip addr|grep -v '127.0.0\\|inet6'|grep -q inet &> /dev/null");
+ y2milestone("Network is running: %s", (result == 0) ? "yes" : "no");
+
+ return !result;
+}
+
+/*
+ A helper function
+ Is the URL remote?
+*/
+bool remoteRepo(const zypp::Url &url)
+{
+ // is it a remote repository?
+ return url.schemeIsRemote();
+}
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Network.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Network.h (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Network.h Wed May 11 11:22:32 2011
@@ -0,0 +1,11 @@
+
+#ifndef PKGBINDINGS_NETWORK_H
+#define PKGBINDINGS_NETWORK_H
+
+#include <zypp/Url.h>
+
+bool NetworkDetected();
+
+bool remoteRepo(const zypp::Url &url);
+
+#endif
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Package.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Package.cc (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Package.cc Wed May 11 11:22:32 2011
@@ -763,19 +763,6 @@
return YCPVoid();
}
-PkgModuleFunctions::RepoId PkgModuleFunctions::logFindAlias(const std::string &alias) const
-{
- RepoId index = 0LL;
-
- for(RepoCont::const_iterator it = repos.begin(); it != repos.end() ; ++it, ++index)
- {
- if (!(*it)->isDeleted() && (*it)->repoInfo().alias() == alias)
- return index;
- }
-
- return -1LL;
-}
-
YCPValue
PkgModuleFunctions::PkgProp(const zypp::PoolItem &item)
{
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.cc (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.cc Wed May 11 11:22:32 2011
@@ -174,11 +174,12 @@
PkgModuleFunctions::PkgModuleFunctions ()
: Y2Namespace()
, _target_root( "/" )
+ , _target_loaded(false)
, zypp_pointer(NULL)
+ , autorefresh_skipped(false)
, last_reported_repo(-1)
, last_reported_mediumnr(-1)
- ,_callbackHandler( *new CallbackHandler( ) )
- , _target_loaded(false)
+ ,_callbackHandler( *new CallbackHandler(*this ) )
{
registerFunctions ();
@@ -312,19 +313,6 @@
}
/**
- * @builtin InstSysMode
- * @short obsoleted - do not use
- * @return void
- */
-YCPValue
-PkgModuleFunctions::InstSysMode ()
-{
- y2warning("Pkg::InstSysMode() is obsoleted, it's not needed anymore");
- return YCPVoid();
-}
-
-
-/**
* @short Set Package Manager Locale
* @description
* Set the given locale as the output locale -- all messages from the package manager (errors, warnings,...)
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.h (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.h Wed May 11 11:22:32 2011
@@ -40,6 +40,7 @@
#include <zypp/ZYpp.h>
#include <zypp/Pathname.h>
+#include <zypp/TmpPath.h>
#include <zypp/Url.h>
#include <zypp/Arch.h>
#include <zypp/RepoManager.h>
@@ -49,6 +50,8 @@
#include "Utils.h"
#include "ServiceManager.h"
+class PkgProgress;
+
// textdomain
extern "C" {
#include <libintl.h>
@@ -77,19 +80,8 @@
protected:
- // container for the internal structure
- typedef std::vector<YRepo_Ptr> RepoCont;
-
- zypp::RepoManager CreateRepoManager();
- ServiceManager service_manager;
-
- public:
- typedef RepoCont::size_type RepoId;
- protected:
-
zypp::Pathname _target_root;
-
- std::set<std::string> _broken_sources;
+ bool _target_loaded;
zypp::ZYpp::Ptr zypp_pointer;
@@ -99,35 +91,69 @@
// add the main locale to the additional ones
zypp::Locale preferred_locale;
+ zypp::Pathname _download_area;
+
/**
* ZYPP
*/
zypp::ZYpp::Ptr zypp_ptr();
- private: // source related
- YCPValue CommitHelper(const zypp::ZYppCommitPolicy &policy);
+ // container for the internal structure
+ typedef std::vector<YRepo_Ptr> RepoCont;
- zypp::Product::constPtr base_product;
- RepoId last_reported_repo;
- int last_reported_mediumnr;
+ YCPValue CommitHelper(const zypp::ZYppCommitPolicy &policy);
- bool CreateBaseProductSymlink();
+ public:
+
+ // ID type
+ typedef RepoCont::size_type RepoId;
+
+ private: // source related
- // all known installation sources
+ // all known installation sources
RepoCont repos;
- // helper
- YCPValue PkgMediaSizesOrCount (bool sizes, bool download_size=false);
+ // table for converting libzypp source type to Yast type (for backward compatibility)
+ std::map<std::string, std::string> type_conversion_table;
+
+ // flag for skipping autorefresh
+ volatile bool autorefresh_skipped;
+
+ RepoId last_reported_repo;
+ int last_reported_mediumnr;
+
+ YCPValue SourceRefreshHelper(const YCPInteger &id, bool forced = false);
+
+ // helper - is the network running?
+ bool NetworkDetected();
+
+ // is the URL remote?
+ bool remoteRepo(const zypp::Url &url);
+
+ // conversion methods for type string between Yast and libzypp (for backward compatibility)
+ std::string zypp2yastType(const std::string &type);
+ std::string yast2zyppType(const std::string &type);
+
+ // helper - create a directory if it doesn't exist
+ bool CreateDir(const std::string &path);
+ // helper - copy a file or directory
+ bool CopyToDir(const std::string &source, const std::string &target, bool backup = false, bool recursive = true);
+
+ void RemoveResolvablesFrom(YRepo_Ptr repo);
+ bool LoadResolvablesFrom(YRepo_Ptr repo, const zypp::ProgressData::ReceiverFnc & progressrcv = zypp::ProgressData::ReceiverFnc(), bool network_check = false);
+ std::string UniqueAlias(const std::string &alias);
- bool DoProvideNameKind( const std::string & name, zypp::Resolvable::Kind kind, zypp::Arch architecture,
- const std::string& version, const bool onlyNeeded = false);
- bool DoRemoveNameKind( const std::string & name, zypp::Resolvable::Kind kind);
- bool DoProvideAllKind(zypp::Resolvable::Kind kind);
- bool DoRemoveAllKind(zypp::Resolvable::Kind kind);
- bool DoAllKind(zypp::Resolvable::Kind kind, bool provide);
YCPValue GetPkgLocation(const YCPString& p, bool full_path);
- YCPValue PkgProp( const zypp::PoolItem &item );
+ YCPValue PkgProp(const zypp::PoolItem &item);
+ YCPValue PkgMediaSizesOrCount (bool sizes, bool download_size = false);
+ YCPValue TargetInitInternal(const YCPString& root, bool rebuild_rpmdb);
+
+ bool aliasExists(const std::string &alias, const std::list<zypp::RepoInfo> &reps) const;
+
+ zypp::Product::constPtr FindBaseProduct(const std::string &alias) const;
+
+ zypp::RepoManager CreateRepoManager();
void SetCurrentDU();
@@ -141,11 +167,43 @@
void CallSourceReportInit();
void CallSourceReportDestroy();
+ void CallInitDownload(const std::string &task);
+ void CallDestDownload();
+ void RefreshWithCallbacks(const zypp::RepoInfo &repo,
+ const zypp::ProgressData::ReceiverFnc & progressrcv = zypp::ProgressData::ReceiverFnc(),
+ zypp::RepoManager::RawMetadataRefreshPolicy refresh = zypp::RepoManager::RefreshIfNeeded);
+ zypp::repo::RepoType ProbeWithCallbacks(const zypp::Url &url);
+ void ScanProductsWithCallBacks(const zypp::Url &url);
+ void CallRefreshStarted();
+ void CallRefreshDone();
+ YCPValue SourceProvideDirectoryInternal(const YCPInteger& id, const YCPInteger& mid,
+ const YCPString& d, const YCPBoolean &optional,
+ const YCPBoolean &recursive, bool check_signatures);
+
+ YCPValue SourceLoadImpl(PkgProgress &progress);
+ YCPValue SourceStartManagerImpl(const YCPBoolean& enable, PkgProgress &progress);
+
// After all, APPL_HIGH might be more appropriate, because we suggest
// the user what he should do and if it does not work, it's his job to
// fix it (using USER). --ma
static const zypp::ResStatus::TransactByValue whoWantsIt; // #156875
+ // convert MountPointSet to YCP Map
+ YCPMap MPS2YCPMap(const zypp::DiskUsageCounter::MountPointSet &mps);
+
+ YCPMap PoolQuery2YCPMap(const zypp::PoolQuery &pool_query);
+
+ zypp::Url shortenUrl(const zypp::Url &url);
+
+ // convert Exception to string represenatation
+ std::string ExceptionAsString(const zypp::Exception &e);
+
+ YCPValue searchPackage(const YCPString &package, bool installed);
+
+ bool CreateBaseProductSymlink();
+
+ YCPMap Resolvable2YCPMap(const zypp::PoolItem &item, const std::string &req_kind, bool dependencies);
+
private:
/**
@@ -154,28 +212,29 @@
**/
CallbackHandler & _callbackHandler;
- bool _target_loaded;
-
PkgError _last_error;
- /**
- * Logging helper:
- * search for a repository and in case of exception, log error
- * and setLastError AND RETHROW
- */
- YRepo_Ptr logFindRepository(RepoId id);
+ ServiceManager service_manager;
- RepoId logFindAlias(const std::string &alias) const;
+ zypp::Product::constPtr base_product;
+
+ std::vector<zypp::filesystem::TmpDir> tmp_dirs;
- YCPMap Resolvable2YCPMap(const zypp::PoolItem &item, const std::string &req_kind, bool dependencies);
+ RepoId createManagedSource(const zypp::Url & url_r,
+ const zypp::Pathname & path_r, const std::string& type,
+ const std::string &alias_r, PkgProgress &progress, const zypp::ProgressData::ReceiverFnc & progressrcv = zypp::ProgressData::ReceiverFnc());
+
+ /**
+ * provides SourceProvideFile and SourceProvideFileCommon
+ */
+ YCPValue SourceProvideFileCommon(const YCPInteger &id, const YCPInteger &mid,
+ const YCPString& f, const bool optional, const bool check_signatures,
+ const bool digested);
+
+ // Compat helpers
+ YCPValue SourceCreateExCode11(const YCPString& media, const YCPString& pd, bool base, const YCPString& source_type, bool scan_only);
+ YCPValue SourceProvideDirectory(const YCPInteger& id, const YCPInteger& mid, const YCPString& d, const YCPBoolean &optional, const YCPBoolean &recursive);
- YCPValue SourceProvideDirectoryInternal(const YCPInteger& id, const YCPInteger& mid, const YCPString& d, const YCPBoolean &optional, const YCPBoolean &recursive, bool check_signatures);
- YCPValue SourceProvideFileCommon(const YCPInteger &id,
- const YCPInteger &mid,
- const YCPString& f,
- const bool optional,
- const bool check_signatures,
- const bool digested);
public:
// general
@@ -648,6 +707,19 @@
YCPValue ResolvablePropertiesEx(const YCPString& name, const YCPSymbol& kind_r, const YCPString& version, bool dependencies);
YCPValue ResolvableSetPatches(const YCPSymbol& kind_r, bool preselect);
+ /**
+ * Logging helper:
+ * search for a repository and in case of exception, log error
+ * and setLastError AND RETHROW
+ */
+ YRepo_Ptr logFindRepository(RepoId id);
+ RepoId logFindAlias(const std::string &alias) const;
+
+ RepoId LastReportedRepo() const;
+ int LastReportedMedium() const;
+ void SetReportedSource(RepoId repo, int medium);
+
+
/**
* Constructor.
*/
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgProgress.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgProgress.cc (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgProgress.cc Wed May 11 11:22:32 2011
@@ -23,3 +23,5 @@
{
}
+
+
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgProgress.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgProgress.h (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgProgress.h Wed May 11 11:22:32 2011
@@ -31,7 +31,17 @@
void Done();
+ const zypp::ProgressData::ReceiverFnc & Receiver()
+ {
+ return progress_handler;
+ }
+
+
~PkgProgress();
+
+ private:
+ zypp::ProgressData::ReceiverFnc progress_handler;
+
};
#endif
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Callbacks.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Callbacks.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Callbacks.cc Wed May 11 11:22:32 2011
@@ -0,0 +1,190 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2007 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id: Source_Callbacks.cc 49913 2008-08-11 08:56:03Z lslezak $
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: Callbacks functions related to repository registration
+ Namespace: Pkg
+*/
+
+#include <Callbacks.h>
+#include <Callbacks.YCP.h>
+
+#include <PkgModuleFunctions.h>
+
+/*
+ Textdomain "pkg-bindings"
+*/
+
+void PkgModuleFunctions::CallSourceReportStart(const std::string &text)
+{
+ // get the YCP callback handler
+ Y2Function* ycp_handler = _callbackHandler._ycpCallbacks.createCallback(CallbackHandler::YCPCallbacks::CB_SourceReportStart);
+
+ // is the callback registered?
+ if (ycp_handler != NULL)
+ {
+ // add parameters
+ ycp_handler->appendParameter( YCPInteger(0LL) );
+ ycp_handler->appendParameter( YCPString("") );
+ ycp_handler->appendParameter( YCPString(text) );
+ // evaluate the callback function
+ ycp_handler->evaluateCall();
+ }
+}
+
+void PkgModuleFunctions::CallSourceReportEnd(const std::string &text)
+{
+ // get the YCP callback handler for end event
+ Y2Function* ycp_handler = _callbackHandler._ycpCallbacks.createCallback(CallbackHandler::YCPCallbacks::CB_SourceReportEnd);
+
+ // is the callback registered?
+ if (ycp_handler != NULL)
+ {
+ // add parameters
+ ycp_handler->appendParameter( YCPInteger(0LL) );
+ ycp_handler->appendParameter( YCPString("") );
+ ycp_handler->appendParameter( YCPString(text) );
+ ycp_handler->appendParameter( YCPString("NO_ERROR") );
+ ycp_handler->appendParameter( YCPString("") );
+ // evaluate the callback function
+ ycp_handler->evaluateCall();
+ }
+}
+
+void PkgModuleFunctions::CallSourceReportInit()
+{
+ // get the YCP callback handler for init event
+ Y2Function* ycp_handler = _callbackHandler._ycpCallbacks.createCallback(CallbackHandler::YCPCallbacks::CB_SourceReportInit);
+
+ // is the callback registered?
+ if (ycp_handler != NULL)
+ {
+ // evaluate the callback function
+ ycp_handler->evaluateCall();
+ }
+}
+
+void PkgModuleFunctions::CallSourceReportDestroy()
+{
+ // get the YCP callback handler for destroy event
+ Y2Function* ycp_handler = _callbackHandler._ycpCallbacks.createCallback(CallbackHandler::YCPCallbacks::CB_SourceReportDestroy);
+
+ // is the callback registered?
+ if (ycp_handler != NULL)
+ {
+ // evaluate the callback function
+ ycp_handler->evaluateCall();
+ }
+}
+
+void PkgModuleFunctions::CallInitDownload(const std::string &task)
+{
+/*
+ // get the YCP callback handler for destroy event
+ Y2Function* ycp_handler = _callbackHandler._ycpCallbacks.createCallback(CallbackHandler::YCPCallbacks::CB_InitDownload);
+
+ // is the callback registered?
+ if (ycp_handler != NULL)
+ {
+ ycp_handler->appendParameter(YCPString(task));
+ // evaluate the callback function
+ ycp_handler->evaluateCall();
+ }
+/*
+}
+
+void PkgModuleFunctions::CallDestDownload()
+{
+/*
+ // get the YCP callback handler for destroy event
+ Y2Function* ycp_handler = _callbackHandler._ycpCallbacks.createCallback(CallbackHandler::YCPCallbacks::CB_DestDownload);
+
+ // is the callback registered?
+ if (ycp_handler != NULL)
+ {
+ // evaluate the callback function
+ ycp_handler->evaluateCall();
+ }
+*/
+}
+
+// this method should be used instead of RepoManager::refreshMetadata()
+void PkgModuleFunctions::RefreshWithCallbacks(const zypp::RepoInfo &repo, const zypp::ProgressData::ReceiverFnc &progressrcv, zypp::RepoManager::RawMetadataRefreshPolicy refresh)
+{
+ CallInitDownload(std::string(_("Refreshing repository ") + repo.alias()));
+
+ try
+ {
+ zypp::RepoManager repomanager = CreateRepoManager();
+ repomanager.refreshMetadata(repo, refresh, progressrcv);
+ }
+ catch(...)
+ {
+ // call the final event even in case of exception
+ CallDestDownload();
+ // rethrow the execption
+ throw;
+ }
+
+ CallDestDownload();
+}
+
+// this method should be used instead of RepoManager::probe()
+zypp::repo::RepoType PkgModuleFunctions::ProbeWithCallbacks(const zypp::Url &url)
+{
+ CallInitDownload(std::string(_("Probing repository ") + url.asString()));
+
+ zypp::repo::RepoType repotype;
+
+ extern ZyppRecipients::MediaChangeSensitivity _silent_probing;
+ // remember the current value
+ ZyppRecipients::MediaChangeSensitivity _silent_probing_old = _silent_probing;
+
+ // disable media change callback for optional file
+ _silent_probing = ZyppRecipients::MEDIA_CHANGE_DISABLE;
+
+ try
+ {
+ // probe type of the repository
+ zypp::RepoManager repomanager = CreateRepoManager();
+ repotype = repomanager.probe(url);
+ }
+ catch(...)
+ {
+ // call the final event even in case of exception
+ CallDestDownload();
+
+ // restore the probing flag
+ _silent_probing = _silent_probing_old;
+
+ // rethrow the execption
+ throw;
+ }
+
+ CallDestDownload();
+
+ // restore the probing flag
+ _silent_probing = _silent_probing_old;
+
+ return repotype;
+}
+
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Create.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Create.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Create.cc Wed May 11 11:22:32 2011
@@ -0,0 +1,656 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2007 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id: Source_Create.cc 63716 2011-04-05 11:33:32Z lslezak $
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: Functions related to repository registration
+ Namespace: Pkg
+*/
+
+#include <Callbacks.h>
+#include <Callbacks.YCP.h>
+
+#include <PkgModuleFunctions.h>
+#include <PkgProgress.h>
+#include "log.h"
+
+#include <HelpTexts.h>
+
+#include <zypp/MediaProducts.h>
+#include <zypp/media/Mount.h>
+
+/*
+ Textdomain "pkg-bindings"
+*/
+
+// scanned available products
+// hack: zypp/MediaProducts.h cannot be included in PkgModuleFunctions.h
+zypp::MediaProductSet available_products;
+
+// this method should be used instead of zypp::productsInMedia()
+// it initializes the download callbacks
+void PkgModuleFunctions::ScanProductsWithCallBacks(const zypp::Url &url)
+{
+ CallInitDownload(std::string(_("Scanning products in ") + url.asString()));
+
+ extern ZyppRecipients::MediaChangeSensitivity _silent_probing;
+ // remember the current value
+ ZyppRecipients::MediaChangeSensitivity _silent_probing_old = _silent_probing;
+
+ // disable media change callback for optional file
+ _silent_probing = ZyppRecipients::MEDIA_CHANGE_DISABLE;
+
+ y2milestone("Scanning products in %s ...", url.asString().c_str());
+
+ try
+ {
+ available_products.clear();
+ zypp::productsInMedia(url, available_products);
+ }
+ catch(...)
+ {
+ // call the final event even in case of exception
+ CallDestDownload();
+
+ // restore the probing flag
+ _silent_probing = _silent_probing_old;
+
+ // rethrow the execption
+ throw;
+ }
+
+ CallDestDownload();
+
+ // restore the probing flag
+ _silent_probing = _silent_probing_old;
+}
+
+static std::string timestamp ()
+{
+ time_t t = time(NULL);
+ struct tm * tmp = localtime(&t);
+
+ if (tmp == NULL) {
+ return "";
+ }
+
+ char outstr[50];
+ if (strftime(outstr, sizeof(outstr), "%Y%m%d-%H%M%S", tmp) == 0) {
+ return "";
+ }
+ return outstr;
+}
+
+/**
+ * Take the ?alias=foo part of old_url, if any, and return it,
+ * putting the rest to new_url.
+ * \throws Exception on malformed URLs I guess
+ */
+static std::string removeAlias (const zypp::Url & old_url,
+ zypp::Url & new_url)
+{
+ std::string alias;
+ new_url = old_url;
+ zypp::url::ParamMap query = new_url.getQueryStringMap ();
+ zypp::url::ParamMap::iterator alias_it = query.find ("alias");
+ if (alias_it != query.end ())
+ {
+ alias = alias_it->second;
+ query.erase (alias_it);
+ new_url.setQueryStringMap (query);
+ }
+ return alias;
+}
+
+
+/**
+ * helper - add "mountoptions=ro" for mountable URL schemes if "mountoptions" option is not empty and
+ * "rw" or "ro" option is missing
+ */
+zypp::Url addRO(const zypp::Url &url)
+{
+ zypp::Url ret(url);
+ std::string scheme = zypp::str::toLower(url.getScheme());
+
+ if (scheme == "nfs"
+ || scheme == "hd"
+ || scheme == "smb"
+ || scheme == "iso"
+ || scheme == "cd"
+ || scheme == "dvd"
+ )
+ {
+ const std::string mountoptions = "mountoptions";
+ zypp::media::Mount::Options options(url.getQueryParam(mountoptions));
+
+ y2debug("Current mountoptions: %s", options.asString().c_str());
+
+ // if mountoptions are empty lizypp uses "ro" by default
+ // don't override "rw" option from application
+ // don't add "ro" if it's already present
+ if (!options.empty() && !options.has("rw") && !options.has("ro"))
+ {
+ options["ro"];
+
+ ret.setQueryParam(mountoptions, options.asString());
+ y2milestone("Adding read only mount option: '%s' -> '%s'", url.asString().c_str(), ret.asString().c_str());
+ }
+ }
+
+ return ret;
+}
+
+/** Create a Source and immediately put it into the SourceManager.
+ * \return the SourceId
+ * \throws Exception if Source creation fails
+*/
+PkgModuleFunctions::RepoId
+PkgModuleFunctions::createManagedSource( const zypp::Url & url_r,
+ const zypp::Pathname & path_r,
+ const std::string& type,
+ const std::string &alias_r,
+ PkgProgress &progress,
+ const zypp::ProgressData::ReceiverFnc & progressrcv)
+{
+ // parse URL
+ y2milestone ("Original URL: %s, product directory: %s", url_r.asString().c_str(), path_r.asString().c_str());
+
+ // #158850#c17, if the URL contains an alias, we use that
+ zypp::Url url;
+
+ std::string alias = removeAlias(url_r, url);
+ y2milestone("Alias from URL: '%s'", alias.c_str());
+
+ // repository type
+ zypp::repo::RepoType repotype;
+ zypp::RepoManager repomanager = CreateRepoManager();
+
+ const bool do_probing = type.empty();
+
+ if (!do_probing)
+ {
+ try
+ {
+ // do conversion from the Yast type ("YaST", "YUM", "Plaindir")
+ // to libzypp type ("yast", "yum", "plaindir")
+ repotype = repotype.parse(yast2zyppType(type));
+ }
+ catch (zypp::repo::RepoUnknownTypeException &e)
+ {
+ y2warning("Unknown source type '%s'", type.c_str());
+ }
+ }
+
+ // the type is not specified or is wrong, autoprobe the type
+ if (repotype == zypp::repo::RepoType::NONE)
+ {
+ zypp::Url probe_url(url_r);
+
+ if (!path_r.asString().empty())
+ {
+ zypp::Pathname pth(probe_url.getPathName());
+ pth /= path_r;
+
+ probe_url.setPathName(pth.asString());
+ }
+
+ y2milestone("Probing source type: '%s'", probe_url.asString().c_str());
+
+ // autoprobe type of the repository
+ repotype = ProbeWithCallbacks(probe_url);
+
+ if (do_probing)
+ {
+ progress.NextStage();
+ }
+ }
+
+ y2milestone("Using source type: %s", repotype.asString().c_str());
+
+
+ // create source definition object
+ zypp::RepoInfo repo;
+
+ std::string name;
+
+ // set alias and name
+ if (alias.empty())
+ {
+ // alias not set via URL, use the passed alias or the URL path
+ if (alias_r.empty())
+ {
+ alias = zypp::RepoManager::makeStupidAlias(url);
+
+ y2milestone("Using alias: %s", alias.c_str());
+ }
+ else
+ {
+ alias = alias_r;
+ }
+
+ name = alias;
+ }
+ else
+ {
+ name = alias;
+ }
+
+
+ y2milestone("Name of the repository: '%s'", name.c_str());
+
+ // alias must be unique, add a suffix if it's already used
+ alias = UniqueAlias(alias);
+
+ // add read only mount option to the URL if needed
+ url = addRO(url);
+
+ bool autorefresh = true;
+
+ std::string scheme = zypp::str::toLower(url.getScheme());
+ if (scheme == "cd" || scheme == "dvd")
+ {
+ y2milestone("Disabling autorefresh for CD/DVD repository");
+ autorefresh = false;
+ }
+
+ repo.setAlias(alias);
+ repo.setName(name);
+ repo.setType(repotype);
+ repo.addBaseUrl(url);
+ // do not keep dowloaded packages by default
+ repo.setKeepPackages(false);
+ repo.setPath(path_r);
+ repo.setEnabled(true);
+ repo.setAutorefresh(autorefresh);
+
+{
+ zypp::ProgressData prg(90);
+ prg.sendTo(progressrcv);
+ prg.toMin();
+
+ zypp::CombinedProgressData subprogrcv_ref(prg, 20);
+ zypp::CombinedProgressData subprogrcv_build(prg, 70);
+
+ // set metadata path (#293428)
+ zypp::Pathname metadatapath = repomanager.metadataPath(repo);
+ repo.setMetadataPath(metadatapath);
+ // set packages path
+ repo.setPackagesPath(repomanager.packagesPath(repo));
+
+ y2milestone("Adding source '%s' (%s, dir: %s)", repo.alias().c_str(), url.asString().c_str(), path_r.asString().c_str());
+ // note: exceptions should be caught by the calling code
+ RefreshWithCallbacks(repo, subprogrcv_ref);
+ progress.NextStage();
+
+ // remove the cache
+ if (repomanager.isCached(repo))
+ {
+ y2milestone("Removing cache for repository '%s'...", repo.alias().c_str());
+ repomanager.cleanCache(repo);
+ }
+
+ y2milestone("Caching repository '%s'...", repo.alias().c_str());
+ repomanager.buildCache(repo, zypp::RepoManager::BuildIfNeeded, subprogrcv_build);
+
+ progress.NextStage();
+
+ prg.toMax();
+}
+ repos.push_back(new YRepo(repo));
+
+ y2milestone("Added source '%s': '%s', enabled: %s, autorefresh: %s",
+ repo.alias().c_str(),
+ repo.baseUrlsBegin()->asString().c_str(),
+ repo.enabled() ? "true" : "false",
+ repo.autorefresh() ? "true" : "false"
+ );
+
+ // the source is at the end of the list
+ return repos.size() - 1;
+}
+
+/****************************************************************************************
+ * @builtin SourceCreate
+ *
+ * @short Create a Source
+ * @description
+ * Load and enable all InstSrces found at media_url, i.e. all sources mentioned in /media.1/products.
+ * If no /media.1/products is available, InstSrc is expected to be located directly below
+ * media_url (product_dir: /).
+ *
+ * If a product_dir is provided, only the InstSrc located at media_url/product_dir is loaded
+ * and enabled.
+ *
+ * @param string url The media to scan.
+ * @optarg string product_dir Restrict scan to a certain InstSrc located in media_url/product_dir.
+ *
+ * @return integer The source_id of the first InstSrc found on the media.
+ **/
+YCPValue
+PkgModuleFunctions::SourceCreate (const YCPString& media, const YCPString& pd)
+{
+ // not base product, autoprobe source type
+ return SourceCreateEx (media, pd, false, YCPString(""));
+}
+
+YCPValue
+PkgModuleFunctions::SourceCreateBase (const YCPString& media, const YCPString& pd)
+{
+ // base product, autoprobe source type
+ return SourceCreateEx (media, pd, true, YCPString(""));
+}
+
+/**
+ * @builtin SourceCreateType
+ * @short Create source of required type
+ * @description
+ * Create a source without autoprobing the source type. This builtin should be used only for "Plaindir" sources, because Plaindir sources are not automatically probed in SourceCreate() builtin.
+ * @param media URL of the source
+ * @param pd product directory (if empty the products will be searched)
+ * @param type type of the source ("YaST", "YUM" or "Plaindir")
+*/
+
+YCPValue
+PkgModuleFunctions::SourceCreateType (const YCPString& media, const YCPString& pd, const YCPString& type)
+{
+ // not base product, autoprobe source type
+ return SourceCreateEx (media, pd, false, type);
+}
+
+// Code10 API compatible
+YCPValue
+PkgModuleFunctions::SourceCreateEx (const YCPString& media, const YCPString& pd, bool base, const YCPString& source_type)
+{
+ return SourceCreateExCode11(media, pd, base, source_type, false);
+}
+
+YCPValue
+PkgModuleFunctions::SourceCreateExCode11(const YCPString& media, const YCPString& pd, bool base, const YCPString& source_type, bool scan_only)
+{
+ y2debug("Creating source...");
+
+ zypp::Pathname pn(pd->value ());
+
+ zypp::Url url;
+
+ try {
+ url = zypp::Url(media->value ());
+ }
+ catch(const zypp::Exception & expt )
+ {
+ y2error ("Invalid URL: %s", expt.asString().c_str());
+ _last_error.setLastError(ExceptionAsString(expt));
+ return YCPInteger (-1LL);
+ }
+
+ const std::string type = source_type->value();
+ const bool scan = pd->value().empty();
+
+ // steps: (scan), download, build cache, load resolvables
+ PkgProgress pkgprogress(_callbackHandler);
+ std::list<std::string> stages;
+
+ // display the scan stage only when needed
+ if (scan)
+ {
+ stages.push_back(_("Search Available Products"));
+ }
+
+ if (source_type->value().empty())
+ {
+ stages.push_back(_("Probe Source Type"));
+ }
+
+ stages.push_back(_("Download Descriptions"));
+ stages.push_back(_("Rebuild Cache"));
+
+ if (!scan_only)
+ {
+ stages.push_back(_("Load Data"));
+ }
+
+ pkgprogress.Start(_("Adding the Repository..."), stages, _(HelpTexts::create_help));
+
+ zypp::ProgressData prg(100);
+ prg.sendTo(pkgprogress.Receiver());
+ prg.toMin();
+
+ // remember the new ids for loading the resolvables
+ std::list<RepoId> new_repos;
+
+ if (scan) {
+ // scan all sources
+ zypp::MediaProductSet products;
+
+ try {
+ ScanProductsWithCallBacks(url);
+ products = available_products;
+ }
+ catch ( const zypp::Exception& excpt)
+ {
+ _last_error.setLastError(ExceptionAsString(excpt));
+ y2error( "Cannot read the product list from the media" );
+ return YCPInteger(-1LL);
+ }
+
+ if( products.empty() )
+ {
+ // no products found, use the base URL instead
+ zypp::MediaProductEntry entry ;
+ products.insert( entry );
+ }
+
+ // scanning has been finished
+ prg.set(5);
+ pkgprogress.NextStage();
+
+ // register the repositories
+ for( zypp::MediaProductSet::const_iterator it = products.begin();
+ it != products.end() ; ++it )
+ {
+ y2milestone("Using product %s in directory %s", it->_name.c_str(), it->_dir.c_str());
+ zypp::CombinedProgressData subprogrcv(prg, 85/products.size());
+
+ try
+ {
+ // don't use spaces in alias
+ std::string alias(it->_name);
+ zypp::str::replaceAll(alias, " ", "-");
+
+ RepoId id = createManagedSource(url, it->_dir, type, alias, pkgprogress, subprogrcv);
+
+ new_repos.push_back(id);
+ }
+ catch ( const zypp::Exception& excpt)
+ {
+ y2error("SourceCreate for '%s' product '%s' has failed"
+ , url.asString().c_str(), pn.asString().c_str());
+ _last_error.setLastError(ExceptionAsString(excpt));
+ return YCPInteger(-1LL);
+ }
+ }
+
+ if (!scan_only)
+ {
+ // load resolvables
+ for(std::list<RepoId>::const_iterator it = new_repos.begin();
+ it != new_repos.end() ; ++it )
+ {
+ zypp::CombinedProgressData subprogrcv2(prg, 10/products.size());
+
+ try
+ {
+ YRepo_Ptr repo = logFindRepository(*it);
+
+ // no detailed progress needed, refresh has been done in createManagedSource()
+ LoadResolvablesFrom(repo, subprogrcv2);
+
+ // search for a base product if it hasn't been set
+ if (base && !base_product)
+ {
+ y2milestone("Searching a base product...");
+ base_product = FindBaseProduct(repo->repoInfo().alias());
+ }
+ }
+ catch ( const zypp::Exception& excpt)
+ {
+ y2error("SourceCreate for '%s' product '%s' has failed"
+ , url.asString().c_str(), pn.asString().c_str());
+ _last_error.setLastError(ExceptionAsString(excpt));
+ return YCPInteger(-1LL);
+ }
+ }
+ }
+ } else {
+ y2debug("Creating source...");
+
+ zypp::CombinedProgressData subprogrcv_create(prg, 80);
+ zypp::CombinedProgressData subprogrcv_load(prg, 20);
+
+ try
+ {
+ RepoId new_id = createManagedSource(url, pn, type, "", pkgprogress, subprogrcv_create);
+ new_repos.push_back(new_id);
+
+ if (!scan_only)
+ {
+ pkgprogress.NextStage();
+
+ YRepo_Ptr repo = logFindRepository(new_id);
+
+ // load the resolvables
+ LoadResolvablesFrom(repo, subprogrcv_load);
+
+ if (base && !base_product)
+ {
+ y2milestone("Searching the base product...");
+ base_product = FindBaseProduct(repo->repoInfo().alias());
+ }
+ }
+ }
+ catch ( const zypp::Exception& excpt)
+ {
+ y2error("SourceCreate for '%s' product '%s' has failed"
+ , url.asString().c_str(), pn.asString().c_str());
+ _last_error.setLastError(ExceptionAsString(excpt));
+ return YCPInteger(-1LL);
+ }
+ }
+
+ prg.toMax();
+
+ if (!scan_only)
+ {
+ PkgFreshen();
+ return YCPInteger(*new_repos.begin());
+ }
+ else
+ {
+ YCPList ids;
+
+ // load resolvables
+ for(std::list<RepoId>::const_iterator it = new_repos.begin();
+ it != new_repos.end() ; ++it )
+ {
+ ids->add(YCPInteger(*it));
+ }
+
+ return ids;
+ }
+}
+
+/****************************************************************************************
+ * @builtin SourceScan
+ * @short Scan a Source Media
+ * @description
+ * Load all InstSrces found at media_url, i.e. all sources mentioned in /media.1/products.
+ * If no /media.1/products is available, InstSrc is expected to be located directly
+ * below media_url (product_dir: /).
+ *
+ * If a product_dir is provided, only the InstSrc located at media_url/product_dir is loaded.
+ *
+ * In contrary to @ref SourceCreate, InstSrces are loaded into the InstSrcManager,
+ * but not enabled (packages and selections are not provided to the PackageManager),
+ * and the SrcIds of <b>all</b> InstSrces found are returned.
+ *
+ * @param string url The media to scan.
+ * @optarg string product_dir Restrict scan to a certain InstSrc located in media_url/product_dir.
+ *
+ * @return list<integer> list of SrcIds (integer).
+ **/
+YCPValue
+PkgModuleFunctions::SourceScan (const YCPString& media, const YCPString& pd)
+{
+ // not base product, autoprobe source type, scanning only
+ return SourceCreateExCode11(media, pd, false, YCPString(""), true);
+}
+
+zypp::Product::constPtr PkgModuleFunctions::FindBaseProduct(const std::string &alias) const
+{
+ zypp::Product::constPtr product = NULL;
+
+ // access to the Pool of Selectables
+ zypp::ResPoolProxy selectablePool(zypp::ResPool::instance().proxy());
+
+ // iterate over zypp::Products
+ for_(it, selectablePool.byKindBegin<zypp::Product>(), selectablePool.byKindEnd<zypp::Product>())
+ {
+ // search an available product from the required repository
+ for_(avail_it, (*it)->availableBegin(), (*it)->availableEnd())
+ {
+ // get the resolvable
+ zypp::ResObject::constPtr res = *avail_it;
+
+ // check the repository
+ if (res && res->repoInfo().alias() == alias)
+ {
+ product = boost::dynamic_pointer_cast<const zypp::Product>(res);
+
+ if (product)
+ {
+ break;
+ }
+ }
+ }
+
+ if (product)
+ {
+ break;
+ }
+ }
+
+ // no product in the pool
+ if (!product)
+ {
+ y2error("No base product has been found");
+ }
+ else
+ {
+ y2milestone("Found base product: %s %s (%s-%s)",
+ product->summary().c_str(),
+ product->edition().asString().c_str(),
+ product->name().c_str(),
+ product->edition().asString().c_str()
+ );
+ }
+
+ return product;
+}
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Download.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Download.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Download.cc Wed May 11 11:22:32 2011
@@ -0,0 +1,377 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2007 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id: Source_Download.cc 54392 2009-01-06 11:43:32Z lslezak $
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: Functions for downloading files from a repository
+ Namespace: Pkg
+*/
+
+#include <Callbacks.h>
+#include <Callbacks.YCP.h>
+
+#include <PkgModuleFunctions.h>
+#include <PkgProgress.h>
+#include "log.h"
+
+#include <HelpTexts.h>
+
+#include <zypp/Fetcher.h>
+
+/*
+ Textdomain "pkg-bindings"
+*/
+
+YCPValue PkgModuleFunctions::SourceProvideFileCommon(const YCPInteger &id,
+ const YCPInteger &mid,
+ const YCPString& f,
+ const bool optional,
+ const bool check_signatures,
+ const bool digested)
+{
+ if (id.isNull() || mid.isNull() || f.isNull())
+ {
+ y2error("ProvideFile: nil argument!");
+ return YCPVoid();
+ }
+
+ CallInitDownload(std::string(_("Downloading ") + f->value()));
+
+ bool found = true;
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ found = false;
+
+ extern ZyppRecipients::MediaChangeSensitivity _silent_probing;
+ // remember the current value
+ ZyppRecipients::MediaChangeSensitivity _silent_probing_old = _silent_probing;
+
+ // disable media change callback for optional file
+ if (optional)
+ _silent_probing = ZyppRecipients::MEDIA_CHANGE_OPTIONALFILE;
+
+ y2milestone("Downloading %s%sfile %s from repository %lld, medium %lld",
+ (optional ? "optional " : ""),
+ (check_signatures ? (digested ? "digested " : "signed ") : ""),
+ f->value().c_str(),
+ id->value(),
+ mid->value()
+ );
+
+ zypp::filesystem::Pathname path; // FIXME use ManagedMedia
+ if (found)
+ {
+ try
+ {
+ if (check_signatures)
+ {
+ // use a Fetcher for downloading signed files (see bnc#409927)
+ zypp::Fetcher fch;
+ fch.reset();
+ fch.setOptions(zypp::Fetcher::AutoAddIndexes);
+
+ // path - add "/" to the beginning if it's missing there
+ std::string media_path(f->value());
+ if (media_path.size() >= 1 && media_path[0] != '/')
+ {
+ media_path = "/" + media_path;
+ }
+
+ zypp::OnMediaLocation mloc(media_path, mid->value());
+ // the file is never optional for zypp (it cannot tell whether an optional file failed)
+ mloc.setOptional(false);
+
+ // create the tmpdir in <_download_area>/var/tmp
+ zypp::filesystem::TmpDir tmpdir(_download_area / zypp::filesystem::TmpDir::defaultLocation());
+
+ // keep a reference to the tmpdir so the directory is not deleted at the and of the block
+ tmp_dirs.push_back(tmpdir);
+ path = tmpdir.path();
+
+ if (digested)
+ {
+ fch.enqueueDigested(mloc);
+ }
+ else
+ {
+ fch.addIndex(mloc);
+ }
+
+ fch.start(path, *repo->mediaAccess()); // uses MediaAccess to retrieve
+ fch.reset();
+ path /= f->value();
+ }
+ else
+ {
+ path = repo->mediaAccess()->provideFile(f->value(), mid->value());
+ y2milestone("local path: '%s'", path.asString().c_str());
+ }
+ }
+ catch (const zypp::Exception& excpt)
+ {
+ found = false;
+
+ if (!optional)
+ {
+ _last_error.setLastError(ExceptionAsString(excpt));
+ y2milestone("File not found: %s", f->value_cstr());
+ }
+ }
+ }
+
+ // set the original probing value
+ _silent_probing = _silent_probing_old;
+
+ CallDestDownload();
+
+ if (found)
+ {
+ return YCPString(path.asString());
+ }
+ else
+ {
+ return YCPVoid();
+ }
+}
+
+
+/****************************************************************************************
+ * @builtin SourceProvideFile
+ *
+ * @short Make a file available at the local filesystem
+ * @description
+ * Let an InstSrc provide some file (make it available at the local filesystem).
+ * Warning: The downloaded files are removed in Pkg::SourceReleaseAll()!
+ *
+ * @param integer SrcId Specifies the InstSrc .
+ * @param integer medianr Number of the media the file is located on ('1' for the 1st media).
+ * @param string file Filename relative to the media root.
+ *
+ * @return string local path as string
+ **/
+YCPValue
+PkgModuleFunctions::SourceProvideFile (const YCPInteger& id, const YCPInteger& mid, const YCPString& f)
+{
+ return SourceProvideFileCommon(id, mid, f, false /*optional*/, false /* signed */, true /* digested, doesn't matter in this case*/);
+}
+
+/****************************************************************************************
+ * @builtin SourceProvideOptionalFile
+ *
+ * @short Make an optional file available at the local filesystem
+ * @description
+ * Let an InstSrc provide some file (make it available at the local filesystem).
+ * If the file doesn't exist don't ask user for another medium and return nil
+ * Warning: The downloaded files are removed in Pkg::SourceReleaseAll()!
+ *
+ * @param integer SrcId Specifies the InstSrc .
+ * @param integer medianr Number of the media the file is located on ('1' for the 1st media).
+ * @param string file Filename relative to the media root.
+ *
+ * @return string local path as string
+ **/
+YCPValue
+PkgModuleFunctions::SourceProvideOptionalFile (const YCPInteger& id, const YCPInteger& mid, const YCPString& f)
+{
+ return SourceProvideFileCommon(id, mid, f, true /*optional*/, false /* signed */, true /* digested, doesn't matter in this case*/);
+}
+
+/****************************************************************************************
+ * @builtin SourceProvideDir
+ * @short make a directory available at the local filesystem
+ * @description
+ * Let an InstSrc provide some directory (make it available at the local filesystem) and
+ * all the files within it (non recursive).
+ * Warning: The downloaded files are removed in Pkg::SourceReleaseAll()!
+ *
+ * @param integer SrcId Specifies the InstSrc .
+ * @param integer medianr Number of the media the file is located on ('1' for the 1st media).
+ * @param string dir Directoryname relative to the media root.
+ * @return string local path as string
+ */
+YCPValue
+PkgModuleFunctions::SourceProvideDir (const YCPInteger& id, const YCPInteger& mid, const YCPString& d)
+{
+ y2warning("Pkg::SourceProvideDir() is obsoleted use Pkg::SourceProvideDirectory() instead");
+ // non optional, non recursive
+ return SourceProvideDirectory(id, mid, d, false, false);
+}
+
+
+/****************************************************************************************
+ * @builtin SourceProvideDirectory
+ * @short make a directory available at the local filesystem
+ * @description
+ * Download a directory from repository (make it available at the local filesystem) and
+ * all the files within it.
+ * Warning: The downloaded files are removed in Pkg::SourceReleaseAll()!
+ *
+ * @param integer id repository to use (id)
+ * @param integer mid Number of the media where the directory is located on ('1' for the 1st media).
+ * @param string d Directory name relative to the media root.
+ * @param boolean optional set to true if the directory may not exist (do not report errors)
+ * @param boolean recursive set to true to provide all subdirectories recursively
+ * @return string local path as string or nil when an error occured
+ */
+YCPValue
+PkgModuleFunctions::SourceProvideDirectory(const YCPInteger& id, const YCPInteger& mid, const YCPString& d, const YCPBoolean &optional, const YCPBoolean &recursive)
+{
+ // dowanload the directory, do not check the signatures
+ return SourceProvideDirectoryInternal(id, mid, d, optional, recursive, false);
+}
+
+YCPValue
+PkgModuleFunctions::SourceProvideDirectoryInternal(const YCPInteger& id, const YCPInteger& mid, const YCPString& d, const YCPBoolean &optional, const YCPBoolean &recursive, bool check_signatures)
+{
+ CallInitDownload(std::string(_("Downloading ") + d->value()));
+
+ bool found = true;
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ found = false;
+
+ zypp::filesystem::Pathname path; // FIXME user ManagedMedia
+
+ extern ZyppRecipients::MediaChangeSensitivity _silent_probing;
+ // remember the current value
+ ZyppRecipients::MediaChangeSensitivity _silent_probing_old = _silent_probing;
+
+ // disable media change callback for optional file
+ if (optional->value())
+ _silent_probing = ZyppRecipients::MEDIA_CHANGE_OPTIONALFILE;
+
+ if (found)
+ {
+ try
+ {
+ if (check_signatures)
+ {
+ // use a Fetcher for downloading signed files (see bnc#409927)
+ zypp::Fetcher f;
+ f.reset();
+ zypp::OnMediaLocation mloc(d->value(), mid->value());
+ // create the tmpdir in <_root>/var/tmp
+ zypp::filesystem::TmpDir tmpdir(_download_area / zypp::filesystem::TmpDir::defaultLocation() );
+
+ // keep the reference to the tmpdir so the directory is not deleted at the and of the block
+ tmp_dirs.push_back(tmpdir);
+ path = tmpdir.path();
+ f.setOptions(zypp::Fetcher::AutoAddIndexes);
+ f.enqueueDigestedDir(mloc, recursive->value());
+ f.start(path, *repo->mediaAccess()); // uses MediaAccess to retrieve
+ f.reset();
+ }
+ else
+ {
+ path = repo->mediaAccess()->provideDir(d->value(), recursive->value(), mid->value());
+ }
+ }
+ catch (const zypp::Exception& excpt)
+ {
+ _last_error.setLastError(ExceptionAsString(excpt));
+ y2milestone ("Directory not found: %s", d->value_cstr());
+ found = false;
+ }
+ }
+
+ // set the original probing value
+ _silent_probing = _silent_probing_old;
+
+ CallDestDownload();
+
+ if (found)
+ {
+ return YCPString(path.asString());
+ }
+ else
+ {
+ return YCPVoid();
+ }
+}
+
+
+
+YCPValue
+PkgModuleFunctions::SourceRefreshHelper (const YCPInteger& id, bool forced)
+{
+ y2milestone("Forced refresh : %s", forced ? "true" : "false");
+
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ return YCPBoolean(false);
+
+ PkgProgress pkgprogress(_callbackHandler);
+ std::list<std::string> stages;
+
+ // stages: "download", "build cache"
+ stages.push_back(_("Refresh Metadata"));
+ stages.push_back(_("Rebuild Cache"));
+
+ // two steps
+ zypp::ProgressData prog_total(2);
+ prog_total.sendTo(pkgprogress.Receiver());
+
+ // 3 steps per repository (download, cache rebuild, load resolvables)
+ pkgprogress.Start(_("Refreshing Repository..."), stages, _(HelpTexts::refresh_help));
+
+ try
+ {
+ zypp::RepoManager repomanager = CreateRepoManager();
+ y2milestone("Refreshing metadata '%s'", repo->repoInfo().alias().c_str());
+ RefreshWithCallbacks(repo->repoInfo(), zypp::ProgressData::ReceiverFnc(), forced ? zypp::RepoManager::RefreshForced : zypp::RepoManager::RefreshIfNeeded);
+
+ // next stage, increase progress
+ prog_total.incr();
+ pkgprogress.NextStage();
+
+ y2milestone("Caching source '%s'...", repo->repoInfo().alias().c_str());
+ repomanager.buildCache(repo->repoInfo(), forced ? zypp::RepoManager::BuildForced : zypp::RepoManager::BuildIfNeeded);
+ }
+ catch ( const zypp::Exception & expt )
+ {
+ y2error ("Error while refreshing the source: %s", expt.asString().c_str());
+ _last_error.setLastError(repo->repoInfo().alias() + ": " + ExceptionAsString(expt));
+ return YCPBoolean(false);
+ }
+
+ pkgprogress.Done();
+
+ return YCPBoolean( true );
+}
+
+/****************************************************************************************
+ * @builtin SourceRefreshNow
+ * @short Attempt to immediately refresh a Source
+ * @description
+ * The InsrSrc will be encouraged to check and refresh all metadata
+ * cached on disk.
+ *
+ * @param integer SrcId Specifies the InstSrc.
+ *
+ * @return boolean
+ **/
+YCPValue
+PkgModuleFunctions::SourceRefreshNow (const YCPInteger& id)
+{
+ // refresh if needed
+ return SourceRefreshHelper(id);
+}
+
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Get.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Get.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Get.cc Wed May 11 11:22:32 2011
@@ -0,0 +1,481 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2007 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id: Source_Get.cc 56467 2009-03-30 14:32:58Z lslezak $
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: Functions for reading repository properties
+ Namespace: Pkg
+*/
+
+#include <PkgModuleFunctions.h>
+#include "log.h"
+#include "ycpTools.h"
+
+#include <zypp/Product.h>
+#include <zypp/Repository.h>
+#include <zypp/Package.h>
+#include <zypp/media/CredentialManager.h>
+
+#include <ycp/YCPBoolean.h>
+#include <ycp/YCPMap.h>
+#include <ycp/YCPInteger.h>
+#include <ycp/YCPVoid.h>
+#include <ycp/YCPString.h>
+#include <ycp/YCPList.h>
+
+/*
+ Textdomain "pkg-bindings"
+*/
+
+/****************************************************************************************
+ * @builtin SourceGetCurrent
+ *
+ * @short Return the list of all InstSrc Ids.
+ *
+ * @param boolean enabled_only If true, or omitted, return the Ids of all enabled InstSrces.
+ * If false, return the Ids of all known InstSrces.
+ *
+ * @return list<integer> list of SrcIds (integer)
+ **/
+YCPValue
+PkgModuleFunctions::SourceGetCurrent (const YCPBoolean& enabled)
+{
+ YCPList res;
+
+ RepoId index = 0LL;
+ for( RepoCont::const_iterator it = repos.begin(); it != repos.end() ; ++it, ++index )
+ {
+ // ignore disabled sources if requested
+ if (enabled->value())
+ {
+ // Note: enabled() is tribool!
+ if ((*it)->repoInfo().enabled())
+ {
+ }
+ else if (!(*it)->repoInfo().enabled())
+ {
+ continue;
+ }
+ else
+ {
+ continue;
+ }
+ }
+
+ // ignore deleted sources
+ if ((*it)->isDeleted())
+ {
+ continue;
+ }
+
+ res->add( YCPInteger(index) );
+ }
+
+ return res;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Query individual sources
+/////////////////////////////////////////////////////////////////////////////////////////
+
+/****************************************************************************************
+ * @builtin SourceGeneralData
+ *
+ * @short Get general data about the source
+ * @description
+ * Return general data about the source as a map:
+ *
+ * <code>
+ * $[
+ * "enabled" : YCPBoolean,
+ * "autorefresh": YCPBoolean,
+ * "product_dir": YCPString,
+ * "type" : YCPString,
+ * "url" : YCPString (without password, but see SourceURL),
+ * "alias" : YCPString,
+ * "name" : YCPString,
+ * "service" : YCPString, (service to which the repo belongs, empty if there is no service assigned)
+ * "keeppackages" : YCPBoolean,
+ * "is_update_repo" : YCPBoolean, (true if this is an update repo - this requires loaded objects in pool otherwise the flag is not returned! The value is stored in repo metadata, not in .repo file!)
+ * ];
+ *
+ * </code>
+ * @param integer SrcId Specifies the InstSrc to query.
+ * @return map
+ **/
+YCPValue
+PkgModuleFunctions::SourceGeneralData (const YCPInteger& id)
+{
+ YCPMap data;
+
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ return YCPVoid ();
+
+ // convert type to the old strings ("YaST", "YUM" or "Plaindir")
+ std::string srctype = zypp2yastType(repo->repoInfo().type().asString());
+
+ data->add( YCPString("enabled"), YCPBoolean(repo->repoInfo().enabled()));
+ data->add( YCPString("autorefresh"), YCPBoolean(repo->repoInfo().autorefresh()));
+ data->add( YCPString("type"), YCPString(srctype));
+ data->add( YCPString("product_dir"), YCPString(repo->repoInfo().path().asString()));
+
+ // check if there is an URL
+ if (repo->repoInfo().baseUrlsBegin() != repo->repoInfo().baseUrlsEnd())
+ {
+ data->add( YCPString("url"), YCPString(repo->repoInfo().baseUrlsBegin()->asString()));
+ }
+
+ data->add( YCPString("alias"), YCPString(repo->repoInfo().alias()));
+ data->add( YCPString("name"), YCPString(repo->repoInfo().name()));
+
+ YCPList base_urls;
+ for( zypp::RepoInfo::urls_const_iterator it = repo->repoInfo().baseUrlsBegin(); it != repo->repoInfo().baseUrlsEnd(); ++it)
+ {
+ base_urls->add(YCPString(it->asString()));
+ }
+ data->add( YCPString("base_urls"), base_urls);
+
+ data->add( YCPString("mirror_list"), YCPString(repo->repoInfo().mirrorListUrl().asString()));
+
+ data->add( YCPString("priority"), YCPInteger(repo->repoInfo().priority()));
+
+ data->add( YCPString("service"), YCPString(repo->repoInfo().service()));
+
+ data->add( YCPString("keeppackages"), YCPBoolean(repo->repoInfo().keepPackages()));
+
+ // add Repository data
+ zypp::Repository repository(zypp::ResPool::instance().reposFind(repo->repoInfo().alias()));
+
+ if (repository != zypp::Repository::noRepository)
+ {
+ y2debug("adding zypp::Repository info");
+ data->add( YCPString("is_update_repo"), YCPBoolean(repository.isUpdateRepo()));
+ }
+
+ return data;
+}
+
+/******************************************************************************
+ * @builtin SourceURL
+ *
+ * @short Get full source URL, including password
+ * @param integer SrcId Specifies the InstSrc to query.
+ * @return string or nil on failure
+ **/
+YCPValue
+PkgModuleFunctions::SourceURL (const YCPInteger& id)
+{
+
+ const YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ return YCPVoid();
+
+ zypp::Url url;
+
+ if (repo->repoInfo().baseUrlsBegin() != repo->repoInfo().baseUrlsEnd())
+ {
+ // #186842
+ url = *(repo->repoInfo().baseUrlsBegin());
+
+ // add authentication data if exist
+ zypp::media::CredentialManager cm;
+
+ zypp::media::AuthData_Ptr auth = cm.getCred(url);
+
+ if (auth)
+ {
+ y2milestone("Authentication data found, adding to URL...");
+
+ if (auth->valid())
+ {
+ if (!auth->username().empty())
+ {
+ y2debug("Adding username...");
+ url.setUsername(auth->username());
+ }
+
+ if (!auth->password().empty())
+ {
+ y2debug("Adding password...");
+ url.setPassword(auth->password());
+ }
+ }
+ else
+ {
+ y2warning("Invalid authentication data, returning URL without username and password");
+ }
+
+ // does the url contain credentials query?
+ zypp::url::ParamMap params = url.getQueryStringMap();
+ zypp::url::ParamMap::iterator map_it = params.find("credentials");
+
+ if (map_it != params.end())
+ {
+ y2milestone("Removing credentials query from URL");
+ params.erase(map_it);
+ url.setQueryStringMap(params);
+ }
+ }
+
+ }
+
+ return YCPString(url.asCompleteString());
+}
+
+/****************************************************************************************
+ * @builtin SourceMediaData
+ * @short Return media data about the source
+ * @description
+ * Return media data about the source as a map:
+ *
+ * <code>
+ * $["media_count": YCPInteger,
+ * "media_id" : YCPString,
+ * "media_vendor" : YCPString,
+ * "url" : YCPString,
+ * ];
+ * </code>
+ *
+ * @param integer SrcId Specifies the InstSrc to query.
+ * @return map
+ **/
+YCPValue
+PkgModuleFunctions::SourceMediaData (const YCPInteger& id)
+{
+ YCPMap data;
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ return YCPVoid ();
+
+ std::string alias = repo->repoInfo().alias();
+ bool found_resolvable = false;
+ int max_medium = 1;
+
+ // search the maximum source number of a package in the repository
+ try
+ {
+ for (zypp::ResPoolProxy::const_iterator it = zypp_ptr()->poolProxy().byKindBegin(zypp::ResKind::package);
+ it != zypp_ptr()->poolProxy().byKindEnd(zypp::ResKind::package);
+ ++it)
+ {
+ // search in available products
+ for (zypp::ui::Selectable::available_iterator aval_it = (*it)->availableBegin();
+ aval_it != (*it)->availableEnd();
+ ++aval_it)
+ {
+ zypp::Package::constPtr pkg = boost::dynamic_pointer_cast<const zypp::Package>(aval_it->resolvable());
+
+ if (pkg && pkg->repoInfo().alias() == alias)
+ {
+ found_resolvable = true;
+
+ int medium = pkg->mediaNr();
+
+ if (medium > max_medium)
+ {
+ max_medium = medium;
+ }
+ }
+ }
+ }
+ }
+ catch (...)
+ {
+ }
+
+ if (found_resolvable)
+ {
+ data->add( YCPString("media_count"), YCPInteger(max_medium));
+ }
+ else
+ {
+ y2error("No resolvable from repository '%s' found, cannot get number of media (use Pkg::SourceLoad() to load the resolvables)", alias.c_str());
+ }
+
+ y2warning("Pkg::SourceMediaData() doesn't return \"media_id\" and \"media_vendor\" values anymore.");
+
+ // SourceMediaData returns URLs without password
+ if (repo->repoInfo().baseUrlsBegin() != repo->repoInfo().baseUrlsEnd())
+ {
+ data->add( YCPString("url"), YCPString(repo->repoInfo().baseUrlsBegin()->asString()));
+
+ // add all base URLs
+ YCPList base_urls;
+ for( zypp::RepoInfo::urls_const_iterator it = repo->repoInfo().baseUrlsBegin(); it != repo->repoInfo().baseUrlsEnd(); ++it)
+ {
+ base_urls->add(YCPString(it->asString()));
+ }
+ data->add( YCPString("base_urls"), base_urls);
+ }
+
+ return data;
+}
+
+/****************************************************************************************
+ * @builtin SourceProductData
+ * @short Return Product data about the source
+ * @param integer SrcId Specifies the InstSrc to query.
+ * @description
+ * Product data about the source as a map:
+ *
+ * <code>
+ * $[
+ * "label" : string,
+ * "vendor" : string,
+ * "productname" : string,
+ * "productversion" : string,
+ * "relnotesurl" : string,
+ * "relnotes_urls" : list<string>
+ * "register_urls" : list<string>
+ * "smolt_urls" : list<string>
+ * "update_urls" : list<string>
+ * "extra_urls" : list<string>
+ * "optional_urls" : list<string>
+ * ];
+ * </code>
+ *
+ * @return map
+ **/
+YCPValue
+PkgModuleFunctions::SourceProductData (const YCPInteger& src_id)
+{
+ YCPMap ret;
+
+ YRepo_Ptr repo = logFindRepository(src_id->value());
+ if (!repo)
+ return YCPVoid ();
+
+ std::string alias = repo->repoInfo().alias();
+
+ try
+ {
+ for (zypp::ResPoolProxy::const_iterator it = zypp_ptr()->poolProxy().byKindBegin(zypp::ResKind::product);
+ it != zypp_ptr()->poolProxy().byKindEnd(zypp::ResKind::product);
+ ++it)
+ {
+ zypp::Product::constPtr product = NULL;
+
+ // search in available products
+ for (zypp::ui::Selectable::available_iterator aval_it = (*it)->availableBegin();
+ aval_it != (*it)->availableEnd();
+ ++aval_it)
+ {
+ zypp::Product::constPtr prod = boost::dynamic_pointer_cast<const zypp::Product>(aval_it->resolvable());
+ if (prod && prod->repoInfo().alias() == alias)
+ {
+ product = prod;
+ break;
+ }
+ }
+
+ if (product)
+ {
+ ret->add( YCPString("label"), YCPString( product->summary() ) );
+ ret->add( YCPString("vendor"), YCPString( product->vendor() ) );
+ ret->add( YCPString("productname"), YCPString( product->name() ) );
+ ret->add( YCPString("productversion"), YCPString( product->edition().version() ) );
+ ret->add( YCPString("relnotesurl"), YCPString( product->releaseNotesUrls().first().asString()));
+
+ ret->add( YCPString("relnotes_urls"), asYCPList(product->releaseNotesUrls()));
+ ret->add( YCPString("register_urls"), asYCPList(product->registerUrls()));
+ ret->add( YCPString("smolt_urls"), asYCPList(product->smoltUrls()));
+ ret->add( YCPString("update_urls"), asYCPList(product->updateUrls()));
+ ret->add( YCPString("extra_urls"), asYCPList(product->extraUrls()));
+ ret->add( YCPString("optional_urls"), asYCPList(product->optionalUrls()));
+
+ break;
+ }
+ }
+
+ if(ret->size() == 0)
+ {
+ y2warning("Product for source '%lld' not found", src_id->value());
+ }
+ }
+ catch (...)
+ {
+ }
+
+ return ret;
+}
+
+/****************************************************************************************
+ * @builtin SourceProduct
+ * @short Obsoleted function, do not use, see SourceProductData builtin
+ * @deprecated
+ * @param integer
+ * @return map empty map
+ **/
+YCPValue
+PkgModuleFunctions::SourceProduct (const YCPInteger& id)
+{
+ y2error("Pkg::SourceProduct() is obsoleted, use Pkg::SourceProductData() instead!");
+ return SourceProductData(id);
+}
+
+/****************************************************************************************
+ * @builtin SourceEditGet
+ *
+ * @short Get state of Sources
+ * @description
+ * Return a list of states for all known InstSources sorted according to the
+ * source priority (highest first). A source state is a map:
+ * $[
+ * "SrcId" : YCPInteger,
+ * "enabled" : YCPBoolean,
+ * "autorefresh": YCPBoolean,
+ * "name" : YCPString,
+ * "service" : YCPString,
+ * "keeppackages" : YCPBoolean,
+ * ];
+ *
+ * @return list<map> list of source states (map)
+ **/
+YCPValue
+PkgModuleFunctions::SourceEditGet ()
+{
+ YCPList ret;
+
+ unsigned long index = 0;
+ for( RepoCont::const_iterator it = repos.begin(); it != repos.end(); ++it, ++index)
+ {
+ if (!(*it)->isDeleted())
+ {
+ YCPMap src_map;
+
+ src_map->add(YCPString("SrcId"), YCPInteger(index));
+ // Note: enabled() is tribool
+ src_map->add(YCPString("enabled"), YCPBoolean((*it)->repoInfo().enabled()));
+ // Note: autorefresh() is tribool
+ src_map->add(YCPString("autorefresh"), YCPBoolean((*it)->repoInfo().autorefresh()));
+ src_map->add(YCPString("name"), YCPString((*it)->repoInfo().name()));
+ src_map->add(YCPString("priority"), YCPInteger((*it)->repoInfo().priority()));
+ src_map->add(YCPString("service"), YCPString((*it)->repoInfo().service()));
+ src_map->add(YCPString("keeppackages"), YCPBoolean((*it)->repoInfo().keepPackages()));
+
+ ret->add(src_map);
+ }
+ }
+
+ return ret;
+}
+
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Installation.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Installation.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Installation.cc Wed May 11 11:22:32 2011
@@ -0,0 +1,327 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2007 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id: Source_Installation.cc 54407 2009-01-06 16:23:19Z lslezak $
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: Functions used during system installation
+ Namespace: Pkg
+*/
+
+#include <PkgModuleFunctions.h>
+#include "log.h"
+
+#include <zypp/ExternalProgram.h>
+
+#include <ycp/YCPBoolean.h>
+#include <ycp/YCPVoid.h>
+#include <ycp/YCPString.h>
+
+extern "C"
+{
+// stat()
+#include <unistd.h>
+// errno
+#include <errno.h>
+}
+
+// getenv()
+#include <cstdlib>
+
+/*
+ Textdomain "pkg-bindings"
+*/
+
+/****************************************************************************************
+ * @builtin SourceSetRamCache
+ * @short Obsoleted function, do not use
+ * @param boolean
+ * @return boolean
+ **/
+YCPValue
+PkgModuleFunctions::SourceSetRamCache (const YCPBoolean& a)
+{
+ y2warning( "Pkg::SourceSetRamCache is obsolete and does nothing");
+ return YCPBoolean( true );
+}
+
+bool PkgModuleFunctions::CreateDir(const std::string &path)
+{
+ if (path.empty())
+ {
+ y2error("Empty directory path");
+ return false;
+ }
+
+ // check if the target exists
+ struct stat stat_buf;
+ if (::stat(path.c_str(), &stat_buf) == 0)
+ {
+ // it exists, is it a directory?
+ if (S_ISDIR(stat_buf.st_mode))
+ {
+ return true;
+ }
+ else
+ {
+ // error message (followed by directory name)
+ _last_error.setLastError(_("Target is not a directory: ") + path);
+ y2error("Target %s exists but it's not a directory", path.c_str());
+ return false;
+ }
+ }
+ else
+ {
+ // "No such file or directory" error, the target doesn't exist
+ if (errno == ENOENT)
+ {
+ y2milestone("Creating directory %s...", path.c_str());
+
+ const char* argv[] =
+ {
+ "mkdir",
+ // create parent dir
+ "-p",
+ // finish parameter list
+ "--",
+ // target
+ path.c_str(),
+ NULL
+ };
+
+ // discard stderr, no pty, stderr_fd = -1, use the default locale
+ zypp::ExternalProgram prog(argv, zypp::ExternalProgram::Discard_Stderr, false, -1, true);
+
+ if (prog.close())
+ {
+ // error message (followed by directory name)
+ _last_error.setLastError(_("Cannot create directory ") + path);
+ y2error("Cannot create target directory %s", path.c_str());
+ return false;
+ }
+ }
+ // other error
+ else
+ {
+ // error message (followed by directory name)
+ _last_error.setLastError(_("Cannot check status of directory ") + path);
+ y2error("Cannot stat %s: %s", path.c_str(), ::strerror(errno));
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool PkgModuleFunctions::CopyToDir(const std::string &source, const std::string &target, bool backup, bool recursive)
+{
+ if (source.empty())
+ {
+ y2error("CopyToDir: Empty source parameter");
+ return false;
+ }
+
+ if (target.empty())
+ {
+ y2error("CopyToDir: Empty target parameter");
+ return false;
+ }
+
+ // check if the source exists
+ struct stat stat_buf;
+ if (::stat(source.c_str(), &stat_buf) != 0 && errno == ENOENT)
+ {
+ y2milestone("Source %s does not exist, skipping", source.c_str());
+ return true;
+ }
+
+ // create the target directory
+ if (!CreateDir(target))
+ {
+ return false;
+ }
+
+ const char* argv[] =
+ {
+ "cp",
+ // preserve the time stamps and permissions
+ "-a",
+ // fill the parameters later
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ };
+
+ int pos = 2;
+
+ if (recursive)
+ {
+ argv[pos++] = "-r";
+ }
+
+ if (backup)
+ {
+ argv[pos++] = "-b";
+ }
+
+ // finish parameter list
+ argv[pos++] = "--";
+
+ // source
+ argv[pos++] = source.c_str();
+
+ // target
+ argv[pos++] = target.c_str();
+
+ // discard stderr, no pty, stderr_fd = -1, use the default locale
+ zypp::ExternalProgram prog(argv, zypp::ExternalProgram::Discard_Stderr, false, -1, true);
+
+ if (prog.close())
+ {
+ // error message (followed by detailed description)
+ const std::string msg = _("Error: Cannot copy the cache to the target directory\n");
+
+ // error message
+ _last_error.setLastError(msg + _("Copying failed"));
+ y2error("Cannot copy %s to %s", source.c_str(), target.c_str());
+ return false;
+ }
+
+ return true;
+}
+
+/****************************************************************************************
+ * @builtin SourceCacheCopyTo
+ *
+ * @short Copy cache data of all installation sources to the target
+ * @description
+ * Copy cache data of all installation sources to the target located below 'dir'.
+ * To be called at end of initial installation.
+ *
+ * @param string dir Root directory of target.
+ * @return boolean true on success
+ **/
+YCPValue
+PkgModuleFunctions::SourceCacheCopyTo (const YCPString& dir)
+{
+ // error message (followed by detailed description)
+ const std::string msg = _("Error: Cannot copy the cache to the target directory\n");
+
+ std::string d(dir->value());
+ y2milestone("Copying source cache to '%s'...", d.c_str());
+
+ if (d.empty())
+ {
+ y2error("Empty parameter in Pkg::SourceCacheCopyTo()!");
+ return YCPBoolean(false);
+ }
+
+ if (!CreateDir(d))
+ {
+ return YCPBoolean(false);
+ }
+
+ std::string target(d + "/var/cache");
+
+ // copy /var/cache/zypp to the target system
+ if (!CopyToDir("/var/cache/zypp", target))
+ {
+ return YCPBoolean(false);
+ }
+
+ // copy optional files in /etc/zypp/credentials.d directory
+ std::string source_cred("/etc/zypp/credentials.d");
+ std::string target_cred(d + "/etc/zypp");
+
+ // true = backup target files
+ if (!CopyToDir(source_cred, target_cred, true))
+ {
+ return YCPBoolean(false);
+ }
+
+ // copy user's credentials
+ char *homedir = ::getenv("HOME");
+ if (homedir)
+ {
+ // see file zypp/media/CredentialManager.cc for the user's file definition
+ source_cred = std::string(homedir) + "/.zypp/credentials.cat";
+ target_cred = d + homedir + "/.zypp";
+
+ // copy optional files in $HOME/.zypp/credentials.cat file
+ // true = backup target files
+ if (!CopyToDir(source_cred, target_cred, true))
+ {
+ return YCPBoolean(false);
+ }
+ }
+
+ return YCPBoolean(true);
+}
+/****************************************************************************************
+ * @builtin SourceMoveDownloadArea
+ *
+ * @short Move download area of CURL-based sources to specified directory
+ * @param path specifies the path to move the download area to
+ * @return boolean
+ **/
+YCPValue
+PkgModuleFunctions::SourceMoveDownloadArea (const YCPString & path)
+{
+ if (path.isNull())
+ {
+ y2error("Error: Pkg::SourceMoveDownloadArea(): nil argument");
+ return YCPBoolean(false);
+ }
+
+ try
+ {
+ y2milestone("Moving download area of all sources to %s", path->value().c_str());
+ zypp::media::MediaManager manager;
+ manager.setAttachPrefix(path->value());
+ _download_area = path->value();
+ }
+ catch (zypp::Exception & excpt)
+ {
+ _last_error.setLastError(ExceptionAsString(excpt));
+ y2error("Pkg::SourceMoveDownloadArea has failed: %s", excpt.msg().c_str());
+ return YCPBoolean(false);
+ }
+
+ y2milestone( "Download areas moved");
+
+ return YCPBoolean(true);
+}
+
+/**
+ * @builtin InstSysMode
+ * @short obsoleted - do not use
+ * @return void
+ */
+YCPValue
+PkgModuleFunctions::InstSysMode ()
+{
+ y2warning("Pkg::InstSysMode() is obsoleted, it's not needed anymore");
+ return YCPVoid();
+}
+
+
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Load.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Load.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Load.cc Wed May 11 11:22:32 2011
@@ -0,0 +1,593 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2007 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id: Source_Load.cc 63716 2011-04-05 11:33:32Z lslezak $
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: Functions for initializing the package manager
+ Namespace: Pkg
+*/
+
+#include <Callbacks.h>
+#include <Callbacks.YCP.h>
+
+#include <PkgModuleFunctions.h>
+#include "log.h"
+
+#include <PkgProgress.h>
+#include <HelpTexts.h>
+
+/*
+ Textdomain "pkg-bindings"
+*/
+
+/****************************************************************************************
+ * @builtin SourceRestore
+ *
+ * @short Restore the sources from the persistent store
+ * @description
+ * Make sure the Source Manager is up and knows all available installation sources.
+ * It's safe to call this multiple times, and once the installation sources are
+ * actually enabled, it's even cheap
+ *
+ * @return boolean True on success
+ **/
+YCPValue
+PkgModuleFunctions::SourceRestore()
+{
+ // return value
+ bool success = true;
+
+ if (repos.size() > 0)
+ {
+ y2warning("Number of registered repositories: %zd, skipping repository load!", repos.size());
+ return YCPBoolean(success);
+ }
+
+ try
+ {
+ zypp::RepoManager repomanager = CreateRepoManager();
+
+ if (!service_manager.empty())
+ {
+ y2warning("Number of known services: %zd, skipping service load!", service_manager.size());
+ }
+ else
+ {
+ try
+ {
+ service_manager.LoadServices(repomanager);
+
+ if (!service_manager.empty())
+ {
+ // refresh services at first
+ ServiceManager::Services services(service_manager.GetServices());
+ bool network_is_running = NetworkDetected();
+
+ for_(srv_it, services.begin(), services.end())
+ {
+ try
+ {
+ if (srv_it->enabled() && srv_it->autorefresh())
+ {
+ zypp::Url url(srv_it->url());
+
+ if (!network_is_running && remoteRepo(url))
+ {
+ y2warning("No network connection, skipping autorefresh of remote service %s (%s)",
+ srv_it->alias().c_str(), url.asString().c_str());
+ }
+ else
+ {
+ y2milestone("Autorefreshing service %s (%s)...", srv_it->alias().c_str(), url.asString().c_str());
+ service_manager.RefreshService(srv_it->alias(), repomanager);
+ }
+ }
+ }
+ catch (const zypp::Exception& excpt)
+ {
+ // service refresh is not fatal, let's continue
+ y2error ("Error in service refresh: %s", excpt.asString().c_str());
+ // error message, service name and URL is appened at the end of the string
+ _last_error.setLastError(std::string(_("Error refreshing service")) + " " + srv_it->name() + " ("
+ + srv_it->url().asString() + "):\n\n" + ExceptionAsString(excpt));
+ success = false;
+ }
+ }
+ }
+ }
+ catch (const zypp::Exception& excpt)
+ {
+ _last_error.setLastError(ExceptionAsString(excpt));
+ success = false;
+ }
+ }
+
+ std::list<zypp::RepoInfo> reps = repomanager.knownRepositories();
+
+ for (std::list<zypp::RepoInfo>::iterator it = reps.begin();
+ it != reps.end(); ++it)
+ {
+ repos.push_back(new YRepo(*it));
+ }
+ }
+ catch (const zypp::Exception& excpt)
+ {
+ // FIXME: assuming the sources are already initialized
+ y2error ("Error in SourceRestore: %s", excpt.asString().c_str());
+ _last_error.setLastError(ExceptionAsString(excpt));
+ success = false;
+ }
+
+ return YCPBoolean(success);
+}
+
+/****************************************************************************************
+ * @builtin SourceGetBrokenSources
+ *
+ * @short Return list of broken sources (sources which failed to restore)
+ * @description
+ * Get list of all sources which could not have been restored.
+ * @return list<string> list of aliases (product names or URLs)
+ **/
+YCPValue PkgModuleFunctions::SourceGetBrokenSources()
+{
+ y2warning("Pkg::SourceGetBrokenSources() is obsoleted, it's not needed anymore.");
+ return YCPList();
+}
+
+/****************************************************************************************
+ * @builtin SourceLoad
+ *
+ * @short Load resolvables from the installation sources
+ * @description
+ * Refresh the pool - Add/remove resolvables from the enabled/disabled sources.
+ * @return boolean True on success
+ **/
+YCPValue
+PkgModuleFunctions::SourceLoad()
+{
+ std::list<std::string> stages;
+ stages.push_back(_("Refresh Sources"));
+ stages.push_back(_("Rebuild Cache"));
+ stages.push_back(_("Load Data"));
+
+ PkgProgress pkgprogress(_callbackHandler);
+
+ // 3 steps per repository (download, cache rebuild, load resolvables)
+ pkgprogress.Start(_("Loading the Package Manager..."), stages, _(HelpTexts::load_resolvables));
+
+ YCPValue ret = SourceLoadImpl(pkgprogress);
+
+ pkgprogress.Done();
+
+ return ret;
+}
+
+void PkgModuleFunctions::CallRefreshStarted()
+{
+ // get the YCP callback handler for destroy event
+ Y2Function* ycp_handler = _callbackHandler._ycpCallbacks.createCallback(CallbackHandler::YCPCallbacks::CB_StartSourceRefresh);
+
+ // is the callback registered?
+ if (ycp_handler != NULL)
+ {
+ // evaluate the callback function
+ ycp_handler->evaluateCall();
+ }
+}
+
+void PkgModuleFunctions::CallRefreshDone()
+{
+ // get the YCP callback handler for destroy event
+ Y2Function* ycp_handler = _callbackHandler._ycpCallbacks.createCallback(CallbackHandler::YCPCallbacks::CB_DoneSourceRefresh);
+
+ // is the callback registered?
+ if (ycp_handler != NULL)
+ {
+ // evaluate the callback function
+ ycp_handler->evaluateCall();
+ }
+}
+
+YCPValue
+PkgModuleFunctions::SourceLoadImpl(PkgProgress &progress)
+{
+ bool success = true;
+
+ int repos_to_load = 0;
+ int repos_to_refresh = 0;
+ for (RepoCont::iterator it = repos.begin();
+ it != repos.end(); ++it)
+ {
+ if ((*it)->repoInfo().enabled() && !(*it)->isDeleted())
+ {
+ repos_to_load++;
+
+ if ((*it)->repoInfo().autorefresh())
+ {
+ repos_to_refresh++;
+ }
+ }
+ }
+
+ y2debug("repos_to_load: %d, repos_to_refresh: %d", repos_to_load, repos_to_refresh);
+
+ // set max. value (3 steps per repository - refresh, rebuild, load)
+ zypp::ProgressData prog_total(repos_to_load * 3 * 100);
+ prog_total.sendTo(progress.Receiver());
+ y2debug("Progress status: %lld", prog_total.val());
+
+ zypp::RepoManager repomanager = CreateRepoManager();
+
+ autorefresh_skipped = false;
+
+ bool refresh_started_called = false;
+ bool network_is_running = NetworkDetected();
+
+ // remember failed repositories during autorefresh,
+ // don't load packages from them
+ RepoCont failed_refresh;
+
+ if (repos_to_refresh > 0)
+ {
+ // refresh metadata
+ for (RepoCont::iterator it = repos.begin();
+ it != repos.end(); ++it)
+ {
+ // load resolvables only from enabled repos which are not deleted
+ if ((*it)->repoInfo().enabled() && !(*it)->isDeleted())
+ {
+ // sub tasks
+ zypp::CombinedProgressData refresh_subprogress(prog_total, 100);
+ zypp::ProgressData prog(100);
+ prog.sendTo(refresh_subprogress);
+ y2debug("Progress status: %lld", prog_total.val());
+
+ if ((*it)->isLoaded())
+ {
+ y2milestone("Resolvables from '%s' are already present, not loading", (*it)->repoInfo().alias().c_str());
+ }
+ else
+ {
+ zypp::RepoStatus raw_metadata_status = repomanager.metadataStatus((*it)->repoInfo());
+
+ // autorefresh the source
+ if ((*it)->repoInfo().autorefresh() || raw_metadata_status.empty())
+ {
+ // do not autorefresh remote repositories when the network is not running
+ if (!network_is_running)
+ {
+ zypp::Url url = *((*it)->repoInfo().baseUrlsBegin());
+
+ if (remoteRepo(url))
+ {
+ y2warning("No network connection, skipping autorefresh of remote repository %s (%s)",
+ (*it)->repoInfo().alias().c_str(), url.asString().c_str());
+ continue;
+ }
+ }
+
+ try
+ {
+ zypp::RepoManager::RefreshCheckStatus ref_stat = repomanager.checkIfToRefreshMetadata((*it)->repoInfo(), *((*it)->repoInfo().baseUrlsBegin()));
+
+ if (ref_stat != zypp::RepoManager::REFRESH_NEEDED)
+ {
+ y2internal("Skipping repository '%s' - refresh is not needed", (*it)->repoInfo().alias().c_str());
+ continue;
+ }
+
+ y2milestone("Autorefreshing source: %s", (*it)->repoInfo().alias().c_str());
+ // refresh the repository
+ if (!refresh_started_called)
+ {
+ // call the init callback
+ CallRefreshStarted();
+ refresh_started_called = true;
+ }
+ RefreshWithCallbacks((*it)->repoInfo(), prog.receiver());
+ }
+ // NOTE: subtask progresses are reported as done in the destructor
+ // no need to handle them in the exception code
+ catch (const zypp::Exception& excpt)
+ {
+ // remember the failed autorefresh
+ failed_refresh.push_back(*it);
+
+ if (autorefresh_skipped)
+ {
+ y2warning("autorefresh_skipped, ignoring the exception");
+ }
+ else
+ {
+ y2error ("Error in SourceLoad: %s", excpt.asString().c_str());
+ _last_error.setLastError(ExceptionAsString(excpt));
+ success = false;
+ }
+ }
+
+ if (autorefresh_skipped)
+ {
+ y2warning("Skipping autorefresh for the rest of repositories");
+ break;
+ }
+ else
+ {
+ y2debug("Continuing with autorefresh");
+ }
+ }
+ }
+ prog.toMax();
+ y2debug("Progress status: %lld", prog_total.val());
+ }
+ }
+ }
+
+ progress.NextStage();
+
+ // rebuild cache
+ for (RepoCont::iterator it = repos.begin();
+ it != repos.end(); ++it)
+ {
+ // load resolvables only from enabled repos which are not deleted
+ if ((*it)->repoInfo().enabled() && !(*it)->isDeleted())
+ {
+ // sub tasks
+ zypp::CombinedProgressData rebuild_subprogress(prog_total, 100);
+ zypp::ProgressData prog(100);
+ prog.sendTo(rebuild_subprogress);
+
+ y2debug("Progress status: %lld", prog_total.val());
+ if ((*it)->isLoaded())
+ {
+ y2milestone("Resolvables from '%s' are already present, not rebuilding the cache", (*it)->repoInfo().alias().c_str());
+ }
+ else
+ {
+ // autorefresh the source
+ if ((*it)->repoInfo().autorefresh())
+ {
+ zypp::RepoStatus raw_metadata_status = repomanager.metadataStatus((*it)->repoInfo());
+
+ // autorefresh the source
+ if (raw_metadata_status.empty() )
+ {
+ y2error("Missinga metadata, not rebuilding the cache");
+ continue;
+ }
+
+ try
+ {
+ // rebuild cache (the default policy is "if needed")
+ y2milestone("Rebuilding cache for '%s'...", (*it)->repoInfo().alias().c_str());
+
+ //repomanager.buildCache((*it)->repoInfo(), zypp::RepoManager::BuildIfNeeded, prog.receiver());
+ repomanager.buildCache((*it)->repoInfo(), zypp::RepoManager::BuildIfNeeded, rebuild_subprogress);
+ }
+ // NOTE: subtask progresses are reported as done in the descructor
+ // no need to handle them in the exception code
+ catch (const zypp::Exception& excpt)
+ {
+ if (autorefresh_skipped)
+ {
+ y2warning("autorefresh_skipped, ignoring the exception");
+ }
+ else
+ {
+ y2error ("Error in SourceLoad: %s", excpt.asString().c_str());
+ _last_error.setLastError(ExceptionAsString(excpt));
+ success = false;
+ }
+ }
+
+ if (autorefresh_skipped)
+ {
+ y2warning("Skipping autorefresh for the rest of repositories");
+ break;
+ }
+ else
+ {
+ y2debug("Continuing with autorefresh");
+ }
+ }
+ }
+ prog.toMax();
+ y2debug("Progress status: %lld", prog_total.val());
+ }
+ }
+
+ if (refresh_started_called)
+ {
+ // call the finish callback
+ CallRefreshDone();
+ }
+
+ progress.NextStage();
+
+ for (RepoCont::iterator it = repos.begin();
+ it != repos.end(); ++it)
+ {
+ // load resolvables only from enabled repos which are not deleted
+ if ((*it)->repoInfo().enabled() && !(*it)->isDeleted())
+ {
+ // check whether the refresh failed or not
+ RepoCont::iterator failed_it = find(failed_refresh.begin(), failed_refresh.end(), *it);
+ if (failed_it != failed_refresh.end())
+ {
+ y2warning("Ignoring packages from repository '%s' (%s) - refresh has failed", (*it)->repoInfo().name().c_str(), (*it)->repoInfo().alias().c_str());
+ continue;
+ }
+
+ y2debug("Loading: %s, Status: %lld", (*it)->repoInfo().alias().c_str(), prog_total.val());
+
+ // subtask
+ zypp::CombinedProgressData load_subprogress(prog_total, 100);
+
+ if ((*it)->isLoaded())
+ {
+ y2milestone("Resolvables from '%s' are already present, not loading", (*it)->repoInfo().alias().c_str());
+ }
+ else
+ {
+ // load objects, do network status check
+ success = LoadResolvablesFrom(*it, load_subprogress, true) && success;
+ }
+ }
+ y2debug("Progress status: %lld", prog_total.val());
+ }
+
+ // report 100%
+ prog_total.toMax();
+
+ autorefresh_skipped = false;
+ return YCPBoolean(success);
+}
+
+
+/****************************************************************************************
+ * @builtin SourceStartManager
+ *
+ * @short Start the source manager - restore the sources and load the resolvables
+ * @description
+ * Calls SourceRestore(), if argument enable is true SourceLoad() is called.
+ * @param boolean enable If true the resolvables are loaded from the enabled sources
+ *
+ * @return boolean
+ **/
+YCPValue
+PkgModuleFunctions::SourceStartManager (const YCPBoolean& enable)
+{
+ PkgProgress pkgprogress(_callbackHandler);
+
+ // display the progress only when sources will be loaded
+ if (enable->value() && repos.size() == 0)
+ {
+ std::list<std::string> stages;
+ stages.push_back(_("Load Sources"));
+ stages.push_back(_("Refresh Sources"));
+ stages.push_back(_("Rebuild Cache"));
+ stages.push_back(_("Load Data"));
+
+ // 3 steps per repository (download, cache rebuild, load resolvables)
+ pkgprogress.Start(_("Loading the Package Manager..."), stages, _(HelpTexts::load_resolvables));
+ }
+
+ YCPValue ret = SourceStartManagerImpl(enable, pkgprogress);
+
+ if (enable->value())
+ {
+ pkgprogress.Done();
+ }
+
+ return ret;
+}
+
+/****************************************************************************************
+ * Helper function
+ * @short Start the source manager - restore the sources and load the resolvables
+ * @description
+ * Calls SourceRestore(), if argument enable is true SourceLoad() is called.
+ * @param boolean enable If true the resolvables are loaded from the enabled sources
+ *
+ * @return boolean
+ **/
+YCPValue
+PkgModuleFunctions::SourceStartManagerImpl(const YCPBoolean& enable, PkgProgress &progress)
+{
+ YCPValue success = SourceRestore();
+
+ progress.NextStage();
+
+ if( enable->value() )
+ {
+ if (!success->asBoolean()->value())
+ {
+ y2warning("SourceStartManager: Some sources have not been restored, loading only the active sources...");
+ }
+
+ // enable all sources and load the resolvables
+ success = YCPBoolean(SourceLoadImpl(progress)->asBoolean()->value() && success->asBoolean()->value());
+ }
+
+ return success;
+}
+
+/****************************************************************************************
+ * @builtin SourceStartCache
+ *
+ * @short Make sure the InstSrcManager is up, and return the list of SrcIds.
+ * @description
+ * Make sure the InstSrcManager is up, and return the list of SrcIds.
+ * In fact nothing more than:
+ *
+ * <code>
+ * SourceStartManager( enabled_only );
+ * return SourceGetCurrent( enabled_only );
+ * </code>
+ *
+ * @param boolean enabled_only If true, make sure all InstSrces are enabled according to
+ * their default, and return the Ids of enabled InstSrces only. If false, return
+ * the Ids of all known InstSrces.
+ *
+ * @return list<integer> list of SrcIds
+ **/
+YCPValue
+PkgModuleFunctions::SourceStartCache (const YCPBoolean& enabled)
+{
+ try
+ {
+ SourceStartManager(enabled);
+
+ return SourceGetCurrent(enabled);
+ }
+ catch (const zypp::Exception& excpt)
+ {
+ y2error ("Error in SourceStartCache: %s", excpt.asString().c_str());
+ _last_error.setLastError(ExceptionAsString(excpt));
+ }
+ // catch an exception from boost (e.g. a file cannot be read by non-root user)
+ catch (const std::exception& err)
+ {
+ y2error ("Error in SourceStartCache: %s", err.what());
+ _last_error.setLastError(err.what());
+ }
+ catch (...)
+ {
+ y2error("Unknown error in SourceStartCache");
+ }
+
+ return YCPList();
+}
+
+/****************************************************************************************
+ * @builtin SourceCleanupBroken - obsoleted, do not use!
+ *
+ * @short Clean up all sources that were not properly restored on the last
+ * call of SourceStartManager or SourceStartCache.
+ *
+ * @return boolean
+ **/
+YCPValue
+PkgModuleFunctions::SourceCleanupBroken ()
+{
+ y2warning("Pkg::SourceCleanupBroken() is obsoleted, it's not needed anymore.");
+ return YCPBoolean(true);
+}
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Misc.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Misc.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Misc.cc Wed May 11 11:22:32 2011
@@ -0,0 +1,234 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2007 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id: Source_Misc.cc 58008 2009-07-10 11:30:50Z lslezak $
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: Generic functions for accessing repositories from Yast
+ Namespace: Pkg
+*/
+
+#include <PkgModuleFunctions.h>
+#include "log.h"
+
+#include <sstream> // ostringstream
+
+/*
+ Textdomain "pkg-bindings"
+*/
+
+/**
+ * Logging helper:
+ * call zypp::SourceManager::sourceManager()->findSource
+ * and in case of exception, log error and setLastError AND RETHROW
+ */
+YRepo_Ptr PkgModuleFunctions::logFindRepository(RepoId id)
+{
+ try
+ {
+ if (id < 0 || id >= repos.size())
+ {
+ // not found
+ throw(std::exception());
+ }
+
+ if (!repos[id])
+ {
+ // not found
+ throw(std::exception());
+ }
+
+ if (repos[id]->isDeleted())
+ {
+ y2error("Source %zd has been deleted, the ID is not valid", id);
+ return YRepo_Ptr();
+ }
+
+ return repos[id];
+ }
+ catch (...)
+ {
+ y2error("Cannot find source with ID: %zd", id);
+ // TODO: improve the error message
+ _last_error.setLastError(_("Cannot find source"));
+ }
+
+ // not found, return empty pointer
+ return YRepo_Ptr();
+}
+
+PkgModuleFunctions::RepoId PkgModuleFunctions::logFindAlias(const std::string &alias) const
+{
+ RepoId index = 0LL;
+
+ for(RepoCont::const_iterator it = repos.begin(); it != repos.end() ; ++it, ++index)
+ {
+ if (!(*it)->isDeleted() && (*it)->repoInfo().alias() == alias)
+ return index;
+ }
+
+ return -1LL;
+}
+
+bool PkgModuleFunctions::aliasExists(const std::string &alias, const std::list<zypp::RepoInfo> &reps) const
+{
+ // search in loaded repositories
+ for(RepoCont::const_iterator it = repos.begin(); it != repos.end() ; ++it)
+ {
+ if ((*it)->repoInfo().alias() == alias)
+ return true;
+ }
+
+ // search in stored repositories
+ for (std::list<zypp::RepoInfo>::const_iterator it = reps.begin();
+ it != reps.end(); ++it)
+ {
+ if (it->alias() == alias)
+ return true;
+ }
+
+ return false;
+}
+
+// convert libzypp type to yast strings ("YaST", "YUM" or "Plaindir")
+std::string PkgModuleFunctions::zypp2yastType(const std::string &type)
+{
+ std::string ret(type);
+
+ if (type_conversion_table.empty())
+ {
+ // initialize the conversion map
+ type_conversion_table["rpm-md"] = "YUM";
+ type_conversion_table["yast2"] = "YaST";
+ type_conversion_table["plaindir"] = "Plaindir";
+ type_conversion_table["NONE"] = "NONE";
+ }
+
+ std::map<std::string,std::string>::const_iterator it = type_conversion_table.find(type);
+
+ // found in the conversion table
+ if (it != type_conversion_table.end())
+ {
+ ret = it->second;
+ }
+ else
+ {
+ y2error("Cannot convert type '%s'", type.c_str());
+ }
+
+ return ret;
+}
+
+std::string PkgModuleFunctions::yast2zyppType(const std::string &type)
+{
+ // do conversion from the Yast type ("YaST", "YUM", "Plaindir")
+ // to libzypp type ("yast", "yum", "plaindir")
+ // we can simply use toLower instead of a conversion table
+ // in this case
+ return zypp::str::toLower(type);
+}
+
+std::string PkgModuleFunctions::UniqueAlias(const std::string &alias)
+{
+ // make a copy
+ std::string ret = alias;
+
+ unsigned int id = 0;
+
+ // search in stored repositories
+ std::list<zypp::RepoInfo> reps = CreateRepoManager().knownRepositories();
+
+ while(aliasExists(ret, reps))
+ {
+ y2milestone("Alias %s already found: %zd", ret.c_str(), logFindAlias(ret));
+
+ // the alias already exists - add a counter
+ std::ostringstream ostr;
+ ostr << alias << "_" << id;
+
+ ret = ostr.str();
+
+ y2milestone("Using alias %s", ret.c_str());
+ ++id;
+ }
+
+ return ret;
+}
+
+// helper function
+zypp::Url PkgModuleFunctions::shortenUrl(const zypp::Url &url)
+{
+ std::string url_path = url.getPathName();
+ std::string begin_path;
+ std::string end_path;
+
+ // try to convert 'http://server/dir1/dir2/dir3/dir4' -> 'http://server/dir1/.../dir4'
+ std::string::size_type pos_first = url_path.find("/");
+ if (pos_first == 0)
+ {
+ pos_first = url_path.find("/", 1);
+ }
+
+ if (pos_first == std::string::npos)
+ {
+ const int num = 5;
+
+ // "/" not found use the beginning and the end part
+ // 'http://server/very_long_directory_name' -> 'http://server/very_..._name'
+ begin_path = std::string(url_path, 0, num);
+ end_path = std::string(url_path, url_path.size() - num - 1, num);
+ }
+ else
+ {
+ unsigned int pos_last = url_path.rfind("/");
+ if (pos_last == url_path.size() - 1)
+ {
+ pos_last = url_path.rfind("/", url_path.size() - 1);
+ }
+
+ if (pos_last == pos_first || pos_last < pos_first)
+ {
+ const int num = 5;
+
+ // "/" not found use the beginning and the end part
+ begin_path = std::string(url_path, 0, num);
+ end_path = std::string(url_path, url_path.size() - num - 1, num);
+ }
+ else
+ {
+ begin_path = std::string(url_path, 0, pos_first + 1);
+ end_path = std::string(url_path, pos_last);
+ }
+ }
+
+ std::string new_path = begin_path + "..." + end_path;
+ zypp::Url ret(url);
+
+ // use the shorter path
+ ret.setPathName(new_path);
+ // remove query parameters
+ ret.setQueryString("");
+ // remove fragmet
+ ret.setFragment("");
+
+ y2milestone("Using shortened URL: '%s' -> '%s'", url.asString().c_str(), ret.asString().c_str());
+ return ret;
+}
+
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Resolvables.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Resolvables.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Resolvables.cc Wed May 11 11:22:32 2011
@@ -0,0 +1,157 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2007 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id: Source_Resolvables.cc 63716 2011-04-05 11:33:32Z lslezak $
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: Functions for adding/removing resolvables in the pool
+ Namespace: Pkg
+*/
+
+#include <Callbacks.h>
+#include <Callbacks.YCP.h>
+
+#include <PkgModuleFunctions.h>
+#include "log.h"
+
+#include <zypp/sat/Pool.h>
+
+/*
+ Textdomain "pkg-bindings"
+*/
+
+/*
+ * A helper function - remove all resolvables from the repository from the pool
+ */
+void PkgModuleFunctions::RemoveResolvablesFrom(YRepo_Ptr repo)
+{
+ const std::string &alias = repo->repoInfo().alias();
+ y2milestone("Removing resolvables from '%s'", alias.c_str());
+ // remove the resolvables if they have been loaded
+ zypp::sat::Pool::instance().reposErase(alias);
+
+ repo->resetLoaded();
+}
+
+/*
+ * A helper function - load resolvable from the repository into the pool
+ */
+bool PkgModuleFunctions::LoadResolvablesFrom(YRepo_Ptr repo, const zypp::ProgressData::ReceiverFnc &progressrcv, bool network_check)
+{
+ if (repo->isLoaded())
+ {
+ y2milestone("Repository is already loaded");
+ return true;
+ }
+
+ const zypp::RepoInfo &repoinfo = repo->repoInfo();
+ bool success = true;
+ unsigned int size_start = zypp_ptr()->pool().size();
+ y2milestone("Loading resolvables from '%s', pool size at start: %d", repoinfo.alias().c_str(), size_start);
+
+ // sub tasks
+ zypp::ProgressData prog(100);
+ prog.sendTo(progressrcv);
+ zypp::CombinedProgressData load_subprogress(prog, 100);
+
+ try
+ {
+ zypp::RepoManager repomanager = CreateRepoManager();
+ bool refresh = true;
+
+ // build cache if needed
+ if (!repomanager.isCached(repoinfo) && !autorefresh_skipped)
+ {
+ zypp::RepoStatus raw_metadata_status = repomanager.metadataStatus(repoinfo);
+ if (raw_metadata_status.empty())
+ {
+ if (network_check)
+ {
+ zypp::Url url = *(repoinfo.baseUrlsBegin());
+
+ if (remoteRepo(url) && !NetworkDetected())
+ {
+ y2warning("No network connection, skipping autorefresh of remote repository %s (%s)",
+ repoinfo.alias().c_str(), url.asString().c_str());
+
+ refresh = false;
+ }
+ }
+
+ if (refresh)
+ {
+ y2milestone("Missing metadata for source '%s', downloading...", repoinfo.alias().c_str());
+
+ CallRefreshStarted();
+
+ RefreshWithCallbacks(repoinfo);
+
+ CallRefreshDone();
+ }
+ }
+
+ if (refresh)
+ {
+ y2milestone("Caching source '%s'...", repoinfo.alias().c_str());
+ repomanager.buildCache(repoinfo, zypp::RepoManager::BuildIfNeeded, load_subprogress);
+ }
+ }
+
+ repomanager.loadFromCache(repoinfo);
+ repo->setLoaded();
+ //y2milestone("Loaded %zd resolvables", store.size());
+ }
+ catch(const zypp::repo::RepoNotCachedException &excpt )
+ {
+ if (!autorefresh_skipped)
+ {
+ std::string alias = repoinfo.alias();
+ zypp::Url url(repoinfo.url());
+ y2error ("Resolvables from '%s' havn't been loaded: %s", alias.c_str(), excpt.asString().c_str());
+ _last_error.setLastError("'" + alias + "': " + url.asString() + "\n" + ExceptionAsString(excpt));
+ success = false;
+ }
+ else
+ {
+ y2internal("Autorefresh disabled, the cache is missing -> cannot load resolvables");
+ }
+
+ // FIXME ??
+ /*
+ // disable the source
+ y2error("Disabling source %s", url.c_str());
+ repo->disable();
+ */
+ }
+ catch (const zypp::Exception& excpt)
+ {
+ std::string alias = repoinfo.alias();
+ y2internal("Error: Loading resolvables failed: %s", ExceptionAsString(excpt).c_str());
+ _last_error.setLastError("'" + alias + "': " + ExceptionAsString(excpt));
+ success = false;
+ }
+
+ unsigned int size_end = zypp_ptr()->pool().size();
+ y2milestone("Pool size at end: %d (loaded %d resolvables)", size_end, size_end - size_start);
+
+ prog.toMax();
+
+ return success;
+}
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Save.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Save.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Save.cc Wed May 11 11:22:32 2011
@@ -0,0 +1,295 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2007 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id: Source_Save.cc 63716 2011-04-05 11:33:32Z lslezak $
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: Functions for saving repository configuration
+ Namespace: Pkg
+*/
+
+#include <Callbacks.h>
+#include <Callbacks.YCP.h>
+
+#include <PkgModuleFunctions.h>
+#include "log.h"
+#include <PkgProgress.h>
+
+#include <HelpTexts.h>
+
+/*
+ Textdomain "pkg-bindings"
+*/
+
+/****************************************************************************************
+ * @builtin SourceReleaseAll
+ *
+ * @short Release all medias hold by all sources
+ * Warning: It also deletes the downloaded files!
+ * @return boolean
+ **/
+YCPValue
+PkgModuleFunctions::SourceReleaseAll ()
+{
+ y2milestone("Releasing all sources...");
+ bool ret = true;
+
+ y2milestone("Removing all tmp directories");
+ tmp_dirs.clear();
+
+ for (RepoCont::iterator it = repos.begin();
+ it != repos.end(); ++it)
+ {
+ try
+ {
+ (*it)->mediaAccess()->release();
+ }
+ catch (const zypp::media::MediaException & ex)
+ {
+ y2warning("Failed to release media for repo: %s", ex.msg().c_str());
+ ret = false;
+ }
+ }
+
+ return YCPBoolean(ret);
+}
+
+/******************************************************************************
+ * @builtin SourceSaveAll
+ *
+ * @short Save all InstSrces.
+ * @return boolean
+ **/
+YCPValue
+PkgModuleFunctions::SourceSaveAll ()
+{
+ y2milestone("Saving the source setup...");
+ bool ret = true;
+
+ // nothing to save, return success
+ if (repos.empty() && service_manager.empty())
+ {
+ y2debug("No repository or service defined, saving skipped");
+ return YCPBoolean(ret);
+ }
+
+ zypp::RepoManager repomanager = CreateRepoManager();
+
+ // save the services
+ try
+ {
+ service_manager.SaveServices(repomanager);
+ y2milestone("All services have been saved");
+ }
+ catch (const zypp::Exception& excpt)
+ {
+ _last_error.setLastError(ExceptionAsString(excpt));
+ ret = false;
+ }
+
+ // count removed repos
+ int removed_repos = 0;
+ for (RepoCont::iterator it = repos.begin();
+ it != repos.end(); ++it)
+ {
+ // the repo has been removed
+ if ((*it)->isDeleted())
+ {
+ removed_repos++;
+ }
+ }
+
+ y2debug("Found %d removed repositories", removed_repos);
+
+ // number of steps:
+ // for removed repository: 3 (remove metadata, remove from cache, remove .repo file)
+ // for other repositories: 1 (just save/update .repo file)
+ // (so there are 2 extra steps for removed repos)
+ int save_steps = 2*removed_repos + repos.size();
+
+ PkgProgress pkgprogress(_callbackHandler);
+ std::list<std::string> stages;
+
+ if (removed_repos > 0)
+ {
+ stages.push_back(_("Remove Repositories"));
+ }
+
+
+ // stages: "download", "build cache"
+ stages.push_back(_("Save Repositories"));
+
+ // set number of step
+ zypp::ProgressData prog_total(save_steps);
+ // set the receiver
+ prog_total.sendTo(pkgprogress.Receiver());
+
+ // start the process
+ pkgprogress.Start(_("Saving Repositories..."), stages, _(HelpTexts::save_help));
+
+ // remove deleted repos (the old configurations) at first
+ for (RepoCont::iterator it = repos.begin();
+ it != repos.end(); ++it)
+ {
+ // the repo has been removed
+ if ((*it)->isDeleted())
+ {
+ std::string repo_alias = (*it)->repoInfo().alias();
+
+ try
+ {
+ // remove the metadata
+ zypp::RepoStatus raw_metadata_status = repomanager.metadataStatus((*it)->repoInfo());
+ if (!raw_metadata_status.empty())
+ {
+ y2milestone("Removing metadata for source '%s'...", repo_alias.c_str());
+ repomanager.cleanMetadata((*it)->repoInfo());
+ }
+ prog_total.incr();
+
+ // remove the cache
+ if (repomanager.isCached((*it)->repoInfo()))
+ {
+ y2milestone("Removing cache for '%s'...", repo_alias.c_str());
+ repomanager.cleanCache((*it)->repoInfo());
+ }
+ prog_total.incr();
+
+ // does the repository exist?
+ repomanager.getRepositoryInfo(repo_alias);
+ y2milestone("Removing repository '%s'", repo_alias.c_str());
+ repomanager.removeRepository((*it)->repoInfo());
+ prog_total.incr();
+ }
+ catch (const zypp::repo::RepoNotFoundException &ex)
+ {
+ // repository not found -- not critical, continue
+ y2warning("No such repository: %s", repo_alias.c_str());
+ }
+ catch (const zypp::Exception & excpt)
+ {
+ y2error("Pkg::SourceSaveAll has failed: %s", excpt.msg().c_str() );
+ _last_error.setLastError(ExceptionAsString(excpt));
+ return YCPBoolean(false);
+ }
+ }
+ }
+
+ if (removed_repos > 0)
+ {
+ pkgprogress.NextStage();
+ }
+
+ // save all repos (the current configuration)
+ for (RepoCont::iterator it = repos.begin();
+ it != repos.end(); ++it)
+ {
+ if (!(*it)->isDeleted())
+ {
+ std::string current_alias = (*it)->repoInfo().alias();
+
+ try
+ {
+ try
+ {
+ // if the repository already exists then just modify it
+ repomanager.getRepositoryInfo(current_alias);
+ y2milestone("Modifying repository '%s'", current_alias.c_str());
+ repomanager.modifyRepository(current_alias, (*it)->repoInfo());
+ }
+ catch (const zypp::repo::RepoNotFoundException &ex)
+ {
+ // the repository was not found, add it
+ y2milestone("Adding repository '%s'", current_alias.c_str());
+ repomanager.addRepository((*it)->repoInfo());
+ }
+ }
+ catch (zypp::Exception & excpt)
+ {
+ y2error("Pkg::SourceSaveAll has failed: %s", excpt.msg().c_str() );
+ _last_error.setLastError(ExceptionAsString(excpt));
+ return YCPBoolean(false);
+ }
+
+ prog_total.incr();
+ }
+ }
+
+ y2milestone("All sources have been saved");
+
+ return YCPBoolean(ret);
+}
+
+/****************************************************************************************
+ * @builtin SourceFinishAll
+ *
+ * @short Release all instalation sources
+ * @description
+ * Release all known installation repositories. Releasing is done automaticaly in Pkg::
+ * destructor, but can be done explicitly to force reloading of registered repositories.
+ * Use SourceSaveAll() to not loose the new registered sources before calling SourceFinishAll()!
+ * @return boolean true on success
+ **/
+YCPValue
+PkgModuleFunctions::SourceFinishAll ()
+{
+ try
+ {
+ y2milestone( "Unregistering all sources...") ;
+
+ // remove all resolvables
+ for (RepoCont::iterator it = repos.begin();
+ it != repos.end(); ++it)
+ {
+ RemoveResolvablesFrom(*it);
+ }
+
+ // release all repositories
+ repos.clear();
+
+ // release all services
+ service_manager.Reset();
+ }
+ catch (zypp::Exception & excpt)
+ {
+ y2error("Pkg::SourceFinishAll has failed: %s", excpt.msg().c_str() );
+ _last_error.setLastError(ExceptionAsString(excpt));
+ return YCPBoolean(false);
+ }
+
+ y2milestone("All sources and services have been unregistered");
+
+ return YCPBoolean(true);
+}
+
+
+/****************************************************************************************
+ * @builtin SourceFinish
+ * @short Disable an Installation Source - obsoleted
+ * @param integer SrcId Specifies the InstSrc.
+ * @return boolean
+ **/
+YCPValue
+PkgModuleFunctions::SourceFinish (const YCPInteger& id)
+{
+ y2warning("Pkg::SourceFinish() is obsoleted, use Pkg::SourceSetEnabled(id, false) instead");
+ return SourceSetEnabled(id, false);
+}
+
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Set.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Set.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source_Set.cc Wed May 11 11:22:32 2011
@@ -0,0 +1,426 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2007 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id: Source_Set.cc 63716 2011-04-05 11:33:32Z lslezak $
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: Functions for changing properties of a repository
+ Namespace: Pkg
+*/
+
+#include <Callbacks.h>
+#include <Callbacks.YCP.h>
+
+#include <PkgModuleFunctions.h>
+#include "log.h"
+
+#include <PkgProgress.h>
+#include <HelpTexts.h>
+
+/*
+ Textdomain "pkg-bindings"
+*/
+
+/****************************************************************************************
+ * @builtin SourceSetEnabled
+ *
+ * @short Set the default activation state of an InsrSrc.
+ * @param integer SrcId Specifies the InstSrc.
+ * @param boolean enabled Default activation state of source.
+ *
+ * @return boolean
+ **/
+YCPValue
+PkgModuleFunctions::SourceSetEnabled (const YCPInteger& id, const YCPBoolean& e)
+{
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ return YCPBoolean(false);
+
+ // no change required
+ bool enable = e->value();
+ if ((enable && repo->repoInfo().enabled())
+ || (!enable && !repo->repoInfo().enabled()))
+ return YCPBoolean(true);
+
+ bool success = true;
+
+ try
+ {
+ repo->repoInfo().setEnabled(enable);
+
+ // add/remove resolvables
+ if (enable)
+ {
+ // load resolvables only when they haven't been loaded yet
+ if (!repo->isLoaded())
+ {
+ std::list<std::string> stages;
+ stages.push_back(_("Load Data"));
+
+ PkgProgress pkgprogress(_callbackHandler);
+ zypp::ProgressData prog_total(100);
+ prog_total.sendTo(pkgprogress.Receiver());
+ zypp::CombinedProgressData load_subprogress(prog_total, 100);
+
+ pkgprogress.Start(_("Loading the Package Manager..."), stages, _(HelpTexts::load_resolvables));
+
+ success = LoadResolvablesFrom(repo, load_subprogress);
+ }
+ }
+ else
+ {
+ // the source has been disabled, remove resolvables from the pool
+ RemoveResolvablesFrom(repo);
+ }
+
+ PkgFreshen();
+ }
+ catch (const zypp::Exception& excpt)
+ {
+ std::string alias = repo->repoInfo().alias();
+ y2error ("Error for '%s': %s", alias.c_str(), excpt.asString().c_str());
+ _last_error.setLastError(alias + ": " + ExceptionAsString(excpt));
+ success = false;
+ }
+
+ return YCPBoolean(success);
+}
+
+/****************************************************************************************
+ * @builtin SourceSetAutorefresh
+ *
+ * @short Set whether this source should automaticaly refresh it's
+ * meta data when it gets enabled. (default true, if not CD/DVD)
+ * @param integer SrcId Specifies the InstSrc.
+ * @param boolean enabled Whether autorefresh should be turned on or off.
+ *
+ * @return boolean
+ **/
+YCPValue
+PkgModuleFunctions::SourceSetAutorefresh (const YCPInteger& id, const YCPBoolean& e)
+{
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ return YCPBoolean(false);
+
+ repo->repoInfo().setAutorefresh(e->value());
+
+ return YCPBoolean( true );
+}
+
+/****************************************************************************************
+ * @builtin SourceEditSet
+ *
+ * @short Configure properties of installation sources
+ * @description
+ * Set states of installation sources. Note: Enabling/disabling a source does not
+ * (un)load the packages from the source! Use SourceSetEnabled() if you need to refresh
+ * the packages in the pool.
+ *
+ * @param list source_states List of source states. Same format as returned by
+ * @see SourceEditGet.
+ *
+ * @return boolean
+ **/
+YCPValue
+PkgModuleFunctions::SourceEditSet (const YCPList& states)
+{
+ bool error = false;
+
+ for (int index = 0; index < states->size(); index++ )
+ {
+ if( ! states->value(index)->isMap() )
+ {
+ y2error( "Pkg::SourceEditSet, entry not a map at index %d", index);
+ error = true;
+ continue;
+ }
+
+ YCPMap descr = states->value(index)->asMap();
+
+ if (descr->value( YCPString("SrcId") ).isNull() || !descr->value(YCPString("SrcId"))->isInteger())
+ {
+ y2error( "Pkg::SourceEditSet, SrcId not defined for a source description at index %d", index);
+ error = true;
+ continue;
+ }
+
+ RepoId id = descr->value( YCPString("SrcId") )->asInteger()->value();
+
+ YRepo_Ptr repo = logFindRepository(id);
+ if (!repo)
+ {
+ y2error( "Pkg::SourceEditSet, source %d not found", index);
+ error = true;
+ continue;
+ }
+
+ // now, we have the source
+ if( ! descr->value( YCPString("enabled")).isNull() && descr->value(YCPString("enabled"))->isBoolean ())
+ {
+ bool enable = descr->value(YCPString("enabled"))->asBoolean ()->value();
+
+ if (repo->repoInfo().enabled() != enable)
+ {
+ y2warning("Pkg::SourceEditSet() does not refresh the pool (src: %zd, state: %s)", id, enable ? "disabled -> enabled" : "enabled -> disabled");
+ }
+
+ y2debug("set enabled: %d", enable);
+ repo->repoInfo().setEnabled(enable);
+ }
+
+ if( !descr->value(YCPString("autorefresh")).isNull() && descr->value(YCPString("autorefresh"))->isBoolean ())
+ {
+ bool autorefresh = descr->value(YCPString("autorefresh"))->asBoolean()->value();
+ y2debug("set autorefresh: %d", autorefresh);
+ repo->repoInfo().setAutorefresh( autorefresh );
+ }
+
+ if( !descr->value(YCPString("name")).isNull() && descr->value(YCPString("name"))->isString())
+ {
+ // rename the source
+ y2debug("set name: %s", descr->value(YCPString("name"))->asString()->value().c_str());
+ repo->repoInfo().setName(descr->value(YCPString("name"))->asString()->value());
+ }
+
+ if( !descr->value(YCPString("priority")).isNull() && descr->value(YCPString("priority"))->isInteger())
+ {
+ unsigned int priority = descr->value(YCPString("priority"))->asInteger()->value();
+
+ // set the priority
+ repo->repoInfo().setPriority(priority);
+ y2debug("set priority: %d", priority);
+ }
+
+ if(!descr->value(YCPString("keeppackages")).isNull() && descr->value(YCPString("keeppackages"))->isBoolean())
+ {
+ bool keeppackages = descr->value(YCPString("keeppackages"))->asBoolean()->value();
+ y2debug("set keeppackages: %d", keeppackages);
+ repo->repoInfo().setKeepPackages( keeppackages );
+ }
+ }
+
+ PkgFreshen();
+ return YCPBoolean( !error );
+}
+
+/****************************************************************************************
+ * @builtin SourceChangeUrl
+ * @short Change Source URL
+ * @description
+ * Change url of an InstSrc. Used primarely when re-starting during installation
+ * and a cd-device changed from hdX to srX since ide-scsi was activated.
+ * @param integer SrcId Specifies the InstSrc.
+ * @param string url The new url to use.
+ * @return boolean
+ **/
+YCPValue
+PkgModuleFunctions::SourceChangeUrl (const YCPInteger& id, const YCPString& u)
+{
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ return YCPBoolean(false);
+
+ try
+ {
+ if (repo->repoInfo().baseUrlsSize() > 1)
+ {
+ // store current urls
+ std::set<zypp::Url> baseUrls (repo->repoInfo().baseUrlsBegin(), repo->repoInfo().baseUrlsEnd());
+
+ // reset url list and store the new one there
+ repo->repoInfo().setBaseUrl(zypp::Url(u->value()));
+
+ // add the rest of base urls
+ for (std::set<zypp::Url>::const_iterator i = baseUrls.begin();
+ i != baseUrls.end(); ++i)
+ repo->repoInfo().addBaseUrl(*i);
+ }
+ else
+ repo->repoInfo().setBaseUrl(zypp::Url(u->value()));
+ }
+ catch (const zypp::Exception & excpt)
+ {
+ _last_error.setLastError(ExceptionAsString(excpt));
+ y2error ("Cannot set the new URL for source %s (%lld): %s",
+ repo->repoInfo().alias().c_str(), id->asInteger()->value(), excpt.msg().c_str());
+ return YCPBoolean(false);
+ }
+
+ return YCPBoolean(true);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+//
+// DEPRECATED
+//
+/////////////////////////////////////////////////////////////////////////////////////////
+
+/****************************************************************************************
+ * Pkg::SourceRaisePriority (integer SrcId) -> bool
+ *
+ * Raise priority of source.
+ *
+ * @param SrcId Specifies the InstSrc.
+ *
+ * @return bool
+ **/
+YCPValue
+PkgModuleFunctions::SourceRaisePriority (const YCPInteger& id)
+{
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ return YCPBoolean(false);
+
+ // check the current priority
+ unsigned int prio = repo->repoInfo().priority();
+
+ // maximum priority already reached - priority is 1 (max.) to 99 (min.)
+ if (prio <= 1)
+ {
+ return YCPBoolean(false);
+ }
+ else
+ {
+ // increase the priority
+ prio--;
+
+ // set the new priority
+ repo->repoInfo().setPriority(prio);
+ }
+
+ return YCPBoolean(true);
+}
+
+/****************************************************************************************
+ * Pkg::SourceLowerPriority (integer SrcId) -> void
+ *
+ * Lower priority of source.
+ *
+ * @param SrcId Specifies the InstSrc.
+ *
+ * @return bool
+ */
+YCPValue
+PkgModuleFunctions::SourceLowerPriority (const YCPInteger& id)
+{
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ return YCPBoolean(false);
+
+ // check the current priority
+ unsigned int prio = repo->repoInfo().priority();
+
+ // manimum priority already reached - priority is 1 (max.) to 99 (min.)
+ if (prio >= 99)
+ {
+ return YCPBoolean(false);
+ }
+ else
+ {
+ // decrease the priority
+ prio++;
+
+ // set the new priority
+ repo->repoInfo().setPriority(prio);
+ }
+
+ return YCPBoolean(true);
+}
+
+/****************************************************************************************
+ * Pkg::SourceSaveRanks () -> boolean
+ *
+ * @short Obsoleted function, do not use
+ * @return boolean true
+ **/
+YCPValue
+PkgModuleFunctions::SourceSaveRanks ()
+{
+ y2error( "SourceSaveRanks not implemented" );
+
+ return YCPBoolean( true );
+}
+
+/****************************************************************************************
+ * @builtin SourceInstallOrder
+ *
+ * @short not implemented, do not use (Explicitly set an install order.)
+ * @return boolean
+ **/
+YCPValue
+PkgModuleFunctions::SourceInstallOrder (const YCPMap& ord)
+{
+#warning SourceInstallOrder is not implemented
+ return YCPBoolean( true );
+}
+
+
+/****************************************************************************************
+ * @builtin SourceDelete
+ * @short Delete a Source
+ * @description
+ * Delete an InsrSrc. The InsrSrc together with all metadata cached on disk
+ * is removed. The SrcId passed becomes invalid (other SrcIds stay valid).
+ *
+ * @param integer SrcId Specifies the InstSrc.
+ *
+ * @return boolean
+ **/
+YCPValue
+PkgModuleFunctions::SourceDelete (const YCPInteger& id)
+{
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ return YCPBoolean(false);
+
+ bool success = true;
+ const std::string repo_alias(repo->repoInfo().alias());
+
+ try
+ {
+
+ // the resolvables cannot be used anymore, remove them
+ RemoveResolvablesFrom(repo);
+
+ // update 'repos'
+ repo->setDeleted();
+
+ // removing the base product repository?
+ if (base_product && base_product->repoInfo().alias() == repo_alias)
+ {
+ y2warning("Resetting the base product, the base product repository has been removed");
+ base_product = NULL;
+ }
+
+ PkgFreshen();
+ }
+ catch (const zypp::Exception& excpt)
+ {
+ y2error ("Error for '%s': %s", repo_alias.c_str(), excpt.asString().c_str());
+ _last_error.setLastError(repo_alias + ": " + ExceptionAsString(excpt));
+ success = false;
+ }
+
+ return YCPBoolean(success);
+}
+
+
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Target.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Target.cc (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Target.cc Wed May 11 11:22:32 2011
@@ -42,7 +42,8 @@
#include <zypp/Locks.h>
#include <zypp/DiskUsageCounter.h>
-#include <PkgProgress.h>
+#include "PkgProgress.h"
+#include "HelpTexts.h"
using namespace zypp;
@@ -73,7 +74,7 @@
stages.push_back(_("Read Installed Packages"));
PkgProgress pkgprogress(_callbackHandler);
- pkgprogress.Start(_("Loading the Package Manager..."), stages, _(""));
+ pkgprogress.Start(_("Loading the Package Manager..."), stages, _(HelpTexts::load_resolvables));
try
{
@@ -162,7 +163,7 @@
PkgProgress pkgprogress(_callbackHandler);
- pkgprogress.Start(_("Loading the Package Manager..."), stages, _(""));
+ pkgprogress.Start(_("Loading the Package Manager..."), stages, _(HelpTexts::load_resolvables));
try
{
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Utils.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Utils.cc (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Utils.cc Wed May 11 11:22:32 2011
@@ -15,3 +15,4 @@
return ret;
}
+
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/i18n.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/i18n.h (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/i18n.h Wed May 11 11:22:32 2011
@@ -0,0 +1,39 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2007 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id$
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: definition of _() translation macro
+*/
+
+// textdomain
+extern "C" {
+#include <libintl.h>
+}
+
+// undefine _ macro from libzypp
+#ifdef _
+#undef _
+#endif
+
+// define new _ macro
+#define _(MSG) ::dgettext("pkg-bindings", MSG)
+
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63941 - /branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source.loT
by dmacvicar@svn2.opensuse.org 10 May '11
by dmacvicar@svn2.opensuse.org 10 May '11
10 May '11
Author: dmacvicar
Date: Tue May 10 20:11:06 2011
New Revision: 63941
URL: http://svn.opensuse.org/viewcvs/yast?rev=63941&view=rev
Log:
binary
Removed:
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source.loT
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63940 - /branches/tmp/dmacvicar/zc10/pkg-bindings/src/
by dmacvicar@svn2.opensuse.org 10 May '11
by dmacvicar@svn2.opensuse.org 10 May '11
10 May '11
Author: dmacvicar
Date: Tue May 10 20:10:47 2011
New Revision: 63940
URL: http://svn.opensuse.org/viewcvs/yast?rev=63940&view=rev
Log:
More porting
Added:
branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgProgress.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgProgress.h
branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgService.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgService.h
branches/tmp/dmacvicar/zc10/pkg-bindings/src/ServiceManager.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/ServiceManager.h
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source.loT
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Utils.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Utils.h
branches/tmp/dmacvicar/zc10/pkg-bindings/src/YRepo.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/YRepo.h
branches/tmp/dmacvicar/zc10/pkg-bindings/src/log.h
Modified:
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Package.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.h
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Resolvable.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Selection.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Target.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/ycpTools.h
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am Tue May 10 20:10:47 2011
@@ -22,7 +22,11 @@
Y2CCPkg.cc Y2CCPkg.h \
ycpTools.cc ycpTools.h \
PkgModule.cc PkgModule.h \
- YRepo.h YRepo.cc
+ YRepo.h YRepo.cc \
+ PkgProgress.cc PkgProgress.h \
+ Utils.h Utils.cc \
+ ServiceManager.cc ServiceManager.h \
+ PkgService.cc PkgService.h \
PkgModuleFunctions.h \
PkgModuleFunctions.cc \
Package.cc \
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Package.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Package.cc (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Package.cc Tue May 10 20:10:47 2011
@@ -32,9 +32,9 @@
#include <ycp/YCPList.h>
#include <ycp/YCPMap.h>
+#include <zypp/base/Regex.h>
#include <zypp/base/Algorithm.h>
#include <zypp/ResFilters.h>
-#include <zypp/CapFilters.h>
#include <zypp/ResStatus.h>
#include <zypp/base/String.h>
@@ -43,12 +43,9 @@
#include <zypp/Patch.h>
#include <zypp/SrcPackage.h>
#include <zypp/Product.h>
-#include <zypp/SourceManager.h>
-#include <zypp/UpgradeStatistics.h>
#include <zypp/target/rpm/RpmDb.h>
#include <zypp/target/TargetException.h>
#include <zypp/ZYppCommit.h>
-#include <zypp/ResPoolManager.h>
#include <fstream>
#include <sstream>
@@ -59,6 +56,118 @@
typedef std::list<PoolItem> PoolItemList;
}
+// helper function - create a symbolic link to the created base product (by SourceCreateBase() function)
+// returns 'true' on success
+// see http://en.opensuse.org/Product_Management/Code11/installed
+bool PkgModuleFunctions::CreateBaseProductSymlink()
+{
+ if (base_product)
+ {
+ y2milestone("Creating symlink for the base product...");
+
+ // get the package
+ zypp::sat::Solvable refsolvable = base_product->referencePackage();
+
+ if (refsolvable != zypp::sat::Solvable::noSolvable)
+ {
+ // create a package pointer from the SAT solvable
+ zypp::Package::Ptr refpkg(zypp::make<zypp::Package>(refsolvable));
+
+ if (refpkg)
+ {
+ y2milestone("Found reference package for the base product: %s-%s",
+ refpkg->name().c_str(), refpkg->edition().asString().c_str());
+
+ // get the package files
+ zypp::Package::FileList files( refpkg->filelist() );
+ y2milestone("The reference package has %d files", files.size());
+
+ std::string product_file;
+ zypp::str::smatch what;
+ const zypp::str::regex product_file_regex("^/etc/products\\.d/(.*\\.prod)$");
+
+ // find the product file
+ for_(iter, files.begin(), files.end())
+ {
+ if (zypp::str::regex_match(*iter, what, product_file_regex))
+ {
+ product_file = what[1];
+ break;
+ }
+ }
+
+ if (product_file.empty())
+ {
+ y2error("The product file has not been found");
+ return false;
+ }
+ else
+ {
+ y2milestone("Found product file %s", product_file.c_str());
+
+ // check and remove the existing link (refresh the link after upgrade)
+ const zypp::Pathname base_link(_target_root / "/etc/products.d/baseproduct");
+
+ struct stat stat_buf;
+ if (::stat(base_link.asString().c_str(), &stat_buf) == 0)
+ {
+ // the file exists, remove it
+ if (::unlink(base_link.asString().c_str()) != 0)
+ {
+ y2error("Cannot remove base link file %s: %s",
+ base_link.asString().c_str(),
+ ::strerror(errno)
+ );
+
+ return false;
+ }
+ }
+ // ENOENT == "No such file or directory", see 'man errno'
+ else if (errno != ENOENT)
+ {
+ y2error("Cannot stat %s file: %s", base_link.asString().c_str(), ::strerror(errno));
+ return false;
+ }
+ else
+ {
+ y2debug("Link %s does not exist", base_link.asString().c_str());
+ }
+
+ if (::symlink(product_file.c_str(), base_link.asString().c_str()) != 0)
+ {
+ y2error("Cannot create symlink %s -> %s: %s",
+ base_link.asString().c_str(),
+ product_file.c_str(),
+ ::strerror(errno)
+ );
+
+ return false;
+ }
+ else
+ {
+ y2milestone("Symlink %s -> %s has been created", base_link.asString().c_str(), product_file.c_str());
+ }
+ }
+ }
+ else
+ {
+ y2error("The reference solvable is not a package");
+ return false;
+ }
+ }
+ else
+ {
+ y2milestone("The base product doesn't have any reference package");
+ }
+ }
+ else
+ {
+ y2debug("A base product has not been added");
+ }
+
+ return true;
+}
+
// ------------------------
/**
* @builtin PkgQueryProvides
@@ -252,8 +361,8 @@
return res;
}
-static YCPValue
-PkgMediaSizesOrCount (bool sizes, bool download_size)
+YCPValue
+PkgModuleFunctions::PkgMediaSizesOrCount (bool sizes, bool download_size)
{
// all enabled sources
std::list<RepoId> source_ids;
@@ -513,310 +622,21 @@
return YCPBoolean(false);
}
-
-struct ProvideProcess
-{
- zypp::PoolItem_Ref item;
- zypp::Arch _architecture;
- zypp::ResStatus::TransactByValue whoWantsIt;
- std::string version;
- bool onlyNeeded;
-
- ProvideProcess( zypp::Arch arch, const std::string &vers, const bool oNeeded)
- : _architecture( arch ), whoWantsIt(zypp::ResStatus::APPL_HIGH), version(vers), onlyNeeded(oNeeded)
- { }
-
- bool operator()( zypp::PoolItem provider )
- {
- // 1. compatible arch
- // 2. best arch
- // 3. best edition
- // see QueueItemRequire in zypp/solver/detail, RequireProcess
-
- // check the version if it's specified
- if (!version.empty() && version != provider->edition().asString())
- {
- y2milestone("Skipping version %s (requested: %s)", provider->edition().asString().c_str(), version.c_str());
- return true;
- }
-
- if (!provider.status().isInstalled()
- && (!onlyNeeded || provider.status().isNeeded()) ) // take only needed items (e.G. needed patches)
- {
- // deselect the item if it's already selected,
- // only one item should be selected
- if (provider.status().isToBeInstalled())
- {
- provider.status().resetTransact(whoWantsIt);
- }
-
- // regarding items which are installable only
- if (!provider->arch().compatibleWith( _architecture )) {
- y2milestone ("provider %s has incompatible arch '%s'", provider->name().c_str(), provider->arch().asString().c_str());
- }
- else if (!item) { // no provider yet
- item = provider;
- }
- else if (item->arch().compare( provider->arch() ) < 0) { // provider has better arch
- item = provider;
- }
- else if (item->edition().compare( provider->edition() ) < 0) {
- item = provider; // provider has better edition
- }
- }
-
- return true;
- }
-
-};
-
-
-/**
- * helper function, install a resolvable with a specific name and kind
-*/
-
-bool
-PkgModuleFunctions::DoProvideNameKind( const std::string & name, zypp::Resolvable::Kind kind, zypp::Arch architecture,
- const std::string & version ,const bool onlyNeeded)
-{
- try
- {
- ProvideProcess info( architecture, version, onlyNeeded);
- info.whoWantsIt = whoWantsIt;
-
- invokeOnEach( zypp_ptr()->pool().byNameBegin( name ),
- zypp_ptr()->pool().byNameEnd( name ),
- zypp::resfilter::ByKind( kind ),
- zypp::functor::functorRef<bool,zypp::PoolItem> (info)
- );
-
- if (!info.item)
- return false;
-
- bool result = info.item.status().setToBeInstalled( whoWantsIt );
- if (!result) {
- std::ostringstream os;
- os << info.item;
- y2milestone( "DoProvideNameKind failed for %s\n", os.str().c_str() );
- }
- return true;
- }
- catch (...)
- {
- }
-
- return false;
-}
-
-/*
- * Helper function
- */
-bool
-PkgModuleFunctions::DoAllKind(zypp::Resolvable::Kind kind, bool provide)
-{
- bool ret = true;
-
- try
- {
- for (zypp::ResPool::byKind_iterator it = zypp_ptr()->pool().byKindBegin(kind);
- it != zypp_ptr()->pool().byKindEnd(kind); ++it)
- {
- bool res = provide ? it->status().setToBeInstalled( whoWantsIt )
- : (it->status().isInstalled() && it->status().setToBeUninstalled( whoWantsIt ));
-
- y2milestone ("%s %s -> %s\n", (provide ? "Install" : "Remove"), (*it)->name().c_str(), (res ? "Ok" : "Failed"));
- ret = ret && res;
- }
- }
- catch (...)
- {
- ret = false;
- }
-
- return ret;
-}
-
-bool
-PkgModuleFunctions::DoProvideAllKind(zypp::Resolvable::Kind kind)
-{
- return DoAllKind(kind, true);
-}
-
-bool
-PkgModuleFunctions::DoRemoveAllKind(zypp::Resolvable::Kind kind)
-{
- return DoAllKind(kind, false);
-}
-
-
-
-/**
- * helper function, deinstall a kind which provides tag (as a
- * kind name, a provided tag, or a provided file
- *
- * !!!!**** WARNING: This is different from DoProvideNameKind ****!!!!
-*/
-
-bool
-PkgModuleFunctions::DoRemoveNameKind( const std::string & name, zypp::Resolvable::Kind kind)
-{
- zypp::Dep dep( zypp::Dep::PROVIDES );
- CaIMatch match;
-
- try
- {
- // look for installed packages
- invokeOnEach( zypp_ptr()->pool().byCapabilityIndexBegin( name, dep ),
- zypp_ptr()->pool().byCapabilityIndexEnd( name, dep ),
- zypp::functor::chain( zypp::resfilter::ByCaIInstalled(),
- zypp::resfilter::ByCaIKind( kind ) ),
- zypp::functor::functorRef<bool,zypp::CapAndItem>( match ) );
- }
- catch (...)
- {
- return false;
- }
-
- if (!match.item)
- return false;
-
- bool result = match.item.status().setToBeUninstalled( whoWantsIt );
- y2milestone ("DoRemoveNameKind %s -> %s\n", name.c_str(), (result ? "Ok" : "Bad"));
-
- return true;
-}
-
-// ------------------------
-/**
- @builtin DoProvide
- @short Install a list of packages to the system
- @description
- Provides (read: installs) a list of tags to the system
-
- tag is a package name
-
- returns a map of tag,reason pairs if tags could not be provided.
- Usually this map should be empty (all required packages are
- installed)
-
- If tags could not be provided (due to package install failures or
- conflicts), the tag is listed as a key and the value describes
- the reason for the failure (as an already translated string).
- @param list tags
- @return map
-*/
-YCPValue
-PkgModuleFunctions::DoProvide (const YCPList& tags)
-{
- YCPMap ret;
- if (tags->size() > 0)
- {
- for (int i = 0; i < tags->size(); ++i)
- {
- if (tags->value(i)->isString())
- {
- DoProvideNameKind (tags->value(i)->asString()->value(), zypp::ResTraits<zypp::Package>::kind, zypp_ptr()->architecture(), "");
- }
- else
- {
- y2error ("Pkg::DoProvide not string '%s'", tags->value(i)->toString().c_str());
- }
- }
- }
-# warning error handling - return value
- return ret;
-}
-
-
-// ------------------------
-/**
- @builtin DoRemove
-
- @short Removes a list of packges from the system
- @description
- tag is a package name
-
- returns a map of tag,reason pairs if tags could not be removed.
- Usually this map should be empty (all required packages are
- removed)
-
- If a tag could not be removed (because other packages still
- require it), the tag is listed as a key and the value describes
- the reason for the failure (as an already translated string).
- @param list tags
- @return list Result
-*/
-YCPValue
-PkgModuleFunctions::DoRemove (const YCPList& tags)
-{
- YCPMap ret;
- if (tags->size() > 0)
- {
- for (int i = 0; i < tags->size(); ++i)
- {
- if (tags->value(i)->isString())
- {
- DoRemoveNameKind( tags->value(i)->asString()->value(), zypp::ResTraits<zypp::Package>::kind);
- }
- else
- {
- y2error ("Pkg::DoRemove not string '%s'", tags->value(i)->toString().c_str());
- }
- }
- }
- return ret;
-}
-
-// ------------------------
-
-struct ItemMatch
-{
- zypp::PoolItem_Ref item;
-
- bool operator() (const zypp::PoolItem_Ref i )
- {
- item = i;
- return false;
- }
-};
-
-static zypp::Package::constPtr
-find_package( const string & name, zypp::PoolItem_Ref & item, zypp::ResPool pool )
+static zypp::Package::constPtr find_package(const string &name)
{
if (name.empty())
return NULL;
- ItemMatch match;
-
- // look for uninstalled packages first, because they probably have
- // translated summary
-
- invokeOnEach( pool.byNameBegin( name ),
- pool.byNameEnd( name ),
- zypp::functor::chain( zypp::resfilter::ByUninstalled(),
- zypp::resfilter::ByKind( zypp::ResTraits<zypp::Package>::kind ) ),
- zypp::functor::functorRef<bool,zypp::PoolItem_Ref>( match ) );
+ zypp::ui::Selectable::Ptr s = zypp::ui::Selectable::get(name);
- // if no match yet, try again with installed package
- // (but those only provide an english summary)
-
- if (!match.item) {
- invokeOnEach( pool.byNameBegin( name ),
- pool.byNameEnd( name ),
- zypp::functor::chain( zypp::resfilter::ByInstalled(),
- zypp::resfilter::ByKind( zypp::ResTraits<zypp::Package>::kind ) ),
- zypp::functor::functorRef<bool,zypp::PoolItem_Ref>( match ) );
+ if (s)
+ {
+ return zypp::dynamic_pointer_cast<const zypp::Package>(s->theObj().resolvable());
}
- if (!match.item)
- return NULL;
-
- item = match.item;
-
- return zypp::asKind<zypp::Package>( match.item.resolvable() );
+ return NULL;
}
-
/**
@builtin PkgSummary
@@ -826,22 +646,19 @@
@usage Pkg::PkgSummary (string package) -> "This is a nice package"
*/
-#warning This is bogus, as we have multiple matching packages
-
YCPValue
PkgModuleFunctions::PkgSummary (const YCPString& p)
{
try
{
- zypp::PoolItem_Ref item;
- zypp::Package::constPtr pkg = find_package( p->value(), item, zypp_ptr()->pool() );
+ zypp::Package::constPtr pkg = find_package(p->value());
if (pkg == NULL)
{
return YCPVoid();
}
- return YCPString( pkg->summary() );
+ return YCPString(pkg->summary());
}
catch (...)
{
@@ -861,15 +678,12 @@
*/
-#warning This is bogus, as we have multiple matching packages
-
YCPValue
PkgModuleFunctions::PkgVersion (const YCPString& p)
{
try
{
- zypp::PoolItem_Ref item;
- zypp::Package::constPtr pkg = find_package( p->value(), item, zypp_ptr()->pool() );
+ zypp::Package::constPtr pkg = find_package(p->value());
if (pkg == NULL)
{
@@ -895,22 +709,20 @@
@usage Pkg::PkgSize (string package) -> 12345678
*/
-#warning This is bogus, as we have multiple matching packages
YCPValue
PkgModuleFunctions::PkgSize (const YCPString& p)
{
try
{
- zypp::PoolItem_Ref item;
- zypp::Package::constPtr pkg = find_package( p->value(), item, zypp_ptr()->pool() );
+ zypp::Package::constPtr pkg = find_package(p->value());
if (pkg == NULL)
{
return YCPVoid();
}
- return YCPInteger( pkg->size() );
+ return YCPInteger( pkg->installSize() );
}
catch (...)
{
@@ -929,15 +741,13 @@
@usage Pkg::PkgGroup (string package) -> string
*/
-#warning This is bogus, as we have multiple matching packages
YCPValue
PkgModuleFunctions::PkgGroup (const YCPString& p)
{
try
{
- zypp::PoolItem_Ref item;
- zypp::Package::constPtr pkg = find_package( p->value(), item, zypp_ptr()->pool() );
+ zypp::Package::constPtr pkg = find_package(p->value());
if (pkg == NULL)
{
@@ -953,24 +763,40 @@
return YCPVoid();
}
+PkgModuleFunctions::RepoId PkgModuleFunctions::logFindAlias(const std::string &alias) const
+{
+ RepoId index = 0LL;
+
+ for(RepoCont::const_iterator it = repos.begin(); it != repos.end() ; ++it, ++index)
+ {
+ if (!(*it)->isDeleted() && (*it)->repoInfo().alias() == alias)
+ return index;
+ }
+
+ return -1LL;
+}
YCPValue
-PkgModuleFunctions::PkgProp( zypp::PoolItem_Ref item )
+PkgModuleFunctions::PkgProp(const zypp::PoolItem &item)
{
YCPMap data;
- zypp::Package::constPtr pkg = zypp::asKind<zypp::Package>( item.resolvable() );
+
+ zypp::Package::constPtr pkg = zypp::dynamic_pointer_cast<const zypp::Package>(item.resolvable());
+
if (pkg == NULL) {
- y2error( "Not a package: %s", item->name().c_str() );
- return data;
+ y2error("NULL pkg");
+ return YCPVoid();
}
data->add( YCPString("arch"), YCPString( pkg->arch().asString() ) );
- data->add( YCPString("medianr"), YCPInteger( pkg->sourceMediaNr() ) );
+ data->add( YCPString("medianr"), YCPInteger( pkg->mediaNr() ) );
- y2debug("srcId: %ld", pkg->source().numericId() );
- data->add( YCPString("srcid"), YCPInteger( pkg->source().numericId() ) );
+ long long sid = logFindAlias(pkg->repoInfo().alias());
+ y2debug("srcId: %lld", sid );
+ data->add( YCPString("srcid"), YCPInteger( sid ) );
std::string status("available");
+
if (item.status().isInstalled())
{
status = "installed";
@@ -983,10 +809,11 @@
{
status = "removed";
}
+
data->add( YCPString("status"), YCPSymbol(status));
- data->add( YCPString("location"), YCPString( pkg->location().basename() ) );
- data->add( YCPString("path"), YCPString( pkg->location().asString() ) );
+ data->add( YCPString("location"), YCPString( pkg->location().filename().basename() ) );
+ data->add( YCPString("path"), YCPString( pkg->location().filename().asString() ) );
return data;
}
@@ -1011,19 +838,22 @@
* @usage Pkg::PkgProperties (string package) -> map
*/
-#warning This is bogus, as we have multiple matching packages
-
YCPValue
PkgModuleFunctions::PkgProperties (const YCPString& p)
{
+ if (p.isNull())
+ {
+ return YCPVoid();
+ }
+
try
{
- YCPMap data;
- zypp::PoolItem_Ref item;
- zypp::Package::constPtr pkg = find_package( p->value(), item, zypp_ptr()->pool() );
+ zypp::ui::Selectable::Ptr s = zypp::ui::Selectable::get(p->value());
- if (item)
- return PkgProp( item );
+ if (s)
+ {
+ return PkgProp(s->theObj());
+ }
}
catch (...)
{
@@ -1042,13 +872,27 @@
{
try
{
- for (zypp::ResPool::byName_iterator it = zypp_ptr()->pool().byNameBegin(pkgname);
- it != zypp_ptr()->pool().byNameEnd(pkgname); ++it)
+ // access to the Pool of Selectables
+ zypp::ResPoolProxy selectablePool(zypp::ResPool::instance().proxy());
+
+ for_(it, selectablePool.byKindBegin<zypp::Package>(),
+ selectablePool.byKindEnd<zypp::Package>())
{
- // is it a package?
- if (zypp::isKind<zypp::Package>(it->resolvable()))
+ zypp::ui::Selectable::Ptr s = (*it);
+
+ if (s)
{
- data->add( PkgProp( *it ) );
+ // iterate over installed packages
+ for_(inst_it, s->installedBegin(), s->installedEnd())
+ {
+ data->add(PkgProp(*inst_it));
+ }
+
+ // iterate over available packages
+ for_(avail_it, s->availableBegin(), s->availableEnd())
+ {
+ data->add(PkgProp(*avail_it));
+ }
}
}
}
@@ -1064,17 +908,13 @@
YCPValue
PkgModuleFunctions::GetPkgLocation (const YCPString& p, bool full_path)
{
- zypp::PoolItem_Ref item;
-
try
{
- zypp::Package::constPtr pkg = find_package( p->value(), item, zypp_ptr()->pool() );
-
- YCPMap data;
+ zypp::Package::constPtr pkg = find_package(p->value());
- if (item) {
- return (full_path) ? YCPString( pkg->location().asString() )
- : YCPString( pkg->location().basename() );
+ if (pkg) {
+ return (full_path) ? YCPString( pkg->location().filename().asString() )
+ : YCPString( pkg->location().filename().basename() );
}
}
catch (...)
@@ -1117,7 +957,29 @@
return GetPkgLocation(p, true);
}
+// a helper function
+YCPList _create_filelist(const zypp::PoolItem &pi)
+{
+ zypp::Package::constPtr package = zypp::dynamic_pointer_cast<const zypp::Package>(pi.resolvable());
+
+ YCPList ret;
+
+ if (!package)
+ {
+ y2error("Not a package");
+ return ret;
+ }
+
+ zypp::Package::FileList files( package->filelist() );
+ // insert the file names
+ for_( it, files.begin(), files.end() )
+ {
+ ret->add(YCPString(*it));
+ }
+
+ return ret;
+}
/**
* @builtin PkgGetFilelist
@@ -1141,61 +1003,84 @@
{
std::string pkgname = package->value();
std::string type = which->symbol();
- YCPList ret;
if (type != "any" && type != "installed" && type != "candidate")
{
y2error("PkgGetFilelist: Unknown parameter, use `any, `installed or `candidate");
- return ret;
+ return YCPList();
}
if (!pkgname.empty())
{
try
{
- for (zypp::ResPool::byName_iterator it = zypp_ptr()->pool().byNameBegin(pkgname);
- it != zypp_ptr()->pool().byNameEnd(pkgname); ++it)
+ zypp::ui::Selectable::Ptr s = zypp::ui::Selectable::get(pkgname);
+
+ if (s)
{
- // is it a package?
- if (zypp::isKind<zypp::Package>(it->resolvable()))
+ if (type == "any")
{
- if (type == "any" ||
- (type == "installed" && it->status().isInstalled()) ||
- (type == "candidate" && it->status().isToBeInstalled())
- )
+ if (s->hasInstalledObj())
{
- // cast to Package object
- zypp::Package::constPtr package = zypp::dynamic_pointer_cast<const zypp::Package>(it->resolvable());
- std::list<std::string> files = package->filenames();
-
- // insert the file names
- for (std::list<string>::iterator it = files.begin(); it != files.end(); ++it)
- {
- ret->add(YCPString(*it));
- }
-
-#warning PkgGetFilelist has different semantics for `any optinon - the result depends on item order in the pool, first found is returned
- // finish the loop, we have found required package
- break;
+ return _create_filelist(s->installedObj());
+ }
+ else if (s->hasCandidateObj())
+ {
+ return _create_filelist(s->candidateObj());
+ }
+ else
+ {
+ y2milestone("Package %s is not installed and is not available", pkgname.c_str());
}
}
- }
- }
- catch (...)
- {
- }
- }
-
- return ret;
-}
-
-// ------------------------
+ else if (type == "installed")
+ {
+ if (s->hasInstalledObj())
+ {
+ return _create_filelist(s->installedObj());
+ }
+ else
+ {
+ y2milestone("Package %s is not installed", pkgname.c_str());
+ }
+ }
+ else if (type == "candidate")
+ {
+ if (s->hasCandidateObj())
+ {
+ return _create_filelist(s->candidateObj());
+ }
+ else
+ {
+ y2milestone("Package %s is not available", pkgname.c_str());
+ }
+ }
+ else
+ {
+ y2internal("Unhandled package type %s", type.c_str());
+ }
+ }
+ else
+ {
+ y2warning("Package %s was not found", pkgname.c_str());
+ }
+ }
+ catch (...)
+ {
+ }
+ }
+
+ return YCPList();
+}
+
+bool state_saved = false;
+
+// ------------------------
/**
@builtin SaveState
- @short Save the current selection state - do not use, not implemented
+ @short Save the current selection state, can be restored later using Pkg::RestoreState()
@description
- save the current package selection status for later
- retrieval via Pkg::RestoreState()
+ Save the current status of all resolvables for later restoration via Pkg::RestoreState() function. Only one state is stored, the following call will rewrite the saved status.
@return boolean
@see Pkg::RestoreState
@@ -1204,15 +1089,24 @@
YCPValue
PkgModuleFunctions::SaveState ()
{
-# warning SaveState is not implemented
- return YCPBoolean (true);
+ // a state has been already saved, it will be lost...
+ if (state_saved)
+ {
+ y2warning("Pkg::SaveState() has been already called, rewriting the saved state...");
+ }
+
+ y2milestone("Saving status...");
+ zypp_ptr()->poolProxy().saveState();
+ state_saved = true;
+
+ return YCPBoolean(true);
}
// ------------------------
/**
@builtin RestoreState
- @short Restore Saved state - do not use, not implemented
+ @short Restore Saved state - restore the state saved by Pkg::SaveState()
@description
restore the package selection status from a former
call to Pkg::SaveState()
@@ -1228,26 +1122,41 @@
YCPValue
PkgModuleFunctions::RestoreState (const YCPBoolean& ch)
{
-# warning RestoreState is not implemented
+ bool ret = false;
+
if (!ch.isNull () && ch->value () == true)
{
- // return YCPBoolean (_y2pm.packageSelectionDiffState());
+ // check only
+ ret = zypp_ptr()->poolProxy().diffState();
}
- return YCPBoolean(false /*_y2pm.packageSelectionRestoreState()*/);
+ else
+ {
+ if (!state_saved)
+ {
+ y2error("No previous state saved, state cannot be restored");
+ }
+ else
+ {
+ y2milestone("Restoring the saved status...");
+ zypp_ptr()->poolProxy().restoreState();
+ ret = true;
+ }
+ }
+
+ return YCPBoolean(ret);
}
// ------------------------
/**
@builtin ClearSaveState
- @short clear a saved state (to reduce memory consumption) - do not use, not implemented
+ @short Clear the saved state - do not use, does nothing (the saved state cannot be removed, it is part of each resolvable object)
@return boolean
*/
YCPValue
PkgModuleFunctions::ClearSaveState ()
{
-# warning ClearSaveState is not implemented
return YCPBoolean (true);
}
@@ -1267,12 +1176,15 @@
{
try
{
- for (zypp::ResPool::byKind_iterator it = zypp_ptr()->pool().byKindBegin(zypp::ResTraits<zypp::Package>::kind);
- it != zypp_ptr()->pool().byKindEnd(zypp::ResTraits<zypp::Package>::kind);
- ++it)
+ // access to the Pool of Selectables
+ zypp::ResPoolProxy selectablePool(zypp::ResPool::instance().proxy());
+
+ for_(it, selectablePool.byKindBegin<zypp::Package>(),
+ selectablePool.byKindEnd<zypp::Package>())
{
- // return true if there is a package installed/removed by user
- if ((it->status().isToBeInstalled() || it->status().isToBeUninstalled()) && it->status().isByUser())
+ zypp::ui::Selectable::Ptr s = (*it);
+
+ if (s && s->fate() != zypp::ui::Selectable::UNMODIFIED && s->modifiedBy() == zypp::ResStatus::USER)
{
return YCPBoolean(true);
}
@@ -1289,7 +1201,7 @@
/**
@builtin PkgAnyToDelete
- @short Check if there are any package to be deleted
+ @short Check if there are any package to be deleted - obsoleted
@description
return true if any packages are to be deleted
@return boolean
@@ -1298,35 +1210,15 @@
YCPValue
PkgModuleFunctions::PkgAnyToDelete ()
{
- bool ret = false;
-
y2warning("Pkg::PkgAnyToDelete() is obsoleted, use Pkg::IsAnyResolvable(`package, `to_remove) instead");
-
- try
- {
- for (zypp::ResPool::byKind_iterator it = zypp_ptr()->pool().byKindBegin(zypp::ResTraits<zypp::Package>::kind);
- it != zypp_ptr()->pool().byKindEnd(zypp::ResTraits<zypp::Package>::kind);
- ++it)
- {
- if (it->status().isToBeUninstalled())
- {
- ret = true;
- break;
- }
- }
- }
- catch (...)
- {
- }
-
- return YCPBoolean(ret);
+ return IsAnyResolvable(YCPSymbol("package"), YCPSymbol("to_remove"));
}
// ------------------------
/**
@builtin AnyToInstall
- @short Check if there are any package to be installed
+ @short Check if there are any package to be installed - obsoleted
@description
return true if any packages are to be installed
@return boolean
@@ -1335,33 +1227,12 @@
YCPValue
PkgModuleFunctions::PkgAnyToInstall ()
{
- bool ret = false;
-
y2warning("Pkg::PkgAnyToInstall() is obsoleted, use Pkg::IsAnyResolvable(`package, `to_install) instead");
-
- try
- {
- for (zypp::ResPool::byKind_iterator it = zypp_ptr()->pool().byKindBegin(zypp::ResTraits<zypp::Package>::kind);
- it != zypp_ptr()->pool().byKindEnd(zypp::ResTraits<zypp::Package>::kind);
- ++it)
- {
- if (it->status().isToBeInstalled())
- {
- ret = true;
- break;
- }
- }
- }
- catch (...)
- {
- }
-
- return YCPBoolean(ret);
+ return IsAnyResolvable(YCPSymbol("package"), YCPSymbol("to_install"));
}
// ------------------------
-
/* helper function */
static void
pkg2list (YCPList &list, const zypp::ResPool::byKind_iterator& it, bool names_only)
@@ -1381,7 +1252,6 @@
return;
}
-
/**
@builtin FilterPackages
@@ -1517,60 +1387,18 @@
return packages;
}
-
/**
* @builtin PkgUpdateAll
- * @param map<string,any> update_options Options for the solver. All parameters are optional, if a parameter is missing the default value from the package manager (libzypp) is used. Currently supported options: <tt>$["delete_unmaintained":boolean, "silent_downgrades":boolean, "keep_installed_patches":boolean]</tt>
+ * @param map<string,any> update_options Options for the solver. All parameters are optional,
+ * if a parameter is missing the default value from the package manager (libzypp) is used.
+ * Currently supported options: <tt>NONE</tt>
+ *
* @short Update installed packages
* @description
- * Mark all packages for installation which are installed and have
- * an available candidate for update.
- *
- * This will mark packages for installation *and* for deletion (if a
- * package provides/obsoletes another package)
- *
- * This function does not solve dependencies.
- *
- * Symbols and integer values returned:
- *
- * <b>ProblemListSze</b>: Number of taboo and dropped packages found.
- *
- * <b>DeleteUnmaintained</b>: Whether delete_unmaintained arg was true or false.
- * Dependent on this, <b>SumDropped</b> below either denotes packages to delete
- * (if true) or packages to keep (if false).
- *
- * <b>SumProcessed</b>: TOTAL number of installed packages we processed.
- *
- * <b>SumToInstall</b>: TOTAL number of packages now tagged as to install.
- * Summs <b>Ipreselected</b>, <b>Iupdate</b>, <b>Idowngrade</b>, <b>Ireplaced</b>.
- *
- * <b>Ipreselected</b>: Packages which were already taged to install.
- *
- * <b>Iupdate</b>: Packages set to install as update to a newer version.
- *
- * <b>Idowngrade</b>: Packages set to install performing a version downgrade.
- *
- * <b>Ireplaced</b>: Packages set to install as they replace an installed package.
+ * Perform a distribution upgrade. This function solves
+ * dependencies.
*
- * <b>SumToDelete</b>: TOTAL number of packages now tagged as to delete.
- * Summs <b>Dpreselected</b>, <b>SumDropped</b> if <b>DeleteUnmaintained</b>
- * was set.
- *
- * <b>Dpreselected</b>: Packages which were already taged to delete.
- *
- * <b>SumToKeep</b>: TOTAL number of packages which remain unchanged.
- * Summs <b>Ktaboo</b>, <b>Knewer</b>, <b>Ksame</b>, <b>SumDropped</b>
- * if <b>DeleteUnmaintained</b> was not set.
- *
- * <b>Ktaboo</b>: Packages which are set taboo.
- *
- * <b>Knewer</b>: Packages kept because only older versions are available.
- *
- * <b>Ksame</b>: Packages kept because they are up to date.
- *
- * <b>SumDropped</b>: TOTAL number of dropped packages found. Dependent
- * on the delete_unmaintained arg, they are either tagged as to delete or
- * remain unchanged.
+ * Symbols and integer values returned: <tt>NONE</tt>
*
* @return map<symbol,integer> summary of the update
*/
@@ -1578,48 +1406,30 @@
YCPValue
PkgModuleFunctions::PkgUpdateAll (const YCPMap& options)
{
- zypp::UpgradeStatistics stats;
+ // NOTE(ma): Since libzypp switched to use libsatsolver for distribution upgrade,
+ // there are no more in-/output arguments to doUpgrade. The statistics previously
+ // returned from resolver()->doUpgrade(stats) via the UpgradeStatistics argument
+ // no longer exist. If some feedback is required here, libzypp could offer sort of
+ // transaction summary. Such a summary woulfd not be tied to the distribution upgrade,
+ // but would be available all the time and reflect the status of the zypp pool.
+
YCPValue delete_unmaintained = options->value(YCPString("delete_unmaintained"));
if(!delete_unmaintained.isNull())
{
- if (delete_unmaintained->isBoolean())
- {
- stats.delete_unmaintained = delete_unmaintained->asBoolean()->value();
- }
- else
- {
- y2error("unexpected type of 'delete_unmaintained' key: %s, must be a boolean!",
- Type::vt2type(delete_unmaintained->valuetype())->toString().c_str());
- }
+ y2error("'delete_unmaintained' flag is obsoleted and should not be used, check the code!");
}
YCPValue silent_downgrades = options->value(YCPString("silent_downgrades"));
if(!silent_downgrades.isNull())
{
- if (silent_downgrades->isBoolean())
- {
- stats.silent_downgrades = silent_downgrades->asBoolean()->value();
- }
- else
- {
- y2error("unexpected type of 'silent_downgrades' key: %s, must be a boolean!",
- Type::vt2type(silent_downgrades->valuetype())->toString().c_str());
- }
+ y2error("'silent_downgrades' flag is obsoleted and should not be used, check the code!");
}
YCPValue keep_installed_patches = options->value(YCPString("keep_installed_patches"));
if(!keep_installed_patches.isNull())
{
- if (keep_installed_patches->isBoolean())
- {
- stats.keep_installed_patches = keep_installed_patches->asBoolean()->value();
- }
- else
- {
- y2error("unexpected type of 'keep_installed_patches' key: %s, must be a boolean!",
- Type::vt2type(keep_installed_patches->valuetype())->toString().c_str());
- }
+ y2error("'keep_installed_patches' flag is obsoleted and should not be used, check the code!");
}
@@ -1628,46 +1438,14 @@
try
{
// solve upgrade, get statistics
- zypp_ptr()->resolver()->doUpgrade(stats);
+ zypp_ptr()->resolver()->doUpgrade();
}
catch (...)
- {
- return data;
- }
-
- data->add( YCPSymbol("ProblemListSze"), YCPInteger(stats.chk_is_taboo + stats.chk_dropped));
-
- // packages to install; sum and details
- data->add( YCPSymbol("SumToInstall"), YCPInteger( stats.totalToInstall() ) );
- data->add( YCPSymbol("Ipreselected"), YCPInteger( stats.chk_already_toins ) );
- data->add( YCPSymbol("Iupdate"), YCPInteger( stats.chk_to_update ) );
- data->add( YCPSymbol("Idowngrade"), YCPInteger( stats.chk_to_downgrade ) );
- data->add( YCPSymbol("Ireplaced"), YCPInteger( stats.chk_replaced
- + stats.chk_replaced_guessed
- + stats.chk_add_split ) );
- // packages to delete; sum and details (! see dropped packages)
- data->add( YCPSymbol("SumToDelete"), YCPInteger( stats.totalToDelete() ) );
- data->add( YCPSymbol("Dpreselected"), YCPInteger( stats.chk_already_todel ) );
-
- // packages to delete; sum and details (! see dropped packages)
- data->add( YCPSymbol("SumToKeep"), YCPInteger( stats.totalToKeep() ) );
- data->add( YCPSymbol("Ktaboo"), YCPInteger( stats.chk_is_taboo ) );
- data->add( YCPSymbol("Knewer"), YCPInteger( stats.chk_to_keep_downgrade ) );
- data->add( YCPSymbol("Ksame"), YCPInteger( stats.chk_to_keep_installed ) );
-
- // dropped packages; dependent on the delete_unmaintained
- // option set for doUpdate, dropped packages count as ToDelete
- // or ToKeep.
- data->add( YCPSymbol("SumDropped"), YCPInteger( stats.chk_dropped ) );
- data->add( YCPSymbol("DeleteUnmaintained"),YCPInteger( stats.delete_unmaintained ) );
-
- // Total mumber of installed packages processed
- data->add( YCPSymbol("SumProcessed"), YCPInteger( stats.chk_installed_total ) );
+ {}
return data;
}
-
/**
@builtin PkgInstall
@short Select package for installation
@@ -1712,21 +1490,29 @@
if (name.empty())
return YCPBoolean (false);
- // ensure installation of the 'best' architecture
+ bool ret = false;
+ zypp::ui::Selectable::Ptr selectable = zypp::ui::Selectable::get(zypp::ResKind::srcpackage, name);
- return YCPBoolean( DoProvideNameKind( name, zypp::ResTraits<zypp::SrcPackage>::kind, zypp_ptr()->architecture(), "" ) );
-}
+ if (selectable)
+ {
+ ret = selectable->setToInstall(whoWantsIt);
+ }
+ else
+ {
+ y2error("Source package %s is not available", name.c_str());
+ }
+ return YCPBoolean(ret);
+}
/**
@builtin PkgDelete
- @short Select package for deletion
+ @short Select package for deletion (deletes all installed instances of the package)
@param string package
@return boolean
*/
-#warning This is bogus, as we have multiple matching (kernel) packages
YCPValue
PkgModuleFunctions::PkgDelete (const YCPString& p)
@@ -1735,31 +1521,24 @@
if (name.empty())
return YCPBoolean (false);
+ bool ret = false;
+
try
{
- // find the package
- zypp::ResPool::byName_iterator it = std::find_if (
- zypp_ptr()->pool().byNameBegin(name)
- , zypp_ptr()->pool().byNameEnd(name)
- , zypp::functor::chain (
- zypp::resfilter::ByInstalled (),
- zypp::resfilter::ByKind( zypp::ResTraits<zypp::Package>::kind )
- )
- );
-
+ zypp::ui::Selectable::Ptr selectable = zypp::ui::Selectable::get(name);
- // set the status to uninstalled
- return YCPBoolean( (it != zypp_ptr()->pool().byNameEnd(name))
- && it->status().setToBeUninstalled(whoWantsIt) );
+ if (selectable)
+ {
+ ret = selectable->setToDelete(whoWantsIt);
+ }
}
catch (...)
{
}
- return YCPBoolean (false);
+ return YCPBoolean(ret);
}
-
/**
@builtin PkgTaboo
@@ -1776,38 +1555,20 @@
if (name.empty())
return YCPBoolean (false);
- bool ret = true;
+ bool ret = false;
try
{
- bool found = false;
-
- for (zypp::ResPool::byName_iterator it = zypp_ptr()->pool().byNameBegin(name);
- it != zypp_ptr()->pool().byNameEnd(name); ++it)
- {
- // is it a package?
- // installed package cannot be set to taboo
- if (zypp::isKind<zypp::Package>(it->resolvable()) && !it->status().isInstalled())
- {
- found = true;
-
- bool res = it->status().resetTransact(whoWantsIt)
- // lock the package at the USER level (bug #186205)
- && it->status().resetTransact(zypp::ResStatus::USER)
- && it->status().setLock(true, zypp::ResStatus::USER);
-
- ret = ret && res;
- }
- }
+ zypp::ui::Selectable::Ptr selectable = zypp::ui::Selectable::get(name);
- if (!found)
+ if (selectable)
{
- ret = false;
+ // lock the package at the USER level (bug #186205)
+ ret = selectable->setStatus(zypp::ui::S_Taboo, zypp::ResStatus::USER);
}
}
catch (...)
{
- ret = false;
}
return YCPBoolean(ret);
@@ -1829,39 +1590,53 @@
if (name.empty())
return YCPBoolean (false);
- bool ret = true;
+ bool ret = false;
try
{
- bool found = false;
+ zypp::ui::Selectable::Ptr selectable = zypp::ui::Selectable::get(name);
- for (zypp::ResPool::byName_iterator it = zypp_ptr()->pool().byNameBegin(name);
- it != zypp_ptr()->pool().byNameEnd(name); ++it)
+ if (selectable)
{
- // is it a package?
- if (zypp::isKind<zypp::Package>(it->resolvable()))
- {
- found = true;
- ret = it->status().resetTransact(whoWantsIt) && ret;
- }
- }
-
- if (!found)
- {
- ret = false;
+ ret = selectable->unset(whoWantsIt);
}
}
catch (...)
{
- ret = false;
}
return YCPBoolean(ret);
}
+template <class T>
+inline void ResetAllKind(zypp::ResPoolProxy &proxy, const zypp::ResStatus::TransactByValue &level)
+{
+ for_(it, proxy.byKindBegin<T>(), proxy.byKindEnd<T>())
+ {
+ zypp::ui::Selectable::Ptr s = (*it);
+ if (s && (level == zypp::ResStatus::USER || s->theObj().status().transacts()))
+ {
+ s->theObj().status().resetTransact(level);
+ }
+ }
+}
+
+
+void ResetAll(const zypp::ResStatus::TransactByValue &level)
+{
+ // access to the Pool of Selectables
+ zypp::ResPoolProxy selectablePool(zypp::ResPool::instance().proxy());
+
+ // unset all packages, patterns...
+ ResetAllKind<zypp::Package>(selectablePool, level);
+ ResetAllKind<zypp::Pattern>(selectablePool, level);
+ ResetAllKind<zypp::Patch>(selectablePool, level);
+ ResetAllKind<zypp::Product>(selectablePool, level);
+ ResetAllKind<zypp::SrcPackage>(selectablePool, level);
+}
/**
- * @builtin Reset
+ * @builtin PkgReset
*
* @short Reset most internal stuff on the package manager.
@return boolean
@@ -1872,14 +1647,7 @@
{
try
{
- for (zypp::ResPool::const_iterator it = zypp_ptr()->pool().begin()
- ; it != zypp_ptr()->pool().end()
- ; ++it)
- {
- // reset all transaction flags
- it->statusReset();
- }
-
+ ResetAll(zypp::ResStatus::USER);
return YCPBoolean (true);
}
catch (...)
@@ -1889,9 +1657,8 @@
return YCPBoolean (false);
}
-
/**
- * @builtin Reset
+ * @builtin PkgApplReset
*
* @short Reset most internal stuff on the package manager.
Reset only packages set by the application, not by the user
@@ -1903,14 +1670,7 @@
{
try
{
- for (zypp::ResPool::const_iterator it = zypp_ptr()->pool().begin()
- ; it != zypp_ptr()->pool().end()
- ; ++it)
- {
- // reset all transaction flags
- it->status().resetTransact(zypp::ResStatus::APPL_HIGH);
- }
-
+ ResetAll(whoWantsIt);
return YCPBoolean (true);
}
catch (...)
@@ -1920,11 +1680,35 @@
return YCPBoolean (false);
}
+void SaveProblemList(const zypp::ResolverProblemList &problems, const std::string &filename)
+{
+ try
+ {
+ int problem_size = problems.size();
+
+ if (problem_size > 0)
+ {
+ y2error ("PkgSolve: %d packages failed (see %s)", problem_size, filename.c_str());
+
+ std::ofstream out (filename.c_str());
+
+ out << problem_size << " packages failed" << std::endl;
+ for(zypp::ResolverProblemList::const_iterator p = problems.begin();
+ p != problems.end(); ++p )
+ {
+ out << (*p)->description() << std::endl;
+ }
+ }
+ }
+ catch (...)
+ {
+ }
+}
/**
@builtin PkgSolve
@short Solve current package dependencies
- @optarg booean filter filter all conflicts with installed packages
+ @optarg boolean filter unused, only for backward compatibility
(installed packages will be preferred)
@return boolean
@@ -1940,54 +1724,24 @@
}
catch (const zypp::Exception& excpt)
{
- y2error("An error occurred during Pkg::PkgSolve.");
+ y2error("An error occurred during Pkg::Solve.");
_last_error.setLastError(excpt.asUserString(), "See /var/log/YaST2/badlist for more information.");
+ result = false;
}
// save information about failed dependencies to file
if (!result)
{
-# warning PkgSolve: filter option is not used
-/* bool filter_conflicts_with_installed = false;
-
- if (! filter.isNull())
- {
- filter_conflicts_with_installed = filter->value();
- }
-*/
-
- try
- {
- zypp::ResolverProblemList problems = zypp_ptr()->resolver()->problems();
- int problem_size = problems.size();
-
- if (problem_size > 0)
- {
- y2error ("PkgSolve: %d packages failed (see /var/log/YaST2/badlist)", problem_size);
-
- std::ofstream out ("/var/log/YaST2/badlist");
-
- out << problem_size << " packages failed" << std::endl;
- for(zypp::ResolverProblemList::const_iterator p = problems.begin();
- p != problems.end(); ++p )
- {
- out << (*p)->description() << std::endl;
- }
- }
- }
- catch (...)
- {
- return YCPBoolean(false);
- }
+ zypp::ResolverProblemList problems = zypp_ptr()->resolver()->problems();
+ SaveProblemList(problems, "/var/log/YaST2/badlist");
}
return YCPBoolean(result);
}
-
/**
@builtin PkgEstablish
- @short establish the pool state
+ @short establish the pool state - obsoleted, not needed
@return boolean
Returns true. (If no pool item 'transacts')
@@ -2000,53 +1754,12 @@
YCPBoolean
PkgModuleFunctions::PkgEstablish ()
{
- bool result = false;
-
- try
- {
- result = zypp_ptr()->resolver()->establishPool();
- }
- catch (const zypp::Exception& excpt)
- {
- y2error("An error occurred during Pkg::PkgEstablish.");
- _last_error.setLastError(excpt.asUserString(), "See /var/log/YaST2/badlist for more information.");
- }
-
- // save information about failed dependencies to file
- if (!result)
- {
- try
- {
- zypp::ResolverProblemList problems = zypp_ptr()->resolver()->problems();
- int problem_size = problems.size();
-
- if (problem_size > 0)
- {
- y2error ("PkgSolve: %d packages failed (see /var/log/YaST2/badlist)", problem_size);
-
- std::ofstream out ("/var/log/YaST2/badlist");
-
- out << problem_size << " packages failed" << std::endl;
- for(zypp::ResolverProblemList::const_iterator p = problems.begin();
- p != problems.end(); ++p )
- {
- out << (*p)->description() << std::endl;
- }
- }
- }
- catch (...)
- {
- return YCPBoolean(false);
- }
- }
-
- return YCPBoolean(result);
+ return YCPBoolean(false);
}
-
/**
@builtin PkgFreshen
- @short check all package freshens and schedule matching ones for installation
+ @short check all package freshens and schedule matching ones for installation - obsoleted, not needed
@return boolean
Returns true. (If no pool item 'transacts')
@@ -2056,103 +1769,51 @@
If it has, dependencies will be solved and the returned result might be false.
*/
-
+#warning Freshens is obsolete
YCPBoolean
PkgModuleFunctions::PkgFreshen()
{
- bool result = false;
-
- try
- {
- result = zypp_ptr()->resolver()->freshenPool();
- }
- catch (const zypp::Exception& excpt)
- {
- y2error("An error occurred during Pkg::PkgFreshen.");
- _last_error.setLastError(excpt.asUserString(), "See /var/log/YaST2/badlist for more information.");
- }
-
- // save information about failed dependencies to file
- if (!result)
- {
- try
- {
- zypp::ResolverProblemList problems = zypp_ptr()->resolver()->problems();
- int problem_size = problems.size();
-
- if (problem_size > 0)
- {
- y2error ("PkgSolve: %d packages failed (see /var/log/YaST2/badlist)", problem_size);
-
- std::ofstream out ("/var/log/YaST2/badlist");
-
- out << problem_size << " packages failed" << std::endl;
- for(zypp::ResolverProblemList::const_iterator p = problems.begin();
- p != problems.end(); ++p )
- {
- out << (*p)->description() << std::endl;
- }
- }
- }
- catch (...)
- {
- return YCPBoolean(false);
- }
- }
-
- return YCPBoolean(result);
+ return YCPBoolean(true);
}
-
/**
@builtin PkgSolveCheckTargetOnly
@short Solve packages currently installed on target system.
@description
- Solve packages currently installed on target system. Packages status
- remains unchanged, i.e. does not select/deselect any packages to
- resolve failed dependencies.
+ Solve packages currently installed on target system.
+ All transactions are reset after the call!
@return boolean
*/
YCPBoolean
PkgModuleFunctions::PkgSolveCheckTargetOnly()
{
- // create pool just with objects from target
- zypp::ResStore store;
-
try
{
- store = zypp_ptr()->target()->resolvables();
+ zypp_ptr()->target()->load();
}
catch (...)
{
return YCPBoolean(false);
}
- zypp::ResPoolManager pool;
- pool.insert(store.begin(), store.end(), true);
-
- // create resolver
- zypp::Resolver solver(pool.accessor());
-
bool result = false;
try
{
// verify consistency of system
- result = solver.verifySystem();
+ result = zypp_ptr()->resolver()->verifySystem();
}
catch (const zypp::Exception& excpt)
{
y2error("An error occurred during Pkg::PkgSolveCheckTargetOnly");
- _last_error.setLastError(excpt.asUserString());
+ _last_error.setLastError(ExceptionAsString(excpt));
}
return YCPBoolean(result);
}
-
/**
@builtin PkgSolveErrors
@short Returns number of fails
@@ -2176,31 +1837,8 @@
return YCPVoid();
}
-/**
- @builtin PkgCommit
-
- @short Commit package changes (actually install/delete packages)
- @description
-
- if medianr == 0, all packages regardless of media are installed
-
- if medianr > 0, only packages from this media are installed
-
- @param integer medianr Media Number
- @return list [ int successful, list failed, list remaining, list srcremaining ]
- The 'successful' value will be negative, if installation was aborted !
-
-*/
-YCPValue
-PkgModuleFunctions::PkgCommit (const YCPInteger& media)
+YCPValue PkgModuleFunctions::CommitHelper(const zypp::ZYppCommitPolicy &policy)
{
- int medianr = media->value ();
-
- if (medianr < 0)
- {
- return YCPError ("Bad args to Pkg::PkgCommit");
- }
-
zypp::ZYpp::CommitResult result;
// clean the last reported source
@@ -2209,32 +1847,30 @@
try
{
- zypp::ZYppCommitPolicy policy;
- policy.restrictToMedia( medianr );
+ // reset the values for SourceChanged callback
+ last_reported_repo = -1;
+ last_reported_mediumnr = 1;
+
result = zypp_ptr()->commit(policy);
}
catch (const zypp::target::TargetAbortedException & excpt)
{
y2milestone ("Installation aborted by user");
YCPList ret;
- ret->add(YCPInteger(-1LL));
+ ret->add(YCPInteger(-1));
return ret;
}
catch (const zypp::Exception& excpt)
{
y2error("Pkg::Commit has failed: ZYpp::commit has failed");
- _last_error.setLastError(excpt.asUserString());
+ _last_error.setLastError(ExceptionAsString(excpt));
return YCPVoid();
}
- try {
- zypp::SourceManager::sourceManager()->releaseAllSources();
- }
- catch (const zypp::Exception& excpt)
- {
- y2error("Pkg::Commit has failed: cannot release all sources");
- _last_error.setLastError(excpt.asUserString());
- }
+ SourceReleaseAll();
+
+ // create the base product link (bnc#413444)
+ CreateBaseProductSymlink();
YCPList ret;
@@ -2257,12 +1893,6 @@
resolvable->add (YCPString ("kind"), YCPSymbol ("product"));
else if (zypp::isKind<zypp::Pattern>(it->resolvable()))
resolvable->add (YCPString ("kind"), YCPSymbol ("pattern"));
- else if (zypp::isKind<zypp::Selection>(it->resolvable()))
- resolvable->add (YCPString ("kind"), YCPSymbol ("selection"));
- else if (zypp::isKind<zypp::Script>(it->resolvable()))
- resolvable->add (YCPString ("kind"), YCPSymbol ("script"));
- else if (zypp::isKind<zypp::Message>(it->resolvable()))
- resolvable->add (YCPString ("kind"), YCPSymbol ("message"));
else if (zypp::isKind<zypp::Patch>(it->resolvable()))
resolvable->add (YCPString ("kind"), YCPSymbol ("patch"));
else
@@ -2286,6 +1916,37 @@
}
/**
+ @builtin PkgCommit
+
+ @short Commit package changes (actually install/delete packages), see also Pkg::Commit()
+ @description
+
+ if medianr == 0, all packages regardless of media are installed
+
+ if medianr > 0, only packages from this media are installed
+
+ @param integer medianr Media Number
+ @return list [ int successful, list failed, list remaining, list srcremaining ]
+ The 'successful' value will be negative, if installation was aborted !
+
+*/
+YCPValue
+PkgModuleFunctions::PkgCommit (const YCPInteger& media)
+{
+ int medianr = media->value ();
+
+ if (medianr < 0)
+ {
+ return YCPError ("Bad args to Pkg::PkgCommit");
+ }
+
+ zypp::ZYppCommitPolicy policy;
+ policy.restrictToMedia( medianr );
+
+ return CommitHelper(policy);
+}
+
+/**
@builtin GetBackupPath
@short get current path for update backup of rpm config files
@@ -2327,7 +1988,6 @@
return YCPVoid();
}
-
/**
@builtin CreateBackups
@short whether to create package backups during install or removal
@@ -2348,7 +2008,6 @@
return YCPVoid ();
}
-
/**
@builtin PkgGetLicenseToConfirm
@@ -2367,23 +2026,15 @@
{
try
{
- // find the uninstalled (!) package
- zypp::ResPool::byName_iterator it = std::find_if (
- zypp_ptr()->pool().byNameBegin(pkgname)
- , zypp_ptr()->pool().byNameEnd(pkgname)
- , zypp::functor::chain(
- zypp::resfilter::ByUninstalled (),
- zypp::resfilter::ByKind( zypp::ResTraits<zypp::Package>::kind ) )
- );
+ zypp::ui::Selectable::Ptr s = zypp::ui::Selectable::get(pkgname);
- if (it != zypp_ptr()->pool().byNameEnd(pkgname) && !it->status().isLicenceConfirmed())
+ if (s && s->toInstall() && !s->hasLicenceConfirmed())
{
- // cast to Package object
- zypp::Package::constPtr package = zypp::dynamic_pointer_cast<const zypp::Package>(it->resolvable());
-
- // get the license
- zypp::License license = package->licenseToConfirm();
- return YCPString(license);
+ zypp::Package::constPtr package = zypp::dynamic_pointer_cast<const zypp::Package>(s->candidateObj().resolvable());
+ if (package)
+ {
+ return YCPString(package->licenseToConfirm());
+ }
}
}
catch (...)
@@ -2410,38 +2061,12 @@
YCPMap ret;
for ( int i = 0; i < packages->size(); ++i ) {
- std::string pkgname = packages->value(i)->asString()->value();
+ YCPString license = PkgGetLicenseToConfirm(packages->value(i)->asString());
- if (!pkgname.empty())
+ // found a license to confirm?
+ if (!license->value().empty())
{
- try
- {
- // find the uninstalled (!) package
- zypp::ResPool::byName_iterator it = std::find_if(
- zypp_ptr()->pool().byNameBegin(pkgname)
- , zypp_ptr()->pool().byNameEnd(pkgname)
- , zypp::functor::chain(
- zypp::resfilter::ByUninstalled (),
- zypp::resfilter::ByKind( zypp::ResTraits<zypp::Package>::kind ) )
- );
-
- // found a package?
- if (it != zypp_ptr()->pool().byNameEnd(pkgname))
- {
- // cast to Package object
- zypp::Package::constPtr package = zypp::dynamic_pointer_cast<const zypp::Package>(it->resolvable());
- zypp::License license = package->licenseToConfirm();
-
- // has the license already been confirmed?
- if (!license.empty() && !it->status().isLicenceConfirmed())
- {
- ret->add(packages->value(i), YCPString(license));
- }
- }
- }
- catch (...)
- {
- }
+ ret->add(packages->value(i), license);
}
}
@@ -2455,7 +2080,6 @@
@param string name of a package
@return boolean true if the license has been successfuly confirmed
*/
-#warning This is bogus, as we have multiple matching packages
YCPBoolean PkgModuleFunctions::PkgMarkLicenseConfirmed (const YCPString & package)
{
std::string pkgname = package->value();
@@ -2464,20 +2088,12 @@
{
try
{
- // find the package
- zypp::ResPool::byName_iterator it = std::find_if(
- zypp_ptr()->pool().byNameBegin(pkgname)
- , zypp_ptr()->pool().byNameEnd(pkgname)
- , zypp::functor::chain(
- zypp::resfilter::ByUninstalled (),
- zypp::resfilter::ByKind( zypp::ResTraits<zypp::Package>::kind ) )
- );
+ zypp::ui::Selectable::Ptr s = zypp::ui::Selectable::get(pkgname);
- if (it != zypp_ptr()->pool().byNameEnd(pkgname))
+ if (s && s->toInstall() && !s->hasLicenceConfirmed())
{
- // confirm the license
- it->status().setLicenceConfirmed(true);
- return YCPBoolean( true );
+ s->setLicenceConfirmed();
+ return YCPBoolean(true);
}
}
catch (...)
@@ -2506,3 +2122,4 @@
return YCPBoolean(false);
}
+
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.cc (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.cc Tue May 10 20:10:47 2011
@@ -175,7 +175,10 @@
: Y2Namespace()
, _target_root( "/" )
, zypp_pointer(NULL)
+ , last_reported_repo(-1)
+ , last_reported_mediumnr(-1)
,_callbackHandler( *new CallbackHandler( ) )
+ , _target_loaded(false)
{
registerFunctions ();
@@ -230,6 +233,15 @@
return zypp_pointer;
}
+zypp::RepoManager PkgModuleFunctions::CreateRepoManager()
+{
+ // set path option, use root dir as a prefix for the default directory
+ zypp::RepoManagerOptions repo_options(_target_root);
+
+ y2milestone("Path to repository files: %s", repo_options.knownReposPath.asString().c_str());
+
+ return zypp::RepoManager(repo_options);
+}
/**
* Destructor.
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.h (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.h Tue May 10 20:10:47 2011
@@ -42,9 +42,12 @@
#include <zypp/Pathname.h>
#include <zypp/Url.h>
#include <zypp/Arch.h>
+#include <zypp/RepoManager.h>
#include <zypp/DiskUsageCounter.h>
#include "PkgError.h"
-
+#include "YRepo.h"
+#include "Utils.h"
+#include "ServiceManager.h"
// textdomain
extern "C" {
@@ -59,7 +62,6 @@
// define new _ macro
#define _(MSG) ::dgettext("pkg-bindings", MSG)
-
/**
* A simple class for package management access
*/
@@ -75,6 +77,16 @@
protected:
+ // container for the internal structure
+ typedef std::vector<YRepo_Ptr> RepoCont;
+
+ zypp::RepoManager CreateRepoManager();
+ ServiceManager service_manager;
+
+ public:
+ typedef RepoCont::size_type RepoId;
+ protected:
+
zypp::Pathname _target_root;
std::set<std::string> _broken_sources;
@@ -94,6 +106,20 @@
private: // source related
+ YCPValue CommitHelper(const zypp::ZYppCommitPolicy &policy);
+
+ zypp::Product::constPtr base_product;
+ RepoId last_reported_repo;
+ int last_reported_mediumnr;
+
+ bool CreateBaseProductSymlink();
+
+ // all known installation sources
+ RepoCont repos;
+
+ // helper
+ YCPValue PkgMediaSizesOrCount (bool sizes, bool download_size=false);
+
bool DoProvideNameKind( const std::string & name, zypp::Resolvable::Kind kind, zypp::Arch architecture,
const std::string& version, const bool onlyNeeded = false);
bool DoRemoveNameKind( const std::string & name, zypp::Resolvable::Kind kind);
@@ -101,7 +127,7 @@
bool DoRemoveAllKind(zypp::Resolvable::Kind kind);
bool DoAllKind(zypp::Resolvable::Kind kind, bool provide);
YCPValue GetPkgLocation(const YCPString& p, bool full_path);
- YCPValue PkgProp( zypp::PoolItem item );
+ YCPValue PkgProp( const zypp::PoolItem &item );
void SetCurrentDU();
@@ -128,16 +154,30 @@
**/
CallbackHandler & _callbackHandler;
+ bool _target_loaded;
+
PkgError _last_error;
/**
* Logging helper:
- * call zypp::SourceManager::sourceManager()->findSource
- * and in case of exception, log error and setLastError AND RETHROW
+ * search for a repository and in case of exception, log error
+ * and setLastError AND RETHROW
*/
- //zypp::Source_Ref logFindSource (zypp::SourceManager::SourceId id);
+ YRepo_Ptr logFindRepository(RepoId id);
+
+ RepoId logFindAlias(const std::string &alias) const;
+
+ YCPMap Resolvable2YCPMap(const zypp::PoolItem &item, const std::string &req_kind, bool dependencies);
+
+ YCPValue SourceProvideDirectoryInternal(const YCPInteger& id, const YCPInteger& mid, const YCPString& d, const YCPBoolean &optional, const YCPBoolean &recursive, bool check_signatures);
+ YCPValue SourceProvideFileCommon(const YCPInteger &id,
+ const YCPInteger &mid,
+ const YCPString& f,
+ const bool optional,
+ const bool check_signatures,
+ const bool digested);
+public:
- public:
// general
/* TYPEINFO: void() */
YCPValue InstSysMode ();
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgProgress.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgProgress.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgProgress.cc Tue May 10 20:10:47 2011
@@ -0,0 +1,25 @@
+
+
+#include "PkgProgress.h"
+#include "log.h"
+
+#include <y2/Y2Function.h>
+
+void PkgProgress::Start( const std::string &process, const std::list<std::string> &stages,
+ const std::string &help)
+{
+}
+
+
+void PkgProgress::NextStage()
+{
+}
+
+void PkgProgress::Done()
+{
+}
+
+PkgProgress::~PkgProgress()
+{
+}
+
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgProgress.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgProgress.h (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgProgress.h Tue May 10 20:10:47 2011
@@ -0,0 +1,38 @@
+/*
+ File: PkgProgress.h
+
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+/-*/
+
+#ifndef PkgProgress_h
+#define PkgProgress_h
+
+#include <string>
+#include <list>
+
+//class PkgFunctions::CallbackHandler;
+#include <PkgModuleFunctions.h>
+#include <Callbacks.YCP.h>
+
+
+#include <zypp/ProgressData.h>
+#include <boost/bind.hpp>
+
+class PkgProgress
+{
+ public:
+
+ PkgProgress(PkgModuleFunctions::CallbackHandler &handler_ref)
+ {}
+
+ void Start( const std::string &process, const std::list<std::string> &stages, const std::string &help);
+
+ void NextStage();
+
+ void Done();
+
+ ~PkgProgress();
+};
+
+#endif
+
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgService.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgService.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgService.cc Tue May 10 20:10:47 2011
@@ -0,0 +1,56 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2008 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+
+#include "PkgService.h"
+
+PkgService::PkgService() : _deleted(false), _old_alias()
+{
+}
+
+PkgService::PkgService(const zypp::ServiceInfo &s, const std::string &old_alias) :
+ zypp::ServiceInfo(s), _deleted(false), _old_alias(old_alias)
+{
+}
+
+PkgService::PkgService(const PkgService &s) :
+ zypp::ServiceInfo(s), _deleted(s._deleted), _old_alias(s._old_alias)
+{
+}
+
+PkgService::~PkgService()
+{
+}
+
+bool PkgService::isDeleted() const
+{
+ return _deleted;
+}
+
+void PkgService::setDeleted()
+{
+ _deleted = true;
+}
+
+std::string PkgService::origAlias() const
+{
+ return _old_alias;
+}
+
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgService.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgService.h (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgService.h Tue May 10 20:10:47 2011
@@ -0,0 +1,50 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2008 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+#include <string>
+#include <zypp/ServiceInfo.h>
+
+// Extend zypp::ServiceInfo class to contain "deleted" flag and original service alias
+class PkgService : public zypp::ServiceInfo
+{
+ public:
+
+ PkgService();
+
+ PkgService(const zypp::ServiceInfo &s, const std::string &old_alias = "");
+
+ PkgService(const PkgService &s);
+
+ ~PkgService();
+
+ bool isDeleted() const;
+
+ void setDeleted();
+
+ std::string origAlias() const;
+
+
+ private:
+
+ bool _deleted;
+ std::string _old_alias;
+};
+
+
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Resolvable.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Resolvable.cc (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Resolvable.cc Tue May 10 20:10:47 2011
@@ -33,36 +33,45 @@
#include <ycp/YCPList.h>
#include <ycp/YCPMap.h>
-#include <zypp/SourceManager.h>
+#include <zypp/Url.h>
+#include <zypp/Package.h>
#include <zypp/Product.h>
#include <zypp/Patch.h>
#include <zypp/Pattern.h>
-#include <zypp/Language.h>
#include <zypp/base/PtrTypes.h>
#include <zypp/Dep.h>
-#include <zypp/CapSet.h>
#include <zypp/PoolItem.h>
#include <zypp/base/Algorithm.h>
+#include <zypp/sat/LocaleSupport.h>
+#include <zypp/parser/ProductFileReader.h>
+#include <zypp/base/Regex.h>
#include <set>
///////////////////////////////////////////////////////////////////
-// ------------------------
/**
@builtin ResolvableInstallArchVersion
@short Install all resolvables with selected name, architecture and kind. Use it only in a special case, ResolvableInstall() should be prefrerred.
- @param name_r name of the resolvable, if empty ("") install all resolvables of the kind
- @param kind_r kind of resolvable, can be `product, `patch, `package, `selection or `pattern
- @param arch architecture of the resolvable
- @param vers Required version of the resolvable, empty string means any version
+ @param name_r name of the resolvable
+ @param kind_r kind of resolvable, can be `product, `patch, `package, `srcpackage or `pattern
+ @param arch architecture of the resolvable, empty means the best architecture
+ @param vers Required version of the resolvable, empty string means the best version
@return boolean false if failed
*/
YCPValue
PkgModuleFunctions::ResolvableInstallArchVersion( const YCPString& name_r, const YCPSymbol& kind_r, const YCPString& arch, const YCPString& vers )
{
+ std::string name(name_r.isNull() ? "" : name_r->value());
+
+ if (name.empty())
+ {
+ y2error("Empty name");
+ return YCPBoolean(false);
+ }
+
zypp::Resolvable::Kind kind;
-
+
std::string req_kind = kind_r->symbol ();
std::string arch_str = arch->value();
@@ -73,19 +82,19 @@
zypp::Arch architecture(arch_str);
if( req_kind == "product" ) {
- kind = zypp::ResTraits<zypp::Product>::kind;
+ kind = zypp::ResKind::product;
}
else if ( req_kind == "patch" ) {
- kind = zypp::ResTraits<zypp::Patch>::kind;
+ kind = zypp::ResKind::patch;
}
else if ( req_kind == "package" ) {
- kind = zypp::ResTraits<zypp::Package>::kind;
+ kind = zypp::ResKind::package;
}
- else if ( req_kind == "selection" ) {
- kind = zypp::ResTraits<zypp::Selection>::kind;
+ else if ( req_kind == "srcpackage" ) {
+ kind = zypp::ResKind::srcpackage;
}
else if ( req_kind == "pattern" ) {
- kind = zypp::ResTraits<zypp::Pattern>::kind;
+ kind = zypp::ResKind::pattern;
}
else
{
@@ -93,78 +102,130 @@
return YCPBoolean(false);
}
- std::string version_str = vers->value();
+ std::string version_str = vers->value();
+ bool ret = false;
+
+ zypp::ResPoolProxy selectablePool(zypp::ResPool::instance().proxy());
+ zypp::ui::Selectable::Ptr s = zypp::ui::Selectable::get(kind, name);
+
+ if (s)
+ {
+ // install the required version and arch
+ for_(avail_it, s->availableBegin(), s->availableEnd())
+ {
+ // get the resolvable
+ zypp::Resolvable::constPtr res = avail_it->resolvable();
- return YCPBoolean(
- (name_r->value().empty())
- ? DoProvideAllKind(kind)
- : DoProvideNameKind (name_r->value(), kind, architecture, version_str)
- );
+ // check version and arch
+ if (res->arch() == architecture && res->edition() == version_str)
+ {
+ // install the preselected candidate
+ s->setCandidate(*avail_it);
+ ret = s->setToInstall(whoWantsIt);
+ break;
+ }
+ }
+
+ if (!ret)
+ {
+ y2error("Required version and arch of %s:%s was not found", req_kind.c_str(), name.c_str());
+ }
+ }
+ else
+ {
+ y2error("Required selectable %s:%s was not found", req_kind.c_str(), name.c_str());
+ }
+
+ return YCPBoolean(ret);
+}
+
+bool ResolvableInstallOrDelete(const YCPString& name_r, const YCPSymbol& kind_r, bool install)
+{
+ zypp::Resolvable::Kind kind;
+
+ std::string req_kind = kind_r->symbol ();
+
+ if( req_kind == "product" ) {
+ kind = zypp::ResKind::product;
+ }
+ else if ( req_kind == "patch" ) {
+ kind = zypp::ResKind::patch;
+ }
+ else if ( req_kind == "package" ) {
+ kind = zypp::ResKind::package;
+ }
+ else if ( req_kind == "srcpackage" ) {
+ kind = zypp::ResKind::srcpackage;
+ }
+ else if ( req_kind == "pattern" ) {
+ kind = zypp::ResKind::pattern;
+ }
+ else
+ {
+ y2error("Unknown symbol: %s", req_kind.c_str());
+ return false;
+ }
+
+ std::string name(name_r.isNull() ? "" : name_r->value());
+
+ if (name.empty())
+ {
+ y2error("Empty resolvable name");
+ return false;
+ }
+
+ zypp::ui::Selectable::Ptr s = zypp::ui::Selectable::get(kind, name);
+
+ if (s)
+ {
+ y2milestone("%s: %s:%s ", install ? "Installing" : "Removing", req_kind.c_str(), name.c_str());
+ return install ? s->setToInstall(zypp::ResStatus::APPL_HIGH):
+ s->setToDelete(zypp::ResStatus::APPL_HIGH);
+ }
+ else
+ {
+ y2error("Resolvable %s:%s was not found", req_kind.c_str(), name.c_str());
+ }
+
+ return false;
}
// ------------------------
/**
@builtin ResolvableInstall
@short Install all resolvables with selected name and kind
- @param name_r name of the resolvable, if empty ("") install all resolvables of the kind
- @param kind_r kind of resolvable, can be `product, `patch, `package, `selection or `pattern
+ @param name_r name of the resolvable
+ @param kind_r kind of resolvable, can be `product, `patch, `package, `srcpackage or `pattern
@return boolean false if failed
*/
YCPValue
PkgModuleFunctions::ResolvableInstall( const YCPString& name_r, const YCPSymbol& kind_r )
{
- return ResolvableInstallArchVersion(name_r, kind_r, YCPString(zypp_ptr()->architecture().asString()), YCPString(""));
+ // true = install
+ return YCPBoolean(ResolvableInstallOrDelete(name_r, kind_r, true));
}
// ------------------------
/**
@builtin ResolvableRemove
@short Removes all resolvables with selected name and kind
- @param name_r name of the resolvable, if empty ("") remove all resolvables of the kind
- @param kind_r kind of resolvable, can be `product, `patch, `package, `selection or `pattern
+ @param name_r name of the resolvable
+ @param kind_r kind of resolvable, can be `product, `patch, `package, `srcpackage or `pattern
@return boolean false if failed
*/
YCPValue
PkgModuleFunctions::ResolvableRemove ( const YCPString& name_r, const YCPSymbol& kind_r )
{
- zypp::Resolvable::Kind kind;
-
- std::string req_kind = kind_r->symbol ();
-
- if( req_kind == "product" ) {
- kind = zypp::ResTraits<zypp::Product>::kind;
- }
- else if ( req_kind == "patch" ) {
- kind = zypp::ResTraits<zypp::Patch>::kind;
- }
- else if ( req_kind == "package" ) {
- kind = zypp::ResTraits<zypp::Package>::kind;
- }
- else if ( req_kind == "selection" ) {
- kind = zypp::ResTraits<zypp::Selection>::kind;
- }
- else if ( req_kind == "pattern" ) {
- kind = zypp::ResTraits<zypp::Pattern>::kind;
- }
- else
- {
- y2error("Pkg::ResolvableRemove: unknown symbol: %s", req_kind.c_str());
- return YCPBoolean(false);
- }
-
- return YCPBoolean(
- (name_r->value().empty())
- ? DoRemoveAllKind(kind)
- : DoRemoveNameKind (name_r->value(), kind)
- );
+ // false = remove
+ return YCPBoolean(ResolvableInstallOrDelete(name_r, kind_r, false));
}
// ------------------------
/**
@builtin ResolvableNeutral
@short Remove all transactions from all resolvables with selected name and kind
- @param name_r name of the resolvable, if empty ("") use all resolvables of the kind
- @param kind_r kind of resolvable, can be `product, `patch, `package, `selection or `pattern
+ @param name_r name of the resolvable, if empty ("") use all resolvables of the kind
+ @param kind_r kind of resolvable, can be `product, `patch, `package, `srcpackage or `pattern
@param force_r remove the transactions even on USER level - default is APPL_HIGH (use true value only if really needed!)
@return boolean false if failed
*/
@@ -172,25 +233,25 @@
PkgModuleFunctions::ResolvableNeutral ( const YCPString& name_r, const YCPSymbol& kind_r, const YCPBoolean& force_r )
{
zypp::Resolvable::Kind kind;
-
+
std::string req_kind = kind_r->symbol();
std::string name = name_r->value();
bool force = force_r->value();
if( req_kind == "product" ) {
- kind = zypp::ResTraits<zypp::Product>::kind;
+ kind = zypp::ResKind::product;
}
else if ( req_kind == "patch" ) {
- kind = zypp::ResTraits<zypp::Patch>::kind;
+ kind = zypp::ResKind::patch;
}
else if ( req_kind == "package" ) {
- kind = zypp::ResTraits<zypp::Package>::kind;
+ kind = zypp::ResKind::package;
}
- else if ( req_kind == "selection" ) {
- kind = zypp::ResTraits<zypp::Selection>::kind;
+ else if ( req_kind == "srcpackage" ) {
+ kind = zypp::ResKind::srcpackage;
}
else if ( req_kind == "pattern" ) {
- kind = zypp::ResTraits<zypp::Pattern>::kind;
+ kind = zypp::ResKind::pattern;
}
else
{
@@ -202,24 +263,20 @@
try
{
- for (zypp::ResPool::byKind_iterator it = zypp_ptr()->pool().byKindBegin(kind);
- it != zypp_ptr()->pool().byKindEnd(kind);
- ++it)
+ if (name.empty())
{
- if (name.empty() || (*it)->name() == name)
+ for (zypp::ResPoolProxy::const_iterator it = zypp_ptr()->poolProxy().byKindBegin(kind);
+ it != zypp_ptr()->poolProxy().byKindEnd(kind);
+ ++it)
{
- if (!it->status().resetTransact(whoWantsIt))
- {
- ret = false;
- }
-
- // force neutralization on the user level
- if (force && !it->status().resetTransact(zypp::ResStatus::USER))
- {
- ret = false;
- }
+ ret = (*it)->unset(force ? zypp::ResStatus::USER : whoWantsIt) && ret;
}
}
+ else
+ {
+ zypp::ui::Selectable::Ptr s = zypp::ui::Selectable::get(kind, name);
+ ret = s ? s->unset(force ? zypp::ResStatus::USER : whoWantsIt) : false;
+ }
}
catch (...)
{
@@ -234,32 +291,32 @@
@builtin ResolvableSetSoftLock
@short Soft lock - it prevents the solver from re-selecting item
if it's recommended (if it's required it will be selected).
- @param name_r name of the resolvable, if empty ("") use all resolvables of the kind
- @param kind_r kind of resolvable, can be `product, `patch, `package, `selection or `pattern
+ @param name_r name of the resolvable, if empty ("") use all resolvables of the kind
+ @param kind_r kind of resolvable, can be `product, `patch, `package, `srcpackage or `pattern
@return boolean false if failed
*/
YCPValue
PkgModuleFunctions::ResolvableSetSoftLock ( const YCPString& name_r, const YCPSymbol& kind_r )
{
zypp::Resolvable::Kind kind;
-
+
std::string req_kind = kind_r->symbol();
std::string name = name_r->value();
if( req_kind == "product" ) {
- kind = zypp::ResTraits<zypp::Product>::kind;
+ kind = zypp::ResKind::product;
}
else if ( req_kind == "patch" ) {
- kind = zypp::ResTraits<zypp::Patch>::kind;
+ kind = zypp::ResKind::patch;
}
else if ( req_kind == "package" ) {
- kind = zypp::ResTraits<zypp::Package>::kind;
+ kind = zypp::ResKind::package;
}
- else if ( req_kind == "selection" ) {
- kind = zypp::ResTraits<zypp::Selection>::kind;
+ else if ( req_kind == "srcpackage" ) {
+ kind = zypp::ResKind::package;
}
else if ( req_kind == "pattern" ) {
- kind = zypp::ResTraits<zypp::Pattern>::kind;
+ kind = zypp::ResKind::pattern;
}
else
{
@@ -271,18 +328,20 @@
try
{
- for (zypp::ResPool::byKind_iterator it = zypp_ptr()->pool().byKindBegin(kind);
- it != zypp_ptr()->pool().byKindEnd(kind);
- ++it)
+ if (name.empty())
{
- if (name.empty() || (*it)->name() == name)
+ for (zypp::ResPoolProxy::const_iterator it = zypp_ptr()->poolProxy().byKindBegin(kind);
+ it != zypp_ptr()->poolProxy().byKindEnd(kind);
+ ++it)
{
- if (!it->status().setSoftLock(whoWantsIt))
- {
- ret = false;
- }
+ ret = (*it)->theObj().status().setSoftLock(whoWantsIt) && ret;
}
}
+ else
+ {
+ zypp::ui::Selectable::Ptr s = zypp::ui::Selectable::get(kind, name);
+ ret = s ? s->theObj().status().setSoftLock(whoWantsIt) : false;
+ }
}
catch (...)
{
@@ -292,22 +351,92 @@
return YCPBoolean(ret);
}
-
/**
@builtin ResolvableProperties
@short Return properties of resolvable
@description
return list of resolvables of selected kind with required name
-
+
@param name name of the resolvable, if empty returns all resolvables of the kind
- @param kind_r kind of resolvable, can be `product, `patch, `package, `selection, `pattern or `language
+ @param kind_r kind of resolvable, can be `product, `patch, `package, `pattern or `language
@param version version of the resolvable, if empty all versions are returned
@return list<map<string,any>> list of $[ "name":string, "version":string, "arch":string, "source":integer, "status":symbol, "locked":boolean ] maps
- status is `installed, `selected or `available, source is source ID or -1 if the resolvable is installed in the target
+ status is `installed, `removed, `selected or `available, source is source ID or -1 if the resolvable is installed in the target
if status is `available and locked is true then the object is set to taboo,
if status is `installed and locked is true then the object locked
+ if status is `selected or `removed there is extra key "transact_by" : symbol, where symbol is `user (the highest level),
+ `app_high (selected by Yast), `app_low and `solver (the lowest level)
+
+ @example
+ Additionally to keys returned for all resolvables, there also some
+ resolvable-specific ones:
+
+ `product keys:
+ + "category"
+ + "display_name"
+ + "short_name"
+ + "update_urls"
+ + "flags"
+ + "extra_urls"
+ + "optional_urls"
+ + "register_urls"
+ + "relnotes_urls"
+ + "smolt_urls"
+ + "register_target"
+ + "register_release"
+ + "flavor"
+ + "replaces"
+ + "name"
+ + "version"
+ + "arch"
+ + "description"
+ + "display_name"
+ + "short_name"
+ + "product_file" -> string : product file (full file name with target root prefix)
+ + "upgrades" -> list<map> : parsed data from the product file (upgrades section)
+ + "name" -> string
+ + "summary" -> string
+ + "repository" -> string : URL path
+ + "notify" -> boolean
+ + "status" -> string
+ `patch keys:
+ + "interactive"
+ + "reboot_needed"
+ + "relogin_needed"
+ + "affects_pkg_manager"
+ + "is_needed"
+ `package keys:
+ + "path"
+ + "location"
+ `pattern keys:
+ + "category"
+ + "user_visible"
+ + "default"
+ + "icon"
+ + "script"
+ + "order"
+ `language keys:
+ + "code"
+ + "packages"
+ + "requested"
+
+ If dependencies are requested, this keys are additionally used:
+ + "provides"
+ + "prerequires"
+ + "requires"
+ + "conflicts"
+ + "obsoletes"
+ + "recommends"
+ + "suggests"
+ + "enhances"
+ + "supplements"
+
+ All the dependencies use maps with these keys:
+ + "res_kind"
+ + "name"
+ + "dep_kind"
*/
YCPValue
@@ -329,211 +458,485 @@
return ResolvablePropertiesEx (name, kind_r, version, true);
}
-YCPValue
-PkgModuleFunctions::ResolvablePropertiesEx(const YCPString& name, const YCPSymbol& kind_r, const YCPString& version, bool dependencies)
+static std::string TransactToString(zypp::ResStatus::TransactByValue trans)
{
- zypp::Resolvable::Kind kind;
- std::string req_kind = kind_r->symbol ();
- std::string nm = name->value();
- std::string vers = version->value();
- YCPList ret;
+ std::string ret;
- if( req_kind == "product" ) {
- kind = zypp::ResTraits<zypp::Product>::kind;
- }
- else if ( req_kind == "patch" ) {
- kind = zypp::ResTraits<zypp::Patch>::kind;
- }
- else if ( req_kind == "package" ) {
- kind = zypp::ResTraits<zypp::Package>::kind;
+ switch(trans)
+ {
+ case zypp::ResStatus::USER : ret = "user"; break;
+ case zypp::ResStatus::APPL_HIGH : ret = "app_high"; break;
+ case zypp::ResStatus::APPL_LOW : ret = "app_low"; break;
+ case zypp::ResStatus::SOLVER : ret = "solver"; break;
}
- else if ( req_kind == "selection" ) {
- kind = zypp::ResTraits<zypp::Selection>::kind;
+
+ return ret;
+}
+
+YCPMap PkgModuleFunctions::Resolvable2YCPMap(const zypp::PoolItem &item, const std::string &req_kind, bool dependencies)
+{
+ YCPMap info;
+
+ info->add(YCPString("name"), YCPString(item->name()));
+ info->add(YCPString("version"), YCPString(item->edition().asString()));
+ info->add(YCPString("arch"), YCPString(item->arch().asString()));
+ info->add(YCPString("description"), YCPString(item->description()));
+
+ std::string resolvable_summary = item->summary();
+ if (resolvable_summary.size() > 0)
+ {
+ info->add(YCPString("summary"), YCPString(resolvable_summary));
}
- else if ( req_kind == "pattern" ) {
- kind = zypp::ResTraits<zypp::Pattern>::kind;
+
+ // status
+ std::string stat;
+
+ zypp::ResStatus status = item.status();
+
+ if (status.isToBeInstalled())
+ {
+ stat = "selected";
}
- else if ( req_kind == "language" ) {
- kind = zypp::ResTraits<zypp::Language>::kind;
+ else if (status.isInstalled() || status.isSatisfied())
+ {
+ if (status.isToBeUninstalled())
+ {
+ stat = "removed";
+ }
+ else
+ {
+ stat = "installed";
+ }
}
else
{
- y2error("Pkg::ResolvableProperties: unknown symbol: %s", req_kind.c_str());
- return ret;
+ stat = "available";
}
- std::list<zypp::SourceManager::SourceId> source_ids = zypp::SourceManager::sourceManager()->enabledSources();
-
- try
- {
- for (zypp::ResPool::byKind_iterator it = zypp_ptr()->pool().byKindBegin(kind);
- it != zypp_ptr()->pool().byKindEnd(kind);
- ++it)
+ info->add(YCPString("transact_by"), YCPSymbol(TransactToString(status.getTransactByValue())));
+
+ info->add(YCPString("status"), YCPSymbol(stat));
+
+ // is the resolvable locked? (Locked or Taboo in the UI)
+ info->add(YCPString("locked"), YCPBoolean(status.isLocked()));
+
+ // source
+ info->add(YCPString("source"), YCPInteger(logFindAlias(item->repoInfo().alias())));
+
+ // add license info if it is defined
+ std::string license = item->licenseToConfirm();
+ if (!license.empty())
+ {
+ info->add(YCPString("license_confirmed"), YCPBoolean(item.status().isLicenceConfirmed()));
+ info->add(YCPString("license"), YCPString(license));
+ }
+
+ info->add(YCPString("download_size"), YCPInteger(item->downloadSize()));
+ info->add(YCPString("inst_size"), YCPInteger(item->installSize()));
+
+ info->add(YCPString("medium_nr"), YCPInteger(item->mediaNr()));
+ info->add(YCPString("vendor"), YCPString(item->vendor()));
+
+
+ // package specific info
+ if( req_kind == "package" )
+ {
+ zypp::Package::constPtr pkg = boost::dynamic_pointer_cast<const zypp::Package>(item.resolvable());
+ if ( pkg )
{
- if ((nm.empty() || nm == (*it)->name())
- && (vers.empty() || vers == (*it)->edition().asString()))
+ std::string tmp = pkg->location().filename().asString();
+ if (!tmp.empty())
{
- YCPMap info;
+ info->add(YCPString("path"), YCPString(tmp));
+ }
+
+ tmp = pkg->location().filename().basename();
+ if (!tmp.empty())
+ {
+ info->add(YCPString("location"), YCPString(tmp));
+ }
+ } else
+ {
+ y2error("package %s is not a package", item->name().c_str() );
+ }
+ }
+ // product specific info
+ else if( req_kind == "product" ) {
+ zypp::Product::constPtr product = boost::dynamic_pointer_cast<const zypp::Product>(item.resolvable());
+ if ( !product )
+ {
+ y2error("product %s is not a product", item->name().c_str() );
+ return YCPMap();
+ }
- info->add(YCPString("name"), YCPString((*it)->name()));
- info->add(YCPString("version"), YCPString((*it)->edition().asString()));
- info->add(YCPString("arch"), YCPString((*it)->arch().asString()));
- info->add(YCPString("description"), YCPString((*it)->description()));
+ std::string category(product->isTargetDistribution() ? "base" : "addon");
- std::string resolvable_summary = (*it)->summary();
- if (resolvable_summary.size() > 0)
- {
- info->add(YCPString("summary"), YCPString((*it)->summary()));
- }
+ info->add(YCPString("category"), YCPString(category));
+ info->add(YCPString("type"), YCPString(category));
+ info->add(YCPString("relnotes_url"), YCPString(product->releaseNotesUrls().first().asString()));
+
+ std::string product_summary = product->summary();
+ if (product_summary.size() > 0)
+ {
+ info->add(YCPString("display_name"), YCPString(product_summary));
+ }
+
+ std::string product_shortname = product->shortName();
+ if (product_shortname.size() > 0)
+ {
+ info->add(YCPString("short_name"), YCPString(product_shortname));
+ }
+ // use summary for the short name if it's defined
+ else if (product_summary.size() > 0)
+ {
+ info->add(YCPString("short_name"), YCPString(product_summary));
+ }
+
+ YCPList updateUrls(asYCPList(product->updateUrls()));
+ info->add(YCPString("update_urls"), updateUrls);
+
+ YCPList flags;
+ std::list<std::string> pflags = product->flags();
+ for (std::list<std::string>::const_iterator flag_it = pflags.begin();
+ flag_it != pflags.end(); ++flag_it)
+ {
+ flags->add(YCPString(*flag_it));
+ }
+ info->add(YCPString("flags"), flags);
+
+ YCPList extraUrls( asYCPList(product->extraUrls()) );
+ if ( extraUrls.size() )
+ {
+ info->add(YCPString("extra_urls"), extraUrls);
+ }
+
+ YCPList optionalUrls( asYCPList(product->optionalUrls()) );
+ if ( optionalUrls.size() )
+ {
+ info->add(YCPString("optional_urls"), optionalUrls);
+ }
+
+ YCPList registerUrls( asYCPList(product->registerUrls()) );
+ if ( registerUrls.size() )
+ {
+ info->add(YCPString("register_urls"), registerUrls);
+ }
+
+ YCPList smoltUrls( asYCPList(product->smoltUrls()) );
+ if ( smoltUrls.size() )
+ {
+ info->add(YCPString("smolt_urls"), smoltUrls);
+ }
+
+ YCPList relNotesUrls(asYCPList(product->releaseNotesUrls()));
+ if ( relNotesUrls.size() )
+ {
+ info->add(YCPString("relnotes_urls"), relNotesUrls);
+ }
+
+ // registration data
+ info->add(YCPString("register_target"), YCPString(product->registerTarget()));
+ info->add(YCPString("register_release"), YCPString(product->registerRelease()));
+
+ // Live CD, FTP Edition...
+ info->add(YCPString("flavor"), YCPString(product->flavor()));
+
+ // get the installed Products it would replace.
+ zypp::Product::ReplacedProducts replaced(product->replacedProducts());
+
+ if (!replaced.empty())
+ {
+ YCPList rep_prods;
+
+ // add the products to the list
+ for_( it, replaced.begin(), replaced.end() )
+ {
+ // The current replaced Product.
+ zypp::Product::constPtr replacedProduct(*it);
- // status
- std::string stat;
+ if (!replacedProduct) continue;
- if (it->status().isToBeInstalled())
+ YCPMap rprod;
+ rprod->add(YCPString("name"), YCPString(replacedProduct->name()));
+ rprod->add(YCPString("version"), YCPString(replacedProduct->edition().asString()));
+ rprod->add(YCPString("arch"), YCPString(replacedProduct->arch().asString()));
+ rprod->add(YCPString("description"), YCPString(replacedProduct->description()));
+
+ std::string product_summary = replacedProduct->summary();
+ if (product_summary.size() > 0)
{
- stat = "selected";
+ rprod->add(YCPString("display_name"), YCPString(product_summary));
}
- else if (it->status().isInstalled() || it->status().isSatisfied())
+
+ std::string product_shortname = replacedProduct->shortName();
+ if (product_shortname.size() > 0)
{
- stat = it->status().isToBeUninstalled() ? "removed" : "installed";
+ rprod->add(YCPString("short_name"), YCPString(product_shortname));
}
- else
+ // use summary for the short name if it's defined
+ else if (product_summary.size() > 0)
{
- stat = "available";
+ rprod->add(YCPString("short_name"), YCPString(product_summary));
}
+ }
- info->add(YCPString("status"), YCPSymbol(stat));
+ info->add(YCPString("replaces"), rep_prods);
+ }
- // is the resolvable locked? (Locked or Taboo in the UI)
- info->add(YCPString("locked"), YCPBoolean(it->status().isLocked()));
+ std::string product_file;
- // source
- zypp::Source_Ref res_src = (*it)->source();
- info->add(YCPString("source"), YCPInteger(res_src.numericId()));
-
- // product specific info
- if( req_kind == "product" ) {
- zypp::Product::constPtr product = boost::dynamic_pointer_cast<const zypp::Product>(it->resolvable());
- info->add(YCPString("category"), YCPString(product->category()));
- info->add(YCPString("vendor"), YCPString(product->vendor()));
- info->add(YCPString("relnotes_url"), YCPString(product->releaseNotesUrl().asString()));
+ // add reference file in /etc/products.d
+ if (status.isInstalled())
+ {
+ product_file = (_target_root + "/etc/products.d/" + product->referenceFilename()).asString();
+ y2milestone("Parsing product file %s", product_file.c_str());
+ const zypp::parser::ProductFileData productFileData = zypp::parser::ProductFileReader::scanFile(product_file);
- std::string product_summary = product->summary();
- if (product_summary.size() > 0)
- {
- info->add(YCPString("display_name"), YCPString(product_summary));
- }
+ YCPList upgrade_list;
- std::string product_shortname = product->shortName();
- if (product_shortname.size() > 0)
- {
- info->add(YCPString("short_name"), YCPString(product_shortname));
- }
- // use summary for the short name if it's defined
- else if (product_summary.size() > 0)
- {
- info->add(YCPString("short_name"), YCPString(product_summary));
- }
+ for_( upit, productFileData.upgrades().begin(), productFileData.upgrades().end() )
+ {
+ const zypp::parser::ProductFileData::Upgrade & upgrade( *upit );
+ YCPMap upgrades;
+ upgrades->add(YCPString("name"), YCPString(upgrade.name()));
+ upgrades->add(YCPString("summary"), YCPString(upgrade.summary()));
+ upgrades->add(YCPString("repository"), YCPString(upgrade.repository()));
+ upgrades->add(YCPString("notify"), YCPBoolean(upgrade.notify()));
+ upgrades->add(YCPString("status"), YCPString(upgrade.status()));
+ upgrades->add(YCPString("product"), YCPString(upgrade.product()));
- YCPList updateUrls;
- std::list<zypp::Url> pupdateUrls = product->updateUrls();
- for (std::list<zypp::Url>::const_iterator it = pupdateUrls.begin(); it != pupdateUrls.end(); ++it)
- {
- updateUrls->add(YCPString(it->asString()));
- }
- info->add(YCPString("update_urls"), updateUrls);
+ upgrade_list->add(upgrades);
+ }
- YCPList flags;
- std::list<std::string> pflags = product->flags();
- for (std::list<std::string>::const_iterator flag_it = pflags.begin();
- flag_it != pflags.end(); ++flag_it)
- {
- flags->add(YCPString(*flag_it));
- }
- info->add(YCPString("flags"), flags);
+ info->add(YCPString("upgrades"), upgrade_list);
+ }
+ else
+ {
+ // get the package
+ zypp::sat::Solvable refsolvable = product->referencePackage();
+
+ if (refsolvable != zypp::sat::Solvable::noSolvable)
+ {
+ // create a package pointer from the SAT solvable
+ zypp::Package::Ptr refpkg(zypp::make<zypp::Package>(refsolvable));
+
+ if (refpkg)
+ {
+ // get the package files
+ zypp::Package::FileList files( refpkg->filelist() );
+ y2milestone("The reference package has %d files", files.size());
+
+ zypp::str::smatch what;
+ const zypp::str::regex product_file_regex("^/etc/products\\.d/(.*\\.prod)$");
- std::list<zypp::Url> pextraUrls = product->extraUrls();
- if (pextraUrls.size() > 0)
+ // find the product file
+ for_(iter, files.begin(), files.end())
{
- YCPList extraUrls;
- for (std::list<zypp::Url>::const_iterator it = pextraUrls.begin(); it != pextraUrls.end(); ++it)
+ if (zypp::str::regex_match(*iter, what, product_file_regex))
{
- extraUrls->add(YCPString(it->asString()));
+ product_file = what[1];
+ break;
}
- info->add(YCPString("extra_urls"), extraUrls);
}
+ }
+ }
+ }
+
+ if (product_file.empty())
+ {
+ y2warning("The product file has not been found");
+ }
+ else
+ {
+ y2milestone("Found product file %s", product_file.c_str());
+ info->add(YCPString("product_file"), YCPString(product_file));
+ }
+ }
+ // pattern specific info
+ else if ( req_kind == "pattern" ) {
+ zypp::Pattern::constPtr pattern = boost::dynamic_pointer_cast<const zypp::Pattern>(item.resolvable());
+ info->add(YCPString("category"), YCPString(pattern->category()));
+ info->add(YCPString("user_visible"), YCPBoolean(pattern->userVisible()));
+ info->add(YCPString("default"), YCPBoolean(pattern->isDefault()));
+ info->add(YCPString("icon"), YCPString(pattern->icon().asString()));
+ info->add(YCPString("script"), YCPString(pattern->script().asString()));
+ info->add(YCPString("order"), YCPString(pattern->order()));
+ }
+ // patch specific info
+ else if ( req_kind == "patch" )
+ {
+ zypp::Patch::constPtr patch_ptr = boost::dynamic_pointer_cast<const zypp::Patch>(item.resolvable());
+
+ info->add(YCPString("interactive"), YCPBoolean(patch_ptr->interactive()));
+ info->add(YCPString("reboot_needed"), YCPBoolean(patch_ptr->rebootSuggested()));
+ info->add(YCPString("relogin_needed"), YCPBoolean(patch_ptr->reloginSuggested()));
+ info->add(YCPString("affects_pkg_manager"), YCPBoolean(patch_ptr->restartSuggested()));
+ info->add(YCPString("is_needed"), YCPBoolean(item.isBroken()));
+ }
+
+ // dependency info
+ if (dependencies)
+ {
+ std::set<std::string> _kinds;
+ _kinds.insert("provides");
+ _kinds.insert("prerequires");
+ _kinds.insert("requires");
+ _kinds.insert("conflicts");
+ _kinds.insert("obsoletes");
+ _kinds.insert("recommends");
+ _kinds.insert("suggests");
+ _kinds.insert("enhances");
+ _kinds.insert("supplements");
+ YCPList ycpdeps;
+ YCPList rawdeps;
+ for (std::set<std::string>::const_iterator kind_it = _kinds.begin();
+ kind_it != _kinds.end(); ++kind_it)
+ {
+ try {
+ zypp::Dep depkind(*kind_it);
+ zypp::Capabilities deps = item.resolvable()->dep(depkind);
+
+ // add raw dependencies
+ for_(it, deps.begin(), deps.end())
+ {
+ YCPMap rawdep;
+ rawdep->add(YCPString(*kind_it), YCPString(it->asString()));
+ rawdeps->add(rawdep);
+ }
+
+ zypp::sat::WhatProvides prv(deps);
- std::list<zypp::Url> poptionalUrls = product->optionalUrls();
- if (poptionalUrls.size() > 0)
+ // resolve dependencies
+ for (zypp::sat::WhatProvides::const_iterator d = prv.begin(); d != prv.end(); ++d)
+ {
+ if (d->kind().asString().empty() || d->name().empty())
+ {
+ y2debug("Empty kind or name: kind: %s, name: %s", d->kind().asString().c_str(), d->name().c_str());
+ }
+ else
{
- YCPList optionalUrls;
- for (std::list<zypp::Url>::const_iterator it = poptionalUrls.begin(); it != poptionalUrls.end(); ++it)
+ YCPMap ycpdep;
+ ycpdep->add (YCPString ("res_kind"), YCPString (d->kind().asString()));
+ ycpdep->add (YCPString ("name"), YCPString (d->name()));
+ ycpdep->add (YCPString ("dep_kind"), YCPString (*kind_it));
+
+ if (!ycpdeps.contains(ycpdep))
{
- optionalUrls->add(YCPString(it->asString()));
+ ycpdeps->add (ycpdep);
}
- info->add(YCPString("optional_urls"), optionalUrls);
}
}
+ }
+ catch (...)
+ {}
+ }
- // pattern specific info
- if ( req_kind == "pattern" ) {
- zypp::Pattern::constPtr pattern = boost::dynamic_pointer_cast<const zypp::Pattern>(it->resolvable());
- info->add(YCPString("category"), YCPString(pattern->category()));
- info->add(YCPString("user_visible"), YCPBoolean(pattern->userVisible()));
- info->add(YCPString("default"), YCPBoolean(pattern->isDefault()));
- info->add(YCPString("icon"), YCPString(pattern->icon().asString()));
- info->add(YCPString("script"), YCPString(pattern->script().asString()));
- }
+ if (ycpdeps.size() > 0)
+ {
+ info->add (YCPString ("dependencies"), ycpdeps);
+ }
+
+ if (rawdeps.size() > 0)
+ {
+ info->add (YCPString ("deps"), rawdeps);
+ }
+ }
+
+ return info;
+}
+
+YCPValue
+PkgModuleFunctions::ResolvablePropertiesEx(const YCPString& name, const YCPSymbol& kind_r, const YCPString& version, bool dependencies)
+{
+ zypp::Resolvable::Kind kind;
+ std::string req_kind = kind_r->symbol ();
+ std::string nm = name->value();
+ std::string vers = version->value();
+ YCPList ret;
+
+ if( req_kind == "product" ) {
+ kind = zypp::ResKind::product;
+ }
+ else if ( req_kind == "patch" ) {
+ kind = zypp::ResKind::patch;
+ }
+ else if ( req_kind == "package" ) {
+ kind = zypp::ResKind::package;
+ }
+ else if ( req_kind == "pattern" ) {
+ kind = zypp::ResKind::pattern;
+ }
+ else if ( req_kind == "language" )
+ {
+ try
+ {
+ const zypp::LocaleSet &avlocales( zypp::ResPool::instance().getAvailableLocales() );
+
+ for_( it, avlocales.begin(), avlocales.end() )
+ {
+ zypp::sat::LocaleSupport myLocale( *it );
+
+ YCPMap lang_map;
+
+ lang_map->add(YCPString("name"), YCPString(myLocale.locale().name()));
+ lang_map->add(YCPString("code"), YCPString(myLocale.locale().code()));
+ lang_map->add(YCPString("packages"), YCPBoolean(myLocale.isAvailable()));
+ lang_map->add(YCPString("requested"), YCPBoolean(myLocale.isRequested()));
+
+ ret->add(lang_map);
+ }
+ }
+ catch(const zypp::Exception &expt)
+ {
+ y2error("Caught exception: %s", expt.asString().c_str());
+ _last_error.setLastError(ExceptionAsString(expt));
+ return YCPVoid();
+ }
+
+ return ret;
+ }
+ else
+ {
+ y2error("Pkg::ResolvableProperties: unknown symbol: %s", req_kind.c_str());
+ return ret;
+ }
- // patch specific info
- if ( req_kind == "patch" )
+ try
+ {
+ for (zypp::ResPoolProxy::const_iterator it = zypp_ptr()->poolProxy().byKindBegin(kind);
+ it != zypp_ptr()->poolProxy().byKindEnd(kind);
+ ++it)
+ {
+ zypp::ui::Selectable::Ptr s = (*it);
+
+ if (nm.empty() || nm == s->name())
+ {
+ if (!s->installedEmpty())
{
- zypp::Patch::constPtr patch_ptr = boost::dynamic_pointer_cast<const zypp::Patch>(it->resolvable());
-
- info->add(YCPString("interactive"), YCPBoolean(patch_ptr->interactive()));
- info->add(YCPString("reboot_needed"), YCPBoolean(patch_ptr->reboot_needed()));
- info->add(YCPString("affects_pkg_manager"), YCPBoolean(patch_ptr->affects_pkg_manager()));
- info->add(YCPString("is_needed"), YCPBoolean(it->status().isNeeded()));
+ // iterate over all installed packages
+ for_(inst_it, s->installedBegin(), s->installedEnd())
+ {
+ // check version if required
+ if (vers.empty() || vers == inst_it->resolvable()->edition().asString())
+ {
+ ret->add(Resolvable2YCPMap(*inst_it, req_kind, dependencies));
+ }
+ }
}
- // dependency info
- if (dependencies)
+ if (!s->availableEmpty())
{
- std::set<std::string> _kinds;
- _kinds.insert("provides");
- _kinds.insert("prerequires");
- _kinds.insert("requires");
- _kinds.insert("conflicts");
- _kinds.insert("obsoletes");
- _kinds.insert("recommends");
- _kinds.insert("suggests");
- _kinds.insert("freshens");
- _kinds.insert("enhances");
- _kinds.insert("supplements");
- YCPList ycpdeps;
- for (std::set<std::string>::const_iterator kind_it = _kinds.begin();
- kind_it != _kinds.end(); ++kind_it)
+ // iterate over all available packages
+ for_(avail_it, s->availableBegin(), s->availableEnd())
{
- try {
- zypp::Dep depkind(*kind_it);
- zypp::CapSet deps = it->resolvable()->dep(depkind);
- for (zypp::CapSet::const_iterator d = deps.begin(); d != deps.end(); ++d)
- {
- YCPMap ycpdep;
- ycpdep->add (YCPString ("res_kind"), YCPString (d->refers().asString()));
- ycpdep->add (YCPString ("name"), YCPString (d->asString()));
- ycpdep->add (YCPString ("dep_kind"), YCPString (*kind_it));
- ycpdeps->add (ycpdep);
- }
-
+ // check version if required
+ if (vers.empty() || vers == avail_it->resolvable()->edition().asString())
+ {
+ ret->add(Resolvable2YCPMap(*avail_it, req_kind, dependencies));
}
- catch (...)
- {}
}
- info->add (YCPString ("dependencies"), ycpdeps);
}
- ret->add(info);
}
}
}
@@ -544,12 +947,33 @@
return ret;
}
+bool AnyResolvableHelper(zypp::Resolvable::Kind kind, bool to_install)
+{
+ for (zypp::ResPoolProxy::const_iterator it = zypp::ResPool::instance().proxy().byKindBegin(kind);
+ it != zypp::ResPool::instance().proxy().byKindEnd(kind);
+ ++it)
+ {
+ zypp::ui::Selectable::Fate fate = (*it)->fate();
+
+ if (to_install && fate == zypp::ui::Selectable::TO_INSTALL)
+ {
+ return true;
+ }
+ else if (!to_install && fate == zypp::ui::Selectable::TO_DELETE)
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
/**
@builtin ResolvableCountPatches
@short Count patches which will be selected by ResolvablePreselectPatches() function
@description
Only non-optional patches are selected (even when `all parameter is passed!)
- @param kind_r kind of preselected patches, can be `all, `interactive, `reboot_needed or `affects_pkg_manager
+ @param kind_r kind of preselected patches, can be `all, `interactive, `reboot_needed, `relogin_needed or `affects_pkg_manager
@return integer number of preselected patches
*/
YCPValue
@@ -581,81 +1005,59 @@
std::string kind = kind_r->symbol();
if (kind != "all" && kind != "interactive" && kind != "reboot_needed"
- && kind != "affects_pkg_manager")
+ && kind != "affects_pkg_manager" && kind != "relogin_needed")
{
- return YCPError("Pkg::ResolvablePreselectPatches: Wrong parameter '" + kind + "', use: `all, `interactive, `reboot_needed or `affects_pkg_manager", YCPInteger(0LL));
+ return YCPError("Pkg::ResolvablePreselectPatches: Wrong parameter '" + kind + "', use: `all, `interactive, `reboot_needed, `relogin_needed or `affects_pkg_manager", YCPInteger(0LL));
}
y2milestone("Required kind of patches: %s", kind.c_str());
- std::set<zypp::PoolItem> patches_toinst;
-
- const zypp::ResPool & pool = zypp_ptr()->pool();
+ long long needed_patches = 0LL;
try
{
- zypp::ResPool::byKind_iterator
- b = pool.byKindBegin<zypp::Patch>(),
- e = pool.byKindEnd<zypp::Patch>(),
- i = pool.byKindBegin<zypp::Patch>();
+ // access to the Pool of Selectables
+ zypp::ResPoolProxy selectablePool(zypp::ResPool::instance().proxy());
- for (; i != e; ++i)
+ // Iterate it's Products...
+ for_(it, selectablePool.byKindBegin<zypp::Patch>(), selectablePool.byKindEnd<zypp::Patch>())
{
- zypp::Patch::constPtr pch = zypp::asKind<zypp::Patch>(i->resolvable());
- std::string name(pch->name());
+ y2milestone("Procesing patch %s", (*it)->name().c_str());
+ zypp::ui::Selectable::Ptr s = *it;
- // the best patch for the current arch, no preferred version, only needed patches
- ProvideProcess info(zypp_ptr()->architecture(), "", true);
-
- // search the best version of the patch to install
- try
+ if (s && s->isNeeded() && !s->isUnwanted())
{
- info.whoWantsIt = whoWantsIt;
-
- invokeOnEach( pool.byNameBegin( name ),
- pool.byNameEnd( name ),
- zypp::resfilter::ByKind( zypp::ResTraits<zypp::Patch>::kind ),
- zypp::functor::functorRef<bool,zypp::PoolItem> (info)
- );
+ zypp::Patch::constPtr patch = zypp::dynamic_pointer_cast<const zypp::Patch>
+ (s->candidateObj().resolvable());
- if (!info.item)
+ // dont auto-install optional patches
+ if (patch->category() != "optional")
{
- y2milestone("Patch %s is not applicable", name.c_str());
- continue;
- }
- else
- {
- MIL << "Best version of patch " << i->resolvable() << ": " << info.item.resolvable() << std::endl;
- }
- }
- catch (...)
- {
- y2error("Search for best patch '%s' failed", name.c_str());
- continue;
- }
-
- zypp::Patch::constPtr patch = zypp::asKind<zypp::Patch>(info.item.resolvable());
+ if (kind == "all"
+ || (kind == "interactive" && patch->interactive())
+ || (kind == "affects_pkg_manager" && patch->restartSuggested())
+ || (kind == "reboot_needed" && patch->rebootSuggested())
+ || (kind == "relogin_needed" && patch->reloginSuggested())
+ )
+ {
+ if (preselect)
+ {
+ s->setToInstall(whoWantsIt);
+ }
- // dont auto-install optional patches
- if (patch->category () != "optional")
- {
- if (kind == "all"
- || (kind == "interactive" && patch->interactive())
- || (kind == "affects_pkg_manager" && patch->affects_pkg_manager())
- || (kind == "reboot_needed" && patch->reboot_needed())
- )
- {
- patches_toinst.insert(info.item);
+ // count the patch
+ needed_patches++;
+ }
+ else
+ {
+ y2milestone("Patch %s has not required flag", s->name().c_str());
+ }
}
else
{
- y2milestone("Patch (id) %s has not required flag", patch->id().c_str());
+ y2milestone("Ignoring optional patch : %s", s->name().c_str());
}
}
- else
- {
- y2milestone("Ignoring optional patch (id): %s", patch->id().c_str());
- }
}
}
catch (...)
@@ -663,32 +1065,13 @@
y2error("An error occurred during patch selection.");
}
- y2milestone("Found %d patches", patches_toinst.size());
-
- if (preselect)
- {
- std::set<zypp::PoolItem>::iterator
- b(patches_toinst.begin()),
- e(patches_toinst.end()),
- i(patches_toinst.begin());
-
- for (i = b; i != e; ++i)
- {
- if (i->status().setToBeInstalled(whoWantsIt))
- {
- MIL << "Selecting patch " << i->resolvable() << std::endl;
- }
- }
- }
-
- return YCPInteger(patches_toinst.size());
+ return YCPInteger(needed_patches);
}
-
/**
@builtin IsAnyResolvable
@short Is there any resolvable in the requried state?
- @param symbol kind_r kind of resolvable, can be `product, `patch, `package, `selection, `pattern, `language or `any for any kind of resolvable
+ @param symbol kind_r kind of resolvable, can be `product, `patch, `package, `pattern or `any for any kind of resolvable
@param symbol status status of resolvable, can be `to_install or `to_remove
@return boolean true if a resolvable with the requested status was found
*/
@@ -697,80 +1080,64 @@
{
zypp::Resolvable::Kind kind;
+ if (kind_r.isNull() || status.isNull())
+ {
+ y2error("Invalid nil parameter!");
+ return YCPVoid();
+ }
+
std::string req_kind = kind_r->symbol ();
std::string stat_str = status->symbol();
+ if (stat_str != "to_install" && stat_str != "to_remove")
+ {
+ y2error("Invalid status parameter: %s", stat_str.c_str());
+ return YCPVoid();
+ }
+
+ bool to_install = stat_str == "to_install";
+
if( req_kind == "product" ) {
- kind = zypp::ResTraits<zypp::Product>::kind;
+ kind = zypp::ResKind::product;
}
else if ( req_kind == "patch" ) {
- kind = zypp::ResTraits<zypp::Patch>::kind;
+ kind = zypp::ResKind::patch;
}
else if ( req_kind == "package" ) {
- kind = zypp::ResTraits<zypp::Package>::kind;
- }
- else if ( req_kind == "selection" ) {
- kind = zypp::ResTraits<zypp::Selection>::kind;
+ kind = zypp::ResKind::package;
}
else if ( req_kind == "pattern" ) {
- kind = zypp::ResTraits<zypp::Pattern>::kind;
- }
- else if ( req_kind == "language" ) {
- kind = zypp::ResTraits<zypp::Language>::kind;
+ kind = zypp::ResKind::pattern;
}
else if ( req_kind == "any" ) {
try
- {
- for (zypp::ResPool::const_iterator it = zypp_ptr()->pool().begin();
- it != zypp_ptr()->pool().end();
- ++it)
- {
- if (stat_str == "to_install" && it->status().isToBeInstalled())
- {
- return YCPBoolean(true);
- }
- else if (stat_str == "to_remove" && it->status().isToBeUninstalled())
- {
- return YCPBoolean(true);
- }
- }
+ {
+ return YCPBoolean(
+ AnyResolvableHelper(zypp::ResKind::package, to_install)
+ || AnyResolvableHelper(zypp::ResKind::patch, to_install)
+ || AnyResolvableHelper(zypp::ResKind::product, to_install)
+ || AnyResolvableHelper(zypp::ResKind::pattern, to_install)
+ );
}
catch (...)
{
y2error("An error occurred during resolvable search.");
- return YCPNull();
+ return YCPVoid();
}
-
- return YCPBoolean(false);
}
else
{
y2error("Pkg::IsAnyResolvable: unknown symbol: %s", req_kind.c_str());
- return YCPNull();
+ return YCPVoid();
}
-
try
- {
- for (zypp::ResPool::byKind_iterator it = zypp_ptr()->pool().byKindBegin(kind);
- it != zypp_ptr()->pool().byKindEnd(kind);
- ++it)
- {
- if (stat_str == "to_install" && it->status().isToBeInstalled())
- {
- return YCPBoolean(true);
- }
- else if (stat_str == "to_remove" && it->status().isToBeUninstalled())
- {
- return YCPBoolean(true);
- }
- }
+ {
+ return YCPBoolean(AnyResolvableHelper(kind, to_install));
}
catch (...)
{
y2error("An error occurred during resolvable search.");
- return YCPNull();
+ return YCPVoid();
}
-
- return YCPBoolean(false);
}
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Selection.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Selection.cc (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Selection.cc Tue May 10 20:10:47 2011
@@ -39,9 +39,7 @@
#include <zypp/ResPool.h>
#include <zypp/ResTraits.h>
#include <zypp/Resolvable.h>
-#include <zypp/Selection.h>
#include <zypp/Pattern.h>
-#include <zypp/SourceManager.h>
using std::string;
@@ -76,78 +74,8 @@
YCPValue
PkgModuleFunctions::GetSelections (const YCPSymbol& stat, const YCPString& cat)
{
- string status = stat->symbol();
- string category = cat->value();
-
- // FIXME: this should be done more nicely
- if ( category == "base" )
- category = "baseconf";
-
YCPList selections;
-
- try
- {
- for (zypp::ResPool::byKind_iterator it
- = zypp_ptr()->pool().byKindBegin(zypp::ResTraits<zypp::Selection>::kind);
- it != zypp_ptr()->pool().byKindEnd(zypp::ResTraits<zypp::Selection>::kind) ; ++it )
- {
- string selection;
-
- if (status == "all")
- {
- selection = it->resolvable()->name();
- }
- else if (status == "available")
- {
- // ignore installed selections
- zypp::Source_Ref src = (*it)->source();
-
- if (src != zypp::Source_Ref::noSource)
- selection = it->resolvable()->name();
- }
- else if (status == "selected")
- {
- if( it->status().isToBeInstalled() )
- selection = it->resolvable()->name();
- }
- else if (status == "installed")
- {
- if( it->status().wasInstalled() )
- selection = it->resolvable()->name();
- }
- else
- {
- y2warning (string ("Unknown status in Pkg::GetSelections(" + status + ", ...)").c_str());
- break;
- }
-
- if (selection.empty())
- {
- continue;
- }
-
- string selection_cat = zypp::dynamic_pointer_cast<const zypp::Selection>(it->resolvable())->category();
- if (category != "")
- {
- if ( selection_cat != category)
- {
- continue; // asked for explicit category
- }
- }
- else // category == ""
- {
- if (selection_cat == "baseconf")
- {
- continue; // asked for non-base
- }
- }
- selections->add (YCPString (selection));
- }
- }
- catch (...)
- {
- }
-
+ y2warning("Pkg::GetSelections is obsoleted, selections have been replaced by patterns");
return selections;
}
@@ -181,60 +109,34 @@
YCPValue
PkgModuleFunctions::GetPatterns(const YCPSymbol& stat, const YCPString& cat)
{
- std::string status = stat->symbol();
+ std::string status = stat->symbol();
std::string category = cat->value();
YCPList patterns;
try
{
- for (zypp::ResPool::byKind_iterator it
- = zypp_ptr()->pool().byKindBegin(zypp::ResTraits<zypp::Pattern>::kind);
- it != zypp_ptr()->pool().byKindEnd(zypp::ResTraits<zypp::Pattern>::kind) ; ++it )
+ for (zypp::ResPoolProxy::const_iterator it = zypp_ptr()->poolProxy().byKindBegin(zypp::ResKind::pattern);
+ it != zypp_ptr()->poolProxy().byKindEnd(zypp::ResKind::pattern);
+ ++it)
{
- std::string pattern;
-
- if (status == "all")
- {
- pattern = it->resolvable()->name();
- }
- else if (status == "available")
- {
- // ignore installed patterns
- zypp::Source_Ref src = (*it)->source();
-
- if (src != zypp::Source_Ref::noSource)
- pattern = it->resolvable()->name();
- }
- else if (status == "selected")
- {
- if( it->status().isToBeInstalled() )
- pattern = it->resolvable()->name();
- }
- else if (status == "installed")
- {
- if( it->status().wasInstalled() )
- pattern = it->resolvable()->name();
- }
- else
- {
- y2warning (string ("Unknown status in Pkg::GetPatterns(" + status + ", ...)").c_str());
- break;
- }
- if (pattern.empty())
+ if (status == "all" || (status == "available" && (*it)->hasCandidateObj())
+ // TODO FIXME isSatified() should be here???
+ || (status == "installed" && (*it)->hasInstalledObj())
+ || (status == "selected" && (*it)->fate() == zypp::ui::Selectable::TO_INSTALL)
+ )
{
- continue;
- }
+ // check the required category
+ std::string pattern_cat = zypp::dynamic_pointer_cast<const zypp::Pattern>((*it)->theObj().resolvable())->category();
- std::string pattern_cat = zypp::dynamic_pointer_cast<const zypp::Pattern>(it->resolvable())->category();
+ if (!category.empty() && pattern_cat != category)
+ {
+ continue; // asked for explicit category, but it doesn't match
+ }
- if (!category.empty() && pattern_cat != category)
- {
- continue; // asked for explicit category, but it doesn't match
+ patterns->add(YCPString((*it)->name()));
}
-
- patterns->add (YCPString (pattern));
}
}
catch (...)
@@ -280,45 +182,50 @@
YCPValue
PkgModuleFunctions::PatternData (const YCPString& pat)
{
- YCPMap data;
- std::string name = pat->value();
+ YCPMap ret;
try
{
- zypp::ResPool::byName_iterator it = std::find_if (
- zypp_ptr()->pool().byNameBegin(name)
- , zypp_ptr()->pool().byNameEnd(name)
- , zypp::resfilter::ByKind(zypp::ResTraits<zypp::Pattern>::kind)
- );
+ YCPValue value = ResolvableProperties(pat, YCPSymbol("pattern"), YCPString(""));
+ YCPList lst;
- if ( it != zypp_ptr()->pool().byNameEnd(name) )
+ if (!value.isNull() && value->isList())
{
- zypp::Pattern::constPtr pattern =
- zypp::dynamic_pointer_cast<const zypp::Pattern>(it->resolvable ());
+ lst = value->asList();
+ }
- // pattern found
- data->add (YCPString ("summary"), YCPString (pattern->summary()));
- data->add (YCPString ("category"), YCPString (pattern->category()));
- data->add (YCPString ("visible"), YCPBoolean (pattern->userVisible()));
- data->add (YCPString ("order"), YCPString (pattern->order()));
- data->add (YCPString ("description"), YCPString (pattern->description()));
- data->add (YCPString ("default"), YCPBoolean (pattern->isDefault()));
- data->add (YCPString ("icon"), YCPString (pattern->icon().asString()));
- data->add (YCPString ("script"), YCPString (pattern->script().asString()));
- data->add (YCPString ("version"), YCPString((*it)->edition().asString()));
- data->add (YCPString ("arch"), YCPString((*it)->arch().asString()));
- data->add (YCPString ("srcid"), YCPInteger((*it)->source().numericId()));
+ if (lst->size() >= 1)
+ {
+ YCPValue first = lst->value(0);
+
+ if (!first.isNull() && first->isMap())
+ {
+ ret = first->asMap();
+ }
+
+ if (!ret.isNull())
+ {
+ YCPValue val = ret->value(YCPString("source"));
+ ret->add(YCPString("srcid"), val);
+
+ val = ret->value(YCPString("user_visible"));
+ ret->add(YCPString("visible"), val);
+ }
+ else
+ {
+ return YCPError ("Pattern '" + pat->value() + "' not found", ret);
+ }
}
else
{
- return YCPError ("Pattern '" + name + "' not found", data);
+ return YCPError ("Pattern '" + pat->value() + "' not found", ret);
}
}
catch (...)
{
}
- return data;
+ return ret;
}
@@ -361,75 +268,6 @@
PkgModuleFunctions::SelectionData (const YCPString& sel)
{
YCPMap data;
- string name = sel->value();
-
- /* TODO FIXME
-
- data->add (YCPString ("archivesize"), YCPInteger ((long long) (selection->archivesize())));
-
- tiny_helper_no1 (&data, "requires", selection->requires ());
- tiny_helper_no1 (&data, "conflicts", selection->conflicts ());
- tiny_helper_no1 (&data, "provides", selection->provides ());
- tiny_helper_no1 (&data, "obsoletes", selection->obsoletes ());
- */
-
- try
- {
- zypp::ResPool::byName_iterator it = std::find_if (
- zypp_ptr()->pool().byNameBegin(name)
- , zypp_ptr()->pool().byNameEnd(name)
- , zypp::resfilter::ByKind(zypp::ResTraits<zypp::Selection>::kind)
- );
-
- if ( it != zypp_ptr()->pool().byNameEnd(name) )
- {
- zypp::Selection::constPtr selection =
- zypp::dynamic_pointer_cast<const zypp::Selection>(it->resolvable ());
-
- // selection found
- data->add (YCPString ("summary"), YCPString (selection->summary()));
- data->add (YCPString ("category"), YCPString (selection->category()));
- data->add (YCPString ("visible"), YCPBoolean (selection->visible()));
- data->add (YCPString ("order"), YCPString (selection->order()));
- data->add (YCPString ("description"), YCPString (selection->description()));
-
- /* YCPList recommendslist;
- std::set<std::string> recommends = selection->recommends();
-
- for (std::set<std::string>::const_iterator rec = recommends.begin();
- rec != recommends.end(); rec++)
- {
- if (!((*rec).empty()))
- {
- recommendslist->add(YCPString(*rec));
- }
- }
- data->add (YCPString("recommends"), recommendslist);
-
- YCPList suggestslist;
- std::set<std::string> suggests = selection->suggests();
-
- for (std::set<std::string>::const_iterator sug = suggests.begin();
- sug != suggests.end(); sug++)
- {
- if (!((*sug).empty()))
- {
- suggestslist->add(YCPString(*sug));
- }
- }
- data->add (YCPString("suggests"), recommendslist);
- */
-#warning Report also archivesize, requires, provides, conflicts and obsoletes
- }
- else
- {
- return YCPError ("Selection '" + name + "' not found", data);
- }
- }
- catch (...)
- {
- }
-
return data;
}
@@ -451,47 +289,7 @@
YCPValue
PkgModuleFunctions::SelectionContent (const YCPString& sel, const YCPBoolean& to_delete, const YCPString& lang)
{
-#warning Pkg::SelectionContent to_delete is not supported
-
YCPList data;
- std::string name = sel->value();
- std::string locale = lang->value();
-
- try
- {
- zypp::ResPool::byName_iterator it = std::find_if (
- zypp_ptr()->pool().byNameBegin(name)
- , zypp_ptr()->pool().byNameEnd(name)
- , zypp::resfilter::ByKind(zypp::ResTraits<zypp::Selection>::kind)
- );
-
- if ( it != zypp_ptr()->pool().byNameEnd(name) )
- {
- zypp::Selection::constPtr selection =
- zypp::dynamic_pointer_cast<const zypp::Selection>(it->resolvable ());
-
-#warning implemented correctly?
- // is it correct?
- std::set<std::string> inst = selection->install_packages(zypp::Locale(locale));
-
- for (std::set<std::string>::const_iterator inst_it = inst.begin();
- inst_it != inst.end(); inst_it++)
- {
- if (!((*inst_it).empty()))
- {
- data->add(YCPString(*inst_it));
- }
- }
- }
- else
- {
- return YCPError ("Selection '" + name + "' not found", data);
- }
- }
- catch (...)
- {
- }
-
return data;
}
@@ -512,7 +310,8 @@
YCPBoolean
PkgModuleFunctions::SetSelection (const YCPString& selection)
{
- return DoProvideNameKind( selection->value(), zypp::ResTraits<zypp::Selection>::kind, zypp_ptr()->architecture(), "");
+ y2warning("Pkg::SetSelection is obsoleted, selections have been replaced by patterns");
+ return YCPBoolean(false);
}
// ------------------------
@@ -526,8 +325,8 @@
YCPValue
PkgModuleFunctions::ClearSelection (const YCPString& selection)
{
- ycpwarning( "Pkg::ClearSelection does not reset add-on selections anymore");
- return YCPBoolean( DoRemoveNameKind( selection->value(), zypp::ResTraits<zypp::Selection>::kind ) );
+ y2warning( "Pkg::ClearSelection does not reset add-on selections anymore");
+ return YCPBoolean(false);
}
@@ -538,14 +337,13 @@
@short Activate all selected selections - obsoleted, use PkgSolve() instead
@return boolean true
-
+
@deprecated Use Pkg::PkgSolve instead, selections are solvable now
*/
YCPBoolean
PkgModuleFunctions::ActivateSelections ()
{
y2warning ("Pkg::ActivateSelections is obsolete. Use Pkg::PkgSolve instead");
-
return YCPBoolean (true);
}
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/ServiceManager.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/ServiceManager.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/ServiceManager.cc Tue May 10 20:10:47 2011
@@ -0,0 +1,315 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2008 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+
+#include "log.h"
+#include "ServiceManager.h"
+
+#include <zypp/RepoManager.h>
+#include <y2util/Y2SLog.h>
+
+ServiceManager::ServiceManager() : _services_loaded(false)
+{
+}
+
+ServiceManager::~ServiceManager()
+{
+}
+
+void ServiceManager::LoadServices(const zypp::RepoManager &repomgr)
+{
+ if (!_services_loaded)
+ {
+ for_ (it, repomgr.serviceBegin(), repomgr.serviceEnd())
+ {
+ // set the original alias to the current one
+ PkgService s(*it, it->alias());
+ y2milestone("Loaded service %s (%s)", s.alias().c_str(), s.url().asString().c_str());
+ _known_services.insert(std::make_pair(s.alias(), s));
+ }
+
+ _services_loaded = true;
+ }
+ else
+ {
+ y2warning("Services have already been loaded, skipping load");
+ }
+}
+
+void ServiceManager::SaveServices(zypp::RepoManager &repomgr) const
+{
+ for_ (it, _known_services.begin(), _known_services.end())
+ {
+ // delete
+ if (it->second.isDeleted())
+ {
+ std::string alias(it->second.alias());
+ y2milestone("Removing service %s", alias.c_str());
+ repomgr.removeService(alias);
+ }
+ }
+
+ for_ (it, _known_services.begin(), _known_services.end())
+ {
+ if (!it->second.isDeleted())
+ {
+ SavePkgService(it->second, repomgr);
+ }
+ }
+}
+
+bool ServiceManager::SaveService(const std::string &alias, zypp::RepoManager &repomgr) const
+{
+ PkgServices::const_iterator serv_it = _known_services.find(alias);
+
+ if (serv_it == _known_services.end())
+ {
+ y2error("Service '%s' does not exist", alias.c_str());
+ return false;
+ }
+
+ if (serv_it->second.isDeleted())
+ {
+ y2error("Service '%s' has been deleted", alias.c_str());
+ return false;
+ }
+
+ SavePkgService(serv_it->second, repomgr);
+
+ return true;
+}
+
+bool ServiceManager::RefreshService(const std::string &alias, zypp::RepoManager &repomgr)
+{
+ PkgServices::iterator serv_it = _known_services.find(alias);
+
+ if (serv_it == _known_services.end() || serv_it->second.isDeleted())
+ {
+ y2error("Service '%s' does not exist", alias.c_str());
+ return false;
+ }
+
+ repomgr.refreshService(serv_it->second);
+
+ // load the service from disk
+ PkgService new_service(repomgr.getService(alias), alias);
+ DBG << "Reloaded service: " << new_service;
+
+ // remove the old service
+ _known_services.erase(serv_it);
+ // insert new
+ _known_services.insert(std::make_pair(alias, new_service));
+
+ return true;
+}
+
+ServiceManager::Services ServiceManager::GetServices() const
+{
+ Services ret;
+
+ for_ (it, _known_services.begin(), _known_services.end())
+ {
+ // return only valid services
+ if (!it->second.isDeleted())
+ {
+ ret.push_back(it->second);
+ }
+ }
+
+ return ret;
+}
+
+bool ServiceManager::AddService(const std::string &alias, const std::string &url)
+{
+ if (alias.empty())
+ {
+ y2error("Empty alias for service %s", url.c_str());
+ return false;
+ }
+
+ PkgServices::iterator serv_it = _known_services.find(alias);
+ std::string orig_alias;
+
+ if (serv_it != _known_services.end())
+ {
+ if (serv_it->second.isDeleted())
+ {
+ // remember the original alias
+ // adding a removed service is the same as changing existing one
+ orig_alias = serv_it->second.alias();
+
+ // we are adding an already removed service,
+ // remove the existing service
+ _known_services.erase(serv_it);
+ }
+ else
+ {
+ y2error("Service with alias %s already exists", alias.c_str());
+ return false;
+ }
+ }
+
+ zypp::ServiceInfo info;
+ info.setAlias(alias);
+ info.setUrl(url);
+
+ PkgService srv(info, orig_alias);
+ y2milestone("Adding service %s (orig alias: %s)", alias.c_str(), srv.origAlias().c_str());
+
+ _known_services.insert(std::make_pair(alias, srv));
+
+ return true;
+}
+
+bool ServiceManager::RemoveService(const std::string &alias)
+{
+ PkgServices::iterator serv_it = _known_services.find(alias);
+
+ if (serv_it != _known_services.end())
+ {
+ if (serv_it->second.isDeleted())
+ {
+ y2warning("Service %s has been already removed", alias.c_str());
+ return true;
+ }
+ else
+ {
+ serv_it->second.setDeleted();
+ y2milestone("Service %s has been marked as deleted", alias.c_str());
+ return true;
+ }
+ }
+ else
+ {
+ y2error("Service %s does not exist", alias.c_str());
+ return false;
+ }
+}
+
+void ServiceManager::Reset()
+{
+ y2milestone("Resetting known services...");
+ // reset the internal structures
+ _known_services.clear();
+ _services_loaded = false;
+}
+
+
+zypp::ServiceInfo ServiceManager::GetService(const std::string &alias) const
+{
+ PkgServices::const_iterator serv_it = _known_services.find(alias);
+
+ if (serv_it != _known_services.end())
+ {
+ if (serv_it->second.isDeleted())
+ {
+ y2warning("Service %s has been removed", alias.c_str());
+ return zypp::ServiceInfo::noService;
+ }
+ else
+ {
+ return serv_it->second;
+ }
+ }
+ else
+ {
+ y2error("Service %s does not exist", alias.c_str());
+ return zypp::ServiceInfo::noService;
+ }
+
+ return zypp::ServiceInfo::noService;
+}
+
+bool ServiceManager::SetService(const std::string &old_alias, const zypp::ServiceInfo &srv)
+{
+ PkgServices::const_iterator serv_it = _known_services.find(old_alias);
+
+ if (serv_it != _known_services.end())
+ {
+ if (serv_it->second.isDeleted())
+ {
+ y2warning("Service %s has been removed", old_alias.c_str());
+ return false;
+ }
+ else
+ {
+ // if the alias has been already changed then keep the original alias
+ y2milestone("Setting service: %s (orig alias: %s)", old_alias.c_str(), serv_it->second.origAlias().c_str());
+ DBG << "Properties: " << srv << std::endl;
+ PkgService s(srv, serv_it->second.origAlias());
+ _known_services[srv.alias()] = s;
+ return true;
+ }
+ }
+ else
+ {
+ y2error("Service %s does not exist", old_alias.c_str());
+ return false;
+ }
+
+ return false;
+}
+
+std::string ServiceManager::Probe(const zypp::Url &url, const zypp::RepoManager &repomgr) const
+{
+ y2milestone("Probing service at %s...", url.asString().c_str());
+ std::string ret(repomgr.probeService(url).asString());
+ y2milestone("Detected service type: %s", ret.c_str());
+
+ return ret;
+}
+
+bool ServiceManager::empty() const
+{
+ return _known_services.empty();
+}
+
+
+ServiceManager::Services::size_type ServiceManager::size() const
+{
+ return _known_services.size();
+}
+
+void ServiceManager::SavePkgService(const PkgService &s_known, zypp::RepoManager &repomgr) const
+{
+ const std::string alias(s_known.alias());
+ const zypp::ServiceInfo s_stored = repomgr.getService(alias);
+
+ DBG << "Known Service: " << s_known << std::endl;
+ DBG << "Stored Service: " << s_stored << std::endl;
+
+ std::string orig_alias(s_known.origAlias());
+
+ y2internal("orig_alias: %s", orig_alias.c_str());
+
+ // the old alias is empty for new services
+ if (orig_alias.empty())
+ {
+ y2milestone("Adding new service %s", alias.c_str());
+ // add the service
+ repomgr.addService(s_known);
+ }
+ else
+ {
+ y2milestone("Saving service %s", alias.c_str());
+ // use the old alias
+ repomgr.modifyService(orig_alias, s_known);
+ }
+}
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/ServiceManager.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/ServiceManager.h (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/ServiceManager.h Tue May 10 20:10:47 2011
@@ -0,0 +1,85 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2008 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+
+#include <map>
+#include <string>
+#include "PkgService.h"
+
+namespace zypp
+{
+ class RepoManager;
+}
+
+class ServiceManager
+{
+ public:
+
+ typedef std::list<zypp::ServiceInfo> Services;
+
+ ServiceManager();
+
+ ~ServiceManager();
+
+ Services GetServices() const;
+
+ void LoadServices(const zypp::RepoManager &repomgr);
+
+ void SaveServices(zypp::RepoManager &repomgr) const;
+
+ bool SaveService(const std::string &alias, zypp::RepoManager &repomgr) const;
+
+ bool AddService(const std::string &alias, const std::string &url);
+
+ bool RemoveService(const std::string &alias);
+
+ zypp::ServiceInfo GetService(const std::string &alias) const;
+
+ bool SetService(const std::string &old_alias, const zypp::ServiceInfo &srv);
+
+ bool RefreshService(const std::string &alias, zypp::RepoManager &repomgr);
+
+ std::string Probe(const zypp::Url &url, const zypp::RepoManager &repomgr) const;
+
+ void Reset();
+
+ // is there any service? (incl. deleted!)
+ bool empty() const;
+
+ // number of services (incl. deleted!)
+ Services::size_type size() const;
+
+
+ private:
+
+ // internal helper method
+ void SavePkgService(const PkgService &s_known, zypp::RepoManager &repomgr) const;
+
+ // current alias -> PkgService for convenient search by alias
+ typedef std::map<std::string, PkgService> PkgServices;
+
+ // services have been loaded from system
+ bool _services_loaded;
+
+ // all known services (even deleted)
+ PkgServices _known_services;
+};
+
+
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source.cc (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source.cc Tue May 10 20:10:47 2011
@@ -37,11 +37,8 @@
#include <Callbacks.h>
#include <Callbacks.YCP.h>
-#include <zypp/SourceManager.h>
-#include <zypp/SourceFactory.h>
-#include <zypp/Source.h>
+#include <zypp/RepoManager.h>
#include <zypp/Product.h>
-#include <zypp/target/store/PersistentStorage.h>
#include <zypp/media/MediaManager.h>
#include <zypp/Pathname.h>
@@ -113,26 +110,45 @@
ycp_handler->evaluateCall();
}
}
+
/**
* Logging helper:
* call zypp::SourceManager::sourceManager()->findSource
* and in case of exception, log error and setLastError AND RETHROW
*/
-zypp::Source_Ref PkgModuleFunctions::logFindSource (zypp::SourceManager::SourceId id)
+YRepo_Ptr PkgModuleFunctions::logFindRepository(RepoId id)
{
- zypp::Source_Ref src;
-
try
{
- src = zypp::SourceManager::sourceManager()->findSource(id);
+ if (id < 0 || id >= repos.size())
+ {
+ // not found
+ throw(std::exception());
+ }
+
+ if (!repos[id])
+ {
+ // not found
+ throw(std::exception());
+ }
+
+ if (repos[id]->isDeleted())
+ {
+ y2error("Source %zd has been deleted, the ID is not valid", id);
+ return YRepo_Ptr();
+ }
+
+ return repos[id];
}
- catch (const zypp::Exception& excpt)
+ catch (...)
{
- y2error("Cannot find source %ld: %s",id, excpt.msg().c_str() );
- _last_error.setLastError(excpt.asUserString());
- throw;
+ y2error("Cannot find source with ID: %zd", id);
+ // TODO: improve the error message
+ _last_error.setLastError(_("Cannot find source"));
}
- return src;
+
+ // not found, return empty pointer
+ return YRepo_Ptr();
}
/****************************************************************************************
@@ -148,7 +164,6 @@
return YCPBoolean( true );
}
-
/****************************************************************************************
* @builtin SourceRestore
*
@@ -161,46 +176,92 @@
* @return boolean True on success
**/
YCPValue
-PkgModuleFunctions::SourceRestore()
+PkgFunctions::SourceRestore()
{
- CallSourceReportInit();
- CallSourceReportStart(_("Downloading files..."));
-
+ // return value
bool success = true;
- try {
- // we always use the configured caches
- if( !zypp::SourceManager::sourceManager()->restore(_target_root, true) )
- {
- y2error( "Unable to restore all sources" );
-
- success = false;
- }
- }
- catch (const zypp::FailedSourcesRestoreException& excpt)
+ if (repos.size() > 0)
{
- // FIXME: assuming the sources are already initialized
- y2error ("Error in SourceRestore: %s", excpt.asString().c_str());
- _last_error.setLastError(excpt.asUserString());
- _broken_sources = excpt.aliases();
- success = false;
+ y2warning("Number of registered repositories: %zd, skipping repository load!", repos.size());
+ return YCPBoolean(success);
}
- catch (const zypp::SourcesAlreadyRestoredException& excpt)
+
+ try
{
- y2milestone ("At least one source already registered, SourceManager already started.");
- success = true;
+ zypp::RepoManager repomanager = CreateRepoManager();
+
+ if (!service_manager.empty())
+ {
+ y2warning("Number of known services: %zd, skipping service load!", service_manager.size());
+ }
+ else
+ {
+ try
+ {
+ service_manager.LoadServices(repomanager);
+
+ if (!service_manager.empty())
+ {
+ // refresh services at first
+ ServiceManager::Services services(service_manager.GetServices());
+ bool network_is_running = NetworkDetected();
+
+ for_(srv_it, services.begin(), services.end())
+ {
+ try
+ {
+ if (srv_it->enabled() && srv_it->autorefresh())
+ {
+ zypp::Url url(srv_it->url());
+
+ if (!network_is_running && remoteRepo(url))
+ {
+ y2warning("No network connection, skipping autorefresh of remote service %s (%s)",
+ srv_it->alias().c_str(), url.asString().c_str());
+ }
+ else
+ {
+ y2milestone("Autorefreshing service %s (%s)...", srv_it->alias().c_str(), url.asString().c_str());
+ service_manager.RefreshService(srv_it->alias(), repomanager);
+ }
+ }
+ }
+ catch (const zypp::Exception& excpt)
+ {
+ // service refresh is not fatal, let's continue
+ y2error ("Error in service refresh: %s", excpt.asString().c_str());
+ // error message, service name and URL is appened at the end of the string
+ _last_error.setLastError(std::string(_("Error refreshing service")) + " " + srv_it->name() + " ("
+ + srv_it->url().asString() + "):\n\n" + ExceptionAsString(excpt));
+ success = false;
+ }
+ }
+ }
+ }
+ catch (const zypp::Exception& excpt)
+ {
+ _last_error.setLastError(ExceptionAsString(excpt));
+ success = false;
+ }
+ }
+
+ std::list<zypp::RepoInfo> reps = repomanager.knownRepositories();
+
+ for (std::list<zypp::RepoInfo>::iterator it = reps.begin();
+ it != reps.end(); ++it)
+ {
+ repos.push_back(new YRepo(*it));
+ }
}
catch (const zypp::Exception& excpt)
{
// FIXME: assuming the sources are already initialized
y2error ("Error in SourceRestore: %s", excpt.asString().c_str());
- _last_error.setLastError(excpt.asUserString());
+ _last_error.setLastError(ExceptionAsString(excpt));
success = false;
}
- CallSourceReportEnd(_("Downloading files..."));
- CallSourceReportDestroy();
-
return YCPBoolean(success);
}
@@ -212,17 +273,10 @@
* Get list of all sources which could not have been restored.
* @return list<string> list of aliases (product names or URLs)
**/
-YCPValue PkgModuleFunctions::SourceGetBrokenSources()
+YCPValue PkgFunctions::SourceGetBrokenSources()
{
- YCPList ret;
-
- for( std::set<std::string>::const_iterator it = _broken_sources.begin() ;
- it != _broken_sources.end() ; ++it )
- {
- ret->add(YCPString(*it));
- }
-
- return ret;
+ y2warning("Pkg::SourceGetBrokenSources() is obsoleted, it's not needed anymore.");
+ return YCPList();
}
/****************************************************************************************
@@ -234,77 +288,25 @@
* @return boolean True on success
**/
YCPValue
-PkgModuleFunctions::SourceLoad()
+PkgFunctions::SourceLoad()
{
- bool success = true;
+ std::list<std::string> stages;
+ stages.push_back(_("Refresh Sources"));
+ stages.push_back(_("Rebuild Cache"));
+ stages.push_back(_("Load Data"));
- CallSourceReportInit();
- CallSourceReportStart(_("Parsing files..."));
+ PkgProgress pkgprogress(_callbackHandler);
- std::list<zypp::SourceManager::SourceId> ids;
+ // 3 steps per repository (download, cache rebuild, load resolvables)
+ pkgprogress.Start(_("Loading the Package Manager..."), stages, _(HelpTexts::load_resolvables));
- // get all enabled sources
- try
- {
- ids = zypp::SourceManager::sourceManager()->enabledSources();
- }
- catch (const zypp::Exception& excpt)
- {
- y2error ("Error in SourceLoad: %s", excpt.asString().c_str());
- _last_error.setLastError(excpt.asUserString());
- success = false;
- }
-
- // load resolvables the enabled sources
- for( std::list<zypp::SourceManager::SourceId>::iterator it = ids.begin(); it != ids.end(); ++it)
- {
- try
- {
- zypp::Source_Ref src = logFindSource(*it);
- try
- {
- if( src.enabled() )
- {
- zypp_ptr()->addResolvables (src.resolvables());
- }
- else
- {
- // remove the resolvables if they have been added
- if (src.resStoreInitialized ())
- {
- zypp_ptr()->removeResolvables(src.resolvables());
- }
- }
-
- }
- catch (const zypp::Exception& excpt)
- {
- std::string url = src.url().asString();
- y2error ("Error for %s: %s", url.c_str(), excpt.asString().c_str());
- _last_error.setLastError(url + ": " + excpt.asUserString());
- success = false;
+ YCPValue ret = SourceLoadImpl(pkgprogress);
- // disable the source
- y2error("Disabling source %s", url.c_str());
- src.disable();
+ pkgprogress.Done();
- // remember the broken source for SourceCleanupBroken
- _broken_sources.insert(src.alias());
- }
- }
- catch (const zypp::Exception& excpt)
- {
- success = false;
- }
- }
-
- CallSourceReportEnd(_("Parsing files..."));
- CallSourceReportDestroy();
-
- return YCPBoolean(success);
+ return ret;
}
-
/****************************************************************************************
* @builtin SourceStartManager
*
@@ -316,22 +318,31 @@
* @return boolean
**/
YCPValue
-PkgModuleFunctions::SourceStartManager (const YCPBoolean& enable)
+PkgFunctions::SourceStartManager (const YCPBoolean& enable)
{
- YCPValue success = SourceRestore();
+ PkgProgress pkgprogress(_callbackHandler);
- if( enable->value() )
+ // display the progress only when sources will be loaded
+ if (enable->value() && repos.size() == 0)
{
- if (!success->asBoolean()->value())
- {
- y2warning("SourceStartManager: Some sources have not been restored, loading only the active sources...");
- }
+ std::list<std::string> stages;
+ stages.push_back(_("Load Sources"));
+ stages.push_back(_("Refresh Sources"));
+ stages.push_back(_("Rebuild Cache"));
+ stages.push_back(_("Load Data"));
+
+ // 3 steps per repository (download, cache rebuild, load resolvables)
+ pkgprogress.Start(_("Loading the Package Manager..."), stages, _(HelpTexts::load_resolvables));
+ }
+
+ YCPValue ret = SourceStartManagerImpl(enable, pkgprogress);
- // enable all sources and load the resolvables
- success = YCPBoolean(SourceLoad()->asBoolean()->value() && success->asBoolean()->value());
+ if (enable->value())
+ {
+ pkgprogress.Done();
}
- return success;
+ return ret;
}
/****************************************************************************************
@@ -354,7 +365,7 @@
* @return list<integer> list of SrcIds
**/
YCPValue
-PkgModuleFunctions::SourceStartCache (const YCPBoolean& enabled)
+PkgFunctions::SourceStartCache (const YCPBoolean& enabled)
{
try
{
@@ -365,7 +376,7 @@
catch (const zypp::Exception& excpt)
{
y2error ("Error in SourceStartCache: %s", excpt.asString().c_str());
- _last_error.setLastError(excpt.asUserString());
+ _last_error.setLastError(ExceptionAsString(excpt));
}
// catch an exception from boost (e.g. a file cannot be read by non-root user)
catch (const std::exception& err)
@@ -382,7 +393,7 @@
}
/****************************************************************************************
- * @builtin SourceCleanupBroken
+ * @builtin SourceCleanupBroken - obsoleted, do not use!
*
* @short Clean up all sources that were not properly restored on the last
* call of SourceStartManager or SourceStartCache.
@@ -390,27 +401,10 @@
* @return boolean
**/
YCPValue
-PkgModuleFunctions::SourceCleanupBroken ()
+PkgFunctions::SourceCleanupBroken ()
{
- bool success = true;
-
- zypp::storage::PersistentStorage store;
- store.init( _target_root );
-
- for( std::set<std::string>::const_iterator it = _broken_sources.begin() ;
- it != _broken_sources.end() ; ++it )
- {
- try {
- store.deleteSource( *it );
- } catch( const zypp::Exception& excpt )
- {
- success = false;
- }
- }
-
- _broken_sources.clear();
-
- return YCPBoolean(success);
+ y2warning("Pkg::SourceCleanupBroken() is obsoleted, it's not needed anymore.");
+ return YCPBoolean(true);
}
/****************************************************************************************
@@ -424,17 +418,37 @@
* @return list<integer> list of SrcIds (integer)
**/
YCPValue
-PkgModuleFunctions::SourceGetCurrent (const YCPBoolean& enabled)
+PkgFunctions::SourceGetCurrent (const YCPBoolean& enabled)
{
- std::list<zypp::SourceManager::SourceId> ids = (enabled->value()) ?
- zypp::SourceManager::sourceManager()->enabledSources()
- : zypp::SourceManager::sourceManager()->allSources();
-
YCPList res;
- for( std::list<zypp::SourceManager::SourceId>::const_iterator it = ids.begin(); it != ids.end() ; ++it )
+ RepoId index = 0LL;
+ for( RepoCont::const_iterator it = repos.begin(); it != repos.end() ; ++it, ++index )
{
- res->add( YCPInteger( *it ) );
+ // ignore disabled sources if requested
+ if (enabled->value())
+ {
+ // Note: enabled() is tribool!
+ if ((*it)->repoInfo().enabled())
+ {
+ }
+ else if (!(*it)->repoInfo().enabled())
+ {
+ continue;
+ }
+ else
+ {
+ continue;
+ }
+ }
+
+ // ignore deleted sources
+ if ((*it)->isDeleted())
+ {
+ continue;
+ }
+
+ res->add( YCPInteger(index) );
}
return res;
@@ -444,26 +458,33 @@
* @builtin SourceReleaseAll
*
* @short Release all medias hold by all sources
+ * Warning: It also deletes the downloaded files!
* @return boolean
**/
YCPValue
-PkgModuleFunctions::SourceReleaseAll ()
+PkgFunctions::SourceReleaseAll ()
{
- try
- {
- y2milestone( "Relesing all sources") ;
- zypp::SourceManager::sourceManager()->releaseAllSources ();
- }
- catch (zypp::Exception & excpt)
+ y2milestone("Releasing all sources...");
+ bool ret = true;
+
+ y2milestone("Removing all tmp directories");
+ tmp_dirs.clear();
+
+ for (RepoCont::iterator it = repos.begin();
+ it != repos.end(); ++it)
{
- _last_error.setLastError(excpt.asUserString());
- y2error("Pkg::SourceReleaseAll has failed: %s", excpt.msg().c_str() );
- return YCPBoolean(false);
+ try
+ {
+ (*it)->mediaAccess()->release();
+ }
+ catch (const zypp::media::MediaException & ex)
+ {
+ y2warning("Failed to release media for repo: %s", ex.msg().c_str());
+ ret = false;
+ }
}
- y2milestone( "All sources released");
-
- return YCPBoolean(true);
+ return YCPBoolean(ret);
}
/******************************************************************************
@@ -473,58 +494,203 @@
* @return boolean
**/
YCPValue
-PkgModuleFunctions::SourceSaveAll ()
+PkgFunctions::SourceSaveAll ()
{
+ y2milestone("Saving the source setup...");
+ bool ret = true;
+
+ // nothing to save, return success
+ if (repos.empty() && service_manager.empty())
+ {
+ y2debug("No repository or service defined, saving skipped");
+ return YCPBoolean(ret);
+ }
+
+ zypp::RepoManager repomanager = CreateRepoManager();
+
+ // save the services
try
{
- y2milestone( "Storing the source setup in %s", _target_root.asString().c_str()) ;
- zypp::SourceManager::sourceManager()->store( _target_root, true );
+ service_manager.SaveServices(repomanager);
+ y2milestone("All services have been saved");
}
- catch (zypp::Exception & excpt)
+ catch (const zypp::Exception& excpt)
{
- y2error("Pkg::SourceSaveAll has failed: %s", excpt.msg().c_str() );
- _last_error.setLastError(excpt.asUserString());
- return YCPBoolean(false);
+ _last_error.setLastError(ExceptionAsString(excpt));
+ ret = false;
+ }
+
+ // count removed repos
+ int removed_repos = 0;
+ for (RepoCont::iterator it = repos.begin();
+ it != repos.end(); ++it)
+ {
+ // the repo has been removed
+ if ((*it)->isDeleted())
+ {
+ removed_repos++;
+ }
}
- y2milestone( "All sources saved");
+ y2debug("Found %d removed repositories", removed_repos);
- return YCPBoolean(true);
+ // number of steps:
+ // for removed repository: 3 (remove metadata, remove from cache, remove .repo file)
+ // for other repositories: 1 (just save/update .repo file)
+ // (so there are 2 extra steps for removed repos)
+ int save_steps = 2*removed_repos + repos.size();
+
+ PkgProgress pkgprogress(_callbackHandler);
+ std::list<std::string> stages;
+
+ if (removed_repos > 0)
+ {
+ stages.push_back(_("Remove Repositories"));
+ }
+
+
+ // stages: "download", "build cache"
+ stages.push_back(_("Save Repositories"));
+
+ // set number of step
+ zypp::ProgressData prog_total(save_steps);
+ // set the receiver
+ prog_total.sendTo(pkgprogress.Receiver());
+
+ // start the process
+ pkgprogress.Start(_("Saving Repositories..."), stages, _(HelpTexts::save_help));
+
+ // remove deleted repos (the old configurations) at first
+ for (RepoCont::iterator it = repos.begin();
+ it != repos.end(); ++it)
+ {
+ // the repo has been removed
+ if ((*it)->isDeleted())
+ {
+ std::string repo_alias = (*it)->repoInfo().alias();
+
+ try
+ {
+ // remove the metadata
+ zypp::RepoStatus raw_metadata_status = repomanager.metadataStatus((*it)->repoInfo());
+ if (!raw_metadata_status.empty())
+ {
+ y2milestone("Removing metadata for source '%s'...", repo_alias.c_str());
+ repomanager.cleanMetadata((*it)->repoInfo());
+ }
+ prog_total.incr();
+
+ // remove the cache
+ if (repomanager.isCached((*it)->repoInfo()))
+ {
+ y2milestone("Removing cache for '%s'...", repo_alias.c_str());
+ repomanager.cleanCache((*it)->repoInfo());
+ }
+ prog_total.incr();
+
+ // does the repository exist?
+ repomanager.getRepositoryInfo(repo_alias);
+ y2milestone("Removing repository '%s'", repo_alias.c_str());
+ repomanager.removeRepository((*it)->repoInfo());
+ prog_total.incr();
+ }
+ catch (const zypp::repo::RepoNotFoundException &ex)
+ {
+ // repository not found -- not critical, continue
+ y2warning("No such repository: %s", repo_alias.c_str());
+ }
+ catch (const zypp::Exception & excpt)
+ {
+ y2error("Pkg::SourceSaveAll has failed: %s", excpt.msg().c_str() );
+ _last_error.setLastError(ExceptionAsString(excpt));
+ return YCPBoolean(false);
+ }
+ }
+ }
+
+ if (removed_repos > 0)
+ {
+ pkgprogress.NextStage();
+ }
+
+ // save all repos (the current configuration)
+ for (RepoCont::iterator it = repos.begin();
+ it != repos.end(); ++it)
+ {
+ if (!(*it)->isDeleted())
+ {
+ std::string current_alias = (*it)->repoInfo().alias();
+
+ try
+ {
+ try
+ {
+ // if the repository already exists then just modify it
+ repomanager.getRepositoryInfo(current_alias);
+ y2milestone("Modifying repository '%s'", current_alias.c_str());
+ repomanager.modifyRepository(current_alias, (*it)->repoInfo());
+ }
+ catch (const zypp::repo::RepoNotFoundException &ex)
+ {
+ // the repository was not found, add it
+ y2milestone("Adding repository '%s'", current_alias.c_str());
+ repomanager.addRepository((*it)->repoInfo());
+ }
+ }
+ catch (zypp::Exception & excpt)
+ {
+ y2error("Pkg::SourceSaveAll has failed: %s", excpt.msg().c_str() );
+ _last_error.setLastError(ExceptionAsString(excpt));
+ return YCPBoolean(false);
+ }
+
+ prog_total.incr();
+ }
+ }
+
+ y2milestone("All sources have been saved");
+
+ return YCPBoolean(ret);
}
/****************************************************************************************
* @builtin SourceFinishAll
*
- * @short Save and then disable all InstSrces.
+ * @short Release all instalation sources
* @description
- * If there are no enabled sources, do nothing
- * (idempotence hack, broken design: #155459, #176013, use SourceSaveAll).
- * @return boolean
+ * Release all known installation repositories. Releasing is done automaticaly in Pkg::
+ * destructor, but can be done explicitly to force reloading of registered repositories.
+ * Use SourceSaveAll() to not loose the new registered sources before calling SourceFinishAll()!
+ * @return boolean true on success
**/
YCPValue
-PkgModuleFunctions::SourceFinishAll ()
+PkgFunctions::SourceFinishAll ()
{
try
{
- // look if there are any enabled sources
- std::list<zypp::SourceManager::SourceId> enabled_sources = zypp::SourceManager::sourceManager()->enabledSources();
- if (enabled_sources.empty()) {
- y2milestone( "No enabled sources." );
- return YCPBoolean( true );
- }
- y2milestone( "Storing the source setup in %s", _target_root.asString().c_str()) ;
- zypp::SourceManager::sourceManager()->store( _target_root, true );
- y2milestone( "Disabling all sources") ;
- zypp::SourceManager::sourceManager()->disableAllSources ();
+ y2milestone( "Unregistering all sources...") ;
+
+ // remove all resolvables
+ for (RepoCont::iterator it = repos.begin();
+ it != repos.end(); ++it)
+ {
+ RemoveResolvablesFrom(*it);
+ }
+
+ // release all repositories
+ repos.clear();
+
+ // release all services
+ service_manager.Reset();
}
catch (zypp::Exception & excpt)
{
y2error("Pkg::SourceFinishAll has failed: %s", excpt.msg().c_str() );
- _last_error.setLastError(excpt.asUserString());
+ _last_error.setLastError(ExceptionAsString(excpt));
return YCPBoolean(false);
}
- y2milestone( "All sources finished");
+ y2milestone("All sources and services have been unregistered");
return YCPBoolean(true);
}
@@ -548,6 +714,10 @@
* "type" : YCPString,
* "url" : YCPString (without password, but see SourceURL),
* "alias" : YCPString,
+ * "name" : YCPString,
+ * "service" : YCPString, (service to which the repo belongs, empty if there is no service assigned)
+ * "keeppackages" : YCPBoolean,
+ * "is_update_repo" : YCPBoolean, (true if this is an update repo - this requires loaded objects in pool otherwise the flag is not returned! The value is stored in repo metadata, not in .repo file!)
* ];
*
* </code>
@@ -555,26 +725,55 @@
* @return map
**/
YCPValue
-PkgModuleFunctions::SourceGeneralData (const YCPInteger& id)
+PkgFunctions::SourceGeneralData (const YCPInteger& id)
{
YCPMap data;
- zypp::Source_Ref src;
- try
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ return YCPVoid ();
+
+ // convert type to the old strings ("YaST", "YUM" or "Plaindir")
+ std::string srctype = zypp2yastType(repo->repoInfo().type().asString());
+
+ data->add( YCPString("enabled"), YCPBoolean(repo->repoInfo().enabled()));
+ data->add( YCPString("autorefresh"), YCPBoolean(repo->repoInfo().autorefresh()));
+ data->add( YCPString("type"), YCPString(srctype));
+ data->add( YCPString("product_dir"), YCPString(repo->repoInfo().path().asString()));
+
+ // check if there is an URL
+ if (repo->repoInfo().baseUrlsBegin() != repo->repoInfo().baseUrlsEnd())
{
- src = logFindSource(id->value());
+ data->add( YCPString("url"), YCPString(repo->repoInfo().baseUrlsBegin()->asString()));
}
- catch (const zypp::Exception& excpt)
+
+ data->add( YCPString("alias"), YCPString(repo->repoInfo().alias()));
+ data->add( YCPString("name"), YCPString(repo->repoInfo().name()));
+
+ YCPList base_urls;
+ for( zypp::RepoInfo::urls_const_iterator it = repo->repoInfo().baseUrlsBegin(); it != repo->repoInfo().baseUrlsEnd(); ++it)
{
- return YCPVoid ();
+ base_urls->add(YCPString(it->asString()));
+ }
+ data->add( YCPString("base_urls"), base_urls);
+
+ data->add( YCPString("mirror_list"), YCPString(repo->repoInfo().mirrorListUrl().asString()));
+
+ data->add( YCPString("priority"), YCPInteger(repo->repoInfo().priority()));
+
+ data->add( YCPString("service"), YCPString(repo->repoInfo().service()));
+
+ data->add( YCPString("keeppackages"), YCPBoolean(repo->repoInfo().keepPackages()));
+
+ // add Repository data
+ zypp::Repository repository(zypp::ResPool::instance().reposFind(repo->repoInfo().alias()));
+
+ if (repository != zypp::Repository::noRepository)
+ {
+ y2debug("adding zypp::Repository info");
+ data->add( YCPString("is_update_repo"), YCPBoolean(repository.isUpdateRepo()));
}
- data->add( YCPString("enabled"), YCPBoolean(src.enabled()));
- data->add( YCPString("autorefresh"), YCPBoolean(src.autorefresh()));
- data->add( YCPString("type"), YCPString(src.type()));
- data->add( YCPString("product_dir"), YCPString(src.path().asString()));
- data->add( YCPString("url"), YCPString(src.url().asString()));
- data->add( YCPString("alias"), YCPString(src.alias()));
return data;
}
@@ -586,21 +785,63 @@
* @return string or nil on failure
**/
YCPValue
-PkgModuleFunctions::SourceURL (const YCPInteger& id)
+PkgFunctions::SourceURL (const YCPInteger& id)
{
- zypp::Source_Ref src;
- try
- {
- src = logFindSource(id->value());
- }
- catch (const zypp::Exception& excpt)
+ const YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ return YCPVoid();
+
+ zypp::Url url;
+
+ if (repo->repoInfo().baseUrlsBegin() != repo->repoInfo().baseUrlsEnd())
{
- return YCPVoid ();
+ // #186842
+ url = *(repo->repoInfo().baseUrlsBegin());
+
+ // add authentication data if exist
+ zypp::media::CredentialManager cm;
+
+ zypp::media::AuthData_Ptr auth = cm.getCred(url);
+
+ if (auth)
+ {
+ y2milestone("Authentication data found, adding to URL...");
+
+ if (auth->valid())
+ {
+ if (!auth->username().empty())
+ {
+ y2debug("Adding username...");
+ url.setUsername(auth->username());
+ }
+
+ if (!auth->password().empty())
+ {
+ y2debug("Adding password...");
+ url.setPassword(auth->password());
+ }
+ }
+ else
+ {
+ y2warning("Invalid authentication data, returning URL without username and password");
+ }
+
+ // does the url contain credentials query?
+ zypp::url::ParamMap params = url.getQueryStringMap();
+ zypp::url::ParamMap::iterator map_it = params.find("credentials");
+
+ if (map_it != params.end())
+ {
+ y2milestone("Removing credentials query from URL");
+ params.erase(map_it);
+ url.setQueryStringMap(params);
+ }
+ }
+
}
- // #186842
- return YCPString(src.url().asCompleteString());
+ return YCPString(url.asCompleteString());
}
/****************************************************************************************
@@ -621,26 +862,74 @@
* @return map
**/
YCPValue
-PkgModuleFunctions::SourceMediaData (const YCPInteger& id)
+PkgFunctions::SourceMediaData (const YCPInteger& id)
{
YCPMap data;
- zypp::Source_Ref src;
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ return YCPVoid ();
+
+ std::string alias = repo->repoInfo().alias();
+ bool found_resolvable = false;
+ int max_medium = 1;
+ // search the maximum source number of a package in the repository
try
{
- src = logFindSource(id->value());
+ for (zypp::ResPoolProxy::const_iterator it = zypp_ptr()->poolProxy().byKindBegin(zypp::ResKind::package);
+ it != zypp_ptr()->poolProxy().byKindEnd(zypp::ResKind::package);
+ ++it)
+ {
+ // search in available products
+ for (zypp::ui::Selectable::available_iterator aval_it = (*it)->availableBegin();
+ aval_it != (*it)->availableEnd();
+ ++aval_it)
+ {
+ zypp::Package::constPtr pkg = boost::dynamic_pointer_cast<const zypp::Package>(aval_it->resolvable());
+
+ if (pkg && pkg->repoInfo().alias() == alias)
+ {
+ found_resolvable = true;
+
+ int medium = pkg->mediaNr();
+
+ if (medium > max_medium)
+ {
+ max_medium = medium;
+ }
+ }
+ }
+ }
+ }
+ catch (...)
+ {
}
- catch (const zypp::Exception& excpt)
+
+ if (found_resolvable)
{
- return YCPVoid ();
+ data->add( YCPString("media_count"), YCPInteger(max_medium));
}
+ else
+ {
+ y2error("No resolvable from repository '%s' found, cannot get number of media (use Pkg::SourceLoad() to load the resolvables)", alias.c_str());
+ }
+
+ y2warning("Pkg::SourceMediaData() doesn't return \"media_id\" and \"media_vendor\" values anymore.");
- data->add( YCPString("media_count"), YCPInteger(src.numberOfMedia()));
- data->add( YCPString("media_id"), YCPString(src.unique_id()));
- data->add( YCPString("media_vendor"), YCPString(src.vendor()));
+ // SourceMediaData returns URLs without password
+ if (repo->repoInfo().baseUrlsBegin() != repo->repoInfo().baseUrlsEnd())
+ {
+ data->add( YCPString("url"), YCPString(repo->repoInfo().baseUrlsBegin()->asString()));
+
+ // add all base URLs
+ YCPList base_urls;
+ for( zypp::RepoInfo::urls_const_iterator it = repo->repoInfo().baseUrlsBegin(); it != repo->repoInfo().baseUrlsEnd(); ++it)
+ {
+ base_urls->add(YCPString(it->asString()));
+ }
+ data->add( YCPString("base_urls"), base_urls);
+ }
-#warning SourceMediaData returns URL without password
- data->add( YCPString("url"), YCPString(src.url().asString()));
return data;
}
@@ -653,54 +942,76 @@
*
* <code>
* $[
- * "label" : YCPString,
- * "vendor" : YCPString,
- * "productname" : YCPString,
- * "productversion" : YCPString,
- * "relnotesurl" : YCPString,
+ * "label" : string,
+ * "vendor" : string,
+ * "productname" : string,
+ * "productversion" : string,
+ * "relnotesurl" : string,
+ * "relnotes_urls" : list<string>
+ * "register_urls" : list<string>
+ * "smolt_urls" : list<string>
+ * "update_urls" : list<string>
+ * "extra_urls" : list<string>
+ * "optional_urls" : list<string>
* ];
* </code>
*
* @return map
**/
YCPValue
-PkgModuleFunctions::SourceProductData (const YCPInteger& src_id)
+PkgFunctions::SourceProductData (const YCPInteger& src_id)
{
YCPMap ret;
- try
- {
- zypp::Source_Ref src = logFindSource(src_id->value());
+ YRepo_Ptr repo = logFindRepository(src_id->value());
+ if (!repo)
+ return YCPVoid ();
- // find a product for the given source
- zypp::ResPool::byKind_iterator it = zypp_ptr()->pool().byKindBegin(zypp::ResTraits<zypp::Product>::kind);
+ std::string alias = repo->repoInfo().alias();
- for( ; it != zypp_ptr()->pool().byKindEnd(zypp::ResTraits<zypp::Product>::kind) ; ++it)
- {
- zypp::Product::constPtr product = boost::dynamic_pointer_cast<const zypp::Product>( it->resolvable() );
+ try
+ {
+ for (zypp::ResPoolProxy::const_iterator it = zypp_ptr()->poolProxy().byKindBegin(zypp::ResKind::product);
+ it != zypp_ptr()->poolProxy().byKindEnd(zypp::ResKind::product);
+ ++it)
+ {
+ zypp::Product::constPtr product = NULL;
+
+ // search in available products
+ for (zypp::ui::Selectable::available_iterator aval_it = (*it)->availableBegin();
+ aval_it != (*it)->availableEnd();
+ ++aval_it)
+ {
+ zypp::Product::constPtr prod = boost::dynamic_pointer_cast<const zypp::Product>(aval_it->resolvable());
+ if (prod && prod->repoInfo().alias() == alias)
+ {
+ product = prod;
+ break;
+ }
+ }
- if( product->source() == src )
+ if (product)
{
ret->add( YCPString("label"), YCPString( product->summary() ) );
ret->add( YCPString("vendor"), YCPString( product->vendor() ) );
ret->add( YCPString("productname"), YCPString( product->name() ) );
ret->add( YCPString("productversion"), YCPString( product->edition().version() ) );
- ret->add( YCPString("relnotesurl"), YCPString( product->releaseNotesUrl().asString()));
+ ret->add( YCPString("relnotesurl"), YCPString( product->releaseNotesUrls().first().asString()));
- #warning SourceProductData not finished
- /*
- data->add( YCPString("datadir"), YCPString( descr->content_datadir().asString() ) );
- TODO (?): "baseproductname", "baseproductversion", "defaultbase", "architectures",
- "requires", "linguas", "labelmap", "language", "timezone", "descrdir", "datadir"
- */
+ ret->add( YCPString("relnotes_urls"), asYCPList(product->releaseNotesUrls()));
+ ret->add( YCPString("register_urls"), asYCPList(product->registerUrls()));
+ ret->add( YCPString("smolt_urls"), asYCPList(product->smoltUrls()));
+ ret->add( YCPString("update_urls"), asYCPList(product->updateUrls()));
+ ret->add( YCPString("extra_urls"), asYCPList(product->extraUrls()));
+ ret->add( YCPString("optional_urls"), asYCPList(product->optionalUrls()));
break;
}
}
- if( it == zypp_ptr()->pool().byKindEnd(zypp::ResTraits<zypp::Product>::kind) )
+ if(ret->size() == 0)
{
- y2error ("Product for source '%lld' not found", src_id->value());
+ y2warning("Product for source '%lld' not found", src_id->value());
}
}
catch (...)
@@ -718,60 +1029,113 @@
* @return map empty map
**/
YCPValue
-PkgModuleFunctions::SourceProduct (const YCPInteger& id)
+PkgFunctions::SourceProduct (const YCPInteger& id)
{
- /* TODO FIXME */
- y2warning("Pkg::SourceProduct() is obsoleted!");
- return YCPMap();
+ y2error("Pkg::SourceProduct() is obsoleted, use Pkg::SourceProductData() instead!");
+ return SourceProductData(id);
}
-/****************************************************************************************
- * @builtin SourceProvideFile
- *
- * @short Make a file available at the local filesystem
- * @description
- * Let an InstSrc provide some file (make it available at the local filesystem).
- *
- * @param integer SrcId Specifies the InstSrc .
- * @param integer medianr Number of the media the file is located on ('1' for the 1st media).
- * @param string file Filename relative to the media root.
- *
- * @return string local path as string
- **/
-YCPValue
-PkgModuleFunctions::SourceProvideFile (const YCPInteger& id, const YCPInteger& mid, const YCPString& f)
+YCPValue PkgFunctions::SourceProvideFileCommon(const YCPInteger &id,
+ const YCPInteger &mid,
+ const YCPString& f,
+ const bool optional,
+ const bool check_signatures,
+ const bool digested)
{
- CallSourceReportInit();
- CallSourceReportStart(_("Downloading file..."));
+ if (id.isNull() || mid.isNull() || f.isNull())
+ {
+ y2error("ProvideFile: nil argument!");
+ return YCPVoid();
+ }
+
+ CallInitDownload(std::string(_("Downloading ") + f->value()));
- zypp::Source_Ref src;
bool found = true;
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ found = false;
- try {
- src = logFindSource(id->value());
- }
- catch (const zypp::Exception& excpt)
- {
- found = false;
- }
+ extern ZyppRecipients::MediaChangeSensitivity _silent_probing;
+ // remember the current value
+ ZyppRecipients::MediaChangeSensitivity _silent_probing_old = _silent_probing;
- zypp::filesystem::Pathname path;
+ // disable media change callback for optional file
+ if (optional)
+ _silent_probing = ZyppRecipients::MEDIA_CHANGE_OPTIONALFILE;
+
+ y2milestone("Downloading %s%sfile %s from repository %lld, medium %lld",
+ (optional ? "optional " : ""),
+ (check_signatures ? (digested ? "digested " : "signed ") : ""),
+ f->value().c_str(),
+ id->value(),
+ mid->value()
+ );
+ zypp::filesystem::Pathname path; // FIXME use ManagedMedia
if (found)
{
- try {
- path = src.provideFile(f->value(), mid->asInteger()->value());
+ try
+ {
+ if (check_signatures)
+ {
+ // use a Fetcher for downloading signed files (see bnc#409927)
+ zypp::Fetcher fch;
+ fch.reset();
+ fch.setOptions(zypp::Fetcher::AutoAddIndexes);
+
+ // path - add "/" to the beginning if it's missing there
+ std::string media_path(f->value());
+ if (media_path.size() >= 1 && media_path[0] != '/')
+ {
+ media_path = "/" + media_path;
+ }
+
+ zypp::OnMediaLocation mloc(media_path, mid->value());
+ // the file is never optional for zypp (it cannot tell whether an optional file failed)
+ mloc.setOptional(false);
+
+ // create the tmpdir in <_download_area>/var/tmp
+ zypp::filesystem::TmpDir tmpdir(_download_area / zypp::filesystem::TmpDir::defaultLocation());
+
+ // keep a reference to the tmpdir so the directory is not deleted at the and of the block
+ tmp_dirs.push_back(tmpdir);
+ path = tmpdir.path();
+
+ if (digested)
+ {
+ fch.enqueueDigested(mloc);
+ }
+ else
+ {
+ fch.addIndex(mloc);
+ }
+
+ fch.start(path, *repo->mediaAccess()); // uses MediaAccess to retrieve
+ fch.reset();
+ path /= f->value();
+ }
+ else
+ {
+ path = repo->mediaAccess()->provideFile(f->value(), mid->value());
+ y2milestone("local path: '%s'", path.asString().c_str());
+ }
}
catch (const zypp::Exception& excpt)
{
- _last_error.setLastError(excpt.asUserString());
- y2milestone ("File not found: %s", f->value_cstr());
found = false;
+
+ if (!optional)
+ {
+ _last_error.setLastError(ExceptionAsString(excpt));
+ y2milestone("File not found: %s", f->value_cstr());
+ }
}
}
- CallSourceReportEnd(_("Downloading file..."));
- CallSourceReportDestroy();
+ // set the original probing value
+ _silent_probing = _silent_probing_old;
+
+ CallDestDownload();
if (found)
{
@@ -781,7 +1145,27 @@
{
return YCPVoid();
}
+}
+
+/****************************************************************************************
+ * @builtin SourceProvideFile
+ *
+ * @short Make a file available at the local filesystem
+ * @description
+ * Let an InstSrc provide some file (make it available at the local filesystem).
+ * Warning: The downloaded files are removed in Pkg::SourceReleaseAll()!
+ *
+ * @param integer SrcId Specifies the InstSrc .
+ * @param integer medianr Number of the media the file is located on ('1' for the 1st media).
+ * @param string file Filename relative to the media root.
+ *
+ * @return string local path as string
+ **/
+YCPValue
+PkgFunctions::SourceProvideFile (const YCPInteger& id, const YCPInteger& mid, const YCPString& f)
+{
+ return SourceProvideFileCommon(id, mid, f, false /*optional*/, false /* signed */, true /* digested, doesn't matter in this case*/);
}
/****************************************************************************************
@@ -791,6 +1175,7 @@
* @description
* Let an InstSrc provide some file (make it available at the local filesystem).
* If the file doesn't exist don't ask user for another medium and return nil
+ * Warning: The downloaded files are removed in Pkg::SourceReleaseAll()!
*
* @param integer SrcId Specifies the InstSrc .
* @param integer medianr Number of the media the file is located on ('1' for the 1st media).
@@ -799,53 +1184,92 @@
* @return string local path as string
**/
YCPValue
-PkgModuleFunctions::SourceProvideOptionalFile (const YCPInteger& id, const YCPInteger& mid, const YCPString& f)
+PkgFunctions::SourceProvideOptionalFile (const YCPInteger& id, const YCPInteger& mid, const YCPString& f)
{
- CallSourceReportInit();
- CallSourceReportStart(_("Downloading files..."));
+ return SourceProvideFileCommon(id, mid, f, true /*optional*/, false /* signed */, true /* digested, doesn't matter in this case*/);
+}
- YCPValue ret;
- extern ZyppRecipients::MediaChangeSensitivity _silent_probing;
-
- // remember the current value
- ZyppRecipients::MediaChangeSensitivity _silent_probing_old = _silent_probing;
+/****************************************************************************************
+ * @builtin SourceProvideDir
+ * @short make a directory available at the local filesystem
+ * @description
+ * Let an InstSrc provide some directory (make it available at the local filesystem) and
+ * all the files within it (non recursive).
+ * Warning: The downloaded files are removed in Pkg::SourceReleaseAll()!
+ *
+ * @param integer SrcId Specifies the InstSrc .
+ * @param integer medianr Number of the media the file is located on ('1' for the 1st media).
+ * @param string dir Directoryname relative to the media root.
+ * @return string local path as string
+ */
+YCPValue
+PkgFunctions::SourceProvideDir (const YCPInteger& id, const YCPInteger& mid, const YCPString& d)
+{
+ y2warning("Pkg::SourceProvideDir() is obsoleted use Pkg::SourceProvideDirectory() instead");
+ // non optional, non recursive
+ return SourceProvideDirectory(id, mid, d, false, false);
+ return SourceProvideDirectoryInternal(id, mid, d, false, false, false);
+}
- // disable media change callback
- _silent_probing = ZyppRecipients::MEDIA_CHANGE_OPTIONALFILE;
+YCPValue
+PkgFunctions::SourceProvideDirectoryInternal(const YCPInteger& id, const YCPInteger& mid, const YCPString& d, const YCPBoolean &optional, const YCPBoolean &recursive, bool check_signatures)
+{
+ CallInitDownload(std::string(_("Downloading ") + d->value()));
- zypp::Source_Ref src;
bool found = true;
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ found = false;
- try {
- src = logFindSource(id->value());
- }
- catch (const zypp::Exception& excpt)
- {
- found = false;
- }
+ zypp::filesystem::Pathname path; // FIXME user ManagedMedia
+
+ extern ZyppRecipients::MediaChangeSensitivity _silent_probing;
+ // remember the current value
+ ZyppRecipients::MediaChangeSensitivity _silent_probing_old = _silent_probing;
- zypp::filesystem::Pathname path;
+ // disable media change callback for optional file
+ if (optional->value())
+ _silent_probing = ZyppRecipients::MEDIA_CHANGE_OPTIONALFILE;
if (found)
{
- try {
- path = src.provideFile(f->value(), mid->asInteger()->value());
+ try
+ {
+ if (check_signatures)
+ {
+ // use a Fetcher for downloading signed files (see bnc#409927)
+ zypp::Fetcher f;
+ f.reset();
+ zypp::OnMediaLocation mloc(d->value(), mid->value());
+ // create the tmpdir in <_root>/var/tmp
+ zypp::filesystem::TmpDir tmpdir(_download_area / zypp::filesystem::TmpDir::defaultLocation() );
+
+ // keep the reference to the tmpdir so the directory is not deleted at the and of the block
+ tmp_dirs.push_back(tmpdir);
+ path = tmpdir.path();
+ f.setOptions(zypp::Fetcher::AutoAddIndexes);
+ f.enqueueDigestedDir(mloc, recursive->value());
+ f.start(path, *repo->mediaAccess()); // uses MediaAccess to retrieve
+ f.reset();
+ }
+ else
+ {
+ path = repo->mediaAccess()->provideDir(d->value(), recursive->value(), mid->value());
+ }
}
catch (const zypp::Exception& excpt)
{
- found = false;
- // the file is optional, don't set error flag here
+ _last_error.setLastError(ExceptionAsString(excpt));
+ y2milestone ("Directory not found: %s", d->value_cstr());
+ found = false;
}
}
-
// set the original probing value
_silent_probing = _silent_probing_old;
-
- CallSourceReportEnd(_("Downloading files..."));
- CallSourceReportDestroy();
+ CallDestDownload();
if (found)
{
@@ -858,48 +1282,6 @@
}
/****************************************************************************************
- * @builtin SourceProvideDir
- * @short make a directory available at the local filesystem
- * @description
- * Let an InstSrc provide some directory (make it available at the local filesystem) and
- * all the files within it (non recursive).
- *
- * @param integer SrcId Specifies the InstSrc .
- * @param integer medianr Number of the media the file is located on ('1' for the 1st media).
- * @param string dir Directoryname relative to the media root.
- * @return string local path as string
- */
-YCPValue
-PkgModuleFunctions::SourceProvideDir (const YCPInteger& id, const YCPInteger& mid, const YCPString& d)
-{
- zypp::Source_Ref src;
-
- try
- {
- src = logFindSource(id->value());
- }
- catch (const zypp::Exception& excpt)
- {
- return YCPVoid ();
- }
-
- zypp::filesystem::Pathname path;
-
- try
- {
- path = src.provideDirTree(d->value(), mid->asInteger()->value());
- }
- catch (const zypp::Exception& excpt)
- {
- _last_error.setLastError(excpt.asUserString());
- y2milestone ("Directory not found: %s", d->value_cstr());
- return YCPVoid();
- }
-
- return YCPString(path.asString());
-}
-
-/****************************************************************************************
* @builtin SourceChangeUrl
* @short Change Source URL
* @description
@@ -910,33 +1292,42 @@
* @return boolean
**/
YCPValue
-PkgModuleFunctions::SourceChangeUrl (const YCPInteger& id, const YCPString& u)
+PkgFunctions::SourceChangeUrl (const YCPInteger& id, const YCPString& u)
{
- zypp::Source_Ref src;
- try {
- src = logFindSource(id->value());
- }
- catch (const zypp::Exception& excpt)
- {
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
return YCPBoolean(false);
- }
- try {
- zypp::Pathname pth = src.path();
- zypp::Url url = zypp::Url(u->value ());
- zypp::media::MediaManager media_mgr;
- zypp::media::MediaAccessId media_id = media_mgr.open(url);
- src.changeMedia(media_id, pth);
+ try
+ {
+ if (repo->repoInfo().baseUrlsSize() > 1)
+ {
+ // store current urls
+ std::set<zypp::Url> baseUrls (repo->repoInfo().baseUrlsBegin(), repo->repoInfo().baseUrlsEnd());
+
+ // reset url list and store the new one there
+ repo->repoInfo().setBaseUrl(zypp::Url(u->value()));
+
+ // add the rest of base urls
+ for (std::set<zypp::Url>::const_iterator i = baseUrls.begin();
+ i != baseUrls.end(); ++i)
+ repo->repoInfo().addBaseUrl(*i);
+ }
+ else
+ repo->repoInfo().setBaseUrl(zypp::Url(u->value()));
}
catch (const zypp::Exception & excpt)
{
- _last_error.setLastError(excpt.asUserString());
- y2error ("Cannot change media for source %lld: %s", id->asInteger()->value(), excpt.msg().c_str());
+ _last_error.setLastError(ExceptionAsString(excpt));
+ y2error ("Cannot set the new URL for source %s (%lld): %s",
+ repo->repoInfo().alias().c_str(), id->asInteger()->value(), excpt.msg().c_str());
return YCPBoolean(false);
}
+
return YCPBoolean(true);
}
+
/****************************************************************************************
* @builtin SourceInstallOrder
*
@@ -946,65 +1337,11 @@
YCPValue
PkgModuleFunctions::SourceInstallOrder (const YCPMap& ord)
{
- /* TODO FIXME
- YCPList args;
- args->add (ord);
-
- //-------------------------------------------------------------------------------------//
- YcpArgLoad decl(__FUNCTION__);
-
- YCPMap & order_map( decl.arg<YT_MAP, YCPMap>() );
-
- if ( ! decl.load( args ) ) {
- return pkgError_bad_args;
- }
- //-------------------------------------------------------------------------------------//
-
- InstSrcManager::InstOrder order;
- order.reserve( order_map->size() );
- bool error = false;
-
- for ( YCPMapIterator it = order_map->begin(); it != order_map->end(); ++it ) {
-
- if ( it.value()->isInteger() ) {
- InstSrc::UniqueID uId( it.value()->asInteger()->value() );
- InstSrcManager::ISrcId source_id( _y2pm.instSrcManager().getSourceByID( uId ) );
- if ( source_id ) {
- if ( source_id->enabled() ) {
- order.push_back( uId ); // finaly ;)
-
- } else {
- y2error ("order map entry '%s:%s': source not enabled",
- it.key()->toString().c_str(),
- it.value()->toString().c_str() );
- error = true;
- }
- } else {
- y2error ("order map entry '%s:%s': bad source id",
- it.key()->toString().c_str(),
- it.value()->toString().c_str() );
- error = true;
- }
- } else {
- y2error ("order map entry '%s:%s': integer value expected",
- it.key()->toString().c_str(),
- it.value()->toString().c_str() );
- error = true;
- }
- }
- if ( error ) {
- return pkgError( Error::E_bad_args );
- }
-
- // store new instorder
- _y2pm.instSrcManager().setInstOrder( order );
-*/
-
+ /* TODO FIXME */
#warning SourceInstallOrder is not implemented
return YCPBoolean( true );
}
-
static std::string timestamp ()
{
time_t t = time(NULL);
@@ -1022,137 +1359,24 @@
}
/**
- * Take the ?alias=foo part of old_url, if any, and return it,
- * putting the rest to new_url.
- * \throws Exception on malformed URLs I guess
- */
-static std::string removeAlias (const zypp::Url & old_url,
- zypp::Url & new_url)
-{
- std::string alias;
- new_url = old_url;
- zypp::url::ParamMap query = new_url.getQueryStringMap ();
- zypp::url::ParamMap::iterator alias_it = query.find ("alias");
- if (alias_it != query.end ())
- {
- alias = alias_it->second;
- query.erase (alias_it);
- new_url.setQueryStringMap (query);
- }
- return alias;
-}
-
-
-/** Create a Source and immediately put it into the SourceManager.
- * \return the SourceId
- * \throws Exception if Source creation fails
-*/
-zypp::SourceManager::SourceId
-createManagedSource( const zypp::Url & url_r,
- const zypp::Pathname & path_r,
- const bool base_source,
- const std::string& type )
-{
- y2milestone ("Original URL: %s", url_r.asString().c_str());
-
- // #158850#c17, if the URL contains an alias, we use that
- zypp::Url new_url;
- string alias = removeAlias (url_r, new_url);
-
- y2milestone("Using alias (from URL): '%s'", alias.c_str());
-
- zypp::Source_Ref newsrc =
- (type.empty()) ?
- // autoprobe source type
- zypp::SourceFactory().createFrom(new_url, path_r, alias, zypp::filesystem::Pathname(), base_source) :
- // use required source type, autorefresh = true
- zypp::SourceFactory().createFrom(type, new_url, path_r, alias, zypp::filesystem::Pathname(), base_source, true);
-
- y2milestone("Alias of the new source: %s", newsrc.alias().c_str());
-
- bool alias_found = false;
- std::list<zypp::SourceManager::SourceId> ids = zypp::SourceManager::sourceManager()->allSources();
-
- // remember the existing aliases
- std::list<std::string> aliases;
-
- for( std::list<zypp::SourceManager::SourceId>::iterator it = ids.begin(); it != ids.end(); ++it)
- {
- try
- {
- zypp::Source_Ref src = zypp::SourceManager::sourceManager()->findSource(*it);
- aliases.push_back(src.alias());
-
- if (src.alias() == newsrc.alias())
- {
- alias_found = true;
- break;
- }
- }
- catch (const zypp::Exception& excpt)
- {
- // this should never happen
- y2internal("Source ID %lu not found: %s", *it, excpt.msg().c_str());
- }
- }
-
- if (alias_found)
- {
- y2milestone("Alias is already in use");
- }
-
- // if the source has empty alias use a time stamp
- if (newsrc.alias().empty() || alias_found)
- {
-
- // use product name+edition as the alias
- // (URL is not enough for different sources in the same DVD drive)
- // alias must be unique, add timestamp
- zypp::ResStore products = newsrc.resolvables (zypp::Product::TraitsType::kind);
- zypp::ResStore::iterator
- b = products.begin (),
- e = products.end ();
- if (b != e)
- {
- zypp::ResObject::Ptr p = *b;
- alias = p->name () + '-' + p->edition ().asString () + '-';
- }
-
- if (alias.empty())
- {
- alias = newsrc.alias() + '-';
- }
-
- alias += timestamp ();
-
- // does the alias already exist?
- if (std::find_if(aliases.begin(), aliases.end(), std::bind2nd(std::equal_to<std::string>(), alias)) != aliases.end())
- {
- // yes, make the alias unique (see bnc #406720)
- int uniq_suffix = 0;
- std::string new_alias;
-
- do
- {
- std::ostringstream os;
- os << alias << '_' << uniq_suffix;
- new_alias = os.str();
- uniq_suffix++;
- }
- while (std::find_if(aliases.begin(), aliases.end(), std::bind2nd(std::equal_to<std::string>(), new_alias)) != aliases.end());
-
- y2milestone("Make the new alias unique: '%s' -> '%s'", alias.c_str(), new_alias.c_str());
- alias = new_alias;
- }
-
- newsrc.setAlias( alias );
-
- y2milestone("Using time stamp '%s' as the alias", alias.c_str());
+ * Take the ?alias=foo part of old_url, if any, and return it,
+ * putting the rest to new_url.
+ * \throws Exception on malformed URLs I guess
+ */
+static std::string removeAlias (const zypp::Url & old_url,
+ zypp::Url & new_url)
+{
+ std::string alias;
+ new_url = old_url;
+ zypp::url::ParamMap query = new_url.getQueryStringMap ();
+ zypp::url::ParamMap::iterator alias_it = query.find ("alias");
+ if (alias_it != query.end ())
+ {
+ alias = alias_it->second;
+ query.erase (alias_it);
+ new_url.setQueryStringMap (query);
}
-
- zypp::SourceManager::SourceId id = zypp::SourceManager::sourceManager()->addSource( newsrc );
- y2milestone("Added source %lu: %s %s (alias %s)", id, new_url.asString().c_str(), path_r.asString().c_str(), alias.c_str() );
- return id;
+ return alias;
}
/****************************************************************************************
@@ -1194,10 +1418,18 @@
* @return list<integer> list of SrcIds (integer).
**/
YCPValue
-PkgModuleFunctions::SourceScan (const YCPString& media, const YCPString& pd)
+PkgFunctions::SourceScan (const YCPString& media, const YCPString& pd)
+{
+ // not base product, autoprobe source type, scanning only
+ return SourceCreateEx(media, pd, false, YCPString(""), true);
+}
+
+YCPValue
+PkgFunctions::SourceCreateEx (const YCPString& media, const YCPString& pd, bool base, const YCPString& source_type, bool scan_only)
{
- zypp::SourceFactory factory;
+ y2debug("Creating source...");
+ zypp::Pathname pn(pd->value ());
zypp::Url url;
@@ -1207,72 +1439,184 @@
catch(const zypp::Exception & expt )
{
y2error ("Invalid URL: %s", expt.asString().c_str());
- _last_error.setLastError(expt.asUserString());
- return YCPList();
+ _last_error.setLastError(ExceptionAsString(expt));
+ return YCPInteger (-1LL);
}
- zypp::Pathname pn(pd->value ());
+ const std::string type = source_type->value();
+ const bool scan = pd->value().empty();
- YCPList ids;
- unsigned int id;
+ // steps: (scan), download, build cache, load resolvables
+ PkgProgress pkgprogress(_callbackHandler);
+ std::list<std::string> stages;
- if ( pd->value().empty() ) {
- // scan all sources
+ // display the scan stage only when needed
+ if (scan)
+ {
+ stages.push_back(_("Search Available Products"));
+ }
+
+ if (source_type->value().empty())
+ {
+ stages.push_back(_("Probe Source Type"));
+ }
- zypp::SourceFactory::ProductSet products;
+ stages.push_back(_("Download Descriptions"));
+ stages.push_back(_("Rebuild Cache"));
- try
- {
- factory.listProducts( url, products );
+ if (!scan_only)
+ {
+ stages.push_back(_("Load Data"));
+ }
+
+ pkgprogress.Start(_("Adding the Repository..."), stages, _(HelpTexts::create_help));
+
+ zypp::ProgressData prg(100);
+ prg.sendTo(pkgprogress.Receiver());
+ prg.toMin();
+
+ // remember the new ids for loading the resolvables
+ std::list<RepoId> new_repos;
+
+ if (scan) {
+ // scan all sources
+ zypp::MediaProductSet products;
+
+ try {
+ ScanProductsWithCallBacks(url);
+ products = available_products;
}
catch ( const zypp::Exception& excpt)
{
- y2error("Scanning products for '%s' has failed"
- , url.asString().c_str());
- _last_error.setLastError(excpt.asUserString());
- return ids;
+ _last_error.setLastError(ExceptionAsString(excpt));
+ y2error( "Cannot read the product list from the media" );
+ return YCPInteger(-1LL);
}
-
+
if( products.empty() )
{
// no products found, use the base URL instead
- zypp::SourceFactory::ProductEntry entry ;
+ zypp::MediaProductEntry entry ;
products.insert( entry );
}
-
- for( zypp::SourceFactory::ProductSet::const_iterator it = products.begin();
+
+ // scanning has been finished
+ prg.set(5);
+ pkgprogress.NextStage();
+
+ // register the repositories
+ for( zypp::MediaProductSet::const_iterator it = products.begin();
it != products.end() ; ++it )
{
+ y2milestone("Using product %s in directory %s", it->_name.c_str(), it->_dir.c_str());
+ zypp::CombinedProgressData subprogrcv(prg, 85/products.size());
+
try
{
- id = createManagedSource(url, it->_dir, false, "");
- ids->add( YCPInteger(id) );
+ // don't use spaces in alias
+ std::string alias(it->_name);
+ zypp::str::replaceAll(alias, " ", "-");
+
+ RepoId id = createManagedSource(url, it->_dir, type, alias, pkgprogress, subprogrcv);
+
+ new_repos.push_back(id);
}
catch ( const zypp::Exception& excpt)
{
- y2error("SourceScan for '%s' product '%s' has failed"
+ y2error("SourceCreate for '%s' product '%s' has failed"
, url.asString().c_str(), pn.asString().c_str());
- _last_error.setLastError(excpt.asUserString());
+ _last_error.setLastError(ExceptionAsString(excpt));
+ return YCPInteger(-1LL);
+ }
+ }
+
+ if (!scan_only)
+ {
+ // load resolvables
+ for(std::list<RepoId>::const_iterator it = new_repos.begin();
+ it != new_repos.end() ; ++it )
+ {
+ zypp::CombinedProgressData subprogrcv2(prg, 10/products.size());
+
+ try
+ {
+ YRepo_Ptr repo = logFindRepository(*it);
+
+ // no detailed progress needed, refresh has been done in createManagedSource()
+ LoadResolvablesFrom(repo, subprogrcv2);
+
+ // search for a base product if it hasn't been set
+ if (base && !base_product)
+ {
+ y2milestone("Searching a base product...");
+ base_product = FindBaseProduct(repo->repoInfo().alias());
+ }
+ }
+ catch ( const zypp::Exception& excpt)
+ {
+ y2error("SourceCreate for '%s' product '%s' has failed"
+ , url.asString().c_str(), pn.asString().c_str());
+ _last_error.setLastError(ExceptionAsString(excpt));
+ return YCPInteger(-1LL);
+ }
}
}
} else {
y2debug("Creating source...");
+ zypp::CombinedProgressData subprogrcv_create(prg, 80);
+ zypp::CombinedProgressData subprogrcv_load(prg, 20);
+
try
{
- id = createManagedSource(url, pn, false, "");
- ids->add( YCPInteger(id) );
+ RepoId new_id = createManagedSource(url, pn, type, "", pkgprogress, subprogrcv_create);
+ new_repos.push_back(new_id);
+
+ if (!scan_only)
+ {
+ pkgprogress.NextStage();
+
+ YRepo_Ptr repo = logFindRepository(new_id);
+
+ // load the resolvables
+ LoadResolvablesFrom(repo, subprogrcv_load);
+
+ if (base && !base_product)
+ {
+ y2milestone("Searching the base product...");
+ base_product = FindBaseProduct(repo->repoInfo().alias());
+ }
+ }
}
catch ( const zypp::Exception& excpt)
{
- y2error("SourceScan for '%s' product '%s' has failed"
+ y2error("SourceCreate for '%s' product '%s' has failed"
, url.asString().c_str(), pn.asString().c_str());
- _last_error.setLastError(excpt.asUserString());
+ _last_error.setLastError(ExceptionAsString(excpt));
+ return YCPInteger(-1LL);
}
}
- y2milestone("Found sources: %s", ids->toString().c_str() );
- return ids;
+ prg.toMax();
+
+ if (!scan_only)
+ {
+ PkgFreshen();
+ return YCPInteger(*new_repos.begin());
+ }
+ else
+ {
+ YCPList ids;
+
+ // load resolvables
+ for(std::list<RepoId>::const_iterator it = new_repos.begin();
+ it != new_repos.end() ; ++it )
+ {
+ ids->add(YCPInteger(*it));
+ }
+
+ return ids;
+ }
}
/****************************************************************************************
@@ -1323,113 +1667,6 @@
return SourceCreateEx (media, pd, false, type);
}
-YCPValue
-PkgModuleFunctions::SourceCreateEx (const YCPString& media, const YCPString& pd, bool base, const YCPString& source_type)
-{
- y2debug("Creating source...");
-
- zypp::SourceFactory factory;
- zypp::Pathname pn(pd->value ());
-
- zypp::Url url;
-
- try {
- url = zypp::Url(media->value ());
- }
- catch(const zypp::Exception & expt )
- {
- y2error ("Invalid URL: %s", expt.asString().c_str());
- _last_error.setLastError(expt.asUserString());
- return YCPInteger (-1LL);
- }
-
-
- YCPList ids;
- int ret = -1;
-
- const std::string type = source_type->value();
-
- if ( pd->value().empty() ) {
- // scan all sources
-
- zypp::SourceFactory::ProductSet products;
-
- try {
- factory.listProducts( url, products );
- }
- catch ( const zypp::Exception& excpt)
- {
- _last_error.setLastError(excpt.asUserString());
- y2error( "Cannot read the product list from the media" );
- return YCPInteger(-1LL);
- }
-
- if( products.empty() )
- {
- // no products found, use the base URL instead
- zypp::SourceFactory::ProductEntry entry ;
- products.insert( entry );
- }
-
- for( zypp::SourceFactory::ProductSet::const_iterator it = products.begin();
- it != products.end() ; ++it )
- {
- try
- {
- unsigned id = createManagedSource(url, it->_dir, base, type);
-
- zypp::Source_Ref src = zypp::SourceManager::sourceManager()->findSource(id);
-
- src.enable();
-
- CallSourceReportInit();
- CallSourceReportStart(_("Parsing files..."));
- zypp_ptr()->addResolvables (src.resolvables());
- CallSourceReportEnd(_("Parsing files..."));
- CallSourceReportDestroy();
-
- // return the id of the first product
- if ( ret == -1 )
- ret = id;
-
- }
- catch ( const zypp::Exception& excpt)
- {
- y2error("SourceCreate for '%s' product '%s' has failed"
- , url.asString().c_str(), pn.asString().c_str());
- _last_error.setLastError(excpt.asUserString());
- }
- }
- } else {
- y2debug("Creating source...");
-
- try
- {
- ret = createManagedSource(url, pn, base, type);
-
- zypp::Source_Ref src = zypp::SourceManager::sourceManager()->findSource(ret);
-
- src.enable();
-
- CallSourceReportInit();
- CallSourceReportStart(_("Parsing files..."));
- zypp_ptr()->addResolvables (src.resolvables());
- CallSourceReportEnd(_("Parsing files..."));
- CallSourceReportDestroy();
- }
- catch ( const zypp::Exception& excpt)
- {
- y2error("SourceCreate for '%s' product '%s' has failed"
- , url.asString().c_str(), pn.asString().c_str());
- _last_error.setLastError(excpt.asUserString());
- }
- }
-
- PkgFreshen();
- return YCPInteger(ret);
-}
-
-
/****************************************************************************************
* @builtin SourceSetEnabled
*
@@ -1440,48 +1677,60 @@
* @return boolean
**/
YCPValue
-PkgModuleFunctions::SourceSetEnabled (const YCPInteger& id, const YCPBoolean& e)
+PkgFunctions::SourceSetEnabled (const YCPInteger& id, const YCPBoolean& e)
{
- zypp::Source_Ref src;
- bool enabled = e->value();
-
- try {
- src = logFindSource(id->value());
- }
- catch (const zypp::Exception& excpt)
- {
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
return YCPBoolean(false);
- }
+
+ // no change required
+ bool enable = e->value();
+ if ((enable && repo->repoInfo().enabled())
+ || (!enable && !repo->repoInfo().enabled()))
+ return YCPBoolean(true);
+
+ bool success = true;
try
{
- if (enabled)
+ repo->repoInfo().setEnabled(enable);
+
+ // add/remove resolvables
+ if (enable)
{
- src.enable();
- if (!src.resStoreInitialized ())
+ // load resolvables only when they haven't been loaded yet
+ if (!repo->isLoaded())
{
- zypp_ptr()->addResolvables (src.resolvables());
+ std::list<std::string> stages;
+ stages.push_back(_("Load Data"));
+
+ PkgProgress pkgprogress(_callbackHandler);
+ zypp::ProgressData prog_total(100);
+ prog_total.sendTo(pkgprogress.Receiver());
+ zypp::CombinedProgressData load_subprogress(prog_total, 100);
+
+ pkgprogress.Start(_("Loading the Package Manager..."), stages, _(HelpTexts::load_resolvables));
+
+ success = LoadResolvablesFrom(repo, load_subprogress);
}
}
else
{
- src.disable();
- // remove the resolvables if they have been added
- if (src.resStoreInitialized ())
- {
- zypp_ptr()->removeResolvables(src.resolvables());
- }
+ // the source has been disabled, remove resolvables from the pool
+ RemoveResolvablesFrom(repo);
}
+
PkgFreshen();
}
catch (const zypp::Exception& excpt)
{
- std::string url = src.url().asString();
- y2error ("Error for %s: %s", url.c_str(), excpt.asString().c_str());
- _last_error.setLastError(url + ": " + excpt.asUserString());
+ std::string alias = repo->repoInfo().alias();
+ y2error ("Error for '%s': %s", alias.c_str(), excpt.asString().c_str());
+ _last_error.setLastError(alias + ": " + ExceptionAsString(excpt));
+ success = false;
}
- return YCPBoolean(src.enabled() == enabled);
+ return YCPBoolean(success);
}
/****************************************************************************************
@@ -1495,36 +1744,77 @@
* @return boolean
**/
YCPValue
-PkgModuleFunctions::SourceSetAutorefresh (const YCPInteger& id, const YCPBoolean& e)
+PkgFunctions::SourceSetAutorefresh (const YCPInteger& id, const YCPBoolean& e)
{
- zypp::Source_Ref src;
-
- try
- {
- src = logFindSource(id->value());
- }
- catch (const zypp::Exception& excpt)
- {
- return YCPVoid();
- }
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ return YCPBoolean(false);
- src.setAutorefresh(e->value());
+ repo->repoInfo().setAutorefresh(e->value());
return YCPBoolean( true );
}
/****************************************************************************************
* @builtin SourceFinish
- * @short Disable an Installation Source
+ * @short Disable an Installation Source - obsoleted
* @param integer SrcId Specifies the InstSrc.
* @return boolean
**/
YCPValue
-PkgModuleFunctions::SourceFinish (const YCPInteger& id)
+PkgFunctions::SourceFinish (const YCPInteger& id)
{
return SourceSetEnabled(id, false);
}
+YCPValue
+PkgFunctions::SourceRefreshHelper (const YCPInteger& id, bool forced)
+{
+ y2milestone("Forced refresh : %s", forced ? "true" : "false");
+
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ return YCPBoolean(false);
+
+ PkgProgress pkgprogress(_callbackHandler);
+ std::list<std::string> stages;
+
+ // stages: "download", "build cache"
+ stages.push_back(_("Refresh Metadata"));
+ stages.push_back(_("Rebuild Cache"));
+
+ // two steps
+ zypp::ProgressData prog_total(2);
+ prog_total.sendTo(pkgprogress.Receiver());
+
+ // 3 steps per repository (download, cache rebuild, load resolvables)
+ pkgprogress.Start(_("Refreshing Repository..."), stages, _(HelpTexts::refresh_help));
+
+ try
+ {
+ zypp::RepoManager repomanager = CreateRepoManager();
+ y2milestone("Refreshing metadata '%s'", repo->repoInfo().alias().c_str());
+ RefreshWithCallbacks(repo->repoInfo(), zypp::ProgressData::ReceiverFnc(), forced ? zypp::RepoManager::RefreshForced : zypp::RepoManager::RefreshIfNeeded);
+
+ // next stage, increase progress
+ prog_total.incr();
+ pkgprogress.NextStage();
+
+ y2milestone("Caching source '%s'...", repo->repoInfo().alias().c_str());
+ repomanager.buildCache(repo->repoInfo(), forced ? zypp::RepoManager::BuildForced : zypp::RepoManager::BuildIfNeeded);
+ }
+ catch ( const zypp::Exception & expt )
+ {
+ y2error ("Error while refreshing the source: %s", expt.asString().c_str());
+ _last_error.setLastError(repo->repoInfo().alias() + ": " + ExceptionAsString(expt));
+ return YCPBoolean(false);
+ }
+
+ pkgprogress.Done();
+
+ return YCPBoolean( true );
+}
+
/****************************************************************************************
* @builtin SourceRefreshNow
* @short Attempt to immediately refresh a Source
@@ -1537,25 +1827,10 @@
* @return boolean
**/
YCPValue
-PkgModuleFunctions::SourceRefreshNow (const YCPInteger& id)
+PkgFunctions::SourceRefreshNow (const YCPInteger& id)
{
- zypp::Source_Ref src;
-
- try {
- src = logFindSource(id->value());
- }
- catch (const zypp::Exception& excpt)
- {
- return YCPBoolean(false);
- }
-
- try {
- src.refresh();
- } catch ( const zypp::Exception & expt ) {
- y2error ("Error while refreshin the source: %s", expt.asString().c_str());
- return YCPBoolean(false);
- }
- return YCPBoolean( true );
+ // refresh if needed
+ return SourceRefreshHelper(id);
}
/****************************************************************************************
@@ -1570,33 +1845,41 @@
* @return boolean
**/
YCPValue
-PkgModuleFunctions::SourceDelete (const YCPInteger& id)
+PkgFunctions::SourceDelete (const YCPInteger& id)
{
- zypp::SourceManager::SourceId src_id = id->value();
+ YRepo_Ptr repo = logFindRepository(id->value());
+ if (!repo)
+ return YCPBoolean(false);
+
+ bool success = true;
+ const std::string repo_alias(repo->repoInfo().alias());
+
try
{
- zypp::Source_Ref src = zypp::SourceManager::sourceManager()->
- findSource(src_id);
- // If the source cache is corrupt for any reason, inst_source
- // would first try to access the resolvables only now,
- // preventing the deletion of the broken source. But we do
- // not need to remove resolvables that never got to the pool
- // in the first place. #174840.
- if (src.resStoreInitialized ())
+
+ // the resolvables cannot be used anymore, remove them
+ RemoveResolvablesFrom(repo);
+
+ // update 'repos'
+ repo->setDeleted();
+
+ // removing the base product repository?
+ if (base_product && base_product->repoInfo().alias() == repo_alias)
{
- zypp_ptr()->removeResolvables(src.resolvables());
+ y2warning("Resetting the base product, the base product repository has been removed");
+ base_product = NULL;
}
- zypp::SourceManager::sourceManager()->removeSource(src_id);
+ PkgFreshen();
}
catch (const zypp::Exception& excpt)
{
- y2error("Pkg::SourceDelete: Cannot remove source %lld", id->value());
- _last_error.setLastError(excpt.asUserString());
- return YCPBoolean(false);
+ y2error ("Error for '%s': %s", repo_alias.c_str(), excpt.asString().c_str());
+ _last_error.setLastError(repo_alias + ": " + ExceptionAsString(excpt));
+ success = false;
}
- return YCPBoolean(true);
+ return YCPBoolean(success);
}
/****************************************************************************************
@@ -1608,39 +1891,39 @@
* source priority (highest first). A source state is a map:
* $[
* "SrcId" : YCPInteger,
- * "enabled" : YCPBoolean
- * "autorefresh": YCPBoolean
+ * "enabled" : YCPBoolean,
+ * "autorefresh": YCPBoolean,
+ * "name" : YCPString,
+ * "service" : YCPString,
+ * "keeppackages" : YCPBoolean,
* ];
*
* @return list<map> list of source states (map)
**/
YCPValue
-PkgModuleFunctions::SourceEditGet ()
+PkgFunctions::SourceEditGet ()
{
YCPList ret;
- std::list<zypp::SourceManager::SourceId> ids = zypp::SourceManager::sourceManager()->allSources();
- for( std::list<zypp::SourceManager::SourceId>::iterator it = ids.begin(); it != ids.end(); ++it)
+ unsigned long index = 0;
+ for( RepoCont::const_iterator it = repos.begin(); it != repos.end(); ++it, ++index)
{
- YCPMap src_map;
- zypp::Source_Ref src;
-
- try
- {
- src = zypp::SourceManager::sourceManager()->findSource(*it);
- }
- catch (const zypp::Exception& excpt)
+ if (!(*it)->isDeleted())
{
- // this should never happen
- y2internal("Source ID %lu not found: %s", *it, excpt.msg().c_str());
- }
+ YCPMap src_map;
- src_map->add(YCPString("SrcId"), YCPInteger(*it));
- src_map->add(YCPString("enabled"), YCPBoolean(src.enabled()));
- src_map->add(YCPString("autorefresh"), YCPBoolean(src.autorefresh()));
- src_map->add(YCPString("alias"), YCPString(src.alias()));
+ src_map->add(YCPString("SrcId"), YCPInteger(index));
+ // Note: enabled() is tribool
+ src_map->add(YCPString("enabled"), YCPBoolean((*it)->repoInfo().enabled()));
+ // Note: autorefresh() is tribool
+ src_map->add(YCPString("autorefresh"), YCPBoolean((*it)->repoInfo().autorefresh()));
+ src_map->add(YCPString("name"), YCPString((*it)->repoInfo().name()));
+ src_map->add(YCPString("priority"), YCPInteger((*it)->repoInfo().priority()));
+ src_map->add(YCPString("service"), YCPString((*it)->repoInfo().service()));
+ src_map->add(YCPString("keeppackages"), YCPBoolean((*it)->repoInfo().keepPackages()));
- ret->add(src_map);
+ ret->add(src_map);
+ }
}
return ret;
@@ -1661,7 +1944,7 @@
* @return boolean
**/
YCPValue
-PkgModuleFunctions::SourceEditSet (const YCPList& states)
+PkgFunctions::SourceEditSet (const YCPList& states)
{
bool error = false;
@@ -1669,7 +1952,7 @@
{
if( ! states->value(index)->isMap() )
{
- ycperror( "Pkg::SourceEditSet, entry not a map at index %d", index);
+ y2error( "Pkg::SourceEditSet, entry not a map at index %d", index);
error = true;
continue;
}
@@ -1678,20 +1961,17 @@
if (descr->value( YCPString("SrcId") ).isNull() || !descr->value(YCPString("SrcId"))->isInteger())
{
- ycperror( "Pkg::SourceEditSet, SrcId not defined for a source description at index %d", index);
+ y2error( "Pkg::SourceEditSet, SrcId not defined for a source description at index %d", index);
error = true;
continue;
}
- int id = descr->value( YCPString("SrcId") )->asInteger()->value();
- zypp::Source_Ref src;
- try {
- src = zypp::SourceManager::sourceManager()->findSource(id);
- }
- catch (const zypp::Exception& excpt)
+ RepoId id = descr->value( YCPString("SrcId") )->asInteger()->value();
+
+ YRepo_Ptr repo = logFindRepository(id);
+ if (!repo)
{
- ycperror( "Pkg::SourceEditSet, source %d not found", index);
- _last_error.setLastError(excpt.asUserString());
+ y2error( "Pkg::SourceEditSet, source %d not found", index);
error = true;
continue;
}
@@ -1701,33 +1981,48 @@
{
bool enable = descr->value(YCPString("enabled"))->asBoolean ()->value();
- if (src.enabled() != enable)
+ if (repo->repoInfo().enabled() != enable)
{
- ycpwarning("Pkg::SourceEditSet() does not refresh the pool (src: %lu, state: %s)", src.numericId(), enable ? "disabled -> enabled" : "enabled -> disabled");
+ y2warning("Pkg::SourceEditSet() does not refresh the pool (src: %zd, state: %s)", id, enable ? "disabled -> enabled" : "enabled -> disabled");
}
- if( enable )
- src.enable();
- else
- src.disable();
+ y2debug("set enabled: %d", enable);
+ repo->repoInfo().setEnabled(enable);
}
if( !descr->value(YCPString("autorefresh")).isNull() && descr->value(YCPString("autorefresh"))->isBoolean ())
{
- src.setAutorefresh( descr->value(YCPString("autorefresh"))->asBoolean ()->value() );
+ bool autorefresh = descr->value(YCPString("autorefresh"))->asBoolean()->value();
+ y2debug("set autorefresh: %d", autorefresh);
+ repo->repoInfo().setAutorefresh( autorefresh );
}
- if( !descr->value(YCPString("alias")).isNull() && descr->value(YCPString("alias"))->isString())
+ if( !descr->value(YCPString("name")).isNull() && descr->value(YCPString("name"))->isString())
{
// rename the source
- zypp::SourceManager::sourceManager()->renameSource(src.numericId(), descr->value(YCPString("alias"))->asString()->value() );
+ y2debug("set name: %s", descr->value(YCPString("name"))->asString()->value().c_str());
+ repo->repoInfo().setName(descr->value(YCPString("name"))->asString()->value());
+ }
+
+ if( !descr->value(YCPString("priority")).isNull() && descr->value(YCPString("priority"))->isInteger())
+ {
+ unsigned int priority = descr->value(YCPString("priority"))->asInteger()->value();
+
+ // set the priority
+ repo->repoInfo().setPriority(priority);
+ y2debug("set priority: %d", priority);
}
-#warning SourceEditSet ordering not implemented yet
+ if(!descr->value(YCPString("keeppackages")).isNull() && descr->value(YCPString("keeppackages"))->isBoolean())
+ {
+ bool keeppackages = descr->value(YCPString("keeppackages"))->asBoolean()->value();
+ y2debug("set keeppackages: %d", keeppackages);
+ repo->repoInfo().setKeepPackages( keeppackages );
+ }
}
PkgFreshen();
- return YCPBoolean( true );
+ return YCPBoolean( !error );
}
/////////////////////////////////////////////////////////////////////////////////////////
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source.loT
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source.loT (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Source.loT Tue May 10 20:10:47 2011
@@ -0,0 +1,7 @@
+# Source.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.22 (1.1220.2.365 2005/12/18 22:14:06)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Target.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Target.cc (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Target.cc Tue May 10 20:10:47 2011
@@ -38,43 +38,78 @@
#include <zypp/target/rpm/RpmDb.h>
#include <zypp/Product.h>
-#include <zypp/SourceManager.h>
+#include <zypp/RepoManager.h>
+#include <zypp/Locks.h>
#include <zypp/DiskUsageCounter.h>
-#include <zypp/target/store/PersistentStorage.h>
+
+#include <PkgProgress.h>
using namespace zypp;
/** ------------------------
*
* @builtin TargetInit
- * @deprecated
* @short Initialize Target and load resolvables
* @param string root Root Directory
- * @param boolean new If true, initialize new rpm database
+ * @param boolean unused Dummy option, only for backward compatibility
* @return boolean
*/
YCPValue
PkgModuleFunctions::TargetInit (const YCPString& root, const YCPBoolean & /*unused_and_broken*/)
{
- std::string r = root->value();
+ bool rebuild_rpmdb = false;
+ const std::string r(root->value());
+
+ // display the progress if the target is changed or if the resolvables haven't been loaded
+ // otherwise there will be a quick flashing progress with no real action
+ if (_target_root == r && _target_loaded)
+ {
+ y2milestone("Target %s is already initialized", r.c_str());
+ return YCPBoolean(true);
+ }
+
+ std::list<std::string> stages;
+ stages.push_back(_("Initialize the Target System"));
+ stages.push_back(_("Read Installed Packages"));
+
+ PkgProgress pkgprogress(_callbackHandler);
+ pkgprogress.Start(_("Loading the Package Manager..."), stages, _(""));
try
{
- zypp_ptr()->initTarget(r);
- zypp_ptr()->addResolvables( zypp_ptr()->target()->resolvables(), true );
+ if (rebuild_rpmdb)
+ {
+ y2milestone("Initializing the target with rebuild");
+ }
+
+ zypp_ptr()->initializeTarget(r, rebuild_rpmdb);
+ //pkgprogress.NextStage();
+ zypp_ptr()->target()->load();
+ _target_loaded = true;
}
catch (zypp::Exception & excpt)
{
- _last_error.setLastError(excpt.asUserString());
- ycperror("TargetInit has failed: %s", excpt.msg().c_str() );
+ _last_error.setLastError(ExceptionAsString(excpt));
+ y2error("TargetInit has failed: %s", excpt.msg().c_str() );
return YCPError(excpt.msg().c_str(), YCPBoolean(false));
}
-
- _target_root = zypp::Pathname(root->value());
-
- // we have moved to a different target, the broken source information
- // is no longer valid
- _broken_sources.clear();
+
+ _target_root = zypp::Pathname(r);
+
+ // locks are optional, might not be present on the target
+ zypp::Pathname lock_file(_target_root + zypp::ZConfig::instance().locksFile());
+ try
+ {
+ // read and apply the persistent locks
+ y2milestone("Reading locks from %s", lock_file.asString().c_str());
+ zypp::Locks::instance().readAndApply(lock_file);
+ }
+ catch (zypp::Exception & excpt)
+ {
+ y2warning("Error reading persistent locks from %s", lock_file.asString().c_str());
+ }
+
+ pkgprogress.Done();
return YCPBoolean(true);
}
@@ -97,16 +132,12 @@
}
catch (zypp::Exception & excpt)
{
- _last_error.setLastError(excpt.asUserString());
- ycperror("TargetInit has failed: %s", excpt.msg().c_str() );
+ _last_error.setLastError(ExceptionAsString(excpt));
+ y2error("TargetInit has failed: %s", excpt.msg().c_str() );
return YCPError(excpt.msg().c_str(), YCPBoolean(false));
}
-
+
_target_root = zypp::Pathname(root->value());
-
- // we have moved to a different target, the broken source information
- // is no longer valid
- _broken_sources.clear();
return YCPBoolean(true);
}
@@ -120,17 +151,33 @@
YCPValue
PkgModuleFunctions::TargetLoad ()
{
+ if (_target_loaded)
+ {
+ y2milestone("The target system is already loaded");
+ return YCPBoolean(true);
+ }
+
+ std::list<std::string> stages;
+ stages.push_back(_("Read Installed Packages"));
+
+ PkgProgress pkgprogress(_callbackHandler);
+
+ pkgprogress.Start(_("Loading the Package Manager..."), stages, _(""));
+
try
{
- zypp_ptr()->addResolvables( zypp_ptr()->target()->resolvables(), true );
+ zypp_ptr()->target()->load();
+ _target_loaded = true;
}
catch (zypp::Exception & excpt)
{
- _last_error.setLastError(excpt.asUserString());
- ycperror("TargetLoad has failed: %s", excpt.msg().c_str() );
+ _last_error.setLastError(ExceptionAsString(excpt));
+ y2error("TargetLoad has failed: %s", excpt.msg().c_str() );
return YCPError(excpt.msg().c_str(), YCPBoolean(false));
}
-
+
+ pkgprogress.Done();
+
return YCPBoolean(true);
}
@@ -146,26 +193,23 @@
{
try
{
- zypp::SourceManager::disableSourcesAt( _target_root );
+// FIXME: should it also remove from pool?
- // disable source refresh - workaround for #220056
- zypp::storage::PersistentStorage store;
- store.init( _target_root );
+ zypp::RepoManager repomanager = CreateRepoManager();
+ std::list<zypp::RepoInfo> all_sources = repomanager.knownRepositories();
- std::list<zypp::source::SourceInfo> new_sources = store.storedSources();
- y2milestone("Disabling refresh for sources at %s", _target_root.asString().c_str());
-
- for ( std::list<zypp::source::SourceInfo>::iterator it = new_sources.begin(); it != new_sources.end(); ++it)
+ for (std::list<zypp::RepoInfo>::iterator it = all_sources.begin(); it != all_sources.end(); ++it)
{
- y2milestone("Disabling refresh: alias: %s", it->alias().c_str());
+ y2milestone("Disabling source '%s'", it->alias().c_str());
it->setAutorefresh(false);
- store.storeSource( *it );
+
+ repomanager.modifyRepository(it->alias(), *it);
}
}
catch (zypp::Exception & excpt)
{
- _last_error.setLastError(excpt.asUserString());
- ycperror("TargetDisableSources has failed: %s", excpt.msg().c_str() );
+ _last_error.setLastError(ExceptionAsString(excpt));
+ y2error("TargetDisableSources has failed: %s", excpt.msg().c_str() );
return YCPBoolean(false);
}
@@ -185,14 +229,21 @@
try
{
zypp_ptr()->finishTarget();
+
+ zypp::Pathname lock_file(_target_root + zypp::ZConfig::instance().locksFile());
+ zypp::Locks::instance().save(lock_file);
}
catch (zypp::Exception & excpt)
{
- _last_error.setLastError(excpt.asUserString());
- ycperror("TargetFinish has failed: %s", excpt.msg().c_str() );
+ _last_error.setLastError(ExceptionAsString(excpt));
+ y2error("TargetFinish has failed: %s", excpt.msg().c_str() );
return YCPBoolean(false);
}
+ // reset the target
+ _target_root = zypp::Pathname();
+ _target_loaded = false;
+
return YCPBoolean(true);
}
@@ -218,8 +269,8 @@
}
catch (zypp::Exception & excpt)
{
- _last_error.setLastError(excpt.asUserString());
- ycperror("TargetInstall has failed: %s", excpt.asString().c_str());
+ _last_error.setLastError(ExceptionAsString(excpt));
+ y2error("TargetInstall has failed: %s", excpt.asString().c_str());
return YCPBoolean(false);
}
@@ -247,8 +298,8 @@
}
catch (zypp::Exception & excpt)
{
- _last_error.setLastError(excpt.asUserString());
- ycperror("TargetRemove has failed: %s", excpt.asString().c_str());
+ _last_error.setLastError(ExceptionAsString(excpt));
+ y2error("TargetRemove has failed: %s", excpt.asString().c_str());
return YCPBoolean(false);
}
@@ -266,17 +317,8 @@
YCPBoolean
PkgModuleFunctions::TargetLogfile (const YCPString& name)
{
- try
- {
- return YCPBoolean (zypp_ptr()->target()->setInstallationLogfile (name->value()));
- }
- catch (zypp::Exception & excpt)
- {
- _last_error.setLastError(excpt.asUserString());
- ycperror("TargetLogfile has failed: %s", excpt.asString().c_str());
- return YCPBoolean(false);
- }
- return YCPBoolean (true); // never reached
+ y2warning("Pkg::TargetLogfile() is obsoleted, the log file is now entirely handled by libzypp. See http://en.opensuse.org/Libzypp/Package_History");
+ return YCPBoolean (true);
}
@@ -375,56 +417,65 @@
try
{
- for (ResStore::resfilter_const_iterator it = zypp_ptr()->target()->byKindBegin(ResTraits<Product>::kind); it != zypp_ptr()->target()->byKindEnd(ResTraits<Product>::kind); ++it)
+ zypp::ResPool pool( zypp::ResPool::instance() ); // ResPool is a global singleton
+
+ for_( it, pool.byKindBegin<zypp::Product>(), pool.byKindEnd<zypp::Product>() )
{
- zypp::Product::constPtr product = asKind<const zypp::Product>( *it );
-#warning TargetProducts does not return all keys
+ if ( ! it->status().isInstalled() )
+ continue;
+ zypp::Product::constPtr product = asKind<zypp::Product>( it->resolvable() );
+
+ #warning TargetProducts does not return all keys
YCPMap prod;
- // see also PkgModuleFunctions::Descr2Map and Product.ycp::Product
-// FIXME unify with code in Pkg::ResolvablePropertiesEx
+ // see also PkgFunctions::Descr2Map and Product.ycp::Product
+ // FIXME unify with code in Pkg::ResolvablePropertiesEx
prod->add( YCPString("name"), YCPString( product->name() ) );
prod->add( YCPString("version"), YCPString( product->edition().version() ) );
- prod->add(YCPString("category"), YCPString(product->category()));
- prod->add(YCPString("vendor"), YCPString(product->vendor()));
- prod->add(YCPString("relnotes_url"), YCPString(product->releaseNotesUrl().asString()));
- std::string product_summary = product->summary();
- if (product_summary.size() > 0)
- {
- prod->add(YCPString("display_name"), YCPString(product_summary));
- }
- std::string product_shortname = product->shortName();
- if (product_shortname.size() > 0)
- {
- prod->add(YCPString("short_name"), YCPString(product_shortname));
- }
- // use summary for the short name if it's defined
- else if (product_summary.size() > 0)
- {
- prod->add(YCPString("short_name"), YCPString(product_summary));
- }
- prod->add(YCPString("description"), YCPString((*it)->description()));
-
- std::string resolvable_summary = (*it)->summary();
- if (resolvable_summary.size() > 0)
- {
- prod->add(YCPString("summary"), YCPString((*it)->summary()));
- }
- YCPList updateUrls;
- std::list<zypp::Url> pupdateUrls = product->updateUrls();
- for (std::list<zypp::Url>::const_iterator it = pupdateUrls.begin(); it != pupdateUrls.end(); ++it)
- {
- updateUrls->add(YCPString(it->asString()));
- }
- prod->add(YCPString("update_urls"), updateUrls);
-
- YCPList flags;
- std::list<std::string> pflags = product->flags();
- for (std::list<std::string>::const_iterator flag_it = pflags.begin();
- flag_it != pflags.end(); ++flag_it)
- {
- flags->add(YCPString(*flag_it));
- }
- prod->add(YCPString("flags"), flags);
+
+ std::string category(product->isTargetDistribution() ? "base" : "addon");
+ prod->add(YCPString("type"), YCPString(category));
+ prod->add(YCPString("category"), YCPString(category));
+
+ prod->add(YCPString("vendor"), YCPString(product->vendor()));
+ prod->add(YCPString("relnotes_url"), YCPString(product->releaseNotesUrls().first().asString()));
+ std::string product_summary = product->summary();
+ if (product_summary.size() > 0)
+ {
+ prod->add(YCPString("display_name"), YCPString(product_summary));
+ }
+ std::string product_shortname = product->shortName();
+ if (product_shortname.size() > 0)
+ {
+ prod->add(YCPString("short_name"), YCPString(product_shortname));
+ }
+ // use summary for the short name if it's defined
+ else if (product_summary.size() > 0)
+ {
+ prod->add(YCPString("short_name"), YCPString(product_summary));
+ }
+ prod->add(YCPString("description"), YCPString((*it)->description()));
+
+ std::string resolvable_summary = (*it)->summary();
+ if (resolvable_summary.size() > 0)
+ {
+ prod->add(YCPString("summary"), YCPString((*it)->summary()));
+ }
+ YCPList updateUrls;
+ zypp::Product::UrlList pupdateUrls = product->updateUrls();
+ for_( it, pupdateUrls.begin(), pupdateUrls.end() )
+ {
+ updateUrls->add(YCPString(it->asString()));
+ }
+ prod->add(YCPString("update_urls"), updateUrls);
+
+ YCPList flags;
+ std::list<std::string> pflags = product->flags();
+ for (std::list<std::string>::const_iterator flag_it = pflags.begin();
+ flag_it != pflags.end(); ++flag_it)
+ {
+ flags->add(YCPString(*flag_it));
+ }
+ prod->add(YCPString("flags"), flags);
products->add(prod);
}
@@ -471,7 +522,7 @@
// set the mount points
zypp_ptr()->setPartitions(system);
}
-
+
/** ------------------------
*
@@ -687,7 +738,7 @@
{
try
{
- return YCPBoolean (zypp_ptr()->target()->whoOwnsFile(filepath->value()));
+ return YCPBoolean (zypp_ptr()->target()->whoOwnsFile(filepath->value()).c_str());
}
catch (...)
{
@@ -696,7 +747,6 @@
return YCPBoolean(false);
}
-
/**
@builtin TargetStoreRemove
@@ -711,70 +761,5 @@
YCPBoolean
PkgModuleFunctions::TargetStoreRemove(const YCPString& root, const YCPSymbol& kind_r)
{
- zypp::Resolvable::Kind kind;
- std::string req_kind = kind_r->symbol();
-
- if( req_kind == "product" ) {
- kind = zypp::ResTraits<zypp::Product>::kind;
- }
- else if ( req_kind == "patch" ) {
- kind = zypp::ResTraits<zypp::Patch>::kind;
- }
- else if ( req_kind == "package" ) {
- kind = zypp::ResTraits<zypp::Package>::kind;
- }
- else if ( req_kind == "selection" ) {
- kind = zypp::ResTraits<zypp::Selection>::kind;
- }
- else if ( req_kind == "pattern" ) {
- kind = zypp::ResTraits<zypp::Pattern>::kind;
- }
- else if ( req_kind == "language" ) {
- kind = zypp::ResTraits<zypp::Language>::kind;
- }
- else
- {
- y2error("Pkg::TargetStoreRemove: unknown symbol: %s", req_kind.c_str());
- return YCPBoolean(false);
- }
-
- bool success = true;
-
- std::string target_root = root->value();
- if (target_root.empty())
- {
- y2error("Pkg::TargetStoreRemove: parameter root is empty");
- return YCPBoolean(false);
- }
-
- try
- {
- // create a storage
- zypp::storage::PersistentStorage store;
- store.init( target_root );
-
- // get all resolvables of the required kind
- std::list<ResObject::Ptr> objects = store.storedObjects(kind);
-
- y2warning("Removing %d objects of kind '%s' from %s", objects.size(), req_kind.c_str(), target_root.c_str());
-
- // remove the resolvables
- for( std::list<ResObject::Ptr>::const_iterator it = objects.begin(); it != objects.end(); ++it)
- {
- try {
- store.deleteObject(*it);
- } catch( const zypp::Exception& excpt )
- {
- y2error("TargetStoreRemove has failed: %s", excpt.msg().c_str());
- success = false;
- }
- }
- }
- catch( const zypp::Exception& excpt )
- {
- y2error("TargetStoreRemove has failed: %s", excpt.msg().c_str());
- success = false;
- }
-
- return YCPBoolean(success);
+ return YCPBoolean(true);
}
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Utils.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Utils.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Utils.cc Tue May 10 20:10:47 2011
@@ -0,0 +1,17 @@
+#include <ycp/y2log.h>
+#include "Utils.h"
+
+std::string ExceptionAsString(const zypp::Exception &e)
+{
+ std::string ret = e.asUserString();
+
+ if (e.historySize() > 0)
+ {
+ ret += "\n" + e.historyAsString();
+ }
+
+ y2debug("Error message: %s", ret.c_str());
+
+ return ret;
+}
+
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Utils.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Utils.h (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Utils.h Tue May 10 20:10:47 2011
@@ -0,0 +1,10 @@
+
+#ifndef PKGBINDINGS_UTILS_H
+#define PKGBINSINGS_UTILS_H
+
+#include <zypp/base/Exception.h>
+
+// convert Exception object to string represenatation
+std::string ExceptionAsString(const zypp::Exception &e);
+
+#endif
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/YRepo.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/YRepo.cc (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/YRepo.cc Tue May 10 20:10:47 2011
@@ -0,0 +1,63 @@
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2007 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id$
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: YRepo class is a Yast representaion of a repository
+*/
+
+#include <YRepo.h>
+
+#define y2log_component "Pkg"
+#include <ycp/y2log.h>
+
+IMPL_PTR_TYPE(YRepo);
+
+YRepo::YRepo(zypp::RepoInfo & repo)
+ : _repo(repo), _deleted(false), _loaded(false)
+{}
+
+YRepo::~YRepo()
+{
+ if (_maccess)
+ {
+ try { _maccess->release(); }
+ catch (const zypp::media::MediaException & ex)
+ {
+ y2error("Error in ~Yrepo(): %s", ex.asString().c_str());
+ }
+ }
+}
+
+zypp::MediaSetAccess_Ptr & YRepo::mediaAccess()
+{
+ if (!_maccess)
+ {
+ y2milestone("Creating new MediaSetAccess for url %s",
+ (*_repo.baseUrlsBegin()).asString().c_str());
+ _maccess = new zypp::MediaSetAccess(_repo.name(), *_repo.baseUrlsBegin()); // FIXME handle multiple baseUrls
+ }
+
+ return _maccess;
+}
+
+const YRepo YRepo::NOREPO;
+
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/YRepo.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/YRepo.h (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/YRepo.h Tue May 10 20:10:47 2011
@@ -0,0 +1,65 @@
+
+/* ------------------------------------------------------------------------------
+ * Copyright (c) 2007 Novell, Inc. All Rights Reserved.
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * 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, contact Novell, Inc.
+ *
+ * To contact Novell about this file by physical or electronic mail, you may find
+ * current contact information at www.novell.com.
+ * ------------------------------------------------------------------------------
+ */
+
+/*
+ File: $Id$
+ Author: Ladislav Slezák <lslezak(a)novell.com>
+ Summary: YRepo class is a Yast representaion of a repository
+*/
+
+#ifndef YRepo_h
+#define YRepo_h
+
+#include <zypp/RepoInfo.h>
+#include <zypp/MediaSetAccess.h>
+#include <zypp/base/ReferenceCounted.h>
+
+DEFINE_PTR_TYPE(YRepo);
+class YRepo : public zypp::base::ReferenceCounted
+{
+private:
+ zypp::RepoInfo _repo;
+ zypp::MediaSetAccess_Ptr _maccess;
+ bool _deleted;
+ bool _loaded;
+
+ YRepo() {}
+
+public:
+ YRepo(zypp::RepoInfo & repo);
+ ~YRepo();
+
+ const zypp::RepoInfo & repoInfo() const { return _repo; }
+ zypp::RepoInfo & repoInfo() { return _repo; }
+ zypp::MediaSetAccess_Ptr & mediaAccess();
+
+ bool isDeleted() {return _deleted;}
+ void setDeleted() {_deleted = true;}
+
+ bool isLoaded() {return _loaded;}
+ void setLoaded() {_loaded = true;}
+ void resetLoaded() {_loaded = false;}
+
+public:
+ static const YRepo NOREPO;
+};
+
+#endif
Added: branches/tmp/dmacvicar/zc10/pkg-bindings/src/log.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/log.h (added)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/log.h Tue May 10 20:10:47 2011
@@ -0,0 +1,4 @@
+
+#define y2log_component "Pkg"
+#include <y2util/y2log.h>
+
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/ycpTools.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/ycpTools.h (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/ycpTools.h Tue May 10 20:10:47 2011
@@ -29,6 +29,7 @@
#include <YCP.h>
#include <zypp/Pathname.h>
+#include <zypp/Product.h>
#include <zypp/Url.h>
///////////////////////////////////////////////////////////////////
@@ -244,6 +245,16 @@
return ret;
}
+/** Trasform zypp::Product::UrlList into YCPList */
+inline YCPList asYCPList( const zypp::Product::UrlList & urls_r )
+{
+ YCPList ret;
+ for_( it, urls_r.begin(), urls_r.end() )
+ {
+ ret->add( YCPString(it->asCompleteString()) );
+ }
+ return ret;
+}
///////////////////////////////////////////////////////////////////
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63939 - in /branches/tmp/dmacvicar/zc10/pkg-bindings/src: Makefile.am Package.cc PkgModuleFunctions.cc PkgModuleFunctions.h
by dmacvicar@svn2.opensuse.org 10 May '11
by dmacvicar@svn2.opensuse.org 10 May '11
10 May '11
Author: dmacvicar
Date: Tue May 10 17:09:46 2011
New Revision: 63939
URL: http://svn.opensuse.org/viewcvs/yast?rev=63939&view=rev
Log:
port to Code11 API wihtout breaking Code10 Pkg:: API
Modified:
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am
branches/tmp/dmacvicar/zc10/pkg-bindings/src/Package.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.cc
branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.h
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Makefile.am Tue May 10 17:09:46 2011
@@ -22,9 +22,9 @@
Y2CCPkg.cc Y2CCPkg.h \
ycpTools.cc ycpTools.h \
PkgModule.cc PkgModule.h \
+ YRepo.h YRepo.cc
PkgModuleFunctions.h \
PkgModuleFunctions.cc \
- ProvideProcess.cc ProvideProcess.h \
Package.cc \
Patch.cc \
Resolvable.cc \
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/Package.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/Package.cc (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/Package.cc Tue May 10 17:09:46 2011
@@ -37,6 +37,7 @@
#include <zypp/CapFilters.h>
#include <zypp/ResStatus.h>
+#include <zypp/base/String.h>
#include <zypp/ResPool.h>
#include <zypp/Package.h>
#include <zypp/Patch.h>
@@ -98,60 +99,64 @@
YCPList ret;
std::string name = tag->value();
- // 'it' is 'const struct std::pair<const std::string, std::pair<zypp::Capability, zypp::PoolItem> >'
- for (zypp::ResPool::byCapabilityIndex_iterator it = zypp_ptr()->pool().byCapabilityIndexBegin(name, zypp::Dep::PROVIDES);
- it != zypp_ptr()->pool().byCapabilityIndexEnd(name, zypp::Dep::PROVIDES);
- ++it)
- {
- // is it a package?
- if (zypp::isKind<zypp::Package>(it->item.resolvable()))
- {
-
- // cast to Package object
- zypp::Package::constPtr package = zypp::dynamic_pointer_cast<const zypp::Package>(it->item.resolvable());
- std::string pkgname = package->name();
-
- // get instance status
- bool installed = it->item.status().staysInstalled();
- std::string instance;
+ zypp::Capability cap(name, zypp::ResKind::package);
+ zypp::sat::WhatProvides possibleProviders(cap);
-# warning Status `NONE and `INST is not supported
- // TODO FIXME the other values??
- if (installed)
- {
- instance = "BOTH";
- }
- else
- {
- instance = "CAND";
- }
+ for_(iter, possibleProviders.begin(), possibleProviders.end())
+ {
+ zypp::PoolItem provider = zypp::ResPool::instance().find(*iter);
- // get status on the system
- bool uninstalled = it->item.status().staysUninstalled() || it->item.status().isToBeUninstalled();
- std::string onSystem;
+ // cast to Package object
+ zypp::Package::constPtr package = zypp::dynamic_pointer_cast<const zypp::Package>(provider.resolvable());
- if (uninstalled)
- {
- onSystem = "NONE";
- }
- else if (installed)
- {
- onSystem = "INST";
- }
- else
- {
- onSystem = "CAND";
- }
+ if (!package)
+ {
+ y2internal("Casting to Package failed!");
+ continue;
+ }
- // create list item
- YCPList item;
- item->add(YCPString(pkgname));
- item->add(YCPSymbol(instance));
- item->add(YCPSymbol(onSystem));
+ std::string pkgname = package->name();
- // add the item to the result
- ret->add(item);
+ // get instance status
+ bool installed = provider.status().staysInstalled();
+ std::string instance;
+
+# warning Status `NONE and `INST is not supported
+ // TODO FIXME the other values??
+ if (installed)
+ {
+ instance = "BOTH";
}
+ else
+ {
+ instance = "CAND";
+ }
+
+ // get status on the system
+ bool uninstalled = provider.status().staysUninstalled() || provider.status().isToBeUninstalled();
+ std::string onSystem;
+
+ if (uninstalled)
+ {
+ onSystem = "NONE";
+ }
+ else if (installed)
+ {
+ onSystem = "INST";
+ }
+ else
+ {
+ onSystem = "CAND";
+ }
+
+ // create list item
+ YCPList item;
+ item->add(YCPString(pkgname));
+ item->add(YCPSymbol(instance));
+ item->add(YCPSymbol(onSystem));
+
+ // add the item to the result
+ ret->add(item);
}
return ret;
@@ -191,58 +196,55 @@
YCPValue
PkgModuleFunctions::PkgMediaNames ()
{
-# warning No installation order
-
- std::list<zypp::SourceManager::SourceId> source_ids = zypp::SourceManager::sourceManager()->enabledSources();
-
YCPList res;
- // initialize
- for( std::list<zypp::SourceManager::SourceId>::const_iterator sit = source_ids.begin();
- sit != source_ids.end(); ++sit)
+ RepoId index = 0;
+ // for all enabled sources
+ for( RepoCont::const_iterator repoit = repos.begin();
+ repoit != repos.end(); ++repoit,++index)
{
- unsigned id = *sit;
+ if ((*repoit)->repoInfo().enabled() && !(*repoit)->isDeleted())
+ {
+ try
+ {
+ std::string repo_name = (*repoit)->repoInfo().name();
+ YCPList src_desc;
+
+ if (repo_name.empty())
+ {
+ y2warning("Name of repository '%zd' is empty, using URL", index);
- zypp::Source_Ref src = zypp::SourceManager::sourceManager()->findSource( id );
+ // use URL as the product name
+ std::string name;
+ if ((*repoit)->repoInfo().baseUrlsBegin() != (*repoit)->repoInfo().baseUrlsEnd())
+ {
+ name = (*repoit)->repoInfo().baseUrlsBegin()->asString();
+ }
- try
- {
- // find a product for the given source
- zypp::ResPool::byKind_iterator it = zypp_ptr()->pool().byKindBegin(zypp::ResTraits<zypp::Product>::kind);
+ // use alias if url is unknown
+ if (name.empty())
+ {
+ name = (*repoit)->repoInfo().alias();
+ }
- for( ; it != zypp_ptr()->pool().byKindEnd(zypp::ResTraits<zypp::Product>::kind)
- ; ++it) {
- zypp::Product::constPtr product = boost::dynamic_pointer_cast<const zypp::Product>( it->resolvable() );
+ src_desc->add( YCPString( name ));
+ src_desc->add( YCPInteger( index ) );
- y2debug ("Checking product: %s", product->summary().c_str());
- if( product->source() == src )
+ res->add( src_desc );
+ }
+ else
{
- y2debug ("Found");
-
- YCPList src_desc;
- src_desc->add( YCPString( product->summary() ) );
- src_desc->add( YCPInteger( src.numericId() ) );
+ src_desc->add( YCPString( repo_name ));
+ src_desc->add( YCPInteger( index ) );
res->add( src_desc );
- break;
}
}
-
- if( it == zypp_ptr()->pool().byKindEnd(zypp::ResTraits<zypp::Product>::kind) )
+ catch (...)
{
- y2error ("Product for source '%d' not found", id);
-
- YCPList src_desc;
- src_desc->add( YCPString( src.url().asString() ) );
- src_desc->add( YCPInteger( src.numericId() ) );
-
- res->add( src_desc );
+ return res;
}
}
- catch (...)
- {
- return res;
- }
}
y2milestone( "Pkg::PkgMediaNames result: %s", res->toString().c_str());
@@ -250,56 +252,58 @@
return res;
}
+static YCPValue
+PkgMediaSizesOrCount (bool sizes, bool download_size)
+{
+ // all enabled sources
+ std::list<RepoId> source_ids;
+ RepoId index = 0;
+ for(RepoCont::const_iterator it = repos.begin(); it != repos.end() ; ++it, ++index)
+ {
+ // ignore disabled or delted sources
+ if (!(*it)->repoInfo().enabled() || (*it)->isDeleted())
+ continue;
-// ------------------------
-/**
- * @builtin PkgMediaSizes
- * @short Return size of packages to be installed
- * @description
- * return cumulated sizes (in bytes !) to be installed from different sources and media
- *
- * Returns the install size, not the archivesize !!
- *
- * @return list<list<integer>>
- * @usage Pkg::PkgMediaSizes () -> [ [src1_media_1_size, src1_media_2_size, ...], ..]
- */
-YCPValue
-PkgModuleFunctions::PkgMediaSizes ()
-{
-# warning No installation order
+ source_ids.push_back(index);
+ }
- // all enabled sources
- std::list<zypp::SourceManager::SourceId> source_ids = zypp::SourceManager::sourceManager()->enabledSources();
// map SourceId -> [ number_of_media, total_size ]
- std::map<zypp::SourceManager::SourceId, std::vector<zypp::ByteCount> > result;
+ std::map<RepoId, std::vector<zypp::ByteCount> > result;
- // map zypp::Source -> SourceID
- std::map<zypp::Source_Ref, zypp::SourceManager::SourceId> source_map;
+ // map alias -> SourceID
+ std::map<std::string, RepoId> source_map;
- // initialize
- for( std::list<zypp::SourceManager::SourceId>::const_iterator sit = source_ids.begin();
- sit != source_ids.end(); ++sit)
+ // initialize the structures
+ for( std::list<RepoId>::const_iterator sit = source_ids.begin();
+ sit != source_ids.end(); ++sit, ++index)
{
- zypp::SourceManager::SourceId id = *sit;
+ RepoId id = *sit;
- zypp::Source_Ref src = zypp::SourceManager::sourceManager()->findSource( id );
- unsigned media = src.numberOfMedia();
+ YRepo_Ptr repo = logFindRepository(id);
+ if (!repo)
+ continue;
- result[id] = std::vector<zypp::ByteCount>(media,0);
- source_map[ src ] = id;
+ // we don't know the number of media in advance
+ // the vector is dynamically resized during package search
+ result[id] = std::vector<zypp::ByteCount>();
+ source_map[ repo->repoInfo().alias() ] = id;
}
- for( zypp::ResPool::byKind_iterator it = zypp_ptr()->pool().byKindBegin<zypp::Package>()
- ; it != zypp_ptr()->pool().byKindEnd<zypp::Package>()
- ; ++it )
- {
- zypp::Package::constPtr pkg = boost::dynamic_pointer_cast<const zypp::Package>(it->resolvable());
- if( it->status().isToBeInstalled())
+ for (zypp::ResPoolProxy::const_iterator it = zypp_ptr()->poolProxy().byKindBegin(zypp::ResKind::package);
+ it != zypp_ptr()->poolProxy().byKindEnd(zypp::ResKind::package);
+ ++it)
+ {
+ if ((*it)->fate() == zypp::ui::Selectable::TO_INSTALL)
{
- unsigned int medium = pkg->sourceMediaNr();
+ zypp::Package::constPtr pkg = boost::dynamic_pointer_cast<const zypp::Package>((*it)->candidateObj().resolvable());
+
+ if (!pkg)
+ continue;
+
+ unsigned int medium = pkg->mediaNr();
if (medium == 0)
{
medium = 1;
@@ -307,19 +311,29 @@
if (medium > 0)
{
- zypp::ByteCount size = pkg->size();
- result[ source_map[pkg->source()] ]
- [medium - 1] += size ; // media are numbered from 1
+ zypp::ByteCount size = sizes ? (download_size ? pkg->downloadSize() : pkg->installSize()) : zypp::ByteCount(1); //count only
+
+ // refence to the found media array
+ std::vector<zypp::ByteCount> &ref = result[source_map[pkg->repoInfo().alias()]];
+ int add_count = (medium - 1) - ref.size() + 1;
+
+ // resize media array - the found index is out of array
+ if (add_count > 0)
+ {
+ ref.insert(ref.end(), add_count, zypp::ByteCount(0));
+ }
+
+ ref[medium - 1] += size ; // media are numbered from 1
}
}
}
YCPList res;
- for(std::map<zypp::SourceManager::SourceId, std::vector<zypp::ByteCount> >::const_iterator it =
+ for(std::map<RepoId, std::vector<zypp::ByteCount> >::const_iterator it =
result.begin(); it != result.end() ; ++it)
{
- std::vector<zypp::ByteCount> values = it->second;
+ const std::vector<zypp::ByteCount> &values = it->second;
YCPList source;
for( unsigned i = 0 ; i < values.size() ; i++ )
@@ -330,11 +344,30 @@
res->add( source );
}
- y2milestone( "Pkg::PkgMediaSize result: %s", res->toString().c_str());
+ y2milestone( "Pkg::%s result: %s", sizes ? (download_size ? "PkgMediaPackageSizes" : "PkgMediaSizes" ): "PkgMediaCount", res->toString().c_str());
return res;
}
+// ------------------------
+/**
+ * @builtin PkgMediaSizes
+ * @short Return size of packages to be installed
+ * @description
+ * return cumulated sizes (in bytes !) to be installed from different sources and media
+ *
+ * Returns the install size, not the archivesize !!
+ *
+ * @return list<list<integer>>
+ * @usage Pkg::PkgMediaSizes () -> [ [src1_media_1_size, src1_media_2_size, ...], ..]
+ */
+YCPValue
+PkgModuleFunctions::PkgMediaSizes ()
+{
+# warning No installation order
+ return PkgMediaSizesOrCount (true);
+}
+
// ------------------------
/**
@@ -349,88 +382,13 @@
YCPValue
PkgModuleFunctions::PkgMediaCount()
{
-# warning No installation order
-
- // all enabled sources
- std::list<zypp::SourceManager::SourceId> source_ids = zypp::SourceManager::sourceManager()->enabledSources();
-
- // map SourceId -> [ number_of_media, total_size ]
- std::map<zypp::SourceManager::SourceId, std::vector<zypp::ByteCount> > result;
-
- // map zypp::Source -> SourceID
- std::map<zypp::Source_Ref, zypp::SourceManager::SourceId> source_map;
-
-
- // initialize
- for( std::list<zypp::SourceManager::SourceId>::const_iterator sit = source_ids.begin();
- sit != source_ids.end(); ++sit)
- {
- zypp::SourceManager::SourceId id = *sit;
-
- zypp::Source_Ref src = zypp::SourceManager::sourceManager()->findSource( id );
- unsigned media = src.numberOfMedia();
-
- result[id] = std::vector<zypp::ByteCount>(media,0);
-
- source_map[ src ] = id;
- }
-
- for( zypp::ResPool::byKind_iterator it = zypp_ptr()->pool().byKindBegin<zypp::Package>()
- ; it != zypp_ptr()->pool().byKindEnd<zypp::Package>()
- ; ++it )
- {
- zypp::Package::constPtr pkg = boost::dynamic_pointer_cast<const zypp::Package>(it->resolvable());
-
- if( pkg && it->status().isToBeInstalled())
- {
- unsigned int medium = pkg->sourceMediaNr();
- if (medium == 0)
- {
- medium = 1;
- }
-
- if (medium > 0)
- {
- result[ source_map[pkg->source()] ]
- [medium - 1]++ ; // media are numbered from 1
- }
- }
- }
- YCPList res;
-
- for(std::map<zypp::SourceManager::SourceId, std::vector<zypp::ByteCount> >::const_iterator it =
- result.begin(); it != result.end() ; ++it)
- {
- const std::vector<zypp::ByteCount> &values = it->second;
- YCPList source;
-
- for( unsigned i = 0 ; i < values.size() ; i++ )
- {
- source->add( YCPInteger( values[i] ) );
- }
-
- res->add( source );
- }
-
- y2milestone( "Pkg::PkgMediaCount result: %s", res->toString().c_str());
-
- return res;
+# warning No installation order
+ return PkgMediaSizesOrCount (false);
}
// ------------------------
-struct CaIMatch
-{
- zypp::PoolItem_Ref item;
-
- bool operator() (const zypp::CapAndItem & cai )
- {
- item = cai.item;
- return false;
- }
-};
-
/**
* @builtin IsProvided
*
@@ -450,26 +408,25 @@
if (name.empty())
return YCPBoolean (false);
- y2milestone("IsProvided called");
+ // look for packages
+ zypp::Capability cap(name, zypp::ResKind::package);
+ zypp::sat::WhatProvides possibleProviders(cap);
- zypp::Dep dep( zypp::Dep::PROVIDES );
- CaIMatch match;
-
- // look for installed packages
-
- try
- {
- invokeOnEach( zypp_ptr()->pool().byCapabilityIndexBegin( name, dep ),
- zypp_ptr()->pool().byCapabilityIndexEnd( name, dep ),
- zypp::functor::chain( zypp::resfilter::ByCaIInstalled (),
- zypp::resfilter::ByCaIKind( zypp::ResTraits<zypp::Package>::kind ) ),
- zypp::functor::functorRef<bool,zypp::CapAndItem>( match ) );
- }
- catch (...)
+ for_(iter, possibleProviders.begin(), possibleProviders.end())
{
+ zypp::PoolItem provider = zypp::ResPool::instance().find(*iter);
+
+ // is it installed?
+ if (provider.status().isInstalled())
+ {
+ y2milestone("Tag %s is provided by %s", name.c_str(), provider->name().c_str());
+ return YCPBoolean(true);
+ }
}
- return YCPBoolean( match.item );
+ y2milestone("Tag %s is not provided", name.c_str());
+
+ return YCPBoolean(false);
}
@@ -492,24 +449,25 @@
if (name.empty())
return YCPBoolean (false);
- zypp::Dep dep( zypp::Dep::PROVIDES );
- CaIMatch match;
+ // look for packages
+ zypp::Capability cap(name, zypp::ResKind::package);
+ zypp::sat::WhatProvides possibleProviders(cap);
- try
- {
- // look for to-be-installed packages
- invokeOnEach( zypp_ptr()->pool().byCapabilityIndexBegin( name, dep ),
- zypp_ptr()->pool().byCapabilityIndexEnd( name, dep ),
- zypp::functor::chain( zypp::resfilter::ByCaIUninstalled(),
- zypp::functor::chain( zypp::resfilter::ByCaITransact(),
- zypp::resfilter::ByCaIKind( zypp::ResTraits<zypp::Package>::kind ) ) ),
- zypp::functor::functorRef<bool,zypp::CapAndItem>( match ) );
- }
- catch (...)
+ for_(iter, possibleProviders.begin(), possibleProviders.end())
{
+ zypp::PoolItem provider = zypp::ResPool::instance().find(*iter);
+
+ // is it installed?
+ if (provider.status().isToBeInstalled())
+ {
+ y2milestone("Tag %s provided by %s is selected to install", name.c_str(), provider->name().c_str());
+ return YCPBoolean(true);
+ }
}
- return YCPBoolean( match.item );
+ y2milestone("Tag %s is not selected to install", name.c_str());
+
+ return YCPBoolean(false);
}
// ------------------------
@@ -530,28 +488,29 @@
YCPValue
PkgModuleFunctions::IsAvailable (const YCPString& tag)
{
- y2milestone("IsAvailable called");
- std::string name = tag->value ();
+ std::string name = tag->value ();
if (name.empty())
return YCPBoolean (false);
- zypp::Dep dep( zypp::Dep::PROVIDES );
- CaIMatch match;
+ // look for packages
+ zypp::Capability cap(name, zypp::ResKind::package);
+ zypp::sat::WhatProvides possibleProviders(cap);
- try
- {
- // look for uninstalled packages
- invokeOnEach( zypp_ptr()->pool().byCapabilityIndexBegin( name, dep ),
- zypp_ptr()->pool().byCapabilityIndexEnd( name, dep ),
- zypp::functor::chain( zypp::resfilter::ByCaIUninstalled(),
- zypp::resfilter::ByCaIKind( zypp::ResTraits<zypp::Package>::kind ) ),
- zypp::functor::functorRef<bool,zypp::CapAndItem>( match ) );
- }
- catch (...)
+ for_(iter, possibleProviders.begin(), possibleProviders.end())
{
+ zypp::PoolItem provider = zypp::ResPool::instance().find(*iter);
+
+ // is it installed?
+ if (!provider.status().isInstalled())
+ {
+ y2milestone("Tag %s provided by %s is available to install", name.c_str(), provider->name().c_str());
+ return YCPBoolean(true);
+ }
}
- return YCPBoolean( match.item );
+ y2milestone("Tag %s is not available to install", name.c_str());
+
+ return YCPBoolean(false);
}
@@ -1613,7 +1572,7 @@
* on the delete_unmaintained arg, they are either tagged as to delete or
* remain unchanged.
*
- * @return map<symbol,integer> summary of the update
+ * @return map<symbol,integer> summary of the update
*/
YCPValue
@@ -1723,9 +1682,19 @@
if (name.empty())
return YCPBoolean (false);
- // ensure installation of the 'best' architecture
+ bool ret = false;
+ zypp::ui::Selectable::Ptr selectable = zypp::ui::Selectable::get(name);
- return YCPBoolean( DoProvideNameKind( name, zypp::ResTraits<zypp::Package>::kind, zypp_ptr()->architecture(), "") );
+ if (selectable)
+ {
+ ret = selectable->setToInstall(whoWantsIt);
+ }
+ else
+ {
+ y2error("Package %s is not available", name.c_str());
+ }
+
+ return YCPBoolean(ret);
}
/**
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.cc (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.cc Tue May 10 17:09:46 2011
@@ -34,9 +34,9 @@
#include <ycp/YCPMap.h>
#include <ycp/YCPVoid.h>
-#include <zypp/SourceManager.h>
#include <zypp/ZYppFactory.h>
-#include <zypp/ResPool.h>
+#include <zypp/Locale.h>
+//#include <zypp/ResPool.h>
// sleep
#include <unistd.h>
@@ -45,7 +45,7 @@
#include <cstdlib>
// textdomain
-#include <libintl.h>
+#include <libintl.h>
class Y2PkgFunction: public Y2Function
{
@@ -313,23 +313,49 @@
/**
- * @builtin SetLocale
- * @short Set Prefered Locale
+ * @short Set Package Manager Locale
* @description
- * set the given locale as the "preferred" locale
+ * Set the given locale as the output locale -- all messages from the package manager (errors, warnings,...)
+ * will be returned in the selected language. This built-in does not change package selection in any way.
+ * @param string locale Locale
+ * @return void
+ */
+static YCPValue
+SetTextLocale (const YCPString &locale)
+{
+ try
+ {
+ zypp::Locale loc = zypp::Locale(locale->value());
+ zypp::ZConfig::instance().setTextLocale(loc);
+ }
+ catch (const std::exception& excpt)
+ {
+ y2error("Caught an exception: %s", excpt.what());
+ }
+ catch (...)
+ {
+ y2internal("Caught an unknown exception");
+ }
+
+ return YCPVoid();
+}
+
+/**
+ * @short Select locale for installation
+ * @description
+ * Select the main locale for installation, call Pkg::PkgSolve() to select the respective packages.
* @param string locale Locale
* @return void
*/
YCPValue
-PkgModuleFunctions::SetLocale (const YCPString &locale)
+PkgModuleFunctions::SetPackageLocale (const YCPString &locale)
{
try
{
zypp::Locale loc = zypp::Locale(locale->value());
- zypp_ptr()->setTextLocale(loc);
// add packages for the preferred locale, preserve additional locales
- zypp::ZYpp::LocaleSet lset = zypp_ptr()->getRequestedLocales();
+ zypp::LocaleSet lset = zypp::sat::Pool::instance().getRequestedLocales();
// remove the previous locale
if (preferred_locale != zypp::Locale::noCode)
@@ -339,7 +365,7 @@
// add the new locale
lset.insert(loc);
- zypp_ptr()->setRequestedLocales(lset);
+ zypp::sat::Pool::instance().setRequestedLocales(lset);
// remember the main locale
preferred_locale = loc;
@@ -352,6 +378,22 @@
}
/**
+ * @builtin SetLocale
+ * @short Set Prefered Locale
+ * @description
+ * set the given locale as the "preferred" locale
+ * @param string locale Locale
+ * @return void
+ */
+YCPValue
+PkgModuleFunctions::SetLocale (const YCPString &locale)
+{
+ SetTextLocale(locale);
+ SetPackageLocale(locale);
+ return YCPVoid();
+}
+
+/**
* @builtin GetLocale
* @short get the currently preferred locale
* @return string locale
@@ -383,7 +425,7 @@
YCPValue
PkgModuleFunctions::SetAdditionalLocales (YCPList langycplist)
{
- zypp::ZYpp::LocaleSet lset;
+ zypp::LocaleSet lset;
int i = 0;
while (i < langycplist->size())
@@ -407,7 +449,7 @@
try
{
- zypp_ptr()->setRequestedLocales(lset);
+ zypp::sat::Pool::instance().setRequestedLocales(lset);
}
catch(...)
{
@@ -431,9 +473,9 @@
try
{
- zypp::ZYpp::LocaleSet lset = zypp_ptr()->getRequestedLocales();
+ zypp::LocaleSet lset = zypp::sat::Pool::instance().getRequestedLocales();
- for (zypp::ZYpp::LocaleSet::const_iterator it = lset.begin();
+ for (zypp::LocaleSet::const_iterator it = lset.begin();
it != lset.end(); ++it)
{
// ignore the main locale
@@ -507,15 +549,7 @@
YCPValue
PkgModuleFunctions::Init ()
{
- try {
- zypp::SourceManager::sourceManager()->reset();
- }
- catch( const zypp::Exception & expt )
- {
- y2error( "Initialization of libzypp failed" );
- return YCPBoolean(false);
- }
-
+ // With Code11 stack, nothing to initialize
return YCPBoolean(true);
}
Modified: branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/dmacvicar/zc10/pkg-bindin…
==============================================================================
--- branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.h (original)
+++ branches/tmp/dmacvicar/zc10/pkg-bindings/src/PkgModuleFunctions.h Tue May 10 17:09:46 2011
@@ -43,8 +43,6 @@
#include <zypp/Url.h>
#include <zypp/Arch.h>
#include <zypp/DiskUsageCounter.h>
-#include <zypp/SourceManager.h>
-
#include "PkgError.h"
@@ -78,21 +76,22 @@
protected:
zypp::Pathname _target_root;
-
+
std::set<std::string> _broken_sources;
zypp::ZYpp::Ptr zypp_pointer;
+ // From Code11, but we only use it as a helper
+ YCPValue SetPackageLocale (const YCPString &locale);
// remember the main locale (set by SetLocale) for SetAdditionalLocales,
// add the main locale to the additional ones
zypp::Locale preferred_locale;
- /**
+ /**
* ZYPP
*/
zypp::ZYpp::Ptr zypp_ptr();
-
private: // source related
bool DoProvideNameKind( const std::string & name, zypp::Resolvable::Kind kind, zypp::Arch architecture,
@@ -102,7 +101,7 @@
bool DoRemoveAllKind(zypp::Resolvable::Kind kind);
bool DoAllKind(zypp::Resolvable::Kind kind, bool provide);
YCPValue GetPkgLocation(const YCPString& p, bool full_path);
- YCPValue PkgProp( zypp::PoolItem_Ref item );
+ YCPValue PkgProp( zypp::PoolItem item );
void SetCurrentDU();
@@ -136,7 +135,7 @@
* call zypp::SourceManager::sourceManager()->findSource
* and in case of exception, log error and setLastError AND RETHROW
*/
- zypp::Source_Ref logFindSource (zypp::SourceManager::SourceId id);
+ //zypp::Source_Ref logFindSource (zypp::SourceManager::SourceId id);
public:
// general
@@ -304,25 +303,25 @@
/* TYPEINFO: void(string) */
YCPValue CallbackResolvableReport( const YCPString& func );
/* TYPEINFO: void(string) */
- YCPValue CallbackImportGpgKey( const YCPString& func );
+ YCPValue CallbackImportGpgKey( const YCPString& func );
/* TYPEINFO: void(string) */
YCPValue CallbackAcceptNonTrustedGpgKey( const YCPString& args );
/* TYPEINFO: void(string) */
- YCPValue CallbackAcceptUnknownGpgKey( const YCPString& func );
+ YCPValue CallbackAcceptUnknownGpgKey( const YCPString& func );
/* TYPEINFO: void(string) */
- YCPValue CallbackAcceptUnsignedFile( const YCPString& func );
+ YCPValue CallbackAcceptUnsignedFile( const YCPString& func );
/* TYPEINFO: void(string) */
- YCPValue CallbackAcceptVerificationFailed( const YCPString& func );
+ YCPValue CallbackAcceptVerificationFailed( const YCPString& func );
/* TYPEINFO: void(string) */
YCPValue CallbackAcceptWrongDigest( const YCPString& func);
/* TYPEINFO: void(string) */
YCPValue CallbackAcceptUnknownDigest( const YCPString& func);
/* TYPEINFO: void(string) */
- YCPValue CallbackTrustedKeyAdded( const YCPString& func );
+ YCPValue CallbackTrustedKeyAdded( const YCPString& func );
/* TYPEINFO: void(string) */
- YCPValue CallbackTrustedKeyRemoved( const YCPString& func );
+ YCPValue CallbackTrustedKeyRemoved( const YCPString& func );
/* TYPEINFO: void(string) */
- YCPValue CallbackAcceptFileWithoutChecksum( const YCPString& func );
+ YCPValue CallbackAcceptFileWithoutChecksum( const YCPString& func );
// source related
/* TYPEINFO: boolean(boolean)*/
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63938 - /branches/tmp/dmacvicar/zc10/yast2-pkg-bindings/
by dmacvicar@svn2.opensuse.org 10 May '11
by dmacvicar@svn2.opensuse.org 10 May '11
10 May '11
Author: dmacvicar
Date: Tue May 10 16:51:05 2011
New Revision: 63938
URL: http://svn.opensuse.org/viewcvs/yast?rev=63938&view=rev
Log: (empty)
Removed:
branches/tmp/dmacvicar/zc10/yast2-pkg-bindings/
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63937 - /branches/tmp/dmacvicar/zc10/pkg-bindings/
by dmacvicar@svn2.opensuse.org 10 May '11
by dmacvicar@svn2.opensuse.org 10 May '11
10 May '11
Author: dmacvicar
Date: Tue May 10 16:50:48 2011
New Revision: 63937
URL: http://svn.opensuse.org/viewcvs/yast?rev=63937&view=rev
Log: (empty)
Added:
branches/tmp/dmacvicar/zc10/pkg-bindings/ (props changed)
- copied from r63936, branches/SuSE-SLE-10-SP4-Branch/pkg-bindings/
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63936 - /branches/tmp/dmacvicar/zc10/yast2-pkg-bindings/
by dmacvicar@svn2.opensuse.org 10 May '11
by dmacvicar@svn2.opensuse.org 10 May '11
10 May '11
Author: dmacvicar
Date: Tue May 10 16:49:53 2011
New Revision: 63936
URL: http://svn.opensuse.org/viewcvs/yast?rev=63936&view=rev
Log:
branch to port to code11 with stable Code10 API
Added:
branches/tmp/dmacvicar/zc10/yast2-pkg-bindings/ (props changed)
- copied from r63935, branches/SuSE-SLE-10-SP4-Branch/pkg-bindings/
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63935 - in /trunk/fcoe-client/src: FcoeClient.ycp complex.ycp dialogs.ycp wizards.ycp
by gs@svn2.opensuse.org 10 May '11
by gs@svn2.opensuse.org 10 May '11
10 May '11
Author: gs
Date: Tue May 10 15:41:30 2011
New Revision: 63935
URL: http://svn.opensuse.org/viewcvs/yast?rev=63935&view=rev
Log:
get/set/adjust status of services
Modified:
trunk/fcoe-client/src/FcoeClient.ycp
trunk/fcoe-client/src/complex.ycp
trunk/fcoe-client/src/dialogs.ycp
trunk/fcoe-client/src/wizards.ycp
Modified: trunk/fcoe-client/src/FcoeClient.ycp
URL: http://svn.opensuse.org/viewcvs/yast/trunk/fcoe-client/src/FcoeClient.ycp?r…
==============================================================================
--- trunk/fcoe-client/src/FcoeClient.ycp (original)
+++ trunk/fcoe-client/src/FcoeClient.ycp Tue May 10 15:41:30 2011
@@ -42,6 +42,7 @@
import "Mode";
import "Package";
import "Popup";
+import "Service";
/**
* Prototypes
@@ -124,21 +125,42 @@
AbortFunction = function;
}
+/*
+ from IscsiClientLib.ycp (line 53) - reading output
+
+ string from_bios = ((map<string, any>)SCR::Execute(.target.bash_output, "iscsiadm -m fw"))["stdout"]:"";
+ foreach(string row, splitstring(from_bios, "\n"), {
+ list<string> key_val=splitstring(row, "=");
+// if (size(key_val[0]:"")>0) ibft[key_val[0]:""] = key_val[1]:"";
+ string kv = String::CutBlanks(key_val[0]:"");
+ if (size(kv) > 0) ibft[kv] = String::CutBlanks(key_val[1]:"");
+ });
+ */
+
+
// Settings: Define all variables needed for configuration of fcoe-client
// Define all the variables necessary to hold
-global integer current_card = 0; // currently selected card, means row in list of cards
+global integer current_card = 0; // currently selected card, means row in list of cards
global string NOT_CONFIGURED = "not configured";
global string NOT_AVAILABLE = "not available";
-// map containing information about networks cards and VLAN, FCoE aand DCB status
+// map containing information about networks cards and VLAN, FCoE and DCB status
map <integer, list> network_interfaces = $[];
// map containing information about values in /etc/fcoe/config
-map <string, string> fcoe_general_config = $[];
+map <string, string> fcoe_general_config = $[ "DEBUG":"no",
+ "USE_SYSLOG":"yes" ];
+
+// list containing information about 'redo' commands
+list <string> redo_list = [];
+
+// map containing information about start of services
+map <string, boolean> service_start = $[ "fcoe":false,
+ "lldpad":false ];
//
// Check whether open-fcoe is installed and do installation if user agrees
@@ -289,7 +311,7 @@
}
list <string> lines = splitstring( content, "\n" );
-
+ // TODO: better/more elegant way of reading values (use SysConfig agent?)
foreach( string line, (list<string>)lines, {
if ( regexpmatch( line, "^FCOE_ENABLE" ) )
{
@@ -353,11 +375,50 @@
}
//
+// Set status of services
//
+global void AdjustStatusOfServices( )
+{
+ y2milestone( "Setting start of /etc/init.d/fcoe to %1", service_start["fcoe"]:false );
+ if ( service_start["fcoe"]:false == true )
+ Service::Enable("fcoe");
+ else
+ Service::Disable("open-fcoe");
+
+ y2milestone( "Setting start of /etc/init.d/lldpad to %1", service_start["lldpad"]:false );
+ if ( service_start["lldpad"]:false == true )
+ Service::Enable("lldpad");
+ else
+ Service::Disable("lldpad");
+
+}
+
+global void SetServiceStatus( string service, boolean status )
+{
+ y2milestone( "Setting status of %1 to %2", service, status );
+ service_start[ service ] = status;
+}
+
//
-void CheckServices()
+// Get status of services
+//
+void DetectStatusOfServices()
{
+ boolean status = false;
+ status = Service::Enabled( "fcoe" );
+ y2milestone( "Status of fcoe: %1", status );
+ service_start = add( service_start, "fcoe", status );
+
+ status = Service::Enabled( "lldpad" );
+ y2milestone( "Status of lldpad: %1", status );
+ service_start = add( service_start, "lldpad", status );
+
+}
+
+global map<string, boolean> GetServiceStatus()
+{
+ return service_start;
}
//
@@ -458,6 +519,23 @@
return fcoe_general_config;
}
+//
+// Add a command to the list of redo commands
+//
+global void AddRedoCommand( string command )
+{
+ redo_list = add( redo_list, command );
+ y2milestone( "Adding redo command: %1", command );
+}
+
+//
+// Get the list of redo commands
+//
+global list GetRedoCommands()
+{
+ return redo_list;
+}
+
/**
* Read all fcoe-client settings
* @return true on success
@@ -514,7 +592,7 @@
Progress::NextStage();
// check daemon fcoemon and lldpad
- CheckServices();
+ DetectStatusOfServices();
/* Error message */
if(false) Report::Error(_("Checking for services failed"));
Modified: trunk/fcoe-client/src/complex.ycp
URL: http://svn.opensuse.org/viewcvs/yast/trunk/fcoe-client/src/complex.ycp?rev=…
==============================================================================
--- trunk/fcoe-client/src/complex.ycp (original)
+++ trunk/fcoe-client/src/complex.ycp Tue May 10 15:41:30 2011
@@ -36,6 +36,7 @@
import "Wizard_hw";
import "Confirm";
import "FcoeClient";
+import "Service";
include "fcoe-client/helps.ycp";
@@ -85,6 +86,19 @@
* Init
**/
void InitServicesDialog (string id) {
+
+ map status_map = FcoeClient::GetServiceStatus();
+
+ if ( status_map["fcoe"]:false == true )
+ {
+ UI::ChangeWidget( `id( "fcoe_startup_auto" ), `Value, true );
+ UI::ChangeWidget( `id( "fcoe_startup_manual" ), `Value, false );
+ }
+ else
+ {
+ UI::ChangeWidget( `id( "fcoe_startup_auto" ), `Value, false );
+ UI::ChangeWidget( `id( "fcoe_startup_manual" ), `Value, true );
+ }
y2milestone( "Init services dialog" );
}
@@ -264,7 +278,12 @@
UI::ChangeWidget( `id( `interfaces), `Cell( FcoeClient::current_card, 4), status_map["FCOE_ENABLE"]:"" );
UI::ChangeWidget( `id( `interfaces), `Cell( FcoeClient::current_card, 5), status_map["DCB_REQUIRED"]:"" );
AdjustButtons();
-
+ if ( fcoe_vlan_interface != "" )
+ {
+ // store command to be able to redo the creation of FCoE VLAN interface
+ // in case of abort
+ FcoeClient::AddRedoCommand( sformat("vconfig rem %1", fcoe_vlan_interface ) );
+ }
}
else
{
@@ -296,8 +315,30 @@
* Store
**/
-void StoreServicesDialog (string id, map event) {
- y2milestone( "Store services dialog" );
+void StoreServicesDialog (string id, map event)
+{
+ y2milestone( "Store services dialog" );
+ boolean fcoe_auto = (boolean)UI::QueryWidget( `id ("fcoe_startup_auto"), `Value );
+
+ if ( fcoe_auto )
+ {
+ FcoeClient::SetServiceStatus( "fcoe", true );
+ y2milestone( "Setting auto start of FCoE to true");
+ }
+ // Check whether FCoE already running and start if required
+ integer status = Service::Status("fcoe");
+
+ if ( status != 0 )
+ {
+ Service::Start("fcoe");
+ y2milestone( "Starting FCoE (/etc/init.d/fcoe start)");
+ }
+ else
+ {
+ y2milestone( "FCoE running");
+ }
+
+
}
void StoreInterfacesDialog (string id, map event) {
Modified: trunk/fcoe-client/src/dialogs.ycp
URL: http://svn.opensuse.org/viewcvs/yast/trunk/fcoe-client/src/dialogs.ycp?rev=…
==============================================================================
--- trunk/fcoe-client/src/dialogs.ycp (original)
+++ trunk/fcoe-client/src/dialogs.ycp Tue May 10 15:41:30 2011
@@ -41,9 +41,9 @@
term items = `VBox(
`VSpacing (0.4),
- `Left (`RadioButton (`id ("startup_auto"), `opt (`notify),
+ `Left (`RadioButton (`id ("fcoe_startup_auto"), `opt (`notify),
"When Booting")),
- `Left (`RadioButton (`id ("startup_manual"), `opt (`notify),
+ `Left (`RadioButton (`id ("fcoe_startup_manual"), `opt (`notify),
"Manually")
),
`VSpacing (0.4)
@@ -87,7 +87,7 @@
`VBox (
`VSpacing(2.0),
// frame
- `Frame (_("Service Start"),
+ `Frame (_("FCoE Service Start"),
`VBox (`RadioButtonGroup (`id ("service_startup"), items))
),
`VStretch()
Modified: trunk/fcoe-client/src/wizards.ycp
URL: http://svn.opensuse.org/viewcvs/yast/trunk/fcoe-client/src/wizards.ycp?rev=…
==============================================================================
--- trunk/fcoe-client/src/wizards.ycp (original)
+++ trunk/fcoe-client/src/wizards.ycp Tue May 10 15:41:30 2011
@@ -97,8 +97,10 @@
];
string ini_tab = "";
-
- if ( true ) // TODO: check lldpad / fcoemon running
+
+ map <string, boolean> status_map = FcoeClient::GetServiceStatus();
+
+ if ( status_map["fcoe"]:false == true || status_map["lldpad"]:false == true )
ini_tab = "interfaces";
else
ini_tab = "services";
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63934 - in /branches/SuSE-Code-11-SP2-Branch/iscsi-client: package/yast2-iscsi-client.changes src/widgets.ycp
by jsrain@svn2.opensuse.org 10 May '11
by jsrain@svn2.opensuse.org 10 May '11
10 May '11
Author: jsrain
Date: Tue May 10 12:43:08 2011
New Revision: 63934
URL: http://svn.opensuse.org/viewcvs/yast?rev=63934&view=rev
Log:
merged SP1 branch
Modified:
branches/SuSE-Code-11-SP2-Branch/iscsi-client/package/yast2-iscsi-client.changes
branches/SuSE-Code-11-SP2-Branch/iscsi-client/src/widgets.ycp
Modified: branches/SuSE-Code-11-SP2-Branch/iscsi-client/package/yast2-iscsi-client.changes
URL: http://svn.opensuse.org/viewcvs/yast/branches/SuSE-Code-11-SP2-Branch/iscsi…
==============================================================================
--- branches/SuSE-Code-11-SP2-Branch/iscsi-client/package/yast2-iscsi-client.changes (original)
+++ branches/SuSE-Code-11-SP2-Branch/iscsi-client/package/yast2-iscsi-client.changes Tue May 10 12:43:08 2011
@@ -12,13 +12,13 @@
-------------------------------------------------------------------
Fri Jul 30 11:39:40 CEST 2010 - mzugec(a)suse.de
-- login into multipath (bnc#599818)
+- login into multipath (bnc#599818, bnc#678118)
- 2.17.22
-------------------------------------------------------------------
Tue May 11 14:54:04 CEST 2010 - mzugec(a)suse.de
-- delete discovered targets (bnc#602108)
+- delete discovered targets (bnc#602108,bnc#667375)
- 2.17.21
-------------------------------------------------------------------
Modified: branches/SuSE-Code-11-SP2-Branch/iscsi-client/src/widgets.ycp
URL: http://svn.opensuse.org/viewcvs/yast/branches/SuSE-Code-11-SP2-Branch/iscsi…
==============================================================================
--- branches/SuSE-Code-11-SP2-Branch/iscsi-client/src/widgets.ycp (original)
+++ branches/SuSE-Code-11-SP2-Branch/iscsi-client/src/widgets.ycp Tue May 10 12:43:08 2011
@@ -505,7 +505,6 @@
if (selected != nil) { params = splitstring( IscsiClientLib::discovered[tointeger(selected)]:"", " " ); }
else { params = []; }
IscsiClientLib::currentRecord = [ splitstring(params[0]:"", ",")[0]:"", params[1]:"" ] ;
-// params = curr_rec;
if ( event["EventReason"]:"" == "Activated" ){
// connect new target
if ( event["ID"]:nil == `connect) {
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63933 - /branches/SuSE-Code-11-SP1-Branch/network/package/yast2-network.changes
by mvidner@svn2.opensuse.org 10 May '11
by mvidner@svn2.opensuse.org 10 May '11
10 May '11
Author: mvidner
Date: Tue May 10 10:36:45 2011
New Revision: 63933
URL: http://svn.opensuse.org/viewcvs/yast?rev=63933&view=rev
Log:
Added a missing .changes entry for SWAMP#40080:
allow IPADDR='' for BOOTPROTO='static' (bnc#652091).
Modified:
branches/SuSE-Code-11-SP1-Branch/network/package/yast2-network.changes
Modified: branches/SuSE-Code-11-SP1-Branch/network/package/yast2-network.changes
URL: http://svn.opensuse.org/viewcvs/yast/branches/SuSE-Code-11-SP1-Branch/netwo…
==============================================================================
--- branches/SuSE-Code-11-SP1-Branch/network/package/yast2-network.changes (original)
+++ branches/SuSE-Code-11-SP1-Branch/network/package/yast2-network.changes Tue May 10 10:36:45 2011
@@ -31,6 +31,7 @@
Fri Nov 26 15:32:13 CET 2010 - mzugec(a)suse.cz
- replaced kinternet dependency with qinternet (bnc#654604)
+- allow IPADDR='' for BOOTPROTO='static' (bnc#652091)
- 2.17.147
-------------------------------------------------------------------
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0
[yast-commit] r63932 - in /trunk/snapper/package: ./ _cvsignore
by aschnell@svn2.opensuse.org 09 May '11
by aschnell@svn2.opensuse.org 09 May '11
09 May '11
Author: aschnell
Date: Mon May 9 17:36:16 2011
New Revision: 63932
URL: http://svn.opensuse.org/viewcvs/yast?rev=63932&view=rev
Log:
- updated ignore stuff
Removed:
trunk/snapper/package/_cvsignore
Modified:
trunk/snapper/package/ (props changed)
--
To unsubscribe, e-mail: yast-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: yast-commit+help(a)opensuse.org
1
0