buildenv.pl: Create symlinks in priority order

This reduces unnecessary symlink/unlink steps.
This commit is contained in:
Eelco Dolstra 2012-12-04 14:45:32 +01:00
parent 2d5e8e267b
commit 56d29dcd62
1 changed files with 12 additions and 9 deletions

View File

@ -78,10 +78,10 @@ sub createLinks {
if (-l $dstFile) {
my $target = readlink $dstFile;
my $prevPriority = $priorities{$dstFile};
die ( "Collission between `$srcFile' and `$target'. "
. "Suggested solution: use `nix-env --set-flag "
die ( "collission between `$srcFile' and `$target'; "
. "use `nix-env --set-flag "
. "priority NUMBER PKGNAME' to change the priority of "
. "one of the conflicting packages.\n" )
. "one of the conflicting packages\n" )
if $prevPriority == $priority;
next if $prevPriority < $priority;
unlink $dstFile or die;
@ -125,7 +125,7 @@ sub addPkg {
# Convert the stuff we get from the environment back into a coherent
# data type.
my %pkgs;
my @pkgs;
my @derivations = split ' ', $ENV{"derivations"};
while (scalar @derivations) {
my $active = shift @derivations;
@ -133,18 +133,21 @@ while (scalar @derivations) {
my $outputs = shift @derivations;
for (my $n = 0; $n < $outputs; $n++) {
my $path = shift @derivations;
$pkgs{$path} =
{ active => $active ne "false"
push @pkgs,
{ path => $path
, active => $active ne "false"
, priority => int($priority) };
}
}
# Symlink to the packages that have been installed explicitly by the
# user.
foreach my $pkg (sort (keys %pkgs)) {
# user. Process in priority order to reduce unnecessary
# symlink/unlink steps.
@pkgs = sort { $a->{priority} <=> $b->{priority} || $a->{path} cmp $b->{path} } @pkgs;
foreach my $pkg (@pkgs) {
#print $pkg, " ", $pkgs{$pkg}->{priority}, "\n";
addPkg($pkg, $pkgs{$pkg}->{priority}) if $pkgs{$pkg}->{active};
addPkg($pkg->{path}, $pkg->{priority}) if $pkg->{active};
}