* Fix nix-channel.

* Add `--help' flag; fixes NIX-5.
* Add `--remove' flag; fixes NIX-6.
* Add `--list' flag.
This commit is contained in:
Eelco Dolstra 2005-02-17 10:06:12 +00:00
parent 202d5bbda5
commit fb5dae8694
2 changed files with 65 additions and 27 deletions

View File

@ -48,6 +48,19 @@ sub addChannel {
} }
# Remove a channel from the file $channelsList;
sub removeChannel {
my $url = shift;
my @left = ();
readChannels;
foreach my $url2 (@channels) {
push @left, $url2 if $url ne $url2;
}
@channels = @left;
writeChannels;
}
# Fetch Nix expressions and pull cache manifests from the subscribed # Fetch Nix expressions and pull cache manifests from the subscribed
# channels. # channels.
sub update { sub update {
@ -76,7 +89,7 @@ sub update {
chomp $hash; chomp $hash;
# !!! escaping # !!! escaping
$nixExpr .= "((import @datadir@/nix/corepkgs/fetchurl) " . $nixExpr .= "((import @datadir@/nix/corepkgs/fetchurl) " .
"{url = $fullURL; md5 = \"$hash\"; system = \"@system@\";}) " "{url = $fullURL; sha1 = \"$hash\"; system = \"@system@\";}) "
} }
$nixExpr .= "]"; $nixExpr .= "]";
@ -85,33 +98,39 @@ sub update {
"(import @datadir@/nix/corepkgs/channels/unpack.nix) " . "(import @datadir@/nix/corepkgs/channels/unpack.nix) " .
"{inputs = $nixExpr; system = \"@system@\";}"; "{inputs = $nixExpr; system = \"@system@\";}";
# Instantiate the Nix expression. # Figure out a name for the GC root.
my $storeExpr = `echo '$nixExpr' | @bindir@/nix-instantiate -`
or die "cannot instantiate Nix expression";
chomp $storeExpr;
# Register the store expression as a root of the garbage
# collector.
my $userName = getpwuid($<); my $userName = getpwuid($<);
die "who ARE you? go away" unless defined $userName; die "who ARE you? go away" unless defined $userName;
my $rootFile = "$rootsDir/$userName.gcroot"; my $rootFile = "$rootsDir/$userName";
my $tmpRootFile = "$rootsDir/$userName-tmp.gcroot";
open ROOT, ">$tmpRootFile" or die "cannot create `$tmpRootFile': $!"; # Instantiate the Nix expression.
print ROOT "$storeExpr"; my $storeExpr = `echo '$nixExpr' | @bindir@/nix-instantiate --add-root '$rootFile'.tmp -`
close ROOT; or die "cannot instantiate Nix expression";
chomp $storeExpr;
# Realise the store expression. # Build the resulting derivation.
my $outPath = `nix-store -qnf '$storeExpr'` my $outPath = `nix-store --add-root '$rootFile' -r '$storeExpr'`
or die "cannot realise store expression"; or die "cannot realise store expression";
chomp $outPath; chomp $outPath;
unlink "$rootFile.tmp";
# Make it the default Nix expression for `nix-env'. # Make it the default Nix expression for `nix-env'.
system "@bindir@/nix-env --import '$outPath'"; system "@bindir@/nix-env --import '$outPath'";
die "cannot pull set default Nix expression to `$outPath'" if ($? != 0); die "cannot pull set default Nix expression to `$outPath'" if ($? != 0);
}
rename $tmpRootFile, $rootFile or die "cannot rename `$tmpRootFile' to `$rootFile': $!";
sub usageError {
print STDERR <<EOF;
Usage:
nix-channel --add URL
nix-channel --remove URL
nix-channel --list
nix-channel --update
EOF
exit 1;
} }
@ -119,18 +138,37 @@ while (scalar @ARGV) {
my $arg = shift @ARGV; my $arg = shift @ARGV;
if ($arg eq "--add") { if ($arg eq "--add") {
die "syntax: nix-channel --add URL" if (scalar @ARGV != 1); usageError if scalar @ARGV != 1;
addChannel (shift @ARGV); addChannel (shift @ARGV);
last; last;
} }
elsif ($arg eq "--update") { if ($arg eq "--remove") {
die "syntax: nix-channel --update" if (scalar @ARGV != 0); usageError if scalar @ARGV != 1;
update; removeChannel (shift @ARGV);
last; last;
} }
if ($arg eq "--list") {
usageError if scalar @ARGV != 0;
readChannels;
foreach my $url (@channels) {
print "$url\n";
}
last;
}
elsif ($arg eq "--update") {
usageError if scalar @ARGV != 0;
update;
last;
}
elsif ($arg eq "--help") {
usageError;
}
else { else {
die "unknown argument `$arg'"; die "unknown argument `$arg'; try `--help'";
} }
} }

View File

@ -154,17 +154,17 @@ for (my $n = 0; $n < scalar @storePaths; $n++) {
(-f $narfile) or die "narfile for $storePath not found"; (-f $narfile) or die "narfile for $storePath not found";
push @nararchives, $narfile; push @nararchives, $narfile;
open MD5, "$nardir/narbz2-hash" or die "cannot open narbz2-hash"; open SHA1, "$nardir/narbz2-hash" or die "cannot open narbz2-hash";
my $narbz2Hash = <MD5>; my $narbz2Hash = <SHA1>;
chomp $narbz2Hash; chomp $narbz2Hash;
$narbz2Hash =~ /^[0-9a-z]{32}$/ or die "invalid hash"; $narbz2Hash =~ /^[0-9a-z]{32}$/ or die "invalid hash";
close MD5; close SHA1;
open MD5, "$nardir/nar-hash" or die "cannot open nar-hash"; open SHA1, "$nardir/nar-hash" or die "cannot open nar-hash";
my $narHash = <MD5>; my $narHash = <SHA1>;
chomp $narHash; chomp $narHash;
$narHash =~ /^[0-9a-z]{32}$/ or die "invalid hash"; $narHash =~ /^[0-9a-z]{32}$/ or die "invalid hash";
close MD5; close SHA1;
my $narbz2Size = (stat $narfile)[7]; my $narbz2Size = (stat $narfile)[7];