From cc20595949dc4efac37159629ad0db8753d3b78e Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Tue, 7 Jul 2026 10:53:41 -0500 Subject: [PATCH 1/3] Avoid allocating safe Git revisions --- crates/uv-git-types/src/reference.rs | 33 +++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/crates/uv-git-types/src/reference.rs b/crates/uv-git-types/src/reference.rs index 247f618ddc93d..973af6f5b5a1c 100644 --- a/crates/uv-git-types/src/reference.rs +++ b/crates/uv-git-types/src/reference.rs @@ -1,3 +1,4 @@ +use std::borrow::Cow; use std::fmt::Display; use std::str; @@ -69,13 +70,19 @@ impl GitReference { } /// Converts the [`GitReference`] to a percent-encoded revision string for use in a URL. - pub fn as_url_rev(&self) -> Option { + pub fn as_url_rev(&self) -> Option> { self.as_str().map(Self::encode_rev) } /// Percent-encode a revision string for use in a URL. - pub(crate) fn encode_rev(rev: &str) -> String { - utf8_percent_encode(rev, GIT_REFERENCE_ENCODE_SET).to_string() + pub(crate) fn encode_rev(rev: &str) -> Cow<'_, str> { + if rev.bytes().all(|byte| { + byte.is_ascii_alphanumeric() || matches!(byte, b'/' | b'-' | b'.' | b'_' | b'~') + }) { + Cow::Borrowed(rev) + } else { + Cow::Owned(utf8_percent_encode(rev, GIT_REFERENCE_ENCODE_SET).to_string()) + } } /// Returns the kind of this reference. @@ -101,3 +108,23 @@ impl Display for GitReference { fn looks_like_commit_hash(rev: &str) -> bool { rev.len() >= 7 && rev.chars().all(|ch| ch.is_ascii_hexdigit()) } + +#[cfg(test)] +mod tests { + use super::{Cow, GitReference}; + + #[test] + fn encode_rev_borrows_safe_revisions() { + assert!(matches!( + GitReference::encode_rev("feature/cow-support"), + Cow::Borrowed("feature/cow-support") + )); + } + + #[test] + fn encode_rev_owns_percent_encoded_revisions() { + let encoded = GitReference::encode_rev("feature name"); + assert!(matches!(&encoded, Cow::Owned(_))); + assert_eq!(encoded, "feature%20name"); + } +} From 5a9043ff9a9462259dc8475827871e446213865b Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Tue, 7 Jul 2026 11:53:31 -0500 Subject: [PATCH 2/3] Use percent-encoding Cow conversion --- crates/uv-git-types/src/reference.rs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/crates/uv-git-types/src/reference.rs b/crates/uv-git-types/src/reference.rs index 973af6f5b5a1c..ea93ce28f2b21 100644 --- a/crates/uv-git-types/src/reference.rs +++ b/crates/uv-git-types/src/reference.rs @@ -76,13 +76,7 @@ impl GitReference { /// Percent-encode a revision string for use in a URL. pub(crate) fn encode_rev(rev: &str) -> Cow<'_, str> { - if rev.bytes().all(|byte| { - byte.is_ascii_alphanumeric() || matches!(byte, b'/' | b'-' | b'.' | b'_' | b'~') - }) { - Cow::Borrowed(rev) - } else { - Cow::Owned(utf8_percent_encode(rev, GIT_REFERENCE_ENCODE_SET).to_string()) - } + utf8_percent_encode(rev, GIT_REFERENCE_ENCODE_SET).into() } /// Returns the kind of this reference. From 3c315de9379d6299bfc63447b0c72df2027553e0 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Tue, 7 Jul 2026 11:57:41 -0500 Subject: [PATCH 3/3] Remove Cow representation tests --- crates/uv-git-types/src/reference.rs | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/crates/uv-git-types/src/reference.rs b/crates/uv-git-types/src/reference.rs index ea93ce28f2b21..ac1bd297c1d55 100644 --- a/crates/uv-git-types/src/reference.rs +++ b/crates/uv-git-types/src/reference.rs @@ -102,23 +102,3 @@ impl Display for GitReference { fn looks_like_commit_hash(rev: &str) -> bool { rev.len() >= 7 && rev.chars().all(|ch| ch.is_ascii_hexdigit()) } - -#[cfg(test)] -mod tests { - use super::{Cow, GitReference}; - - #[test] - fn encode_rev_borrows_safe_revisions() { - assert!(matches!( - GitReference::encode_rev("feature/cow-support"), - Cow::Borrowed("feature/cow-support") - )); - } - - #[test] - fn encode_rev_owns_percent_encoded_revisions() { - let encoded = GitReference::encode_rev("feature name"); - assert!(matches!(&encoded, Cow::Owned(_))); - assert_eq!(encoded, "feature%20name"); - } -}