b89f941b20
If the user tries to run a program that doesn't exist from Bash, the program name is looked up in a database that maps to Nix package names. If it is found, we print out a message like: $ pdflatex The program ‘pdflatex’ is currently not installed. It is provided by several packages. You can install it by typing one of the following: nix-env -i tetex nix-env -i texlive-core If the environment variable $NIX_AUTO_INSTALL is set, the command is installed and executed automatically: $ hello --version The program ‘hello’ is currently not installed. It is provided by the package ‘hello’, which I will now install for you. installing `hello-2.8' hello (GNU hello) 2.8 Copyright (C) 2011 Free Software Foundation, Inc. ... To use this, you must currently manually put the SQLite programs database in /var/lib/nixos/programs.sqlite. In the future, this file should be provided as part of the NixOS channel so it gets updated automatically. To get a test version: $ curl http://nixos.org/~eelco/programs.sqlite.xz | xz -d > /var/lib/nixos/programs.sqlite
49 lines
1.3 KiB
Perl
49 lines
1.3 KiB
Perl
#! @perl@/bin/perl -w @perlFlags@
|
||
|
||
use strict;
|
||
use DBI;
|
||
use DBD::SQLite;
|
||
use Config;
|
||
|
||
my $program = $ARGV[0];
|
||
|
||
my $dbPath = "/var/lib/nixos/programs.sqlite";
|
||
|
||
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbPath", "", "")
|
||
or die "cannot open database `$dbPath'";
|
||
$dbh->{RaiseError} = 0;
|
||
$dbh->{PrintError} = 0;
|
||
|
||
my $system = $ENV{"NIX_SYSTEM"} // $Config{myarchname};
|
||
|
||
my $res = $dbh->selectall_arrayref(
|
||
"select package from Programs where system = ? and name = ?",
|
||
{ Slice => {} }, $system, $program);
|
||
|
||
if (!defined $res || scalar @$res == 0) {
|
||
print STDERR "$program: command not found\n";
|
||
} elsif (scalar @$res == 1) {
|
||
my $package = @$res[0]->{package};
|
||
if ($ENV{"NIX_AUTO_INSTALL"} // "") {
|
||
print STDERR <<EOF;
|
||
The program ‘$program’ is currently not installed. It is provided by
|
||
the package ‘$package’, which I will now install for you.
|
||
EOF
|
||
;
|
||
exit 126 if system("nix-env", "-i", $package) == 0;
|
||
} else {
|
||
print STDERR <<EOF;
|
||
The program ‘$program’ is currently not installed. You can install it by typing:
|
||
nix-env -i $package
|
||
EOF
|
||
}
|
||
} else {
|
||
print STDERR <<EOF;
|
||
The program ‘$program’ is currently not installed. It is provided by
|
||
several packages. You can install it by typing one of the following:
|
||
EOF
|
||
print STDERR " nix-env -i $_->{package}\n" foreach @$res;
|
||
}
|
||
|
||
exit 127;
|