/** * Check installed package dependencies for problems. * @param ts transaction set * @param h header * @return number of problems found (0 for no problems) */ static int verifyDependencies(rpmts ts, Header h) { rpmps ps; rpmte te; int rc; rpmtsEmpty(ts); (void) rpmtsAddInstallElement(ts, h, NULL, 0, NULL); (void) rpmtsCheck(ts); te = rpmtsElement(ts, 0); ps = rpmteProblems(te); rc = rpmpsNumProblems(ps); if (rc > 0) { rpmlog(RPMLOG_NOTICE, _("Unsatisfied dependencies for %s:\n"), rpmteNEVRA(te)); rpmpsi psi = rpmpsInitIterator(ps); rpmProblem p; while ((p = rpmpsiNext(psi)) != NULL) { char * ps = rpmProblemString(p); rpmlog(RPMLOG_NOTICE, "\t%s\n", ps); free(ps); } rpmpsFreeIterator(psi); } rpmpsFree(ps); rpmtsEmpty(ts); return rc; }
static PyObject *rpmprob_str(rpmProblemObject *s) { char *str = rpmProblemString(s->prob); PyObject *res = Py_BuildValue("s", str); free(str); return res; }
/** * Check installed package dependencies for problems. * @param qva parsed query/verify options * @param ts transaction set * @param h header * @return number of problems found (0 for no problems) */ static int verifyDependencies(QVA_t qva, rpmts ts, Header h) { rpmps ps; rpmpsi psi; int rc = 0; /* assume no problems */ int xx; rpmtsEmpty(ts); (void) rpmtsAddInstallElement(ts, h, NULL, 0, NULL); xx = rpmtsCheck(ts); ps = rpmtsProblems(ts); psi = rpmpsInitIterator(ps); if (rpmpsNumProblems(ps) > 0) { char *nevra = headerGetNEVRA(h, NULL); rpmlog(RPMLOG_NOTICE, _("Unsatisfied dependencies for %s:\n"), nevra); free(nevra); while (rpmpsNextIterator(psi) >= 0) { rpmProblem p = rpmpsGetProblem(psi); char * ps = rpmProblemString(p); rpmlog(RPMLOG_NOTICE, "\t%s\n", ps); free(ps); rc++; } } psi = rpmpsFreeIterator(psi); ps = rpmpsFree(ps); rpmtsEmpty(ts); return rc; }
void rpmpsPrint(FILE *fp, rpmps ps) { rpmProblem p; rpmpsi psi = rpmpsInitIterator(ps); FILE *f = (fp != NULL) ? fp : stderr; while ((p = rpmpsiNext(psi))) { char *msg = rpmProblemString(p); fprintf(f, "\t%s\n", msg); free(msg); } rpmpsFreeIterator(psi); }
void rpmpsPrint(FILE *fp, rpmps ps) { char * msg = NULL; rpmpsi psi = NULL; int i; if (ps == NULL || ps->probs == NULL || ps->numProblems <= 0) return; if (fp == NULL) fp = stderr; psi = rpmpsInitIterator(ps); while ((i = rpmpsNextIterator(psi)) >= 0) { int j; rpmProblem p = rpmpsGetProblem(psi); if (p->ignoreProblem) continue; rpmpsi psif = rpmpsInitIterator(ps); /* Filter already displayed problems. */ while ((j = rpmpsNextIterator(psif)) < i) { if (!sameProblem(p, rpmpsGetProblem(psif))) break; } rpmpsFreeIterator(psif); if (j < i) continue; msg = rpmProblemString(p); fprintf(fp, "\t%s\n", msg); msg = _free(msg); } psi = rpmpsFreeIterator(psi); }
/* * Performs the transaction. * @param [Number] flag Transaction flags, default +RPM::TRANS_FLAG_NONE+ * @param [Number] filter Transaction filter, default +RPM::PROB_FILTER_NONE+ * @example * transaction.commit do |sig| * end * @yield [CallbackData] sig Transaction progress */ VALUE rpm_transaction_commit(int argc, VALUE* argv, VALUE trans) { #if RPM_VERSION_CODE < RPM_VERSION(4,1,0) rpmProblemSet probset; int flags = RPMTRANS_FLAG_NONE; int ignores = RPMPROB_FILTER_NONE; int rc; VALUE db; db = rb_ivar_get(trans, id_db); if (OBJ_FROZEN(db)) { rb_error_frozen("RPM::DB"); } switch (argc) { case 0: break; case 1: case 2: flags = NUM2INT(rb_Integer(argv[0])); if (argc == 2) { ignores = NUM2INT(rb_Integer(argv[1])); } break; default: rb_raise(rb_eArgError, "too many arguments(0..2)"); } if (rb_block_given_p() == Qtrue) rc = rpmRunTransactions(RPM_TRANSACTION(trans), transaction_callback, (void*)trans, NULL, &probset, flags, ignores); else{ VALUE keys; /* rpmcli.h:extern int packagesTotal; */ packagesTotal = 0; keys = rpm_transaction_keys(trans); if (!NIL_P(keys)) packagesTotal = NUM2INT(rb_funcall(keys,rb_intern("length"),0)); rc = rpmRunTransactions(RPM_TRANSACTION(trans), rpmShowProgress, (void*)((long)(INSTALL_HASH|INSTALL_LABEL)), NULL, &probset, flags, ignores); } if (probset != NULL) { VALUE list = rb_ary_new(); register int i; for (i = 0; i < probset->numProblems; i++) { rpmProblem prob = probset->probs + i; VALUE prb = rb_struct_new(rpm_sProblem, INT2NUM(prob->type), (VALUE)prob->key, rpm_package_new_from_header(prob->h), rb_str_new2(rpmProblemString(prob))); rb_ary_push(list, prb); } rb_ivar_set(trans, id_pl, list); } #else rpmps ps; int flags = RPMTRANS_FLAG_NONE; int ignores = RPMPROB_FILTER_NONE; int rc; VALUE db; db = rb_ivar_get(trans, id_db); if (OBJ_FROZEN(db)) { rb_error_frozen("RPM::DB"); } switch (argc) { case 0: break; case 1: case 2: flags = NUM2INT(rb_Integer(argv[0])); if (argc == 2) { ignores = NUM2INT(rb_Integer(argv[1])); } break; default: rb_raise(rb_eArgError, "too many arguments(0..2)"); } /* Drop added/available package indices and dependency sets. */ //rpmtsClean(RPM_TRANSACTION(trans)); // zaki: required? if (rb_block_given_p() == Qtrue) { rpmtsSetNotifyCallback(RPM_TRANSACTION(trans), (rpmCallbackFunction)transaction_callback,(void *)trans); }else{ VALUE keys; /* rpmcli.h:extern int rpmcliPackagesTotal; */ rpmcliPackagesTotal = 0; keys = rpm_transaction_keys(trans); if (!NIL_P(keys)) rpmcliPackagesTotal = NUM2INT(rb_funcall(keys,rb_intern("length"),0)); rpmtsSetNotifyCallback(RPM_TRANSACTION(trans), rpmShowProgress, (void*)((long)(INSTALL_HASH|INSTALL_LABEL))); } rc = rpmtsRun(RPM_TRANSACTION(trans), NULL, ignores); ps = rpmtsProblems(RPM_TRANSACTION(trans)); { VALUE list = rb_ary_new(); #ifdef RPMPS_OPAQUE rpmpsi psi = rpmpsInitIterator(ps); while (rpmpsNextIterator(psi) >= 0) { rpmProblem p = rpmpsGetProblem(psi); VALUE prb = rb_struct_new(rpm_sProblem, INT2NUM(rpmProblemGetType(p)), (VALUE)rpmProblemGetKey(p), package_new_from_NEVR( rpmProblemGetAltNEVR(p)+2 ), rb_str_new2(rpmProblemString(p))); rb_ary_push(list, prb); } #else if (ps != NULL && rpmpsNumProblems(ps) > 0) { register int i; for (i = 0; i < rpmpsNumProblems(ps); i++) { rpmProblem p = ps->probs + i; const char *altNEVR = (p->altNEVR ? p->altNEVR : "? ?altNEVR?"); VALUE prb = rb_struct_new(rpm_sProblem, INT2NUM(p->type), (VALUE)p->key, package_new_from_NEVR(altNEVR+2), rb_str_new2(rpmProblemString(p))); rb_ary_push(list, prb); } } #endif rb_ivar_set(trans, id_pl, list); } if (ps) ps = rpmpsFree(ps); #endif rb_ivar_set(trans, id_commited, Qtrue); rb_throw("abort", Qnil); return Qnil; /* NOT REACHED */ }