From: Michael Tremer Date: Sat, 8 Jun 2019 14:35:23 +0000 (+0100) Subject: libpakfire: Parse dependency data from packages X-Git-Tag: 0.9.28~1285^2~970 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dec8207e40143b765ac1d12314bdd39b65e7ff99;p=pakfire.git libpakfire: Parse dependency data from packages Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index 81d01c0c2..f233e7a5f 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -1207,5 +1207,57 @@ PAKFIRE_EXPORT PakfirePackage pakfire_archive_make_package(PakfireArchive archiv pakfire_package_set_buildtime(pkg, t); } + // Relations + + PakfireRelationList l; + + char* prerequires = pakfire_archive_get(archive, "dependencies.prerequires"); + if (prerequires) { + l = pakfire_relationlist_create_from_string(archive->pakfire, prerequires); + pakfire_package_set_prerequires(pkg, l); + pakfire_relationlist_unref(l); + pakfire_free(prerequires); + } + + char* requires = pakfire_archive_get(archive, "dependencies.requires"); + if (requires) { + l = pakfire_relationlist_create_from_string(archive->pakfire, requires); + pakfire_package_set_requires(pkg, l); + pakfire_relationlist_unref(l); + pakfire_free(requires); + } + + char* provides = pakfire_archive_get(archive, "dependencies.provides"); + if (provides) { + l = pakfire_relationlist_create_from_string(archive->pakfire, provides); + pakfire_package_set_provides(pkg, l); + pakfire_relationlist_unref(l); + pakfire_free(provides); + } + + char* obsoletes = pakfire_archive_get(archive, "dependencies.obsoletes"); + if (obsoletes) { + l = pakfire_relationlist_create_from_string(archive->pakfire, obsoletes); + pakfire_package_set_obsoletes(pkg, l); + pakfire_relationlist_unref(l); + pakfire_free(obsoletes); + } + + char* recommends = pakfire_archive_get(archive, "dependencies.recommends"); + if (recommends) { + l = pakfire_relationlist_create_from_string(archive->pakfire, recommends); + pakfire_package_set_recommends(pkg, l); + pakfire_relationlist_unref(l); + pakfire_free(recommends); + } + + char* suggests = pakfire_archive_get(archive, "dependencies.suggests"); + if (suggests) { + l = pakfire_relationlist_create_from_string(archive->pakfire, suggests); + pakfire_package_set_suggests(pkg, l); + pakfire_relationlist_unref(l); + pakfire_free(suggests); + } + return pkg; } diff --git a/src/libpakfire/include/pakfire/relation.h b/src/libpakfire/include/pakfire/relation.h index 1e6b7b258..d76bcf4cd 100644 --- a/src/libpakfire/include/pakfire/relation.h +++ b/src/libpakfire/include/pakfire/relation.h @@ -29,6 +29,7 @@ PakfireRelation pakfire_relation_create(Pakfire pakfire, const char* name, int cmp_type, const char* evr); PakfireRelation pakfire_relation_create_from_id(Pakfire pakfire, Id id); +PakfireRelation pakfire_relation_create_from_string(Pakfire pakfire, const char* s); PakfireRelation pakfire_relation_ref(PakfireRelation relation); PakfireRelation pakfire_relation_unref(PakfireRelation relation); diff --git a/src/libpakfire/include/pakfire/relationlist.h b/src/libpakfire/include/pakfire/relationlist.h index 5788411b7..f6f1e7288 100644 --- a/src/libpakfire/include/pakfire/relationlist.h +++ b/src/libpakfire/include/pakfire/relationlist.h @@ -24,6 +24,7 @@ #include PakfireRelationList pakfire_relationlist_create(Pakfire pakfire); +PakfireRelationList pakfire_relationlist_create_from_string(Pakfire pakfire, const char* s); PakfireRelationList pakfire_relationlist_ref(PakfireRelationList relationlist); PakfireRelationList pakfire_relationlist_unref(PakfireRelationList relationlist); diff --git a/src/libpakfire/include/pakfire/util.h b/src/libpakfire/include/pakfire/util.h index c100d3af0..3447d5e5f 100644 --- a/src/libpakfire/include/pakfire/util.h +++ b/src/libpakfire/include/pakfire/util.h @@ -60,5 +60,6 @@ int pakfire_read_file_into_buffer(FILE* f, char** buffer, size_t* len); size_t pakfire_string_to_size(const char* s); char** pakfire_split_string(const char* s, char delim); +void pakfire_partition_string(const char* s, const char* delim, char** s1, char** s2); #endif /* PAKFIRE_UTIL_H */ diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index d2d0aa655..e882f75cb 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -285,6 +285,7 @@ global: pakfire_relationlist_add; pakfire_relationlist_count; pakfire_relationlist_create; + pakfire_relationlist_create_from_string; pakfire_relationlist_get_clone; pakfire_relationlist_ref; pakfire_relationlist_unref; @@ -353,6 +354,7 @@ global: pakfire_access; pakfire_free; pakfire_get_errno; + pakfire_partition_string; pakfire_path_join; pakfire_read_file_into_buffer; pakfire_split_string; diff --git a/src/libpakfire/package.c b/src/libpakfire/package.c index 562c42786..f2c3b5361 100644 --- a/src/libpakfire/package.c +++ b/src/libpakfire/package.c @@ -575,6 +575,10 @@ PAKFIRE_EXPORT PakfireRelationList pakfire_package_get_prerequires(PakfirePackag return NULL; } +PAKFIRE_EXPORT void pakfire_package_set_prerequires(PakfirePackage pkg, PakfireRelationList relationlist) { + #warning TODO +} + PAKFIRE_EXPORT PakfireRelationList pakfire_package_get_requires(PakfirePackage pkg) { return pakfire_package_get_relationlist(pkg, SOLVABLE_REQUIRES); } diff --git a/src/libpakfire/relation.c b/src/libpakfire/relation.c index 7b71c2113..5ca6310b2 100644 --- a/src/libpakfire/relation.c +++ b/src/libpakfire/relation.c @@ -38,6 +38,29 @@ struct _PakfireRelation { int nrefs; }; +const char* delimiters[] = { + ">=", ">", "<=", "<", "=", NULL, +}; + +static int cmp2type(const char* s) { + if (strcmp(s, ">=") == 0) + return PAKFIRE_GE; + + if (strcmp(s, ">") == 0) + return PAKFIRE_GT; + + if (strcmp(s, "<=") == 0) + return PAKFIRE_LE; + + if (strcmp(s, "<") == 0) + return PAKFIRE_LT; + + if (strcmp(s, "=") == 0) + return PAKFIRE_EQ; + + return 0; +} + static int cmptype2relflags(int type) { int flags = 0; @@ -83,6 +106,36 @@ PAKFIRE_EXPORT PakfireRelation pakfire_relation_create_from_id(Pakfire pakfire, return relation; } +PAKFIRE_EXPORT PakfireRelation pakfire_relation_create_from_string(Pakfire pakfire, const char* s) { + DEBUG(pakfire, "Parsing relation from string: %s\n", s); + + char* name; + char* evr; + + const char** delim = delimiters; + while (*delim) { + pakfire_partition_string(s, *delim, &name, &evr); + + // Nothing to do for no match + if (!name && !evr) { + delim++; + continue; + } + + // Create new relation object + PakfireRelation rel = pakfire_relation_create(pakfire, name, cmp2type(*delim), evr); + + // Cleanup + pakfire_free(name); + pakfire_free(evr); + + return rel; + } + + // No delimiter was found + return pakfire_relation_create(pakfire, s, 0, NULL); +} + PAKFIRE_EXPORT PakfireRelation pakfire_relation_ref(PakfireRelation relation) { relation->nrefs++; diff --git a/src/libpakfire/relationlist.c b/src/libpakfire/relationlist.c index 1a43d4e47..65618ea3e 100644 --- a/src/libpakfire/relationlist.c +++ b/src/libpakfire/relationlist.c @@ -48,6 +48,33 @@ PAKFIRE_EXPORT PakfireRelationList pakfire_relationlist_create(Pakfire pakfire) return relationlist; } +PAKFIRE_EXPORT PakfireRelationList pakfire_relationlist_create_from_string(Pakfire pakfire, const char* s) { + PakfireRelationList relationlist = pakfire_relationlist_create(pakfire); + if (!relationlist) + return NULL; + + // Split input by newline + char** list = pakfire_split_string(s, '\n'); + if (!list) + return relationlist; + + char** item = list; + while (*item) { + PakfireRelation rel = pakfire_relation_create_from_string(relationlist->pakfire, *item); + if (rel) { + pakfire_relationlist_add(relationlist, rel); + pakfire_relation_unref(rel); + } + + //pakfire_free(*item); + item++; + } + + pakfire_free(list); + + return relationlist; +} + PAKFIRE_EXPORT PakfireRelationList pakfire_relationlist_ref(PakfireRelationList relationlist) { relationlist->nrefs++; diff --git a/src/libpakfire/util.c b/src/libpakfire/util.c index db665ff7c..529d0cb10 100644 --- a/src/libpakfire/util.c +++ b/src/libpakfire/util.c @@ -361,3 +361,23 @@ PAKFIRE_EXPORT char** pakfire_split_string(const char* s, char delim) { return ret; } + +PAKFIRE_EXPORT void pakfire_partition_string(const char* s, const char* delim, char** s1, char** s2) { + char* p = strstr(s, delim); + + // Delim was not found + if (!p) { + *s1 = NULL; + *s2 = NULL; + return; + } + + // Length of string before delim + size_t l = p - s; + printf("%zu\n", l); + + *s1 = pakfire_malloc(l); + snprintf(*s1, l, "%s", s); + + *s2 = pakfire_strdup(p + strlen(delim)); +}