Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 6 Jun 2000 22:25:02 +0200 (MET DST)
From:      Thomas Schuerger <schuerge@wjpserver.CS.Uni-SB.DE>
To:        Will Andrews <andrews@technologist.com>
Cc:        freebsd-current@FreeBSD.ORG
Subject:   Re: Check for ports updates
Message-ID:  <200006062025.WAA12391@wjpserver.cs.uni-sb.de>
In-Reply-To: <20000606153351.E7792@argon.gryphonsoft.com> from Will Andrews at "Jun 6, 2000 03:33:51 pm"

next in thread | previous in thread | raw e-mail | index | archive | help
> > Is there already a tool that checks the installed ports for available
> > updates in /usr/ports?
> > 
> > I've written such a tool, which seems to work fine already. Anyone
> > interested?
> 
> pkg_version(1)

Ah, haven't seen that before. The output of pkg_version is very
canonical, but not very readable for humans. And it's slower than my
version... ;-)

Here is my version called "ports_updates":


---------

#!/usr/bin/perl

################################################################################
# $Id: ports_updates,v 1.1 2000/06/01 20:24:06 schuerge Exp $
#
# 20000601 schuerge first checkin
#
# TODO: Make version check more sophisticated. Currently the version strings are
#       compared lexicographically, which may sometimes not be what is expected.
################################################################################
#
# ports_updates - fast check for available updates of installed ports
#
# (C) 2000 by Thomas Schürger   Mail: thomas@schuerger.com
#
# invocation:
#              ports_updates
#
# description:
#              Checks for each installed port if a newer version is available
#              in /usr/ports. Ports are output in a sorted manner.
#
#              Uses efficient merge-sort like algorithm for detecting updated
#              port versions. The file /usr/ports/INDEX is inspected for
#              detecting updates, which is not updated daily in the ports
#              collection. Therefore the results are just almost exact.
#
################################################################################

$installedports = `\\ls -1 /var/db/pkg | sort -t "-" +0 -1`;
@installedports = split(/\n/, $installedports);

$c = 0;
foreach $i ( @installedports )
  {
    next if($i =~ /^\./);   # super-user ls also lists dot-files
    $i =~ /(.*)-([^\-].*)/;
    $installedname[$c] = $1;
    $installedversion[$c] = $2;
    $c++;
  }

$ports = ` cut -f "1-2" -d "|" /usr/ports/INDEX | sort -t "-" +0 -1`;
@ports = split(/\n/, $ports);

$c = 0;
foreach $i ( @ports )
  {
    $i =~ /^(.*)-([^\-\|].*)\|(.*)/;
    $name[$c] = $1;
    $version[$c] = $2;
    $location[$c] = $3;
    # $location[$c] =~ s/^\/usr\/ports\///;
    $c++;
  }

@a = stat("/usr/ports/INDEX");
$time = localtime($a[9]);
$age = -M "/usr/ports/INDEX";

if($age >= 30)
  {
    printf("Ports available: %4d (last port index update: %s)\n",($#ports+1),$time);
  }
else
  {
    printf("Ports available: %4d (last port index update %d day%s ago)\n",($#ports+1),$age,$age == 1 ? "" : "s");
  }

printf("Ports installed: %4d\n",($#installedname+1));

$c = 0;   # counter for @ports
$d = 0;   # counter for @installedports

while($c <= $#name && $d <= $#installedname)
  {
    $a = $name[$c] cmp $installedname[$d];

    # printf("%4d %-30s %-10s  %4d %-30s %-10s  $a\n",$c,$name[$c],$version[$c],$d,$installedname[$d],$installedversion[$d]);

    if($a == 0)
      {
        $ver = $version[$c];
        $instver = $installedversion[$d];

        if($ver gt $instver)  # newer version available?
          {
            if(!$header)  # has the table header not been printed yet?
              {
                print "\nThe following installed ports should be updated:\n\n";
                print "Port name            /usr/ports   Installed   Port location\n";
                print "--------------------------------------------------------------------------\n";
                $header = 1;
              }

            printf("%-20s %-12s %-10s  %s\n",$name[$c],$ver,$instver,$location[$c]);
          }
      }

    $c++ if($a <= 0);

    if($a > 0)
      {
        push(@obsolete,$installedname[$d]."-".$installedversion[$d]);
      }
    
    $d++ if($a >= 0);
  }

if(!$header)
  {
    print "\nCongratulations, all installed ports are up-to-date!\n";
  }

if($#obsolete >= 0)
  {
    print "\nThe following ports are installed but are no longer available in /usr/ports\n";
    print "(or now have a different name) and should be considered for deletion:\n\n";

    foreach $i (@obsolete)
      {
        print "$i\n",
      }
  }

------


Ciao,
Thomas Schürger.   http://www.menden.org



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200006062025.WAA12391>