automatically know the list of valid ABI
dlangille opened this issue · comments
> The goal: automatically know the list of valid ABI. I like to do as little as possible.
Compiling that list from a script (
/bin/sh
,python
, orperl
) would be helpful.That script would make a great standalone project.
This just in, via: https://lists.freebsd.org/archives/freebsd-hackers/2023-December/002733.html
# fetch https://pkg.freebsd.org/index.html
index.html 3606 B 103 MBps 00s
# grep FreeBSD: index.html | sed -e 's@.*\(FreeBSD:[^ <]*\).*@\1@' | sort
FreeBSD:12:aarch64
FreeBSD:12:amd64
FreeBSD:12:armv6
FreeBSD:12:armv7
FreeBSD:12:i386
FreeBSD:13:aarch64
FreeBSD:13:amd64
FreeBSD:13:armv6
FreeBSD:13:armv7
FreeBSD:13:i386
FreeBSD:13:powerpc
FreeBSD:13:powerpc64
FreeBSD:13:powerpc64le
FreeBSD:14:aarch64
FreeBSD:14:amd64
FreeBSD:14:armv6
FreeBSD:14:armv7
FreeBSD:14:i386
FreeBSD:14:powerpc
FreeBSD:14:powerpc64
FreeBSD:14:powerpc64le
FreeBSD:15:aarch64
FreeBSD:15:amd64
FreeBSD:15:armv6
FreeBSD:15:armv7
FreeBSD:15:i386
FreeBSD:15:powerpc
FreeBSD:15:powerpc64
FreeBSD:15:powerpc64le
Originally posted by @dlangille in #505 (comment)
On 2023-12-31, FreeBSD 12 was removed from the list. Now we have:
[15:42 empty dan ~/tmp] % fetch https://pkg.freebsd.org/index.html
index.html 3068 B 37 MBps 00s
[15:42 empty dan ~/tmp] % grep FreeBSD: index.html | sed -e 's@.*\(FreeBSD:[^ <]*\).*@\1@' | sort
FreeBSD:13:aarch64
FreeBSD:13:amd64
FreeBSD:13:armv6
FreeBSD:13:armv7
FreeBSD:13:i386
FreeBSD:13:powerpc
FreeBSD:13:powerpc64
FreeBSD:13:powerpc64le
FreeBSD:14:aarch64
FreeBSD:14:amd64
FreeBSD:14:armv6
FreeBSD:14:armv7
FreeBSD:14:i386
FreeBSD:14:powerpc
FreeBSD:14:powerpc64
FreeBSD:14:powerpc64le
FreeBSD:15:aarch64
FreeBSD:15:amd64
FreeBSD:15:armv7
FreeBSD:15:powerpc
FreeBSD:15:powerpc64
FreeBSD:15:powerpc64le
Hint for future me:
construct queries from scripts. Dump it to a file. use psql -f
[19:31 dev-ingress01 dan ~/scripts] % cat add-new-abi.sh
#!/bin/sh
ABI=$(./current_list_of_valid_abi.sh)
in_list=''
#echo $ABI
for abi in ${ABI}
do
# echo $abi
if [ "$in_list" == "" ]
then
in_list="('${abi}')"
else
in_list="${in_list}, ('${abi}')"
fi
done
#echo $in_list
query="
with new_and_old as (
WITH current_abi_list as (
select name
from (VALUES $in_list)
v(name))
select current_abi_list.name as name, abi.name as missing from current_abi_list left outer join abi on current_abi_list.name = abi.name)
insert into abi (name)
select name from new_and_old where missing is null;"
echo $query
[19:31 dev-ingress01 dan ~/scripts] % ./add-new-abi.sh
with new_and_old as ( WITH current_abi_list as ( select name from (VALUES ('FreeBSD:13:aarch64'),
('FreeBSD:13:amd64'), ('FreeBSD:13:armv6'), ('FreeBSD:13:armv7'), ('FreeBSD:13:i386'), ('FreeBSD:13:powerpc'),
('FreeBSD:13:powerpc64'), ('FreeBSD:13:powerpc64le'), ('FreeBSD:14:aarch64'), ('FreeBSD:14:amd64'),
('FreeBSD:14:armv6'), ('FreeBSD:14:armv7'), ('FreeBSD:14:i386'), ('FreeBSD:14:powerpc'), ('FreeBSD:14:powerpc64'),
('FreeBSD:14:powerpc64le'), ('FreeBSD:15:aarch64'), ('FreeBSD:15:amd64'), ('FreeBSD:15:armv7'),
('FreeBSD:15:powerpc'), ('FreeBSD:15:powerpc64'), ('FreeBSD:15:powerpc64le')) v(name))
select current_abi_list.name as name, abi.name as missing
from current_abi_list left outer join abi on current_abi_list.name = abi.name)
insert into abi (name)
select name from new_and_old where missing is null;
Running that:
freshports.dev=# begin;
BEGIN
freshports.dev=*# with new_and_old as ( WITH current_abi_list as ( select name from (VALUES ('FreeBSD:13:aarch64'),
('FreeBSD:13:amd64'), ('FreeBSD:13:armv6'), ('FreeBSD:13:armv7'), ('FreeBSD:13:i386'), ('FreeBSD:13:powerpc'),
('FreeBSD:13:powerpc64'), ('FreeBSD:13:powerpc64le'), ('FreeBSD:14:aarch64'), ('FreeBSD:14:amd64'),
('FreeBSD:14:armv6'), ('FreeBSD:14:armv7'), ('FreeBSD:14:i386'), ('FreeBSD:14:powerpc'), ('FreeBSD:14:powerpc64'),
('FreeBSD:14:powerpc64le'), ('FreeBSD:15:aarch64'), ('FreeBSD:15:amd64'), ('FreeBSD:15:armv7'),
('FreeBSD:15:powerpc'), ('FreeBSD:15:powerpc64'), ('FreeBSD:15:powerpc64le')) v(name)) select current_abi_list.name
as name, abi.name as missing from current_abi_list left outer join abi on current_abi_list.name = abi.name) insert into abi
(name) select name from new_and_old where missing is null;
INSERT 0 0
freshports.dev=*# rollback;
ROLLBACK
freshports.dev=#
[19:32 dev-ingress01 dan ~/scripts] % cat ./delete-depcreated-abi.sh
#!/bin/sh
ABI=$(./current_list_of_valid_abi.sh)
in_list=''
#echo $ABI
for abi in ${ABI}
do
# echo $abi
if [ "$in_list" == "" ]
then
in_list="'${abi}'"
else
in_list="${in_list}, '${abi}'"
fi
done
#echo $in_list
query="DELETE FROM abi where name not in (${in_list})"
echo $query
[19:35 dev-ingress01 dan ~/scripts] % ./delete-depcreated-abi.sh
DELETE FROM abi where name not in ('FreeBSD:13:aarch64', 'FreeBSD:13:amd64', 'FreeBSD:13:armv6',
'FreeBSD:13:armv7', 'FreeBSD:13:i386', 'FreeBSD:13:powerpc', 'FreeBSD:13:powerpc64', 'FreeBSD:13:powerpc64le',
'FreeBSD:14:aarch64', 'FreeBSD:14:amd64', 'FreeBSD:14:armv6', 'FreeBSD:14:armv7', 'FreeBSD:14:i386',
'FreeBSD:14:powerpc', 'FreeBSD:14:powerpc64', 'FreeBSD:14:powerpc64le', 'FreeBSD:15:aarch64', 'FreeBSD:15:amd64',
'FreeBSD:15:armv7', 'FreeBSD:15:powerpc', 'FreeBSD:15:powerpc64', 'FreeBSD:15:powerpc64le')
[19:35 dev-ingress01 dan ~/scripts] %
Running that, we get:
freshports.dev=*# rollback;
ROLLBACK
freshports.dev=# select * from abi order by name;
id | name | active
----+------------------------+--------
2 | FreeBSD:13:aarch64 | t
11 | FreeBSD:13:amd64 | t
20 | FreeBSD:13:armv6 | t
21 | FreeBSD:13:armv7 | t
10 | FreeBSD:13:i386 | t
23 | FreeBSD:13:mips64 | t
58 | FreeBSD:13:powerpc | t
24 | FreeBSD:13:powerpc64 | t
57 | FreeBSD:13:powerpc64le | t
34 | FreeBSD:13:riscv64 | t
26 | FreeBSD:14:aarch64 | t
27 | FreeBSD:14:amd64 | t
28 | FreeBSD:14:armv6 | t
29 | FreeBSD:14:armv7 | t
30 | FreeBSD:14:i386 | t
32 | FreeBSD:14:mips64 | t
59 | FreeBSD:14:powerpc | t
33 | FreeBSD:14:powerpc64 | t
56 | FreeBSD:14:powerpc64le | t
35 | FreeBSD:14:riscv64 | t
54 | FreeBSD:15:aarch64 | t
47 | FreeBSD:15:amd64 | t
48 | FreeBSD:15:armv6 | t
49 | FreeBSD:15:armv7 | t
50 | FreeBSD:15:i386 | t
51 | FreeBSD:15:mips64 | t
60 | FreeBSD:15:powerpc | t
52 | FreeBSD:15:powerpc64 | t
55 | FreeBSD:15:powerpc64le | t
53 | FreeBSD:15:riscv64 | t
(30 rows)
freshports.dev=# begin;
BEGIN
freshports.dev=*# DELETE FROM abi where name not in ('FreeBSD:13:aarch64', 'FreeBSD:13:amd64', 'FreeBSD:13:armv6',
'FreeBSD:13:armv7', 'FreeBSD:13:i386', 'FreeBSD:13:powerpc', 'FreeBSD:13:powerpc64', 'FreeBSD:13:powerpc64le',
'FreeBSD:14:aarch64', 'FreeBSD:14:amd64', 'FreeBSD:14:armv6', 'FreeBSD:14:armv7', 'FreeBSD:14:i386',
'FreeBSD:14:powerpc', 'FreeBSD:14:powerpc64', 'FreeBSD:14:powerpc64le', 'FreeBSD:15:aarch64', 'FreeBSD:15:amd64',
'FreeBSD:15:armv7', 'FreeBSD:15:powerpc', 'FreeBSD:15:powerpc64', 'FreeBSD:15:powerpc64le')
freshports.dev-*# ;
DELETE 8
freshports.dev=*# select * from abi order by name;
id | name | active
----+------------------------+--------
2 | FreeBSD:13:aarch64 | t
11 | FreeBSD:13:amd64 | t
20 | FreeBSD:13:armv6 | t
21 | FreeBSD:13:armv7 | t
10 | FreeBSD:13:i386 | t
58 | FreeBSD:13:powerpc | t
24 | FreeBSD:13:powerpc64 | t
57 | FreeBSD:13:powerpc64le | t
26 | FreeBSD:14:aarch64 | t
27 | FreeBSD:14:amd64 | t
28 | FreeBSD:14:armv6 | t
29 | FreeBSD:14:armv7 | t
30 | FreeBSD:14:i386 | t
59 | FreeBSD:14:powerpc | t
33 | FreeBSD:14:powerpc64 | t
56 | FreeBSD:14:powerpc64le | t
54 | FreeBSD:15:aarch64 | t
47 | FreeBSD:15:amd64 | t
49 | FreeBSD:15:armv7 | t
60 | FreeBSD:15:powerpc | t
52 | FreeBSD:15:powerpc64 | t
55 | FreeBSD:15:powerpc64le | t
(22 rows)
freshports.dev=*# rollback;
ROLLBACK
freshports.dev=#
Here we go. I amended the scripts above to take the list of ABI from a file. Then output full SQL.
The result is this script, which does the refresh:
[15:48 dev-ingress01 dan ~/scripts] % cat refresh-abi.sh
#!/bin/sh
# Ensure the ABI table contains the right list of values.
if [ ! -f config.sh ]
then
echo "config.sh not found by missing-port-categories.sh..."
exit 1
fi
. config.sh
export PGDATABASE=$DB
export PGHOST=$HOST
export PGUSER=$DBUSER_ABI
# see also PGSSLMODE and PGSSLROOTCERT in config.sh
valid=$(mktemp ${SPOOLINGDIR}/abi-valid.XXXXXX)
sql=$(mktemp ${SPOOLINGDIR}/abi-sel.XXXXXX)
# fetch and extract the list of valid ABI
./current-list-of-valid-abi.sh > $valid
# build the SQL commands
echo 'BEGIN;' > $sql
# ABI to be deleted
./delete-depcreated-abi.sh < $valid >> $sql
# ABI to be added
echo >> $sql
./add-new-abi.sh < $valid >> $sql
# and we end
echo >> $sql
echo 'ROLLBACK;' >> $sql
# run the SQL
psql -f $sql
# if all good, remove the files. If not, leave the files
# the output of this script will be saved and an error flagged
if [ $? == 0 ]
then
# commit taken
rm $valid $sql
else
# raise an error, somewhere, somehow
fi
[15:48 dev-ingress01 dan ~/scripts] %
This is now ready to run overnight on dev
.
From /var/log/freshports/freshports.log
when there is no change in ABI:
Jan 7 13:58:00 dev-ingress01 FreshPorts[7047]: into /usr/local/etc/periodic/daily/330.refresh-abi
Jan 7 13:58:00 dev-ingress01 dan[7056]: ./refresh-abi.sh starts
Jan 7 13:58:00 dev-ingress01 dan[7082]: ./refresh-abi.sh nothing to change
Jan 7 13:58:00 dev-ingress01 dan[7088]: ./refresh-abi.sh finishes
When an ABI goes away:
Jan 7 13:58:18 dev-ingress01 FreshPorts[7669]: into /usr/local/etc/periodic/daily/330.refresh-abi
Jan 7 13:58:18 dev-ingress01 dan[7679]: ./refresh-abi.sh starts
Jan 7 13:58:18 dev-ingress01 dan[7699]: Sun Jan 7 13:58:18 UTC 2024
Jan 7 13:58:18 dev-ingress01 dan[7704]: BEGIN DELETE 1 INSERT 0 0 COMMIT
Jan 7 13:58:18 dev-ingress01 dan[7711]: ./refresh-abi.sh finishes
You would also find this entry in /var/log/freshports/abi.log
which is rotated very slowly based on size.
Sun Jan 7 13:58:18 UTC 2024
BEGIN
DELETE 1
INSERT 0 0
COMMIT
now packaged.
Installed on test, dev, and stage.