pkgsrc-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: pkg_chk update fallout



On Wed 25 Oct 2006 at 16:47:30 +0200, Hauke Fath wrote:
> I am in the middle of upgranding a pkgsrc-2006Q1 installation to 
> pkgsrc-2006Q3, working with pkg_chk 1.81 and binary packages from a 
> local bulk build.

What I usually do, is something like this:

- Make a list of what's installed now. Sometimes I forget this step.
  I have attached a script which creates a list sorted by dependency.
- in a pkg_comp chroot, run pkg_chk -r. This deletes outdated stuff that
  needs to be re-built, and more stuff that depends on it.
- depending on how thorough I want to be in the rebuilds, I move the
  existing, older binary packages out of the way. If I don't do that,
  some of them will be reinstalled if they are not outdated themselves.
  Script attached.
- Then I run pkg_chk -ak, and fix any problems, until everything is
  rebuilt.
- Outside the chroot again, I run pkg_chk -r and pkg_chk -ab.
  Apparently the -b option may be confused if there are different
  versions of the same binary package around. (script attached to fix
  this) It also may not look in the pkgchk.conf file (but just install
  all binary packages in sight), but that doesn't seem to be mentioned
  in the manpage anymore, so maybe it changed.

-Olaf.
-- 
___ Olaf 'Rhialto' Seibert      -- You author it, and I'll reader it.
\X/ rhialto/at/xs4all.nl        -- Cetero censeo "authored" delendum esse.
#!/bin/sh
#
# Usage: $0 fromdir todir
#
# Moves all binary packages in fromdir that are not installed anymore
# to todir.

fromdir=$1
todir=$2

if [ ! -w $todir ]
then
    echo "Can't write in $todir"
    exit
fi

for f in $(ls $fromdir)
do
    pkg=${f%.tgz}
    if pkg_info -e "$pkg"
    then
        echo $pkg is still installed
    else
        echo $pkg moved to Attic...
        mv "$fromdir/$f" "$todir"
    fi
done
#!/bin/sh

fromdir=$1
todir=$2
# fromdir should be an absolute path now, since pkg_admin lsbest prints
# absolute pathnames...

if [ ! -w $todir ]
then
    echo "Can't write in $todir"
    exit
fi

for f in $(ls $fromdir)
do
    # strip version number and .tgz
    pkg=$(echo $f | sed -e 's/-[0-9.]*\(nb[1-9][0-9]*\)\{0,1\}\.tgz$//')
    # If pattern did not match, leave the file alone
    if [ "$pkg" != "$f" ]
    then
        best=$(pkg_admin lsbest $fromdir/$pkg'-[0-9]*')
        if [ "$fromdir/$f" = "$best" ]
        then
            echo $f is still the best
        else
            echo $f moved to Attic, $best is best...
            mv "$fromdir/$f" "$todir"
        fi
    fi
done
#!/usr/pkg/bin/perl

use strict;

my $printdirs = 1;
my $print_toplevel = 0;
my $debug = 0;

my $pkgdbdir = $ENV{PKG_DBDIR} || "/var/db/pkg";

my %name_to_dir;

sub get_all_packages
{
    return map { s|^$pkgdbdir/||; $_ } grep { -d } glob($pkgdbdir."/*");
}

sub open_file
{
    my ($pkg, $file, $parent) = @_;

    my $fullname = "$pkgdbdir/$pkg/$file";
    if (-e $fullname) {
        # ok, nothing special to do
    } else {
        # It turns out that sometimes a dependency is not quite right.
        # In my case, about a dozen packages had installed newer versions
        # than were recorded in dependencies. Sloppy, but it happens.
        # Start guessing...
        my $oldpkg = $pkg;
        print STDERR "Warning: $pkg not found (needed for $parent), ";
        $pkg =~ s/-([0-9.]*)+(nb[0-9]+)?$//;
        print STDERR "best $pkg ";
        $pkg = `pkg_admin -s '' lsbest '$pkgdbdir/$pkg-[0-9]*'`;
        chomp $pkg;
        $pkg =~ s|^$pkgdbdir/||;
        chomp $pkg;
        print STDERR "is $pkg\n";
        $fullname = "$pkgdbdir/$pkg/$file";
    }
    open VERSION, "<", $fullname or die "Cannot open $fullname to read (needed 
for $parent)";
    return $pkg;
}

sub get_info_for
{
    my $pkg = shift;
    my $parent = shift;

    if (!exists $name_to_dir{$pkg}) {
        # Determine from which directory the package stems
        # Could also be done with pkg_info -Q PKGPATH $pkg, but
        # there is still the issue where not exactly the recorded
        # dependency is installed.
        my $origpkg = $pkg;
        $pkg = open_file($pkg, "+BUILD_VERSION", $parent);
        my $line = <VERSION>;
        close VERSION;

        # get dir/pkg from dir/pkg/Makefile # blah
        chomp $line;
        $line =~ s|^(.*?/.*?)/.*|$1|;

        $name_to_dir{$origpkg} = $line;
        $name_to_dir{$pkg} = $line;
        print STDERR "$pkg  <- $line\n" if $debug;

        # Now get what other packages we need
        open DEPS, "pkg_info -q -N $pkg |";
        my @deps = <DEPS>;
        close DEPS;

        # Go at least once through, with $pkg depending on itself,
        # so that tsort will know about it.
        foreach ($pkg, @deps) {
            chomp;
            next if $_ eq "";
            get_info_for($_, $pkg);

            my $ppkg = $pkg;
            my $p_ = $_;
            if ($printdirs) {
                $p_ = $name_to_dir{$p_};
                $ppkg = $name_to_dir{$ppkg};
            }
            print TSORT "$p_ $ppkg\n";
        }
    }
}

my @todo = @ARGV;
@todo = get_all_packages() unless int(@todo);

open TSORT, "| tsort";

foreach my $pkg (@todo) {
    get_info_for($pkg, "*TOP*");
}

close TSORT;

if ($print_toplevel) {
    print "# Top-level packages:\n";
    foreach (@todo) {
        print $name_to_dir{$_}, "\t # ", $_, "\n" 
                if   -d "${pkgdbdir}/$_" && 
                ! -e "${pkgdbdir}/$_/+REQUIRED_BY";
    }
}


Home | Main Index | Thread Index | Old Index