mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-09 12:28:13 -04:00
Add --remove-empty-dirs option to mkdwarfs
This commit is contained in:
parent
915a75eacb
commit
34b3de12c2
@ -134,6 +134,8 @@ class dir : public entry {
|
|||||||
global_entry_data const& data) const;
|
global_entry_data const& data) const;
|
||||||
uint32_t inode_num() const override { return inode_; }
|
uint32_t inode_num() const override { return inode_; }
|
||||||
void scan(os_access& os, progress& prog) override;
|
void scan(os_access& os, progress& prog) override;
|
||||||
|
bool empty() const { return entries_.empty(); }
|
||||||
|
void remove_empty_dirs(progress& prog);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
using entry_ptr = std::shared_ptr<entry>;
|
using entry_ptr = std::shared_ptr<entry>;
|
||||||
|
@ -49,10 +49,11 @@ struct filesystem_options {
|
|||||||
enum class file_order_mode { NONE, PATH, SCRIPT, SIMILARITY };
|
enum class file_order_mode { NONE, PATH, SCRIPT, SIMILARITY };
|
||||||
|
|
||||||
struct scanner_options {
|
struct scanner_options {
|
||||||
file_order_mode file_order;
|
file_order_mode file_order{file_order_mode::NONE};
|
||||||
std::optional<uint16_t> uid;
|
std::optional<uint16_t> uid;
|
||||||
std::optional<uint16_t> gid;
|
std::optional<uint16_t> gid;
|
||||||
std::optional<uint64_t> timestamp;
|
std::optional<uint64_t> timestamp;
|
||||||
|
bool remove_empty_dirs{false};
|
||||||
};
|
};
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& os, file_order_mode mode);
|
std::ostream& operator<<(std::ostream& os, file_order_mode mode);
|
||||||
|
@ -501,18 +501,20 @@ int main(int argc, char* argv[]) {
|
|||||||
|
|
||||||
fuse_opt_parse(&args, &s_opts, dwarfs_opts, option_hdl);
|
fuse_opt_parse(&args, &s_opts, dwarfs_opts, option_hdl);
|
||||||
|
|
||||||
s_opts.cachesize = s_opts.cachesize_str ? parse_size_with_unit(s_opts.cachesize_str)
|
s_opts.cachesize = s_opts.cachesize_str
|
||||||
: (static_cast<size_t>(512) << 20);
|
? parse_size_with_unit(s_opts.cachesize_str)
|
||||||
|
: (static_cast<size_t>(512) << 20);
|
||||||
// TODO: foreground mode, stderr vs. syslog?
|
// TODO: foreground mode, stderr vs. syslog?
|
||||||
s_opts.debuglevel = s_opts.debuglevel_str
|
s_opts.debuglevel = s_opts.debuglevel_str
|
||||||
? logger::parse_level(s_opts.debuglevel_str)
|
? logger::parse_level(s_opts.debuglevel_str)
|
||||||
: logger::INFO;
|
: logger::INFO;
|
||||||
s_opts.workers = s_opts.workers_str ? folly::to<size_t>(s_opts.workers_str) : 2;
|
s_opts.workers =
|
||||||
|
s_opts.workers_str ? folly::to<size_t>(s_opts.workers_str) : 2;
|
||||||
s_opts.lock_mode =
|
s_opts.lock_mode =
|
||||||
s_opts.mlock_str ? parse_mlock_mode(s_opts.mlock_str) : mlock_mode::NONE;
|
s_opts.mlock_str ? parse_mlock_mode(s_opts.mlock_str) : mlock_mode::NONE;
|
||||||
s_opts.decompress_ratio = s_opts.decompress_ratio_str
|
s_opts.decompress_ratio = s_opts.decompress_ratio_str
|
||||||
? folly::to<double>(s_opts.decompress_ratio_str)
|
? folly::to<double>(s_opts.decompress_ratio_str)
|
||||||
: 0.8;
|
: 0.8;
|
||||||
|
|
||||||
s_lgr.set_threshold(s_opts.debuglevel);
|
s_lgr.set_threshold(s_opts.debuglevel);
|
||||||
log_proxy<debug_logger_policy> log(s_lgr);
|
log_proxy<debug_logger_policy> log(s_lgr);
|
||||||
|
@ -211,6 +211,24 @@ void dir::pack(thrift::metadata::metadata& mv2,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dir::remove_empty_dirs(progress& prog) {
|
||||||
|
auto last = std::remove_if(entries_.begin(), entries_.end(),
|
||||||
|
[&](std::shared_ptr<entry> const& e) {
|
||||||
|
if (auto d = dynamic_cast<dir*>(e.get())) {
|
||||||
|
d->remove_empty_dirs(prog);
|
||||||
|
return d->empty();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (last != entries_.end()) {
|
||||||
|
auto num = std::distance(last, entries_.end());
|
||||||
|
prog.dirs_scanned -= num;
|
||||||
|
prog.dirs_found -= num;
|
||||||
|
entries_.erase(last, entries_.end());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
entry::type_t link::type() const { return E_LINK; }
|
entry::type_t link::type() const { return E_LINK; }
|
||||||
|
|
||||||
const std::string& link::linkname() const { return link_; }
|
const std::string& link::linkname() const { return link_; }
|
||||||
|
@ -451,6 +451,12 @@ void scanner_<LoggerPolicy>::scan(filesystem_writer& fsw,
|
|||||||
|
|
||||||
auto root = scan_tree(path, prog);
|
auto root = scan_tree(path, prog);
|
||||||
|
|
||||||
|
if (options_.remove_empty_dirs) {
|
||||||
|
log_.info() << "removing empty directories...";
|
||||||
|
auto d = dynamic_cast<dir*>(root.get());
|
||||||
|
d->remove_empty_dirs(prog);
|
||||||
|
}
|
||||||
|
|
||||||
// now scan all files
|
// now scan all files
|
||||||
scan_files_visitor sfv(wg_, *os_, prog);
|
scan_files_visitor sfv(wg_, *os_, prog);
|
||||||
root->accept(sfv);
|
root->accept(sfv);
|
||||||
|
@ -328,6 +328,9 @@ int mkdwarfs(int argc, char** argv) {
|
|||||||
po::value<unsigned>(&cfg.window_increment_shift)
|
po::value<unsigned>(&cfg.window_increment_shift)
|
||||||
->default_value(1),
|
->default_value(1),
|
||||||
"window increment (as right shift of size)")
|
"window increment (as right shift of size)")
|
||||||
|
("remove-empty-dirs",
|
||||||
|
po::value<bool>(&options.remove_empty_dirs)->zero_tokens(),
|
||||||
|
"remove empty directories in file system")
|
||||||
("log-level",
|
("log-level",
|
||||||
po::value<std::string>(&log_level)->default_value("info"),
|
po::value<std::string>(&log_level)->default_value("info"),
|
||||||
"log level (error, warn, info, debug, trace)")
|
"log level (error, warn, info, debug, trace)")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user