diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2017-12-06T21·44+0100 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2017-12-07T00·07+0100 |
commit | 338f29dbd4ee04f2de4c747eadb8c106a98f885c (patch) | |
tree | c862ab1c9536d72a1d4371dff3b5e53e524f3d64 | |
parent | ba334bd6f756fa72686b72ed5da87ddc1a7aea69 (diff) |
nix ls-{nar,store}: Return offset of files in the NAR if known
E.g. $ nix ls-store --json --recursive --store https://cache.nixos.org /nix/store/b0w2hafndl09h64fhb86kw6bmhbmnpm1-blender-2.79 \ | jq .entries.bin.entries.blender.narOffset 400
-rw-r--r-- | src/libstore/fs-accessor.hh | 7 | ||||
-rw-r--r-- | src/libstore/nar-accessor.cc | 10 | ||||
-rw-r--r-- | tests/nar-access.sh | 4 |
3 files changed, 12 insertions, 9 deletions
diff --git a/src/libstore/fs-accessor.hh b/src/libstore/fs-accessor.hh index a67e0775b978..f703e1d15404 100644 --- a/src/libstore/fs-accessor.hh +++ b/src/libstore/fs-accessor.hh @@ -13,9 +13,10 @@ public: struct Stat { - Type type; - uint64_t fileSize; // regular files only - bool isExecutable; // regular files only + Type type = tMissing; + uint64_t fileSize = 0; // regular files only + bool isExecutable = false; // regular files only + uint64_t narOffset = 0; // regular files only }; virtual Stat stat(const Path & path) = 0; diff --git a/src/libstore/nar-accessor.cc b/src/libstore/nar-accessor.cc index 839a7991c89f..d6e9757c2cbf 100644 --- a/src/libstore/nar-accessor.cc +++ b/src/libstore/nar-accessor.cc @@ -10,13 +10,13 @@ namespace nix { struct NarMember { - FSAccessor::Type type; + FSAccessor::Type type = FSAccessor::Type::tMissing; - bool isExecutable; + bool isExecutable = false; /* If this is a regular file, position of the contents of this file in the NAR. */ - size_t start, size; + size_t start = 0, size = 0; std::string target; @@ -142,7 +142,7 @@ struct NarAccessor : public FSAccessor auto i = indexer.find(path); if (i == nullptr) return {FSAccessor::Type::tMissing, 0, false}; - return {i->type, i->size, i->isExecutable}; + return {i->type, i->size, i->isExecutable, i->start}; } StringSet readDirectory(const Path & path) override @@ -195,6 +195,8 @@ void listNar(JSONPlaceholder & res, ref<FSAccessor> accessor, obj.attr("size", st.fileSize); if (st.isExecutable) obj.attr("executable", true); + if (st.narOffset) + obj.attr("narOffset", st.narOffset); break; case FSAccessor::Type::tDirectory: obj.attr("type", "directory"); diff --git a/tests/nar-access.sh b/tests/nar-access.sh index e29e4689b630..bd849cbfab1d 100644 --- a/tests/nar-access.sh +++ b/tests/nar-access.sh @@ -27,8 +27,8 @@ diff -u baz.cat-nar $storePath/foo/baz # Test --json. [[ $(nix ls-nar --json $narFile /) = '{"type":"directory","entries":{"foo":{},"foo-x":{},"qux":{},"zyx":{}}}' ]] -[[ $(nix ls-nar --json -R $narFile /foo) = '{"type":"directory","entries":{"bar":{"type":"regular","size":0},"baz":{"type":"regular","size":0},"data":{"type":"regular","size":58}}}' ]] -[[ $(nix ls-nar --json -R $narFile /foo/bar) = '{"type":"regular","size":0}' ]] +[[ $(nix ls-nar --json -R $narFile /foo) = '{"type":"directory","entries":{"bar":{"type":"regular","size":0,"narOffset":368},"baz":{"type":"regular","size":0,"narOffset":552},"data":{"type":"regular","size":58,"narOffset":736}}}' ]] +[[ $(nix ls-nar --json -R $narFile /foo/bar) = '{"type":"regular","size":0,"narOffset":368}' ]] [[ $(nix ls-store --json $storePath) = '{"type":"directory","entries":{"foo":{},"foo-x":{},"qux":{},"zyx":{}}}' ]] [[ $(nix ls-store --json -R $storePath/foo) = '{"type":"directory","entries":{"bar":{"type":"regular","size":0},"baz":{"type":"regular","size":0},"data":{"type":"regular","size":58}}}' ]] [[ $(nix ls-store --json -R $storePath/foo/bar) = '{"type":"regular","size":0}' ]] |