From b0cd1853933d8c68610c9e173721525c6a17e8ce Mon Sep 17 00:00:00 2001 From: Thierry Vignaud Date: Mon, 23 Feb 2015 10:58:56 +0100 Subject: callbacks now get pkg name instead of just pkg id thus fixing unknown package name on erases (mga#15032) --- NEWS | 3 +++ URPM.pm | 6 +++--- URPM.xs | 8 ++++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index cf0aaa2..c6fe11c 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,6 @@ +- callbacks now get pkg name instead of just pkg id + thus fixing unknown package name on erases (mga#15032) + Version 5.03 - 14 November 2014 - add a missing PUTBACK in traverse_tag_find() diff --git a/URPM.pm b/URPM.pm index 2ed0572..2236551 100644 --- a/URPM.pm +++ b/URPM.pm @@ -885,13 +885,13 @@ Recognized options are: They roughly correspond to command-line options to rpm(1). -'callback_open' signature is (C<$data>, C<$cb_type>, C<$pkg_id>). It _must_ return a file handler for the asked package. +'callback_open' signature is (C<$data>, C<$cb_type>, C<$pkg_id>, C). It _must_ return a file handler for the asked package. -'callback_close' signature is (C<$data>, C<$cb_type>, C<$pkg_id>). It is called just before URPM close the fd for the installed package. +'callback_close' signature is (C<$data>, C<$cb_type>, C<$pkg_id>, C). It is called just before URPM close the fd for the installed package. C<$cb_type> is one of 'open' or 'close'. -Other Callbacks signature is callback(C<$data>, C<$cb_type>, C<$pkg_id>, C<$subtype>, C<$amout>, C<$total>) +Other Callbacks signature is callback(C<$data>, C<$cb_type>, C<$pkg_id>, C<$subtype>, C<$amout>, C<$total>, C) C<$cb_type> is one of 'error', 'inst', 'trans' or 'uninst'. C<$subtype> can be 'start', 'progress' or 'stop'. For 'error', it can be 'cpio', 'script' or 'unpack'. diff --git a/URPM.xs b/URPM.xs index 14327e8..f4ac459 100644 --- a/URPM.xs +++ b/URPM.xs @@ -1199,7 +1199,7 @@ ts_nosignature(rpmts ts) { return rpmtsSetVSFlags(ts, _RPMVSF_NODIGESTS | _RPMVSF_NOSIGNATURES); } -static void *rpmRunTransactions_callback(__attribute__((unused)) const void *h, +static void *rpmRunTransactions_callback(const void *arg, const rpmCallbackType what, const rpm_loff_t amount, const rpm_loff_t total, @@ -1214,6 +1214,7 @@ static void *rpmRunTransactions_callback(__attribute__((unused)) const void *h, SV *callback = NULL; char *callback_type = NULL; char *callback_subtype = NULL; + Header h = (Header) arg; if (!td) return NULL; @@ -1303,7 +1304,7 @@ static void *rpmRunTransactions_callback(__attribute__((unused)) const void *h, ENTER; SAVETMPS; PUSHMARK(SP); - EXTEND(SP, callback_subtype == NULL ? 2 : 5); + EXTEND(SP, callback_subtype == NULL ? 3 : 6); PUSHs(td->data); mPUSHs(newSVpv(callback_type, 0)); PUSHs(pkgKey != NULL ? sv_2mortal(newSViv((long)pkgKey - 1)) : &PL_sv_undef); @@ -1312,6 +1313,9 @@ static void *rpmRunTransactions_callback(__attribute__((unused)) const void *h, mPUSHs(newSViv(amount)); mPUSHs(newSViv(total)); } + // for erasures, the key provided by librpm is always 0, so let's add another parameter (fullname): + char *s = headerGetAsString(h, RPMTAG_NVR); + mPUSHs(newSVpv(s, 0)); PUTBACK; i = call_sv(callback, callback == td->callback_open ? G_SCALAR : G_DISCARD); SPAGAIN; -- cgit v1.2.1