Add tag extensions for common name-[epoch:]version-release[.arch] combos
authorPanu Matilainen <pmatilai@redhat.com>
Wed, 2 Sep 2009 07:24:20 +0000 (10:24 +0300)
committerPanu Matilainen <pmatilai@redhat.com>
Wed, 2 Sep 2009 07:49:00 +0000 (10:49 +0300)
- RPMTAG_NVRA same as rpm5.org, others are new tags

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

index ddfbc1f..367724f 100644 (file)
@@ -271,6 +271,7 @@ typedef enum rpmTag_e {
     RPMTAG_BUILDPROVIDES       = 1193, /* internal */
     RPMTAG_BUILDOBSOLETES      = 1194, /* internal */
     RPMTAG_DBINSTANCE          = 1195, /* i extension */
+    RPMTAG_NVRA                        = 1196, /* s extension */
     RPMTAG_FILENAMES           = 5000, /* s[] extension */
     RPMTAG_FILEPROVIDE         = 5001, /* s[] extension */
     RPMTAG_FILEREQUIRE         = 5002, /* s[] extension */
@@ -284,6 +285,10 @@ typedef enum rpmTag_e {
     RPMTAG_FILECAPS            = 5010, /* s[] */
     RPMTAG_FILEDIGESTALGO      = 5011, /* i file digest algorithm */
     RPMTAG_BUGURL              = 5012, /* s */
+    RPMTAG_EVR                 = 5013, /* s extension */
+    RPMTAG_NVR                 = 5014, /* s extension */
+    RPMTAG_NEVR                        = 5015, /* s extension */
+    RPMTAG_NEVRA               = 5016, /* s extension */
 
     RPMTAG_FIRSTFREE_TAG       /*!< internal */
 } rpmTag;
index 6dd7373..8ccc98f 100644 (file)
@@ -643,6 +643,75 @@ static int dbinstanceTag(Header h, rpmtd td, headerGetFlags hgflags)
     return 1; /* this cannot fail */
 }
 
+typedef enum nevraFlags_e {
+    NEVRA_NAME         = (1 << 0),
+    NEVRA_EPOCH                = (1 << 1),
+    NEVRA_VERSION      = (1 << 2),
+    NEVRA_RELEASE      = (1 << 3),
+    NEVRA_ARCH         = (1 << 4)
+} nevraFlags;
+
+static int getNEVRA(Header h, rpmtd td, nevraFlags flags)
+{
+    const char *val = NULL;
+    char *res = NULL;
+
+    if ((flags & NEVRA_NAME)) {
+       val = headerGetString(h, RPMTAG_NAME);
+       if (val) rstrscat(&res, val, "-", NULL);
+    }
+    if ((flags & NEVRA_EPOCH)) {
+       char *e = headerGetAsString(h, RPMTAG_EPOCH);
+       if (e) rstrscat(&res, e, ":", NULL);
+       free(e);
+    }
+    if ((flags & NEVRA_VERSION)) {
+       val = headerGetString(h, RPMTAG_VERSION);
+       if (val) rstrscat(&res, val, "-", NULL);
+    }
+    if ((flags & NEVRA_RELEASE)) {
+       val = headerGetString(h, RPMTAG_RELEASE);
+       if (val) rstrscat(&res, val, NULL);
+    }
+    if ((flags & NEVRA_ARCH)) {
+       val = headerGetString(h, RPMTAG_ARCH);
+       if (headerIsSource(h) && val == NULL) val = "src";
+       if (val) rstrscat(&res, ".", val, NULL);
+    }
+
+    td->type = RPM_STRING_TYPE;
+    td->data = res;
+    td->count = 1;
+    td->flags = RPMTD_ALLOCED;
+
+    return 1;
+}
+
+static int evrTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return getNEVRA(h, td, NEVRA_EPOCH|NEVRA_VERSION|NEVRA_RELEASE);
+}
+
+static int nvrTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return getNEVRA(h, td, NEVRA_NAME|NEVRA_VERSION|NEVRA_RELEASE);
+}
+
+static int nvraTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return getNEVRA(h, td, NEVRA_NAME|NEVRA_VERSION|NEVRA_RELEASE|NEVRA_ARCH);
+}
+
+static int nevrTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return getNEVRA(h, td, NEVRA_NAME|NEVRA_EPOCH|NEVRA_VERSION|NEVRA_RELEASE);
+}
+
+static int nevraTag(Header h, rpmtd td, headerGetFlags hgflags)
+{
+    return getNEVRA(h, td, NEVRA_NAME|NEVRA_EPOCH|NEVRA_VERSION|NEVRA_RELEASE|NEVRA_ARCH);
+}
+
 void *rpmHeaderTagFunc(rpmTag tag)
 {
     const struct headerTagFunc_s * ext;
@@ -676,6 +745,11 @@ static const struct headerTagFunc_s rpmHeaderTagExtensions[] = {
     { RPMTAG_LONGSIZE,         longsizeTag },
     { RPMTAG_LONGSIGSIZE,      longsigsizeTag },
     { RPMTAG_DBINSTANCE,       dbinstanceTag },
+    { RPMTAG_EVR,              evrTag },
+    { RPMTAG_NVR,              nvrTag },
+    { RPMTAG_NEVR,             nevrTag },
+    { RPMTAG_NVRA,             nvraTag },
+    { RPMTAG_NEVRA,            nevraTag },
     { 0,                       NULL }
 };
 
index 32fa9a9..b6f2e25 100644 (file)
@@ -97,6 +97,7 @@ DISTURL
 DSAHEADER
 E
 EPOCH
+EVR
 EXCLUDEARCH
 EXCLUDEOS
 EXCLUSIVEARCH
@@ -149,6 +150,10 @@ LONGSIGSIZE
 LONGSIZE
 N
 NAME
+NEVR
+NEVRA
+NVR
+NVRA
 O
 OBSOLETEFLAGS
 OBSOLETENAME