Blob Blame History Raw
From 448db68ceb5be3c7171b7ec0ea908d905792dc2f Mon Sep 17 00:00:00 2001
From: Michal Domonkos <mdomonko@redhat.com>
Date: Mon, 7 Dec 2015 17:13:26 +0100
Subject: [PATCH] Add RPMCALLBACK_ELEM_PROGRESS callback type

Currently, there's no callback type that would be issued per each
transaction element.  RPMCALLBACK_TRANS_PROGRESS is only issued during
the prepare phase but not when packages are actually installed or
erased.  Likewise, RPMCALLBACK_INST_ST* and RPMCALLBACK_UNINST_ST* won't
be issued if an install or erase operation is skipped for some reason (a
script or package upgrade failure).

Having such a callback would allow the Python API consumers to always
know upfront which element is about to be processed, before any other
callbacks are issued.  This is important since not every callback type
carries enough data about the subject package; while the INST types
provide the user object passed to a former addInstall call, the UNINST
types only provide the package name (which may not be unique within the
transaction set).

This commit adds such a callback.
---
 lib/rpmcallback.h  | 1 +
 lib/transaction.c  | 4 ++++
 python/rpmmodule.c | 1 +
 3 files changed, 6 insertions(+)

diff --git a/lib/rpmcallback.h b/lib/rpmcallback.h
index dfc22ab..f07892d 100644
--- a/lib/rpmcallback.h
+++ b/lib/rpmcallback.h
@@ -37,6 +37,7 @@ typedef enum rpmCallbackType_e {
     RPMCALLBACK_SCRIPT_START	= (1 << 16),
     RPMCALLBACK_SCRIPT_STOP	= (1 << 17),
     RPMCALLBACK_INST_STOP	= (1 << 18),
+    RPMCALLBACK_ELEM_PROGRESS	= (1 << 19),
 } rpmCallbackType;
 
 /** \ingroup rpmts
diff --git a/lib/transaction.c b/lib/transaction.c
index 66888af..4f90782 100644
--- a/lib/transaction.c
+++ b/lib/transaction.c
@@ -1345,12 +1345,16 @@ exit:
 static int rpmtsProcess(rpmts ts)
 {
     rpmtsi pi;	rpmte p;
+    tsMembers tsmem = rpmtsMembers(ts);
     int rc = 0;
+    int i = 0;
 
     pi = rpmtsiInit(ts);
     while ((p = rpmtsiNext(pi, 0)) != NULL) {
 	int failed;
 
+	rpmtsNotify(ts, NULL, RPMCALLBACK_ELEM_PROGRESS, i++,
+		tsmem->orderCount);
 	rpmlog(RPMLOG_DEBUG, "========== +++ %s %s-%s 0x%x\n",
 		rpmteNEVR(p), rpmteA(p), rpmteO(p), rpmteColor(p));
 
diff --git a/python/rpmmodule.c b/python/rpmmodule.c
index 0e3ab18..29753fd 100644
--- a/python/rpmmodule.c
+++ b/python/rpmmodule.c
@@ -512,6 +512,7 @@ static int initModule(PyObject *m)
     REGISTER_ENUM(RPMCALLBACK_SCRIPT_START);
     REGISTER_ENUM(RPMCALLBACK_SCRIPT_STOP);
     REGISTER_ENUM(RPMCALLBACK_INST_STOP);
+    REGISTER_ENUM(RPMCALLBACK_ELEM_PROGRESS);
 
     REGISTER_ENUM(RPMPROB_BADARCH);
     REGISTER_ENUM(RPMPROB_BADOS);
-- 
1.9.3