Skip to main content

cargo/ops/
mod.rs

1use crate::sources::CRATES_IO_DOMAIN;
2
3pub use self::cargo_clean::{CleanContext, CleanOptions, clean};
4pub use self::cargo_compile::unit_generator::UnitGenerator;
5pub use self::cargo_compile::{CompileFilter, FilterRule, LibRule, Packages};
6pub use self::cargo_compile::{
7    CompileOptions, compile, compile_with_exec, create_bcx, print, resolve_all_features,
8};
9pub use self::cargo_doc::{DocOptions, OutputFormat, doc};
10pub use self::cargo_fetch::{FetchOptions, fetch};
11pub use self::cargo_fix::{
12    EditionFixMode, FixOptions, fix, fix_edition, fix_exec_rustc, fix_get_proxy_lock_addr,
13};
14pub use self::cargo_install::{install, install_list};
15pub use self::cargo_metadata::{ExportInfo, OutputMetadataOptions, output_metadata};
16pub use self::cargo_new::{NewOptions, NewProjectKind, VersionControl, init, new};
17pub use self::cargo_package::PackageMessageFormat;
18pub use self::cargo_package::PackageOpts;
19pub use self::cargo_package::check_yanked;
20pub use self::cargo_package::package;
21pub use self::cargo_pkgid::pkgid;
22pub use self::cargo_read_manifest::read_package;
23pub use self::cargo_report::rebuilds::ReportRebuildsOptions;
24pub use self::cargo_report::rebuilds::report_rebuilds;
25pub use self::cargo_report::sessions::ReportSessionsOptions;
26pub use self::cargo_report::sessions::report_sessions;
27pub use self::cargo_report::timings::ReportTimingsOptions;
28pub use self::cargo_report::timings::report_timings;
29pub use self::cargo_run::run;
30pub use self::cargo_test::{TestOptions, run_benches, run_tests};
31pub use self::cargo_uninstall::uninstall;
32pub use self::cargo_update::UpdateOptions;
33pub use self::cargo_update::generate_lockfile;
34pub use self::cargo_update::print_lockfile_changes;
35pub use self::cargo_update::update_lockfile;
36pub use self::cargo_update::upgrade_manifests;
37pub use self::cargo_update::write_manifest_upgrades;
38pub use self::cargo_vendor::{VendorOptions, vendor};
39pub use self::common_for_install_and_uninstall::{InstallTracker, resolve_root};
40pub use self::lockfile::{load_pkg_lockfile, resolve_to_string, write_pkg_lockfile};
41pub use self::registry::OwnersOptions;
42pub use self::registry::PublishOpts;
43pub use self::registry::RegistryCredentialConfig;
44pub use self::registry::RegistryOrIndex;
45pub use self::registry::info;
46pub use self::registry::modify_owners;
47pub use self::registry::publish;
48pub use self::registry::registry_login;
49pub use self::registry::registry_logout;
50pub use self::registry::search;
51pub use self::registry::yank;
52pub use self::resolve::{
53    WorkspaceResolve, add_overrides, get_resolved_packages, resolve_with_previous, resolve_ws,
54    resolve_ws_with_opts,
55};
56
57pub mod cargo_add;
58mod cargo_clean;
59pub(crate) mod cargo_compile;
60pub mod cargo_config;
61mod cargo_doc;
62mod cargo_fetch;
63mod cargo_fix;
64mod cargo_install;
65mod cargo_metadata;
66mod cargo_new;
67mod cargo_package;
68mod cargo_pkgid;
69mod cargo_read_manifest;
70pub mod cargo_remove;
71pub(crate) mod cargo_report;
72mod cargo_run;
73mod cargo_test;
74pub mod cargo_tree;
75mod cargo_uninstall;
76mod cargo_update;
77mod cargo_vendor;
78mod common_for_install_and_uninstall;
79pub(crate) mod lockfile;
80pub(crate) mod registry;
81pub(crate) mod resolve;
82
83/// Returns true if the dependency is either git or path, false otherwise
84/// Error if a git/path dep is transitive, but has no version (registry source).
85/// This check is performed on dependencies before publishing or packaging
86fn check_dep_has_version(
87    dep: &crate::workspace::Dependency,
88    publish: bool,
89) -> crate::CargoResult<bool> {
90    let which = if dep.source_id().is_path() {
91        "path"
92    } else if dep.source_id().is_git() {
93        "git"
94    } else {
95        return Ok(false);
96    };
97
98    if !dep.specified_req() && dep.is_transitive() {
99        let dep_version_source = dep.registry_id().map_or_else(
100            || CRATES_IO_DOMAIN.to_string(),
101            |registry_id| registry_id.display_registry_name(),
102        );
103        anyhow::bail!(
104            "all dependencies must have a version requirement specified when {}.\n\
105             dependency `{}` does not specify a version\n\
106             Note: The {} dependency will use the version from {},\n\
107             the `{}` specification will be removed from the dependency declaration.",
108            if publish { "publishing" } else { "packaging" },
109            dep.package_name(),
110            if publish { "published" } else { "packaged" },
111            dep_version_source,
112            which,
113        )
114    }
115    Ok(true)
116}