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=#











