about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--configure.ac2
-rwxr-xr-xscripts/nix-populate (renamed from src/nix-populate)0
-rw-r--r--src/fix.cc40
-rw-r--r--test/fixdescriptors/aterm-2.0.fix2
-rw-r--r--test/fixdescriptors/glib-2.2.1.fix10
-rw-r--r--test/fixdescriptors/pkgconfig-0.15.0.fix8
6 files changed, 48 insertions, 14 deletions
diff --git a/configure.ac b/configure.ac
index 0a0d491a0e50..a1dc0f72fc4a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -11,4 +11,4 @@ AC_PROG_CC
 AC_PROG_CXX
 
 AC_CONFIG_FILES([Makefile src/Makefile])
-AC_OUTPUT
\ No newline at end of file
+AC_OUTPUT
diff --git a/src/nix-populate b/scripts/nix-populate
index 50819d6664d4..50819d6664d4 100755
--- a/src/nix-populate
+++ b/scripts/nix-populate
diff --git a/src/fix.cc b/src/fix.cc
index bf335bc365b6..8d5cc6bf8e0b 100644
--- a/src/fix.cc
+++ b/src/fix.cc
@@ -2,6 +2,7 @@
 #include <map>
 
 #include <sys/types.h>
+#include <sys/stat.h>
 #include <sys/wait.h>
 
 extern "C" {
@@ -15,9 +16,17 @@ static string nixDescriptorDir;
 static string nixSourcesDir;
 
 
+/* Mapping of Fix file names to the hashes of the resulting Nix
+   descriptors. */
 typedef map<string, string> DescriptorMap;
 
 
+/* Forward declarations. */
+
+string instantiateDescriptor(string filename,
+    DescriptorMap & done);
+
+
 void registerFile(string filename)
 {
     int res = system(("nix regfile " + filename).c_str());
@@ -52,12 +61,15 @@ string fetchURL(string url)
 {
     string filename = baseNameOf(url);
     string fullname = nixSourcesDir + "/" + filename;
-    /* !!! quoting */
-    string shellCmd =
-        "cd " + nixSourcesDir + " && wget --quiet -N \"" + url + "\"";
-    int res = system(shellCmd.c_str());
-    if (WEXITSTATUS(res) != 0)
-        throw Error("cannot fetch " + url);
+    struct stat st;
+    if (stat(fullname.c_str(), &st)) {
+        /* !!! quoting */
+        string shellCmd =
+            "cd " + nixSourcesDir + " && wget --quiet -N \"" + url + "\"";
+        int res = system(shellCmd.c_str());
+        if (WEXITSTATUS(res) != 0)
+            throw Error("cannot fetch " + url);
+    }
     return fullname;
 }
 
@@ -101,17 +113,21 @@ string evaluateFile(ATerm e, string dir)
             throw Error("cannot copy " + filename);
         registerFile(nixSourcesDir + "/" + baseNameOf(filename));
         return hashFile(filename);
-    } else throw Error("invalid hash expression");
+    } else throw Error("invalid file expression");
 }
 
 
-string evaluatePkg(ATerm e, DescriptorMap & done)
+string evaluatePkg(ATerm e, string dir, DescriptorMap & done)
 {
     char * s;
+    ATerm t;
     if (ATmatch(e, "<str>", &s)) {
         checkHash(s);
         return s;
-    } else throw Error("invalid hash expression");
+    } else if (ATmatch(e, "Fix(<term>)", &t)) {
+        string filename = absPath(evaluateStr(t), dir); /* !!! */
+        return instantiateDescriptor(filename, done);
+    } else throw Error("invalid pkg expression");
 }
 
 
@@ -125,7 +141,7 @@ ATerm evaluate(ATerm e, string dir, DescriptorMap & done)
     else if (ATmatch(e, "File(<term>)", &t))
         return ATmake("File(<str>)", evaluateFile(t, dir).c_str());
     else if (ATmatch(e, "Pkg(<term>)", &t))
-        return ATmake("Pkg(<str>)", evaluatePkg(t, done).c_str());
+        return ATmake("Pkg(<str>)", evaluatePkg(t, dir, done).c_str());
     else throw Error("invalid expression type");
 }
 
@@ -215,8 +231,8 @@ string instantiateDescriptor(string filename,
     /* Register it with Nix. */
     registerFile(outFilename);
 
-    done[filename] = outFilename;
-    return outFilename;
+    done[filename] = outHash;
+    return outHash;
 }
 
 
diff --git a/test/fixdescriptors/aterm-2.0.fix b/test/fixdescriptors/aterm-2.0.fix
index 0362314d6c3e..17e90ca8baec 100644
--- a/test/fixdescriptors/aterm-2.0.fix
+++ b/test/fixdescriptors/aterm-2.0.fix
@@ -7,4 +7,4 @@ Descr(
   , Bind("src", File(Url("http://www.cwi.nl/projects/MetaEnv/aterm/aterm-2.0.tar.gz")))
   , Bind("build", File(Local("../build/aterm-build.sh")))
   ]
-)
\ No newline at end of file
+)
diff --git a/test/fixdescriptors/glib-2.2.1.fix b/test/fixdescriptors/glib-2.2.1.fix
new file mode 100644
index 000000000000..2585c7ffb5b5
--- /dev/null
+++ b/test/fixdescriptors/glib-2.2.1.fix
@@ -0,0 +1,10 @@
+Descr(
+  [ Bind("pkgId", Str("glib-2.2.1"))
+  , Bind("releaseId", Str("1"))
+
+  , Bind("pkgconfig", Pkg(Fix("./pkgconfig-0.15.0.fix")))
+
+  , Bind("src", File(Url("ftp://ftp.gtk.org/pub/gtk/v2.2/glib-2.2.1.tar.bz2")))
+  , Bind("build", File(Local("../build/glib-build.sh")))
+  ]
+)
diff --git a/test/fixdescriptors/pkgconfig-0.15.0.fix b/test/fixdescriptors/pkgconfig-0.15.0.fix
new file mode 100644
index 000000000000..27f32aba6419
--- /dev/null
+++ b/test/fixdescriptors/pkgconfig-0.15.0.fix
@@ -0,0 +1,8 @@
+Descr(
+  [ Bind("pkgId", Str("pkgconfig-0.15.0"))
+  , Bind("releaseId", Str("1"))
+
+  , Bind("src", File(Url("http://www.freedesktop.org/software/pkgconfig/releases/pkgconfig-0.15.0.tar.gz")))
+  , Bind("build", File(Local("../build/pkgconfig-build.sh")))
+  ]
+)