This post documents what I recently put into a gist on Github. It should serve as a rough introduction to how FreshPorts handles packages extracted from packagesite.yaml files.
All the platforms
These are the plaforms (also known as ABI) for which we are monitoring packages created by the FreeBSD project.
They relate to URLs found here: https://pkg.freebsd.org
For each ABI two repos are built, each based off a different code repository:
* latest (head)
* quarterly (now 2020Q2)
Quarterly branches are designed to “provide users with a more predictable and stable experience for port and package installation and upgrades. This is done essentially by only allowing non-feature updates.”
This is the abi data:
freshports.dev=# select * from abi; id | name | active ----+--------------------+-------- 1 | FreeBSD:12:amd64 | t 2 | FreeBSD:13:aarch64 | t 4 | FreeBSD:11:i386 | t 6 | FreeBSD:11:amd64 | t 7 | FreeBSD:11:aarch64 | t 8 | FreeBSD:12:i386 | t 9 | FreeBSD:12:aarch64 | t 10 | FreeBSD:13:i386 | t 11 | FreeBSD:13:amd64 | t (9 rows) freshports.dev=# \d abi Table "public.abi" Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+------------------------------ id | integer | | not null | generated always as identity name | text | | not null | active | boolean | | not null | true Indexes: "abi_pkey" PRIMARY KEY, btree (id) "abi_name_idx" UNIQUE, btree (name) Referenced by: TABLE "packages" CONSTRAINT "packages_abi_id_fk" FOREIGN KEY (abi_id) REFERENCES abi(id) NOT VALID TABLE "packages_last_checked" CONSTRAINT "packages_last_checked_abi_id_fk" FOREIGN KEY (abi_id) REFERENCES abi(id) freshports.dev=#
What packages exist for a given port?
The packages table contains information taken from packagesite.yaml found at https://pkg.freebsd.org
Both latest and quarterly are shown.
For this example, we look at the www/py-django-storages port:
This port has three different packges avaiable:
* py27-django-storages
* py36-django-storages
* py37-django-storages
This is not unusual. Many ports have flavors.
For each package_name, I need an outer join from the data below, with the table above (ABI). All ABI values need to
be included for a given package.
The absence of a package for a given ABI is information presented to the user.
freshports.dev=# select * from packages where port_id = 28303; id | abi_id | port_id | package_version | package_name | branch_id | branch_name | package_set ---------+--------+---------+-----------------+----------------------+-----------+-------------+------------- 4339245 | 7 | 28303 | 1.5.1 | py36-django-storages | | | latest 4339390 | 7 | 28303 | 1.5.1 | py27-django-storages | | | latest 4340907 | 7 | 28303 | 1.9.1 | py27-django-storages | | | quarterly 4342889 | 7 | 28303 | 1.9.1 | py37-django-storages | | | quarterly 4346104 | 6 | 28303 | 1.9.1 | py37-django-storages | | | latest 4346130 | 6 | 28303 | 1.9.1 | py27-django-storages | | | latest 4349931 | 6 | 28303 | 1.9.1 | py37-django-storages | | | quarterly 4349958 | 6 | 28303 | 1.9.1 | py27-django-storages | | | quarterly 4353741 | 4 | 28303 | 1.9.1 | py27-django-storages | | | latest 4353810 | 4 | 28303 | 1.9.1 | py37-django-storages | | | latest 4357806 | 4 | 28303 | 1.9.1 | py37-django-storages | | | quarterly 4357905 | 4 | 28303 | 1.9.1 | py27-django-storages | | | quarterly 4361337 | 9 | 28303 | 1.5.1 | py36-django-storages | | | latest 4361606 | 9 | 28303 | 1.5.1 | py27-django-storages | | | latest 4363708 | 9 | 28303 | 1.9.1 | py27-django-storages | | | quarterly 4365567 | 9 | 28303 | 1.9.1 | py37-django-storages | | | quarterly 4369003 | 1 | 28303 | 1.9.1 | py27-django-storages | | | latest 4369021 | 1 | 28303 | 1.9.1 | py37-django-storages | | | latest 4373197 | 1 | 28303 | 1.9.1 | py37-django-storages | | | quarterly 4373305 | 1 | 28303 | 1.9.1 | py27-django-storages | | | quarterly 4376671 | 8 | 28303 | 1.9.1 | py27-django-storages | | | latest 4376807 | 8 | 28303 | 1.9.1 | py37-django-storages | | | latest 4380779 | 8 | 28303 | 1.9.1 | py37-django-storages | | | quarterly 4380869 | 8 | 28303 | 1.9.1 | py27-django-storages | | | quarterly 4382725 | 2 | 28303 | 1.8 | py27-django-storages | | | latest 4383395 | 2 | 28303 | 1.8 | py37-django-storages | | | latest 4388136 | 11 | 28303 | 1.9.1 | py37-django-storages | | | latest 4388153 | 11 | 28303 | 1.9.1 | py27-django-storages | | | latest 4392033 | 10 | 28303 | 1.9.1 | py37-django-storages | | | latest 4392074 | 10 | 28303 | 1.9.1 | py27-django-storages | | | latest (30 rows) freshports.dev=# \d packages Table "public.packages" Column | Type | Collation | Nullable | Default -----------------+--------------+-----------+----------+------------------------------ id | bigint | | not null | generated always as identity abi_id | integer | | not null | port_id | integer | | not null | package_version | text | | not null | package_name | text | | not null | branch_id | integer | | | branch_name | text | | | package_set | package_sets | | | Indexes: "packages_pkey" PRIMARY KEY, btree (id) "fki_packages_abi_id_fk" btree (abi_id) "fki_packages_port_id_fk" btree (port_id) "packages_package_name_idx" btree (package_name) Foreign-key constraints: "packages_abi_id_fk" FOREIGN KEY (abi_id) REFERENCES abi(id) NOT VALID "packages_branch_id_fk" FOREIGN KEY (branch_id) REFERENCES system_branch(id) NOT VALID "packages_port_id_fk" FOREIGN KEY (port_id) REFERENCES ports(id) NOT VALID freshports.dev=# freshports.dev=#
What package is on what ABI?
This is a sample OUTER JOIN to get the required data for a single package.
freshports.dev=# SELECT P.*, abi.* FROM abi LEFT OUTER JOIN (SELECT * FROM packages P WHERE P.port_id = 28303 and package_name = 'py36-django-storages') AS P ON abi.id = P.abi_id ; id | abi_id | port_id | package_version | package_name | branch_id | branch_name | package_set | id | name | active ---------+--------+---------+-----------------+----------------------+-----------+-------------+-------------+----+--------------------+-------- | | | | | | | | 1 | FreeBSD:12:amd64 | t | | | | | | | | 2 | FreeBSD:13:aarch64 | t | | | | | | | | 4 | FreeBSD:11:i386 | t | | | | | | | | 6 | FreeBSD:11:amd64 | t 4339245 | 7 | 28303 | 1.5.1 | py36-django-storages | | | latest | 7 | FreeBSD:11:aarch64 | t | | | | | | | | 8 | FreeBSD:12:i386 | t 4361337 | 9 | 28303 | 1.5.1 | py36-django-storages | | | latest | 9 | FreeBSD:12:aarch64 | t | | | | | | | | 10 | FreeBSD:13:i386 | t | | | | | | | | 11 | FreeBSD:13:amd64 | t (9 rows) freshports.dev=#
What does a full set for one port look like?
This repeats the above OUTER JOIN but for all three package names
SELECT P.*, abi.* FROM abi LEFT OUTER JOIN (SELECT * FROM packages P WHERE P.port_id = 28303 and package_name = 'py27-django-storages') AS P ON abi.id = P.abi_id UNION SELECT P.*, abi.* FROM abi LEFT OUTER JOIN (SELECT * FROM packages P WHERE P.port_id = 28303 and package_name = 'py36-django-storages') AS P ON abi.id = P.abi_id UNION SELECT P.*, abi.* FROM abi LEFT OUTER JOIN (SELECT * FROM packages P WHERE P.port_id = 28303 and package_name = 'py37-django-storages') AS P ON abi.id = P.abi_id; id | abi_id | port_id | package_version | package_name | branch_id | branch_name | package_set | id | name | active ---------+--------+---------+-----------------+----------------------+-----------+-------------+-------------+----+--------------------+-------- 4380779 | 8 | 28303 | 1.9.1 | py37-django-storages | | | quarterly | 8 | FreeBSD:12:i386 | t 4373197 | 1 | 28303 | 1.9.1 | py37-django-storages | | | quarterly | 1 | FreeBSD:12:amd64 | t | | | | | | | | 8 | FreeBSD:12:i386 | t 4369003 | 1 | 28303 | 1.9.1 | py27-django-storages | | | latest | 1 | FreeBSD:12:amd64 | t 4340907 | 7 | 28303 | 1.9.1 | py27-django-storages | | | quarterly | 7 | FreeBSD:11:aarch64 | t 4339245 | 7 | 28303 | 1.5.1 | py36-django-storages | | | latest | 7 | FreeBSD:11:aarch64 | t 4357905 | 4 | 28303 | 1.9.1 | py27-django-storages | | | quarterly | 4 | FreeBSD:11:i386 | t | | | | | | | | 1 | FreeBSD:12:amd64 | t 4339390 | 7 | 28303 | 1.5.1 | py27-django-storages | | | latest | 7 | FreeBSD:11:aarch64 | t 4376671 | 8 | 28303 | 1.9.1 | py27-django-storages | | | latest | 8 | FreeBSD:12:i386 | t 4383395 | 2 | 28303 | 1.8 | py37-django-storages | | | latest | 2 | FreeBSD:13:aarch64 | t 4376807 | 8 | 28303 | 1.9.1 | py37-django-storages | | | latest | 8 | FreeBSD:12:i386 | t 4357806 | 4 | 28303 | 1.9.1 | py37-django-storages | | | quarterly | 4 | FreeBSD:11:i386 | t 4363708 | 9 | 28303 | 1.9.1 | py27-django-storages | | | quarterly | 9 | FreeBSD:12:aarch64 | t | | | | | | | | 10 | FreeBSD:13:i386 | t 4365567 | 9 | 28303 | 1.9.1 | py37-django-storages | | | quarterly | 9 | FreeBSD:12:aarch64 | t 4361606 | 9 | 28303 | 1.5.1 | py27-django-storages | | | latest | 9 | FreeBSD:12:aarch64 | t 4361337 | 9 | 28303 | 1.5.1 | py36-django-storages | | | latest | 9 | FreeBSD:12:aarch64 | t | | | | | | | | 4 | FreeBSD:11:i386 | t 4388153 | 11 | 28303 | 1.9.1 | py27-django-storages | | | latest | 11 | FreeBSD:13:amd64 | t 4392074 | 10 | 28303 | 1.9.1 | py27-django-storages | | | latest | 10 | FreeBSD:13:i386 | t 4349958 | 6 | 28303 | 1.9.1 | py27-django-storages | | | quarterly | 6 | FreeBSD:11:amd64 | t 4382725 | 2 | 28303 | 1.8 | py27-django-storages | | | latest | 2 | FreeBSD:13:aarch64 | t 4346130 | 6 | 28303 | 1.9.1 | py27-django-storages | | | latest | 6 | FreeBSD:11:amd64 | t | | | | | | | | 11 | FreeBSD:13:amd64 | t 4353741 | 4 | 28303 | 1.9.1 | py27-django-storages | | | latest | 4 | FreeBSD:11:i386 | t 4392033 | 10 | 28303 | 1.9.1 | py37-django-storages | | | latest | 10 | FreeBSD:13:i386 | t 4353810 | 4 | 28303 | 1.9.1 | py37-django-storages | | | latest | 4 | FreeBSD:11:i386 | t 4349931 | 6 | 28303 | 1.9.1 | py37-django-storages | | | quarterly | 6 | FreeBSD:11:amd64 | t 4342889 | 7 | 28303 | 1.9.1 | py37-django-storages | | | quarterly | 7 | FreeBSD:11:aarch64 | t 4369021 | 1 | 28303 | 1.9.1 | py37-django-storages | | | latest | 1 | FreeBSD:12:amd64 | t | | | | | | | | 6 | FreeBSD:11:amd64 | t 4373305 | 1 | 28303 | 1.9.1 | py27-django-storages | | | quarterly | 1 | FreeBSD:12:amd64 | t 4388136 | 11 | 28303 | 1.9.1 | py37-django-storages | | | latest | 11 | FreeBSD:13:amd64 | t 4346104 | 6 | 28303 | 1.9.1 | py37-django-storages | | | latest | 6 | FreeBSD:11:amd64 | t | | | | | | | | 2 | FreeBSD:13:aarch64 | t 4380869 | 8 | 28303 | 1.9.1 | py27-django-storages | | | quarterly | 8 | FreeBSD:12:i386 | t (37 rows)
A procedure to produce the above
I could not find a way to do the OUTER JOIN on any result set which consisted of more than one package_name.
Since this was written, I now have a single query solution.
I created this function which worked on one package_name at a time.
CREATE OR REPLACE FUNCTION PortPackagesNonPivot(a_port_id integer) RETURNS TABLE(abi text, abi_id integer, package_name text, package_set package_sets, package_version text) LANGUAGE plpgsql STABLE AS $$ DECLARE l_rec RECORD; BEGIN FOR l_rec IN SELECT * FROM PackagesGetPackageNamesForPort(a_port_id) ORDER BY 1 LOOP RETURN QUERY SELECT abi.name, abi.id, l_rec.package_name, P.package_set, P.package_version FROM abi LEFT OUTER JOIN (SELECT * FROM packages P WHERE P.port_id = a_port_id AND P.package_name = l_rec.package_name) AS P ON abi.id = P.abi_id ORDER BY l_rec.package_name, abi.name; END LOOP; END; $$; freshports.dev=# select * from PortPackagesNonPivot(28303); abi | abi_id | package_name | package_set | package_version --------------------+--------+----------------------+-------------+----------------- FreeBSD:11:aarch64 | 7 | py27-django-storages | quarterly | 1.9.1 FreeBSD:11:aarch64 | 7 | py27-django-storages | latest | 1.5.1 FreeBSD:11:amd64 | 6 | py27-django-storages | latest | 1.9.1 FreeBSD:11:amd64 | 6 | py27-django-storages | quarterly | 1.9.1 FreeBSD:11:i386 | 4 | py27-django-storages | latest | 1.9.1 FreeBSD:11:i386 | 4 | py27-django-storages | quarterly | 1.9.1 FreeBSD:12:aarch64 | 9 | py27-django-storages | quarterly | 1.9.1 FreeBSD:12:aarch64 | 9 | py27-django-storages | latest | 1.5.1 FreeBSD:12:amd64 | 1 | py27-django-storages | latest | 1.9.1 FreeBSD:12:amd64 | 1 | py27-django-storages | quarterly | 1.9.1 FreeBSD:12:i386 | 8 | py27-django-storages | quarterly | 1.9.1 FreeBSD:12:i386 | 8 | py27-django-storages | latest | 1.9.1 FreeBSD:13:aarch64 | 2 | py27-django-storages | latest | 1.8 FreeBSD:13:amd64 | 11 | py27-django-storages | latest | 1.9.1 FreeBSD:13:i386 | 10 | py27-django-storages | latest | 1.9.1 FreeBSD:11:aarch64 | 7 | py36-django-storages | latest | 1.5.1 FreeBSD:11:amd64 | 6 | py36-django-storages | | FreeBSD:11:i386 | 4 | py36-django-storages | | FreeBSD:12:aarch64 | 9 | py36-django-storages | latest | 1.5.1 FreeBSD:12:amd64 | 1 | py36-django-storages | | FreeBSD:12:i386 | 8 | py36-django-storages | | FreeBSD:13:aarch64 | 2 | py36-django-storages | | FreeBSD:13:amd64 | 11 | py36-django-storages | | FreeBSD:13:i386 | 10 | py36-django-storages | | FreeBSD:11:aarch64 | 7 | py37-django-storages | quarterly | 1.9.1 FreeBSD:11:amd64 | 6 | py37-django-storages | quarterly | 1.9.1 FreeBSD:11:amd64 | 6 | py37-django-storages | latest | 1.9.1 FreeBSD:11:i386 | 4 | py37-django-storages | latest | 1.9.1 FreeBSD:11:i386 | 4 | py37-django-storages | quarterly | 1.9.1 FreeBSD:12:aarch64 | 9 | py37-django-storages | quarterly | 1.9.1 FreeBSD:12:amd64 | 1 | py37-django-storages | latest | 1.9.1 FreeBSD:12:amd64 | 1 | py37-django-storages | quarterly | 1.9.1 FreeBSD:12:i386 | 8 | py37-django-storages | latest | 1.9.1 FreeBSD:12:i386 | 8 | py37-django-storages | quarterly | 1.9.1 FreeBSD:13:aarch64 | 2 | py37-django-storages | latest | 1.8 FreeBSD:13:amd64 | 11 | py37-django-storages | latest | 1.9.1 FreeBSD:13:i386 | 10 | py37-django-storages | latest | 1.9.1 (37 rows)
Pivot the data
One goal is to put quarterly and latest results onto the same line.
SELECT package_name, abi_id, max(package_version) filter(where package_set = 'latest') AS package_version_latest, max(package_version) filter(where package_set = 'quarterly') AS package_version_quarterly FROM packages WHERE port_id = 28303 GROUP BY package_name, abi_id; package_name | abi_id | package_version_latest | package_version_quarterly ----------------------+--------+------------------------+--------------------------- py27-django-storages | 1 | 1.9.1 | 1.9.1 py27-django-storages | 2 | 1.8 | py27-django-storages | 4 | 1.9.1 | 1.9.1 py27-django-storages | 6 | 1.9.1 | 1.9.1 py27-django-storages | 7 | 1.5.1 | 1.9.1 py27-django-storages | 8 | 1.9.1 | 1.9.1 py27-django-storages | 9 | 1.5.1 | 1.9.1 py27-django-storages | 10 | 1.9.1 | py27-django-storages | 11 | 1.9.1 | py36-django-storages | 7 | 1.5.1 | py36-django-storages | 9 | 1.5.1 | py37-django-storages | 1 | 1.9.1 | 1.9.1 py37-django-storages | 2 | 1.8 | py37-django-storages | 4 | 1.9.1 | 1.9.1 py37-django-storages | 6 | 1.9.1 | 1.9.1 py37-django-storages | 7 | | 1.9.1 py37-django-storages | 8 | 1.9.1 | 1.9.1 py37-django-storages | 9 | | 1.9.1 py37-django-storages | 10 | 1.9.1 | py37-django-storages | 11 | 1.9.1 | (20 rows) freshports.dev=#
Combining the pivot with the data
Hwere I combine the previous two points into one function.
This incorporates additional data from packages_last_checked.
CREATE OR REPLACE FUNCTION PortPackages(a_port_id integer) RETURNS TABLE(package_name text, abi text, package_version_latest text, package_version_quarterly text, last_checked_latest timestamp with time zone, repo_date_latest timestamp with time zone, import_date_latest timestamp with time zone, last_checked_quarterly timestamp with time zone, repo_date_quarterly timestamp with time zone, import_date_quarterly timestamp with time zone) LANGUAGE SQL STABLE AS $$ SELECT P.package_name, P.abi, max(package_version) filter(where P.package_set = 'latest') AS package_version_latest, max(package_version) filter(where P.package_set = 'quarterly') AS package_version_quarterly, max(PLC.last_checked) filter(where PLC.package_set = 'latest') AS last_checked_latest, max(PLC.repo_date) filter(where PLC.package_set = 'latest') AS repo_date_latest, max(PLC.import_date) filter(where PLC.package_set = 'latest') AS import_date_latest, max(PLC.last_checked) filter(where PLC.package_set = 'quarterly') AS last_checked_quarterly, max(PLC.repo_date) filter(where PLC.package_set = 'quarterly') AS repo_date_quarterly, max(PLC.import_date) filter(where PLC.package_set = 'quarterly') AS import_date_quarterly FROM PortPackagesNonPivot(a_port_id) P JOIN packages_last_checked PLC ON P.abi_id = PLC.abi_id GROUP BY P.package_name, P.abi ORDER BY P.package_name, P.abi; $$; freshports.dev=# SELECT * FROM PortPackages(28303); package_name | abi | package_version_latest | package_version_quarterly | last_checked_latest | repo_date_latest | import_date_latest | last_checked_quarterly | repo_date_quarterly | import_date_quarterly | sort_key ----------------------+--------------------+------------------------+---------------------------+-------------------------------+------------------------+-------------------------------+-------------------------------+------------------------+-------------------------------+----------------------------------------- py27-django-storages | FreeBSD:11:aarch64 | 1.5.1 | 1.9.1 | 2020-04-13 14:06:19.662548+00 | 2018-09-29 04:24:00+00 | 2020-04-13 14:09:37.634897+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-07 12:03:00+00 | 2020-04-13 14:09:41.320966+00 | py27-django-storages-FreeBSD:11:aarch64 py27-django-storages | FreeBSD:11:amd64 | 1.9.1 | 1.9.1 | 2020-04-13 14:06:19.662548+00 | 2020-04-11 00:16:00+00 | 2020-04-13 14:09:46.602236+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-12 03:20:00+00 | 2020-04-13 14:09:51.877809+00 | py27-django-storages-FreeBSD:11:amd64 py27-django-storages | FreeBSD:11:i386 | 1.9.1 | 1.9.1 | 2020-04-13 14:06:19.662548+00 | 2020-04-13 05:24:00+00 | 2020-04-13 14:09:56.774418+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-12 02:36:00+00 | 2020-04-13 14:10:01.378743+00 | py27-django-storages-FreeBSD:11:i386 py27-django-storages | FreeBSD:12:aarch64 | 1.5.1 | 1.9.1 | 2020-04-13 14:06:19.662548+00 | 2018-10-11 05:47:00+00 | 2020-04-13 14:10:06.230199+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-12 09:21:00+00 | 2020-04-13 14:10:10.340624+00 | py27-django-storages-FreeBSD:12:aarch64 py27-django-storages | FreeBSD:12:amd64 | 1.9.1 | 1.9.1 | 2020-04-13 14:06:19.662548+00 | 2020-04-11 01:18:00+00 | 2020-04-13 14:10:14.600613+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-12 03:56:00+00 | 2020-04-13 14:10:18.777864+00 | py27-django-storages-FreeBSD:12:amd64 py27-django-storages | FreeBSD:12:i386 | 1.9.1 | 1.9.1 | 2020-04-13 14:06:19.662548+00 | 2020-04-13 06:22:00+00 | 2020-04-13 14:10:22.804925+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-12 03:36:00+00 | 2020-04-13 14:10:26.964927+00 | py27-django-storages-FreeBSD:12:i386 py27-django-storages | FreeBSD:13:aarch64 | 1.8 | | 2020-04-13 14:06:19.662548+00 | 2020-01-04 12:39:00+00 | 2020-04-13 14:10:31.011334+00 | 2020-04-13 14:06:19.662548+00 | | | py27-django-storages-FreeBSD:13:aarch64 py27-django-storages | FreeBSD:13:amd64 | 1.9.1 | | 2020-04-13 14:06:19.662548+00 | 2020-04-11 02:22:00+00 | 2020-04-13 14:10:35.255075+00 | 2020-04-13 14:06:19.662548+00 | | | py27-django-storages-FreeBSD:13:amd64 py27-django-storages | FreeBSD:13:i386 | 1.9.1 | | 2020-04-13 14:06:19.662548+00 | 2020-04-10 23:14:00+00 | 2020-04-13 14:10:39.416529+00 | 2020-04-13 14:06:19.662548+00 | | | py27-django-storages-FreeBSD:13:i386 py36-django-storages | FreeBSD:11:aarch64 | 1.5.1 | | 2020-04-13 14:06:19.662548+00 | 2018-09-29 04:24:00+00 | 2020-04-13 14:09:37.634897+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-07 12:03:00+00 | 2020-04-13 14:09:41.320966+00 | py36-django-storages-FreeBSD:11:aarch64 py36-django-storages | FreeBSD:11:amd64 | | | 2020-04-13 14:06:19.662548+00 | 2020-04-11 00:16:00+00 | 2020-04-13 14:09:46.602236+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-12 03:20:00+00 | 2020-04-13 14:09:51.877809+00 | py36-django-storages-FreeBSD:11:amd64 py36-django-storages | FreeBSD:11:i386 | | | 2020-04-13 14:06:19.662548+00 | 2020-04-13 05:24:00+00 | 2020-04-13 14:09:56.774418+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-12 02:36:00+00 | 2020-04-13 14:10:01.378743+00 | py36-django-storages-FreeBSD:11:i386 py36-django-storages | FreeBSD:12:aarch64 | 1.5.1 | | 2020-04-13 14:06:19.662548+00 | 2018-10-11 05:47:00+00 | 2020-04-13 14:10:06.230199+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-12 09:21:00+00 | 2020-04-13 14:10:10.340624+00 | py36-django-storages-FreeBSD:12:aarch64 py36-django-storages | FreeBSD:12:amd64 | | | 2020-04-13 14:06:19.662548+00 | 2020-04-11 01:18:00+00 | 2020-04-13 14:10:14.600613+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-12 03:56:00+00 | 2020-04-13 14:10:18.777864+00 | py36-django-storages-FreeBSD:12:amd64 py36-django-storages | FreeBSD:12:i386 | | | 2020-04-13 14:06:19.662548+00 | 2020-04-13 06:22:00+00 | 2020-04-13 14:10:22.804925+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-12 03:36:00+00 | 2020-04-13 14:10:26.964927+00 | py36-django-storages-FreeBSD:12:i386 py36-django-storages | FreeBSD:13:aarch64 | | | 2020-04-13 14:06:19.662548+00 | 2020-01-04 12:39:00+00 | 2020-04-13 14:10:31.011334+00 | 2020-04-13 14:06:19.662548+00 | | | py36-django-storages-FreeBSD:13:aarch64 py36-django-storages | FreeBSD:13:amd64 | | | 2020-04-13 14:06:19.662548+00 | 2020-04-11 02:22:00+00 | 2020-04-13 14:10:35.255075+00 | 2020-04-13 14:06:19.662548+00 | | | py36-django-storages-FreeBSD:13:amd64 py36-django-storages | FreeBSD:13:i386 | | | 2020-04-13 14:06:19.662548+00 | 2020-04-10 23:14:00+00 | 2020-04-13 14:10:39.416529+00 | 2020-04-13 14:06:19.662548+00 | | | py36-django-storages-FreeBSD:13:i386 py37-django-storages | FreeBSD:11:aarch64 | | 1.9.1 | 2020-04-13 14:06:19.662548+00 | 2018-09-29 04:24:00+00 | 2020-04-13 14:09:37.634897+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-07 12:03:00+00 | 2020-04-13 14:09:41.320966+00 | py37-django-storages-FreeBSD:11:aarch64 py37-django-storages | FreeBSD:11:amd64 | 1.9.1 | 1.9.1 | 2020-04-13 14:06:19.662548+00 | 2020-04-11 00:16:00+00 | 2020-04-13 14:09:46.602236+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-12 03:20:00+00 | 2020-04-13 14:09:51.877809+00 | py37-django-storages-FreeBSD:11:amd64 py37-django-storages | FreeBSD:11:i386 | 1.9.1 | 1.9.1 | 2020-04-13 14:06:19.662548+00 | 2020-04-13 05:24:00+00 | 2020-04-13 14:09:56.774418+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-12 02:36:00+00 | 2020-04-13 14:10:01.378743+00 | py37-django-storages-FreeBSD:11:i386 py37-django-storages | FreeBSD:12:aarch64 | | 1.9.1 | 2020-04-13 14:06:19.662548+00 | 2018-10-11 05:47:00+00 | 2020-04-13 14:10:06.230199+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-12 09:21:00+00 | 2020-04-13 14:10:10.340624+00 | py37-django-storages-FreeBSD:12:aarch64 py37-django-storages | FreeBSD:12:amd64 | 1.9.1 | 1.9.1 | 2020-04-13 14:06:19.662548+00 | 2020-04-11 01:18:00+00 | 2020-04-13 14:10:14.600613+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-12 03:56:00+00 | 2020-04-13 14:10:18.777864+00 | py37-django-storages-FreeBSD:12:amd64 py37-django-storages | FreeBSD:12:i386 | 1.9.1 | 1.9.1 | 2020-04-13 14:06:19.662548+00 | 2020-04-13 06:22:00+00 | 2020-04-13 14:10:22.804925+00 | 2020-04-13 14:06:19.662548+00 | 2020-04-12 03:36:00+00 | 2020-04-13 14:10:26.964927+00 | py37-django-storages-FreeBSD:12:i386 py37-django-storages | FreeBSD:13:aarch64 | 1.8 | | 2020-04-13 14:06:19.662548+00 | 2020-01-04 12:39:00+00 | 2020-04-13 14:10:31.011334+00 | 2020-04-13 14:06:19.662548+00 | | | py37-django-storages-FreeBSD:13:aarch64 py37-django-storages | FreeBSD:13:amd64 | 1.9.1 | | 2020-04-13 14:06:19.662548+00 | 2020-04-11 02:22:00+00 | 2020-04-13 14:10:35.255075+00 | 2020-04-13 14:06:19.662548+00 | | | py37-django-storages-FreeBSD:13:amd64 py37-django-storages | FreeBSD:13:i386 | 1.9.1 | | 2020-04-13 14:06:19.662548+00 | 2020-04-10 23:14:00+00 | 2020-04-13 14:10:39.416529+00 | 2020-04-13 14:06:19.662548+00 | | | py37-django-storages-FreeBSD:13:i386 (27 rows) freshports.dev=#