using INDEX to find PORTVERSION deviations

This post delves into using /usr/ports/INDEX from the FreeBSD port tree for use in solving the http://Mk/bsd.default-versions.mk problem and related issues.

This work was saved on pro05.

I have a script which creates a tab-delimited file from INDEX. The fields are:

origin PKGVERSION PKGNAME

For example:

accessibility/accerciser	accerciser-3.48.0	accerciser

Some notes

  1. INDEX carries one line per flavor, so a flavored port appears several times under one origin.
  2. Some packages have OSVERSION baked into the version:
    open-vm-kmod-13.1.0.1501502,2   vs   open-vm-kmod-13.1.0,2
    arduino-1.0.6.1501502_8,1       vs   arduino-1.0.6_8,1
    

    Those will differ forever unless the INDEX is generated in the same jail FreshPorts refreshes in.

Creating the file

[18:25 dev-ingress01 dvl /usr/local/libexec/freshports] % time python index_pkgversions.py > ~/tmp/INDEX-15.tsv
index_pkgversions.py: 38835 rows, 35192 origins, 0 malformed lines
python index_pkgversions.py > ~/tmp/INDEX-15.tsv  0.32s user 0.03s system 99% cpu 0.352 total
[18:25 dev-ingress01 dvl /usr/local/libexec/freshports] % 
[18:25 dev-ingress01 dvl /usr/local/libexec/freshports] % wc -l ~/tmp/INDEX-15.tsv
   38835 /usr/home/dvl/tmp/INDEX-15.tsv
[18:27 dev-ingress01 dvl /usr/local/libexec/freshports] % scp ~/tmp/INDEX-15.tsv pg01:
INDEX-15.tsv               100% 2301KB 287.2MB/s   00:00

Over on the database server:

[18:29 pg01 dvl ~] % psql freshports.dev
psql (18.6)
Type "help" for help.

freshports.dev=# CREATE TEMP TABLE index_ports (
    origin       text NOT NULL,
    pkgname      text NOT NULL,
    package_name text NOT NULL
);
CREATE TABLE
freshports.dev=# \copy index_ports FROM 'index-15.tsv';
COPY 35174
freshports.dev=# CREATE INDEX ON index_ports (origin, pkgname);
CREATE INDEX
freshports.dev=# ANALYZE index_ports;
ANALYZE
freshports.dev=# 

Creating the results:

freshports.dev=# \o results.txt
freshports.dev=# WITH fp AS (
    SELECT pa.category || '/' || pa.name AS origin,
           pa.package_name || '-' || pa.version
             || CASE WHEN COALESCE(pa.revision,  '') NOT IN ('', '0')
                     THEN '_' || pa.revision  ELSE '' END
             || CASE WHEN COALESCE(pa.portepoch, '') NOT IN ('', '0')
                     THEN ',' || pa.portepoch ELSE '' END AS pkgname
      FROM ports_active pa
     WHERE element_pathname(pa.element_id) LIKE '/ports/head/%'
),
idx AS (
    SELECT origin,
           count(*) AS packages,
           string_agg(pkgname, ' ' ORDER BY pkgname) AS pkgnames
      FROM index_ports
     GROUP BY origin
)
SELECT COALESCE(fp.origin, idx.origin) AS origin,
       CASE WHEN fp.origin  IS NULL THEN 'not in FreshPorts'
            WHEN idx.origin IS NULL THEN 'not in INDEX'
            ELSE 'no matching package'
       END AS difference,
       fp.pkgname   AS freshports_pkgname,
       idx.packages AS index_packages,
       idx.pkgnames AS index_pkgnames
  FROM fp
  FULL OUTER JOIN idx ON idx.origin = fp.origin
 WHERE fp.origin  IS NULL
    OR idx.origin IS NULL
    OR NOT EXISTS (SELECT 1 FROM index_ports i
                    WHERE i.origin  = fp.origin
                      AND i.pkgname = fp.pkgname)
 ORDER BY difference, origin;
freshports.dev=# 
\q
[19:13 pg01 dvl ~] % wc -l results.txt 
    4847 results.txt

Continuing on from that initial work

It has been several days since the above was written. The script and approach has evolved considerably. These are the steps for find the diverging ports:

determine the latest port commit, call it the Target Commit (TC)
on the ports freshports do
git fetch
git checkout TC
done

run: ./compare-index.sh -b -c TC (this will also do a git fetch and git checkout)

Here’s my sample run from 2026-09-27:

First, get the trees in sync:

[12:19 stage-ingress01 dvl ~] % sudo service freshports stop
Stopping freshports.
Waiting for PIDS: 55051.
[12:20 dev-ingress01 dvl ~] % cd /jails/index/usr/ports
[13:10 dev-ingress01 dvl /jails/index/usr/ports] % sudo git checkout 44da815
error: pathspec '44da815' did not match any file(s) known to git
[13:10 dev-ingress01 dvl /jails/index/usr/ports] % sudo git fetch
remote: Enumerating objects: 33, done.
remote: Counting objects: 100% (33/33), done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 21 (delta 12), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (21/21), 4.24 KiB | 309.00 KiB/s, done.
From https://git.FreeBSD.org/ports
   531bc6b3adc1..44da815c7dcc  main       -> origin/main
[13:11 dev-ingress01 dvl /jails/index/usr/ports] % sudo git checkout 44da815
Updating files: 100% (31170/31170), done.
Previous HEAD position was dff2312cf5f8 mail/rmilter: Mark deprecated
HEAD is now at 44da815c7dcc multimedia/minisatip: Update to 2.0.116
[13:11 dev-ingress01 dvl /jails/index/usr/ports] % cd -
/jails/freshports/usr/ports
[13:11 dev-ingress01 dvl /jails/freshports/usr/ports] % sudo git checkout 44da815
HEAD is now at 44da815c7dcc multimedia/minisatip: Update to 2.0.116
[13:11 dev-ingress01 dvl /jails/freshports/usr/ports] % sudo git fetch           
[13:11 dev-ingress01 dvl /jails/freshports/usr/ports] % sudo git checkout 44da815
HEAD is now at 44da815c7dcc multimedia/minisatip: Update to 2.0.116
[13:11 dev-ingress01 dvl /jails/freshports/usr/ports] % sudo service freshports start
Starting freshports.
[13:50 dev-ingress01 dvl /jails/freshports/usr/ports] % 

Then, as the freshports user:

$ ./compare-index.sh -b
./compare-index.sh: building the INDEX from /jails/index/usr/ports as it stands, no commit given
./compare-index.sh: building the INDEX in jail index
Generating INDEX-15 - please wait..--- describe.accessibility ---
--- describe.arabic ---
--- describe.archivers ---
--- describe.astro ---
--- describe.audio ---
--- describe.benchmarks ---
--- describe.biology ---
--- describe.cad ---
--- describe.chinese ---
--- describe.comms ---
--- describe.converters ---
--- describe.databases ---
--- describe.deskutils ---
--- describe.devel ---
--- describe.dns ---
--- describe.editors ---
--- describe.emulators ---
--- describe.finance ---
--- describe.french ---
--- describe.filesystems ---
--- describe.ftp ---
--- describe.games ---
--- describe.german ---
--- describe.graphics ---
--- describe.hebrew ---
--- describe.hungarian ---
--- describe.irc ---
--- describe.japanese ---
--- describe.java ---
--- describe.korean ---
--- describe.lang ---
--- describe.mail ---
--- describe.math ---
--- describe.misc ---
--- describe.multimedia ---
--- describe.net ---
--- describe.net-im ---
--- describe.net-mgmt ---
--- describe.net-p2p ---
--- describe.news ---
--- describe.polish ---
--- describe.ports-mgmt ---
--- describe.portuguese ---
--- describe.print ---
--- describe.russian ---
--- describe.science ---
--- describe.security ---
--- describe.shells ---
--- describe.sysutils ---
--- describe.textproc ---
--- describe.ukrainian ---
--- describe.vietnamese ---
--- describe.www ---
--- describe.x11 ---
--- describe.x11-clocks ---
--- describe.x11-drivers ---
--- describe.x11-fm ---
--- describe.x11-fonts ---
--- describe.x11-servers ---
--- describe.x11-themes ---
--- describe.x11-toolkits ---
--- describe.x11-wm ---
 Done../compare-index.sh: INDEX /jails/index/usr/ports/INDEX-15 md5 fd1ebf3802c177b36e14a7262bdeeda3, previously b3625a7dc7924e55bc9df2206e6acd5c
./compare-index.sh: INDEX changed, processing
index_pkgversions.py: 38881 rows, 35234 origins, 0 malformed lines
./compare-index.sh: 38881 packages read from the INDEX
./compare-index.sh: 38881 rows loaded and compared
0	/var/db/freshports/cache/spooling/refresh.txt
0	/var/db/freshports/cache/spooling/not-in-index.txt
0	/var/db/freshports/cache/spooling/not-in-freshports.txt
$ 
Website Pin Facebook Twitter Myspace Friendfeed Technorati del.icio.us Digg Google StumbleUpon Premium Responsive

Leave a Comment

Scroll to Top