Packages – how is this data stored?

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=# 
Website Pin Facebook Twitter Myspace Friendfeed Technorati del.icio.us Digg Google StumbleUpon Premium Responsive

Leave a Comment

Scroll to Top