mirror of
https://github.com/ceph/ceph
synced 2025-02-24 19:47:44 +00:00
Merge pull request #33243 from tchaikov/wip-43795
ceph_argparse: put args from env before existing ones Reviewed-by: Mykola Golub <mgolub@suse.com> Reviewed-by: Jason Dillaman <dillaman@redhat.com>
This commit is contained in:
commit
f80d8fa0b5
@ -64,23 +64,18 @@ void string_to_vec(std::vector<std::string>& args, std::string argstr)
|
||||
}
|
||||
}
|
||||
|
||||
bool split_dashdash(const std::vector<const char*>& args,
|
||||
std::vector<const char*>& options,
|
||||
std::vector<const char*>& arguments) {
|
||||
bool dashdash = false;
|
||||
for (std::vector<const char*>::const_iterator i = args.begin();
|
||||
i != args.end();
|
||||
++i) {
|
||||
if (dashdash) {
|
||||
arguments.push_back(*i);
|
||||
} else {
|
||||
if (strcmp(*i, "--") == 0)
|
||||
dashdash = true;
|
||||
else
|
||||
options.push_back(*i);
|
||||
}
|
||||
std::pair<std::vector<const char*>, std::vector<const char*>>
|
||||
split_dashdash(const std::vector<const char*>& args) {
|
||||
auto dashdash = std::find_if(args.begin(), args.end(),
|
||||
[](const char* arg) {
|
||||
return strcmp(arg, "--") == 0;
|
||||
});
|
||||
std::vector<const char*> options{args.begin(), dashdash};
|
||||
if (dashdash != args.end()) {
|
||||
++dashdash;
|
||||
}
|
||||
return dashdash;
|
||||
std::vector<const char*> arguments{dashdash, args.end()};
|
||||
return {std::move(options), std::move(arguments)};
|
||||
}
|
||||
|
||||
static std::mutex g_str_vec_lock;
|
||||
@ -98,15 +93,7 @@ void env_to_vec(std::vector<const char*>& args, const char *name)
|
||||
if (!name)
|
||||
name = "CEPH_ARGS";
|
||||
|
||||
bool dashdash = false;
|
||||
std::vector<const char*> options;
|
||||
std::vector<const char*> arguments;
|
||||
if (split_dashdash(args, options, arguments))
|
||||
dashdash = true;
|
||||
|
||||
std::vector<const char*> env_options;
|
||||
std::vector<const char*> env_arguments;
|
||||
std::vector<const char*> env;
|
||||
auto [options, arguments] = split_dashdash(args);
|
||||
|
||||
/*
|
||||
* We can only populate str_vec once. Other threads could hold pointers into
|
||||
@ -123,19 +110,21 @@ void env_to_vec(std::vector<const char*>& args, const char *name)
|
||||
}
|
||||
g_str_vec_lock.unlock();
|
||||
|
||||
vector<string>::iterator i;
|
||||
for (i = g_str_vec.begin(); i != g_str_vec.end(); ++i)
|
||||
env.push_back(i->c_str());
|
||||
if (split_dashdash(env, env_options, env_arguments))
|
||||
dashdash = true;
|
||||
std::vector<const char*> env;
|
||||
for (const auto& s : g_str_vec) {
|
||||
env.push_back(s.c_str());
|
||||
}
|
||||
auto [env_options, env_arguments] = split_dashdash(env);
|
||||
|
||||
args.clear();
|
||||
args.insert(args.end(), options.begin(), options.end());
|
||||
args.insert(args.end(), env_options.begin(), env_options.end());
|
||||
if (dashdash)
|
||||
args.push_back("--");
|
||||
args.insert(args.end(), arguments.begin(), arguments.end());
|
||||
args.insert(args.end(), options.begin(), options.end());
|
||||
if (arguments.empty() && env_arguments.empty()) {
|
||||
return;
|
||||
}
|
||||
args.push_back("--");
|
||||
args.insert(args.end(), env_arguments.begin(), env_arguments.end());
|
||||
args.insert(args.end(), arguments.begin(), arguments.end());
|
||||
}
|
||||
|
||||
void argv_to_vec(int argc, const char **argv,
|
||||
|
@ -385,14 +385,15 @@ TEST(CephArgParse, env_to_vec) {
|
||||
clear_g_str_vec();
|
||||
env_to_vec(args);
|
||||
EXPECT_EQ(3u, args.size());
|
||||
EXPECT_EQ(string("b"), args[1]);
|
||||
EXPECT_EQ(string("c"), args[2]);
|
||||
EXPECT_EQ(string("b"), args[0]);
|
||||
EXPECT_EQ(string("c"), args[1]);
|
||||
EXPECT_EQ(string("a"), args[2]);
|
||||
setenv("WHATEVER", "d e", 0);
|
||||
clear_g_str_vec();
|
||||
env_to_vec(args, "WHATEVER");
|
||||
EXPECT_EQ(5u, args.size());
|
||||
EXPECT_EQ(string("d"), args[3]);
|
||||
EXPECT_EQ(string("e"), args[4]);
|
||||
EXPECT_EQ(string("d"), args[0]);
|
||||
EXPECT_EQ(string("e"), args[1]);
|
||||
}
|
||||
{
|
||||
std::vector<const char*> args;
|
||||
@ -404,11 +405,11 @@ TEST(CephArgParse, env_to_vec) {
|
||||
clear_g_str_vec();
|
||||
env_to_vec(args);
|
||||
EXPECT_EQ(5u, args.size());
|
||||
EXPECT_EQ(string("a"), args[0]);
|
||||
EXPECT_EQ(string("b"), args[1]);
|
||||
EXPECT_EQ(string("b"), args[0]);
|
||||
EXPECT_EQ(string("a"), args[1]);
|
||||
EXPECT_EQ(string("--"), args[2]);
|
||||
EXPECT_EQ(string("c"), args[3]);
|
||||
EXPECT_EQ(string("d"), args[4]);
|
||||
EXPECT_EQ(string("d"), args[3]);
|
||||
EXPECT_EQ(string("c"), args[4]);
|
||||
}
|
||||
{
|
||||
std::vector<const char*> args;
|
||||
@ -419,8 +420,8 @@ TEST(CephArgParse, env_to_vec) {
|
||||
clear_g_str_vec();
|
||||
env_to_vec(args);
|
||||
EXPECT_EQ(4u, args.size());
|
||||
EXPECT_EQ(string("a"), args[0]);
|
||||
EXPECT_EQ(string("b"), args[1]);
|
||||
EXPECT_EQ(string("b"), args[0]);
|
||||
EXPECT_EQ(string("a"), args[1]);
|
||||
EXPECT_EQ(string("--"), args[2]);
|
||||
EXPECT_EQ(string("c"), args[3]);
|
||||
}
|
||||
@ -435,8 +436,8 @@ TEST(CephArgParse, env_to_vec) {
|
||||
EXPECT_EQ(4u, args.size());
|
||||
EXPECT_EQ(string("b"), args[0]);
|
||||
EXPECT_EQ(string("--"), args[1]);
|
||||
EXPECT_EQ(string("c"), args[2]);
|
||||
EXPECT_EQ(string("d"), args[3]);
|
||||
EXPECT_EQ(string("d"), args[2]);
|
||||
EXPECT_EQ(string("c"), args[3]);
|
||||
}
|
||||
{
|
||||
std::vector<const char*> args;
|
||||
@ -446,8 +447,8 @@ TEST(CephArgParse, env_to_vec) {
|
||||
clear_g_str_vec();
|
||||
env_to_vec(args);
|
||||
EXPECT_EQ(4u, args.size());
|
||||
EXPECT_EQ(string("b"), args[0]);
|
||||
EXPECT_EQ(string("c"), args[1]);
|
||||
EXPECT_EQ(string("c"), args[0]);
|
||||
EXPECT_EQ(string("b"), args[1]);
|
||||
EXPECT_EQ(string("--"), args[2]);
|
||||
EXPECT_EQ(string("d"), args[3]);
|
||||
}
|
||||
@ -463,8 +464,8 @@ TEST(CephArgParse, env_to_vec) {
|
||||
EXPECT_EQ(4u, args.size());
|
||||
EXPECT_EQ(string("a"), args[0]);
|
||||
EXPECT_EQ(string("--"), args[1]);
|
||||
EXPECT_EQ(string("c"), args[2]);
|
||||
EXPECT_EQ(string("d"), args[3]);
|
||||
EXPECT_EQ(string("d"), args[2]);
|
||||
EXPECT_EQ(string("c"), args[3]);
|
||||
}
|
||||
{
|
||||
std::vector<const char*> args;
|
||||
@ -476,8 +477,8 @@ TEST(CephArgParse, env_to_vec) {
|
||||
clear_g_str_vec();
|
||||
env_to_vec(args);
|
||||
EXPECT_EQ(4u, args.size());
|
||||
EXPECT_EQ(string("a"), args[0]);
|
||||
EXPECT_EQ(string("d"), args[1]);
|
||||
EXPECT_EQ(string("d"), args[0]);
|
||||
EXPECT_EQ(string("a"), args[1]);
|
||||
EXPECT_EQ(string("--"), args[2]);
|
||||
EXPECT_EQ(string("c"), args[3]);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user