PORT META: Installed files conflict between ports

Ronald F. Guilmette rfg at tristatelogic.com
Tue May 20 22:25:58 UTC 2014

I just submitted the following PR:


I was a bit flabberghasted to believe that such file conflicts between
ports was even possible.  Seeing that it is possible prompted me to
write the attached small Perl script, which can quickly find all such
cases among a set of installed ports on a given system.

To use this simple script, place it somewhere on your path and name
it "pccheck" (Port Conflict Check).  Then do the following:

    cd /var/db/pkg
    pccheck *

That will tell you if any of your installed ports have installed any
files which any other of your installed ports also believe that they
also have installed.

When I ran it on my system, I got this, which is worrying, to say the

mplayer2-2.0.20130428_4: Conflict -- file=/usr/local/bin/mplayer  pkg=mplayer-1.1.r20140418
mplayer2-2.0.20130428_4: Conflict -- file=/usr/local/man/man1/mplayer.1.gz  pkg=mplayer-1.1.r20140418
samba36-nmblookup-3.6.23: Conflict -- file=/usr/local/bin/nmblookup  pkg=samba36-3.6.23
samba36-nmblookup-3.6.23: Conflict -- file=/usr/local/man/man1/nmblookup.1.gz  pkg=samba36-3.6.23
samba36-nmblookup-3.6.23: Conflict -- file=/usr/local/man/man5/smb.conf.5.gz  pkg=samba36-3.6.23

How does this sort of problem even creep in (to the ports tree)?  Is
there nothing in place which prevents it from arising?

#!/usr/bin/perl -w

use strict;

my $origin;
my %installed_files;

foreach my $arg (@ARGV) {
  next unless (-d "$arg");
  open (IFILE, "<$arg/+CONTENTS") || die "$arg: Open failed\n";
  while (my $line = <IFILE>) {
    chop $line;
    if ($line =~ m/^\@/) {
      if ($line =~ m/^\@conflicts /) {
#        print STDERR ("$arg: $line\n");
        # do nothing
      } elsif ($line =~ m/^\@cwd /) {
        $origin = $';
      } else {
        # do nothing
    } else {
      next if ($line =~ m/^\+[A-Z]/);
      die "$arg: Origin not defined\n" unless (defined ($origin));
      my $fullpath = "$origin/$line";
#      print "$fullpath\n";
      if (exists ($installed_files{$fullpath})) {
        print STDERR ("$arg: Conflict -- file=$fullpath  pkg=$installed_files{$fullpath}\n");
      } else {
        $installed_files{$fullpath} = $arg;
  close (IFILE);

More information about the freebsd-ports mailing list