Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=366c54873595b9432352339e9da0234f956925e9

commit 366c54873595b9432352339e9da0234f956925e9
Author: Michel Hermier <[email protected]>
Date:   Fri Aug 15 15:22:14 2014 +0200

libpacman: Make Database::find(const FMatcher *packagestrmatcher) able to find 
regular find before provide ones.

diff --git a/lib/libpacman/db.cpp b/lib/libpacman/db.cpp
index 4040812..8ec3f37 100644
--- a/lib/libpacman/db.cpp
+++ b/lib/libpacman/db.cpp
@@ -155,17 +155,22 @@ FPtrList *Database::filter(const char *target, int 
packagestrmatcher_flags, int

Package *Database::find(const FMatcher *packagestrmatcher)
{
-       // FIXME: search for provide in the same pass ?
+       Package *ret = NULL;
pmlist_t *i;

for(i = _pacman_db_get_pkgcache(this); i; i = i->next) {
Package *pkg = i->data;

if(f_match(pkg, packagestrmatcher)) {
-                       return pkg;
+                       if(_pacman_packagestrmatcher_match(packagestrmatcher, 
pkg, ~PM_PACKAGE_FLAG_PROVIDES)) {
+                               return pkg;
+                       } else if (ret == NULL) {
+                               /* Store provide match */
+                               ret = pkg;
+                       }
}
}
-       return NULL;
+       return ret;
}

Package *Database::find(const FStrMatcher *strmatcher, int 
packagestrmatcher_flags)
diff --git a/lib/libpacman/package.cpp b/lib/libpacman/package.cpp
index 8836d11..269c667 100644
--- a/lib/libpacman/package.cpp
+++ b/lib/libpacman/package.cpp
@@ -319,12 +319,8 @@ struct FPackageStrMatcher
};

static
-int _pacman_packagestrmatcher_match(const void *ptr, const void *matcher_data) 
{
-       Package *pkg = (void *)ptr; /* FIXME: Make const when const accessors 
are available */
-       const FPackageStrMatcher *data = matcher_data;
-       const int flags = data->flags;
-       const FStrMatcher *strmatcher = data->strmatcher;
-
+int _pacman_strmatcher_match(const FStrMatcher *strmatcher, Package *pkg, int 
flags) {
+       /* FIXME: Make const when const accessors are available */
if(((flags & PM_PACKAGE_FLAG_NAME) && f_str_match(pkg->name(), strmatcher)) ||
((flags & PM_PACKAGE_FLAG_VERSION) && f_str_match(pkg->version(), strmatcher)) 
||
((flags & PM_PACKAGE_FLAG_DESCRIPTION) && f_str_match(pkg->description(), 
strmatcher)) ||
@@ -351,6 +347,13 @@ int _pacman_packagestrmatcher_match(const void *ptr, const 
void *matcher_data) {
return 0;
}

+static
+int _pacman_packagestrmatcher_match_cb(const void *ptr, const void 
*matcher_data) {
+       const FPackageStrMatcher *data = matcher_data;
+
+       return _pacman_strmatcher_match(data->strmatcher, (const Package *)ptr, 
data->flags);
+}
+
int _pacman_packagestrmatcher_init(FMatcher *matcher, const FStrMatcher 
*strmatcher, int flags)
{
FPackageStrMatcher *data = NULL;
@@ -359,10 +362,11 @@ int _pacman_packagestrmatcher_init(FMatcher *matcher, 
const FStrMatcher *strmatc
ASSERT(strmatcher != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
ASSERT((data = (FPackageStrMatcher *)f_zalloc(sizeof(*data))) != NULL, return 
-1);

-       matcher->fn = _pacman_packagestrmatcher_match;
+       matcher->fn = _pacman_packagestrmatcher_match_cb;
matcher->data = data;
data->strmatcher = strmatcher;
-       return _pacman_packagestrmatcher_set_flags(matcher, flags);
+       data->flags = flags;
+       return 0;
}

int _pacman_packagestrmatcher_fini(FMatcher *matcher)
@@ -370,23 +374,22 @@ int _pacman_packagestrmatcher_fini(FMatcher *matcher)
FPackageStrMatcher *data = NULL;

ASSERT(matcher != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
-       ASSERT(matcher->fn == _pacman_packagestrmatcher_match, 
RET_ERR(PM_ERR_WRONG_ARGS, -1));
+       ASSERT(matcher->fn == _pacman_packagestrmatcher_match_cb, 
RET_ERR(PM_ERR_WRONG_ARGS, -1));
ASSERT((data = (FPackageStrMatcher *)matcher->data) != NULL, 
RET_ERR(PM_ERR_WRONG_ARGS, -1));

free(data);
return 0;
}

-int _pacman_packagestrmatcher_set_flags(FMatcher *matcher, int flags)
+int _pacman_packagestrmatcher_match(const FMatcher *matcher, const Package 
*package, int mask)
{
FPackageStrMatcher *data = NULL;

ASSERT(matcher != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1));
-       ASSERT(matcher->fn == _pacman_packagestrmatcher_match, 
RET_ERR(PM_ERR_WRONG_ARGS, -1));
+       ASSERT(matcher->fn == _pacman_packagestrmatcher_match_cb, 
RET_ERR(PM_ERR_WRONG_ARGS, -1));
ASSERT((data = (FPackageStrMatcher *)matcher->data) != NULL, 
RET_ERR(PM_ERR_WRONG_ARGS, -1));

-       data->flags = flags;
-       return 0;
+       return _pacman_strmatcher_match(data->strmatcher, package, data->flags 
& mask);
}

/* vim: set ts=2 sw=2 noet: */
diff --git a/lib/libpacman/package.h b/lib/libpacman/package.h
index 801a019..62e1b21 100644
--- a/lib/libpacman/package.h
+++ b/lib/libpacman/package.h
@@ -178,7 +178,7 @@ libpacman::Package *_pacman_pkg_isin(const char *needle, 
pmlist_t *haystack);
int _pacman_packagestrmatcher_init(FMatcher *matcher, const FStrMatcher 
*strmatcher, int flags);
int _pacman_packagestrmatcher_fini(FMatcher *matcher);

-int _pacman_packagestrmatcher_set_flags(FMatcher *matcher, int flags);
+int _pacman_packagestrmatcher_match(const FMatcher *matcher, const 
libpacman::Package *package, int mask = ~0);

#endif /* _PACMAN_PACKAGE_H */
_______________________________________________
Frugalware-git mailing list
[email protected]
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to