about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/fs-accessor.hh7
-rw-r--r--src/libstore/nar-accessor.cc10
-rw-r--r--tests/nar-access.sh4
3 files changed, 12 insertions, 9 deletions
diff --git a/src/libstore/fs-accessor.hh b/src/libstore/fs-accessor.hh
index a67e0775b9..f703e1d154 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 839a7991c8..d6e9757c2c 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 e29e4689b6..bd849cbfab 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}' ]]