blob: 2856c4a6699740c8cb7010205a2acab9a1c7f094 [file] [edit]
use crate::sources::CRATES_IO_DOMAIN;
pub use self::cargo_clean::{CleanContext, CleanOptions, clean};
pub use self::cargo_compile::unit_generator::UnitGenerator;
pub use self::cargo_compile::{CompileFilter, FilterRule, LibRule, Packages};
pub use self::cargo_compile::{
CompileOptions, compile, compile_with_exec, create_bcx, print, resolve_all_features,
};
pub use self::cargo_doc::{DocOptions, OutputFormat, doc};
pub use self::cargo_fetch::{FetchOptions, fetch};
pub use self::cargo_fix::{
EditionFixMode, FixOptions, fix, fix_edition, fix_exec_rustc, fix_get_proxy_lock_addr,
};
pub use self::cargo_install::{install, install_list};
pub use self::cargo_metadata::{ExportInfo, OutputMetadataOptions, output_metadata};
pub use self::cargo_new::{NewOptions, NewProjectKind, VersionControl, init, new};
pub use self::cargo_package::PackageMessageFormat;
pub use self::cargo_package::PackageOpts;
pub use self::cargo_package::check_yanked;
pub use self::cargo_package::package;
pub use self::cargo_pkgid::pkgid;
pub use self::cargo_read_manifest::read_package;
pub use self::cargo_report::rebuilds::ReportRebuildsOptions;
pub use self::cargo_report::rebuilds::report_rebuilds;
pub use self::cargo_report::sessions::ReportSessionsOptions;
pub use self::cargo_report::sessions::report_sessions;
pub use self::cargo_report::timings::ReportTimingsOptions;
pub use self::cargo_report::timings::report_timings;
pub use self::cargo_run::run;
pub use self::cargo_test::{TestOptions, run_benches, run_tests};
pub use self::cargo_uninstall::uninstall;
pub use self::cargo_update::UpdateOptions;
pub use self::cargo_update::generate_lockfile;
pub use self::cargo_update::print_lockfile_changes;
pub use self::cargo_update::update_lockfile;
pub use self::cargo_update::upgrade_manifests;
pub use self::cargo_update::write_manifest_upgrades;
pub use self::cargo_vendor::{VendorOptions, vendor};
pub use self::common_for_install_and_uninstall::{InstallTracker, resolve_root};
pub use self::lockfile::{load_pkg_lockfile, resolve_to_string, write_pkg_lockfile};
pub use self::registry::OwnersOptions;
pub use self::registry::PublishOpts;
pub use self::registry::RegistryCredentialConfig;
pub use self::registry::RegistryOrIndex;
pub use self::registry::info;
pub use self::registry::modify_owners;
pub use self::registry::publish;
pub use self::registry::registry_login;
pub use self::registry::registry_logout;
pub use self::registry::search;
pub use self::registry::yank;
pub use self::resolve::{
WorkspaceResolve, add_overrides, get_resolved_packages, resolve_with_previous, resolve_ws,
resolve_ws_with_opts,
};
pub mod cargo_add;
mod cargo_clean;
pub(crate) mod cargo_compile;
pub mod cargo_config;
mod cargo_doc;
mod cargo_fetch;
mod cargo_fix;
mod cargo_install;
mod cargo_metadata;
mod cargo_new;
mod cargo_package;
mod cargo_pkgid;
mod cargo_read_manifest;
pub mod cargo_remove;
pub(crate) mod cargo_report;
mod cargo_run;
mod cargo_test;
pub mod cargo_tree;
mod cargo_uninstall;
mod cargo_update;
mod cargo_vendor;
mod common_for_install_and_uninstall;
pub(crate) mod lockfile;
pub(crate) mod registry;
pub(crate) mod resolve;
/// Returns true if the dependency is either git or path, false otherwise
/// Error if a git/path dep is transitive, but has no version (registry source).
/// This check is performed on dependencies before publishing or packaging
fn check_dep_has_version(
dep: &crate::workspace::Dependency,
publish: bool,
) -> crate::CargoResult<bool> {
let which = if dep.source_id().is_path() {
"path"
} else if dep.source_id().is_git() {
"git"
} else {
return Ok(false);
};
if !dep.specified_req() && dep.is_transitive() {
let dep_version_source = dep.registry_id().map_or_else(
|| CRATES_IO_DOMAIN.to_string(),
|registry_id| registry_id.display_registry_name(),
);
anyhow::bail!(
"all dependencies must have a version requirement specified when {}.\n\
dependency `{}` does not specify a version\n\
Note: The {} dependency will use the version from {},\n\
the `{}` specification will be removed from the dependency declaration.",
if publish { "publishing" } else { "packaging" },
dep.package_name(),
if publish { "published" } else { "packaged" },
dep_version_source,
which,
)
}
Ok(true)
}