mirror of
https://github.com/cargo-bins/cargo-binstall.git
synced 2025-04-24 22:30:03 +00:00
feat: Support install directly from git repo (#1162)
Fixed #3 Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
parent
dd35fba232
commit
ca00cbaccc
22 changed files with 1810 additions and 28 deletions
|
@ -49,7 +49,9 @@ tracing-subscriber = { version = "0.3.17", features = ["fmt", "json", "ansi"], d
|
|||
embed-resource = "2.1.1"
|
||||
|
||||
[features]
|
||||
default = ["static", "rustls", "trust-dns", "fancy-no-backtrace", "zstd-thin"]
|
||||
default = ["static", "rustls", "trust-dns", "fancy-no-backtrace", "zstd-thin", "git"]
|
||||
|
||||
git = ["binstalk/git"]
|
||||
|
||||
mimalloc = ["dep:mimalloc"]
|
||||
|
||||
|
@ -74,3 +76,6 @@ log_max_level_debug = ["log/max_level_debug", "tracing/max_level_debug", "log_re
|
|||
|
||||
log_release_max_level_info = ["log/release_max_level_info", "tracing/release_max_level_info"]
|
||||
log_release_max_level_debug = ["log/release_max_level_debug", "tracing/release_max_level_debug"]
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
rustdoc-args = ["--cfg", "docsrs"]
|
||||
|
|
|
@ -38,7 +38,7 @@ pub struct Args {
|
|||
/// install. The version syntax is as with the --version option.
|
||||
///
|
||||
/// When multiple names are provided, the --version option and override option
|
||||
/// `manifest_path` is unavailable due to ambiguity.
|
||||
/// `--manifest-path` and `--git` are unavailable due to ambiguity.
|
||||
///
|
||||
/// If duplicate names are provided, the last one (and their version requirement)
|
||||
/// is kept.
|
||||
|
@ -88,9 +88,21 @@ pub struct Args {
|
|||
/// This skips searching crates.io for a manifest and uses the specified path directly, useful
|
||||
/// for debugging and when adding Binstall support. This may be either the path to the folder
|
||||
/// containing a Cargo.toml file, or the Cargo.toml file itself.
|
||||
///
|
||||
/// This option cannot be used with `--git`.
|
||||
#[clap(help_heading = "Overrides", long)]
|
||||
pub manifest_path: Option<PathBuf>,
|
||||
|
||||
#[cfg(feature = "git")]
|
||||
/// Override how to fetch Cargo.toml package manifest.
|
||||
///
|
||||
/// This skip searching crates.io and instead clone the repository specified and
|
||||
/// runs as if `--manifest-path $cloned_repo` is passed to binstall.
|
||||
///
|
||||
/// This option cannot be used with `--manifest-path`.
|
||||
#[clap(help_heading = "Overrides", long)]
|
||||
pub git: Option<binstalk::helpers::git::GitUrl>,
|
||||
|
||||
/// Override Cargo.toml package manifest bin-dir.
|
||||
#[clap(help_heading = "Overrides", long)]
|
||||
pub bin_dir: Option<String>,
|
||||
|
@ -391,13 +403,36 @@ pub fn parse() -> Args {
|
|||
// Ensure no conflict
|
||||
let mut command = Args::command();
|
||||
|
||||
#[cfg(feature = "git")]
|
||||
if opts.manifest_path.is_some() && opts.git.is_some() {
|
||||
command
|
||||
.error(
|
||||
ErrorKind::ArgumentConflict,
|
||||
format_args!(
|
||||
r#"Multiple override options for Cargo.toml fetching.
|
||||
You cannot use --manifest-path and --git. Do one or the other."#
|
||||
),
|
||||
)
|
||||
.exit();
|
||||
}
|
||||
|
||||
if opts.crate_names.len() > 1 {
|
||||
let option = if opts.version_req.is_some() {
|
||||
"version"
|
||||
} else if opts.manifest_path.is_some() {
|
||||
"manifest-path"
|
||||
} else {
|
||||
""
|
||||
#[cfg(not(feature = "git"))]
|
||||
{
|
||||
""
|
||||
}
|
||||
|
||||
#[cfg(feature = "git")]
|
||||
if opts.git.is_some() {
|
||||
"git"
|
||||
} else {
|
||||
""
|
||||
}
|
||||
};
|
||||
|
||||
if !option.is_empty() {
|
||||
|
|
|
@ -19,7 +19,7 @@ use binstalk::{
|
|||
ops::{
|
||||
self,
|
||||
resolve::{CrateName, Resolution, ResolutionFetch, VersionReqExt},
|
||||
Resolver,
|
||||
CargoTomlFetchOverride, Options, Resolver,
|
||||
},
|
||||
};
|
||||
use binstalk_manifests::cargo_toml_binstall::PkgOverride;
|
||||
|
@ -95,7 +95,7 @@ pub fn install_crates(
|
|||
let gh_api_client = GhApiClient::new(client.clone(), args.github_token);
|
||||
|
||||
// Create binstall_opts
|
||||
let binstall_opts = Arc::new(ops::Options {
|
||||
let binstall_opts = Arc::new(Options {
|
||||
no_symlinks: args.no_symlinks,
|
||||
dry_run: args.dry_run,
|
||||
force: args.force,
|
||||
|
@ -104,7 +104,16 @@ pub fn install_crates(
|
|||
no_track: args.no_track,
|
||||
|
||||
version_req: args.version_req,
|
||||
manifest_path: args.manifest_path,
|
||||
#[cfg(feature = "git")]
|
||||
cargo_toml_fetch_override: match (args.manifest_path, args.git) {
|
||||
(Some(manifest_path), None) => Some(CargoTomlFetchOverride::Path(manifest_path)),
|
||||
(None, Some(git_url)) => Some(CargoTomlFetchOverride::Git(git_url)),
|
||||
(None, None) => None,
|
||||
_ => unreachable!("manifest_path and git cannot be specified at the same time"),
|
||||
},
|
||||
|
||||
#[cfg(not(feature = "git"))]
|
||||
cargo_toml_fetch_override: args.manifest_path.map(CargoTomlFetchOverride::Path),
|
||||
cli_overrides,
|
||||
|
||||
desired_targets,
|
||||
|
@ -326,7 +335,7 @@ fn do_install_fetches(
|
|||
resolution_fetchs: Vec<Box<ResolutionFetch>>,
|
||||
// Take manifests by value to drop the `FileLock`.
|
||||
manifests: Option<Manifests>,
|
||||
binstall_opts: &ops::Options,
|
||||
binstall_opts: &Options,
|
||||
dry_run: bool,
|
||||
temp_dir: tempfile::TempDir,
|
||||
no_cleanup: bool,
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
|
||||
|
||||
pub mod args;
|
||||
pub mod bin_util;
|
||||
pub mod entry;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue