rm: Add the -v flag
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
apio 2023-09-02 14:46:14 +02:00
parent 06aa7725a1
commit cb0d5cb6a1
Signed by: apio
GPG Key ID: B8A7D06E42258954
3 changed files with 28 additions and 26 deletions

View File

@ -1,10 +1,35 @@
#include <os/ArgumentParser.h> #include <os/ArgumentParser.h>
#include <os/Directory.h>
#include <os/File.h>
#include <os/FileSystem.h> #include <os/FileSystem.h>
Result<void> remove_wrapper(const os::Path& path, bool verbose)
{
TRY(os::FileSystem::remove(path));
if (verbose) os::println("removed '%s'", path.name().chars());
return {};
}
Result<void> remove_tree(const os::Path& path, bool verbose)
{
auto rc = remove_wrapper(path, verbose);
if (!rc.has_error()) return {};
if (rc.error() != ENOTEMPTY) return rc.release_error();
auto dir = TRY(os::Directory::open(path));
Vector<String> entries = TRY(dir->list_names(os::Directory::Filter::ParentAndBase));
for (const auto& entry : entries) { TRY(remove_tree({ dir->fd(), entry.view() }, verbose)); }
return remove_wrapper(path, verbose);
}
Result<int> luna_main(int argc, char** argv) Result<int> luna_main(int argc, char** argv)
{ {
StringView path; StringView path;
bool recursive; bool recursive;
bool verbose;
os::ArgumentParser parser; os::ArgumentParser parser;
parser.add_description("Remove a path from the file system."_sv); parser.add_description("Remove a path from the file system."_sv);
@ -12,11 +37,12 @@ Result<int> luna_main(int argc, char** argv)
parser.add_positional_argument(path, "path"_sv, true); parser.add_positional_argument(path, "path"_sv, true);
parser.add_switch_argument(recursive, 'r', "recursive"_sv, parser.add_switch_argument(recursive, 'r', "recursive"_sv,
"remove a directory recursively (by default, rm removes only empty directories)"_sv); "remove a directory recursively (by default, rm removes only empty directories)"_sv);
parser.add_switch_argument(verbose, 'v', "verbose"_sv, "log every removed file and directory"_sv);
parser.parse(argc, argv); parser.parse(argc, argv);
if (!recursive) TRY(os::FileSystem::remove(path)); if (!recursive) TRY(remove_wrapper(path, verbose));
else else
TRY(os::FileSystem::remove_tree(path)); TRY(remove_tree(path, verbose));
return 0; return 0;
} }

View File

@ -68,15 +68,6 @@ namespace os
*/ */
Result<void> remove(const Path& path); Result<void> remove(const Path& path);
/**
* @brief Remove a directory tree from the file system recursively, deleting subfiles and subdirectories as
* well.
*
* @param path The path to remove.
* @return Result<void> Whether the operation succeeded.
*/
Result<void> remove_tree(const Path& path);
/** /**
* @brief Read the target of a symbolic link. * @brief Read the target of a symbolic link.
* *

View File

@ -63,21 +63,6 @@ namespace os::FileSystem
return {}; return {};
} }
Result<void> remove_tree(const Path& path)
{
auto rc = remove(path);
if (!rc.has_error()) return {};
if (rc.error() != ENOTEMPTY) return rc.release_error();
auto dir = TRY(os::Directory::open(path));
Vector<String> entries = TRY(dir->list_names(os::Directory::Filter::ParentAndBase));
for (const auto& entry : entries) { TRY(remove_tree({ dir->fd(), entry.view() })); }
return remove(path);
}
Result<String> readlink(const Path& path) Result<String> readlink(const Path& path)
{ {
struct stat st; struct stat st;