void RpmTransaction::process(const StringVector& install, const StringVector& remove, const StringVector& upgrade) { int rc = 0; int probFilter = 0; int notifyFlags = 0; int tsFlags = 0; rpmProblemSet probs; if (!upgrade.empty()) probFilter |= RPMPROB_FILTER_OLDPACKAGE; // probFilter |= RPMPROB_FILTER_REPLACEPKG//reinstall;; // probFilter |= RPMPROB_FILTER_REPLACEOLDFILES; // probFilter |= RPMPROB_FILTER_REPLACENEWFILES; notifyFlags |= INSTALL_LABEL | INSTALL_HASH; if (!remove.empty()) addToTransactionRemove(remove); if (!install.empty()) addToTransactionInstall(install); if (!upgrade.empty()) addToTransactionUpgrade(upgrade); rpmDependencyConflict conflicts = NULL; int numConflicts; if (rpmdepCheck(m_ts, &conflicts, &numConflicts) || conflicts) { std::cerr << "Conflicts found!!" << std::endl; if (conflicts) { printDepProblems(stderr, conflicts, numConflicts); rpmdepFreeConflicts(conflicts, numConflicts); } exit(EXIT_FAILURE); } rc = rpmdepOrder(m_ts); if (rc > 0) { std::cerr << "Ordering failed" << std::endl; return; } rc = rpmRunTransactions(m_ts, rpmShowProgress, (void *)notifyFlags, NULL, &probs, (rpmtransFlags)tsFlags, (rpmprobFilterFlags)probFilter); if (rc > 0) { std::cerr << "Error while running transaction" << std::endl; // if (probs->numProblems > 0) // rpmpsPrint(stderr, probs); } else { if (rc < 0) std::cerr << "warning:some errors occurred while running transaction" << std::endl; } std::cout << "Done." << std::endl; // rpmpsFree(probs); }
/* * To determine the processing order. */ VALUE rpm_transaction_order(VALUE trans) { #if RPM_VERSION_CODE < RPM_VERSION(4,1,0) rpmdepOrder(RPM_TRANSACTION(trans)); #else rpmtsOrder(RPM_TRANSACTION(trans)); #endif return Qnil; }