Get rid of package categories

Whether or not the package name itself or the (category,name) tuple
uniquely identified a package within a system has been a source of
confusion for a long time. Back in
03d278e4ff I ended up playing playing it
"safe" by going for (category,name), but in practice this doesn't make a
whole lot of sense. While it's *possible* for the same package name to
refer to completely different packages in different "categories", in
reality distributions can't sanely support this anyway.

For distributions where the category referred to a repository, the only
cases where the same package name was used in different repos was when
the package has moved from one repo to another. Those should certainly
not be treated as different packages.

For distributions where the category really referred to a category,
there's the Debian approach where the category is purely a tag and
doesn't help identify the package in any way, and then there's FreeBSD
where the category technically ought to be part of the name.  There were
a few cases where FreeBSD used categories to separate out different
versions of the same package (e.g. ipv6 vs non-ipv6), but none were
relevant for man pages so I ended up merging those as well.

Getting rid of the categories simplifies and shortens URLs, unclutters
the UI a little bit and merges the packages in listings that should've
been merged all along.

Migration script:

  -- Merge packages that are in multiple categories.
  -- All versions are moved to the package with the lowest ID.
  -- If the same version already exists in a lower ID, the higher-ID version is deleted.
  BEGIN;
  WITH migrate(old, new, second) AS (
    SELECT q.id, MIN(p.id), MAX(p.id)
      FROM packages p
      JOIN packages q ON q.id > p.id AND p.system = q.system AND p.name = q.name
     GROUP BY q.id
  ), ded(n) AS (
    UPDATE packages SET dead = false
      FROM migrate m
      JOIN packages q ON q.id = m.old
     WHERE packages.id = m.new AND packages.dead AND NOT q.dead
    RETURNING 1
  ), mov(n) AS (
    UPDATE package_versions SET package = m.new
      FROM migrate m
     WHERE package_versions.package = m.old
       AND NOT EXISTS(
          SELECT 1
            FROM package_versions v
           WHERE v.package IN(m.new, m.second)
             AND v.version = package_versions.version)
    RETURNING 1
  ), del(n) AS (
    DELETE FROM packages WHERE id IN(SELECT old FROM migrate)
    RETURNING 1
  ) SELECT (SELECT count(*) FROM migrate) AS migrate,
           (SELECT count(*) FROM ded) AS ded,
           (SELECT count(*) FROM mov) AS mov,
           (SELECT count(*) FROM del) AS del;

  ALTER TABLE packages DROP CONSTRAINT packages_system_name_category_key;
  CREATE UNIQUE INDEX packages_system_name_key ON packages (system, name);
  ALTER TABLE packages DROP COLUMN category;
  COMMIT;
This commit is contained in:
Yorhel 2024-04-28 10:37:02 +02:00
parent bc26633fc7
commit 83ab6c3671
16 changed files with 152 additions and 182 deletions

View file

@ -10,8 +10,7 @@ CURL="curl -fSs -A manual-page-crawler,info@manned.org"
SPLITTAR="$TMPDIR/freebsd-merged-tar"
# Index a "core" file. Simple wrapper around 'index pkg', with --ver = date,
# --cat="core", and support for split tar files.
# Index a "core" file. Simple wrapper around 'index pkg', with --ver = date and support for split tar files.
index_core() { # <sys> <url-prefix> <pkgname> <date> <last-sequence>
local FN=$2
if [ -n "$5" ]; then
@ -22,7 +21,7 @@ index_core() { # <sys> <url-prefix> <pkgname> <date> <last-sequence>
$CURL "$FN{"`perl -le "print join ',', 'aa'..'$5'"`'}' >$SPLITTAR || return 1
FN=$SPLITTAR
fi
index pkg --force --sys $1 --cat core --pkg $3 --ver $4 --date $4 $FN
index pkg --force --sys $1 --pkg $3 --ver $4 --date $4 $FN
}
@ -35,29 +34,29 @@ case $1 in
index_core freebsd-1.0 "${MIR}tarballs/xfree86/man.tgz" core-xfree86-man 1993-10-20
index_core freebsd-1.0 "${MIR}tarballs/xfree86/pex.tgz" core-xfree86-pex 1993-10-21
# A few packages
index pkg --sys freebsd-1.0 --cat packages --pkg emacs-19-19_bin --ver 1993-09-13 --date 1993-09-13 "${MIR}packages/emacs-19-19_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg f2c_bin --ver 1993-10-01 --date 1993-10-01 "${MIR}packages/f2c_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg fileutils_bin --ver 1993-10-06 --date 1993-10-06 "${MIR}packages/fileutils_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg ghostscript_bin --ver 1993-10-02 --date 1993-10-02 "${MIR}packages/ghostscript_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg gopher_bin --ver 1993-10-15 --date 1993-10-15 "${MIR}packages/gopher_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg info-zip_bin --ver 1993-09-04 --date 1993-09-04 "${MIR}packages/info-zip_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg jpeg_bin --ver 1993-09-04 --date 1993-09-04 "${MIR}packages/jpeg_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg kermit_bin --ver 1993-09-04 --date 1993-09-04 "${MIR}packages/kermit_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg ksh_bin --ver 1993-09-04 --date 1993-09-04 "${MIR}packages/ksh_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg miscutils_bin --ver 1993-09-06 --date 1993-09-06 "${MIR}packages/miscutils_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg mtools_bin --ver 1993-08-30 --date 1993-08-30 "${MIR}packages/mtools_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg pbmplus_bin --ver 1993-10-05 --date 1993-10-05 "${MIR}packages/pbmplus_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg pkg_install --ver 1993-10-10 --date 1993-10-10 "${MIR}packages/pkg_install.tar.gz"
index pkg --sys freebsd-1.0 --cat packages --pkg shellutils_bin --ver 1993-10-06 --date 1993-10-06 "${MIR}packages/shellutils_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg tcl_bin --ver 1993-09-18 --date 1993-09-18 "${MIR}packages/tcl_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg tcsh_bin --ver 1993-09-04 --date 1993-09-04 "${MIR}packages/tcsh_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg textutils_bin --ver 1993-09-05 --date 1993-09-05 "${MIR}packages/textutils_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg tk_bin --ver 1993-09-18 --date 1993-09-18 "${MIR}packages/tk_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg urt_bin --ver 1993-10-05 --date 1993-10-05 "${MIR}packages/urt_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg xlock_bin --ver 1993-09-04 --date 1993-09-04 "${MIR}packages/xlock_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg xv_bin --ver 1993-09-06 --date 1993-09-06 "${MIR}packages/xv_bin.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg xview32b --ver 1993-09-16 --date 1993-09-16 "${MIR}packages/xview32b.tgz"
index pkg --sys freebsd-1.0 --cat packages --pkg zsh_bin --ver 1993-09-04 --date 1993-09-04 "${MIR}packages/zsh_bin.tgz"
index pkg --sys freebsd-1.0 --pkg emacs-19-19_bin --ver 1993-09-13 --date 1993-09-13 "${MIR}packages/emacs-19-19_bin.tgz"
index pkg --sys freebsd-1.0 --pkg f2c_bin --ver 1993-10-01 --date 1993-10-01 "${MIR}packages/f2c_bin.tgz"
index pkg --sys freebsd-1.0 --pkg fileutils_bin --ver 1993-10-06 --date 1993-10-06 "${MIR}packages/fileutils_bin.tgz"
index pkg --sys freebsd-1.0 --pkg ghostscript_bin --ver 1993-10-02 --date 1993-10-02 "${MIR}packages/ghostscript_bin.tgz"
index pkg --sys freebsd-1.0 --pkg gopher_bin --ver 1993-10-15 --date 1993-10-15 "${MIR}packages/gopher_bin.tgz"
index pkg --sys freebsd-1.0 --pkg info-zip_bin --ver 1993-09-04 --date 1993-09-04 "${MIR}packages/info-zip_bin.tgz"
index pkg --sys freebsd-1.0 --pkg jpeg_bin --ver 1993-09-04 --date 1993-09-04 "${MIR}packages/jpeg_bin.tgz"
index pkg --sys freebsd-1.0 --pkg kermit_bin --ver 1993-09-04 --date 1993-09-04 "${MIR}packages/kermit_bin.tgz"
index pkg --sys freebsd-1.0 --pkg ksh_bin --ver 1993-09-04 --date 1993-09-04 "${MIR}packages/ksh_bin.tgz"
index pkg --sys freebsd-1.0 --pkg miscutils_bin --ver 1993-09-06 --date 1993-09-06 "${MIR}packages/miscutils_bin.tgz"
index pkg --sys freebsd-1.0 --pkg mtools_bin --ver 1993-08-30 --date 1993-08-30 "${MIR}packages/mtools_bin.tgz"
index pkg --sys freebsd-1.0 --pkg pbmplus_bin --ver 1993-10-05 --date 1993-10-05 "${MIR}packages/pbmplus_bin.tgz"
index pkg --sys freebsd-1.0 --pkg pkg_install --ver 1993-10-10 --date 1993-10-10 "${MIR}packages/pkg_install.tar.gz"
index pkg --sys freebsd-1.0 --pkg shellutils_bin --ver 1993-10-06 --date 1993-10-06 "${MIR}packages/shellutils_bin.tgz"
index pkg --sys freebsd-1.0 --pkg tcl_bin --ver 1993-09-18 --date 1993-09-18 "${MIR}packages/tcl_bin.tgz"
index pkg --sys freebsd-1.0 --pkg tcsh_bin --ver 1993-09-04 --date 1993-09-04 "${MIR}packages/tcsh_bin.tgz"
index pkg --sys freebsd-1.0 --pkg textutils_bin --ver 1993-09-05 --date 1993-09-05 "${MIR}packages/textutils_bin.tgz"
index pkg --sys freebsd-1.0 --pkg tk_bin --ver 1993-09-18 --date 1993-09-18 "${MIR}packages/tk_bin.tgz"
index pkg --sys freebsd-1.0 --pkg urt_bin --ver 1993-10-05 --date 1993-10-05 "${MIR}packages/urt_bin.tgz"
index pkg --sys freebsd-1.0 --pkg xlock_bin --ver 1993-09-04 --date 1993-09-04 "${MIR}packages/xlock_bin.tgz"
index pkg --sys freebsd-1.0 --pkg xv_bin --ver 1993-09-06 --date 1993-09-06 "${MIR}packages/xv_bin.tgz"
index pkg --sys freebsd-1.0 --pkg xview32b --ver 1993-09-16 --date 1993-09-16 "${MIR}packages/xview32b.tgz"
index pkg --sys freebsd-1.0 --pkg zsh_bin --ver 1993-09-04 --date 1993-09-04 "${MIR}packages/zsh_bin.tgz"
;;
2.0.5)
MIR="${AMIRROR}i386/2.0.5-RELEASE/"