* In nix-store: added query `--referers-closure' that returns the
closure of the referers relation rather than the references relation, i.e., the set of all paths that directly or indirectly refer to the given path. Note that contrary to the references closure this set is not fixed; it can change as paths are added to or removed from the store.
This commit is contained in:
parent
80faa2f98a
commit
52bf9b86bb
5 changed files with 31 additions and 10 deletions
|
@ -21,9 +21,12 @@ Derivation derivationFromPath(const Path & drvPath);
|
||||||
|
|
||||||
/* Place in `paths' the set of all store paths in the file system
|
/* Place in `paths' the set of all store paths in the file system
|
||||||
closure of `storePath'; that is, all paths than can be directly or
|
closure of `storePath'; that is, all paths than can be directly or
|
||||||
indirectly reached from it. `paths' is not cleared. */
|
indirectly reached from it. `paths' is not cleared. If
|
||||||
|
`flipDirection' is true, the set of paths that can reach
|
||||||
|
`storePath' is returned; that is, the closures under the `referers'
|
||||||
|
relation instead of the `references' relation is returned. */
|
||||||
void computeFSClosure(const Path & storePath,
|
void computeFSClosure(const Path & storePath,
|
||||||
PathSet & paths);
|
PathSet & paths, bool flipDirection = false);
|
||||||
|
|
||||||
/* Place in `paths' the set of paths that are required to `realise'
|
/* Place in `paths' the set of paths that are required to `realise'
|
||||||
the given store path, i.e., all paths necessary for valid
|
the given store path, i.e., all paths necessary for valid
|
||||||
|
|
|
@ -12,17 +12,20 @@ Derivation derivationFromPath(const Path & drvPath)
|
||||||
|
|
||||||
|
|
||||||
void computeFSClosure(const Path & storePath,
|
void computeFSClosure(const Path & storePath,
|
||||||
PathSet & paths)
|
PathSet & paths, bool flipDirection)
|
||||||
{
|
{
|
||||||
if (paths.find(storePath) != paths.end()) return;
|
if (paths.find(storePath) != paths.end()) return;
|
||||||
paths.insert(storePath);
|
paths.insert(storePath);
|
||||||
|
|
||||||
PathSet references;
|
PathSet references;
|
||||||
|
if (flipDirection)
|
||||||
|
queryReferers(storePath, references);
|
||||||
|
else
|
||||||
queryReferences(storePath, references);
|
queryReferences(storePath, references);
|
||||||
|
|
||||||
for (PathSet::iterator i = references.begin();
|
for (PathSet::iterator i = references.begin();
|
||||||
i != references.end(); ++i)
|
i != references.end(); ++i)
|
||||||
computeFSClosure(*i, paths);
|
computeFSClosure(*i, paths, flipDirection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,8 @@ nix-store [OPTIONS...] [ARGUMENTS...]
|
||||||
|
|
||||||
Operations:
|
Operations:
|
||||||
|
|
||||||
--realise / -r: build a Nix derivation
|
--realise / -r: ensure path validity; if a derivation, ensure that
|
||||||
|
validity of the outputs
|
||||||
--add / -A: copy a path to the Nix store
|
--add / -A: copy a path to the Nix store
|
||||||
--query / -q: query information
|
--query / -q: query information
|
||||||
|
|
||||||
|
@ -27,9 +28,16 @@ Query flags:
|
||||||
--outputs: query the output paths of a Nix derivation (default)
|
--outputs: query the output paths of a Nix derivation (default)
|
||||||
--requisites / -R: print all paths necessary to realise a path
|
--requisites / -R: print all paths necessary to realise a path
|
||||||
--references: print all paths referenced by the given path
|
--references: print all paths referenced by the given path
|
||||||
--referers: print all paths refering to the given path
|
--referers: print all paths directly refering to the given path
|
||||||
|
--referers-closure: print all paths (in)directly refering to the given path
|
||||||
--graph: print a dot graph rooted at given ids
|
--graph: print a dot graph rooted at given ids
|
||||||
|
|
||||||
|
Query switches (not applicable to all queries):
|
||||||
|
|
||||||
|
--use-output: perform query on output of derivation, not derivation itself
|
||||||
|
--force-realise: realise the path before performing the query
|
||||||
|
--include-outputs: in `-R' on a derivation, include requisites of outputs
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
|
|
||||||
--verbose / -v: verbose operation (may be repeated)
|
--verbose / -v: verbose operation (may be repeated)
|
||||||
|
|
|
@ -96,7 +96,8 @@ static void printPathSet(const PathSet & paths)
|
||||||
/* Perform various sorts of queries. */
|
/* Perform various sorts of queries. */
|
||||||
static void opQuery(Strings opFlags, Strings opArgs)
|
static void opQuery(Strings opFlags, Strings opArgs)
|
||||||
{
|
{
|
||||||
enum { qOutputs, qRequisites, qReferences, qReferers, qGraph } query = qOutputs;
|
enum { qOutputs, qRequisites, qReferences, qReferers,
|
||||||
|
qReferersClosure, qGraph } query = qOutputs;
|
||||||
bool useOutput = false;
|
bool useOutput = false;
|
||||||
bool includeOutputs = false;
|
bool includeOutputs = false;
|
||||||
bool forceRealise = false;
|
bool forceRealise = false;
|
||||||
|
@ -107,6 +108,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
||||||
else if (*i == "--requisites" || *i == "-R") query = qRequisites;
|
else if (*i == "--requisites" || *i == "-R") query = qRequisites;
|
||||||
else if (*i == "--references") query = qReferences;
|
else if (*i == "--references") query = qReferences;
|
||||||
else if (*i == "--referers") query = qReferers;
|
else if (*i == "--referers") query = qReferers;
|
||||||
|
else if (*i == "--referers-closure") query = qReferersClosure;
|
||||||
else if (*i == "--graph") query = qGraph;
|
else if (*i == "--graph") query = qGraph;
|
||||||
else if (*i == "--use-output" || *i == "-u") useOutput = true;
|
else if (*i == "--use-output" || *i == "-u") useOutput = true;
|
||||||
else if (*i == "--force-realise" || *i == "-f") forceRealise = true;
|
else if (*i == "--force-realise" || *i == "-f") forceRealise = true;
|
||||||
|
@ -128,7 +130,8 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
||||||
|
|
||||||
case qRequisites:
|
case qRequisites:
|
||||||
case qReferences:
|
case qReferences:
|
||||||
case qReferers: {
|
case qReferers:
|
||||||
|
case qReferersClosure: {
|
||||||
PathSet paths;
|
PathSet paths;
|
||||||
for (Strings::iterator i = opArgs.begin();
|
for (Strings::iterator i = opArgs.begin();
|
||||||
i != opArgs.end(); i++)
|
i != opArgs.end(); i++)
|
||||||
|
@ -138,6 +141,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
||||||
storePathRequisites(path, includeOutputs, paths);
|
storePathRequisites(path, includeOutputs, paths);
|
||||||
else if (query == qReferences) queryReferences(path, paths);
|
else if (query == qReferences) queryReferences(path, paths);
|
||||||
else if (query == qReferers) queryReferers(path, paths);
|
else if (query == qReferers) queryReferers(path, paths);
|
||||||
|
else if (query == qReferersClosure) computeFSClosure(path, paths, true);
|
||||||
}
|
}
|
||||||
printPathSet(paths);
|
printPathSet(paths);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -20,4 +20,7 @@ echo "$deps" | grep -q "$outPath"
|
||||||
if echo "$deps" | grep -q "dependencies-input-1"; then exit 1; fi
|
if echo "$deps" | grep -q "dependencies-input-1"; then exit 1; fi
|
||||||
|
|
||||||
# Input-2 is retained.
|
# Input-2 is retained.
|
||||||
echo "$deps" | grep -q "dependencies-input-2"
|
input2OutPath=$(echo "$deps" | grep "dependencies-input-2")
|
||||||
|
|
||||||
|
# The referers closure of input-2 should include outPath.
|
||||||
|
$TOP/src/nix-store/nix-store -q --referers-closure "$input2OutPath" | grep "$outPath"
|
||||||
|
|
Loading…
Reference in a new issue