Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
[ofl] Ensure all changes are published or marked pre-publish.

Closes #179.
  • Loading branch information
anp committed Oct 25, 2020
1 parent b5c96b8 commit a9d7921
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 11 deletions.
37 changes: 37 additions & 0 deletions ofl/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions ofl/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ anyhow = "1"
cargo_metadata = "0.12.0"
crates-index = "0.16.0"
crossbeam = "0.7.3"
crypto-hash = "0.3.4"
dialoguer = "0.6"
futures = "0.3"
git2 = "0.13.6"
Expand Down
24 changes: 21 additions & 3 deletions ofl/src/published.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,19 +44,20 @@ fn packages_to_publish(workspace: &Workspace) -> Result<Vec<PackageId>, Error> {

let members = workspace.local_members();
let mut to_publish_ids = vec![];
let mut mismatched_checksums = vec![];

for member in members {
let package = &workspace.metadata[&member];
let version_str = package.version.to_string();

let manifest = std::fs::read_to_string(&package.manifest_path)?;
if manifest.contains("publish = false") {
info!({ %package.name }, "skipping `publish = false`");
debug!({ %package.name }, "skipping `publish = false`");
continue;
}

if package.version.is_prerelease() {
info!({ %package.name, %package.version }, "skipping pre-release version");
debug!({ %package.name, %package.version }, "skipping pre-release version");
continue;
}

Expand All @@ -66,14 +67,31 @@ fn packages_to_publish(workspace: &Workspace) -> Result<Vec<PackageId>, Error> {
{ name = %published.name(), version = %published.version() },
"found already-published",
);
// TODO(#179) ensure the checksums match

let current_checksum = workspace.member_checksum(&package.id)?;
if &current_checksum != published.checksum() {
error!({ name = %published.name() }, "checksums don't match crates.io");
error!("consider running `cargo ofl versions` to update its version");
mismatched_checksums.push(package.name.clone());
} else {
info!({ name = %published.name() }, "checksum matches crates.io");
}

continue;
}
}

to_publish_ids.push(member);
}

if !mismatched_checksums.is_empty() {
bail!(
"{} crates' checksums were a mismatch to what's published without updated version \
numbers.",
mismatched_checksums.len()
);
}

let to_publish =
to_publish_ids.iter().map(|id| &workspace.metadata[id].name).collect::<Vec<_>>();

Expand Down
53 changes: 45 additions & 8 deletions ofl/src/workspace.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
use anyhow::{Context, Error};
use anyhow::{bail, Context, Error};
use cargo_metadata::{Metadata, Package, PackageId};
use git2::{ObjectType, Repository, Signature};
use std::{
collections::BTreeMap,
path::Path,
path::{Path, PathBuf},
process::{Command, Output},
};
use tracing::info;
use tracing::{error, info};

pub struct Workspace {
pub project_root: PathBuf,
pub metadata: Metadata,
pub ofl_metadata: Metadata,
pub rustfmt_toolchain: String,
Expand All @@ -17,13 +18,14 @@ pub struct Workspace {

impl Workspace {
pub fn get(project_root: impl AsRef<Path>) -> Result<Self, Error> {
let project_root = project_root.as_ref();
let project_root = project_root.as_ref().to_path_buf();

Ok(Self {
metadata: metadata_for_directory(project_root)?,
ofl_metadata: metadata_for_directory(project_root.join("ofl"))?,
rustfmt_toolchain: rustfmt_toolchain(project_root),
repo: Repository::open(project_root)?,
metadata: metadata_for_directory(&project_root)?,
ofl_metadata: metadata_for_directory(&project_root.join("ofl"))?,
rustfmt_toolchain: rustfmt_toolchain(&project_root),
repo: Repository::open(&project_root)?,
project_root,
})
}

Expand Down Expand Up @@ -74,6 +76,41 @@ impl Workspace {
info!({ %name, %message, %tag }, "created tag");
Ok(())
}

pub fn member_checksum(&self, id: &PackageId) -> Result<Vec<u8>, Error> {
let package = self.get_member(id).unwrap(); // TODO return an error?
info!({ %package.name, %package.version }, "packaging");

let output = std::process::Command::new("cargo")
.arg("package")
.arg("--no-verify")
.arg("--manifest-path")
.arg(&package.manifest_path)
.output()?;

if !output.status.success() {
let stderr = String::from_utf8(output.stderr).context("output as utf8")?;
let stdout = String::from_utf8(output.stdout).context("output as utf8")?;
error!(
"failed to package {}
stderr:
{}
stdout:
{}",
package.manifest_path.display(),
stderr,
stdout,
);
bail!("cargo failure");
}

let filename = format!("{}-{}.crate", package.name, package.version);
// TODO get the actual target directory rather than assuming we know the layout
// TODO(#179) backdate the commit in .cargo_vcs_info.json before checksumming
let crate_file = self.project_root.join("target").join("package").join(filename);
let contents = std::fs::read(crate_file)?;
Ok(crypto_hash::digest(crypto_hash::Algorithm::SHA256, &contents))
}
}

/// Find which rustfmt we should use, falling back to the version in
Expand Down

0 comments on commit a9d7921

Please sign in to comment.