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
This commit is contained in:
parent
ba334bd6f7
commit
338f29dbd4
|
@ -13,9 +13,10 @@ public:
|
||||||
|
|
||||||
struct Stat
|
struct Stat
|
||||||
{
|
{
|
||||||
Type type;
|
Type type = tMissing;
|
||||||
uint64_t fileSize; // regular files only
|
uint64_t fileSize = 0; // regular files only
|
||||||
bool isExecutable; // regular files only
|
bool isExecutable = false; // regular files only
|
||||||
|
uint64_t narOffset = 0; // regular files only
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual Stat stat(const Path & path) = 0;
|
virtual Stat stat(const Path & path) = 0;
|
||||||
|
|
|
@ -10,13 +10,13 @@ namespace nix {
|
||||||
|
|
||||||
struct NarMember
|
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
|
/* If this is a regular file, position of the contents of this
|
||||||
file in the NAR. */
|
file in the NAR. */
|
||||||
size_t start, size;
|
size_t start = 0, size = 0;
|
||||||
|
|
||||||
std::string target;
|
std::string target;
|
||||||
|
|
||||||
|
@ -142,7 +142,7 @@ struct NarAccessor : public FSAccessor
|
||||||
auto i = indexer.find(path);
|
auto i = indexer.find(path);
|
||||||
if (i == nullptr)
|
if (i == nullptr)
|
||||||
return {FSAccessor::Type::tMissing, 0, false};
|
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
|
StringSet readDirectory(const Path & path) override
|
||||||
|
@ -195,6 +195,8 @@ void listNar(JSONPlaceholder & res, ref<FSAccessor> accessor,
|
||||||
obj.attr("size", st.fileSize);
|
obj.attr("size", st.fileSize);
|
||||||
if (st.isExecutable)
|
if (st.isExecutable)
|
||||||
obj.attr("executable", true);
|
obj.attr("executable", true);
|
||||||
|
if (st.narOffset)
|
||||||
|
obj.attr("narOffset", st.narOffset);
|
||||||
break;
|
break;
|
||||||
case FSAccessor::Type::tDirectory:
|
case FSAccessor::Type::tDirectory:
|
||||||
obj.attr("type", "directory");
|
obj.attr("type", "directory");
|
||||||
|
|
|
@ -27,8 +27,8 @@ diff -u baz.cat-nar $storePath/foo/baz
|
||||||
|
|
||||||
# Test --json.
|
# Test --json.
|
||||||
[[ $(nix ls-nar --json $narFile /) = '{"type":"directory","entries":{"foo":{},"foo-x":{},"qux":{},"zyx":{}}}' ]]
|
[[ $(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) = '{"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}' ]]
|
[[ $(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 $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) = '{"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}' ]]
|
[[ $(nix ls-store --json -R $storePath/foo/bar) = '{"type":"regular","size":0}' ]]
|
||||||
|
|
Loading…
Reference in a new issue