Skip to content

Commit

Permalink
Add publish field to Scarb.toml to mark package as not publishable …
Browse files Browse the repository at this point in the history
…to the registry (#1421)

Closes #636
  • Loading branch information
DelevoXDG committed Jul 11, 2024
1 parent 0c583b0 commit 7d3c740
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 1 deletion.
2 changes: 2 additions & 0 deletions scarb/src/core/manifest/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ pub struct Manifest {
#[builder(default)]
pub edition: Edition,
#[builder(default)]
pub publish: bool,
#[builder(default)]
pub metadata: ManifestMetadata,
#[builder(default = "ManifestCompilerConfig::default_for_profile(&Profile::DEV)")]
pub compiler_config: ManifestCompilerConfig,
Expand Down
4 changes: 4 additions & 0 deletions scarb/src/core/manifest/toml_manifest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ pub struct TomlPackage {
pub name: PackageName,
pub version: MaybeWorkspaceField<Version>,
pub edition: Option<MaybeWorkspaceField<Edition>>,
pub publish: Option<bool>,
pub authors: Option<MaybeWorkspaceField<Vec<String>>>,
pub urls: Option<BTreeMap<String, String>>,
pub description: Option<MaybeWorkspaceField<String>>,
Expand Down Expand Up @@ -456,6 +457,8 @@ impl TomlManifest {

let targets = self.collect_targets(package.name.to_smol_str(), root)?;

let publish = package.publish.unwrap_or(true);

let summary = Summary::builder()
.package_id(package_id)
.dependencies(dependencies)
Expand Down Expand Up @@ -576,6 +579,7 @@ impl TomlManifest {
let manifest = ManifestBuilder::default()
.summary(summary)
.targets(targets)
.publish(publish)
.edition(edition)
.metadata(metadata)
.compiler_config(compiler_config)
Expand Down
4 changes: 4 additions & 0 deletions scarb/src/core/package/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ impl Package {
self.manifest.targets.iter().any(Target::is_cairo_plugin)
}

pub fn is_publishable(&self) -> bool {
self.manifest.publish
}

pub fn classify(&self) -> PackageClass {
if self.is_cairo_plugin() {
PackageClass::CairoPlugin
Expand Down
13 changes: 12 additions & 1 deletion scarb/src/core/publishing/manifest_normalization.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::collections::BTreeMap;

use anyhow::{bail, Result};
use anyhow::{bail, ensure, Result};
use camino::Utf8PathBuf;
use indoc::formatdoc;

Expand All @@ -14,6 +14,16 @@ use crate::{
};

pub fn prepare_manifest_for_publish(pkg: &Package) -> Result<TomlManifest> {
ensure!(
pkg.is_publishable(),
formatdoc! {
r#"
publishing disabled for package {package_name}
help: set `publish = true` in package manifest
"#,
package_name = pkg.id.name,
}
);
let package = Some(generate_package(pkg));

let dependencies = Some(generate_dependencies(
Expand Down Expand Up @@ -58,6 +68,7 @@ fn generate_package(pkg: &Package) -> Box<TomlPackage> {
name: summary.package_id.name.clone(),
version: MaybeWorkspace::Defined(summary.package_id.version.clone()),
edition: Some(MaybeWorkspace::Defined(pkg.manifest.edition)),
publish: (!pkg.manifest.publish).then_some(false),
authors: metadata.authors.clone().map(MaybeWorkspace::Defined),
urls: metadata.urls.clone(),
description: metadata.description.clone().map(MaybeWorkspace::Defined),
Expand Down
11 changes: 11 additions & 0 deletions scarb/src/ops/publish.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use anyhow::{ensure, Context, Result};
use indoc::formatdoc;
use url::Url;

use scarb_ui::components::Status;
Expand All @@ -17,6 +18,16 @@ pub struct PublishOpts {
#[tracing::instrument(level = "debug", skip(opts, ws))]
pub fn publish(package_id: PackageId, opts: &PublishOpts, ws: &Workspace<'_>) -> Result<()> {
let package = ws.fetch_package(&package_id)?.clone();
ensure!(
package.is_publishable(),
formatdoc! {
r#"
publishing disabled for package {package_id}
help: set `publish = true` in package manifest
"#,
package_id = package_id
}
);

let source_id = SourceId::for_registry(&opts.index_url)?;
let registry_client = RegistrySource::create_client(source_id, ws.config())?;
Expand Down
26 changes: 26 additions & 0 deletions scarb/tests/local_registry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,32 @@ fn publish() {
);
}

#[test]
fn publish_disabled() {
let t = TempDir::new().unwrap();
let index = TempDir::new().unwrap();

ProjectBuilder::start()
.name("foobar")
.version("1.0.0")
.manifest_package_extra("publish = false")
.lib_cairo("fn main() -> felt252 { 0 }")
.build(&t);

Scarb::quick_snapbox()
.arg("publish")
.arg("--no-verify")
.arg("--index")
.arg(Url::from_directory_path(&index).unwrap().to_string())
.current_dir(&t)
.assert()
.failure()
.stdout_matches(indoc! {r#"
error: publishing disabled for package foobar v1.0.0 ([..]Scarb.toml)
help: set `publish = true` in package manifest
"#});
}

#[test]
fn publish_overwrites_existing() {
let index = TempDir::new().unwrap();
Expand Down
23 changes: 23 additions & 0 deletions scarb/tests/package.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1326,3 +1326,26 @@ fn package_without_publish_metadata() {
[..] Packaged [..] files, [..] ([..] compressed)
"#});
}

#[test]
fn package_with_publish_disabled() {
let t = TempDir::new().unwrap();
ProjectBuilder::start()
.name("foo")
.version("1.0.0")
.manifest_package_extra("publish = false")
.build(&t);

Scarb::quick_snapbox()
.arg("package")
.arg("--no-metadata")
.arg("--no-verify")
.current_dir(&t)
.assert()
.failure()
.stdout_matches(indoc! {r#"
[..] Packaging [..]
error: publishing disabled for package foo
help: set `publish = true` in package manifest
"#});
}

0 comments on commit 7d3c740

Please sign in to comment.