From 663e351cb468e889ffcd08c07fc867b3002a1c91 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 11 Apr 2013 23:36:12 +0200 Subject: [PATCH] BSolver/pkgman: Support for searching in provides * BSolver/LibsolvSolver: * Add B_FIND_IN_NAME and make searching in the names explicit. * Add B_FIND_IN_PROVIDES to search the packages' provides list. * pkgman: Also search in provides. --- headers/os/package/solver/Solver.h | 6 ++++-- src/bin/pkgman/command_search.cpp | 6 ++++-- src/kits/package/solver/LibsolvSolver.cpp | 21 ++++++++++++++++----- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/headers/os/package/solver/Solver.h b/headers/os/package/solver/Solver.h index 5403baa88e..c283b3e993 100644 --- a/headers/os/package/solver/Solver.h +++ b/headers/os/package/solver/Solver.h @@ -25,8 +25,10 @@ public: // FindPackages() flags enum { B_FIND_CASE_INSENSITIVE = 0x01, - B_FIND_IN_SUMMARY = 0x02, - B_FIND_IN_DESCRIPTION = 0x04 + B_FIND_IN_NAME = 0x02, + B_FIND_IN_SUMMARY = 0x04, + B_FIND_IN_DESCRIPTION = 0x08, + B_FIND_IN_PROVIDES = 0x10 }; public: diff --git a/src/bin/pkgman/command_search.cpp b/src/bin/pkgman/command_search.cpp index 069489ea37..41334e26ac 100644 --- a/src/bin/pkgman/command_search.cpp +++ b/src/bin/pkgman/command_search.cpp @@ -172,8 +172,10 @@ command_search(int argc, const char* const* argv) // search BObjectList packages; error = solver->FindPackages(searchString, - BSolver::B_FIND_CASE_INSENSITIVE | BSolver::B_FIND_IN_SUMMARY - | BSolver::B_FIND_IN_DESCRIPTION, packages); + BSolver::B_FIND_CASE_INSENSITIVE | BSolver::B_FIND_IN_NAME + | BSolver::B_FIND_IN_SUMMARY | BSolver::B_FIND_IN_DESCRIPTION + | BSolver::B_FIND_IN_PROVIDES, + packages); if (error != B_OK) DIE(error, "searching packages failed"); diff --git a/src/kits/package/solver/LibsolvSolver.cpp b/src/kits/package/solver/LibsolvSolver.cpp index a1ab43ca0b..66c3a78e24 100644 --- a/src/kits/package/solver/LibsolvSolver.cpp +++ b/src/kits/package/solver/LibsolvSolver.cpp @@ -226,14 +226,16 @@ LibsolvSolver::FindPackages(const char* searchString, uint32 flags, iteratorFlags |= SEARCH_NOCASE; SolvDataIterator iterator(fPool, 0, 0, 0, searchString, iteratorFlags); + SolvQueue selection; // search package names - dataiterator_set_keyname(&iterator, SOLVABLE_NAME); - dataiterator_set_search(&iterator, 0, 0); + if ((flags & B_FIND_IN_NAME) != 0) { + dataiterator_set_keyname(&iterator, SOLVABLE_NAME); + dataiterator_set_search(&iterator, 0, 0); - SolvQueue selection; - while (dataiterator_step(&iterator)) - queue_push2(&selection, SOLVER_SOLVABLE, iterator.solvid); + while (dataiterator_step(&iterator)) + queue_push2(&selection, SOLVER_SOLVABLE, iterator.solvid); + } // search package summaries if ((flags & B_FIND_IN_SUMMARY) != 0) { @@ -253,6 +255,15 @@ LibsolvSolver::FindPackages(const char* searchString, uint32 flags, queue_push2(&selection, SOLVER_SOLVABLE, iterator.solvid); } + // search package provides + if ((flags & B_FIND_IN_PROVIDES) != 0) { + dataiterator_set_keyname(&iterator, SOLVABLE_PROVIDES); + dataiterator_set_search(&iterator, 0, 0); + + while (dataiterator_step(&iterator)) + queue_push2(&selection, SOLVER_SOLVABLE, iterator.solvid); + } + // get solvables SolvQueue solvables; selection_solvables(fPool, &selection, &solvables);