Skip to content

Commit

Permalink
Auto merge of #14328 - epage:14321-cherry-pick, r=weihanglo
Browse files Browse the repository at this point in the history
[beta-1.81] fix(publish): Don't strip non-dev features

Beta backports

* #14325

In order to make CI pass, the following PRs are also cherry-picked:

* #14282 363ddd4
  • Loading branch information
bors committed Jul 31, 2024
2 parents a2b58c3 + 25ecfce commit ca2346b
Show file tree
Hide file tree
Showing 6 changed files with 114 additions and 155 deletions.
2 changes: 1 addition & 1 deletion src/cargo/ops/cargo_package.rs
Original file line number Diff line number Diff line change
Expand Up @@ -732,7 +732,7 @@ fn tar(
.iter()
.map(|ar_file| ar_file.rel_path.clone())
.collect::<Vec<_>>();
let publish_pkg = prepare_for_publish(pkg, ws, &included)?;
let publish_pkg = prepare_for_publish(pkg, ws, Some(&included))?;

let mut uncompressed_size = 0;
for ar_file in ar_files {
Expand Down
57 changes: 21 additions & 36 deletions src/cargo/ops/registry/publish.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
//! [1]: https://doc.rust-lang.org/nightly/cargo/reference/registry-web-api.html#publish

use std::collections::BTreeMap;
use std::collections::BTreeSet;
use std::collections::HashSet;
use std::fs::File;
use std::time::Duration;
Expand All @@ -21,7 +20,6 @@ use crate::core::dependency::DepKind;
use crate::core::manifest::ManifestMetadata;
use crate::core::resolver::CliFeatures;
use crate::core::Dependency;
use crate::core::FeatureValue;
use crate::core::Package;
use crate::core::PackageIdSpecQuery;
use crate::core::SourceId;
Expand All @@ -35,7 +33,7 @@ use crate::sources::CRATES_IO_REGISTRY;
use crate::util::auth;
use crate::util::cache_lock::CacheLockMode;
use crate::util::context::JobsConfig;
use crate::util::interning::InternedString;
use crate::util::toml::prepare_for_publish;
use crate::util::Progress;
use crate::util::ProgressStyle;
use crate::CargoResult;
Expand Down Expand Up @@ -184,6 +182,7 @@ pub fn publish(ws: &Workspace<'_>, opts: &PublishOpts<'_>) -> CargoResult<()> {
.status("Uploading", pkg.package_id().to_string())?;
transmit(
opts.gctx,
ws,
pkg,
tarball.file(),
&mut registry,
Expand Down Expand Up @@ -323,19 +322,19 @@ fn verify_dependencies(

fn transmit(
gctx: &GlobalContext,
pkg: &Package,
ws: &Workspace<'_>,
local_pkg: &Package,
tarball: &File,
registry: &mut Registry,
registry_id: SourceId,
dry_run: bool,
) -> CargoResult<()> {
let deps = pkg
let included = None; // don't filter build-targets
let publish_pkg = prepare_for_publish(local_pkg, ws, included)?;

let deps = publish_pkg
.dependencies()
.iter()
.filter(|dep| {
// Skip dev-dependency without version.
dep.is_transitive() || dep.specified_req()
})
.map(|dep| {
// If the dependency is from a different registry, then include the
// registry in the dependency.
Expand Down Expand Up @@ -380,7 +379,7 @@ fn transmit(
})
})
.collect::<CargoResult<Vec<NewCrateDependency>>>()?;
let manifest = pkg.manifest();
let manifest = publish_pkg.manifest();
let ManifestMetadata {
ref authors,
ref description,
Expand All @@ -397,15 +396,19 @@ fn transmit(
ref rust_version,
} = *manifest.metadata();
let rust_version = rust_version.as_ref().map(ToString::to_string);
let readme_content = readme
let readme_content = local_pkg
.manifest()
.metadata()
.readme
.as_ref()
.map(|readme| {
paths::read(&pkg.root().join(readme))
.with_context(|| format!("failed to read `readme` file for package `{}`", pkg))
paths::read(&local_pkg.root().join(readme)).with_context(|| {
format!("failed to read `readme` file for package `{}`", local_pkg)
})
})
.transpose()?;
if let Some(ref file) = *license_file {
if !pkg.root().join(file).exists() {
if let Some(ref file) = local_pkg.manifest().metadata().license_file {
if !local_pkg.root().join(file).exists() {
bail!("the license file `{}` does not exist", file)
}
}
Expand All @@ -416,31 +419,13 @@ fn transmit(
return Ok(());
}

let deps_set = deps
.iter()
.map(|dep| dep.name.clone())
.collect::<BTreeSet<String>>();

let string_features = match manifest.resolved_toml().features() {
Some(features) => features
.iter()
.map(|(feat, values)| {
(
feat.to_string(),
values
.iter()
.filter(|fv| {
let feature_value = FeatureValue::new(InternedString::new(fv));
match feature_value {
FeatureValue::Dep { dep_name }
| FeatureValue::DepFeature { dep_name, .. } => {
deps_set.contains(&dep_name.to_string())
}
_ => true,
}
})
.map(|fv| fv.to_string())
.collect(),
values.iter().map(|fv| fv.to_string()).collect(),
)
})
.collect::<BTreeMap<String, Vec<String>>>(),
Expand All @@ -450,8 +435,8 @@ fn transmit(
let warnings = registry
.publish(
&NewCrate {
name: pkg.name().to_string(),
vers: pkg.version().to_string(),
name: local_pkg.name().to_string(),
vers: local_pkg.version().to_string(),
deps,
features: string_features,
authors: authors.clone(),
Expand Down
27 changes: 15 additions & 12 deletions src/cargo/util/toml/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2575,7 +2575,7 @@ fn unused_dep_keys(
pub fn prepare_for_publish(
me: &Package,
ws: &Workspace<'_>,
included: &[PathBuf],
included: Option<&[PathBuf]>,
) -> CargoResult<Package> {
let contents = me.manifest().contents();
let document = me.manifest().document();
Expand Down Expand Up @@ -2612,7 +2612,7 @@ fn prepare_toml_for_publish(
me: &manifest::TomlManifest,
ws: &Workspace<'_>,
package_root: &Path,
included: &[PathBuf],
included: Option<&[PathBuf]>,
) -> CargoResult<manifest::TomlManifest> {
let gctx = ws.gctx();

Expand All @@ -2629,7 +2629,8 @@ fn prepare_toml_for_publish(
package.workspace = None;
if let Some(StringOrBool::String(path)) = &package.build {
let path = paths::normalize_path(Path::new(path));
let build = if included.contains(&path) {
let included = included.map(|i| i.contains(&path)).unwrap_or(true);
let build = if included {
let path = path
.into_os_string()
.into_string()
Expand Down Expand Up @@ -2898,7 +2899,7 @@ fn prepare_toml_for_publish(

fn prepare_targets_for_publish(
targets: Option<&Vec<manifest::TomlTarget>>,
included: &[PathBuf],
included: Option<&[PathBuf]>,
context: &str,
gctx: &GlobalContext,
) -> CargoResult<Option<Vec<manifest::TomlTarget>>> {
Expand All @@ -2923,19 +2924,21 @@ fn prepare_targets_for_publish(

fn prepare_target_for_publish(
target: &manifest::TomlTarget,
included: &[PathBuf],
included: Option<&[PathBuf]>,
context: &str,
gctx: &GlobalContext,
) -> CargoResult<Option<manifest::TomlTarget>> {
let path = target.path.as_ref().expect("previously resolved");
let path = normalize_path(&path.0);
if !included.contains(&path) {
let name = target.name.as_ref().expect("previously resolved");
gctx.shell().warn(format!(
"ignoring {context} `{name}` as `{}` is not included in the published package",
path.display()
))?;
return Ok(None);
if let Some(included) = included {
if !included.contains(&path) {
let name = target.name.as_ref().expect("previously resolved");
gctx.shell().warn(format!(
"ignoring {context} `{name}` as `{}` is not included in the published package",
path.display()
))?;
return Ok(None);
}
}

let mut target = target.clone();
Expand Down
4 changes: 2 additions & 2 deletions tests/testsuite/inheritable_workspace_fields.rs
Original file line number Diff line number Diff line change
Expand Up @@ -752,11 +752,11 @@ You may press ctrl-c to skip waiting; the crate should be available shortly.
"homepage": "https://www.rust-lang.org",
"keywords": ["cli"],
"license": "MIT",
"license_file": "../LICENSE",
"license_file": "LICENSE",
"links": null,
"name": "bar",
"readme": "README.md",
"readme_file": "../README.md",
"readme_file": "README.md",
"repository": "https://github.com/example/example",
"rust_version": "1.60",
"vers": "1.2.3"
Expand Down
2 changes: 1 addition & 1 deletion tests/testsuite/lints/implicit_features.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ unused_optional_dependency = "allow"
.masquerade_as_nightly_cargo(&["cargo-lints", "edition2024"])
.with_stderr_data(str![[r#"
[UPDATING] `dummy-registry` index
[LOCKING] 2 packages to latest Rust 1.81.0-nightly compatible versions
[LOCKING] 2 packages to latest Rust [..] compatible versions
[CHECKING] foo v0.1.0 ([ROOT]/foo)
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
Expand Down
Loading

0 comments on commit ca2346b

Please sign in to comment.