add and recommend script for reserving new package names on crates.io (#31416)

* add script for reserving package names on crates.io

* ci/check-crates.sh: suggest script for new crate name reservation
This commit is contained in:
Trent Nelson 2023-05-08 09:31:24 -06:00 committed by GitHub
parent d98aaf0614
commit 53811e6053
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 126 additions and 14 deletions

View File

@ -66,22 +66,14 @@ for file in "${files[@]}"; do
or
2. make a dummy publication with these steps:
2. make a dummy publication.
a. Create a empty crate locally with this template
example:
scripts/reserve-cratesio-package-name.sh \
--token <GRIMES_CRATESIO_TOKEN> \
lib solana-new-lib-crate
[package]
name = \"<PACKAGE_NAME>\"
version = \"0.0.1\"
description = \"<PACKAGE_DESC>\"
authors = [\"Solana Labs Maintainers <maintainers@solanalabs.com>\"]
repository = \"https://github.com/solana-labs/solana\"
license = \"Apache-2.0\"
homepage = \"https://solana.com/\"
documentation = \"https://docs.rs/<PACKAGE_NAME>\"
edition = \"2021\"
b. cargo publish --token <GRIMES_CRATES_IO_TOKEN>
see also: scripts/reserve-cratesio-package-name.sh --help
"
else
((error_count++))

View File

@ -0,0 +1,120 @@
#!/usr/bin/env bash
display_help() {
local bin
bin="$(basename --suffix='.sh' "$0")"
cat <<EOF 1>&2
$bin
Reserve a Rust package name on crates.io
USAGE:
$bin [FLAGS] [OPTIONS] <TARGET_TYPE> <PACKAGE_NAME>
FLAGS:
--help Display this help message
--no-solana-prefix Do not require \`solana-\` prefix on PACKAGE_NAME
--publish Upload the reserved package. Without this flag, a
dry-run is performed
OPTIONS:
--token <TOKEN> Token used to authenticate with crates.io
ARGS:
TARGET_TYPE The package target type [possible values: bin, lib]
PACKAGE_NAME The desired package name [see:
https://doc.rust-lang.org/cargo/reference/manifest.html#the-name-field]
EOF
}
require_solana_prefix=true
maybe_publish='--dry-run'
positional=()
while [[ -n "$1" ]]; do
case "$1" in
--)
break
;;
--help)
display_help
exit 0
;;
--no-solana-prefix)
require_solana_prefix=false
;;
--publish)
maybe_publish=''
;;
--token)
maybe_crates_token="--token $2"
shift
;;
--* | -*)
echo "error: unexpected argument \`$1\`" 1>&2
display_help
exit 1
;;
*)
positional+=("$1")
;;
esac
shift
done
while [[ -n "$1" ]]; do
positional+=("$1")
shift
done
target_type="${positional[0]:?'TARGET_TYPE must be declared'}"
package_name="${positional[1]:?'PACKAGE_NAME must be declared'}"
case "${target_type}" in
bin)
src_filename='main.rs'
src_file_body='fn main() {}'
;;
lib)
src_filename='lib.rs'
src_file_body=''
;;
*)
echo "error: unexpected TARGET_TYPE: \`${target_type}\`" 1>&2
display_help
exit 1
;;
esac
if ! [[ "${package_name}" =~ ^[a-zA-Z0-9_-]{1,64} ]]; then
echo "error: illegal PACKAGE_NAME: \`${package_name}\`" 1>&2
display_help
exit 1
fi
if ${require_solana_prefix} && ! [[ "${package_name}" =~ ^solana- ]]; then
# shellcheck disable=SC2016 # backticks are not a command here
echo 'error: PACKAGE_NAME MUST start with `solana-`' 1>&2
display_help
exit 1
fi
tmpdir="$(mktemp -d)"
if pushd "${tmpdir}" &>/dev/null; then
cat <<EOF > "Cargo.toml"
[package]
name = "${package_name}"
version = "0.0.0"
description = "reserved for future use"
authors = ["Solana Labs Maintainers <maintainers@solanalabs.com>"]
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solanalabs.com"
documentation = "https://docs.rs/${package_name}"
edition = "2021"
EOF
mkdir -p src
echo "${src_file_body}" > "src/${src_filename}"
# shellcheck disable=SC2086 # do not want to quote optional arg tokens
cargo publish ${maybe_publish} ${maybe_crates_token}
popd &>/dev/null || true
fi
rm -rf "${tmpdir}"