blob: 9bdd1d490888aae5d5244dbea5639c3acc42915a [file] [log] [blame]
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;
+}