forked from lix-project/lix
nix ls-{store,nar}: Add --json flag
This commit is contained in:
parent
c0d93a01ee
commit
bac8055652
|
@ -119,42 +119,9 @@ void BinaryCacheStore::addToStore(const ValidPathInfo & info, const ref<std::str
|
||||||
accessor_->addToCache(info.path, *nar);
|
accessor_->addToCache(info.path, *nar);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::function<void(const Path &, JSONPlaceholder &)> recurse;
|
|
||||||
|
|
||||||
recurse = [&](const Path & path, JSONPlaceholder & res) {
|
|
||||||
auto st = narAccessor->stat(path);
|
|
||||||
|
|
||||||
auto obj = res.object();
|
|
||||||
|
|
||||||
switch (st.type) {
|
|
||||||
case FSAccessor::Type::tRegular:
|
|
||||||
obj.attr("type", "regular");
|
|
||||||
obj.attr("size", st.fileSize);
|
|
||||||
if (st.isExecutable)
|
|
||||||
obj.attr("executable", true);
|
|
||||||
break;
|
|
||||||
case FSAccessor::Type::tDirectory:
|
|
||||||
obj.attr("type", "directory");
|
|
||||||
{
|
|
||||||
auto res2 = obj.object("entries");
|
|
||||||
for (auto & name : narAccessor->readDirectory(path)) {
|
|
||||||
auto res3 = res2.placeholder(name);
|
|
||||||
recurse(path + "/" + name, res3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case FSAccessor::Type::tSymlink:
|
|
||||||
obj.attr("type", "symlink");
|
|
||||||
obj.attr("target", narAccessor->readLink(path));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
{
|
{
|
||||||
auto res = jsonRoot.placeholder("root");
|
auto res = jsonRoot.placeholder("root");
|
||||||
recurse("", res);
|
listNar(res, narAccessor, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "nar-accessor.hh"
|
#include "nar-accessor.hh"
|
||||||
#include "archive.hh"
|
#include "archive.hh"
|
||||||
|
#include "json.hh"
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <stack>
|
#include <stack>
|
||||||
|
@ -181,4 +182,36 @@ ref<FSAccessor> makeNarAccessor(ref<const std::string> nar)
|
||||||
return make_ref<NarAccessor>(nar);
|
return make_ref<NarAccessor>(nar);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void listNar(JSONPlaceholder & res, ref<FSAccessor> accessor, const Path & path)
|
||||||
|
{
|
||||||
|
auto st = accessor->stat(path);
|
||||||
|
|
||||||
|
auto obj = res.object();
|
||||||
|
|
||||||
|
switch (st.type) {
|
||||||
|
case FSAccessor::Type::tRegular:
|
||||||
|
obj.attr("type", "regular");
|
||||||
|
obj.attr("size", st.fileSize);
|
||||||
|
if (st.isExecutable)
|
||||||
|
obj.attr("executable", true);
|
||||||
|
break;
|
||||||
|
case FSAccessor::Type::tDirectory:
|
||||||
|
obj.attr("type", "directory");
|
||||||
|
{
|
||||||
|
auto res2 = obj.object("entries");
|
||||||
|
for (auto & name : accessor->readDirectory(path)) {
|
||||||
|
auto res3 = res2.placeholder(name);
|
||||||
|
listNar(res3, accessor, path + "/" + name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FSAccessor::Type::tSymlink:
|
||||||
|
obj.attr("type", "symlink");
|
||||||
|
obj.attr("target", accessor->readLink(path));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,4 +8,8 @@ namespace nix {
|
||||||
file. */
|
file. */
|
||||||
ref<FSAccessor> makeNarAccessor(ref<const std::string> nar);
|
ref<FSAccessor> makeNarAccessor(ref<const std::string> nar);
|
||||||
|
|
||||||
|
class JSONPlaceholder;
|
||||||
|
|
||||||
|
void listNar(JSONPlaceholder & res, ref<FSAccessor> accessor, const Path & path);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,10 +2,12 @@
|
||||||
#include "store-api.hh"
|
#include "store-api.hh"
|
||||||
#include "fs-accessor.hh"
|
#include "fs-accessor.hh"
|
||||||
#include "nar-accessor.hh"
|
#include "nar-accessor.hh"
|
||||||
|
#include "common-args.hh"
|
||||||
|
#include "json.hh"
|
||||||
|
|
||||||
using namespace nix;
|
using namespace nix;
|
||||||
|
|
||||||
struct MixLs : virtual Args
|
struct MixLs : virtual Args, MixJSON
|
||||||
{
|
{
|
||||||
std::string path;
|
std::string path;
|
||||||
|
|
||||||
|
@ -20,7 +22,7 @@ struct MixLs : virtual Args
|
||||||
mkFlag('d', "directory", "show directories rather than their contents", &showDirectory);
|
mkFlag('d', "directory", "show directories rather than their contents", &showDirectory);
|
||||||
}
|
}
|
||||||
|
|
||||||
void list(ref<FSAccessor> accessor)
|
void listText(ref<FSAccessor> accessor)
|
||||||
{
|
{
|
||||||
std::function<void(const FSAccessor::Stat &, const Path &, const std::string &, bool)> doPath;
|
std::function<void(const FSAccessor::Stat &, const Path &, const std::string &, bool)> doPath;
|
||||||
|
|
||||||
|
@ -61,10 +63,6 @@ struct MixLs : virtual Args
|
||||||
showFile(curPath, relPath);
|
showFile(curPath, relPath);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (path == "/") {
|
|
||||||
path = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
auto st = accessor->stat(path);
|
auto st = accessor->stat(path);
|
||||||
if (st.type == FSAccessor::Type::tMissing)
|
if (st.type == FSAccessor::Type::tMissing)
|
||||||
throw Error(format("path '%1%' does not exist") % path);
|
throw Error(format("path '%1%' does not exist") % path);
|
||||||
|
@ -72,6 +70,17 @@ struct MixLs : virtual Args
|
||||||
st.type == FSAccessor::Type::tDirectory ? "." : baseNameOf(path),
|
st.type == FSAccessor::Type::tDirectory ? "." : baseNameOf(path),
|
||||||
showDirectory);
|
showDirectory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void list(ref<FSAccessor> accessor)
|
||||||
|
{
|
||||||
|
if (path == "/") path = "";
|
||||||
|
|
||||||
|
if (json) {
|
||||||
|
JSONPlaceholder jsonRoot(std::cout, true);
|
||||||
|
listNar(jsonRoot, accessor, path);
|
||||||
|
} else
|
||||||
|
listText(accessor);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CmdLsStore : StoreCommand, MixLs
|
struct CmdLsStore : StoreCommand, MixLs
|
||||||
|
|
Loading…
Reference in a new issue