diff options
Diffstat (limited to 'perl/lib')
-rw-r--r-- | perl/lib/Nix/Config.pm.in | 2 | ||||
-rw-r--r-- | perl/lib/Nix/Store.pm | 67 |
2 files changed, 67 insertions, 2 deletions
diff --git a/perl/lib/Nix/Config.pm.in b/perl/lib/Nix/Config.pm.in index c88854daf0a8..b6d346651807 100644 --- a/perl/lib/Nix/Config.pm.in +++ b/perl/lib/Nix/Config.pm.in @@ -10,6 +10,8 @@ $confDir = $ENV{"NIX_CONF_DIR"} || "@sysconfdir@/nix"; $bzip2 = $ENV{"NIX_BZIP2"} || "@bzip2@"; $curl = "@curl@"; +$useBindings = "@perlbindings@" eq "yes"; + sub readConfig { my %config; my $config = "@sysconfdir@/nix/nix.conf"; diff --git a/perl/lib/Nix/Store.pm b/perl/lib/Nix/Store.pm index 1ae3b04b7e6f..8312a732cdea 100644 --- a/perl/lib/Nix/Store.pm +++ b/perl/lib/Nix/Store.pm @@ -2,6 +2,7 @@ package Nix::Store; use strict; use warnings; +use Nix::Config; require Exporter; @@ -21,8 +22,70 @@ our @EXPORT = qw( our $VERSION = '0.15'; -require XSLoader; -XSLoader::load('Nix::Store', $VERSION); +sub backtick { + open(RES, "-|", @_) or die; + local $/; + my $res = <RES> || ""; + close RES or die; + return $res; +} + +if ($Nix::Config::useBindings) { + require XSLoader; + XSLoader::load('Nix::Store', $VERSION); +} else { + + # Provide slow fallbacks of some functions on platforms that don't + # support the Perl bindings. + + use File::Temp; + use Fcntl qw/F_SETFD/; + + sub hashFile { + my ($algo, $base32, $path) = @_; + my $res = backtick("$Nix::Config::binDir/nix-hash", "--flat", $path, "--type", $algo, $base32 ? "--base32" : ()); + chomp $res; + return $res; + } + + sub hashPath { + my ($algo, $base32, $path) = @_; + my $res = backtick("$Nix::Config::binDir/nix-hash", $path, "--type", $algo, $base32 ? "--base32" : ()); + chomp $res; + return $res; + } + + sub hashString { + my ($algo, $base32, $s) = @_; + my $fh = File::Temp->new(); + print $fh $s; + my $res = backtick("$Nix::Config::binDir/nix-hash", $fh->filename, "--type", $algo, $base32 ? "--base32" : ()); + chomp $res; + return $res; + } + + sub addToStore { + my ($srcPath, $recursive, $algo) = @_; + die "not implemented" if $recursive || $algo ne "sha256"; + my $res = backtick("$Nix::Config::binDir/nix-store", "--add", $srcPath); + chomp $res; + return $res; + } + + sub isValidPath { + my ($path) = @_; + my $res = backtick("$Nix::Config::binDir/nix-store", "--check-validity", "--print-invalid", $path); + chomp $res; + return $res ne $path; + } + + sub queryPathHash { + my ($path) = @_; + my $res = backtick("$Nix::Config::binDir/nix-store", "--query", "--hash", $path); + chomp $res; + return $res; + } +} 1; __END__ |