@@ -12,7 +12,7 @@ using namespace fansi::literals; | |||
namespace dds::cli::cmd { | |||
int sdist_create(const options& opts) { | |||
int pkg_create(const options& opts) { | |||
dds::sdist_params params{ | |||
.project_dir = opts.project_dir, | |||
.dest_path = {}, |
@@ -16,6 +16,7 @@ using command = int(const options&); | |||
command build_deps; | |||
command build; | |||
command compile_file; | |||
command pkg_create; | |||
command pkg_get; | |||
command pkg_import; | |||
command pkg_ls; | |||
@@ -29,7 +30,6 @@ command repoman_import; | |||
command repoman_init; | |||
command repoman_ls; | |||
command repoman_remove; | |||
command sdist_create; | |||
} // namespace cmd | |||
@@ -39,20 +39,13 @@ int dispatch_main(const options& opts) noexcept { | |||
switch (opts.subcommand) { | |||
case subcommand::build: | |||
return cmd::build(opts); | |||
case subcommand::sdist: { | |||
DDS_E_SCOPE(opts.sdist.subcommand); | |||
switch (opts.sdist.subcommand) { | |||
case sdist_subcommand::create: | |||
return cmd::sdist_create(opts); | |||
case sdist_subcommand::_none_:; | |||
} | |||
neo::unreachable(); | |||
} | |||
case subcommand::pkg: { | |||
DDS_E_SCOPE(opts.pkg.subcommand); | |||
switch (opts.pkg.subcommand) { | |||
case pkg_subcommand::ls: | |||
return cmd::pkg_ls(opts); | |||
case pkg_subcommand::create: | |||
return cmd::pkg_create(opts); | |||
case pkg_subcommand::get: | |||
return cmd::pkg_get(opts); | |||
case pkg_subcommand::import: |
@@ -144,10 +144,6 @@ struct setup { | |||
.name = "pkg", | |||
.help = "Manage packages and package remotes", | |||
})); | |||
setup_sdist_cmd(group.add_parser({ | |||
.name = "sdist", | |||
.help = "Work with source distribution packages", | |||
})); | |||
setup_repoman_cmd(group.add_parser({ | |||
.name = "repoman", | |||
.help = "Manage a dds package repository", | |||
@@ -236,18 +232,22 @@ struct setup { | |||
.valname = "<pkg-subcommand>", | |||
.action = put_into(opts.pkg.subcommand), | |||
}); | |||
setup_pkg_init_db_cmd(pkg_group.add_parser({ | |||
.name = "init-db", | |||
.help = "Initialize a new package database file (Path specified with '--pkg-db-path')", | |||
})); | |||
pkg_group.add_parser({ | |||
.name = "ls", | |||
.help = "List locally available packages", | |||
}); | |||
setup_pkg_create_cmd(pkg_group.add_parser({ | |||
.name = "create", | |||
.help = "Create a source distribution archive of a project", | |||
})); | |||
setup_pkg_get_cmd(pkg_group.add_parser({ | |||
.name = "get", | |||
.help = "Obtain a copy of a package from a remote", | |||
})); | |||
setup_pkg_init_db_cmd(pkg_group.add_parser({ | |||
.name = "init-db", | |||
.help = "Initialize a new package database file (Path specified with '--pkg-db-path')", | |||
})); | |||
setup_pkg_import_cmd(pkg_group.add_parser({ | |||
.name = "import", | |||
.help = "Import a source distribution archive into the local package cache", | |||
@@ -262,6 +262,16 @@ struct setup { | |||
})); | |||
} | |||
void setup_pkg_create_cmd(argument_parser& pkg_create_cmd) { | |||
pkg_create_cmd.add_argument(project_arg.dup()).help | |||
= "Path to the project for which to create a source distribution.\n" | |||
"Default is the current working directory."; | |||
pkg_create_cmd.add_argument(out_arg.dup()).help | |||
= "Destination path for the source distributioon archive"; | |||
pkg_create_cmd.add_argument(if_exists_arg.dup()).help | |||
= "What to do if the destination names an existing file"; | |||
} | |||
void setup_pkg_get_cmd(argument_parser& pkg_get_cmd) { | |||
pkg_get_cmd.add_argument({ | |||
.valname = "<pkg-id>", | |||
@@ -357,27 +367,6 @@ struct setup { | |||
}); | |||
} | |||
void setup_sdist_cmd(argument_parser& sdist_cmd) noexcept { | |||
auto& sdist_grp = sdist_cmd.add_subparsers({ | |||
.valname = "<sdist-subcommand>", | |||
.action = put_into(opts.sdist.subcommand), | |||
}); | |||
setup_sdist_create_cmd(sdist_grp.add_parser({ | |||
.name = "create", | |||
.help = "Create a source distribution from a project tree", | |||
})); | |||
} | |||
void setup_sdist_create_cmd(argument_parser& sdist_create_cmd) { | |||
sdist_create_cmd.add_argument(project_arg.dup()).help | |||
= "Path to the project for which to create a source distribution.\n" | |||
"Default is the current working directory."; | |||
sdist_create_cmd.add_argument(out_arg.dup()).help | |||
= "Destination path for the source distributnion archive"; | |||
sdist_create_cmd.add_argument(if_exists_arg.dup()).help | |||
= "What to do if the destination names an existing file"; | |||
} | |||
void setup_repoman_cmd(argument_parser& repoman_cmd) { | |||
auto& grp = repoman_cmd.add_subparsers({ | |||
.valname = "<repoman-subcommand>", |
@@ -25,18 +25,9 @@ enum class subcommand { | |||
compile_file, | |||
build_deps, | |||
pkg, | |||
sdist, | |||
repoman, | |||
}; | |||
/** | |||
* @brief 'dds sdist' subcommands | |||
*/ | |||
enum class sdist_subcommand { | |||
_none_, | |||
create, | |||
}; | |||
/** | |||
* @brief 'dds pkg' subcommands | |||
*/ | |||
@@ -44,6 +35,7 @@ enum class pkg_subcommand { | |||
_none_, | |||
ls, | |||
get, | |||
create, | |||
import, | |||
repo, | |||
search, | |||
@@ -225,10 +217,6 @@ struct options { | |||
} search; | |||
} pkg; | |||
struct { | |||
sdist_subcommand subcommand; | |||
} sdist; | |||
/** | |||
* @brief Parameters for 'dds repoman' | |||
*/ |
@@ -81,6 +81,6 @@ def test_empty_with_pkg_json(tmp_project: Project) -> None: | |||
def test_empty_sdist_create(tmp_project: Project) -> None: | |||
tmp_project.package_json = TEST_PACKAGE | |||
tmp_project.sdist_create() | |||
tmp_project.pkg_create() | |||
assert tmp_project.build_root.joinpath('test-pkg@0.2.2.tar.gz').is_file(), \ | |||
'The expected sdist tarball was not generated' |
@@ -11,31 +11,31 @@ from dds_ci.testing import ProjectOpener, Project, error | |||
@pytest.fixture() | |||
def test_project(project_opener: ProjectOpener) -> Project: | |||
return project_opener.open('projects/sdist') | |||
return project_opener.open('projects/simple') | |||
def test_create_sdist(test_project: Project, tmp_path: Path) -> None: | |||
def test_create_pkg(test_project: Project, tmp_path: Path) -> None: | |||
# Create in the default location | |||
test_project.sdist_create() | |||
test_project.pkg_create() | |||
sd_dir = test_project.build_root / 'foo@1.2.3.tar.gz' | |||
assert sd_dir.is_file(), 'Did not create an sdist in the default location' | |||
# Create in a different location | |||
dest = tmp_path / 'dummy.tar.gz' | |||
test_project.sdist_create(dest=dest) | |||
test_project.pkg_create(dest=dest) | |||
assert dest.is_file(), 'Did not create an sdist in the new location' | |||
@pytest.fixture() | |||
def test_sdist(test_project: Project) -> Tuple[Path, Project]: | |||
def _test_pkg(test_project: Project) -> Tuple[Path, Project]: | |||
repo_content_path = test_project.dds.repo_dir / 'foo@1.2.3' | |||
assert not repo_content_path.is_dir() | |||
test_project.sdist_create() | |||
test_project.pkg_create() | |||
assert not repo_content_path.is_dir() | |||
return test_project.build_root / 'foo@1.2.3.tar.gz', test_project | |||
def test_import_sdist_archive(test_sdist: Tuple[Path, Project]) -> None: | |||
sdist, project = test_sdist | |||
def test_import_sdist_archive(_test_pkg: Tuple[Path, Project]) -> None: | |||
sdist, project = _test_pkg | |||
repo_content_path = project.dds.repo_dir / 'foo@1.2.3' | |||
project.dds.pkg_import(sdist) | |||
assert repo_content_path.is_dir(), \ | |||
@@ -47,8 +47,8 @@ def test_import_sdist_archive(test_sdist: Tuple[Path, Project]) -> None: | |||
'Non-package content appeared in the package cache' | |||
def test_import_sdist_stdin(test_sdist: Tuple[Path, Project]) -> None: | |||
sdist, project = test_sdist | |||
def test_import_sdist_stdin(_test_pkg: Tuple[Path, Project]) -> None: | |||
sdist, project = _test_pkg | |||
repo_content_path = project.dds.repo_dir / 'foo@1.2.3' | |||
pipe = subprocess.Popen( | |||
list(proc.flatten_cmd([ | |||
@@ -70,7 +70,6 @@ def test_import_sdist_stdin(test_sdist: Tuple[Path, Project]) -> None: | |||
rc = pipe.wait() | |||
assert rc == 0, 'Subprocess failed' | |||
# project.dds.pkg_import(sdist) | |||
assert repo_content_path.is_dir(), \ | |||
'The package did not appear in the local cache' | |||
assert repo_content_path.joinpath('library.jsonc').is_file(), \ | |||
@@ -82,16 +81,16 @@ def test_import_sdist_stdin(test_sdist: Tuple[Path, Project]) -> None: | |||
def test_sdist_invalid_project(tmp_project: Project) -> None: | |||
with error.expect_error_marker('no-package-json5'): | |||
tmp_project.sdist_create() | |||
tmp_project.pkg_create() | |||
@pytest.mark.skipif(platform.system() != 'Linux', reason='We know this fails on Linux') | |||
def test_sdist_unreadable_dir(dds: DDSWrapper) -> None: | |||
with error.expect_error_marker('failed-package-json5-scan'): | |||
dds.run(['sdist', 'create', '--project=/root']) | |||
dds.run(['pkg', 'create', '--project=/root']) | |||
def test_sdist_invalid_json5(tmp_project: Project) -> None: | |||
tmp_project.write('package.json5', 'bogus json5') | |||
with error.expect_error_marker('package-json5-parse-error'): | |||
tmp_project.sdist_create() | |||
tmp_project.pkg_create() |
@@ -86,10 +86,10 @@ class Project: | |||
with tc_mod.fixup_toolchain(toolchain or tc_mod.get_default_test_toolchain()) as tc: | |||
self.dds.compile_file(paths, toolchain=tc, out=self.build_root, project_dir=self.root) | |||
def sdist_create(self, *, dest: Optional[Pathish] = None) -> None: | |||
def pkg_create(self, *, dest: Optional[Pathish] = None) -> None: | |||
self.build_root.mkdir(exist_ok=True, parents=True) | |||
self.dds.run([ | |||
'sdist', | |||
'pkg', | |||
'create', | |||
self.project_dir_arg, | |||
f'--out={dest}' if dest else (), |
@@ -371,7 +371,7 @@ def http_dl_unpack(url: str) -> Iterator[Path]: | |||
def spec_as_local_tgz(dds_exe: Path, spec: SpecPackage) -> Iterator[Path]: | |||
with spec.remote.make_local_dir(spec.name, spec.version) as clone_dir: | |||
out_tgz = clone_dir / 'sdist.tgz' | |||
check_call([str(dds_exe), 'sdist', 'create', f'--project={clone_dir}', f'--out={out_tgz}']) | |||
check_call([str(dds_exe), 'pkg', 'create', f'--project={clone_dir}', f'--out={out_tgz}']) | |||
yield out_tgz | |||