Add four new extension tags for pretty-formatting dependencies
authorPanu Matilainen <pmatilai@redhat.com>
Tue, 6 Sep 2011 12:58:35 +0000 (15:58 +0300)
committerPanu Matilainen <pmatilai@redhat.com>
Tue, 6 Sep 2011 12:58:35 +0000 (15:58 +0300)
- The current method that --requires and friends use is kinda
  cumbersome and outputs extra whitespace for dependencies which
  dont have flags+version attached. Adding extensions for this
  is likely to be easier than teaching query formatting to
  permit conditionalizing on current value instead of just tag existence.

lib/rpmtag.h
lib/tagexts.c
tests/rpmgeneral.at

index e9878c1..0b87d3d 100644 (file)
@@ -302,6 +302,10 @@ typedef enum rpmTag_e {
     RPMTAG_MSSFMANIFEST                = 5038, /* s[] reservation (unimplemented) */
     RPMTAG_MSSFDOMAIN          = 5039, /* s[] reservation (unimplemented) */
     RPMTAG_INSTFILENAMES       = 5040, /* s[] extension */
+    RPMTAG_REQUIRENEVRS                = 5041, /* s[] extension */
+    RPMTAG_PROVIDENEVRS                = 5042, /* s[] extension */
+    RPMTAG_OBSOLETENEVRS       = 5043, /* s[] extension */
+    RPMTAG_CONFLICTNEVRS       = 5044, /* s[] extension */
 
     RPMTAG_FIRSTFREE_TAG       /*!< internal */
 } rpmTag;
index d316396..bc12d2b 100644 (file)
@@ -726,6 +726,47 @@ static int epochnumTag(Header h, rpmtd td, headerGetFlags hgflags)
     return 1;
 }
 
+static int depnevrsTag(Header h, rpmtd td, headerGetFlags hgflags,
+                       rpmTagVal tag)
+{
+    rpmds ds = rpmdsNew(h, tag, 0);
+    int ndeps = rpmdsCount(ds);
+
+    if (ndeps > 0) {
+       char **deps = xmalloc(sizeof(*deps) * ndeps);
+       int i;
+       while ((i = rpmdsNext(ds)) >= 0) {
+           deps[i] = rpmdsNewDNEVR(NULL, ds);
+       }
+       td->data = deps;
+       td->type = RPM_STRING_ARRAY_TYPE;
+       td->count = ndeps;
+       td->flags |= (RPMTD_ALLOCED | RPMTD_PTR_ALLOCED);
+    }
+    rpmdsFree(ds);
+    return (ndeps > 0);
+}
+
+static int requirenevrsTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return depnevrsTag(h, td, hgflags, RPMTAG_REQUIRENAME);
+}
+
+static int providenevrsTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return depnevrsTag(h, td, hgflags, RPMTAG_PROVIDENAME);
+}
+
+static int obsoletenevrsTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return depnevrsTag(h, td, hgflags, RPMTAG_OBSOLETENAME);
+}
+
+static int conflictnevrsTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return depnevrsTag(h, td, hgflags, RPMTAG_CONFLICTNAME);
+}
+
 static const struct headerTagFunc_s rpmHeaderTagExtensions[] = {
     { RPMTAG_GROUP,            groupTag },
     { RPMTAG_DESCRIPTION,      descriptionTag },
@@ -751,6 +792,10 @@ static const struct headerTagFunc_s rpmHeaderTagExtensions[] = {
     { RPMTAG_VERBOSE,          verboseTag },
     { RPMTAG_EPOCHNUM,         epochnumTag },
     { RPMTAG_INSTFILENAMES,    instfilenamesTag },
+    { RPMTAG_REQUIRENEVRS,     requirenevrsTag },
+    { RPMTAG_PROVIDENEVRS,     providenevrsTag },
+    { RPMTAG_OBSOLETENEVRS,    obsoletenevrsTag },
+    { RPMTAG_CONFLICTNEVRS,    conflictnevrsTag },
     { 0,                       NULL }
 };
 
index 3ccb655..04857ab 100644 (file)
@@ -65,6 +65,7 @@ CLASSDICT
 COLLECTIONS
 CONFLICTFLAGS
 CONFLICTNAME
+CONFLICTNEVRS
 CONFLICTS
 CONFLICTVERSION
 COOKIE
@@ -142,6 +143,7 @@ NVRA
 O
 OBSOLETEFLAGS
 OBSOLETENAME
+OBSOLETENEVRS
 OBSOLETES
 OBSOLETEVERSION
 OLDFILENAMES
@@ -191,6 +193,7 @@ PREUNFLAGS
 PREUNPROG
 PROVIDEFLAGS
 PROVIDENAME
+PROVIDENEVRS
 PROVIDES
 PROVIDEVERSION
 PUBKEYS
@@ -200,6 +203,7 @@ RELEASE
 REMOVETID
 REQUIREFLAGS
 REQUIRENAME
+REQUIRENEVRS
 REQUIRES
 REQUIREVERSION
 RPMVERSION