* Use a proper namespace.
* Optimise header file usage a bit. * Compile the parser as C++.
This commit is contained in:
parent
aab8812732
commit
75068e7d75
|
@ -40,6 +40,11 @@ my $initFun = "init";
|
||||||
open HEADER, ">$ARGV[0]";
|
open HEADER, ">$ARGV[0]";
|
||||||
open IMPL, ">$ARGV[1]";
|
open IMPL, ">$ARGV[1]";
|
||||||
|
|
||||||
|
print HEADER "#ifdef __cplusplus\n";
|
||||||
|
print HEADER "namespace nix {\n";
|
||||||
|
print HEADER "#endif\n\n\n";
|
||||||
|
print IMPL "namespace nix {\n";
|
||||||
|
|
||||||
while (<STDIN>) {
|
while (<STDIN>) {
|
||||||
next if (/^\s*$/);
|
next if (/^\s*$/);
|
||||||
|
|
||||||
|
@ -162,5 +167,10 @@ print IMPL "void $initFun() {\n";
|
||||||
print IMPL "$init";
|
print IMPL "$init";
|
||||||
print IMPL "}\n";
|
print IMPL "}\n";
|
||||||
|
|
||||||
|
print HEADER "#ifdef __cplusplus\n";
|
||||||
|
print HEADER "}\n";
|
||||||
|
print HEADER "#endif\n\n\n";
|
||||||
|
print IMPL "}\n";
|
||||||
|
|
||||||
close HEADER;
|
close HEADER;
|
||||||
close IMPL;
|
close IMPL;
|
||||||
|
|
|
@ -2,13 +2,13 @@ pkglib_LTLIBRARIES = libexpr.la
|
||||||
|
|
||||||
libexpr_la_SOURCES = nixexpr.cc nixexpr.hh parser.cc parser.hh \
|
libexpr_la_SOURCES = nixexpr.cc nixexpr.hh parser.cc parser.hh \
|
||||||
eval.cc eval.hh primops.cc \
|
eval.cc eval.hh primops.cc \
|
||||||
lexer-tab.c lexer-tab.h parser-tab.c parser-tab.h \
|
lexer-tab.c lexer-tab.h parser-tab.cc parser-tab.hh \
|
||||||
get-drvs.cc get-drvs.hh \
|
get-drvs.cc get-drvs.hh \
|
||||||
attr-path.cc attr-path.hh \
|
attr-path.cc attr-path.hh \
|
||||||
expr-to-xml.cc expr-to-xml.hh
|
expr-to-xml.cc expr-to-xml.hh
|
||||||
|
|
||||||
BUILT_SOURCES = nixexpr-ast.cc nixexpr-ast.hh \
|
BUILT_SOURCES = nixexpr-ast.cc nixexpr-ast.hh \
|
||||||
parser-tab.h lexer-tab.h parser-tab.c lexer-tab.c
|
parser-tab.hh lexer-tab.h parser-tab.cc lexer-tab.c
|
||||||
|
|
||||||
EXTRA_DIST = lexer.l parser.y nixexpr-ast.def nixexpr-ast.cc
|
EXTRA_DIST = lexer.l parser.y nixexpr-ast.def nixexpr-ast.cc
|
||||||
|
|
||||||
|
@ -21,8 +21,8 @@ AM_CFLAGS = \
|
||||||
|
|
||||||
# Parser generation.
|
# Parser generation.
|
||||||
|
|
||||||
parser-tab.c parser-tab.h: parser.y
|
parser-tab.cc parser-tab.hh: parser.y
|
||||||
$(bison) -v -o parser-tab.c $(srcdir)/parser.y -d
|
$(bison) -v -o parser-tab.cc $(srcdir)/parser.y -d
|
||||||
|
|
||||||
lexer-tab.c lexer-tab.h: lexer.l
|
lexer-tab.c lexer-tab.h: lexer.l
|
||||||
$(flex) --outfile lexer-tab.c --header-file=lexer-tab.h $(srcdir)/lexer.l
|
$(flex) --outfile lexer-tab.c --header-file=lexer-tab.h $(srcdir)/lexer.l
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
#include "attr-path.hh"
|
#include "attr-path.hh"
|
||||||
#include "nixexpr-ast.hh"
|
#include "nixexpr-ast.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
bool isAttrs(EvalState & state, Expr e, ATermMap & attrs)
|
bool isAttrs(EvalState & state, Expr e, ATermMap & attrs)
|
||||||
|
@ -73,3 +77,6 @@ Expr findAlongAttrPath(EvalState & state, const string & attrPath,
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -7,8 +7,14 @@
|
||||||
#include "eval.hh"
|
#include "eval.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
Expr findAlongAttrPath(EvalState & state, const string & attrPath,
|
Expr findAlongAttrPath(EvalState & state, const string & attrPath,
|
||||||
const ATermMap & autoArgs, Expr e);
|
const ATermMap & autoArgs, Expr e);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__ATTR_PATH_H */
|
#endif /* !__ATTR_PATH_H */
|
||||||
|
|
|
@ -1,8 +1,13 @@
|
||||||
#include "eval.hh"
|
#include "eval.hh"
|
||||||
#include "parser.hh"
|
#include "parser.hh"
|
||||||
|
#include "hash.hh"
|
||||||
|
#include "util.hh"
|
||||||
#include "nixexpr-ast.hh"
|
#include "nixexpr-ast.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
EvalState::EvalState()
|
EvalState::EvalState()
|
||||||
: normalForms(32768), primOps(128)
|
: normalForms(32768), primOps(128)
|
||||||
{
|
{
|
||||||
|
@ -271,7 +276,7 @@ Expr wrapInContext(ATermList context, Expr e)
|
||||||
static ATerm concatStrings(EvalState & state, const ATermVector & args)
|
static ATerm concatStrings(EvalState & state, const ATermVector & args)
|
||||||
{
|
{
|
||||||
ATermList context = ATempty;
|
ATermList context = ATempty;
|
||||||
ostringstream s;
|
std::ostringstream s;
|
||||||
bool isPath = false;
|
bool isPath = false;
|
||||||
|
|
||||||
for (ATermVector::const_iterator i = args.begin(); i != args.end(); ++i) {
|
for (ATermVector::const_iterator i = args.begin(); i != args.end(); ++i) {
|
||||||
|
@ -666,3 +671,6 @@ void printEvalStats(EvalState & state)
|
||||||
if (showStats)
|
if (showStats)
|
||||||
printATermMapStats();
|
printATermMapStats();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -4,16 +4,21 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include "aterm.hh"
|
#include "aterm.hh"
|
||||||
#include "hash.hh"
|
|
||||||
#include "nixexpr.hh"
|
#include "nixexpr.hh"
|
||||||
|
|
||||||
|
|
||||||
typedef map<Path, PathSet> DrvRoots;
|
namespace nix {
|
||||||
typedef map<Path, Hash> DrvHashes;
|
|
||||||
|
|
||||||
|
class Hash;
|
||||||
|
|
||||||
|
|
||||||
|
typedef std::map<Path, PathSet> DrvRoots;
|
||||||
|
typedef std::map<Path, Hash> DrvHashes;
|
||||||
|
|
||||||
/* Cache for calls to addToStore(); maps source paths to the store
|
/* Cache for calls to addToStore(); maps source paths to the store
|
||||||
paths. */
|
paths. */
|
||||||
typedef map<Path, Path> SrcToStore;
|
typedef std::map<Path, Path> SrcToStore;
|
||||||
|
|
||||||
struct EvalState;
|
struct EvalState;
|
||||||
|
|
||||||
|
@ -74,5 +79,8 @@ Expr autoCallFunction(Expr e, const ATermMap & args);
|
||||||
/* Print statistics. */
|
/* Print statistics. */
|
||||||
void printEvalStats(EvalState & state);
|
void printEvalStats(EvalState & state);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__EVAL_H */
|
#endif /* !__EVAL_H */
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
#include "expr-to-xml.hh"
|
#include "expr-to-xml.hh"
|
||||||
|
|
||||||
#include "xml-writer.hh"
|
#include "xml-writer.hh"
|
||||||
#include "nixexpr-ast.hh"
|
#include "nixexpr-ast.hh"
|
||||||
#include "aterm.hh"
|
#include "aterm.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
static XMLAttrs singletonAttrs(const string & name, const string & value)
|
static XMLAttrs singletonAttrs(const string & name, const string & value)
|
||||||
{
|
{
|
||||||
XMLAttrs attrs;
|
XMLAttrs attrs;
|
||||||
|
@ -84,9 +86,12 @@ static void printTermAsXML(Expr e, XMLWriter & doc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void printTermAsXML(Expr e, ostream & out)
|
void printTermAsXML(Expr e, std::ostream & out)
|
||||||
{
|
{
|
||||||
XMLWriter doc(true, out);
|
XMLWriter doc(true, out);
|
||||||
XMLOpenElement root(doc, "expr");
|
XMLOpenElement root(doc, "expr");
|
||||||
printTermAsXML(e, doc);
|
printTermAsXML(e, doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -6,8 +6,10 @@
|
||||||
|
|
||||||
#include "nixexpr.hh"
|
#include "nixexpr.hh"
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
void printTermAsXML(Expr e, ostream & out);
|
void printTermAsXML(Expr e, std::ostream & out);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* !__EXPR_TO_XML_H */
|
#endif /* !__EXPR_TO_XML_H */
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
#include "get-drvs.hh"
|
#include "get-drvs.hh"
|
||||||
#include "nixexpr-ast.hh"
|
#include "nixexpr-ast.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
string DrvInfo::queryDrvPath(EvalState & state) const
|
string DrvInfo::queryDrvPath(EvalState & state) const
|
||||||
|
@ -66,7 +70,7 @@ static bool getDerivation(EvalState & state, Expr e,
|
||||||
e = evalExpr(state, e);
|
e = evalExpr(state, e);
|
||||||
if (!matchAttrs(e, es)) return true;
|
if (!matchAttrs(e, es)) return true;
|
||||||
|
|
||||||
shared_ptr<ATermMap> attrs(new ATermMap(32)); /* !!! */
|
boost::shared_ptr<ATermMap> attrs(new ATermMap(32)); /* !!! */
|
||||||
queryAllAttrs(e, *attrs, false);
|
queryAllAttrs(e, *attrs, false);
|
||||||
|
|
||||||
Expr a = attrs->get(toATerm("type"));
|
Expr a = attrs->get(toATerm("type"));
|
||||||
|
@ -183,3 +187,6 @@ void getDerivations(EvalState & state, Expr e, const string & pathPrefix,
|
||||||
Exprs doneExprs;
|
Exprs doneExprs;
|
||||||
getDerivations(state, e, pathPrefix, autoArgs, drvs, doneExprs);
|
getDerivations(state, e, pathPrefix, autoArgs, drvs, doneExprs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -9,7 +9,10 @@
|
||||||
#include "eval.hh"
|
#include "eval.hh"
|
||||||
|
|
||||||
|
|
||||||
typedef map<string, string> MetaInfo;
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
|
typedef std::map<string, string> MetaInfo;
|
||||||
|
|
||||||
|
|
||||||
struct DrvInfo
|
struct DrvInfo
|
||||||
|
@ -23,7 +26,7 @@ public:
|
||||||
string attrPath; /* path towards the derivation */
|
string attrPath; /* path towards the derivation */
|
||||||
string system;
|
string system;
|
||||||
|
|
||||||
shared_ptr<ATermMap> attrs;
|
boost::shared_ptr<ATermMap> attrs;
|
||||||
|
|
||||||
string queryDrvPath(EvalState & state) const;
|
string queryDrvPath(EvalState & state) const;
|
||||||
string queryOutPath(EvalState & state) const;
|
string queryOutPath(EvalState & state) const;
|
||||||
|
@ -52,5 +55,8 @@ bool getDerivation(EvalState & state, Expr e, DrvInfo & drv);
|
||||||
void getDerivations(EvalState & state, Expr e, const string & pathPrefix,
|
void getDerivations(EvalState & state, Expr e, const string & pathPrefix,
|
||||||
const ATermMap & autoArgs, DrvInfos & drvs);
|
const ATermMap & autoArgs, DrvInfos & drvs);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__GET_DRVS_H */
|
#endif /* !__GET_DRVS_H */
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
%{
|
%{
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <aterm2.h>
|
#include <aterm2.h>
|
||||||
#include "parser-tab.h"
|
#include "parser-tab.hh"
|
||||||
|
|
||||||
static void initLoc(YYLTYPE * loc)
|
static void initLoc(YYLTYPE * loc)
|
||||||
{
|
{
|
||||||
|
@ -35,7 +35,11 @@ static void adjustLoc(YYLTYPE * loc, const char * s, size_t len)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ATerm toATerm(const char * s);
|
ATerm toATerm(const char * s)
|
||||||
|
{
|
||||||
|
return (ATerm) ATmakeAppl0(ATmakeAFun((char *) s, 0, ATtrue));
|
||||||
|
}
|
||||||
|
|
||||||
ATerm unescapeStr(const char * s);
|
ATerm unescapeStr(const char * s);
|
||||||
|
|
||||||
#define YY_USER_INIT initLoc(yylloc)
|
#define YY_USER_INIT initLoc(yylloc)
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
#include "nixexpr.hh"
|
#include "nixexpr.hh"
|
||||||
#include "derivations.hh"
|
#include "derivations.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
|
||||||
#include "nixexpr-ast.hh"
|
#include "nixexpr-ast.hh"
|
||||||
#include "nixexpr-ast.cc"
|
#include "nixexpr-ast.cc"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
string showPos(ATerm pos)
|
string showPos(ATerm pos)
|
||||||
{
|
{
|
||||||
ATerm path;
|
ATerm path;
|
||||||
|
@ -332,3 +335,6 @@ string showValue(Expr e)
|
||||||
/* !!! incomplete */
|
/* !!! incomplete */
|
||||||
return "<unknown>";
|
return "<unknown>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -6,7 +6,10 @@
|
||||||
#include <aterm2.h>
|
#include <aterm2.h>
|
||||||
|
|
||||||
#include "aterm-map.hh"
|
#include "aterm-map.hh"
|
||||||
#include "util.hh"
|
#include "types.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
MakeError(EvalError, Error)
|
MakeError(EvalError, Error)
|
||||||
|
@ -95,5 +98,8 @@ string showType(Expr e);
|
||||||
|
|
||||||
string showValue(Expr e);
|
string showValue(Expr e);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__NIXEXPR_H */
|
#endif /* !__NIXEXPR_H */
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
#include "parser.hh"
|
||||||
|
#include "aterm.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
#include "nixexpr-ast.hh"
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -5,9 +10,15 @@
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "aterm.hh"
|
|
||||||
#include "parser.hh"
|
extern "C" {
|
||||||
#include "nixexpr-ast.hh"
|
|
||||||
|
#include "parser-tab.hh"
|
||||||
|
#include "lexer-tab.h"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
struct ParseData
|
struct ParseData
|
||||||
|
@ -17,16 +28,15 @@ struct ParseData
|
||||||
Path path;
|
Path path;
|
||||||
string error;
|
string error;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
extern "C" {
|
int yyparse(yyscan_t scanner, nix::ParseData * data);
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
#include "parser-tab.h"
|
|
||||||
#include "lexer-tab.h"
|
|
||||||
|
|
||||||
/* Callbacks for getting from C to C++. Due to a (small) bug in the
|
|
||||||
GLR code of Bison we cannot currently compile the parser as C++
|
|
||||||
code. */
|
|
||||||
|
|
||||||
void setParseResult(ParseData * data, ATerm t)
|
void setParseResult(ParseData * data, ATerm t)
|
||||||
{
|
{
|
||||||
|
@ -71,6 +81,7 @@ const char * getPath(ParseData * data)
|
||||||
return data->path.c_str();
|
return data->path.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
Expr unescapeStr(const char * s)
|
Expr unescapeStr(const char * s)
|
||||||
{
|
{
|
||||||
string t;
|
string t;
|
||||||
|
@ -93,11 +104,7 @@ Expr unescapeStr(const char * s)
|
||||||
}
|
}
|
||||||
return makeStr(toATerm(t));
|
return makeStr(toATerm(t));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
int yyparse(yyscan_t scanner, ParseData * data);
|
|
||||||
|
|
||||||
|
|
||||||
} /* end of C functions */
|
|
||||||
|
|
||||||
|
|
||||||
static void checkAttrs(ATermMap & names, ATermList bnds)
|
static void checkAttrs(ATermMap & names, ATermList bnds)
|
||||||
|
@ -232,3 +239,6 @@ Expr parseExprFromString(EvalState & state,
|
||||||
{
|
{
|
||||||
return parse(state, s.c_str(), "(string)", basePath);
|
return parse(state, s.c_str(), "(string)", basePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -4,6 +4,9 @@
|
||||||
#include "eval.hh"
|
#include "eval.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
/* Parse a Nix expression from the specified file. If `path' refers
|
/* Parse a Nix expression from the specified file. If `path' refers
|
||||||
to a directory, the "/default.nix" is appended. */
|
to a directory, the "/default.nix" is appended. */
|
||||||
Expr parseExprFromFile(EvalState & state, Path path);
|
Expr parseExprFromFile(EvalState & state, Path path);
|
||||||
|
@ -13,4 +16,7 @@ Expr parseExprFromString(EvalState & state, const string & s,
|
||||||
const Path & basePath);
|
const Path & basePath);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__PARSER_H */
|
#endif /* !__PARSER_H */
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
%locations
|
%locations
|
||||||
%error-verbose
|
%error-verbose
|
||||||
%parse-param { yyscan_t scanner }
|
%parse-param { yyscan_t scanner }
|
||||||
%parse-param { void * data }
|
%parse-param { ParseData * data }
|
||||||
%lex-param { yyscan_t scanner }
|
%lex-param { yyscan_t scanner }
|
||||||
|
|
||||||
%{
|
%{
|
||||||
|
@ -12,34 +12,47 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <aterm2.h>
|
#include <aterm2.h>
|
||||||
|
|
||||||
#include "parser-tab.h"
|
#include "parser-tab.hh"
|
||||||
|
extern "C" {
|
||||||
#include "lexer-tab.h"
|
#include "lexer-tab.h"
|
||||||
|
}
|
||||||
|
|
||||||
typedef ATerm Expr;
|
#include "aterm.hh"
|
||||||
typedef ATerm ValidValues;
|
|
||||||
typedef ATerm DefaultValue;
|
|
||||||
typedef ATerm Pos;
|
|
||||||
|
|
||||||
|
#include "nixexpr.hh"
|
||||||
#include "nixexpr-ast.hh"
|
#include "nixexpr-ast.hh"
|
||||||
|
|
||||||
void setParseResult(void * data, ATerm t);
|
using namespace nix;
|
||||||
void parseError(void * data, char * error, int line, int column);
|
|
||||||
ATerm absParsedPath(void * data, ATerm t);
|
|
||||||
ATerm fixAttrs(int recursive, ATermList as);
|
|
||||||
const char * getPath(void * data);
|
|
||||||
void backToString(yyscan_t scanner);
|
|
||||||
|
|
||||||
void yyerror(YYLTYPE * loc, yyscan_t scanner, void * data, char * s)
|
namespace nix {
|
||||||
|
|
||||||
|
struct ParseData
|
||||||
|
{
|
||||||
|
Expr result;
|
||||||
|
Path basePath;
|
||||||
|
Path path;
|
||||||
|
string error;
|
||||||
|
};
|
||||||
|
|
||||||
|
void setParseResult(ParseData * data, ATerm t);
|
||||||
|
void parseError(ParseData * data, char * error, int line, int column);
|
||||||
|
ATerm absParsedPath(ParseData * data, ATerm t);
|
||||||
|
ATerm fixAttrs(int recursive, ATermList as);
|
||||||
|
const char * getPath(ParseData * data);
|
||||||
|
Expr unescapeStr(const char * s);
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
void backToString(yyscan_t scanner);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void yyerror(YYLTYPE * loc, yyscan_t scanner, ParseData * data, char * s)
|
||||||
{
|
{
|
||||||
parseError(data, s, loc->first_line, loc->first_column);
|
parseError(data, s, loc->first_line, loc->first_column);
|
||||||
}
|
}
|
||||||
|
|
||||||
ATerm toATerm(const char * s)
|
static Pos makeCurPos(YYLTYPE * loc, ParseData * data)
|
||||||
{
|
|
||||||
return (ATerm) ATmakeAppl0(ATmakeAFun((char *) s, 0, ATtrue));
|
|
||||||
}
|
|
||||||
|
|
||||||
static Pos makeCurPos(YYLTYPE * loc, void * data)
|
|
||||||
{
|
{
|
||||||
return makePos(toATerm(getPath(data)),
|
return makePos(toATerm(getPath(data)),
|
||||||
loc->first_line, loc->first_column);
|
loc->first_line, loc->first_column);
|
||||||
|
|
|
@ -1,11 +1,16 @@
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
#include "build.hh"
|
#include "build.hh"
|
||||||
#include "misc.hh"
|
#include "misc.hh"
|
||||||
#include "eval.hh"
|
#include "eval.hh"
|
||||||
#include "globals.hh"
|
#include "globals.hh"
|
||||||
#include "nixexpr-ast.hh"
|
#include "store.hh"
|
||||||
|
#include "util.hh"
|
||||||
#include "expr-to-xml.hh"
|
#include "expr-to-xml.hh"
|
||||||
|
#include "nixexpr-ast.hh"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
static Expr primBuiltins(EvalState & state, const ATermVector & args)
|
static Expr primBuiltins(EvalState & state, const ATermVector & args)
|
||||||
|
@ -472,7 +477,7 @@ static Expr primToString(EvalState & state, const ATermVector & args)
|
||||||
be sensibly or completely represented (e.g., functions). */
|
be sensibly or completely represented (e.g., functions). */
|
||||||
static Expr primToXML(EvalState & state, const ATermVector & args)
|
static Expr primToXML(EvalState & state, const ATermVector & args)
|
||||||
{
|
{
|
||||||
ostringstream out;
|
std::ostringstream out;
|
||||||
printTermAsXML(strictEvalExpr(state, args[0]), out);
|
printTermAsXML(strictEvalExpr(state, args[0]), out);
|
||||||
return makeStr(toATerm(out.str()));
|
return makeStr(toATerm(out.str()));
|
||||||
}
|
}
|
||||||
|
@ -746,3 +751,6 @@ void EvalState::addPrimOps()
|
||||||
addPrimOp("removeAttrs", 2, primRemoveAttrs);
|
addPrimOp("removeAttrs", 2, primRemoveAttrs);
|
||||||
addPrimOp("relativise", 2, primRelativise);
|
addPrimOp("relativise", 2, primRelativise);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
#include "shared.hh"
|
||||||
|
#include "globals.hh"
|
||||||
|
#include "gc.hh"
|
||||||
|
#include "store.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
|
|
||||||
|
@ -12,12 +20,8 @@ extern "C" {
|
||||||
#include <aterm2.h>
|
#include <aterm2.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "globals.hh"
|
|
||||||
#include "gc.hh"
|
|
||||||
#include "store.hh"
|
|
||||||
#include "shared.hh"
|
|
||||||
|
|
||||||
#include "config.h"
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
volatile sig_atomic_t blockInt = 0;
|
volatile sig_atomic_t blockInt = 0;
|
||||||
|
@ -173,7 +177,7 @@ static void initAndRun(int argc, char * * argv)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (arg == "--version") {
|
else if (arg == "--version") {
|
||||||
cout << format("%1% (Nix) %2%") % programId % NIX_VERSION << endl;
|
std::cout << format("%1% (Nix) %2%") % programId % NIX_VERSION << std::endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (arg == "--keep-failed" || arg == "-K")
|
else if (arg == "--keep-failed" || arg == "-K")
|
||||||
|
@ -338,10 +342,15 @@ void switchToNixUser()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static char buf[1024];
|
static char buf[1024];
|
||||||
|
|
||||||
int main(int argc, char * * argv)
|
int main(int argc, char * * argv)
|
||||||
{
|
{
|
||||||
|
using namespace nix;
|
||||||
|
|
||||||
/* If we are setuid root, we have to get rid of the excess
|
/* If we are setuid root, we have to get rid of the excess
|
||||||
privileges ASAP. */
|
privileges ASAP. */
|
||||||
switchToNixUser();
|
switchToNixUser();
|
||||||
|
@ -352,7 +361,7 @@ int main(int argc, char * * argv)
|
||||||
|
|
||||||
/* Turn on buffering for cerr. */
|
/* Turn on buffering for cerr. */
|
||||||
#if HAVE_PUBSETBUF
|
#if HAVE_PUBSETBUF
|
||||||
cerr.rdbuf()->pubsetbuf(buf, sizeof(buf));
|
std::cerr.rdbuf()->pubsetbuf(buf, sizeof(buf));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -377,10 +386,12 @@ int main(int argc, char * * argv)
|
||||||
} catch (Error & e) {
|
} catch (Error & e) {
|
||||||
printMsg(lvlError, format("error: %1%") % e.msg());
|
printMsg(lvlError, format("error: %1%") % e.msg());
|
||||||
return 1;
|
return 1;
|
||||||
} catch (exception & e) {
|
} catch (std::exception & e) {
|
||||||
printMsg(lvlError, format("error: %1%") % e.what());
|
printMsg(lvlError, format("error: %1%") % e.what());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
#ifndef __SHARED_H
|
#ifndef __SHARED_H
|
||||||
#define __SHARED_H
|
#define __SHARED_H
|
||||||
|
|
||||||
#include <string>
|
#include "types.hh"
|
||||||
|
|
||||||
#include "util.hh"
|
|
||||||
|
|
||||||
|
|
||||||
/* These are not implemented here, but must be implemented by a
|
/* These are not implemented here, but must be implemented by a
|
||||||
|
@ -12,17 +10,21 @@
|
||||||
/* Main program. Called by main() after the ATerm library has been
|
/* Main program. Called by main() after the ATerm library has been
|
||||||
initialised and some default arguments have been processed (and
|
initialised and some default arguments have been processed (and
|
||||||
removed from `args'). main() will catch all exceptions. */
|
removed from `args'). main() will catch all exceptions. */
|
||||||
void run(Strings args);
|
void run(nix::Strings args);
|
||||||
|
|
||||||
/* Should print a help message to stdout and return. */
|
/* Should print a help message to stdout and return. */
|
||||||
void printHelp();
|
void printHelp();
|
||||||
|
|
||||||
|
extern std::string programId;
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
/* Ugh. No better place to put this. */
|
/* Ugh. No better place to put this. */
|
||||||
Path makeRootName(const Path & gcRoot, int & counter);
|
Path makeRootName(const Path & gcRoot, int & counter);
|
||||||
void printGCWarning();
|
void printGCWarning();
|
||||||
|
|
||||||
|
}
|
||||||
extern string programId;
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__SHARED_H */
|
#endif /* !__SHARED_H */
|
||||||
|
|
|
@ -1,3 +1,13 @@
|
||||||
|
#include "build.hh"
|
||||||
|
#include "references.hh"
|
||||||
|
#include "pathlocks.hh"
|
||||||
|
#include "misc.hh"
|
||||||
|
#include "globals.hh"
|
||||||
|
#include "gc.hh"
|
||||||
|
#include "store.hh"
|
||||||
|
#include "db.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
@ -15,13 +25,11 @@
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
|
|
||||||
#include "build.hh"
|
|
||||||
#include "references.hh"
|
|
||||||
#include "pathlocks.hh"
|
|
||||||
#include "misc.hh"
|
|
||||||
#include "globals.hh"
|
|
||||||
#include "gc.hh"
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
using std::map;
|
||||||
|
|
||||||
|
|
||||||
/* !!! TODO derivationFromPath shouldn't be used here */
|
/* !!! TODO derivationFromPath shouldn't be used here */
|
||||||
|
|
||||||
|
@ -38,8 +46,8 @@ class Worker;
|
||||||
|
|
||||||
/* A pointer to a goal. */
|
/* A pointer to a goal. */
|
||||||
class Goal;
|
class Goal;
|
||||||
typedef shared_ptr<Goal> GoalPtr;
|
typedef boost::shared_ptr<Goal> GoalPtr;
|
||||||
typedef weak_ptr<Goal> WeakGoalPtr;
|
typedef boost::weak_ptr<Goal> WeakGoalPtr;
|
||||||
|
|
||||||
/* Set of goals. */
|
/* Set of goals. */
|
||||||
typedef set<GoalPtr> Goals;
|
typedef set<GoalPtr> Goals;
|
||||||
|
@ -50,7 +58,7 @@ typedef map<Path, WeakGoalPtr> WeakGoalMap;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Goal : public enable_shared_from_this<Goal>
|
class Goal : public boost::enable_shared_from_this<Goal>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef enum {ecBusy, ecSuccess, ecFailed} ExitCode;
|
typedef enum {ecBusy, ecSuccess, ecFailed} ExitCode;
|
||||||
|
@ -447,8 +455,8 @@ static void killUser(uid_t uid)
|
||||||
if (kill(-1, SIGKILL) == -1)
|
if (kill(-1, SIGKILL) == -1)
|
||||||
throw SysError(format("cannot kill processes for UID `%1%'") % uid);
|
throw SysError(format("cannot kill processes for UID `%1%'") % uid);
|
||||||
|
|
||||||
} catch (exception & e) {
|
} catch (std::exception & e) {
|
||||||
cerr << format("build error: %1%\n") % e.what();
|
std::cerr << format("build error: %1%\n") % e.what();
|
||||||
quickExit(1);
|
quickExit(1);
|
||||||
}
|
}
|
||||||
quickExit(0);
|
quickExit(0);
|
||||||
|
@ -930,8 +938,8 @@ DerivationGoal::HookReply DerivationGoal::tryBuildHook()
|
||||||
|
|
||||||
throw SysError(format("executing `%1%'") % buildHook);
|
throw SysError(format("executing `%1%'") % buildHook);
|
||||||
|
|
||||||
} catch (exception & e) {
|
} catch (std::exception & e) {
|
||||||
cerr << format("build error: %1%\n") % e.what();
|
std::cerr << format("build error: %1%\n") % e.what();
|
||||||
}
|
}
|
||||||
quickExit(1);
|
quickExit(1);
|
||||||
}
|
}
|
||||||
|
@ -1326,8 +1334,8 @@ void DerivationGoal::startBuilder()
|
||||||
throw SysError(format("executing `%1%'")
|
throw SysError(format("executing `%1%'")
|
||||||
% drv.builder);
|
% drv.builder);
|
||||||
|
|
||||||
} catch (exception & e) {
|
} catch (std::exception & e) {
|
||||||
cerr << format("build error: %1%\n") % e.what();
|
std::cerr << format("build error: %1%\n") % e.what();
|
||||||
}
|
}
|
||||||
quickExit(1);
|
quickExit(1);
|
||||||
}
|
}
|
||||||
|
@ -1593,7 +1601,7 @@ private:
|
||||||
Pid pid;
|
Pid pid;
|
||||||
|
|
||||||
/* Lock on the store path. */
|
/* Lock on the store path. */
|
||||||
shared_ptr<PathLocks> outputLock;
|
boost::shared_ptr<PathLocks> outputLock;
|
||||||
|
|
||||||
typedef void (SubstitutionGoal::*GoalState)();
|
typedef void (SubstitutionGoal::*GoalState)();
|
||||||
GoalState state;
|
GoalState state;
|
||||||
|
@ -1719,7 +1727,7 @@ void SubstitutionGoal::tryToRun()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Acquire a lock on the output path. */
|
/* Acquire a lock on the output path. */
|
||||||
outputLock = shared_ptr<PathLocks>(new PathLocks);
|
outputLock = boost::shared_ptr<PathLocks>(new PathLocks);
|
||||||
outputLock->lockPaths(singleton<PathSet>(storePath),
|
outputLock->lockPaths(singleton<PathSet>(storePath),
|
||||||
(format("waiting for lock on `%1%'") % storePath).str());
|
(format("waiting for lock on `%1%'") % storePath).str());
|
||||||
|
|
||||||
|
@ -1767,8 +1775,8 @@ void SubstitutionGoal::tryToRun()
|
||||||
|
|
||||||
throw SysError(format("executing `%1%'") % sub.program);
|
throw SysError(format("executing `%1%'") % sub.program);
|
||||||
|
|
||||||
} catch (exception & e) {
|
} catch (std::exception & e) {
|
||||||
cerr << format("substitute error: %1%\n") % e.what();
|
std::cerr << format("substitute error: %1%\n") % e.what();
|
||||||
}
|
}
|
||||||
quickExit(1);
|
quickExit(1);
|
||||||
}
|
}
|
||||||
|
@ -1930,8 +1938,8 @@ static void removeGoal(GoalPtr goal, WeakGoalMap & goalMap)
|
||||||
|
|
||||||
void Worker::removeGoal(GoalPtr goal)
|
void Worker::removeGoal(GoalPtr goal)
|
||||||
{
|
{
|
||||||
::removeGoal(goal, derivationGoals);
|
nix::removeGoal(goal, derivationGoals);
|
||||||
::removeGoal(goal, substitutionGoals);
|
nix::removeGoal(goal, substitutionGoals);
|
||||||
if (topGoals.find(goal) != topGoals.end()) {
|
if (topGoals.find(goal) != topGoals.end()) {
|
||||||
topGoals.erase(goal);
|
topGoals.erase(goal);
|
||||||
/* If a top-level goal failed, then kill all other goals
|
/* If a top-level goal failed, then kill all other goals
|
||||||
|
@ -2160,3 +2168,6 @@ void ensurePath(const Path & path)
|
||||||
if (goal->getExitCode() != Goal::ecSuccess)
|
if (goal->getExitCode() != Goal::ecSuccess)
|
||||||
throw Error(format("path `%1%' does not exist and cannot be created") % path);
|
throw Error(format("path `%1%' does not exist and cannot be created") % path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -1,8 +1,13 @@
|
||||||
#ifndef __BUILD_H
|
#ifndef __BUILD_H
|
||||||
#define __BUILD_H
|
#define __BUILD_H
|
||||||
|
|
||||||
#include "derivations.hh"
|
|
||||||
|
|
||||||
|
#include "types.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
/* Ensure that the output paths of the derivation are valid. If they
|
/* Ensure that the output paths of the derivation are valid. If they
|
||||||
are already valid, this is a no-op. Otherwise, validity can
|
are already valid, this is a no-op. Otherwise, validity can
|
||||||
be reached in two ways. First, if the output paths have
|
be reached in two ways. First, if the output paths have
|
||||||
|
@ -16,5 +21,7 @@ void buildDerivations(const PathSet & drvPaths);
|
||||||
void ensurePath(const Path & storePath);
|
void ensurePath(const Path & storePath);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__BUILD_H */
|
#endif /* !__BUILD_H */
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
#include "db.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
#include "pathlocks.hh"
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
@ -7,9 +11,8 @@
|
||||||
|
|
||||||
#include <db_cxx.h>
|
#include <db_cxx.h>
|
||||||
|
|
||||||
#include "db.hh"
|
|
||||||
#include "util.hh"
|
namespace nix {
|
||||||
#include "pathlocks.hh"
|
|
||||||
|
|
||||||
|
|
||||||
/* Wrapper class to ensure proper destruction. */
|
/* Wrapper class to ensure proper destruction. */
|
||||||
|
@ -112,7 +115,7 @@ Db * Database::getDb(TableId table)
|
||||||
if (table == 0)
|
if (table == 0)
|
||||||
throw Error("database table is not open "
|
throw Error("database table is not open "
|
||||||
"(maybe you don't have sufficient permission?)");
|
"(maybe you don't have sufficient permission?)");
|
||||||
map<TableId, Db *>::iterator i = tables.find(table);
|
std::map<TableId, Db *>::iterator i = tables.find(table);
|
||||||
if (i == tables.end())
|
if (i == tables.end())
|
||||||
throw Error("unknown table id");
|
throw Error("unknown table id");
|
||||||
return i->second;
|
return i->second;
|
||||||
|
@ -263,10 +266,10 @@ void Database::close()
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
for (map<TableId, Db *>::iterator i = tables.begin();
|
for (std::map<TableId, Db *>::iterator i = tables.begin();
|
||||||
i != tables.end(); )
|
i != tables.end(); )
|
||||||
{
|
{
|
||||||
map<TableId, Db *>::iterator j = i;
|
std::map<TableId, Db *>::iterator j = i;
|
||||||
++j;
|
++j;
|
||||||
closeTable(i->first);
|
closeTable(i->first);
|
||||||
i = j;
|
i = j;
|
||||||
|
@ -433,3 +436,6 @@ void Database::enumTable(const Transaction & txn, TableId table,
|
||||||
|
|
||||||
} catch (DbException e) { rethrow(e); }
|
} catch (DbException e) { rethrow(e); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -1,14 +1,10 @@
|
||||||
#ifndef __DB_H
|
#ifndef __DB_H
|
||||||
#define __DB_H
|
#define __DB_H
|
||||||
|
|
||||||
#include <string>
|
#include "types.hh"
|
||||||
#include <list>
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include "util.hh"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
|
|
||||||
/* Defined externally. */
|
/* Defined externally. */
|
||||||
class DbTxn;
|
class DbTxn;
|
||||||
|
@ -16,6 +12,9 @@ class DbEnv;
|
||||||
class Db;
|
class Db;
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
class Database;
|
class Database;
|
||||||
|
|
||||||
|
|
||||||
|
@ -53,7 +52,7 @@ private:
|
||||||
DbEnv * env;
|
DbEnv * env;
|
||||||
|
|
||||||
TableId nextId;
|
TableId nextId;
|
||||||
map<TableId, Db *> tables;
|
std::map<TableId, Db *> tables;
|
||||||
|
|
||||||
void requireEnv();
|
void requireEnv();
|
||||||
|
|
||||||
|
@ -99,5 +98,8 @@ public:
|
||||||
DbNoPermission(const format & f) : Error(f) { };
|
DbNoPermission(const format & f) : Error(f) { };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__DB_H */
|
#endif /* !__DB_H */
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
#include "derivations.hh"
|
#include "derivations.hh"
|
||||||
#include "globals.hh"
|
|
||||||
#include "store.hh"
|
#include "store.hh"
|
||||||
|
|
||||||
#include "derivations-ast.hh"
|
#include "derivations-ast.hh"
|
||||||
#include "derivations-ast.cc"
|
#include "derivations-ast.cc"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
Hash hashTerm(ATerm t)
|
Hash hashTerm(ATerm t)
|
||||||
{
|
{
|
||||||
return hashString(htSHA256, atPrint(t));
|
return hashString(htSHA256, atPrint(t));
|
||||||
|
@ -170,3 +172,6 @@ bool isDerivation(const string & fileName)
|
||||||
fileName.size() >= drvExtension.size() &&
|
fileName.size() >= drvExtension.size() &&
|
||||||
string(fileName, fileName.size() - drvExtension.size()) == drvExtension;
|
string(fileName, fileName.size() - drvExtension.size()) == drvExtension;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -2,7 +2,12 @@
|
||||||
#define __DERIVATIONS_H
|
#define __DERIVATIONS_H
|
||||||
|
|
||||||
#include "aterm.hh"
|
#include "aterm.hh"
|
||||||
#include "store.hh"
|
#include "hash.hh"
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
/* Extension of derivations in the Nix store. */
|
/* Extension of derivations in the Nix store. */
|
||||||
|
@ -27,13 +32,13 @@ struct DerivationOutput
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef map<string, DerivationOutput> DerivationOutputs;
|
typedef std::map<string, DerivationOutput> DerivationOutputs;
|
||||||
|
|
||||||
/* For inputs that are sub-derivations, we specify exactly which
|
/* For inputs that are sub-derivations, we specify exactly which
|
||||||
output IDs we are interested in. */
|
output IDs we are interested in. */
|
||||||
typedef map<Path, StringSet> DerivationInputs;
|
typedef std::map<Path, StringSet> DerivationInputs;
|
||||||
|
|
||||||
typedef map<string, string> StringPairs;
|
typedef std::map<string, string> StringPairs;
|
||||||
|
|
||||||
struct Derivation
|
struct Derivation
|
||||||
{
|
{
|
||||||
|
@ -63,5 +68,8 @@ ATerm unparseDerivation(const Derivation & drv);
|
||||||
derivations. */
|
derivations. */
|
||||||
bool isDerivation(const string & fileName);
|
bool isDerivation(const string & fileName);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__DERIVATIONS_H */
|
#endif /* !__DERIVATIONS_H */
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
#include "globals.hh"
|
|
||||||
#include "gc.hh"
|
#include "gc.hh"
|
||||||
|
#include "globals.hh"
|
||||||
#include "misc.hh"
|
#include "misc.hh"
|
||||||
#include "pathlocks.hh"
|
#include "pathlocks.hh"
|
||||||
|
#include "store.hh"
|
||||||
|
#include "db.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
|
|
||||||
|
@ -17,6 +20,9 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
static string gcLockName = "gc.lock";
|
static string gcLockName = "gc.lock";
|
||||||
static string tempRootsDir = "temproots";
|
static string tempRootsDir = "temproots";
|
||||||
static string gcRootsDir = "gcroots";
|
static string gcRootsDir = "gcroots";
|
||||||
|
@ -192,7 +198,7 @@ void removeTempRoots()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef shared_ptr<AutoCloseFD> FDPtr;
|
typedef boost::shared_ptr<AutoCloseFD> FDPtr;
|
||||||
typedef list<FDPtr> FDs;
|
typedef list<FDPtr> FDs;
|
||||||
|
|
||||||
|
|
||||||
|
@ -558,3 +564,6 @@ void collectGarbage(GCAction action, const PathSet & pathsToDelete,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
#ifndef __GC_H
|
#ifndef __GC_H
|
||||||
#define __GC_H
|
#define __GC_H
|
||||||
|
|
||||||
#include "util.hh"
|
#include "types.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
/* Garbage collector operation. */
|
/* Garbage collector operation. */
|
||||||
|
@ -39,4 +42,7 @@ Path addPermRoot(const Path & storePath, const Path & gcRoot,
|
||||||
bool indirect);
|
bool indirect);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__GC_H */
|
#endif /* !__GC_H */
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
#include "globals.hh"
|
#include "globals.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
string nixStore = "/UNINIT";
|
string nixStore = "/UNINIT";
|
||||||
string nixDataDir = "/UNINIT";
|
string nixDataDir = "/UNINIT";
|
||||||
string nixLogDir = "/UNINIT";
|
string nixLogDir = "/UNINIT";
|
||||||
|
@ -23,7 +27,7 @@ string thisSystem = "unset";
|
||||||
|
|
||||||
static bool settingsRead = false;
|
static bool settingsRead = false;
|
||||||
|
|
||||||
static map<string, Strings> settings;
|
static std::map<string, Strings> settings;
|
||||||
|
|
||||||
|
|
||||||
string & at(Strings & ss, unsigned int n)
|
string & at(Strings & ss, unsigned int n)
|
||||||
|
@ -72,7 +76,7 @@ static void readSettings()
|
||||||
Strings querySetting(const string & name, const Strings & def)
|
Strings querySetting(const string & name, const Strings & def)
|
||||||
{
|
{
|
||||||
if (!settingsRead) readSettings();
|
if (!settingsRead) readSettings();
|
||||||
map<string, Strings>::iterator i = settings.find(name);
|
std::map<string, Strings>::iterator i = settings.find(name);
|
||||||
return i == settings.end() ? def : i->second;
|
return i == settings.end() ? def : i->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,3 +102,6 @@ bool queryBoolSetting(const string & name, bool def)
|
||||||
else throw Error(format("configuration option `%1%' should be either `true' or `false', not `%2%'")
|
else throw Error(format("configuration option `%1%' should be either `true' or `false', not `%2%'")
|
||||||
% name % v);
|
% name % v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
#ifndef __GLOBALS_H
|
#ifndef __GLOBALS_H
|
||||||
#define __GLOBALS_H
|
#define __GLOBALS_H
|
||||||
|
|
||||||
#include <string>
|
#include "types.hh"
|
||||||
#include <set>
|
|
||||||
#include "util.hh"
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
/* Path names. */
|
/* Path names. */
|
||||||
|
|
||||||
|
@ -67,5 +67,8 @@ string querySetting(const string & name, const string & def);
|
||||||
|
|
||||||
bool queryBoolSetting(const string & name, bool def);
|
bool queryBoolSetting(const string & name, bool def);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__GLOBALS_H */
|
#endif /* !__GLOBALS_H */
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
|
#include "misc.hh"
|
||||||
|
#include "store.hh"
|
||||||
#include "build.hh"
|
#include "build.hh"
|
||||||
|
#include "db.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
Derivation derivationFromPath(const Path & drvPath)
|
Derivation derivationFromPath(const Path & drvPath)
|
||||||
|
@ -81,3 +87,6 @@ void queryMissing(const PathSet & targets,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -4,6 +4,9 @@
|
||||||
#include "derivations.hh"
|
#include "derivations.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
/* Read a derivation, after ensuring its existence through
|
/* Read a derivation, after ensuring its existence through
|
||||||
ensurePath(). */
|
ensurePath(). */
|
||||||
Derivation derivationFromPath(const Path & drvPath);
|
Derivation derivationFromPath(const Path & drvPath);
|
||||||
|
@ -29,4 +32,7 @@ void queryMissing(const PathSet & targets,
|
||||||
PathSet & willBuild, PathSet & willSubstitute);
|
PathSet & willBuild, PathSet & willSubstitute);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__MISC_H */
|
#endif /* !__MISC_H */
|
||||||
|
|
|
@ -1,17 +1,21 @@
|
||||||
|
#include "pathlocks.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include "pathlocks.hh"
|
|
||||||
|
|
||||||
#ifdef __CYGWIN__
|
#ifdef __CYGWIN__
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <sys/cygwin.h>
|
#include <sys/cygwin.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
int openLockFile(const Path & path, bool create)
|
int openLockFile(const Path & path, bool create)
|
||||||
{
|
{
|
||||||
AutoCloseFD fd;
|
AutoCloseFD fd;
|
||||||
|
@ -220,3 +224,6 @@ void PathLocks::setDeletion(bool deletePaths)
|
||||||
{
|
{
|
||||||
this->deletePaths = deletePaths;
|
this->deletePaths = deletePaths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
#ifndef __PATHLOCKS_H
|
#ifndef __PATHLOCKS_H
|
||||||
#define __PATHLOCKS_H
|
#define __PATHLOCKS_H
|
||||||
|
|
||||||
#include "util.hh"
|
#include "types.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
/* Open (possibly create) a lock file and return the file descriptor.
|
/* Open (possibly create) a lock file and return the file descriptor.
|
||||||
|
@ -22,7 +25,7 @@ bool lockFile(int fd, LockType lockType, bool wait);
|
||||||
class PathLocks
|
class PathLocks
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
typedef pair<int, Path> FDPair;
|
typedef std::pair<int, Path> FDPair;
|
||||||
list<FDPair> fds;
|
list<FDPair> fds;
|
||||||
bool deletePaths;
|
bool deletePaths;
|
||||||
|
|
||||||
|
@ -37,4 +40,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__PATHLOCKS_H */
|
#endif /* !__PATHLOCKS_H */
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
#include "references.hh"
|
||||||
|
#include "hash.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
|
@ -7,8 +11,8 @@
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include "references.hh"
|
|
||||||
#include "hash.hh"
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
static unsigned int refLength = 32; /* characters */
|
static unsigned int refLength = 32; /* characters */
|
||||||
|
@ -90,7 +94,7 @@ void checkPath(const string & path,
|
||||||
|
|
||||||
PathSet scanForReferences(const string & path, const PathSet & paths)
|
PathSet scanForReferences(const string & path, const PathSet & paths)
|
||||||
{
|
{
|
||||||
map<string, Path> backMap;
|
std::map<string, Path> backMap;
|
||||||
StringSet ids;
|
StringSet ids;
|
||||||
StringSet seen;
|
StringSet seen;
|
||||||
|
|
||||||
|
@ -114,10 +118,13 @@ PathSet scanForReferences(const string & path, const PathSet & paths)
|
||||||
|
|
||||||
PathSet found;
|
PathSet found;
|
||||||
for (StringSet::iterator i = seen.begin(); i != seen.end(); i++) {
|
for (StringSet::iterator i = seen.begin(); i != seen.end(); i++) {
|
||||||
map<string, Path>::iterator j;
|
std::map<string, Path>::iterator j;
|
||||||
if ((j = backMap.find(*i)) == backMap.end()) abort();
|
if ((j = backMap.find(*i)) == backMap.end()) abort();
|
||||||
found.insert(j->second);
|
found.insert(j->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
#ifndef __REFERENCES_H
|
#ifndef __REFERENCES_H
|
||||||
#define __REFERENCES_H
|
#define __REFERENCES_H
|
||||||
|
|
||||||
#include "util.hh"
|
#include "types.hh"
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
PathSet scanForReferences(const Path & path, const PathSet & refs);
|
PathSet scanForReferences(const Path & path, const PathSet & refs);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* !__REFERENCES_H */
|
#endif /* !__REFERENCES_H */
|
||||||
|
|
|
@ -1,3 +1,13 @@
|
||||||
|
#include "store.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
#include "globals.hh"
|
||||||
|
#include "db.hh"
|
||||||
|
#include "archive.hh"
|
||||||
|
#include "pathlocks.hh"
|
||||||
|
#include "gc.hh"
|
||||||
|
#include "aterm.hh"
|
||||||
|
#include "derivations-ast.hh"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
@ -6,14 +16,9 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
|
|
||||||
#include "store.hh"
|
namespace nix {
|
||||||
#include "globals.hh"
|
|
||||||
#include "db.hh"
|
|
||||||
#include "archive.hh"
|
|
||||||
#include "pathlocks.hh"
|
|
||||||
#include "gc.hh"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Nix database. */
|
/* Nix database. */
|
||||||
static Database nixDB;
|
static Database nixDB;
|
||||||
|
|
||||||
|
@ -956,10 +961,6 @@ void verifyStore(bool checkContents)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#include "aterm.hh"
|
|
||||||
#include "derivations-ast.hh"
|
|
||||||
|
|
||||||
|
|
||||||
/* Upgrade from schema 1 (Nix <= 0.7) to schema 2 (Nix >= 0.8). */
|
/* Upgrade from schema 1 (Nix <= 0.7) to schema 2 (Nix >= 0.8). */
|
||||||
static void upgradeStore07()
|
static void upgradeStore07()
|
||||||
{
|
{
|
||||||
|
@ -971,7 +972,7 @@ static void upgradeStore07()
|
||||||
nixDB.enumTable(txn, dbValidPaths, validPaths2);
|
nixDB.enumTable(txn, dbValidPaths, validPaths2);
|
||||||
PathSet validPaths(validPaths2.begin(), validPaths2.end());
|
PathSet validPaths(validPaths2.begin(), validPaths2.end());
|
||||||
|
|
||||||
cerr << "hashing paths...";
|
std::cerr << "hashing paths...";
|
||||||
int n = 0;
|
int n = 0;
|
||||||
for (PathSet::iterator i = validPaths.begin(); i != validPaths.end(); ++i) {
|
for (PathSet::iterator i = validPaths.begin(); i != validPaths.end(); ++i) {
|
||||||
checkInterrupt();
|
checkInterrupt();
|
||||||
|
@ -980,20 +981,20 @@ static void upgradeStore07()
|
||||||
if (s == "") {
|
if (s == "") {
|
||||||
Hash hash = hashPath(htSHA256, *i);
|
Hash hash = hashPath(htSHA256, *i);
|
||||||
setHash(txn, *i, hash);
|
setHash(txn, *i, hash);
|
||||||
cerr << ".";
|
std::cerr << ".";
|
||||||
if (++n % 1000 == 0) {
|
if (++n % 1000 == 0) {
|
||||||
txn.commit();
|
txn.commit();
|
||||||
txn.begin(nixDB);
|
txn.begin(nixDB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cerr << "\n";
|
std::cerr << std::endl;
|
||||||
|
|
||||||
txn.commit();
|
txn.commit();
|
||||||
|
|
||||||
txn.begin(nixDB);
|
txn.begin(nixDB);
|
||||||
|
|
||||||
cerr << "processing closures...";
|
std::cerr << "processing closures...";
|
||||||
for (PathSet::iterator i = validPaths.begin(); i != validPaths.end(); ++i) {
|
for (PathSet::iterator i = validPaths.begin(); i != validPaths.end(); ++i) {
|
||||||
checkInterrupt();
|
checkInterrupt();
|
||||||
if (i->size() > 6 && string(*i, i->size() - 6) == ".store") {
|
if (i->size() > 6 && string(*i, i->size() - 6) == ".store") {
|
||||||
|
@ -1037,10 +1038,10 @@ static void upgradeStore07()
|
||||||
setReferences(txn, path, references);
|
setReferences(txn, path, references);
|
||||||
}
|
}
|
||||||
|
|
||||||
cerr << ".";
|
std::cerr << ".";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cerr << "\n";
|
std::cerr << std::endl;
|
||||||
|
|
||||||
/* !!! maybe this transaction is way too big */
|
/* !!! maybe this transaction is way too big */
|
||||||
txn.commit();
|
txn.commit();
|
||||||
|
@ -1061,7 +1062,7 @@ static void upgradeStore09()
|
||||||
|
|
||||||
Transaction txn(nixDB);
|
Transaction txn(nixDB);
|
||||||
|
|
||||||
cerr << "converting referers to referrers...";
|
std::cerr << "converting referers to referrers...";
|
||||||
|
|
||||||
TableId dbReferers = nixDB.openTable("referers"); /* sic! */
|
TableId dbReferers = nixDB.openTable("referers"); /* sic! */
|
||||||
|
|
||||||
|
@ -1080,16 +1081,19 @@ static void upgradeStore09()
|
||||||
if (++n % 1000 == 0) {
|
if (++n % 1000 == 0) {
|
||||||
txn.commit();
|
txn.commit();
|
||||||
txn.begin(nixDB);
|
txn.begin(nixDB);
|
||||||
cerr << "|";
|
std::cerr << "|";
|
||||||
}
|
}
|
||||||
cerr << ".";
|
std::cerr << ".";
|
||||||
}
|
}
|
||||||
|
|
||||||
txn.commit();
|
txn.commit();
|
||||||
|
|
||||||
cerr << "\n";
|
std::cerr << std::endl;
|
||||||
|
|
||||||
nixDB.closeTable(dbReferers);
|
nixDB.closeTable(dbReferers);
|
||||||
|
|
||||||
nixDB.deleteTable("referers");
|
nixDB.deleteTable("referers");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -4,9 +4,12 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "hash.hh"
|
#include "hash.hh"
|
||||||
#include "db.hh"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
|
class Transaction;
|
||||||
|
|
||||||
|
|
||||||
/* Nix store and database schema version. Version 1 (or 0) was Nix <=
|
/* Nix store and database schema version. Version 1 (or 0) was Nix <=
|
||||||
|
@ -168,5 +171,8 @@ void deleteFromStore(const Path & path, unsigned long long & bytesFreed);
|
||||||
|
|
||||||
void verifyStore(bool checkContents);
|
void verifyStore(bool checkContents);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__STORE_H */
|
#endif /* !__STORE_H */
|
||||||
|
|
|
@ -3,7 +3,8 @@ pkglib_LTLIBRARIES = libutil.la
|
||||||
libutil_la_SOURCES = util.cc util.hh hash.cc hash.hh \
|
libutil_la_SOURCES = util.cc util.hh hash.cc hash.hh \
|
||||||
archive.cc archive.hh aterm.cc aterm.hh \
|
archive.cc archive.hh aterm.cc aterm.hh \
|
||||||
aterm-map.cc aterm-map.hh \
|
aterm-map.cc aterm-map.hh \
|
||||||
xml-writer.cc xml-writer.hh
|
xml-writer.cc xml-writer.hh \
|
||||||
|
types.hh
|
||||||
|
|
||||||
if !HAVE_OPENSSL
|
if !HAVE_OPENSSL
|
||||||
libutil_la_SOURCES += \
|
libutil_la_SOURCES += \
|
||||||
|
|
|
@ -12,6 +12,9 @@
|
||||||
#include "util.hh"
|
#include "util.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
static string archiveVersion1 = "nix-archive-1";
|
static string archiveVersion1 = "nix-archive-1";
|
||||||
|
|
||||||
|
|
||||||
|
@ -319,3 +322,5 @@ void restorePath(const Path & path, RestoreSource & source)
|
||||||
restore(path, source);
|
restore(path, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
#include <string>
|
#ifndef __ARCHIVE_H
|
||||||
|
#define __ARCHIVE_H
|
||||||
|
|
||||||
#include "util.hh"
|
#include "types.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
/* dumpPath creates a Nix archive of the specified path. The format
|
/* dumpPath creates a Nix archive of the specified path. The format
|
||||||
|
@ -61,3 +65,9 @@ struct RestoreSource
|
||||||
};
|
};
|
||||||
|
|
||||||
void restorePath(const Path & path, RestoreSource & source);
|
void restorePath(const Path & path, RestoreSource & source);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* !__ARCHIVE_H */
|
||||||
|
|
|
@ -1,9 +1,14 @@
|
||||||
#include "aterm-map.hh"
|
#include "aterm-map.hh"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
static const unsigned int maxLoadFactor = /* 1 / */ 3;
|
static const unsigned int maxLoadFactor = /* 1 / */ 3;
|
||||||
static unsigned int nrResizes = 0;
|
static unsigned int nrResizes = 0;
|
||||||
static unsigned int sizeTotalAlloc = 0;
|
static unsigned int sizeTotalAlloc = 0;
|
||||||
|
@ -214,10 +219,11 @@ unsigned int ATermMap::size()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
void printATermMapStats()
|
void printATermMapStats()
|
||||||
{
|
{
|
||||||
|
using std::cerr;
|
||||||
|
using std::endl;
|
||||||
|
|
||||||
cerr << "RESIZES: " << nrResizes << " "
|
cerr << "RESIZES: " << nrResizes << " "
|
||||||
<< sizeTotalAlloc << " "
|
<< sizeTotalAlloc << " "
|
||||||
<< sizeCurAlloc << " "
|
<< sizeCurAlloc << " "
|
||||||
|
@ -319,3 +325,6 @@ int main(int argc, char * * argv)
|
||||||
printATermMapStats();
|
printATermMapStats();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
#include <aterm2.h>
|
#include <aterm2.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
class ATermMap
|
class ATermMap
|
||||||
|
@ -121,5 +122,8 @@ private:
|
||||||
/* Hack. */
|
/* Hack. */
|
||||||
void printATermMapStats();
|
void printATermMapStats();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__ATERM_MAP_H */
|
#endif /* !__ATERM_MAP_H */
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
#include "aterm.hh"
|
#include "aterm.hh"
|
||||||
|
|
||||||
|
using std::string;
|
||||||
|
|
||||||
string atPrint(ATerm t)
|
|
||||||
|
string nix::atPrint(ATerm t)
|
||||||
{
|
{
|
||||||
if (!t) throw Error("attempt to print null aterm");
|
if (!t) throw Error("attempt to print null aterm");
|
||||||
char * s = ATwriteToString(t);
|
char * s = ATwriteToString(t);
|
||||||
|
@ -10,13 +12,13 @@ string atPrint(ATerm t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ostream & operator << (ostream & stream, ATerm e)
|
std::ostream & operator << (std::ostream & stream, ATerm e)
|
||||||
{
|
{
|
||||||
return stream << atPrint(e);
|
return stream << nix::atPrint(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Error badTerm(const format & f, ATerm t)
|
nix::Error nix::badTerm(const format & f, ATerm t)
|
||||||
{
|
{
|
||||||
char * s = ATwriteToString(t);
|
char * s = ATwriteToString(t);
|
||||||
if (!s) throw Error("cannot print term");
|
if (!s) throw Error("cannot print term");
|
||||||
|
@ -29,13 +31,13 @@ Error badTerm(const format & f, ATerm t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ATerm toATerm(const char * s)
|
ATerm nix::toATerm(const char * s)
|
||||||
{
|
{
|
||||||
return (ATerm) ATmakeAppl0(ATmakeAFun((char *) s, 0, ATtrue));
|
return (ATerm) ATmakeAppl0(ATmakeAFun((char *) s, 0, ATtrue));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ATerm toATerm(const string & s)
|
ATerm nix::toATerm(const string & s)
|
||||||
{
|
{
|
||||||
return toATerm(s.c_str());
|
return toATerm(s.c_str());
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,15 +5,15 @@ extern "C" {
|
||||||
#include <aterm2.h>
|
#include <aterm2.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "util.hh"
|
#include "types.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
/* Print an ATerm. */
|
/* Print an ATerm. */
|
||||||
string atPrint(ATerm t);
|
string atPrint(ATerm t);
|
||||||
|
|
||||||
/* Write an ATerm to an output stream. */
|
|
||||||
ostream & operator << (ostream & stream, ATerm e);
|
|
||||||
|
|
||||||
class ATermIterator
|
class ATermIterator
|
||||||
{
|
{
|
||||||
ATermList t;
|
ATermList t;
|
||||||
|
@ -45,5 +45,12 @@ Error badTerm(const format & f, ATerm t);
|
||||||
ATerm toATerm(const char * s);
|
ATerm toATerm(const char * s);
|
||||||
ATerm toATerm(const string & s);
|
ATerm toATerm(const string & s);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Write an ATerm to an output stream. */
|
||||||
|
std::ostream & operator << (std::ostream & stream, ATerm e);
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__ATERM_H */
|
#endif /* !__ATERM_H */
|
||||||
|
|
|
@ -15,12 +15,16 @@ extern "C" {
|
||||||
|
|
||||||
#include "hash.hh"
|
#include "hash.hh"
|
||||||
#include "archive.hh"
|
#include "archive.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
Hash::Hash()
|
Hash::Hash()
|
||||||
{
|
{
|
||||||
type = htUnknown;
|
type = htUnknown;
|
||||||
|
@ -89,9 +93,9 @@ Hash parseHash(HashType ht, const string & s)
|
||||||
string s2(s, i * 2, 2);
|
string s2(s, i * 2, 2);
|
||||||
if (!isxdigit(s2[0]) || !isxdigit(s2[1]))
|
if (!isxdigit(s2[0]) || !isxdigit(s2[1]))
|
||||||
throw Error(format("invalid hash `%1%'") % s);
|
throw Error(format("invalid hash `%1%'") % s);
|
||||||
istringstream str(s2);
|
std::istringstream str(s2);
|
||||||
int n;
|
int n;
|
||||||
str >> hex >> n;
|
str >> std::hex >> n;
|
||||||
hash.hash[i] = n;
|
hash.hash[i] = n;
|
||||||
}
|
}
|
||||||
return hash;
|
return hash;
|
||||||
|
@ -313,3 +317,6 @@ HashType parseHashType(const string & s)
|
||||||
else if (s == "sha256") return htSHA256;
|
else if (s == "sha256") return htSHA256;
|
||||||
else return htUnknown;
|
else return htUnknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
#ifndef __HASH_H
|
#ifndef __HASH_H
|
||||||
#define __HASH_H
|
#define __HASH_H
|
||||||
|
|
||||||
#include <string>
|
#include "types.hh"
|
||||||
|
|
||||||
#include "util.hh"
|
|
||||||
|
|
||||||
using namespace std;
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
typedef enum { htUnknown, htMD5, htSHA1, htSHA256 } HashType;
|
typedef enum { htUnknown, htMD5, htSHA1, htSHA256 } HashType;
|
||||||
|
@ -76,5 +75,8 @@ Hash compressHash(const Hash & hash, unsigned int newSize);
|
||||||
/* Parse a string representing a hash type. */
|
/* Parse a string representing a hash type. */
|
||||||
HashType parseHashType(const string & s);
|
HashType parseHashType(const string & s);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__HASH_H */
|
#endif /* !__HASH_H */
|
||||||
|
|
73
src/libutil/types.hh
Normal file
73
src/libutil/types.hh
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
#ifndef __TYPES_H
|
||||||
|
#define __TYPES_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <list>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
#include <boost/format.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
|
/* Inherit some names from other namespaces for convenience. */
|
||||||
|
using std::string;
|
||||||
|
using std::list;
|
||||||
|
using std::set;
|
||||||
|
using std::vector;
|
||||||
|
using boost::format;
|
||||||
|
|
||||||
|
|
||||||
|
class Error : public std::exception
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
string err;
|
||||||
|
public:
|
||||||
|
Error(const format & f);
|
||||||
|
~Error() throw () { };
|
||||||
|
const char * what() const throw () { return err.c_str(); }
|
||||||
|
const string & msg() const throw () { return err; }
|
||||||
|
Error & addPrefix(const format & f);
|
||||||
|
};
|
||||||
|
|
||||||
|
class SysError : public Error
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SysError(const format & f);
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MakeError(newClass, superClass) \
|
||||||
|
class newClass : public superClass \
|
||||||
|
{ \
|
||||||
|
public: \
|
||||||
|
newClass(const format & f) : superClass(f) { }; \
|
||||||
|
};
|
||||||
|
|
||||||
|
MakeError(UsageError, Error)
|
||||||
|
|
||||||
|
|
||||||
|
typedef list<string> Strings;
|
||||||
|
typedef set<string> StringSet;
|
||||||
|
|
||||||
|
|
||||||
|
/* Paths are just strings. */
|
||||||
|
typedef string Path;
|
||||||
|
typedef list<Path> Paths;
|
||||||
|
typedef set<Path> PathSet;
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
lvlError,
|
||||||
|
lvlInfo,
|
||||||
|
lvlTalkative,
|
||||||
|
lvlChatty,
|
||||||
|
lvlDebug,
|
||||||
|
lvlVomit
|
||||||
|
} Verbosity;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* !__TYPES_H */
|
|
@ -9,17 +9,16 @@
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <signal.h>
|
|
||||||
|
|
||||||
#include "util.hh"
|
#include "util.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
Error::Error(const format & f)
|
Error::Error(const format & f)
|
||||||
{
|
{
|
||||||
err = f.str();
|
err = f.str();
|
||||||
|
@ -368,8 +367,8 @@ void Nest::open(Verbosity level, const format & f)
|
||||||
{
|
{
|
||||||
if (level <= verbosity) {
|
if (level <= verbosity) {
|
||||||
if (logType == ltEscapes)
|
if (logType == ltEscapes)
|
||||||
cerr << "\033[" << escVerbosity(level) << "p"
|
std::cerr << "\033[" << escVerbosity(level) << "p"
|
||||||
<< f.str() << "\n";
|
<< f.str() << "\n";
|
||||||
else
|
else
|
||||||
printMsg_(level, f);
|
printMsg_(level, f);
|
||||||
nest = true;
|
nest = true;
|
||||||
|
@ -383,7 +382,7 @@ void Nest::close()
|
||||||
if (nest) {
|
if (nest) {
|
||||||
nestingLevel--;
|
nestingLevel--;
|
||||||
if (logType == ltEscapes)
|
if (logType == ltEscapes)
|
||||||
cerr << "\033[q";
|
std::cerr << "\033[q";
|
||||||
nest = false;
|
nest = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -697,8 +696,8 @@ string runProgram(Path program)
|
||||||
execl(program.c_str(), program.c_str(), (char *) 0);
|
execl(program.c_str(), program.c_str(), (char *) 0);
|
||||||
throw SysError(format("executing `%1%'") % program);
|
throw SysError(format("executing `%1%'") % program);
|
||||||
|
|
||||||
} catch (exception & e) {
|
} catch (std::exception & e) {
|
||||||
cerr << "error: " << e.what() << endl;
|
std::cerr << "error: " << e.what() << std::endl;
|
||||||
}
|
}
|
||||||
quickExit(1);
|
quickExit(1);
|
||||||
}
|
}
|
||||||
|
@ -743,7 +742,7 @@ void _interrupted()
|
||||||
/* Block user interrupts while an exception is being handled.
|
/* Block user interrupts while an exception is being handled.
|
||||||
Throwing an exception while another exception is being handled
|
Throwing an exception while another exception is being handled
|
||||||
kills the program! */
|
kills the program! */
|
||||||
if (!uncaught_exception()) {
|
if (!std::uncaught_exception()) {
|
||||||
_isInterrupted = 0;
|
_isInterrupted = 0;
|
||||||
throw Error("interrupted by the user");
|
throw Error("interrupted by the user");
|
||||||
}
|
}
|
||||||
|
@ -837,7 +836,7 @@ bool statusOk(int status)
|
||||||
|
|
||||||
string int2String(int n)
|
string int2String(int n)
|
||||||
{
|
{
|
||||||
ostringstream str;
|
std::ostringstream str;
|
||||||
str << n;
|
str << n;
|
||||||
return str.str();
|
return str.str();
|
||||||
}
|
}
|
||||||
|
@ -845,7 +844,10 @@ string int2String(int n)
|
||||||
|
|
||||||
bool string2Int(const string & s, int & n)
|
bool string2Int(const string & s, int & n)
|
||||||
{
|
{
|
||||||
istringstream str(s);
|
std::istringstream str(s);
|
||||||
str >> n;
|
str >> n;
|
||||||
return str && str.get() == EOF;
|
return str && str.get() == EOF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -1,58 +1,15 @@
|
||||||
#ifndef __UTIL_H
|
#ifndef __UTIL_H
|
||||||
#define __UTIL_H
|
#define __UTIL_H
|
||||||
|
|
||||||
#include <string>
|
#include "types.hh"
|
||||||
#include <list>
|
|
||||||
#include <set>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
#include <boost/format.hpp>
|
|
||||||
|
|
||||||
using namespace std;
|
namespace nix {
|
||||||
using namespace boost;
|
|
||||||
|
|
||||||
|
|
||||||
class Error : public exception
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
string err;
|
|
||||||
public:
|
|
||||||
Error(const format & f);
|
|
||||||
~Error() throw () { };
|
|
||||||
const char * what() const throw () { return err.c_str(); }
|
|
||||||
const string & msg() const throw () { return err; }
|
|
||||||
Error & addPrefix(const format & f);
|
|
||||||
};
|
|
||||||
|
|
||||||
class SysError : public Error
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SysError(const format & f);
|
|
||||||
};
|
|
||||||
|
|
||||||
#define MakeError(newClass, superClass) \
|
|
||||||
class newClass : public superClass \
|
|
||||||
{ \
|
|
||||||
public: \
|
|
||||||
newClass(const format & f) : superClass(f) { }; \
|
|
||||||
};
|
|
||||||
|
|
||||||
MakeError(UsageError, Error)
|
|
||||||
|
|
||||||
|
|
||||||
typedef list<string> Strings;
|
|
||||||
typedef set<string> StringSet;
|
|
||||||
|
|
||||||
|
|
||||||
/* Paths are just strings. */
|
|
||||||
typedef string Path;
|
|
||||||
typedef list<Path> Paths;
|
|
||||||
typedef set<Path> PathSet;
|
|
||||||
|
|
||||||
|
|
||||||
/* Return an environment variable. */
|
/* Return an environment variable. */
|
||||||
|
@ -138,15 +95,6 @@ typedef enum {
|
||||||
ltFlat /* no nesting */
|
ltFlat /* no nesting */
|
||||||
} LogType;
|
} LogType;
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
lvlError,
|
|
||||||
lvlInfo,
|
|
||||||
lvlTalkative,
|
|
||||||
lvlChatty,
|
|
||||||
lvlDebug,
|
|
||||||
lvlVomit
|
|
||||||
} Verbosity;
|
|
||||||
|
|
||||||
extern LogType logType;
|
extern LogType logType;
|
||||||
extern Verbosity verbosity; /* suppress msgs > this */
|
extern Verbosity verbosity; /* suppress msgs > this */
|
||||||
|
|
||||||
|
@ -307,5 +255,8 @@ struct SwitchToOriginalUser
|
||||||
~SwitchToOriginalUser();
|
~SwitchToOriginalUser();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__UTIL_H */
|
#endif /* !__UTIL_H */
|
||||||
|
|
|
@ -3,7 +3,10 @@
|
||||||
#include "xml-writer.hh"
|
#include "xml-writer.hh"
|
||||||
|
|
||||||
|
|
||||||
XMLWriter::XMLWriter(bool indent, ostream & output)
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
|
XMLWriter::XMLWriter(bool indent, std::ostream & output)
|
||||||
: output(output), indent(indent)
|
: output(output), indent(indent)
|
||||||
{
|
{
|
||||||
output << "<?xml version='1.0' encoding='utf-8'?>\n";
|
output << "<?xml version='1.0' encoding='utf-8'?>\n";
|
||||||
|
@ -122,3 +125,6 @@ int main(int argc, char * * argv)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -6,7 +6,12 @@
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
using std::string;
|
||||||
|
using std::map;
|
||||||
|
using std::list;
|
||||||
|
|
||||||
|
|
||||||
typedef map<string, string> XMLAttrs;
|
typedef map<string, string> XMLAttrs;
|
||||||
|
@ -16,7 +21,7 @@ class XMLWriter
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
ostream & output;
|
std::ostream & output;
|
||||||
|
|
||||||
bool indent;
|
bool indent;
|
||||||
bool closed;
|
bool closed;
|
||||||
|
@ -25,7 +30,7 @@ private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
XMLWriter(bool indent, ostream & output);
|
XMLWriter(bool indent, std::ostream & output);
|
||||||
~XMLWriter();
|
~XMLWriter();
|
||||||
|
|
||||||
void close();
|
void close();
|
||||||
|
@ -63,5 +68,8 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__XML_WRITER_H */
|
#endif /* !__XML_WRITER_H */
|
||||||
|
|
|
@ -13,6 +13,9 @@
|
||||||
#include "attr-path.hh"
|
#include "attr-path.hh"
|
||||||
#include "pathlocks.hh"
|
#include "pathlocks.hh"
|
||||||
#include "xml-writer.hh"
|
#include "xml-writer.hh"
|
||||||
|
#include "store.hh"
|
||||||
|
#include "db.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
@ -23,6 +26,10 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
|
||||||
|
using namespace nix;
|
||||||
|
using std::cout;
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
srcNixExprDrvs,
|
srcNixExprDrvs,
|
||||||
srcNixExprs,
|
srcNixExprs,
|
||||||
|
@ -224,7 +231,7 @@ static DrvInfos filterBySelector(EvalState & state,
|
||||||
for (DrvNames::iterator i = selectors.begin();
|
for (DrvNames::iterator i = selectors.begin();
|
||||||
i != selectors.end(); ++i)
|
i != selectors.end(); ++i)
|
||||||
{
|
{
|
||||||
typedef list<pair<DrvInfo, unsigned int> > Matches;
|
typedef list<std::pair<DrvInfo, unsigned int> > Matches;
|
||||||
Matches matches;
|
Matches matches;
|
||||||
unsigned int n = 0;
|
unsigned int n = 0;
|
||||||
for (DrvInfos::const_iterator j = allElems.begin();
|
for (DrvInfos::const_iterator j = allElems.begin();
|
||||||
|
@ -233,7 +240,7 @@ static DrvInfos filterBySelector(EvalState & state,
|
||||||
DrvName drvName(j->name);
|
DrvName drvName(j->name);
|
||||||
if (i->matches(drvName)) {
|
if (i->matches(drvName)) {
|
||||||
i->hits++;
|
i->hits++;
|
||||||
matches.push_back(pair<DrvInfo, unsigned int>(*j, n));
|
matches.push_back(std::pair<DrvInfo, unsigned int>(*j, n));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,7 +251,7 @@ static DrvInfos filterBySelector(EvalState & state,
|
||||||
if (newestOnly) {
|
if (newestOnly) {
|
||||||
|
|
||||||
/* Map from package names to derivations. */
|
/* Map from package names to derivations. */
|
||||||
typedef map<string, pair<DrvInfo, unsigned int> > Newest;
|
typedef map<string, std::pair<DrvInfo, unsigned int> > Newest;
|
||||||
Newest newest;
|
Newest newest;
|
||||||
StringSet multiple;
|
StringSet multiple;
|
||||||
|
|
||||||
|
@ -350,7 +357,7 @@ static void queryInstSources(EvalState & state,
|
||||||
assertStorePath(*i);
|
assertStorePath(*i);
|
||||||
|
|
||||||
DrvInfo elem;
|
DrvInfo elem;
|
||||||
elem.attrs = shared_ptr<ATermMap>(new ATermMap(0)); /* ugh... */
|
elem.attrs = boost::shared_ptr<ATermMap>(new ATermMap(0)); /* ugh... */
|
||||||
string name = baseNameOf(*i);
|
string name = baseNameOf(*i);
|
||||||
string::size_type dash = name.find('-');
|
string::size_type dash = name.find('-');
|
||||||
if (dash != string::npos)
|
if (dash != string::npos)
|
||||||
|
@ -667,7 +674,7 @@ void printTable(Table & table)
|
||||||
if (column < nrColumns - 1)
|
if (column < nrColumns - 1)
|
||||||
cout << string(widths[column] - j->size() + 2, ' ');
|
cout << string(widths[column] - j->size() + 2, ' ');
|
||||||
}
|
}
|
||||||
cout << endl;
|
cout << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -801,7 +808,7 @@ static void opQuery(Globals & globals,
|
||||||
|
|
||||||
/* Print the desired columns, or XML output. */
|
/* Print the desired columns, or XML output. */
|
||||||
Table table;
|
Table table;
|
||||||
ostringstream dummy;
|
std::ostringstream dummy;
|
||||||
XMLWriter xml(true, *(xmlOutput ? &cout : &dummy));
|
XMLWriter xml(true, *(xmlOutput ? &cout : &dummy));
|
||||||
XMLOpenElement xmlRoot(xml, "items");
|
XMLOpenElement xmlRoot(xml, "items");
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
#include "names.hh"
|
#include "names.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
DrvName::DrvName()
|
DrvName::DrvName()
|
||||||
|
@ -115,3 +119,6 @@ DrvNames drvNamesFromArgs(const Strings & opArgs)
|
||||||
result.push_back(DrvName(*i));
|
result.push_back(DrvName(*i));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
#ifndef __NAMES_H
|
#ifndef __NAMES_H
|
||||||
#define __NAMES_H
|
#define __NAMES_H
|
||||||
|
|
||||||
#include <string>
|
#include "types.hh"
|
||||||
#include <list>
|
|
||||||
|
|
||||||
#include "util.hh"
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
struct DrvName
|
struct DrvName
|
||||||
|
@ -27,4 +27,7 @@ int compareVersions(const string & v1, const string & v2);
|
||||||
DrvNames drvNamesFromArgs(const Strings & opArgs);
|
DrvNames drvNamesFromArgs(const Strings & opArgs);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__NAMES_H */
|
#endif /* !__NAMES_H */
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "profiles.hh"
|
#include "profiles.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
@ -7,6 +8,9 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
static bool cmpGensByNumber(const Generation & a, const Generation & b)
|
static bool cmpGensByNumber(const Generation & a, const Generation & b)
|
||||||
{
|
{
|
||||||
return a.number < b.number;
|
return a.number < b.number;
|
||||||
|
@ -126,3 +130,7 @@ void switchLink(Path link, Path target)
|
||||||
if (rename(tmp.c_str(), link.c_str()) != 0)
|
if (rename(tmp.c_str(), link.c_str()) != 0)
|
||||||
throw SysError(format("renaming `%1%' to `%2%'") % tmp % link);
|
throw SysError(format("renaming `%1%' to `%2%'") % tmp % link);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
#ifndef __PROFILES_H
|
#ifndef __PROFILES_H
|
||||||
#define __PROFILES_H
|
#define __PROFILES_H
|
||||||
|
|
||||||
#include <string>
|
#include "types.hh"
|
||||||
|
|
||||||
#include "util.hh"
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
struct Generation
|
struct Generation
|
||||||
|
@ -35,4 +36,7 @@ void deleteGeneration(const Path & profile, unsigned int gen);
|
||||||
void switchLink(Path link, Path target);
|
void switchLink(Path link, Path target);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__PROFILES_H */
|
#endif /* !__PROFILES_H */
|
||||||
|
|
|
@ -5,9 +5,12 @@
|
||||||
#include "help.txt.hh"
|
#include "help.txt.hh"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace nix;
|
||||||
|
|
||||||
|
|
||||||
void printHelp()
|
void printHelp()
|
||||||
{
|
{
|
||||||
cout << string((char *) helpText, sizeof helpText);
|
std::cout << string((char *) helpText, sizeof helpText);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -43,7 +46,7 @@ void run(Strings args)
|
||||||
for (Strings::iterator i = ss.begin(); i != ss.end(); ++i) {
|
for (Strings::iterator i = ss.begin(); i != ss.end(); ++i) {
|
||||||
Hash h = flat ? hashFile(ht, *i) : hashPath(ht, *i);
|
Hash h = flat ? hashFile(ht, *i) : hashPath(ht, *i);
|
||||||
if (truncate && h.hashSize > 20) h = compressHash(h, 20);
|
if (truncate && h.hashSize > 20) h = compressHash(h, 20);
|
||||||
cout << format("%1%\n") %
|
std::cout << format("%1%\n") %
|
||||||
(base32 ? printHash32(h) : printHash(h));
|
(base32 ? printHash32(h) : printHash(h));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,7 +54,7 @@ void run(Strings args)
|
||||||
else {
|
else {
|
||||||
for (Strings::iterator i = ss.begin(); i != ss.end(); ++i) {
|
for (Strings::iterator i = ss.begin(); i != ss.end(); ++i) {
|
||||||
Hash h = op == opTo16 ? parseHash32(ht, *i) : parseHash(ht, *i);
|
Hash h = op == opTo16 ? parseHash32(ht, *i) : parseHash(ht, *i);
|
||||||
cout << format("%1%\n") %
|
std::cout << format("%1%\n") %
|
||||||
(op == opTo16 ? printHash(h) : printHash32(h));
|
(op == opTo16 ? printHash(h) : printHash32(h));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,12 +10,17 @@
|
||||||
#include "get-drvs.hh"
|
#include "get-drvs.hh"
|
||||||
#include "attr-path.hh"
|
#include "attr-path.hh"
|
||||||
#include "expr-to-xml.hh"
|
#include "expr-to-xml.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
#include "store.hh"
|
||||||
#include "help.txt.hh"
|
#include "help.txt.hh"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace nix;
|
||||||
|
|
||||||
|
|
||||||
void printHelp()
|
void printHelp()
|
||||||
{
|
{
|
||||||
cout << string((char *) helpText, sizeof helpText);
|
std::cout << string((char *) helpText, sizeof helpText);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,7 +28,7 @@ static Expr parseStdin(EvalState & state)
|
||||||
{
|
{
|
||||||
startNest(nest, lvlTalkative, format("parsing standard input"));
|
startNest(nest, lvlTalkative, format("parsing standard input"));
|
||||||
string s, s2;
|
string s, s2;
|
||||||
while (getline(cin, s2)) s += s2 + "\n";
|
while (getline(std::cin, s2)) s += s2 + "\n";
|
||||||
return parseExprFromString(state, s, absPath("."));
|
return parseExprFromString(state, s, absPath("."));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,9 +43,9 @@ static void printResult(EvalState & state, Expr e,
|
||||||
{
|
{
|
||||||
if (evalOnly)
|
if (evalOnly)
|
||||||
if (xmlOutput)
|
if (xmlOutput)
|
||||||
printTermAsXML(e, cout);
|
printTermAsXML(e, std::cout);
|
||||||
else
|
else
|
||||||
cout << format("%1%\n") % e;
|
std::cout << format("%1%\n") % e;
|
||||||
|
|
||||||
else {
|
else {
|
||||||
DrvInfos drvs;
|
DrvInfos drvs;
|
||||||
|
@ -53,7 +58,7 @@ static void printResult(EvalState & state, Expr e,
|
||||||
drvPath = addPermRoot(drvPath,
|
drvPath = addPermRoot(drvPath,
|
||||||
makeRootName(gcRoot, rootNr),
|
makeRootName(gcRoot, rootNr),
|
||||||
indirectRoot);
|
indirectRoot);
|
||||||
cout << format("%1%\n") % drvPath;
|
std::cout << format("%1%\n") % drvPath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,14 @@
|
||||||
|
#include "dotgraph.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
#include "store.hh"
|
||||||
|
#include "db.hh"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "dotgraph.hh"
|
|
||||||
#include "build.hh"
|
using std::cout;
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
static string dotQuote(const string & s)
|
static string dotQuote(const string & s)
|
||||||
|
@ -151,3 +158,6 @@ void printDotGraph(const PathSet & roots)
|
||||||
|
|
||||||
cout << "}\n";
|
cout << "}\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
#ifndef __DOTGRAPH_H
|
#ifndef __DOTGRAPH_H
|
||||||
#define __DOTGRAPH_H
|
#define __DOTGRAPH_H
|
||||||
|
|
||||||
#include "util.hh"
|
#include "types.hh"
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
void printDotGraph(const PathSet & roots);
|
void printDotGraph(const PathSet & roots);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* !__DOTGRAPH_H */
|
#endif /* !__DOTGRAPH_H */
|
||||||
|
|
|
@ -8,9 +8,17 @@
|
||||||
#include "archive.hh"
|
#include "archive.hh"
|
||||||
#include "shared.hh"
|
#include "shared.hh"
|
||||||
#include "dotgraph.hh"
|
#include "dotgraph.hh"
|
||||||
|
#include "store.hh"
|
||||||
|
#include "db.hh"
|
||||||
|
#include "util.hh"
|
||||||
#include "help.txt.hh"
|
#include "help.txt.hh"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace nix;
|
||||||
|
using std::cin;
|
||||||
|
using std::cout;
|
||||||
|
|
||||||
|
|
||||||
typedef void (* Operation) (Strings opFlags, Strings opArgs);
|
typedef void (* Operation) (Strings opFlags, Strings opArgs);
|
||||||
|
|
||||||
|
|
||||||
|
@ -528,7 +536,7 @@ static void opGC(Strings opFlags, Strings opArgs)
|
||||||
|
|
||||||
if (action != gcDeleteDead) {
|
if (action != gcDeleteDead) {
|
||||||
for (PathSet::iterator i = result.begin(); i != result.end(); ++i)
|
for (PathSet::iterator i = result.begin(); i != result.end(); ++i)
|
||||||
cout << *i << endl;
|
cout << *i << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue