Compare commits

...
119 Commits
Author SHA1 Message Date
Antonio SJ Musumeci b3dfe45bd3 mfm_dup.cpp 2025-09-01 20:24:03 -05:00
Antonio SJ Musumeci 8b099982da mfm_dup.cpp 2025-09-01 20:22:32 -05:00
Antonio SJ Musumeci e2f1343435 mfm_dup.cpp 2025-09-01 20:08:18 -05:00
Antonio SJ Musumeci 4e58caac83 mfm_dup.cpp 2025-09-01 20:06:47 -05:00
Antonio SJ Musumeci 261453bd87 mfm_dup.cpp 2025-09-01 19:53:09 -05:00
Antonio SJ Musumeci b11848cc19 mfm_dup.cpp 2025-09-01 19:52:06 -05:00
Antonio SJ Musumeci d63f451232 mfm_dup.cpp 2025-09-01 19:50:50 -05:00
Antonio SJ Musumeci 6e6093bc9f mfm_dup.cpp 2025-09-01 19:50:34 -05:00
Antonio SJ Musumeci 21d67a903c mfm_dup.cpp 2025-09-01 19:48:43 -05:00
Antonio SJ Musumeci 239f27ec6a mfm_dup.cpp 2025-09-01 19:48:04 -05:00
Antonio SJ Musumeci 6ecadf2477 mfm_dup.cpp 2025-09-01 19:43:39 -05:00
Antonio SJ Musumeci baf78b7578 fs_clonepath.cpp 2025-09-01 19:33:29 -05:00
Antonio SJ Musumeci 1b15ffce94 fs_clonepath.cpp 2025-09-01 19:33:22 -05:00
Antonio SJ Musumeci 4cec9428d6 fs_clonepath.cpp 2025-09-01 19:32:26 -05:00
Antonio SJ Musumeci 1be94b72c4 fs_clonepath.cpp 2025-09-01 19:31:43 -05:00
Antonio SJ Musumeci 412ed6bb4c fs_clonepath.cpp 2025-09-01 19:31:30 -05:00
Antonio SJ Musumeci fc23f6fc79 fs_clonepath.cpp 2025-09-01 19:30:42 -05:00
Antonio SJ Musumeci 590cfe7e35 fs_clonepath.cpp 2025-09-01 19:30:01 -05:00
Antonio SJ Musumeci b08b727a72 fs_clonepath.cpp 2025-09-01 19:26:23 -05:00
Antonio SJ Musumeci da240c1756 fs_clonepath.cpp 2025-09-01 19:26:09 -05:00
Antonio SJ Musumeci a4663bd546 fs_clonepath.cpp 2025-09-01 19:26:04 -05:00
Antonio SJ Musumeci 97c6964415 fs_clonepath.cpp 2025-09-01 19:25:27 -05:00
Antonio SJ Musumeci 6b8e6459d4 fs_clonepath.cpp 2025-09-01 19:25:07 -05:00
Antonio SJ Musumeci 13697c49d3 mfm_dup.cpp 2025-09-01 19:21:52 -05:00
Antonio SJ Musumeci 0776783767 mfm_dup.cpp 2025-09-01 19:18:16 -05:00
Antonio SJ Musumeci 07302d3c8e mfm_dup.cpp 2025-09-01 18:50:50 -05:00
Antonio SJ Musumeci 43633bd80f mfm_dup.cpp 2025-09-01 18:48:38 -05:00
Antonio SJ Musumeci 03563cba73 mfm_dup.cpp 2025-09-01 18:48:22 -05:00
Antonio SJ Musumeci 56ca294acb mfm_dup.cpp 2025-09-01 18:47:54 -05:00
Antonio SJ Musumeci 52bee524fe mfm_dup.cpp 2025-09-01 18:39:53 -05:00
Antonio SJ Musumeci 0ea606a398 fs_clonepath.cpp 2025-09-01 18:37:46 -05:00
Antonio SJ Musumeci 6474f7cb27 fs_clonepath.cpp 2025-09-01 18:36:59 -05:00
Antonio SJ Musumeci 42658b8a10 fs_clonepath.cpp 2025-09-01 18:35:59 -05:00
Antonio SJ Musumeci 1ca97602f6 fs_clonepath.cpp 2025-09-01 18:35:46 -05:00
Antonio SJ Musumeci 6ef6198719 fs_clonepath.cpp 2025-09-01 18:32:09 -05:00
Antonio SJ Musumeci 3c5ef655ea mfm.cpp 2025-09-01 18:31:12 -05:00
Antonio SJ Musumeci db9880e568 mfm.cpp 2025-09-01 18:28:37 -05:00
Antonio SJ Musumeci 9e7af2f5bc mfm.cpp 2025-09-01 18:28:29 -05:00
Antonio SJ Musumeci 896244b76d mfm.cpp 2025-09-01 18:27:43 -05:00
Antonio SJ Musumeci 1c27ae2074 mfm.cpp 2025-09-01 18:24:43 -05:00
Antonio SJ Musumeci 30304a5d5d mfm.cpp 2025-09-01 18:20:48 -05:00
Antonio SJ Musumeci e649385ab9 mfm.cpp 2025-09-01 18:20:21 -05:00
Antonio SJ Musumeci ba7367e9f8 mfm.cpp 2025-09-01 18:19:44 -05:00
Antonio SJ Musumeci 98076e6e6d mfm.cpp 2025-09-01 18:19:18 -05:00
Antonio SJ Musumeci 51fc08eaaa mfm.cpp 2025-09-01 18:17:51 -05:00
Antonio SJ Musumeci a0945e5f12 fs_clonepath.cpp 2025-09-01 18:14:33 -05:00
Antonio SJ Musumeci cff15446ec mfm_dup.cpp 2025-09-01 16:46:36 -05:00
Antonio SJ Musumeci 056fe774be mfm_dup.cpp 2025-09-01 16:45:39 -05:00
Antonio SJ Musumeci b5435c0119 fs_clonepath.cpp 2025-09-01 16:38:57 -05:00
Antonio SJ Musumeci f84db6e76a fs_clonepath.cpp 2025-09-01 16:38:38 -05:00
Antonio SJ Musumeci ca8193a18b mfm_dup.cpp 2025-09-01 16:25:46 -05:00
Antonio SJ Musumeci dc0c6d5506 mfm_dup.cpp 2025-09-01 15:56:01 -05:00
Antonio SJ Musumeci 94c7c5b6b2 mfm_dup.cpp 2025-09-01 15:55:57 -05:00
Antonio SJ Musumeci c83949790f mfm_dup.cpp 2025-09-01 15:54:49 -05:00
Antonio SJ Musumeci e544d19f68 mfm_dup.cpp 2025-09-01 15:54:47 -05:00
Antonio SJ Musumeci c70b0fa79f mfm_dup.cpp 2025-09-01 15:44:19 -05:00
Antonio SJ Musumeci 5612491a6a mfm_dup.cpp 2025-09-01 15:44:06 -05:00
Antonio SJ Musumeci 7126108e4d mfm_dup.cpp 2025-09-01 15:41:45 -05:00
Antonio SJ Musumeci ee9c7728a0 mfm_dup.cpp 2025-09-01 15:41:14 -05:00
Antonio SJ Musumeci 5363c4c70c mfm_dup.cpp 2025-09-01 15:39:34 -05:00
Antonio SJ Musumeci 20f1352a4b mfm_dup.cpp 2025-09-01 15:39:21 -05:00
Antonio SJ Musumeci f3ffc3319d mfm_dup.cpp 2025-09-01 15:39:00 -05:00
Antonio SJ Musumeci a75ec5c176 mfm_dup.cpp 2025-09-01 15:38:34 -05:00
Antonio SJ Musumeci 40c3995109 mfm_dup.cpp 2025-09-01 15:38:29 -05:00
Antonio SJ Musumeci e67fe02bf1 mfm_dup.cpp 2025-09-01 15:37:19 -05:00
Antonio SJ Musumeci a034588526 mfm_dup.cpp 2025-09-01 15:37:09 -05:00
Antonio SJ Musumeci 01be549023 mfm_dup.cpp 2025-09-01 15:36:59 -05:00
Antonio SJ Musumeci accf56044f mfm_dup.cpp 2025-09-01 15:36:37 -05:00
Antonio SJ Musumeci ab9678ba5d mfm_dup.cpp 2025-09-01 15:35:05 -05:00
Antonio SJ Musumeci 404eb4e35b mfm_dup.cpp 2025-09-01 15:35:02 -05:00
Antonio SJ Musumeci 5783e32849 mfm_dup.cpp 2025-09-01 15:34:13 -05:00
Antonio SJ Musumeci 566e6e4af0 mfm_dup.cpp 2025-09-01 15:34:04 -05:00
Antonio SJ Musumeci 04ad916571 mfm_dup.cpp 2025-09-01 15:33:22 -05:00
Antonio SJ Musumeci 1f4827e032 mfm_dup.cpp 2025-09-01 15:33:14 -05:00
Antonio SJ Musumeci 755962b865 mfm_dup.cpp 2025-09-01 15:33:10 -05:00
Antonio SJ Musumeci 3b3d2b24a9 mfm_dup.cpp 2025-09-01 15:33:01 -05:00
Antonio SJ Musumeci f529b8a709 mfm_dup.cpp 2025-09-01 15:32:52 -05:00
Antonio SJ Musumeci a8de05369e mfm_dup.cpp 2025-09-01 15:32:49 -05:00
Antonio SJ Musumeci a5cd0c68b9 mfm_dup.cpp 2025-09-01 15:32:46 -05:00
Antonio SJ Musumeci f455208d16 mfm_dup.cpp 2025-09-01 15:31:28 -05:00
Antonio SJ Musumeci 907bc2b424 mfm_dup.cpp 2025-09-01 15:26:51 -05:00
Antonio SJ Musumeci 91614a1197 mfm_dup.cpp 2025-09-01 15:26:48 -05:00
Antonio SJ Musumeci c34f4e650c mfm_dup.cpp 2025-09-01 15:23:30 -05:00
Antonio SJ Musumeci d50c3e2614 mfm_dup.cpp 2025-09-01 15:23:26 -05:00
Antonio SJ Musumeci 976918b5bb mfm_dup.cpp 2025-09-01 14:15:22 -05:00
Antonio SJ Musumeci fc09316c6d mfm_dup.cpp 2025-09-01 14:14:55 -05:00
Antonio SJ Musumeci acc329aed0 mfm_dup.cpp 2025-09-01 14:14:49 -05:00
Antonio SJ Musumeci f6e618091d mfm_dup.cpp 2025-09-01 14:14:39 -05:00
Antonio SJ Musumeci 0046b32f13 mfm_dup.cpp 2025-09-01 14:14:20 -05:00
Antonio SJ Musumeci 4316ab40f2 mfm_dup.cpp 2025-09-01 14:14:15 -05:00
Antonio SJ Musumeci 5f293452b6 mfm_dup.cpp 2025-09-01 14:10:52 -05:00
Antonio SJ Musumeci 4a6cec777b mfm_dup.cpp 2025-09-01 14:10:34 -05:00
Antonio SJ Musumeci 7a59cc8da8 mfm_dup.cpp 2025-09-01 14:10:29 -05:00
Antonio SJ Musumeci ff35f87a05 mfm_dup.cpp 2025-09-01 14:10:27 -05:00
Antonio SJ Musumeci 37f53c2873 mfm_dup.cpp 2025-09-01 14:09:25 -05:00
Antonio SJ Musumeci d47b805477 mfm.cpp 2025-09-01 14:07:56 -05:00
Antonio SJ Musumeci 0bd04307b2 mfm_options.hpp 2025-09-01 14:06:59 -05:00
Antonio SJ Musumeci eefea74996 mfm_dup.cpp 2025-09-01 13:45:46 -05:00
Antonio SJ Musumeci f639f28ccd mfm_dup.cpp 2025-09-01 13:45:37 -05:00
Antonio SJ Musumeci c5934c5fcc mfm_dup.cpp 2025-09-01 13:43:53 -05:00
Antonio SJ Musumeci b46cfd3258 mfm_dup.cpp 2025-09-01 13:43:21 -05:00
Antonio SJ Musumeci 39d6d89fa0 mfm_dup.cpp 2025-09-01 13:43:00 -05:00
Antonio SJ Musumeci 72c4bd56af mfm_dup.cpp 2025-09-01 13:42:26 -05:00
Antonio SJ Musumeci a9126957e6 mfm_dup.cpp 2025-09-01 13:42:20 -05:00
Antonio SJ Musumeci 6d725a7743 mfm_dup.cpp 2025-09-01 13:41:00 -05:00
Antonio SJ Musumeci 23bd3ba020 checkpoint 2025-09-01 01:51:33 -05:00
Antonio SJ Musumeci 97a722660f mfm.cpp 2025-09-01 00:13:45 -05:00
Antonio SJ Musumeci d2499e87d6 mfm.hpp 2025-09-01 00:13:32 -05:00
Antonio SJ Musumeci e1dd0ab847 mfm.cpp 2025-09-01 00:12:53 -05:00
Antonio SJ Musumeci 72b30e3e21 mfm.cpp 2025-09-01 00:12:33 -05:00
Antonio SJ Musumeci b2170f3ab3 mfm.hpp 2025-09-01 00:11:10 -05:00
Antonio SJ Musumeci fab71e37f0 mfm.cpp 2025-09-01 00:08:50 -05:00
Antonio SJ Musumeci cf1514efc8 mfm.cpp 2025-09-01 00:07:50 -05:00
Antonio SJ Musumeci 192230ba16 mfm_options.hpp 2025-09-01 00:06:35 -05:00
Antonio SJ Musumeci 7ba4cdeaba mfm.cpp 2025-09-01 00:06:04 -05:00
Antonio SJ Musumeci 907dddb0ca checkpoint 2025-08-31 22:40:37 -05:00
Antonio SJ Musumeci d88731a380 checkpoint 2025-08-31 14:13:06 -05:00
Antonio SJ Musumeci 750062559a mergerfs.cpp 2025-08-31 14:01:35 -05:00
Antonio SJ Musumeci 69ed827fe1 mergerfs.cpp 2025-08-31 14:01:26 -05:00
7 changed files with 233 additions and 5 deletions
+5 -1
View File
@@ -140,7 +140,7 @@ INSTALLMAN1DIR ?= $(DESTDIR)$(MAN1DIR)
.PHONY: all
all: libfuse $(BUILDDIR)/mergerfs $(BUILDDIR)/fsck.mergerfs $(BUILDDIR)/mergerfs.collect-info
all: libfuse $(BUILDDIR)/mergerfs $(BUILDDIR)/fsck.mergerfs $(BUILDDIR)/mergerfs.collect-info $(BUILDDIR)/mfm
.PHONY: help
help:
@@ -162,6 +162,9 @@ $(BUILDDIR)/fsck.mergerfs:
$(BUILDDIR)/mergerfs.collect-info:
$(LN) -sf "mergerfs" $@
$(BUILDDIR)/mfm:
$(LN) -sf "mergerfs" $@
$(BUILDDIR)/tests: $(BUILDDIR)/mergerfs $(TESTS_OBJS)
$(CXX) $(CXXFLAGS) $(TESTS_FLAGS) $(INC_FLAGS) $(MFS_FLAGS) $(CPPFLAGS) $(TESTS_OBJS) -o $@ $(LDFLAGS) $(LDLIBS)
@@ -223,6 +226,7 @@ install-base: all
$(INSTALL) -v -m 0755 "$(BUILDDIR)/mergerfs" "$(INSTALLBINDIR)/mergerfs"
$(LN) -fs "mergerfs" "${INSTALLBINDIR}/fsck.mergerfs"
$(LN) -fs "mergerfs" "${INSTALLBINDIR}/mergerfs.collect-info"
$(LN) -fs "mergerfs" "${INSTALLBINDIR}/mfm"
.PHONY: install-mount-tools
install-mount-tools: install-base
+10 -4
View File
@@ -27,10 +27,11 @@
#include "fs_xattr.hpp"
#include "ugid.hpp"
#include <filesystem>
#include <string>
using std::string;
namespace stdfs = std::filesystem;
static
bool
@@ -65,13 +66,18 @@ fs::clonepath(const string &srcpath_,
struct stat st;
string dstpath;
string srcpath;
string dirname;
stdfs::path dirname;
stdfs::path relpath;
if((relpath_ == NULL) || (relpath_[0] == '\0'))
return 0;
dirname = fs::path::dirname(relpath_);
if(dirname != "/")
relpath = relpath_;
if(relpath_[0] != '/')
relpath = "/" / relpath;
dirname = relpath.parent_path();
if(dirname != dirname.root_path())
{
rv = fs::clonepath(srcpath_,dstpath_,dirname,return_metadata_errors_);
if(rv < 0)
+3
View File
@@ -17,6 +17,7 @@
#include "mergerfs.hpp"
#include "mergerfs_fsck.hpp"
#include "mergerfs_collect_info.hpp"
#include "mfm.hpp"
#include "fs_path.hpp"
#include "fs_readahead.hpp"
@@ -373,6 +374,8 @@ _pick_app_and_run(int argc_,
return mergerfs::fsck::main(argc_,argv_);
if(appname == "mergerfs.collect-info")
return mergerfs::collect_info::main(argc_,argv_);
if(appname == "mfm")
return mfm::main(argc_,argv_);
return l::main(argc_,argv_);
}
+86
View File
@@ -0,0 +1,86 @@
#include "mfm.hpp"
#include "mfm_options.hpp"
#include "CLI11.hpp"
static
void
_setup_argparser_dup(CLI::App &app_,
mfm::Opts::Dup &opts_)
{
CLI::App *subcmd;
subcmd = app_.add_subcommand("dup",
"duplicate files");
subcmd->add_option("path",opts_.paths)
->description("")
->type_name("PATH")
->check(CLI::ExistingPath)
->required();
auto func = std::bind(mfm::dup,std::cref(opts_));
subcmd->callback(func);
}
static
void
_setup_argparser_watch(CLI::App &app_,
mfm::Opts::Watch &opts_)
{
}
static
void
_setup_argparser_migrate(CLI::App &app_,
mfm::Opts::Migrate &opts_)
{
}
static
void
_setup_argparser_rebalance(CLI::App &app_,
mfm::Opts::Rebalance &opts_)
{
}
static
void
_setup_argparser(CLI::App &app_,
mfm::Opts &opts_)
{
_setup_argparser_dup(app_,opts_.dup);
_setup_argparser_migrate(app_,opts_.migrate);
_setup_argparser_rebalance(app_,opts_.rebalance);
_setup_argparser_watch(app_,opts_.watch);
}
#include "fmt/core.h"
int
mfm::main(int argc_,
char **argv_)
{
CLI::App app;
mfm::Opts opts;
app.description("mfm: mergerfs filesystem manager");
app.name("USAGE:: mfm");
::_setup_argparser(app,opts);
try
{
app.parse(argc_,argv_);
}
catch(const CLI::ParseError &e_)
{
return app.exit(e_);
}
return 0;
}
+11
View File
@@ -0,0 +1,11 @@
#pragma once
#include "mfm_options.hpp"
namespace mfm
{
int main(int argc,
char **argv);
void dup(const Opts::Dup &dup);
}
+84
View File
@@ -0,0 +1,84 @@
#include "mfm_options.hpp"
#include "str.hpp"
#include "fs_clonepath.hpp"
#include "fs_copyfile.hpp"
#include "fmt/core.h"
#include <filesystem>
namespace stdfs = std::filesystem;
namespace mfm
{
void dup(const Opts::Dup &opts);
}
void
mfm::dup(const Opts::Dup &opts_)
{
std::vector<std::filesystem::path> srcpaths;
// TODO: expand if mergerfs mount
srcpaths = opts_.paths;
for(const auto &srcpath : srcpaths)
{
if(stdfs::is_regular_file(srcpath))
{
}
else if(stdfs::is_directory(srcpath))
{
auto dir_opts = (stdfs::directory_options::follow_directory_symlink |
stdfs::directory_options::skip_permission_denied);
for(const stdfs::directory_entry &de :
stdfs::recursive_directory_iterator(srcpath,dir_opts))
{
if(!str::startswith(de.path().filename().string(),".dup_"))
continue;
for(const auto &de :
stdfs::recursive_directory_iterator(de.path().parent_path()))
{
if(!de.is_regular_file())
continue;
auto relpath = "/" / stdfs::relative(de.path(),srcpath);
for(const auto &dstpath : srcpaths)
{
if(dstpath == srcpath)
continue;
auto srcfullpath = srcpath / relpath.relative_path();
auto dstfullpath = srcpath / relpath.relative_path();
if(stdfs::exists(dstfullpath))
continue;
fmt::println("copy {} to {} : {} : {}",
srcpath.string(),
dstpath.string(),
relpath.parent_path().string(),
relpath.filename().string());
fs::clonepath(srcpath,
dstpath,
relpath.parent_path());
fs::copyfile(srcpath / relpath.relative_path(),
dstpath / relpath.relative_path(),
{.cleanup_failure=false});
}
}
}
}
else
{
//throw std::runtime_error("invalid file type");
fmt::println("invalid file type: {}",srcpath.string());
}
}
}
+34
View File
@@ -0,0 +1,34 @@
#pragma once
#include "int_types.h"
#include <filesystem>
#include <string>
#include <vector>
namespace mfm
{
struct Opts
{
struct Dup
{
std::vector<std::filesystem::path> paths;
} dup;
struct Watch
{
std::filesystem::path path;
} watch;
struct Migrate
{
std::vector<std::filesystem::path> src;
std::vector<std::filesystem::path> dst;
} migrate;
struct Rebalance
{
std::vector<std::filesystem::path> dirpaths;
} rebalance;
};
};