about summary refs log tree commit diff
path: root/src/nix-instantiate.in
diff options
context:
space:
mode:
Diffstat (limited to 'src/nix-instantiate.in')
-rwxr-xr-xsrc/nix-instantiate.in89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/nix-instantiate.in b/src/nix-instantiate.in
new file mode 100755
index 000000000000..e501a2c0836c
--- /dev/null
+++ b/src/nix-instantiate.in
@@ -0,0 +1,89 @@
+#! /usr/bin/perl -w
+
+use strict;
+use FileHandle;
+use File::Spec;
+
+my $system = "@SYSTEM@";
+
+my $outdir = File::Spec->rel2abs($ARGV[0]);
+my $netdir = File::Spec->rel2abs($ARGV[1]);
+
+my %donetmpls = ();
+
+sub fetchFile {
+    my $loc = shift;
+
+    if ($loc =~ /^([+\w\d\.\/-]+)$/) {
+	return $1;
+    } elsif ($loc =~ /^url\((.*)\)$/) {
+	my $url = $1;
+	$url =~ /\/([^\/]+)$/ || die "invalid url $url";
+	my $fn = "$netdir/$1";
+	if (! -f $fn) {
+	    print "fetching $url...\n";
+	    system "cd $netdir; wget --quiet -N $url";
+	    if ($? != 0) {
+		unlink($fn);
+		die;
+	    }
+	}
+	return $fn;
+    } else {
+	die "invalid file specified $loc";
+    }
+}
+
+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";
+
+    print $OUT "system : $system\n";
+
+    while (<$IN>) {
+        chomp;
+
+        if (/^(\w+)\s*=\s*([^\#\s]*)\s*(\#.*)?$/) {
+            my ($name, $loc) = ($1, $2);
+            my $file = fetchFile($loc);
+            $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;
+}
+
+for (my $i = 2; $i < scalar @ARGV; $i++) {
+    convert(File::Spec->rel2abs($ARGV[$i]));
+}