-
-
Notifications
You must be signed in to change notification settings - Fork 136
Description
Hello!
Scenario: I have packages atf-c, atf-c++, atf-sh. (Any set of two or more packages works for this trick; I happen to have these three from the same source alphabetically early in my list of packages.)
$ pkgconf --modversion atf-c atf-c++ atf-sh
0.20
0.20
... so where did the third one go?
Spelunking the code, I see that --modversion (and some other flags) put us into a mode where we only consider one package at a time by setting maximum_package_count — perfectly reasonable (though I don't know if this behaviour is actually documented anywhere except here in the source, so surprising in that regard):
Lines 1113 to 1127 in 78f3abc
| /* if these selectors are used, it means that we are inquiring about a single package. | |
| * so signal to libpkgconf that we do not want to use the dependency resolver for more than one level, | |
| * and also limit the SAT problem to a single package. | |
| */ | |
| if (((want_flags & PKG_REQUIRES) == PKG_REQUIRES || | |
| (want_flags & PKG_REQUIRES_PRIVATE) == PKG_REQUIRES_PRIVATE || | |
| (want_flags & PKG_PROVIDES) == PKG_PROVIDES || | |
| (want_flags & PKG_VARIABLES) == PKG_VARIABLES || | |
| (want_flags & PKG_MODVERSION) == PKG_MODVERSION || | |
| (want_flags & PKG_PATH) == PKG_PATH || | |
| want_variable != NULL)) | |
| { | |
| maximum_package_count = 1; | |
| maximum_traverse_depth = 1; | |
| } |
However, the logic to actually enforce this erroneously compares cardinal pkgq.length to ordinal maximum_package_count:
Lines 1324 to 1328 in 78f3abc
| /* check if there is a limit to the number of packages allowed to be included, if so and we have hit | |
| * the limit, stop adding packages to the queue. | |
| */ | |
| if (maximum_package_count > 0 && pkgq.length > maximum_package_count) | |
| break; |
(I stumbled across this bug because Cabal does this wrong then fails for mysterious reasons; I'll also file a bug there about this behaviour.)