diff --git a/src/cmd/cli.cpp b/src/cmd/cli.cpp index 63cc5113..00e156ea 100644 --- a/src/cmd/cli.cpp +++ b/src/cmd/cli.cpp @@ -30,6 +30,7 @@ static const char* help_text = "\n" "vitastor-cli ls [-l] [-p POOL] [--sort FIELD] [-r] [-n N] [ ...]\n" " List images (only matching patterns if passed).\n" + " --exact Do not match glob patterns as names, select only exact name matches.\n" " -p|--pool POOL Filter images by pool ID or name\n" " -l|--long Also report allocated size and I/O statistics\n" " --del Also include delete operation statistics\n" @@ -275,7 +276,7 @@ static json11::Json::object parse_args(int narg, const char *args[]) !strcmp(opt, "allow-data-loss") || !strcmp(opt, "allow_data_loss") || !strcmp(opt, "down-ok") || !strcmp(opt, "down_ok") || !strcmp(opt, "dry-run") || !strcmp(opt, "dry_run") || - !strcmp(opt, "help") || !strcmp(opt, "all") || + !strcmp(opt, "help") || !strcmp(opt, "all") || !strcmp(opt, "exact") || !strcmp(opt, "writers-stopped") || !strcmp(opt, "writers_stopped")) { cfg[opt] = "1"; diff --git a/src/cmd/cli_ls.cpp b/src/cmd/cli_ls.cpp index 90b2fc4d..e8d16b9d 100644 --- a/src/cmd/cli_ls.cpp +++ b/src/cmd/cli_ls.cpp @@ -18,6 +18,7 @@ struct image_lister_t std::string sort_field; std::set only_names; bool reverse = false; + bool exact = false; int max_count = 0; bool show_stats = false, show_delete = false; @@ -208,9 +209,9 @@ resume_1: } else { - for (auto glob: only_names) + for (auto & glob: only_names) { - if (stupid_glob(kv.second["name"].string_value(), glob)) + if (exact ? (kv.second["name"].string_value() == glob) : stupid_glob(kv.second["name"].string_value(), glob)) { list.push_back(kv.second); break; @@ -538,6 +539,7 @@ std::function cli_tool_t::start_ls(json11::Json cfg) { auto lister = new image_lister_t(); lister->parent = this; + lister->exact = cfg["exact"].bool_value(); lister->list_pool_id = cfg["pool"].uint64_value(); lister->list_pool_name = lister->list_pool_id ? "" : cfg["pool"].as_string(); lister->show_stats = cfg["long"].bool_value();