diff options
-rw-r--r-- | gentoobrowse-api/api/portage.ice | 1 | ||||
-rw-r--r-- | gentoobrowse-api/db/schema.sql | 48 | ||||
-rw-r--r-- | gentoobrowse-api/service/portageimpl.cpp | 7 | ||||
-rw-r--r-- | gentoobrowse-api/service/portageimpl.h | 1 | ||||
-rw-r--r-- | gentoobrowse-api/service/sql/portage/getEbuildsByFilter.sql | 4 | ||||
-rw-r--r-- | gentoobrowse-api/unittests/fixtures/ebuilds.dat | 4 | ||||
-rw-r--r-- | gentoobrowse-api/unittests/testPortage.cpp | 29 |
7 files changed, 74 insertions, 20 deletions
diff --git a/gentoobrowse-api/api/portage.ice b/gentoobrowse-api/api/portage.ice index c63b0d9..1366b38 100644 --- a/gentoobrowse-api/api/portage.ice +++ b/gentoobrowse-api/api/portage.ice @@ -31,6 +31,7 @@ module Gentoo { idempotent Packages getUserTrackedPackages(int userid); idempotent Ebuilds getUserTrackedRecentVersions(int userid, int limit); idempotent StringList getPackageUrls(int id); + idempotent Ebuilds getEbuildsByFilter(string filter); idempotent Use getUse(string flag) throws Slicer::NoRowsReturned; idempotent Uses getGlobalUses(); diff --git a/gentoobrowse-api/db/schema.sql b/gentoobrowse-api/db/schema.sql index e449d36..0a5e109 100644 --- a/gentoobrowse-api/db/schema.sql +++ b/gentoobrowse-api/db/schema.sql @@ -105,39 +105,51 @@ ALTER FUNCTION gentoobrowse.textclean(t text) OWNER TO gentoo; -- Name: ebuildfilter(text); Type: FUNCTION; Schema: gentoobrowse; Owner: gentoo CREATE FUNCTION ebuildfilter(atomspec text) RETURNS SETOF integer LANGUAGE plpgsql - AS $_$ + AS $$ declare - op text; - cat text; - pkg text; + parts text[]; ver gentoobrowse.ebuildversion; + matchVerLen boolean = true; begin if (atomspec like '=%*') then atomspec = '~' || substr(atomspec, 2, length(atomspec) - 2); + matchVerLen = false; end if; -op = (regexp_matches(atomspec, '^([^a-z]*)'))[1]; -cat = (regexp_matches(atomspec, '^[^a-z]*([^/]+)/'))[1]; -pkg = (regexp_matches(atomspec, '/(.+?)((-[0-9])|$)'))[1]; -ver = gentoobrowse.ebuildversion_constructor((regexp_matches(atomspec, '-([0-9]+.*)$'))[1]); +parts = regexp_matches(atomspec, + '([[:punct:]]+)?' || -- op + '([[:alnum:]-]+)\/' || -- cat + '(.+?)' || -- package + '(?:-([0-9][.0-9]*[[:alpha:]]?\*?(?:(?:_(?:alpha|beta|pre|rc|p))?[[:digit:]]*)*(?:-r[[:digit:]]+)?))?' || -- version + '(?::([^/ []+(?:\/[^ []+)?))?'); -- slot +ver = gentoobrowse.ebuildversion_constructor(parts[4]); return query select ebuildid from gentoobrowse.ebuilds e, gentoobrowse.packages p, gentoobrowse.categories c where e.packageid = p.packageid and p.categoryid = c.categoryid -and p.name = pkg -and c.name = cat +and p.name = parts[3] +and c.name = parts[2] and case - when op = '=' then e.versioninst = ver - when op = '>=' then e.versioninst >= ver - when op = '<=' then e.versioninst <= ver - when op = '<' then e.versioninst < ver - when op = '>' then e.versioninst > ver - when op = '~' then gentoobrowse.ebuildversionrange(e.versioninst, ver) - when op = '' then true + when parts[1] = '=' then e.versioninst = ver + when parts[1] = '>=' then e.versioninst >= ver + when parts[1] = '<=' then e.versioninst <= ver + when parts[1] = '<' then e.versioninst < ver + when parts[1] = '>' then e.versioninst > ver + when parts[1] = '~' and not matchVerLen then + gentoobrowse.ebuildversionrange(e.versioninst, ver) + when parts[1] = '~' and matchVerLen then + gentoobrowse.ebuildversionrange(e.versioninst, ver) + and array_length(ver.ver, 1) = array_length((e.versioninst).ver, 1) + when parts[1] is null then true else false end +and case + when parts[5] is null then true + when position('/' in parts[5]) > 0 then e.slot = parts[5] + else split_part(e.slot, '/', 1) = parts[5] +end ; end; -$_$; +$$; ALTER FUNCTION gentoobrowse.ebuildfilter(atomspec text) OWNER TO gentoo; -- Name: ebuildversion_constructor(text); Type: FUNCTION; Schema: gentoobrowse; Owner: gentoo CREATE FUNCTION ebuildversion_constructor(val text) RETURNS ebuildversion diff --git a/gentoobrowse-api/service/portageimpl.cpp b/gentoobrowse-api/service/portageimpl.cpp index d74de73..1885952 100644 --- a/gentoobrowse-api/service/portageimpl.cpp +++ b/gentoobrowse-api/service/portageimpl.cpp @@ -24,6 +24,7 @@ #include <sql/portage/getPackagesDepending.sql.h> #include <sql/portage/getPackageMasks.sql.h> #include <sql/portage/getPackageUses.sql.h> +#include <sql/portage/getEbuildsByFilter.sql.h> #include <sql/portage/getUse.sql.h> #include <sql/portage/getGlobalUses.sql.h> #include <sql/portage/getGroupUses.sql.h> @@ -174,6 +175,12 @@ Portage::getPackageUrls(Ice::Int id, const Ice::Current &) return fetchCache<Gentoo::StringList>(sql::portage::getPackageUrls, 30, id); } +Gentoo::Ebuilds +Portage::getEbuildsByFilter(const std::string & filter, const Ice::Current &) +{ + return fetchCache<Gentoo::Ebuilds>(sql::portage::getEbuildsByFilter, 30, filter); +} + Gentoo::Categories Portage::getCategoriesWithRecentAdditions(Ice::Int syncDays, const Ice::Current &) { diff --git a/gentoobrowse-api/service/portageimpl.h b/gentoobrowse-api/service/portageimpl.h index 4d60b19..42459c2 100644 --- a/gentoobrowse-api/service/portageimpl.h +++ b/gentoobrowse-api/service/portageimpl.h @@ -38,6 +38,7 @@ class DLL_PUBLIC Portage : public Gentoo::Portage, IceTray::AbstractCachingDatab Gentoo::Packages getUserTrackedPackages(Ice::Int userid, const Ice::Current &) override; Gentoo::Ebuilds getUserTrackedRecentVersions(Ice::Int userid, Ice::Int limit, const Ice::Current &) override; Gentoo::StringList getPackageUrls(Ice::Int id, const Ice::Current &) override; + Gentoo::Ebuilds getEbuildsByFilter(const std::string &, const Ice::Current &) override; Gentoo::UsePtr getUse(const std::string &, const Ice::Current &) override; Gentoo::Uses getGlobalUses(const Ice::Current &) override; diff --git a/gentoobrowse-api/service/sql/portage/getEbuildsByFilter.sql b/gentoobrowse-api/service/sql/portage/getEbuildsByFilter.sql new file mode 100644 index 0000000..ce49210 --- /dev/null +++ b/gentoobrowse-api/service/sql/portage/getEbuildsByFilter.sql @@ -0,0 +1,4 @@ +SELECT e.ebuildid, e.packageid, e.repoid, e.version, e.slot, e.firstseen, e.moddate, e.license +FROM gentoobrowse.ebuildfilter(?) f, gentoobrowse.ebuilds e +WHERE f = e.ebuildid +ORDER BY e.versioninst diff --git a/gentoobrowse-api/unittests/fixtures/ebuilds.dat b/gentoobrowse-api/unittests/fixtures/ebuilds.dat index 120c41d..8f73e95 100644 --- a/gentoobrowse-api/unittests/fixtures/ebuilds.dat +++ b/gentoobrowse-api/unittests/fixtures/ebuilds.dat @@ -50,8 +50,8 @@ 628106 49039 0.8 ("{0,8}",@,0,0,0) 0 GPL-3 2015-08-06 22:44:41.026233 2015-08-10 02:08:09 17 628102 49039 0.5.1 ("{0,5,1}",@,0,0,0) 0 GPL-2 2015-08-06 22:44:41.026233 2015-11-09 05:07:18 17 628955 58252 5.20141231 ("{5,20141231}",@,0,0,0) 0 GPL-3 2015-08-06 22:44:41.026233 2015-12-01 15:10:49 17 -628959 51120 2.10.0-r1 ("{2,10,0}",@,0,0,1) 0/2.10.0 GPL-2 2015-08-06 22:44:41.026233 2015-12-01 15:10:48 17 -628964 51120 2.10.1 ("{2,10,1}",@,0,0,0) 0/2.10.1 GPL-2 2015-08-06 22:44:41.026233 2015-12-01 15:10:48 17 +628959 51120 2.10.0-r1 ("{2,10,0}",@,0,0,1) 1/2.10.0 GPL-2 2015-08-06 22:44:41.026233 2015-12-01 15:10:48 17 +628964 51120 2.10.1 ("{2,10,1}",@,0,0,0) 1/2.10.1 GPL-2 2015-08-06 22:44:41.026233 2015-12-01 15:10:48 17 628966 58252 5.20150710 ("{5,20150710}",@,0,0,0) 0 GPL-3 2015-08-06 22:44:41.026233 2015-12-01 15:10:49 17 616719 49424 3.5 ("{3,5}",@,0,0,0) 0 BSD 2015-08-06 22:44:41.026233 2015-11-09 05:07:18 17 616713 49732 4.3 ("{4,3}",@,0,0,0) 0 public-domain GPL-2 2015-08-06 22:44:41.026233 2015-08-10 02:08:21 17 diff --git a/gentoobrowse-api/unittests/testPortage.cpp b/gentoobrowse-api/unittests/testPortage.cpp index 5386e1a..149949f 100644 --- a/gentoobrowse-api/unittests/testPortage.cpp +++ b/gentoobrowse-api/unittests/testPortage.cpp @@ -194,6 +194,35 @@ BOOST_AUTO_TEST_CASE( getPackageVersions ) BOOST_REQUIRE_EQUAL(629067, es.back()->ebuildid); } +BOOST_AUTO_TEST_CASE( getEbuildsByFilter ) +{ + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("dev-vcs/darcs").size(), 7); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("~dev-vcs/darcs-2").size(), 0); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("~dev-vcs/darcs-2.8").size(), 0); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("~dev-vcs/darcs-2.8.4").size(), 3); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("~dev-vcs/darcs-2.10.0").size(), 1); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("~dev-vcs/darcs-2.10.1").size(), 1); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("<dev-vcs/darcs-3").size(), 7); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter(">dev-vcs/darcs-2").size(), 7); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter(">dev-vcs/darcs-2.10").size(), 2); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("<dev-vcs/darcs-2.10").size(), 5); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("=dev-vcs/darcs-2.8.4*").size(), 3); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("=dev-vcs/darcs-2.8*").size(), 5); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("=dev-vcs/darcs-2.8").size(), 0); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("=dev-vcs/darcs-2.8.4").size(), 1); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("=dev-vcs/darcs-2.8.5").size(), 0); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("=dev-vcs/darcs-2.8.5-r3").size(), 1); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("<=dev-vcs/darcs-2.8.4-r3").size(), 2); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("<=dev-vcs/darcs-2.8.4-r6").size(), 3); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter(">=dev-vcs/darcs-2.8.5-r4").size(), 3); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter(">=dev-vcs/darcs-2.8.5-r3").size(), 4); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("<=dev-vcs/darcs-2.8.5-r3:0/2.8.5").size(), 1); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("<=dev-vcs/darcs-2.8.5-r3:0").size(), 4); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("<=dev-vcs/darcs-2.8.5-r3:1").size(), 0); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("dev-vcs/darcs:1").size(), 2); + BOOST_REQUIRE_EQUAL(p->getEbuildsByFilter("dev-vcs/darcs:0").size(), 5); +} + BOOST_AUTO_TEST_CASE( getPackageVersionDetails ) { auto es = p->getPackageVersionDetails(58252); |