fix updating of installed crates manifest on custom sparse registry (#2178)

* Add either v1.15.0 to binstalk-registry

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Add `SourceType::Sparse`

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Add `Registry::crate_source`

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Use `Registry::crate_siouy

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Add support for `Source::Sparse`

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Optimize `CratesToml::append_to_file`

Bulkify remove

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Fix typing in cargo_crates_v1.rs and optimize append_to_file

Use `Vec::reserve_exact ` in `append_to_file` to avoid unnecessary allocation

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Fix Registry::url

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Fix unused variable in `Registry::crate_source`

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Fix fmt in cargo_crates_v1.rs

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Fix fmt in binstalk-registry/src/lib.rs

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Fix fmt in cargo_crates_v1.rs

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Refactor: Extract new fn CratesToml::add_crate

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Fix `<Source as Display>::fmt` impl for `Source::Sprase`

Add `/` to the end of the url if it doesn't have one

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Fix crate_version_source.rs

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Fix lifetime of `CrateToml::add_crate` API

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Fix lifetime of `CratesToml<'::add_crate` API

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* cargo fmt crate_version_source.rs

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Fix `Registery::crate_source`

Match sparse/git crates.io registry to standardrised `CrateSource::cratesio_registry()`.

Also optimize it to avoid unnecessary `.to_string()` and `Url::parse` for sparse registry.

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Fix `GitRegistry::url` ret type

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Fix `SparseRegistery::url` return type

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Fix typing in `Registry::crate_source`

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Rm unused import in sparse_registry.rs

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Rm unused import in git_registry.rs

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* cargo fmt binstalk-registry/src/lib.rs

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

* Rm unused dep either from binstalk-registry

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>

---------

Signed-off-by: Jiahao XU <30436523+NobodyXu@users.noreply.github.com>
This commit is contained in:
Jiahao XU 2025-06-06 14:13:05 +10:00 committed by GitHub
parent e8c9cc3599
commit 25a52038ef
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 101 additions and 56 deletions

View file

@ -1,4 +1,4 @@
use std::{fmt::Display, io, path::PathBuf, sync::Arc};
use std::{io, path::PathBuf, sync::Arc};
use binstalk_downloader::remote::Client;
use binstalk_types::cargo_toml_binstall::Meta;
@ -73,7 +73,7 @@ impl GitRegistry {
}))
}
pub fn url(&self) -> impl Display + '_ {
pub fn url(&self) -> &GitUrl {
&self.0.url
}

View file

@ -7,7 +7,11 @@ use binstalk_downloader::{
download::DownloadError,
remote::{Client, Error as RemoteError},
};
use binstalk_types::cargo_toml_binstall::Meta;
use binstalk_types::{
cargo_toml_binstall::Meta,
crate_info::{CrateSource, SourceType},
maybe_owned::MaybeOwned,
};
use cargo_toml_workspace::cargo_toml::{Error as CargoTomlError, Manifest};
use compact_str::CompactString;
use leon::{ParseError, RenderError};
@ -80,7 +84,7 @@ pub enum RegistryError {
CargoManifest(#[from] Box<CargoTomlError>),
#[error("Failed to parse url: {0}")]
UrlParse(#[from] url::ParseError),
UrlParse(#[from] UrlParseError),
#[error(transparent)]
Download(#[from] DownloadError),
@ -195,6 +199,38 @@ impl Registry {
}
}
}
/// Get url of the regsitry
pub fn url(&self) -> Result<MaybeOwned<'_, Url>, UrlParseError> {
match self {
#[cfg(feature = "git")]
Registry::Git(registry) => {
Url::parse(&registry.url().to_string()).map(MaybeOwned::Owned)
}
Registry::Sparse(registry) => Ok(MaybeOwned::Borrowed(registry.url())),
}
}
/// Get crate source of this registry
pub fn crate_source(&self) -> Result<CrateSource, UrlParseError> {
let registry = self.url()?;
let source_type = match self {
#[cfg(feature = "git")]
Registry::Git(_) => SourceType::Git,
Registry::Sparse(_) => SourceType::Sparse,
};
Ok(match (registry.as_str(), source_type) {
("https://index.crates.io/", SourceType::Sparse)
| ("https://github.com/rust-lang/crates.io-index", SourceType::Git) => {
CrateSource::cratesio_registry()
}
_ => CrateSource {
source_type,
url: MaybeOwned::Owned(registry.into_owned()),
},
})
}
}
impl fmt::Display for Registry {

View file

@ -1,5 +1,3 @@
use std::fmt::Display;
use binstalk_downloader::remote::{Client, Error as RemoteError};
use binstalk_types::cargo_toml_binstall::Meta;
use cargo_toml_workspace::cargo_toml::Manifest;
@ -30,7 +28,7 @@ impl SparseRegistry {
}
}
pub fn url(&self) -> impl Display + '_ {
pub fn url(&self) -> &Url {
&self.url
}