mirror of
https://github.com/NixOS/nix
synced 2025-07-10 13:03:55 +02:00
* Refactoring: hash class.
This commit is contained in:
parent
f66055fa1e
commit
21fe717ce2
8 changed files with 266 additions and 184 deletions
39
src/fix.cc
39
src/fix.cc
|
@ -10,6 +10,7 @@ extern "C" {
|
|||
}
|
||||
|
||||
#include "util.hh"
|
||||
#include "hash.hh"
|
||||
|
||||
|
||||
static string nixDescriptorDir;
|
||||
|
@ -20,7 +21,7 @@ static bool verbose = false;
|
|||
|
||||
/* Mapping of Fix file names to the hashes of the resulting Nix
|
||||
descriptors. */
|
||||
typedef map<string, string> DescriptorMap;
|
||||
typedef map<string, Hash> DescriptorMap;
|
||||
|
||||
|
||||
void registerFile(string filename)
|
||||
|
@ -32,12 +33,13 @@ void registerFile(string filename)
|
|||
}
|
||||
|
||||
|
||||
void registerURL(string hash, string url)
|
||||
void registerURL(Hash hash, string url)
|
||||
{
|
||||
int res = system(("nix regurl " + hash + " " + url).c_str());
|
||||
int res = system(("nix regurl " + (string) hash + " " + url).c_str());
|
||||
/* !!! escape */
|
||||
if (WEXITSTATUS(res) != 0)
|
||||
throw Error("cannot register " + hash + " -> " + url + " with Nix");
|
||||
throw Error("cannot register " +
|
||||
(string) hash + " -> " + url + " with Nix");
|
||||
}
|
||||
|
||||
|
||||
|
@ -61,7 +63,7 @@ struct EvalContext
|
|||
|
||||
|
||||
ATerm evaluate(ATerm e, EvalContext ctx);
|
||||
string instantiateDescriptor(string filename, EvalContext ctx);
|
||||
Hash instantiateDescriptor(string filename, EvalContext ctx);
|
||||
|
||||
|
||||
string evaluateStr(ATerm e, EvalContext ctx)
|
||||
|
@ -101,7 +103,7 @@ ATerm evaluate(ATerm e, EvalContext ctx)
|
|||
ATmatch(e, "Pkg(<str>)", &s) ||
|
||||
ATmatch(e, "File(<str>)", &s))
|
||||
{
|
||||
checkHash(s);
|
||||
parseHash(s);
|
||||
return e;
|
||||
}
|
||||
|
||||
|
@ -131,7 +133,7 @@ ATerm evaluate(ATerm e, EvalContext ctx)
|
|||
else if (ATmatch(e, "Fix(<term>)", &e2)) {
|
||||
string filename = absPath(evaluateStr(e2, ctx), ctx.dir); /* !!! */
|
||||
return ATmake("Pkg(<str>)",
|
||||
instantiateDescriptor(filename, ctx).c_str());
|
||||
((string) instantiateDescriptor(filename, ctx)).c_str());
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
@ -160,19 +162,18 @@ ATerm evaluate(ATerm e, EvalContext ctx)
|
|||
hash. */
|
||||
else if (ATmatch(e, "Local(<term>)", &e2)) {
|
||||
string filename = absPath(evaluateStr(e2, ctx), ctx.dir); /* !!! */
|
||||
string hash = hashFile(filename);
|
||||
Hash hash = hashFile(filename);
|
||||
registerFile(filename); /* !!! */
|
||||
return ATmake("File(<str>)", hash.c_str());
|
||||
return ATmake("File(<str>)", ((string) hash).c_str());
|
||||
}
|
||||
|
||||
/* `Url' registers a mapping from a hash to an url with Nix, and
|
||||
returns the hash. */
|
||||
else if (ATmatch(e, "Url(<term>, <term>)", &e2, &e3)) {
|
||||
string hash = evaluateStr(e2, ctx);
|
||||
checkHash(hash);
|
||||
Hash hash = parseHash(evaluateStr(e2, ctx));
|
||||
string url = evaluateStr(e3, ctx);
|
||||
registerURL(hash, url);
|
||||
return ATmake("File(<str>)", hash.c_str());
|
||||
return ATmake("File(<str>)", ((string) hash).c_str());
|
||||
}
|
||||
|
||||
/* `If' provides conditional evaluation. */
|
||||
|
@ -199,7 +200,7 @@ string getStringFromMap(BindingsMap & bindingsMap,
|
|||
|
||||
/* Instantiate a Fix descriptors into a Nix descriptor, recursively
|
||||
instantiating referenced descriptors as well. */
|
||||
string instantiateDescriptor(string filename, EvalContext ctx)
|
||||
Hash instantiateDescriptor(string filename, EvalContext ctx)
|
||||
{
|
||||
/* Already done? */
|
||||
DescriptorMap::iterator isInMap = ctx.done->find(filename);
|
||||
|
@ -256,8 +257,9 @@ string instantiateDescriptor(string filename, EvalContext ctx)
|
|||
if (!ATwriteToNamedTextFile(outTerm, tmpFilename.c_str()))
|
||||
throw Error("cannot write aterm to " + tmpFilename);
|
||||
|
||||
string outHash = hashFile(tmpFilename);
|
||||
string outFilename = nixDescriptorDir + "/" + id + "-" + outHash + ".nix";
|
||||
Hash outHash = hashFile(tmpFilename);
|
||||
string outFilename = nixDescriptorDir + "/" +
|
||||
id + "-" + (string) outHash + ".nix";
|
||||
if (rename(tmpFilename.c_str(), outFilename.c_str()))
|
||||
throw Error("cannot rename " + tmpFilename + " to " + outFilename);
|
||||
|
||||
|
@ -265,7 +267,8 @@ string instantiateDescriptor(string filename, EvalContext ctx)
|
|||
registerFile(outFilename);
|
||||
|
||||
if (verbose)
|
||||
cerr << "instantiated " << outHash << " from " << filename << endl;
|
||||
cerr << "instantiated " << (string) outHash
|
||||
<< " from " << filename << endl;
|
||||
|
||||
(*ctx.done)[filename] = outHash;
|
||||
return outHash;
|
||||
|
@ -284,7 +287,7 @@ void instantiateDescriptors(Strings filenames)
|
|||
it != filenames.end(); it++)
|
||||
{
|
||||
string filename = absPath(*it);
|
||||
cout << instantiateDescriptor(filename, ctx) << endl;
|
||||
cout << (string) instantiateDescriptor(filename, ctx) << endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -293,7 +296,7 @@ void instantiateDescriptors(Strings filenames)
|
|||
void printUsage()
|
||||
{
|
||||
cerr <<
|
||||
"Usage: fix ...
|
||||
"Usage: fix ...\n\
|
||||
";
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue