aboutsummaryrefslogtreecommitdiff
path: root/src/libstore
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2005-02-07 14:32:44 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2005-02-07 14:32:44 +0000
commitfbc434ee4c39e7516f3634371442899864786584 (patch)
tree9ea7e2d90f78fa6b100c35c135822b984c408882 /src/libstore
parent450c358e2055488897349bf50951cce16ad9bc90 (diff)
* `nix-store -qb' to query derivation environment bindings. Useful
for finding build-time dependencies (possibly after a build). E.g., $ nix-store -qb aterm $(nix-store -qd $(which strc)) /nix/store/jw7c7s65n1gwhxpn35j9rgcci6ilzxym-aterm-2.3.1 * Arguments to nix-store can be files within store objects, e.g., /nix/store/jw7c...-aterm-2.3.1/bin/baffle. * Idem for garbage collector roots.
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/gc.cc6
-rw-r--r--src/libstore/store.cc22
-rw-r--r--src/libstore/store.hh5
3 files changed, 28 insertions, 5 deletions
diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc
index 6f09e9cb7..020712368 100644
--- a/src/libstore/gc.cc
+++ b/src/libstore/gc.cc
@@ -60,7 +60,7 @@ void createSymlink(const Path & link, const Path & target, bool careful)
/* Remove the old symlink. */
if (pathExists(link)) {
- if (careful && (!isLink(link) || !isStorePath(readLink(link))))
+ if (careful && (!isLink(link) || !isInStore(readLink(link))))
throw Error(format("cannot create symlink `%1%'; already exists") % link);
unlink(link.c_str());
}
@@ -250,10 +250,10 @@ static void findRoots(const Path & path, bool recurseSymlinks,
string target = readLink(path);
Path target2 = absPath(target, dirOf(path));
- if (isStorePath(target2)) {
+ if (isInStore(target2)) {
debug(format("found root `%1%' in `%2%'")
% target2 % path);
- roots.insert(target2);
+ roots.insert(toStorePath(target2));
}
else if (recurseSymlinks) {
diff --git a/src/libstore/store.cc b/src/libstore/store.cc
index a3e98f696..693a388b3 100644
--- a/src/libstore/store.cc
+++ b/src/libstore/store.cc
@@ -176,12 +176,18 @@ void copyPath(const Path & src, const Path & dst)
}
-bool isStorePath(const Path & path)
+bool isInStore(const Path & path)
{
return path[0] == '/'
&& path.compare(0, nixStore.size(), nixStore) == 0
&& path.size() >= nixStore.size() + 2
- && path[nixStore.size()] == '/'
+ && path[nixStore.size()] == '/';
+}
+
+
+bool isStorePath(const Path & path)
+{
+ return isInStore(path)
&& path.find('/', nixStore.size() + 1) == Path::npos;
}
@@ -193,6 +199,18 @@ void assertStorePath(const Path & path)
}
+Path toStorePath(const Path & path)
+{
+ if (!isInStore(path))
+ throw Error(format("path `%1%' is not in the Nix store") % path);
+ unsigned int slash = path.find('/', nixStore.size() + 1);
+ if (slash == Path::npos)
+ return path;
+ else
+ return Path(path, 0, slash);
+}
+
+
void canonicalisePathMetaData(const Path & path)
{
checkInterrupt();
diff --git a/src/libstore/store.hh b/src/libstore/store.hh
index 95c738ed1..1f2b630e1 100644
--- a/src/libstore/store.hh
+++ b/src/libstore/store.hh
@@ -63,8 +63,13 @@ void registerValidPath(const Transaction & txn,
/* Throw an exception if `path' is not directly in the Nix store. */
void assertStorePath(const Path & path);
+bool isInStore(const Path & path);
bool isStorePath(const Path & path);
+/* Chop off the parts after the top-level store name, e.g.,
+ /nix/store/abcd-foo/bar => /nix/store/abcd-foo. */
+Path toStorePath(const Path & path);
+
/* "Fix", or canonicalise, the meta-data of the files in a store path
after it has been built. In particular:
- the last modification date on each file is set to 0 (i.e.,