diff --git a/NEWS b/NEWS index 985807a4..8e620eb3 100644 --- a/NEWS +++ b/NEWS @@ -1,12 +1,17 @@ xbps-0.16 (???): + * Always require an underscore at package versions, if any provided + pkgver (i.e 'foo-1.0_1') does not contain an underscore the name/version + won't be detected for a string. That means that now any package can contain + any character in pkgname and version, and as bonus there's no need to + make some tricks to perform installation of exact package versions. + * xbps-bin(8): the 'install' target now can (re)install an exact package version as specified on its arguments, i.e: - $ xbps-bin install foo=1.0 + $ xbps-bin install foo-1.0_1 If that version is not available no other version will be installed. - The equal sign must be used to specify exact versions. * xbps-repo(8): 'genindex' target is now able to remove binary packages when a greater version exists on the index. diff --git a/bin/xbps-bin/xbps-bin.8 b/bin/xbps-bin/xbps-bin.8 index f411c643..53e38c7d 100644 --- a/bin/xbps-bin/xbps-bin.8 +++ b/bin/xbps-bin/xbps-bin.8 @@ -1,4 +1,4 @@ -.Dd June 3, 2012 +.Dd June 5, 2012 .Os Void GNU/Linux .Dt xbps-bin 8 .Sh NAME @@ -154,26 +154,25 @@ Prints the name of the installed .Em package(s) matching the pattern on its file list. Multiple patterns can be specified as arguments. -.It Sy install Ar pkgname(s) | Ar pkgpattern(s) -Install binary package(s) from repository pool by specifying -.Em pkgname(s) -or -.Em package pattern(s) . +.It Sy install Ar pattern Ar [patterns ...] +Install binary package(s) from repository pool by specifying a +.Em pattern . Three different ways exist to install packages: by specifying just the .Em package name , the best available version from repositories will be installed; by specifying a .Em package pattern with '>' '<' '>=' or '<=' .Em ( foo>=2.0 ) -or by specifying an exact package version delimited -by the equal sign, i.e -.Em ( foo=1.0) . -The first repository matching the arguments will be used. The package(s) will be +or by specifying an exact package version, i.e +.Em ( foo-1.0_1) . +The first repository matching +.Em pattern +will be used. The package(s) will be .Em downloaded (if found in a remote repository), .Em unpacked and -.EM configured . +.Em configured . The .Em unpack stage will execute the pre-install action on its INSTALL script, and unpack its files. @@ -206,13 +205,17 @@ to installed in the package database. The keyword can be used to reconfigure all not configured packages. If .Ql -f option is used, the package will be reconfigured even if its state is already installed. -.It Sy remove Ar pkgname(s) +.It Sy remove Ar pkgname Ar [pkgnames ...] Removes the installed package .Em pkgname(s) . Files not matching the original SHA256 hash will be preserved. If .Ql -f option is used, package files will be .Em removed even if its SHA256 hash don't match . +If +.Ql -F +option is used, package will be removed even if there are +.Em installed reverse dependencies . .It Sy remove-orphans Removes package orphans. These packages were installed as dependencies and currently there is not any package depending on it, directly or indirectly. @@ -240,11 +243,11 @@ Shows the reverse dependencies for Reverse dependencies are packages that are currently depending in .Em pkgname directly. -.It Sy update Ar pkgname(s) +.It Sy update Ar pkgname Ar [pkgnames ...] Updates -.Em pkgname(s) -to the most newer version available in repository pool. This can be used if only -.Em pkgname(s) +.Em pkgname +to the newest version available in repository pool. This can be used if only +.Em pkgname need to be updated, unlike the .Em dist-upgrade target that will update all currently installed packages. @@ -287,7 +290,7 @@ XBPS master package database plist file. .It Pa /var/cache/xbps XBPS cache directory for downloaded binary packages. .Sh EXAMPLES -Install a package by specifying a +Install best package version by specifying a .Em pkgname : .Pp .Dl $ xbps-bin install foo @@ -297,12 +300,19 @@ Install a package by specifying a .Pp .Dl $ xbps-bin install \*qfoo>=3.0\*q .Pp +Install an exact +.Em package version : +.Pp +.Dl $ xbps-bin install foo-1.0_1 +.Pp Install multiple packages by specifying .Em pkgnames and -.Em package patterns : +.Em package patterns +and +.Em exact package versions : .Pp -.Dl $ xbps-bin install foo \*qblah<=4.0\*q baz-2.0 \*qblob>4.[0-9]\*q +.Dl $ xbps-bin install foo \*qblah<=4.0\*q baz-2.0_1 \*qblob>1.0<1.8\*q .Pp Find the package that owns the file .Pa /bin/mount : @@ -326,7 +336,7 @@ and .Em recursively all packages that were installed automatically by it: .Pp -.Dl $ xbps-bin -R remove bsdtar +.Dl $ xbps-bin -Ry remove bsdtar .Pp .Sh SEE ALSO .Xr xbps-repo 8 , diff --git a/include/xbps_api.h b/include/xbps_api.h index 9b23d81c..641af865 100644 --- a/include/xbps_api.h +++ b/include/xbps_api.h @@ -56,7 +56,7 @@ */ #define XBPS_PKGINDEX_VERSION "1.5" -#define XBPS_API_VERSION "20120604-1" +#define XBPS_API_VERSION "20120605" #define XBPS_VERSION "0.16" /** diff --git a/lib/plist_find.c b/lib/plist_find.c index e1ce677b..b19ddccd 100644 --- a/lib/plist_find.c +++ b/lib/plist_find.c @@ -71,7 +71,6 @@ find_pkg_in_array(prop_array_t array, */ if (xbps_match_virtual_pkg_in_dict(obj, str, bypattern)) break; - } else if (bypattern) { /* * Check if package pattern matches the @@ -166,7 +165,7 @@ find_virtualpkg_user_in_conf(const char *vpkg, bool bypattern) { const struct xbps_handle *xhp; const char *vpkgver, *pkg = NULL; - char *vpkgname = NULL; + char *vpkgname = NULL, *tmp; size_t i, j, cnt; xhp = xbps_handle_get(); @@ -181,8 +180,16 @@ find_virtualpkg_user_in_conf(const char *vpkg, bool bypattern) for (i = 0; i < cnt; i++) { cfg_t *sec = cfg_getnsec(xhp->cfg, "virtual-package", i); for (j = 0; j < cfg_size(sec, "targets"); j++) { + tmp = NULL; vpkgver = cfg_getnstr(sec, "targets", j); - vpkgname = xbps_pkg_name(vpkgver); + if (strchr(vpkgver, '_') == NULL) { + tmp = xbps_xasprintf("%s_1", vpkgver); + assert(tmp != NULL); + vpkgname = xbps_pkg_name(tmp); + free(tmp); + } else { + vpkgname = xbps_pkg_name(vpkgver); + } if (vpkgname == NULL) break; if (bypattern) { diff --git a/lib/plist_match.c b/lib/plist_match.c index c3fb89b6..014f5784 100644 --- a/lib/plist_match.c +++ b/lib/plist_match.c @@ -63,15 +63,27 @@ xbps_match_any_virtualpkg_in_rundeps(prop_array_t rundeps, prop_array_t provides) { const char *vpkgver, *pkgpattern; + char *tmp; size_t i, x; for (i = 0; i < prop_array_count(provides); i++) { + tmp = NULL; prop_array_get_cstring_nocopy(provides, i, &vpkgver); + if (strchr(vpkgver, '_') == NULL) { + tmp = xbps_xasprintf("%s_1", vpkgver); + assert(tmp != NULL); + vpkgver = tmp; + } for (x = 0; x < prop_array_count(rundeps); x++) { prop_array_get_cstring_nocopy(rundeps, x, &pkgpattern); - if (xbps_pkgpattern_match(vpkgver, pkgpattern)) + if (xbps_pkgpattern_match(vpkgver, pkgpattern)) { + if (tmp != NULL) + free(tmp); return true; + } } + if (tmp != NULL) + free(tmp); } return false; } @@ -82,7 +94,7 @@ match_string_in_array(prop_array_t array, const char *str, int mode) prop_object_iterator_t iter; prop_object_t obj; const char *pkgdep; - char *curpkgname; + char *curpkgname, *tmp; bool found = false; assert(prop_object_type(array) == PROP_TYPE_ARRAY); @@ -93,7 +105,7 @@ match_string_in_array(prop_array_t array, const char *str, int mode) return false; while ((obj = prop_object_iterator_next(iter))) { - assert(prop_object_type(obj) == PROP_TYPE_STRING); + tmp = NULL; if (mode == 0) { /* match by string */ if (prop_string_equals_cstring(obj, str)) { @@ -103,7 +115,14 @@ match_string_in_array(prop_array_t array, const char *str, int mode) } else if (mode == 1) { /* match by pkgname */ pkgdep = prop_string_cstring_nocopy(obj); - curpkgname = xbps_pkg_name(pkgdep); + if (strchr(pkgdep, '_') == NULL) { + tmp = xbps_xasprintf("%s_1", pkgdep); + assert(tmp != NULL); + curpkgname = xbps_pkg_name(tmp); + free(tmp); + } else { + curpkgname = xbps_pkg_name(pkgdep); + } if (curpkgname == NULL) break; if (strcmp(curpkgname, str) == 0) { @@ -115,17 +134,36 @@ match_string_in_array(prop_array_t array, const char *str, int mode) } else if (mode == 2) { /* match pkgpattern against pkgdep */ pkgdep = prop_string_cstring_nocopy(obj); + if (strchr(pkgdep, '_') == NULL) { + tmp = xbps_xasprintf("%s_1", pkgdep); + assert(tmp != NULL); + pkgdep = tmp; + } if (xbps_pkgpattern_match(pkgdep, str)) { + if (tmp != NULL) + free(tmp); found = true; break; } + if (tmp != NULL) + free(tmp); + } else if (mode == 3) { /* match pkgdep against pkgpattern */ pkgdep = prop_string_cstring_nocopy(obj); + if (strchr(pkgdep, '_') == NULL) { + tmp = xbps_xasprintf("%s_1", pkgdep); + assert(tmp != NULL); + pkgdep = tmp; + } if (xbps_pkgpattern_match(str, pkgdep)) { + if (tmp != NULL) + free(tmp); found = true; break; } + if (tmp != NULL) + free(tmp); } } prop_object_iterator_release(iter); diff --git a/lib/transaction_ops.c b/lib/transaction_ops.c index 684b4930..b2f67c9d 100644 --- a/lib/transaction_ops.c +++ b/lib/transaction_ops.c @@ -241,8 +241,6 @@ xbps_transaction_install_pkg(const char *pkg, bool reinstall) { prop_dictionary_t pkgd; pkg_state_t state; - size_t len, i; - char *pkgname, *pkgstr = NULL; bool bypattern, best, exact; int rv; @@ -250,7 +248,7 @@ xbps_transaction_install_pkg(const char *pkg, bool reinstall) bypattern = true; best = false; exact = false; - } else if (strchr(pkg, '=')) { + } else if (xbps_pkg_name(pkg)) { exact = true; bypattern = false; best = false; @@ -260,29 +258,7 @@ xbps_transaction_install_pkg(const char *pkg, bool reinstall) best = true; } - if (exact) { - /* find out pkgname */ - pkgname = strdup(pkg); - assert(pkgname != NULL); - len = strcspn(pkg, "="); - for (i = 0; i < len; i++) - pkgname[i] = pkg[i]; - pkgname[i] = '\0'; - pkgd = xbps_pkgdb_get_pkgd(pkgname, false); - free(pkgname); - /* replace equal with an hyphen */ - pkgstr = strdup(pkg); - for (i = 0; i < strlen(pkgstr); i++) { - if (pkgstr[i] == '=') { - pkgstr[i] = '-'; - break; - } - } - } else { - pkgd = xbps_pkgdb_get_pkgd(pkg, bypattern); - } - - if (pkgd != NULL) { + if ((pkgd = xbps_pkgdb_get_pkgd(pkg, bypattern)) != NULL) { if (xbps_pkg_state_dictionary(pkgd, &state) != 0) { prop_object_release(pkgd); return EINVAL; @@ -293,11 +269,7 @@ xbps_transaction_install_pkg(const char *pkg, bool reinstall) return EEXIST; } } - rv = transaction_find_pkg(pkgstr ? pkgstr : pkg, bypattern, - best, exact, TRANS_INSTALL); - if (pkgstr != NULL) - free(pkgstr); - + rv = transaction_find_pkg(pkg, bypattern, best, exact, TRANS_INSTALL); return rv; } diff --git a/lib/util.c b/lib/util.c index 35814f11..1e69958c 100644 --- a/lib/util.c +++ b/lib/util.c @@ -102,67 +102,61 @@ xbps_check_is_installed_pkg_by_name(const char *pkgname) assert(pkgname != NULL); - pkgd = xbps_find_virtualpkg_dict_installed(pkgname, false); - if (prop_object_type(pkgd) == PROP_TYPE_DICTIONARY) { - prop_object_release(pkgd); - return true; - } + if (((pkgd = xbps_find_pkg_dict_installed(pkgname, false)) == NULL) && + ((pkgd = xbps_find_virtualpkg_dict_installed(pkgname, false)) == NULL)) + return false; - return false; + prop_object_release(pkgd); + return true; } const char * xbps_pkg_version(const char *pkg) { - const char *tmp; + const char *p; - assert(pkg != NULL); - - /* Get the required version */ - tmp = strrchr(pkg, '-'); - if (tmp == NULL) + if ((p = strrchr(pkg, '-')) == NULL) return NULL; - return tmp + 1; /* skip first '-' */ + if (strrchr(p, '_') == NULL) + return NULL; + + return p + 1; /* skip first '_' */ } const char * xbps_pkg_revision(const char *pkg) { - const char *tmp; + const char *p; assert(pkg != NULL); /* Get the required revision */ - tmp = strrchr(pkg, '_'); - if (tmp == NULL) + if ((p = strrchr(pkg, '_')) == NULL) return NULL; - return tmp + 1; /* skip first '_' */ + return p + 1; /* skip first '_' */ } char * xbps_pkg_name(const char *pkg) { - const char *tmp; - char *pkgname; - size_t len = 0; + const char *p; + char *buf; + size_t len; - assert(pkg != NULL); - - /* Get package name */ - tmp = strrchr(pkg, '-'); - if (tmp == NULL) + if ((p = strrchr(pkg, '-')) == NULL) return NULL; - len = strlen(pkg) - strlen(tmp) + 1; - pkgname = malloc(len); - if (pkgname == NULL) + if (strrchr(p, '_') == NULL) return NULL; - strlcpy(pkgname, pkg, len); + len = strlen(pkg) - strlen(p) + 1; + buf = malloc(len); + assert(buf != NULL); + strlcpy(buf, pkg, len); - return pkgname; + return buf; } char * @@ -173,8 +167,7 @@ xbps_pkgpattern_name(const char *pkg) assert(pkg != NULL); - res = strpbrk(pkg, "><*?[]"); - if (res == NULL) + if ((res = strpbrk(pkg, "><*?[]")) == NULL) return NULL; len = strlen(pkg) - strlen(res) + 1; @@ -182,9 +175,7 @@ xbps_pkgpattern_name(const char *pkg) len--; pkgname = malloc(len); - if (pkgname == NULL) - return NULL; - + assert(pkgname != NULL); strlcpy(pkgname, pkg, len); return pkgname; @@ -193,15 +184,9 @@ xbps_pkgpattern_name(const char *pkg) const char * xbps_pkgpattern_version(const char *pkg) { - char *res; - assert(pkg != NULL); - res = strpbrk(pkg, "><*?[]"); - if (res == NULL) - return NULL; - - return res; + return strpbrk(pkg, "><*?[]"); } static char * diff --git a/tests/libxbps/plist_find_dictionary/main.c b/tests/libxbps/plist_find_dictionary/main.c index 934a1533..e0523b03 100644 --- a/tests/libxbps/plist_find_dictionary/main.c +++ b/tests/libxbps/plist_find_dictionary/main.c @@ -38,21 +38,21 @@ static const char dictxml[] = " pkgname\n" " afoo\n" " version\n" -" 1.1\n" +" 1.1_1\n" " pkgver\n" -" afoo-1.1\n" +" afoo-1.1_1\n" " provides\n" " \n" -" virtualpkg-9999\n" +" virtualpkg-9999_1\n" " \n" " \n" " \n" " pkgname\n" " foo\n" " version\n" -" 2.0\n" +" 2.0_1\n" " pkgver\n" -" foo-2.0\n" +" foo-2.0_1\n" " \n" " \n" "\n" @@ -105,7 +105,7 @@ ATF_TC_BODY(find_pkg_in_dict_by_pkgver_test, tc) ATF_REQUIRE_EQ(prop_object_type(d), PROP_TYPE_DICTIONARY); /* exact match by pkgver */ - dr = xbps_find_pkg_in_dict_by_pkgver(d, "packages", "foo-2.0"); + dr = xbps_find_pkg_in_dict_by_pkgver(d, "packages", "foo-2.0_1"); ATF_REQUIRE_EQ(prop_object_type(dr), PROP_TYPE_DICTIONARY); } @@ -123,10 +123,15 @@ ATF_TC_BODY(find_virtualpkg_in_dict_by_pattern_test, tc) ATF_REQUIRE_EQ(prop_object_type(d), PROP_TYPE_DICTIONARY); /* match virtualpkg by pattern */ - dr = xbps_find_virtualpkg_in_dict_by_pattern(d, "packages", "virtualpkg<=9999"); + dr = xbps_find_virtualpkg_in_dict_by_pattern(d, "packages", "virtualpkg>=9999"); ATF_REQUIRE_EQ(prop_object_type(dr), PROP_TYPE_DICTIONARY); prop_dictionary_get_cstring_nocopy(dr, "pkgver", &pkgver); - ATF_REQUIRE_STREQ(pkgver, "afoo-1.1"); + ATF_REQUIRE_STREQ(pkgver, "afoo-1.1_1"); + + dr = xbps_find_virtualpkg_in_dict_by_pattern(d, "packages", "virtualpkg<=9999_1"); + ATF_REQUIRE_EQ(prop_object_type(dr), PROP_TYPE_DICTIONARY); + prop_dictionary_get_cstring_nocopy(dr, "pkgver", &pkgver); + ATF_REQUIRE_STREQ(pkgver, "afoo-1.1_1"); } ATF_TC(find_virtualpkg_in_dict_by_name_test); @@ -146,7 +151,7 @@ ATF_TC_BODY(find_virtualpkg_in_dict_by_name_test, tc) dr = xbps_find_virtualpkg_in_dict_by_name(d, "packages", "virtualpkg"); ATF_REQUIRE_EQ(prop_object_type(dr), PROP_TYPE_DICTIONARY); prop_dictionary_get_cstring_nocopy(dr, "pkgver", &pkgver); - ATF_REQUIRE_STREQ(pkgver, "afoo-1.1"); + ATF_REQUIRE_STREQ(pkgver, "afoo-1.1_1"); } ATF_TP_ADD_TCS(tp) diff --git a/tests/libxbps/plist_match/main.c b/tests/libxbps/plist_match/main.c index 3f9349e6..b24f519a 100644 --- a/tests/libxbps/plist_match/main.c +++ b/tests/libxbps/plist_match/main.c @@ -33,8 +33,8 @@ array_init(void) a = prop_array_create(); ATF_REQUIRE(a != NULL); - prop_array_add_cstring_nocopy(a, "foo-2.0"); - prop_array_add_cstring_nocopy(a, "blah-2.1"); + prop_array_add_cstring_nocopy(a, "foo-2.0_1"); + prop_array_add_cstring_nocopy(a, "blah-2.1_1"); return a; } @@ -48,8 +48,8 @@ ATF_TC_HEAD(match_string_test, tc) ATF_TC_BODY(match_string_test, tc) { prop_array_t a = array_init(); - ATF_REQUIRE_EQ(xbps_match_string_in_array(a, "foo-2.0"), true); - ATF_REQUIRE_EQ(xbps_match_string_in_array(a, "foo-2.1"), false); + ATF_REQUIRE_EQ(xbps_match_string_in_array(a, "foo-2.0_1"), true); + ATF_REQUIRE_EQ(xbps_match_string_in_array(a, "foo-2.1_1"), false); } ATF_TC(match_pkgname_test); @@ -87,7 +87,7 @@ ATF_TC_HEAD(match_pkgdep_test, tc) ATF_TC_BODY(match_pkgdep_test, tc) { prop_array_t a = array_init(); - ATF_REQUIRE_EQ(xbps_match_pkgdep_in_array(a, "foo-2.0"), true); + ATF_REQUIRE_EQ(xbps_match_pkgdep_in_array(a, "foo-2.0_1"), true); } ATF_TP_ADD_TCS(tp) diff --git a/tests/libxbps/plist_remove/main.c b/tests/libxbps/plist_remove/main.c index dd095d11..c0480ce1 100644 --- a/tests/libxbps/plist_remove/main.c +++ b/tests/libxbps/plist_remove/main.c @@ -37,17 +37,17 @@ static const char dictxml[] = " pkgname\n" " afoo\n" " version\n" -" 1.1\n" +" 1.1_1\n" " pkgver\n" -" afoo-1.1\n" +" afoo-1.1_1\n" " \n" " \n" " pkgname\n" " foo\n" " version\n" -" 2.0\n" +" 2.0_1\n" " pkgver\n" -" foo-2.0\n" +" foo-2.0_1\n" " \n" " \n" "\n" @@ -64,9 +64,9 @@ static const char dictxml2[] = " pkgname\n" " foo\n" " version\n" -" 2.0\n" +" 2.0_1\n" " pkgver\n" -" foo-2.0\n" +" foo-2.0_1\n" " \n" " \n" "\n" @@ -77,8 +77,8 @@ static const char axml[] = "\n" "\n" "\n" -" foo-1.0\n" -" blah-2.0\n" +" foo-1.0_1\n" +" blah-2.0_1\n" "\n" "\n"; @@ -87,7 +87,7 @@ static const char axml2[] = "\n" "\n" "\n" -" blah-2.0\n" +" blah-2.0_1\n" "\n" "\n"; @@ -156,7 +156,7 @@ ATF_TC_BODY(remove_pkg_from_array_by_pkgver_test, tc) ATF_REQUIRE_EQ(prop_object_type(d2), PROP_TYPE_DICTIONARY); a = prop_dictionary_get(d, "packages"); - ATF_REQUIRE_EQ(xbps_remove_pkg_from_array_by_pkgver(a, "afoo-1.1", NULL), true); + ATF_REQUIRE_EQ(xbps_remove_pkg_from_array_by_pkgver(a, "afoo-1.1_1", NULL), true); ATF_REQUIRE_EQ(prop_dictionary_equals(d, d2), true); } @@ -177,7 +177,7 @@ ATF_TC_BODY(remove_string_from_array_test, tc) a2 = prop_array_internalize(axml2); ATF_REQUIRE_EQ(prop_object_type(a2), PROP_TYPE_ARRAY); - ATF_REQUIRE_EQ(xbps_remove_string_from_array(a, "foo-1.0"), true); + ATF_REQUIRE_EQ(xbps_remove_string_from_array(a, "foo-1.0_1"), true); ATF_REQUIRE_EQ(prop_array_equals(a, a2), true); } diff --git a/tests/libxbps/util/main.c b/tests/libxbps/util/main.c index affdca82..f4a62c70 100644 --- a/tests/libxbps/util/main.c +++ b/tests/libxbps/util/main.c @@ -36,16 +36,23 @@ ATF_TC_HEAD(util_test, tc) ATF_TC_BODY(util_test, tc) { - ATF_REQUIRE_STREQ(xbps_pkg_name("font-adobe-100dpi-7.8"), "font-adobe-100dpi"); + ATF_CHECK_EQ(xbps_pkg_name("font-adobe-100dpi-7.8"), NULL); + ATF_CHECK_EQ(xbps_pkg_version("font-adobe-100dpi"), NULL); + ATF_CHECK_EQ(xbps_pkg_version("font-adobe-100dpi-7.8"), NULL); + ATF_REQUIRE_STREQ(xbps_pkg_name("font-adobe-100dpi-7.8_2"), "font-adobe-100dpi"); ATF_REQUIRE_STREQ(xbps_pkg_name("systemd-43_1"), "systemd"); ATF_REQUIRE_STREQ(xbps_pkg_name("font-adobe-100dpi-1.8_blah"), "font-adobe-100dpi"); + ATF_REQUIRE_STREQ(xbps_pkg_version("font-adobe-100dpi-7.8_2"), "7.8_2"); ATF_REQUIRE_STREQ(xbps_pkg_version("font-adobe-100dpi-1.8_blah"), "1.8_blah"); ATF_REQUIRE_STREQ(xbps_pkg_revision("systemd-43_1_0"), "0"); ATF_REQUIRE_STREQ(xbps_pkg_revision("systemd_21-43_0"), "0"); ATF_REQUIRE_STREQ(xbps_pkgpattern_name("systemd>=43"), "systemd"); - ATF_REQUIRE_STREQ(xbps_pkgpattern_name("systemd>=43"), "systemd"); + ATF_REQUIRE_STREQ(xbps_pkgpattern_name("systemd>43"), "systemd"); + ATF_REQUIRE_STREQ(xbps_pkgpattern_name("systemd<43"), "systemd"); + ATF_REQUIRE_STREQ(xbps_pkgpattern_name("systemd<=43"), "systemd"); ATF_REQUIRE_STREQ(xbps_pkgpattern_name("systemd-[0-9]*"), "systemd"); ATF_REQUIRE_STREQ(xbps_pkgpattern_name("systemd>4[3-9]?"), "systemd"); + ATF_REQUIRE_STREQ(xbps_pkgpattern_name("systemd<4_1?"), "systemd"); } ATF_TP_ADD_TCS(tp)