Skip to content

Commit f58aa3b

Browse files
committed
Auto merge of #14368 - epage:beta-vendor, r=weihanglo
[beta-1.81] fix(vendor): Strip excluded build targets Beta backports * #14367 In order to make CI pass, the following PRs are also cherry-picked: * Ignore `build_std::basic` test (see also #14366) * 830db6f (#14341, see also #14366)
2 parents ca2346b + 78651cd commit f58aa3b

File tree

5 files changed

+697
-18
lines changed

5 files changed

+697
-18
lines changed

src/cargo/ops/vendor.rs

Lines changed: 118 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ fn sync(
221221
let pathsource = PathSource::new(src, id.source_id(), gctx);
222222
let paths = pathsource.list_files(pkg)?;
223223
let mut map = BTreeMap::new();
224-
cp_sources(pkg, src, &paths, &dst, &mut map, &mut tmp_buf)
224+
cp_sources(pkg, src, &paths, &dst, &mut map, &mut tmp_buf, gctx)
225225
.with_context(|| format!("failed to copy over vendored sources for: {}", id))?;
226226

227227
// Finally, emit the metadata about this package
@@ -317,6 +317,7 @@ fn cp_sources(
317317
dst: &Path,
318318
cksums: &mut BTreeMap<String, String>,
319319
tmp_buf: &mut [u8],
320+
gctx: &GlobalContext,
320321
) -> CargoResult<()> {
321322
for p in paths {
322323
let relative = p.strip_prefix(&src).unwrap();
@@ -360,7 +361,12 @@ fn cp_sources(
360361
let cksum = if dst.file_name() == Some(OsStr::new("Cargo.toml"))
361362
&& pkg.package_id().source_id().is_git()
362363
{
363-
let contents = pkg.manifest().to_resolved_contents()?;
364+
let packaged_files = paths
365+
.iter()
366+
.map(|p| p.strip_prefix(src).unwrap().to_owned())
367+
.collect::<Vec<_>>();
368+
let vendored_pkg = prepare_for_vendor(pkg, &packaged_files, gctx)?;
369+
let contents = vendored_pkg.manifest().to_resolved_contents()?;
364370
copy_and_checksum(
365371
&dst,
366372
&mut dst_opts,
@@ -392,6 +398,116 @@ fn cp_sources(
392398
Ok(())
393399
}
394400

401+
/// HACK: Perform the bare minimum of `prepare_for_publish` needed for #14348.
402+
///
403+
/// There are parts of `prepare_for_publish` that could be directly useful (e.g. stripping
404+
/// `[workspace]`) while other parts that require other filesystem operations (moving the README
405+
/// file) and ideally we'd reuse `cargo package` code to take care of all of this for us.
406+
fn prepare_for_vendor(
407+
me: &Package,
408+
packaged_files: &[PathBuf],
409+
gctx: &GlobalContext,
410+
) -> CargoResult<Package> {
411+
let contents = me.manifest().contents();
412+
let document = me.manifest().document();
413+
let original_toml =
414+
prepare_toml_for_vendor(me.manifest().resolved_toml().clone(), packaged_files, gctx)?;
415+
let normalized_toml = original_toml.clone();
416+
let features = me.manifest().unstable_features().clone();
417+
let workspace_config = me.manifest().workspace_config().clone();
418+
let source_id = me.package_id().source_id();
419+
let mut warnings = Default::default();
420+
let mut errors = Default::default();
421+
let manifest = crate::util::toml::to_real_manifest(
422+
contents.to_owned(),
423+
document.clone(),
424+
original_toml,
425+
normalized_toml,
426+
features,
427+
workspace_config,
428+
source_id,
429+
me.manifest_path(),
430+
gctx,
431+
&mut warnings,
432+
&mut errors,
433+
)?;
434+
let new_pkg = Package::new(manifest, me.manifest_path());
435+
Ok(new_pkg)
436+
}
437+
438+
fn prepare_toml_for_vendor(
439+
mut me: cargo_util_schemas::manifest::TomlManifest,
440+
packaged_files: &[PathBuf],
441+
gctx: &GlobalContext,
442+
) -> CargoResult<cargo_util_schemas::manifest::TomlManifest> {
443+
let package = me
444+
.package
445+
.as_mut()
446+
.expect("venedored manifests must have packages");
447+
if let Some(cargo_util_schemas::manifest::StringOrBool::String(path)) = &package.build {
448+
let path = paths::normalize_path(Path::new(path));
449+
let included = packaged_files.contains(&path);
450+
let build = if included {
451+
let path = path
452+
.into_os_string()
453+
.into_string()
454+
.map_err(|_err| anyhow::format_err!("non-UTF8 `package.build`"))?;
455+
let path = crate::util::toml::normalize_path_string_sep(path);
456+
cargo_util_schemas::manifest::StringOrBool::String(path)
457+
} else {
458+
gctx.shell().warn(format!(
459+
"ignoring `package.build` as `{}` is not included in the published package",
460+
path.display()
461+
))?;
462+
cargo_util_schemas::manifest::StringOrBool::Bool(false)
463+
};
464+
package.build = Some(build);
465+
}
466+
467+
let lib = if let Some(target) = &me.lib {
468+
crate::util::toml::prepare_target_for_publish(
469+
target,
470+
Some(packaged_files),
471+
"library",
472+
gctx,
473+
)?
474+
} else {
475+
None
476+
};
477+
let bin = crate::util::toml::prepare_targets_for_publish(
478+
me.bin.as_ref(),
479+
Some(packaged_files),
480+
"binary",
481+
gctx,
482+
)?;
483+
let example = crate::util::toml::prepare_targets_for_publish(
484+
me.example.as_ref(),
485+
Some(packaged_files),
486+
"example",
487+
gctx,
488+
)?;
489+
let test = crate::util::toml::prepare_targets_for_publish(
490+
me.test.as_ref(),
491+
Some(packaged_files),
492+
"test",
493+
gctx,
494+
)?;
495+
let bench = crate::util::toml::prepare_targets_for_publish(
496+
me.bench.as_ref(),
497+
Some(packaged_files),
498+
"benchmark",
499+
gctx,
500+
)?;
501+
502+
me.lib = lib;
503+
me.bin = bin;
504+
me.example = example;
505+
me.test = test;
506+
me.bench = bench;
507+
508+
Ok(me)
509+
}
510+
395511
fn copy_and_checksum<T: Read>(
396512
dst_path: &Path,
397513
dst_opts: &mut OpenOptions,

src/cargo/util/toml/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,7 +1107,7 @@ fn deprecated_ws_default_features(
11071107
}
11081108

11091109
#[tracing::instrument(skip_all)]
1110-
fn to_real_manifest(
1110+
pub fn to_real_manifest(
11111111
contents: String,
11121112
document: toml_edit::ImDocument<String>,
11131113
original_toml: manifest::TomlManifest,
@@ -2897,7 +2897,7 @@ fn prepare_toml_for_publish(
28972897
}
28982898
}
28992899

2900-
fn prepare_targets_for_publish(
2900+
pub fn prepare_targets_for_publish(
29012901
targets: Option<&Vec<manifest::TomlTarget>>,
29022902
included: Option<&[PathBuf]>,
29032903
context: &str,
@@ -2922,7 +2922,7 @@ fn prepare_targets_for_publish(
29222922
}
29232923
}
29242924

2925-
fn prepare_target_for_publish(
2925+
pub fn prepare_target_for_publish(
29262926
target: &manifest::TomlTarget,
29272927
included: Option<&[PathBuf]>,
29282928
context: &str,
@@ -2957,7 +2957,7 @@ fn normalize_path_sep(path: PathBuf, context: &str) -> CargoResult<PathBuf> {
29572957
Ok(path.into())
29582958
}
29592959

2960-
fn normalize_path_string_sep(path: String) -> String {
2960+
pub fn normalize_path_string_sep(path: String) -> String {
29612961
if std::path::MAIN_SEPARATOR != '/' {
29622962
path.replace(std::path::MAIN_SEPARATOR, "/")
29632963
} else {

tests/build-std/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ impl BuildStd for Execs {
6262
}
6363
}
6464

65+
#[allow(unused_attributes)]
66+
#[ignore = "to unblock beta-1.81 backport"]
6567
#[cargo_test(build_std_real)]
6668
fn basic() {
6769
let p = project()

tests/testsuite/check.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,7 @@ fn short_message_format() {
820820
.with_status(101)
821821
.with_stderr_data(str![[r#"
822822
[CHECKING] foo v0.0.1 ([ROOT]/foo)
823-
src/lib.rs:1:27: error[E0308]: mismatched types
823+
src/lib.rs:1:27: error[E0308]: mismatched types[..]
824824
[ERROR] could not compile `foo` (lib) due to 1 previous error
825825
826826
"#]])

0 commit comments

Comments
 (0)