19 #include <sys/types.h> 70 inline void sigMultiversionSpecChanged()
72 sat::detail::PoolMember::myPool().multiversionSpecChanged();
88 for (
const Transaction::Step & step : steps_r )
90 if ( step.stepType() != Transaction::TRANSACTION_IGNORE )
100 static const std::string strType(
"type" );
101 static const std::string strStage(
"stage" );
102 static const std::string strSolvable(
"solvable" );
104 static const std::string strTypeDel(
"-" );
105 static const std::string strTypeIns(
"+" );
106 static const std::string strTypeMul(
"M" );
108 static const std::string strStageDone(
"ok" );
109 static const std::string strStageFailed(
"err" );
111 static const std::string strSolvableN(
"n" );
112 static const std::string strSolvableE(
"e" );
113 static const std::string strSolvableV(
"v" );
114 static const std::string strSolvableR(
"r" );
115 static const std::string strSolvableA(
"a" );
122 case Transaction::TRANSACTION_IGNORE:
break;
123 case Transaction::TRANSACTION_ERASE: ret.
add( strType, strTypeDel );
break;
124 case Transaction::TRANSACTION_INSTALL: ret.
add( strType, strTypeIns );
break;
125 case Transaction::TRANSACTION_MULTIINSTALL: ret.
add( strType, strTypeMul );
break;
130 case Transaction::STEP_TODO:
break;
131 case Transaction::STEP_DONE: ret.
add( strStage, strStageDone );
break;
132 case Transaction::STEP_ERROR: ret.
add( strStage, strStageFailed );
break;
141 ident = solv.ident();
148 ident = step_r.
ident();
150 arch = step_r.
arch();
155 { strSolvableV, ed.
version() },
156 { strSolvableR, ed.
release() },
160 s.add( strSolvableE, epoch );
162 ret.
add( strSolvable, s );
176 SolvIdentFile::Data getUserInstalledFromHistory(
const Pathname & historyFile_r )
178 SolvIdentFile::Data onSystemByUserList;
181 std::ifstream infile( historyFile_r.
c_str() );
184 const char * ch( (*in).c_str() );
186 if ( *ch <
'1' ||
'9' < *ch )
188 const char * sep1 = ::strchr( ch,
'|' );
193 bool installs =
true;
194 if ( ::strncmp( sep1,
"install|", 8 ) )
196 if ( ::strncmp( sep1,
"remove |", 8 ) )
203 const char * sep2 = ::strchr( sep1,
'|' );
204 if ( !sep2 || sep1 == sep2 )
206 (*in)[sep2-ch] =
'\0';
211 onSystemByUserList.erase( pkg );
215 if ( (sep1 = ::strchr( sep2+1,
'|' ))
216 && (sep1 = ::strchr( sep1+1,
'|' ))
217 && (sep2 = ::strchr( sep1+1,
'|' )) )
219 (*in)[sep2-ch] =
'\0';
220 if ( ::strchr( sep1+1,
'@' ) )
223 onSystemByUserList.insert( pkg );
228 MIL <<
"onSystemByUserList found: " << onSystemByUserList.size() << endl;
229 return onSystemByUserList;
240 {
"TransactionStepList", steps_r }
249 unsigned toKeep( ZConfig::instance().solver_upgradeTestcasesToKeep() );
250 MIL <<
"Testcases to keep: " << toKeep << endl;
253 Target_Ptr target( getZYpp()->getTarget() );
256 WAR <<
"No Target no Testcase!" << endl;
260 std::string stem(
"updateTestcase" );
261 Pathname dir( target->assertRootPrefix(
"/var/log/") );
262 Pathname next( dir / Date::now().
form( stem+
"-%Y-%m-%d-%H-%M-%S" ) );
265 std::list<std::string> content;
267 std::set<std::string> cases;
268 for_( c, content.begin(), content.end() )
273 if ( cases.size() >= toKeep )
275 unsigned toDel = cases.size() - toKeep + 1;
276 for_( c, cases.begin(), cases.end() )
285 MIL <<
"Write new testcase " << next << endl;
286 getZYpp()->resolver()->createSolverTestcase( next.asString(),
false );
303 std::pair<bool,PatchScriptReport::Action> doExecuteScript(
const Pathname & root_r,
307 MIL <<
"Execute script " <<
PathInfo(Pathname::assertprefix( root_r,script_r)) << endl;
313 for ( std::string output = prog.receiveLine(); output.length(); output = prog.receiveLine() )
316 if ( ! report_r->progress( PatchScriptReport::OUTPUT, output ) )
318 WAR <<
"User request to abort script " << script_r << endl;
325 std::pair<bool,PatchScriptReport::Action> ret( std::make_pair(
false, PatchScriptReport::ABORT ) );
327 if ( prog.close() != 0 )
329 ret.second = report_r->problem( prog.execError() );
330 WAR <<
"ACTION" << ret.second <<
"(" << prog.execError() <<
")" << endl;
331 std::ostringstream sstr;
332 sstr << script_r <<
_(
" execution failed") <<
" (" << prog.execError() <<
")" << endl;
333 historylog.
comment(sstr.str(),
true);
345 bool executeScript(
const Pathname & root_r,
349 std::pair<bool,PatchScriptReport::Action> action( std::make_pair(
false, PatchScriptReport::ABORT ) );
352 action = doExecuteScript( root_r, script_r, report_r );
356 switch ( action.second )
358 case PatchScriptReport::ABORT:
359 WAR <<
"User request to abort at script " << script_r << endl;
363 case PatchScriptReport::IGNORE:
364 WAR <<
"User request to skip script " << script_r << endl;
368 case PatchScriptReport::RETRY:
371 }
while ( action.second == PatchScriptReport::RETRY );
374 INT <<
"Abort on unknown ACTION request " << action.second <<
" returned" << endl;
383 bool RunUpdateScripts(
const Pathname & root_r,
385 const std::vector<sat::Solvable> & checkPackages_r,
388 if ( checkPackages_r.empty() )
391 MIL <<
"Looking for new update scripts in (" << root_r <<
")" << scriptsPath_r << endl;
392 Pathname scriptsDir( Pathname::assertprefix( root_r, scriptsPath_r ) );
393 if ( !
PathInfo( scriptsDir ).isDir() )
396 std::list<std::string> scripts;
398 if ( scripts.empty() )
406 std::map<std::string, Pathname> unify;
407 for_( it, checkPackages_r.begin(), checkPackages_r.end() )
409 std::string prefix(
str::form(
"%s-%s", it->name().c_str(), it->edition().c_str() ) );
410 for_( sit, scripts.begin(), scripts.end() )
415 if ( (*sit)[prefix.size()] !=
'\0' && (*sit)[prefix.size()] !=
'-' )
418 PathInfo script( scriptsDir / *sit );
419 Pathname localPath( scriptsPath_r/(*sit) );
420 std::string unifytag;
436 if ( unifytag.empty() )
440 if ( unify[unifytag].empty() )
442 unify[unifytag] = localPath;
449 std::string msg(
str::form(
_(
"%s already executed as %s)"), localPath.
asString().c_str(), unify[unifytag].c_str() ) );
450 MIL <<
"Skip update script: " << msg << endl;
455 if ( abort || aborting_r )
457 WAR <<
"Aborting: Skip update script " << *sit << endl;
459 localPath.
asString() +
_(
" execution skipped while aborting"),
464 MIL <<
"Found update script " << *sit << endl;
466 report->start( make<Package>( *it ), script.
path() );
468 if ( ! executeScript( root_r, localPath, report ) )
480 inline void copyTo( std::ostream & out_r,
const Pathname & file_r )
482 std::ifstream infile( file_r.
c_str() );
485 out_r << *in << endl;
489 inline std::string notificationCmdSubst(
const std::string & cmd_r,
const UpdateNotificationFile & notification_r )
491 std::string ret( cmd_r );
492 #define SUBST_IF(PAT,VAL) if ( ret.find( PAT ) != std::string::npos ) ret = str::gsub( ret, PAT, VAL ) 499 void sendNotification(
const Pathname & root_r,
502 if ( notifications_r.empty() )
505 std::string cmdspec( ZConfig::instance().updateMessagesNotify() );
506 MIL <<
"Notification command is '" << cmdspec <<
"'" << endl;
507 if ( cmdspec.empty() )
511 if ( pos == std::string::npos )
513 ERR <<
"Can't send Notification: Missing 'format |' in command spec." << endl;
519 std::string commandStr(
str::trim( cmdspec.substr( pos + 1 ) ) );
521 enum Format { UNKNOWN, NONE, SINGLE, DIGEST, BULK };
522 Format format = UNKNOWN;
523 if ( formatStr ==
"none" )
525 else if ( formatStr ==
"single" )
527 else if ( formatStr ==
"digest" )
529 else if ( formatStr ==
"bulk" )
533 ERR <<
"Can't send Notification: Unknown format '" << formatStr <<
" |' in command spec." << endl;
542 if ( format == NONE || format == SINGLE )
544 for_( it, notifications_r.begin(), notifications_r.end() )
546 std::vector<std::string> command;
547 if ( format == SINGLE )
548 command.push_back(
"<"+Pathname::assertprefix( root_r, it->file() ).
asString() );
549 str::splitEscaped( notificationCmdSubst( commandStr, *it ), std::back_inserter( command ) );
551 ExternalProgram prog( command, ExternalProgram::Stderr_To_Stdout,
false, -1,
true, root_r );
558 int ret = prog.
close();
561 ERR <<
"Notification command returned with error (" << ret <<
")." << endl;
568 else if ( format == DIGEST || format == BULK )
572 for_( it, notifications_r.begin(), notifications_r.end() )
574 if ( format == DIGEST )
576 out << it->file() << endl;
578 else if ( format == BULK )
580 copyTo( out <<
'\f', Pathname::assertprefix( root_r, it->file() ) );
584 std::vector<std::string> command;
586 str::splitEscaped( notificationCmdSubst( commandStr, *notifications_r.begin() ), std::back_inserter( command ) );
588 ExternalProgram prog( command, ExternalProgram::Stderr_To_Stdout,
false, -1,
true, root_r );
591 for( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() )
595 int ret = prog.close();
598 ERR <<
"Notification command returned with error (" << ret <<
")." << endl;
606 INT <<
"Can't send Notification: Missing handler for 'format |' in command spec." << endl;
618 void RunUpdateMessages(
const Pathname & root_r,
620 const std::vector<sat::Solvable> & checkPackages_r,
623 if ( checkPackages_r.empty() )
626 MIL <<
"Looking for new update messages in (" << root_r <<
")" << messagesPath_r << endl;
627 Pathname messagesDir( Pathname::assertprefix( root_r, messagesPath_r ) );
628 if ( !
PathInfo( messagesDir ).isDir() )
631 std::list<std::string> messages;
633 if ( messages.empty() )
640 for_( it, checkPackages_r.begin(), checkPackages_r.end() )
642 std::string prefix(
str::form(
"%s-%s", it->name().c_str(), it->edition().c_str() ) );
643 for_( sit, messages.begin(), messages.end() )
648 if ( (*sit)[prefix.size()] !=
'\0' && (*sit)[prefix.size()] !=
'-' )
651 PathInfo message( messagesDir / *sit );
652 if ( ! message.
isFile() || message.
size() == 0 )
655 MIL <<
"Found update message " << *sit << endl;
656 Pathname localPath( messagesPath_r/(*sit) );
658 historylog.
comment(
str::Str() <<
_(
"New update message") <<
" " << localPath,
true );
670 const std::vector<sat::Solvable> & checkPackages_r,
672 { RunUpdateMessages( root_r, messagesPath_r, checkPackages_r, result_r ); }
683 TargetImpl::TargetImpl(
const Pathname & root_r,
bool doRebuild_r )
685 , _requestedLocalesFile( home() /
"RequestedLocales" )
686 , _autoInstalledFile( home() /
"AutoInstalled" )
694 sigMultiversionSpecChanged();
695 MIL <<
"Initialized target on " <<
_root << endl;
703 std::ifstream uuidprovider(
"/proc/sys/kernel/random/uuid" );
713 boost::function<
bool ()> condition,
714 boost::function<
string ()> value )
716 string val = value();
724 MIL <<
"updating '" << filename <<
"' content." << endl;
728 std::ofstream filestr;
731 filestr.open( filename.
c_str() );
733 if ( filestr.good() )
767 WAR <<
"Can't create anonymous id file" << endl;
776 Pathname flavorpath(
home() /
"LastDistributionFlavor");
782 WAR <<
"No base product, I won't create flavor cache" << endl;
786 string flavor = p->flavor();
798 WAR <<
"Can't create flavor cache" << endl;
811 sigMultiversionSpecChanged();
812 MIL <<
"Targets closed" << endl;
836 Pathname rpmsolvcookie = base/
"cookie";
838 bool build_rpm_solv =
true;
848 MIL <<
"Read cookie: " << cookie << endl;
853 if ( status == rpmstatus )
854 build_rpm_solv =
false;
855 MIL <<
"Read cookie: " << rpmsolvcookie <<
" says: " 856 << (build_rpm_solv ?
"outdated" :
"uptodate") << endl;
860 if ( build_rpm_solv )
874 bool switchingToTmpSolvfile =
false;
875 Exception ex(
"Failed to cache rpm database.");
881 rpmsolv = base/
"solv";
882 rpmsolvcookie = base/
"cookie";
889 WAR <<
"Using a temporary solv file at " << base << endl;
890 switchingToTmpSolvfile =
true;
899 if ( ! switchingToTmpSolvfile )
909 cmd.push_back(
"rpmdb2solv" );
911 cmd.push_back(
"-r" );
914 cmd.push_back(
"-X" );
915 cmd.push_back(
"-A" );
916 cmd.push_back(
"-p" );
919 if ( ! oldSolvFile.
empty() )
920 cmd.push_back( oldSolvFile.
asString() );
922 cmd.push_back(
"-o" );
926 std::string errdetail;
929 WAR <<
" " << output;
930 if ( errdetail.empty() ) {
937 int ret = prog.
close();
969 if ( !
PathInfo(base/
"solv.idx").isExist() )
972 return build_rpm_solv;
990 MIL <<
"New cache built: " << (newCache?
"true":
"false") <<
991 ", force loading: " << (force?
"true":
"false") << endl;
996 MIL <<
"adding " << rpmsolv <<
" to pool(" << satpool.
systemRepoAlias() <<
")" << endl;
1003 if ( newCache || force )
1020 MIL <<
"adding " << rpmsolv <<
" to system" << endl;
1026 MIL <<
"Try to handle exception by rebuilding the solv-file" << endl;
1051 if (
PathInfo( historyFile ).isExist() )
1058 if ( onSystemByUser.find( ident ) == onSystemByUser.end() )
1059 onSystemByAuto.insert( ident );
1075 if ( ! hardLocks.empty() )
1084 MIL <<
"Target loaded: " << system.
solvablesSize() <<
" resolvables" << endl;
1103 if (
root() ==
"/" )
1113 MIL <<
"TargetImpl::commit(<pool>, " << policy_r <<
")" << endl;
1132 steps.push_back( *it );
1139 MIL <<
"Todo: " << result << endl;
1149 if ( commitPlugins )
1150 commitPlugins.
send( transactionPluginFrame(
"COMMITBEGIN", steps ) );
1157 if ( ! policy_r.
dryRun() )
1163 DBG <<
"dryRun: Not writing upgrade testcase." << endl;
1170 if ( ! policy_r.
dryRun() )
1192 DBG <<
"dryRun: Not stroring non-package data." << endl;
1199 if ( ! policy_r.
dryRun() )
1201 for_( it, steps.begin(), steps.end() )
1203 if ( ! it->satSolvable().isKind<
Patch>() )
1211 if ( ! patch ||patch->message().empty() )
1214 MIL <<
"Show message for " << patch << endl;
1216 if ( ! report->show( patch ) )
1218 WAR <<
"commit aborted by the user" << endl;
1225 DBG <<
"dryRun: Not checking patch messages." << endl;
1244 for_( it, steps.begin(), steps.end() )
1246 switch ( it->stepType() )
1268 localfile = packageCache.
get( pi );
1278 INT <<
"Don't know howto cache: Neither Package nor SrcPackage: " << pi << endl;
1283 catch (
const AbortRequestException & exp )
1287 WAR <<
"commit cache preload aborted by the user" << endl;
1291 catch (
const SkipRequestException & exp )
1296 WAR <<
"Skipping cache preload package " << pi->asKind<
Package>() <<
" in commit" << endl;
1306 INT <<
"Unexpected Error: Skipping cache preload package " << pi->asKind<
Package>() <<
" in commit" << endl;
1316 ERR <<
"Some packages could not be provided. Aborting commit."<< endl;
1320 if ( ! policy_r.
dryRun() )
1324 commit( policy_r, packageCache, result );
1328 DBG <<
"dryRun/downloadOnly: Not installing/deleting anything." << endl;
1334 DBG <<
"dryRun: Not downloading/installing/deleting anything." << endl;
1340 if ( commitPlugins )
1341 commitPlugins.
send( transactionPluginFrame(
"COMMITEND", steps ) );
1346 if ( ! policy_r.
dryRun() )
1351 MIL <<
"TargetImpl::commit(<pool>, " << policy_r <<
") returns: " << result << endl;
1362 struct NotifyAttemptToModify
1380 MIL <<
"TargetImpl::commit(<list>" << policy_r <<
")" << steps.size() << endl;
1385 NotifyAttemptToModify attemptToModify( result_r );
1390 std::vector<sat::Solvable> successfullyInstalledPackages;
1393 for_( step, steps.begin(), steps.end() )
1415 localfile = packageCache_r.
get( citem );
1417 catch (
const AbortRequestException &e )
1419 WAR <<
"commit aborted by the user" << endl;
1424 catch (
const SkipRequestException &e )
1427 WAR <<
"Skipping package " << p <<
" in commit" << endl;
1436 INT <<
"Unexpected Error: Skipping package " << p <<
" in commit" << endl;
1441 #warning Exception handling 1446 bool success =
false;
1472 if ( progress.aborted() )
1474 WAR <<
"commit aborted by the user" << endl;
1493 WAR <<
"dry run failed" << endl;
1498 if ( progress.aborted() )
1500 WAR <<
"commit aborted by the user" << endl;
1505 WAR <<
"Install failed" << endl;
1511 if ( success && !policy_r.
dryRun() )
1514 successfullyInstalledPackages.push_back( citem.
satSolvable() );
1523 bool success =
false;
1534 if ( progress.aborted() )
1536 WAR <<
"commit aborted by the user" << endl;
1550 if ( progress.aborted() )
1552 WAR <<
"commit aborted by the user" << endl;
1558 WAR <<
"removal of " << p <<
" failed";
1561 if ( success && !policy_r.
dryRun() )
1568 else if ( ! policy_r.
dryRun() )
1572 if ( ! citem.
buddy() )
1579 ERR <<
"Can't install orphan product without release-package! " << citem << endl;
1585 std::string referenceFilename( p->referenceFilename() );
1586 if ( referenceFilename.empty() )
1588 ERR <<
"Can't remove orphan product without 'referenceFilename'! " << citem << endl;
1595 ERR <<
"Delete orphan product failed: " << referenceFile << endl;
1623 if ( ! successfullyInstalledPackages.empty() )
1626 successfullyInstalledPackages, abort ) )
1628 WAR <<
"Commit aborted by the user" << endl;
1634 successfullyInstalledPackages,
1670 if ( baseproduct.
isFile() )
1683 ERR <<
"baseproduct symlink is dangling or missing: " << baseproduct << endl;
1690 if ( root_r.
empty() )
1701 inline std::string firstNonEmptyLineIn(
const Pathname & file_r )
1703 std::ifstream idfile( file_r.
c_str() );
1707 if ( ! line.empty() )
1710 return std::string();
1721 if ( p->isTargetDistribution() )
1729 const Pathname needroot( staticGuessRoot(root_r) );
1730 const Target_constPtr target( getZYpp()->getTarget() );
1731 if ( target && target->root() == needroot )
1732 return target->requestedLocales();
1737 {
return baseproductdata(
_root ).registerTarget(); }
1740 {
return baseproductdata( staticGuessRoot(root_r) ).registerTarget(); }
1743 {
return baseproductdata(
_root ).registerRelease(); }
1746 {
return baseproductdata( staticGuessRoot(root_r) ).registerRelease();}
1749 {
return baseproductdata(
_root ).registerFlavor(); }
1752 {
return baseproductdata( staticGuessRoot(root_r) ).registerFlavor();}
1785 std::string
distributionVersion = baseproductdata( staticGuessRoot(root_r) ).edition().version();
1786 if ( distributionVersion.empty() )
1792 scoped_ptr<rpm::RpmDb> tmprpmdb;
1798 tmprpmdb->initDatabase( );
1807 distributionVersion = it->tag_version();
1815 return firstNonEmptyLineIn(
home() /
"LastDistributionFlavor" );
1820 return firstNonEmptyLineIn( staticGuessRoot(root_r) /
"/var/lib/zypp/LastDistributionFlavor" );
1827 return firstNonEmptyLineIn(
home() /
"AnonymousUniqueId" );
1832 return firstNonEmptyLineIn( staticGuessRoot(root_r) /
"/var/lib/zypp/AnonymousUniqueId" );
static bool fileMissing(const Pathname &pathname)
helper functor
std::string asJSON() const
JSON representation.
ZYppCommitResult commit(ResPool pool_r, const ZYppCommitPolicy &policy_r)
Commit changes in the pool.
int assert_dir(const Pathname &path, unsigned mode)
Like 'mkdir -p'.
Interface to the rpm program.
sat::Transaction getTransaction()
Return the Transaction computed by the last solver run.
bool upgradingRepos() const
Whether there is at least one UpgradeRepo request pending.
A Solvable object within the sat Pool.
const std::string & command() const
The command we're executing.
std::vector< sat::Transaction::Step > TransactionStepList
Save and restore locale set from file.
Alternating download and install.
ZYppCommitPolicy & rpmNoSignature(bool yesNo_r)
Use rpm option –nosignature (default: false)
const LocaleSet & getRequestedLocales() const
Return the requested locales.
ManagedFile provideSrcPackage(const SrcPackage_constPtr &srcPackage_r) const
Provide SrcPackage in a local file.
[M] Install(multiversion) item (
unsigned splitEscaped(const C_Str &line_r, TOutputIterator result_r, const C_Str &sepchars_r=" \, bool withEmpty=false)
Split line_r into words with respect to escape delimeters.
bool solvfilesPathIsTemp() const
Whether we're using a temp.
const Pathname & path() const
Return current Pathname.
std::string asString(const DefaultIntegral< Tp, TInitial > &obj)
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
bool next()
Advance to next line.
Solvable satSolvable() const
Return the corresponding Solvable.
Result returned from ZYpp::commit.
static ZConfig & instance()
Singleton ctor.
bool isToBeInstalled() const
void addSolv(const Pathname &file_r)
Load Solvables from a solv-file.
std::string md5sum(const Pathname &file)
Compute a files md5sum.
Command frame for communication with PluginScript.
Pathname _tmpSolvfilesPath
bool findByProvides(const std::string &tag_r)
Reset to iterate all packages that provide a certain tag.
int readlink(const Pathname &symlink_r, Pathname &target_r)
Like 'readlink'.
void setData(const Data &data_r)
Store new Data.
SolvIdentFile _autoInstalledFile
user/auto installed database
detail::IdType value_type
static ProductFileData scanFile(const Pathname &file_r)
Parse one file (or symlink) and return the ProductFileData parsed.
void updateFileContent(const Pathname &filename, boost::function< bool()> condition, boost::function< string()> value)
updates the content of filename if condition is true, setting the content the the value returned by v...
void stampCommand()
Log info about the current process.
Target::commit helper optimizing package provision.
ZYppCommitPolicy & rpmInstFlags(target::rpm::RpmInstFlags newFlags_r)
The default target::rpm::RpmInstFlags.
TransactionStepList & rTransactionStepList()
Manipulate transactionStepList.
const sat::Transaction & transaction() const
The full transaction list.
void discardScripts()
Discard all remembered scrips.
StepStage stepStage() const
Step action result.
const Pathname & file() const
Return the file path.
int chmod(const Pathname &path, mode_t mode)
Like 'chmod'.
ResStatus & status() const
Returns the current status.
void installPackage(const Pathname &filename, RpmInstFlags flags=RPMINST_NONE)
install rpm package
ZYppCommitPolicy & dryRun(bool yesNo_r)
Set dry run (default: false).
byKind_iterator byKindBegin(const ResKind &kind_r) const
#define N_(MSG)
Just tag text for translation.
ZYppCommitPolicy & rpmExcludeDocs(bool yesNo_r)
Use rpm option –excludedocs (default: false)
const char * c_str() const
String representation.
Date timestamp() const
timestamp of the rpm database (last modification)
std::string _distributionVersion
Cache distributionVersion.
void commitFindFileConflicts(const ZYppCommitPolicy &policy_r, ZYppCommitResult &result_r)
Commit helper checking for file conflicts after download.
Parallel execution of stateful PluginScripts.
void setData(const Data &data_r)
Store new Data.
void setAutoInstalled(const Queue &autoInstalled_r)
Set ident list of all autoinstalled solvables.
sat::Solvable buddy() const
Return the buddy we share our status object with.
Access to the sat-pools string space.
Libsolv transaction wrapper.
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
Edition represents [epoch:]version[-release]
Simple lineparser: Traverse each line in a file.
bool resetTransact(TransactByValue causer_r)
Not the same as setTransact( false ).
Similar to DownloadInAdvance, but try to split the transaction into heaps, where at the end of each h...
bool providesFile(const std::string &path_str, const std::string &name_str) const
If the package is installed and provides the file Needed to evaluate split provides during Resolver::...
TraitsType::constPtrType constPtr
const_iterator end() const
Iterator behind the last TransactionStep.
Provide a new empty temporary file and delete it when no longer needed.
unsigned epoch_t
Type of an epoch.
void writeUpgradeTestcase()
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
static RepoStatus fromCookieFile(const Pathname &path)
Reads the status from a cookie file.
Class representing a patch.
void installSrcPackage(const SrcPackage_constPtr &srcPackage_r)
Install a source package on the Target.
std::string targetDistributionFlavor() const
This is register.flavor attribute of the installed base product.
void install(const PoolItem &pi)
Log installation (or update) of a package.
ResObject::constPtr resolvable() const
Returns the ResObject::constPtr.
std::vector< std::string > Arguments
std::string targetDistributionRelease() const
This is register.release attribute of the installed base product.
Extract and remember posttrans scripts for later execution.
Subclass to retrieve database content.
void remember(const Exception &old_r)
Store an other Exception as history.
rpm::RpmDb _rpm
RPM database.
Repository systemRepo()
Return the system repository, create it if missing.
std::string distributionVersion() const
This is version attribute of the installed base product.
const LocaleSet & locales() const
Return the loacale set.
void createLastDistributionFlavorCache() const
generates a cache of the last product flavor
void initRequestedLocales(const LocaleSet &locales_r)
Start tracking changes based on this locales_r.
void saveToCookieFile(const Pathname &path_r) const
Save the status information to a cookie file.
StringQueue autoInstalled() const
Return the ident strings of all packages that would be auto-installed after the transaction is run...
LocaleSet requestedLocales() const
Languages to be supported by the system.
[ ] Nothing (includes implicit deletes due to obsoletes and non-package actions)
bool empty() const
Test for an empty path.
int addmod(const Pathname &path, mode_t mode)
Add the mode bits to the file given by path.
void push(value_type val_r)
Push a value to the end off the Queue.
std::string getline(std::istream &str)
Read one line from stream.
Store and operate on date (time_t).
SolvableIterator solvablesEnd() const
Iterator behind the last Solvable.
Base class for concrete Target implementations.
std::string shortName() const
static Pool instance()
Singleton ctor.
const Data & data() const
Return the data.
std::string version() const
Version.
Pathname _root
Path to the target.
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
Execute a program and give access to its io An object of this class encapsulates the execution of an ...
std::string trim(const std::string &s, const Trim trim_r)
int unlink(const Pathname &path)
Like 'unlink'.
static const std::string & systemRepoAlias()
Reserved system repository alias .
bool collectScriptFromPackage(ManagedFile rpmPackage_r)
Extract and remember a packages posttrans script for later execution.
static const Pathname & fname()
Get the current log file path.
const std::string & asString() const
String representation.
void send(const PluginFrame &frame_r)
Send PluginFrame to all open plugins.
int rename(const Pathname &oldpath, const Pathname &newpath)
Like 'rename'.
Just download all packages to the local cache.
Options and policies for ZYpp::commit.
bool isExist() const
Return whether valid stat info exists.
libzypp will decide what to do.
A single step within a Transaction.
ZYppCommitPolicy & downloadMode(DownloadMode val_r)
Commit download policy to use.
RequestedLocalesFile _requestedLocalesFile
Requested Locales database.
void setLocales(const LocaleSet &locales_r)
Store a new locale set.
Pathname rootDir() const
Get rootdir (for file conflicts check)
void getHardLockQueries(HardLockQueries &activeLocks_r)
Suggest a new set of queries based on the current selection.
Pathname dirname() const
Return all but the last component od this path.
static Pathname assertprefix(const Pathname &root_r, const Pathname &path_r)
Return path_r prefixed with root_r, unless it is already prefixed.
int recursive_rmdir(const Pathname &path)
Like 'rm -r DIR'.
std::string release() const
Release.
Interim helper class to collect global options and settings.
SolvableIterator solvablesBegin() const
Iterator to the first Solvable.
bool startsWith(const C_Str &str_r, const C_Str &prefix_r)
alias for hasPrefix
std::string summary() const
bool order()
Order transaction steps for commit.
Pathname solvfilesPath() const
The solv file location actually in use (default or temp).
void updateSolvFileIndex(const Pathname &solvfile_r)
Create solv file content digest for zypper bash completion.
std::string targetDistribution() const
This is register.target attribute of the installed base product.
Resolver & resolver() const
The Resolver.
Writing the zypp history fileReference counted signleton for writhing the zypp history file...
TraitsType::constPtrType constPtr
std::string asString() const
String representation "ident-edition.arch" or "noSolvable".
std::string receiveLine()
Read one line from the input stream.
void closeDatabase()
Block further access to the rpm database and go back to uninitialized state.
Date timestamp() const
return the last modification date of the target
ZYppCommitPolicy & restrictToMedia(unsigned mediaNr_r)
Restrict commit to media 1.
std::list< PoolItem > PoolItemList
list of pool items
UpdateNotifications & rUpdateMessages()
Manipulate updateMessages Pathnames are relative to the targets root directory.
std::string anonymousUniqueId() const
anonymous unique id
std::string toLower(const std::string &s)
Return lowercase version of s.
Pathname home() const
The directory to store things.
static std::string generateRandomId()
generates a random id using uuidgen
void resetDispose()
Set no dispose function.
ManagedFile get(const PoolItem &citem_r)
Provide a package.
HardLocksFile _hardLocksFile
Hard-Locks database.
static void setRoot(const Pathname &root)
Set new root directory to the default history log file path.
int close()
Wait for the progamm to complete.
byKind_iterator byKindEnd(const ResKind &kind_r) const
void setHardLockQueries(const HardLockQueries &newLocks_r)
Set a new set of queries.
#define SUBST_IF(PAT, VAL)
std::list< UpdateNotificationFile > UpdateNotifications
Libsolv Id queue wrapper.
#define ZYPP_CAUGHT(EXCPT)
Drops a logline telling the Exception was caught (in order to handle it).
int readdir(std::list< std::string > &retlist_r, const Pathname &path_r, bool dots_r)
Return content of directory via retlist.
Product::constPtr baseProduct() const
returns the target base installed product, also known as the distribution or platform.
void createAnonymousId() const
generates the unique anonymous id which is called when creating the target
ZYppCommitPolicy & allMedia()
Process all media (default)
const_iterator begin() const
Iterator to the first TransactionStep.
pool::PoolTraits::HardLockQueries Data
void add(const Value &val_r)
Push JSON Value to Array.
StepType stepType() const
Type of action to perform in this step.
const Data & data() const
Return the data.
Base class for Exception.
bool preloaded() const
Whether preloaded hint is set.
const Pathname & file() const
void load(const Pathname &path_r)
Find and launch plugins sending PLUGINBEGIN.
Data returned by ProductFileReader.
std::string asJSON() const
JSON representation.
void remove(const PoolItem &pi)
Log removal of a package.
void initDatabase(Pathname root_r=Pathname(), Pathname dbPath_r=Pathname(), bool doRebuild_r=false)
Prepare access to the rpm database.
void removePackage(const std::string &name_r, RpmInstFlags flags=RPMINST_NONE)
remove rpm package
sat::Solvable solvable() const
epoch_t epoch() const
Epoch.
std::string distroverpkg() const
Package telling the "product version" on systems not using /etc/product.d/baseproduct.
Pathname root() const
The root set for this target.
virtual ~TargetImpl()
Dtor.
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
void eraseFromPool()
Remove this Repository from it's Pool.
bool hasFile(const std::string &file_r, const std::string &name_r="") const
Return true if at least one package owns a certain file (name_r empty) Return true if package name_r ...
void comment(const std::string &comment, bool timestamp=false)
Log a comment (even multiline).
TraitsType::constPtrType constPtr
Wrapper class for ::stat/::lstat.
bool solvablesEmpty() const
Whether Repository contains solvables.
ResObject::Ptr makeResObject(const sat::Solvable &solvable_r)
Create ResObject from sat::Solvable.
sat::Transaction & rTransaction()
Manipulate transaction.
const UpdateNotifications & updateMessages() const
List of update messages installed during this commit.
Combining sat::Solvable and ResStatus.
void executeScripts()
Execute te remembered scripts.
Pathname systemRoot() const
The target root directory.
ManagedFile provideSrcPackage(const SrcPackage_constPtr &srcPackage_r)
Provides a source package on the Target.
static TmpFile makeSibling(const Pathname &sibling_r)
Provide a new empty temporary directory as sibling.
Target::DistributionLabel distributionLabel() const
This is shortName and summary attribute of the installed base product.
Track changing files or directories.
std::string asString() const
Conversion to std::string
bool isKind(const ResKind &kind_r) const
std::string toJSON(const sat::Transaction::Step &step_r)
See COMMITBEGIN (added in v1) on page Commit plugin for the specs.
const std::string & asString() const
void XRunUpdateMessages(const Pathname &root_r, const Pathname &messagesPath_r, const std::vector< sat::Solvable > &checkPackages_r, ZYppCommitResult &result_r)
std::string distributionFlavor() const
This is flavor attribute of the installed base product but does not require the target to be loaded a...
size_type solvablesSize() const
Number of solvables in Repository.
Easy-to use interface to the ZYPP dependency resolver.
std::unordered_set< IdString > Data
Pathname defaultSolvfilesPath() const
The systems default solv file location.
Pair of sat::Solvable and Pathname.
Solvable satSolvable() const
Return the corresponding sat::Solvable.
void add(const String &key_r, const Value &val_r)
Add key/value pair.
bool hasPrefix(const C_Str &str_r, const C_Str &prefix_r)
Return whether str_r has prefix prefix_r.
void setCommitList(std::vector< sat::Solvable > commitList_r)
Download(commit) sequence of solvables to compute read ahead.
std::unordered_set< Locale > LocaleSet
rpm::RpmDb & rpm()
The RPM database.
TraitsType::constPtrType constPtr
#define IMPL_PTR_TYPE(NAME)
ZYppCommitResult & _result
static ResPool instance()
Singleton ctor.
void load(bool force=true)