Unverified Commit 4a8da5f7 authored by John DiSanti's avatar John DiSanti Committed by GitHub
Browse files

Fix issues with setting crate ownership during publish (#1454)

parent 8e84ee2e
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -26,7 +26,15 @@ mod subcommand;
pub const SDK_REPO_CRATE_PATH: &str = "sdk";
pub const SDK_REPO_NAME: &str = "aws-sdk-rust";
pub const SMITHYRS_REPO_NAME: &str = "smithy-rs";
pub const CRATE_OWNER: &str = "github:awslabs:rust-sdk-owners";

// Crate ownership for SDK crates. Crates.io requires that at least one owner
// is an individual rather than a team, so we use the automation user for that.
pub const CRATE_OWNERS: &[&str] = &[
    // https://github.com/orgs/awslabs/teams/rust-sdk-owners
    "github:awslabs:rust-sdk-owners",
    // https://github.com/aws-sdk-rust-ci
    "aws-sdk-rust-ci",
];

#[derive(Parser, Debug)]
#[clap(author, version, about)]
+30 −16
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@ use crate::package::{
};
use crate::repo::{resolve_publish_location, Repository};
use crate::retry::{run_with_retry, BoxError, ErrorClass};
use crate::CRATE_OWNER;
use crate::CRATE_OWNERS;
use crate::{cargo, SDK_REPO_NAME};
use anyhow::{bail, Context, Result};
use clap::Parser;
@@ -195,8 +195,25 @@ async fn correct_owner(package: &Package) -> Result<()> {
        Duration::from_secs(5),
        || async {
            let owners = cargo::GetOwners::new(&package.handle.name).spawn().await?;
            let incorrect_owners = owners.iter().filter(|&owner| owner != CRATE_OWNER);
            let mut added_individual = false;
            for &crate_owner in CRATE_OWNERS {
                if !owners.iter().any(|owner| owner == crate_owner) {
                    cargo::AddOwner::new(&package.handle.name, crate_owner)
                        .spawn()
                        .await?;
                    info!("Added `{}` as owner of `{}`", crate_owner, package.handle);
                    // Teams in crates.io start with `github:` while individuals are just the GitHub user name
                    added_individual |= !crate_owner.starts_with("github:");
                }
            }
            let incorrect_owners = owners
                .iter()
                .filter(|&owner| !CRATE_OWNERS.iter().any(|o| o == owner));
            for incorrect_owner in incorrect_owners {
                // Adding an individual owner requires accepting an invite, so don't attempt to remove
                // anyone if an owner was added, as removing the last individual owner may break.
                // The next publish run will remove the incorrect owner.
                if !added_individual {
                    cargo::RemoveOwner::new(&package.handle.name, incorrect_owner)
                        .spawn()
                        .await
@@ -205,12 +222,9 @@ async fn correct_owner(package: &Package) -> Result<()> {
                        "Removed incorrect owner `{}` from crate `{}`",
                        incorrect_owner, package.handle
                    );
                } else {
                    info!("Skipping removal of incorrect owner `{}` from crate `{}` due to new owners", incorrect_owner, package.handle);
                }
            if !owners.iter().any(|owner| owner == CRATE_OWNER) {
                cargo::AddOwner::new(&package.handle.name, CRATE_OWNER)
                    .spawn()
                    .await?;
                info!("Corrected crate ownership of `{}`", package.handle);
            }
            Result::<_, BoxError>::Ok(())
        },