about summary refs log tree commit diff
path: root/src/nix-instantiate
diff options
context:
space:
mode:
Diffstat (limited to 'src/nix-instantiate')
-rwxr-xr-xsrc/nix-instantiate72
1 files changed, 55 insertions, 17 deletions
diff --git a/src/nix-instantiate b/src/nix-instantiate
index 242bcfaf9332..4823d221252d 100755
--- a/src/nix-instantiate
+++ b/src/nix-instantiate
@@ -1,23 +1,61 @@
 #! /usr/bin/perl -w
 
-my $descr = $ARGV[0];
-
-open DESCR, "< $descr";
-
-while (<DESCR>) {
-    chomp;
-
-    if (/^(\w+)\s*=\s*([\w\d\.\/-]+)\s*(\#.*)?$/) {
-	my $name = $1;
-	my $file = $2;
-	my $out = `md5sum $file`;
-	$out =~ /^([0-9a-f]+)\s/;
-	my $hash = $1;
-        print "$name = $hash\n";
-    } else {
-	print "$_\n";
+use strict;
+use FileHandle;
+use File::Spec;
+
+my $outdir = $ARGV[0];
+
+my %donetmpls = ();
+
+sub convert {
+    my $descr = shift;
+
+    if (defined $donetmpls{$descr}) {
+        return $donetmpls{$descr};
     }
 
+    my ($x, $dir, $fn) = File::Spec->splitpath($descr);
+
+    print "$descr\n";
+
+    my $IN = new FileHandle;
+    my $OUT = new FileHandle;
+    my $outfile = "$outdir/$fn";
+    open $IN, "< $descr" or die "cannot open $descr";
+    open $OUT, "> $outfile" or die "cannot create $outfile";
+
+    while (<$IN>) {
+        chomp;
+
+        if (/^(\w+)\s*=\s*([+\w\d\.\/-]+)\s*(\#.*)?$/) {
+            my $name = $1;
+            my $file = $2;
+            $file = File::Spec->rel2abs($file, $dir);
+            my $out = `md5sum $file`;
+            die unless ($? == 0);
+            $out =~ /^([0-9a-f]+)\s/;
+            my $hash = $1;
+            print $OUT "$name = $hash\n";
+        } elsif (/^(\w+)\s*<-\s*([+\w\d\.\/-]+)\s*(\#.*)?$/) {
+            my $name = $1;
+            my $file = $2;
+            $file = File::Spec->rel2abs($file, $dir);
+            $file = convert($file);
+            my $out = `md5sum $file`;
+            die unless ($? == 0);
+            $out =~ /^([0-9a-f]+)\s/;
+            my $hash = $1;
+            print $OUT "$name <- $hash\n";
+        } else {
+            print $OUT "$_\n";
+        }
+    }
+
+    $donetmpls{$descr} = $outfile;
+    return $outfile;
 }
 
-close DESCR;
+for (my $i = 1; $i < scalar @ARGV; $i++) {
+    convert(File::Spec->rel2abs($ARGV[$i]));
+}