Переглянути джерело

Subcommand-ize `sdist`

default_compile_flags
vector-of-bool 5 роки тому
джерело
коміт
397353ed6b
1 змінених файлів з 66 додано та 22 видалено
  1. +66
    -22
      src/dds/ddslim.main.cpp

+ 66
- 22
src/dds/ddslim.main.cpp Переглянути файл

@@ -188,40 +188,84 @@ struct cli_repo {

struct cli_sdist {
cli_base& base;
args::Command cmd{base.cmd_group, "sdist", "Create a source distribution of a project"};
args::Command cmd{base.cmd_group, "sdist", "Work with source distributions"};

common_flags _common{cmd};

common_project_flags project{cmd};

path_flag out{cmd,
"out",
"The full destination of the source distribution",
{"out"},
dds::fs::current_path() / "project.dsd"};
args::Group sdist_group{cmd, "`sdist` commands"};

args::Flag force{cmd, "force", "Forcibly replace an existing result", {"force"}};
args::Flag export_{cmd,
"export",
"Export the result into the local repository",
{'E', "export"}};
repo_where_flag repo_where{cmd};
struct {
cli_sdist& parent;
args::Command cmd{parent.sdist_group, "create", "Create a source distribution"};

int run() {
dds::sdist_params params;
params.project_dir = project.root.Get();
params.dest_path = out.Get();
params.force = force.Get();
auto sdist = dds::create_sdist(params);
if (export_.Get()) {
path_flag out{cmd,
"out",
"The destination of the source distribution",
{"out"},
dds::fs::current_path() / "project.dsd"};

args::Flag force{cmd,
"replace-if-exists",
"Forcibly replace an existing distribution",
{"replace"}};

int run() {
dds::sdist_params params;
params.project_dir = parent.project.root.Get();
params.dest_path = out.Get();
params.force = force.Get();
dds::create_sdist(params);
return 0;
}
} create{*this};

struct {
cli_sdist& parent;
args::Command cmd{parent.sdist_group,
"export",
"Export a source distribution to a repository"};

repo_where_flag repo_where{cmd};
args::Flag force{cmd,
"replace-if-exists",
"Replace an existing export in the repository",
{"replace"}};

int run() {
auto repo_dir = repo_where.Get();
// TODO: Generate a unique name to avoid conflicts
auto tmp_sdist = repo_dir / ".tmp.sdist";
if (dds::fs::exists(tmp_sdist)) {
dds::fs::remove_all(tmp_sdist);
}
dds::sdist_params params;
params.project_dir = parent.project.root.Get();
params.dest_path = tmp_sdist;
params.force = true;
auto sdist = dds::create_sdist(params);
dds::repository::with_repository( //
repo_where.Get(),
repo_dir,
dds::repo_flags::create_if_absent | dds::repo_flags::write_lock,
[&](dds::repository repo) { //
repo.add_sdist(sdist);
repo.add_sdist(sdist,
force.Get() ? dds::if_exists::replace
: dds::if_exists::throw_exc);
});
return 0;
}
} export_{*this};

int run() {
if (create.cmd) {
return create.run();
} else if (export_.cmd) {
return export_.run();
} else {
assert(false && "Unreachable");
std::terminate();
}
return 0;
}
};


Завантаження…
Відмінити
Зберегти