diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/nix-help.txt | 2 | ||||
-rw-r--r-- | src/nix.cc | 15 | ||||
-rw-r--r-- | src/normalise.cc | 20 | ||||
-rw-r--r-- | src/normalise.hh | 10 |
5 files changed, 36 insertions, 12 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 23e242919..cc51eff36 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -43,6 +43,7 @@ nix.o: nix-help.txt.hh install-data-local: $(INSTALL) -d $(localstatedir)/nix $(INSTALL) -d $(localstatedir)/nix/links + ln -sf $(localstatedir)/nix/links/current $(prefix)/current $(INSTALL) -d $(localstatedir)/log/nix $(INSTALL) -d $(prefix)/store $(bindir)/nix --init diff --git a/src/nix-help.txt b/src/nix-help.txt index ecf9b5c16..0e54d162d 100644 --- a/src/nix-help.txt +++ b/src/nix-help.txt @@ -26,7 +26,7 @@ Source selection for --install, --dump: Query flags: --list / -l: query the output paths (roots) of an fstate (default) - --refs / -r: query paths referenced by an fstate + --requisites / -r: print all paths necessary to realise expression --generators / -g: find expressions producing a subset of given ids --expansion / -e: print a path containing id --graph: print a dot graph rooted at given ids diff --git a/src/nix.cc b/src/nix.cc index a7bcf7268..68d01f2f8 100644 --- a/src/nix.cc +++ b/src/nix.cc @@ -95,18 +95,22 @@ FSId maybeNormalise(const FSId & id, bool normalise) /* Perform various sorts of queries. */ static void opQuery(Strings opFlags, Strings opArgs) { - enum { qList, qRefs, qGenerators, qExpansion, qGraph + enum { qList, qRequisites, qGenerators, qExpansion, qGraph } query = qList; bool normalise = false; + bool includeExprs = true; + bool includeSuccessors = false; for (Strings::iterator i = opFlags.begin(); i != opFlags.end(); i++) if (*i == "--list" || *i == "-l") query = qList; - else if (*i == "--refs" || *i == "-r") query = qRefs; + else if (*i == "--requisites" || *i == "-r") query = qRequisites; else if (*i == "--generators" || *i == "-g") query = qGenerators; else if (*i == "--expansion" || *i == "-e") query = qExpansion; else if (*i == "--graph") query = qGraph; else if (*i == "--normalise" || *i == "-n") normalise = true; + else if (*i == "--exclude-exprs") includeExprs = false; + else if (*i == "--include-successors") includeSuccessors = true; else throw UsageError(format("unknown flag `%1%'") % *i); switch (query) { @@ -126,13 +130,14 @@ static void opQuery(Strings opFlags, Strings opArgs) break; } - case qRefs: { + case qRequisites: { StringSet paths; for (Strings::iterator i = opArgs.begin(); i != opArgs.end(); i++) { - Strings paths2 = fstateRefs( - maybeNormalise(argToId(*i), normalise)); + Strings paths2 = fstateRequisites( + maybeNormalise(argToId(*i), normalise), + includeExprs, includeSuccessors); paths.insert(paths2.begin(), paths2.end()); } for (StringSet::iterator i = paths.begin(); diff --git a/src/normalise.cc b/src/normalise.cc index eefb790b6..5ef4d82ac 100644 --- a/src/normalise.cc +++ b/src/normalise.cc @@ -244,7 +244,8 @@ Strings fstatePaths(const FSId & id) } -static void fstateRefsSet(const FSId & id, StringSet & paths) +static void fstateRequisitesSet(const FSId & id, + bool includeExprs, bool includeSuccessors, StringSet & paths) { FState fs = parseFState(termFromId(id)); @@ -257,17 +258,28 @@ static void fstateRefsSet(const FSId & id, StringSet & paths) else if (fs.type == FState::fsDerive) { for (FSIds::iterator i = fs.derive.inputs.begin(); i != fs.derive.inputs.end(); i++) - fstateRefsSet(*i, paths); + fstateRequisitesSet(*i, + includeExprs, includeSuccessors, paths); } else abort(); + + if (includeExprs) + paths.insert(expandId(id)); + + string idSucc; + if (includeSuccessors && + queryDB(nixDB, dbSuccessors, id, idSucc)) + fstateRequisitesSet(parseHash(idSucc), + includeExprs, includeSuccessors, paths); } -Strings fstateRefs(const FSId & id) +Strings fstateRequisites(const FSId & id, + bool includeExprs, bool includeSuccessors) { StringSet paths; - fstateRefsSet(id, paths); + fstateRequisitesSet(id, includeExprs, includeSuccessors, paths); return Strings(paths.begin(), paths.end()); } diff --git a/src/normalise.hh b/src/normalise.hh index a5b45c861..98f58783e 100644 --- a/src/normalise.hh +++ b/src/normalise.hh @@ -15,8 +15,14 @@ void realiseSlice(const FSId & id, FSIdSet pending = FSIdSet()); fstate-expression. */ Strings fstatePaths(const FSId & id); -/* Get the list of paths referenced by the given fstate-expression. */ -Strings fstateRefs(const FSId & id); +/* Get the list of paths that are required to realise the given + expression. For a derive expression, this is the union of + requisites of the inputs; for a slice expression, it is the path of + each element in the slice. If `includeExprs' is true, include the + paths of the Nix expressions themselves. If `includeSuccessors' is + true, include the requisites of successors. */ +Strings fstateRequisites(const FSId & id, + bool includeExprs, bool includeSuccessors); /* Return the list of the ids of all known fstate-expressions whose output ids are completely contained in `ids'. */ |