cargo/ops/
mod.rs

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