commit: 8b633323765e129644ad9a4d93e0d6c467927aa4
Author: Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Sun Apr 28 16:49:37 2019 +0000
Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Sun Apr 28 17:09:51 2019 +0000
URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=8b633323
libq/vdb: implement q_vdb_filter_pkg following PMS
exclude things like Metadata.gz and other random cruft by following PMS
package name descriptions
Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>
libq/vdb.c | 30 +++++++++++++++++++++++++++---
1 file changed, 27 insertions(+), 3 deletions(-)
diff --git a/libq/vdb.c b/libq/vdb.c
index 34edfd2..447bd6f 100644
--- a/libq/vdb.c
+++ b/libq/vdb.c
@@ -88,6 +88,7 @@ q_vdb_filter_cat(const struct dirent *de)
bool founddash;
#ifdef DT_UNKNOWN
+ /* cat must be a dir */
if (de->d_type != DT_UNKNOWN &&
de->d_type != DT_DIR &&
de->d_type != DT_LNK)
@@ -204,10 +205,33 @@ q_vdb_close_cat(q_vdb_cat_ctx *cat_ctx)
int
q_vdb_filter_pkg(const struct dirent *de)
{
- if (de->d_name[0] == '.' || de->d_name[0] == '-')
- return 0;
+ int i;
+ bool founddash = false;
- return 1;
+ /* PMS 3.1.2 */
+ for (i = 0; de->d_name[i] != '\0'; i++) {
+ switch (de->d_name[i]) {
+ case '_':
+ break;
+ case '-':
+ founddash = true;
+ /* fall through */
+ case '+':
+ if (i)
+ break;
+ return 0;
+ default:
+ if ((de->d_name[i] >= 'A' && de->d_name[i] <=
'Z') ||
+ (de->d_name[i] >= 'a' &&
de->d_name[i] <= 'z') ||
+ (de->d_name[i] >= '0' &&
de->d_name[i] <= '9'))
+ break;
+ if (founddash)
+ return 1;
+ return 0;
+ }
+ }
+
+ return i;
}
q_vdb_pkg_ctx *