diff options
-rw-r--r-- | configure.ac | 2 | ||||
-rwxr-xr-x | scripts/nix-populate (renamed from src/nix-populate) | 0 | ||||
-rw-r--r-- | src/fix.cc | 40 | ||||
-rw-r--r-- | test/fixdescriptors/aterm-2.0.fix | 2 | ||||
-rw-r--r-- | test/fixdescriptors/glib-2.2.1.fix | 10 | ||||
-rw-r--r-- | test/fixdescriptors/pkgconfig-0.15.0.fix | 8 |
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"))) + ] +) |