Re: pkgsave cleanup

From: Matthew Seaman <matthew_at_FreeBSD.org>
Date: Sun, 12 Nov 2023 11:57:31 UTC
On 11/11/2023 19:00, Roger Marquis wrote:
> For those who are concerned about backup files being left in non-backup
> directories this small script will cleanup .pkgsave files:
> 
> 
>    DBPATH=/var/db/pkgsave/`date +%G%m%d%H%M`
>    if [ ! -d $DBPATH ]; then
>        mkdir -p $DBPATH
>    fi
>    for f in `find / -type f -name \*.pkgsave` ; do
>        fori="`echo $f | sed 's/.pkgsave//'`"
>        diff $f $fori >/dev/null 2>&1
>        if [ $? = 0 ]; then
>            rm -f $f
>        else
>            oripath="`dirname $f`"
>            if [ ! -d $DBPATH/$oripath ]; then
>                mkdir -p $DBPATH/$oripath
>            fi
>            mv -f $f $DBPATH/$oripath
>        fi
>    done

I too have been busy converting everything to base packages, and it's 
all gone very smoothly, albeit with a lot of mopping up of .pkgsave files.

A couple of things I noticed:

* /var/db/locate.database is replaced by the installation of 
FreeBSD-runtime and you then would want to restore the original .pkgsave 
file.  However, after that it's then flagged by `pkg check`:

```
# pkg check -s FreeBSD-runtime
Checking FreeBSD-runtime:   0%
FreeBSD-runtime-14.snap20231109173050: checksum mismatch for 
/var/db/locate.database
Checking FreeBSD-runtime: 100%
```

Which makes no sense -- by its nature /var/db/locate.database is going 
to be rewritten with contents that vary week-to-week.  In fact, this 
file probably shouldn't be included in any package.  It will be created 
by the 310.locate periodic script whenever that runs, and the locate(1) 
command handles a non-existent /var/db/locate.database quite sensibly.

```
% git diff
diff --git a/etc/Makefile b/etc/Makefile
index b76d6e6462f4..dd9ddfef373f 100644
--- a/etc/Makefile
+++ b/etc/Makefile
@@ -84,10 +84,6 @@ distribution:
                 ${INSTALL_SYMLINK} -T "package=sendmail" \
                 mail/aliases ${DESTDIR}/etc/aliases; \
         fi
-.endif
-.if ${MK_LOCATE} != "no"
-       ${INSTALL} -o nobody -g ${BINGRP} -m 644 -T "package=runtime"\
-           /dev/null ${DESTDIR}/var/db/locate.database
  .endif
         cd ${.CURDIR}/..; ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m 444 \
                 -T "package=runtime" ${FREEBSD} ${DESTDIR}/
```

This is the only mismatched checksum I've seen as a result of switching 
to packages.

* There are several symbolic links to directories that get replaced and 
renamed adding .pkgsave, for instance:

    /usr/share/nls/en_US.US_ASCII.pkgsave -> C
    /usr/share/nls/POSIX.pkgsave -> C
    ... and many more

but their target isn't changed, so they resolve to the "new" content of 
/usr/share/nls/C/ pkg(8) doesn't create .pkgsave versions of 
directories, and I think it should treat symbolic links likewise, 
according to what the target of the link is.

So a link to a directory doesn't get a .pkgsave copy.  A link to a file 
should only get a .pkgsave copy if the target file itself gets a 
.pkgsave copy and in that case, the new .pkgsave link should point at 
that .pkgsave copy.

	Cheers,

	Matthew