2026-05-20 21:17:04 -04:00
|
|
|
#include "func_statx_newest.hpp"
|
|
|
|
|
|
|
|
|
|
#include "fs_inode.hpp"
|
|
|
|
|
#include "fs_statx.hpp"
|
|
|
|
|
#include "symlinkify.hpp"
|
|
|
|
|
#include "timespec_utils.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::string_view
|
|
|
|
|
Func2::StatxNewest::name() const
|
|
|
|
|
{
|
2026-05-26 21:30:38 -04:00
|
|
|
|
2026-05-20 21:17:04 -04:00
|
|
|
return "newest";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
Func2::StatxNewest::operator()(const Branches &branches_,
|
|
|
|
|
const fs::path &fusepath_,
|
|
|
|
|
const u32 flags_,
|
|
|
|
|
const u32 mask_,
|
|
|
|
|
struct fuse_statx *st_,
|
|
|
|
|
const FollowSymlinksEnum follow_symlinks_,
|
|
|
|
|
const bool symlinkify_,
|
|
|
|
|
const s64 symlinkify_timeout_)
|
|
|
|
|
{
|
|
|
|
|
int rv;
|
|
|
|
|
int err;
|
|
|
|
|
fs::path fullpath;
|
|
|
|
|
const Branch *newest_branch;
|
|
|
|
|
|
|
|
|
|
err = 0;
|
|
|
|
|
newest_branch = nullptr;
|
2026-05-26 21:30:38 -04:00
|
|
|
Branches::Ptr branches = branches_;
|
|
|
|
|
for(const auto &branch : *branches)
|
2026-05-20 21:17:04 -04:00
|
|
|
{
|
|
|
|
|
struct fuse_statx tmp_st;
|
|
|
|
|
|
|
|
|
|
fullpath = branch.path / fusepath_;
|
|
|
|
|
rv = fs::statx(AT_FDCWD,
|
|
|
|
|
fullpath,
|
|
|
|
|
flags_|AT_SYMLINK_NOFOLLOW,
|
|
|
|
|
mask_,
|
|
|
|
|
&tmp_st,
|
|
|
|
|
follow_symlinks_);
|
|
|
|
|
if(rv < 0)
|
|
|
|
|
{
|
|
|
|
|
err = rv;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(newest_branch && (st_->mtime > tmp_st.mtime))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
*st_ = tmp_st;
|
|
|
|
|
newest_branch = &branch;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!newest_branch)
|
|
|
|
|
return err;
|
|
|
|
|
|
|
|
|
|
if(symlinkify_)
|
|
|
|
|
{
|
|
|
|
|
fullpath = newest_branch->path / fusepath_;
|
|
|
|
|
symlinkify::convert_if_can_be_symlink(fullpath,
|
|
|
|
|
st_,
|
|
|
|
|
symlinkify_timeout_);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fs::inode::calc(newest_branch->path,fusepath_,st_);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|