3791cf
From 08473f4ad8d79e6d232832c6863b2848f8a41734 Mon Sep 17 00:00:00 2001
3791cf
From: Michal Domonkos <mdomonko@redhat.com>
3791cf
Date: Mon, 7 Dec 2015 17:13:26 +0100
3791cf
Subject: [PATCH] Add RPMCALLBACK_ELEM_PROGRESS callback type
3791cf
3791cf
Currently, there's no callback type that would be issued per each
3791cf
transaction element.  RPMCALLBACK_TRANS_PROGRESS is only issued during
3791cf
the prepare phase but not when packages are actually installed or
3791cf
erased.  Likewise, RPMCALLBACK_INST_ST* and RPMCALLBACK_UNINST_ST* won't
3791cf
be issued if an install or erase operation is skipped for some reason (a
3791cf
script or package upgrade failure).
3791cf
3791cf
Having such a callback would allow the Python API consumers to always
3791cf
know upfront which element is about to be processed, before any other
3791cf
callbacks are issued.  This is important since not every callback type
3791cf
carries enough data about the subject package; while the INST types
3791cf
provide the user object passed to a former addInstall call, the UNINST
3791cf
types only provide the package name (which may not be unique within the
3791cf
transaction set).
3791cf
3791cf
This commit adds such a callback.
3791cf
3791cf
(cherry picked from commit 448db68ceb5be3c7171b7ec0ea908d905792dc2f)
3791cf
---
3791cf
 lib/rpmcallback.h  | 1 +
3791cf
 lib/transaction.c  | 4 ++++
3791cf
 python/rpmmodule.c | 1 +
3791cf
 3 files changed, 6 insertions(+)
3791cf
3791cf
diff --git a/lib/rpmcallback.h b/lib/rpmcallback.h
3791cf
index b3b05c6c1..b6d434c01 100644
3791cf
--- a/lib/rpmcallback.h
3791cf
+++ b/lib/rpmcallback.h
3791cf
@@ -31,6 +31,7 @@ typedef enum rpmCallbackType_e {
3791cf
     RPMCALLBACK_SCRIPT_START	= (1 << 16),
3791cf
     RPMCALLBACK_SCRIPT_STOP	= (1 << 17),
3791cf
     RPMCALLBACK_INST_STOP	= (1 << 18),
3791cf
+    RPMCALLBACK_ELEM_PROGRESS	= (1 << 19),
3791cf
 } rpmCallbackType;
3791cf
 
3791cf
 /**
3791cf
diff --git a/lib/transaction.c b/lib/transaction.c
3791cf
index 45c30b5ba..1cd9ca674 100644
3791cf
--- a/lib/transaction.c
3791cf
+++ b/lib/transaction.c
3791cf
@@ -1410,12 +1410,16 @@ exit:
3791cf
 static int rpmtsProcess(rpmts ts)
3791cf
 {
3791cf
     rpmtsi pi;	rpmte p;
3791cf
+    tsMembers tsmem = rpmtsMembers(ts);
3791cf
     int rc = 0;
3791cf
+    int i = 0;
3791cf
 
3791cf
     pi = rpmtsiInit(ts);
3791cf
     while ((p = rpmtsiNext(pi, 0)) != NULL) {
3791cf
 	int failed;
3791cf
 
3791cf
+	rpmtsNotify(ts, NULL, RPMCALLBACK_ELEM_PROGRESS, i++,
3791cf
+		tsmem->orderCount);
3791cf
 	rpmlog(RPMLOG_DEBUG, "========== +++ %s %s-%s 0x%x\n",
3791cf
 		rpmteNEVR(p), rpmteA(p), rpmteO(p), rpmteColor(p));
3791cf
 
3791cf
diff --git a/python/rpmmodule.c b/python/rpmmodule.c
3791cf
index 04285a63f..fc8115d30 100644
3791cf
--- a/python/rpmmodule.c
3791cf
+++ b/python/rpmmodule.c
3791cf
@@ -459,6 +459,7 @@ static int initModule(PyObject *m)
3791cf
     REGISTER_ENUM(RPMCALLBACK_SCRIPT_START);
3791cf
     REGISTER_ENUM(RPMCALLBACK_SCRIPT_STOP);
3791cf
     REGISTER_ENUM(RPMCALLBACK_INST_STOP);
3791cf
+    REGISTER_ENUM(RPMCALLBACK_ELEM_PROGRESS);
3791cf
 
3791cf
     REGISTER_ENUM(RPMPROB_BADARCH);
3791cf
     REGISTER_ENUM(RPMPROB_BADOS);
3791cf
-- 
3791cf
2.13.2
3791cf