From: Michael Tremer Date: Tue, 21 Feb 2023 16:29:38 +0000 (+0000) Subject: filelists: Implement removing files from a filelist X-Git-Tag: 0.9.29~386 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=79fdf091870fb99ce08fdc8e68500791cf00ab75;p=pakfire.git filelists: Implement removing files from a filelist Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/filelist.c b/src/libpakfire/filelist.c index 82df96fd2..6ca61198e 100644 --- a/src/libpakfire/filelist.c +++ b/src/libpakfire/filelist.c @@ -174,8 +174,36 @@ PAKFIRE_EXPORT int pakfire_filelist_append(struct pakfire_filelist* list, struct return 0; } -PAKFIRE_EXPORT void pakfire_filelist_sort(struct pakfire_filelist* list) { - return; // XXX NOOP - filelists are now always sorted +static int pakfire_filelist_remove(struct pakfire_filelist* list, struct pakfire_file* file) { + struct pakfire_filelist_element* element = NULL; + + TAILQ_FOREACH(element, &list->files, nodes) { + if (element->file == file) { + // Remove the element from the list + TAILQ_REMOVE(&list->files, element, nodes); + + // Free the element + pakfire_file_unref(element->file); + free(element); + + return 0; + } + } + + return 0; +} + +static int __pakfire_filelist_remove_one( + struct pakfire* pakfire, struct pakfire_file* file, void* data) { + struct pakfire_filelist* list = (struct pakfire_filelist*)data; + + // Remove the file from the given filelist + return pakfire_filelist_remove(list, file); +} + +int pakfire_filelist_remove_all( + struct pakfire_filelist* list, struct pakfire_filelist* removees) { + return pakfire_filelist_walk(removees, __pakfire_filelist_remove_one, list); } // Returns true if s contains globbing characters diff --git a/src/libpakfire/include/pakfire/filelist.h b/src/libpakfire/include/pakfire/filelist.h index a79c73ad0..9b047ffbd 100644 --- a/src/libpakfire/include/pakfire/filelist.h +++ b/src/libpakfire/include/pakfire/filelist.h @@ -43,6 +43,9 @@ int pakfire_filelist_append(struct pakfire_filelist* list, struct pakfire_file* size_t pakfire_filelist_total_size(struct pakfire_filelist* list); +int pakfire_filelist_remove_all(struct pakfire_filelist* list, + struct pakfire_filelist* removees); + int pakfire_filelist_scan(struct pakfire_filelist* list, const char* root, const char** includes, const char** excludes);