Browse Source

Error message for git acquisition

default_compile_flags
vector-of-bool 5 years ago
parent
commit
f75b7f0fa4
4 changed files with 47 additions and 2 deletions
  1. +15
    -0
      docs/err/git-url-ref-mutual-req.rst
  2. +3
    -2
      src/dds.main.cpp
  3. +22
    -0
      src/dds/error/errors.cpp
  4. +7
    -0
      src/dds/error/errors.hpp

+ 15
- 0
docs/err/git-url-ref-mutual-req.rst View File

Error: Git requires both a URL and a ref to clone
#################################################

This error occurs when attempting to add an entry to the package catalog that
uses the ``Git`` acquisition method.

When ``dds`` obtains a package from the catalog using the ``Git`` method, it
needs a URL to clone from, and a Git ref to clone. ``dds`` uses a technique
known as "shallow cloning," which requires a known Git reference to clone from
the reference may be a tag, branch, or an individual commit (Using a Git commit
as the ``ref`` requires support from the remote Git server, and it is often
unavailable in most setups). Using a Git tag is strongly recommended.

.. seealso::
Refer to the documentation on :doc:`/guide/catalog`.

+ 3
- 2
src/dds.main.cpp View File



if (git_url) { if (git_url) {
if (!git_ref) { if (!git_ref) {
throw std::runtime_error(
"`--git-ref` must be specified when using `--git-url`");
dds::throw_user_error<dds::errc::git_url_ref_mutual_req>();
} }
auto git = dds::git_remote_listing{git_url.Get(), git_ref.Get(), std::nullopt}; auto git = dds::git_remote_listing{git_url.Get(), git_ref.Get(), std::nullopt};
if (auto_lib) { if (auto_lib) {
git.auto_lib = lm::split_usage_string(auto_lib.Get()); git.auto_lib = lm::split_usage_string(auto_lib.Get());
} }
info.remote = std::move(git); info.remote = std::move(git);
} else if (git_ref) {
dds::throw_user_error<dds::errc::git_url_ref_mutual_req>();
} }


cat_path.open().store(info); cat_path.open().store(info);

+ 22
- 0
src/dds/error/errors.cpp View File

return "invalid-builtin-toolchain.html"; return "invalid-builtin-toolchain.html";
case errc::no_such_catalog_package: case errc::no_such_catalog_package:
return "no-such-catalog-package.html"; return "no-such-catalog-package.html";
case errc::git_url_ref_mutual_req:
return "git-url-ref-mutual-req.html";
case errc::none: case errc::none:
break; break;
} }
return R"( return R"(
The installation of a package was requested, but the given package ID was not The installation of a package was requested, but the given package ID was not
able to be found in the package catalog. Check the spelling and version number. able to be found in the package catalog. Check the spelling and version number.
)";
case errc::git_url_ref_mutual_req:
return R"(
Creating a Git-based catalog entry requires both a URL to clone from and a Git
reference (tag, branch, commit) to clone.
)"; )";
case errc::none: case errc::none:
break; break;
assert(false && "Unexpected execution path during error explanation. This is a DDS bug"); assert(false && "Unexpected execution path during error explanation. This is a DDS bug");
std::terminate(); std::terminate();
} }

std::string_view dds::default_error_string(dds::errc ec) noexcept {
switch (ec) {
case errc::invalid_builtin_toolchain:
return "The built-in toolchain name is invalid";
case errc::no_such_catalog_package:
return "The catalog has no entry for the given package ID";
case errc::git_url_ref_mutual_req:
return "Git requires both a URL and a ref to clone";
case errc::none:
break;
}
assert(false && "Unexpected execution path during error message creation. This is a DDS bug");
std::terminate();
}

+ 7
- 0
src/dds/error/errors.hpp View File

none = 0, none = 0,
invalid_builtin_toolchain, invalid_builtin_toolchain,
no_such_catalog_package, no_such_catalog_package,
git_url_ref_mutual_req,
}; };


std::string error_reference_of(errc) noexcept; std::string error_reference_of(errc) noexcept;
std::string_view explanation_of(errc) noexcept; std::string_view explanation_of(errc) noexcept;
std::string_view default_error_string(errc) noexcept;


template <errc ErrorCode> template <errc ErrorCode>
struct user_error : user_error_base { struct user_error : user_error_base {
throw user_error<ErrorCode>(fmt::format(fmt_str, std::forward<Args>(args)...)); throw user_error<ErrorCode>(fmt::format(fmt_str, std::forward<Args>(args)...));
} }


template <errc ErrorCode>
[[noreturn]] void throw_user_error() {
throw user_error<ErrorCode>(std::string(default_error_string(ErrorCode)));
}

} // namespace dds } // namespace dds

Loading…
Cancel
Save