#! @perl@/bin/perl -w use strict; use DBI; use DBD::SQLite; use String::ShellQuote; use Config; my $program = $ARGV[0]; my $dbPath = "@dbPath@"; 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); my $len = !defined $res ? 0 : scalar @$res; if ($len == 0) { print STDERR "$program: command not found\n"; } elsif ($len == 1) { my $package = @$res[0]->{package}; if ($ENV{"NIX_AUTO_RUN"} // "") { if ($ENV{"NIX_AUTO_RUN_INTERACTIVE"} // "") { while (1) { print STDERR "'$program' from package '$package' will be run, confirm? [yn]: "; chomp(my $comfirm = ); if (lc $comfirm eq "n") { exit 0; } elsif (lc $comfirm eq "y") { last; } } } exec("nix-shell", "-p", $package, "--run", shell_quote("exec", @ARGV)); } else { print STDERR <{package}\n"; } my $choice = 0; while (1) { # exec will break this loop no warnings "numeric"; print STDERR "Your choice [1-${len}]: "; # 0 can be invalid user input like non-number string # so we start from 1 $choice = + 0; if (1 <= $choice && $choice <= $len) { exec("nix-shell", "-p", @$res[$choice - 1]->{package}, "--run", shell_quote("exec", @ARGV)); } } } else { print STDERR <{package}\n" foreach @$res; } } exit 127;