aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Groffen <grobian@gentoo.org>2018-04-12 20:28:20 +0200
committerFabian Groffen <grobian@gentoo.org>2018-04-12 20:28:20 +0200
commit712cbd379172e444c399a48d08d76a402e822697 (patch)
tree7ac7993a7cf19bf8fa2c70594c89d8b7c8cac031
parentmake-tarball: use numeric uid/gid (diff)
downloadportage-utils-712cbd379172e444c399a48d08d76a402e822697.tar.gz
portage-utils-712cbd379172e444c399a48d08d76a402e822697.tar.bz2
portage-utils-712cbd379172e444c399a48d08d76a402e822697.zip
atom_explode: try harder to find correct PV
It's not enough to find a hyphen followed by something that looks like a version, it needs to be verified it really is, else it is part of the package name. Bug: https://bugs.gentoo.org/653032
-rw-r--r--libq/atom_explode.c51
-rwxr-xr-xtests/qatom/dotest3
2 files changed, 27 insertions, 27 deletions
diff --git a/libq/atom_explode.c b/libq/atom_explode.c
index ec0fc5a..07d9cec 100644
--- a/libq/atom_explode.c
+++ b/libq/atom_explode.c
@@ -189,13 +189,31 @@ atom_explode(const char *atom)
* SLOT, REPO or '*'
* PN must not end in a hyphen followed by anything matching version
* syntax, version syntax starts with a number, so "-[0-9]" is a
- * separator from PN to PV* */
+ * separator from PN to PV* -- except it doesn't when the thing
+ * doesn't validate as version :( */
ptr = ret->PN;
while ((ptr = strchr(ptr, '-')) != NULL) {
+ char *pv;
ptr++;
- if (*ptr >= '0' && *ptr <= '9')
- break;
+ if (!isdigit(*ptr))
+ continue;
+
+ /* so we should have something like "-2" here, see if this
+ * checks out as valid version string */
+ pv = ptr;
+ while (*++ptr != '\0') {
+ if (*ptr != '.' && !isdigit(*ptr))
+ break;
+ }
+ /* allow for 1 optional suffix letter */
+ if (*ptr >= 'a' && *ptr <= 'z')
+ ret->letter = *ptr++;
+ if (*ptr == '_' || *ptr == '\0' || *ptr == '-') {
+ ptr = pv;
+ break; /* valid */
+ }
+ ret->letter = '\0';
}
if (ptr == NULL) {
@@ -216,7 +234,7 @@ atom_explode(const char *atom)
}
break;
}
- --ptr;
+ ptr--;
}
strcpy(ret->P, ret->PN);
ret->PV[-1] = '\0';
@@ -256,29 +274,8 @@ atom_explode(const char *atom)
ret->suffixes[idx] = t;
}
- /* skip back to the "end" */
- for (ptr = ret->PV; *ptr != '\0' && *ptr != '_'; ptr++)
- ;
- ptr--;
-
- /* allow for 1 optional suffix letter */
- if (*ptr >= 'a' && *ptr <= 'z')
- ret->letter = *ptr--;
-
- /* eat the trailing version number [.0-9]+ */
- while (ptr > ret->PV) {
- if (*ptr != '.' && !isdigit(*ptr))
- break;
- ptr--;
- }
-
- if (ptr != ret->PV) {
- /* PV isn't exactly a number */
- ret->PV = ret->PVR = NULL;
- } else {
- ptr = stpcpy(ret->PVR, ret->PV);
- sprintf(ptr, "-r%i", ret->PR_int);
- }
+ ptr = stpcpy(ret->PVR, ret->PV);
+ sprintf(ptr, "-r%i", ret->PR_int);
return ret;
}
diff --git a/tests/qatom/dotest b/tests/qatom/dotest
index a0e6a34..01900e6 100755
--- a/tests/qatom/dotest
+++ b/tests/qatom/dotest
@@ -48,5 +48,8 @@ test f14 "foo-r1" -F '%{PN}' "foo-r1" # bug #526596
test f15 "app-emacs diff-mode-" \
-F '%{CATEGORY} %{PN}' \
"app-emacs/diff-mode-"
+test f16 "media-fonts font-adobe-100dpi 1.0.3 r1" \
+ -F '%{CATEGORY} %{PN} %{PV} %{PR}' \
+ "media-fonts/font-adobe-100dpi-1.0.3-r1"
end