in watchman/query/type.cpp [24:78]
EvaluateResult evaluate(QueryContextBase*, FileResult* file) override {
auto optionalDtype = file->dtype();
if (!optionalDtype.has_value()) {
return std::nullopt;
}
auto dtype = *optionalDtype;
if (dtype != DType::Unknown) {
switch (arg) {
case 'b':
return dtype == DType::Block;
case 'c':
return dtype == DType::Char;
case 'p':
return dtype == DType::Fifo;
case 's':
return dtype == DType::Socket;
case 'd':
return dtype == DType::Dir;
case 'f':
return dtype == DType::Regular;
case 'l':
return dtype == DType::Symlink;
}
}
auto stat = file->stat();
if (!stat.has_value()) {
return std::nullopt;
}
switch (arg) {
#ifndef _WIN32
case 'b':
return S_ISBLK(stat->mode);
case 'c':
return S_ISCHR(stat->mode);
case 'p':
return S_ISFIFO(stat->mode);
case 's':
return S_ISSOCK(stat->mode);
#endif
case 'd':
return stat->isDir();
case 'f':
return stat->isFile();
case 'l':
return stat->isSymlink();
#ifdef S_ISDOOR
case 'D':
return S_ISDOOR(stat->mode);
#endif
default:
return false;
}
}