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 *

Reply via email to