Add an "rpmdeps-oecore" binary which allows batch processing of individual file
dependencies in a similar manner to rpmdeps --provides --requires -v, prefixing
each line of output with the filename that has the dependency.

This is much faster than individually calling rpmdeps on each file.

This binary is used by package.bbclass.

Upstream-Status: Inappropriate [OE Specific]

RP 2012/2/7

---
 tools/Makefile.am      |    6 ++-
 tools/rpmdeps-oecore.c |  147 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 152 insertions(+), 1 deletions(-)
 create mode 100644 tools/rpmdeps-oecore.c

Index: rpm-5.4.14/tools/Makefile.am
===================================================================
--- rpm-5.4.14.orig/tools/Makefile.am
+++ rpm-5.4.14/tools/Makefile.am
@@ -62,7 +62,7 @@ pkgbin_PROGRAMS =	\
 	@WITH_AUGEAS_AUGTOOL@ chroot cp @WITH_CUDF_CUDFTOOL@ find mtree \
 	@WITH_SEMANAGE_SEMODULE@ wget \
 	rpmcache rpmdigest rpmrepo rpmspecdump \
-	rpmcmp rpmdeps sqlite3 @WITH_KEYUTILS_RPMKEY@ @WITH_LIBELF_DEBUGEDIT@
+	rpmcmp rpmdeps rpmdeps-oecore sqlite3 @WITH_KEYUTILS_RPMKEY@ @WITH_LIBELF_DEBUGEDIT@
 if WITH_DB
 pkgbin_PROGRAMS +=	dbconvert
 endif
@@ -172,6 +172,10 @@ rpmdeps_SOURCES =	rpmdeps.c
 rpmdeps_LDFLAGS =	@LDFLAGS_STATIC@ $(LDFLAGS)
 rpmdeps_LDADD =		$(RPM_LDADD_COMMON)
 
+rpmdeps_oecore_SOURCES =  rpmdeps-oecore.c
+rpmdeps_oecore_LDFLAGS =  @LDFLAGS_STATIC@ $(LDFLAGS)
+rpmdeps_oecore_LDADD =    $(RPM_LDADD_COMMON)
+
 rpmdigest_SOURCES =	rpmdigest.c
 rpmdigest_LDFLAGS =	@LDFLAGS_STATIC@ $(LDFLAGS)
 rpmdigest_LDADD =	$(RPMIO_LDADD_COMMON)
Index: rpm-5.4.14/tools/rpmdeps-oecore.c
===================================================================
--- /dev/null
+++ rpm-5.4.14/tools/rpmdeps-oecore.c
@@ -0,0 +1,147 @@
+#include "system.h"
+const char *__progname;
+
+#include <rpmio.h>
+#include <rpmiotypes.h>
+#include <rpmcb.h>
+#include <argv.h>
+#include <rpmtypes.h>
+#include <rpmtag.h>
+
+#include <rpmds.h>
+#define   _RPMFC_INTERNAL     /* XXX for debugging */
+#include <rpmfc.h>
+
+#include <rpmcli.h>
+
+#include "debug.h"
+
+/*@unchecked@*/
+char *progname;
+
+#define   RPMDEP_RPMFC        1
+
+static int rpmdepPrint(char *filename, rpmds ds, FILE * fp)
+{
+    if (fp == NULL) fp = stderr;
+
+    ds = rpmdsInit(ds);
+    while (rpmdsNext(ds) >= 0) {
+  fprintf(fp, "%s %s: %s\n", filename, rpmdsType(ds), rpmdsDNEVR(ds)+2);
+    }
+    return 0;
+}
+
+static struct poptOption optionsTable[] = {
+
+ { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmcliAllPoptTable, 0,
+  N_("Common options:"),
+  NULL }, 
+
+   POPT_AUTOALIAS
+   POPT_AUTOHELP
+   POPT_TABLEEND
+};
+
+
+int
+main(int argc, char *argv[])
+{
+    poptContext optCon;
+    ARGV_t av = NULL;
+    rpmfc fc = NULL;
+    FILE * fp = NULL;
+    int flags = 0;
+    int ac = 0;
+    int ec = 1;
+    int xx;
+    int i;
+    char buf[BUFSIZ];
+    int nddict;
+    const char * s;
+    char * se;
+    const char * fn;
+    const char * N;
+    const char * EVR;
+    evrFlags Flags;
+    unsigned char deptype;
+    int ix;
+    rpmds ds;
+
+/*@-modobserver@*/
+    if ((progname = strrchr(argv[0], '/')) != NULL)
+  progname++;
+    else
+  progname = argv[0];
+/*@=modobserver@*/
+
+    optCon = rpmcliInit(argc, argv, optionsTable);
+    if (optCon == NULL)
+  goto exit;
+
+    av = poptGetArgs(optCon);
+    ac = argvCount(av);
+
+    if (ac == 0) {
+  av = NULL;
+  xx = argvFgets(&av, NULL);
+  ac = argvCount(av);
+    }
+
+    /* Make sure file names are sorted. */
+    xx = argvSort(av, NULL);
+
+    /* Build file class dictionary. */
+    fc = rpmfcNew();
+    xx = rpmfcClassify(fc, av, NULL);
+
+    /* Build file/package dependency dictionary. */
+    xx = rpmfcApply(fc);
+
+    /* Generate per-file indices into package dependencies. */
+    nddict = argvCount(fc->ddict);
+
+    for (i = 0; i < nddict; i++) {
+  s = fc->ddict[i];
+
+  /* Parse out (file#,deptype,N,EVR,Flags) */
+  ix = strtol(s, &se, 10);
+  assert(se != NULL);
+  deptype = *se++;
+  se++;
+  N = se;
+  while (*se && *se != ' ')
+      se++;
+  *se++ = '\0';
+  EVR = se;
+  while (*se && *se != ' ')
+      se++;
+  *se++ = '\0';
+  Flags = strtol(se, NULL, 16);
+
+  switch (deptype) {
+  default:
+      /*@switchbreak@*/ break;
+  case 'P':   
+      ds = rpmdsSingle(RPMTAG_PROVIDENAME, N, EVR, Flags);
+      rpmdepPrint((char *)fc->fn[ix], ds, stdout);
+      (void)rpmdsFree(ds);
+      ds = NULL;
+      /*@switchbreak@*/ break;
+  case 'R':
+      ds = rpmdsSingle(RPMTAG_REQUIRENAME, N, EVR, Flags);
+      rpmdepPrint((char *)fc->fn[ix], ds, stdout);
+      (void)rpmdsFree(ds);
+      ds = NULL;
+      /*@switchbreak@*/ break;
+  }
+    }
+
+    fc = rpmfcFree(fc);
+
+    ec = 0;
+
+exit:
+    optCon = rpmcliFini(optCon);
+    return ec;
+}
