From b8133392910605fe1559d7f320ee23849c9e81a7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 27 Sep 2025 20:20:07 +0200 Subject: [PATCH 1/2] Implement Display trait for reference name types Co-authored-by: Byron <63622+Byron@users.noreply.github.com> --- gix-ref/src/display_tests.rs | 74 ++++++++++++++++++++++++++++++++++++ gix-ref/src/fullname.rs | 6 +++ gix-ref/src/lib.rs | 3 ++ gix-ref/src/name.rs | 12 ++++++ 4 files changed, 95 insertions(+) create mode 100644 gix-ref/src/display_tests.rs diff --git a/gix-ref/src/display_tests.rs b/gix-ref/src/display_tests.rs new file mode 100644 index 00000000000..f470fa4ef7e --- /dev/null +++ b/gix-ref/src/display_tests.rs @@ -0,0 +1,74 @@ +//! Tests for Display implementations + +#[cfg(test)] +mod display_tests { + use crate::{FullName, PartialName}; + use std::convert::TryFrom; + + #[test] + fn test_full_name_display() { + let full_name = FullName::try_from("refs/heads/main").unwrap(); + assert_eq!(format!("{}", full_name), "refs/heads/main"); + assert_eq!(full_name.to_string(), "refs/heads/main"); + } + + #[test] + fn test_full_name_ref_display() { + let full_name = FullName::try_from("refs/heads/main").unwrap(); + let full_name_ref = full_name.as_ref(); + assert_eq!(format!("{}", full_name_ref), "refs/heads/main"); + assert_eq!(full_name_ref.to_string(), "refs/heads/main"); + } + + #[test] + fn test_partial_name_display() { + let partial_name = PartialName::try_from("heads/main").unwrap(); + assert_eq!(format!("{}", partial_name), "heads/main"); + assert_eq!(partial_name.to_string(), "heads/main"); + } + + #[test] + fn test_partial_name_ref_display() { + let partial_name = PartialName::try_from("heads/main").unwrap(); + let partial_name_ref = partial_name.as_ref(); + assert_eq!(format!("{}", partial_name_ref), "heads/main"); + assert_eq!(partial_name_ref.to_string(), "heads/main"); + } + + #[test] + fn test_display_with_various_ref_types() { + // Test various types of refs + let refs = vec![ + "refs/heads/main", + "refs/remotes/origin/main", + "refs/tags/v1.0.0", + "HEAD", + ]; + + for ref_name in refs { + let full_name = FullName::try_from(ref_name).unwrap(); + let full_name_ref = full_name.as_ref(); + + assert_eq!(format!("{}", full_name), ref_name); + assert_eq!(format!("{}", full_name_ref), ref_name); + } + } + + #[test] + fn test_display_with_partial_names() { + let partial_names = vec![ + "main", + "heads/main", + "remotes/origin/main", + "tags/v1.0.0", + ]; + + for partial_name_str in partial_names { + let partial_name = PartialName::try_from(partial_name_str).unwrap(); + let partial_name_ref = partial_name.as_ref(); + + assert_eq!(format!("{}", partial_name), partial_name_str); + assert_eq!(format!("{}", partial_name_ref), partial_name_str); + } + } +} \ No newline at end of file diff --git a/gix-ref/src/fullname.rs b/gix-ref/src/fullname.rs index eb6ac854dde..1fdeb0ca532 100644 --- a/gix-ref/src/fullname.rs +++ b/gix-ref/src/fullname.rs @@ -73,6 +73,12 @@ impl std::fmt::Display for FullName { } } +impl std::fmt::Display for FullNameRef { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + std::fmt::Display::fmt(&self.0, f) + } +} + impl FullNameRef { /// Interpret this fully qualified reference name as partial name. pub fn as_partial_name(&self) -> &PartialNameRef { diff --git a/gix-ref/src/lib.rs b/gix-ref/src/lib.rs index a1aa5952fa4..d2a1ceecd66 100644 --- a/gix-ref/src/lib.rs +++ b/gix-ref/src/lib.rs @@ -213,3 +213,6 @@ pub enum TargetRef<'a> { /// A ref that points to another reference by its validated name, adding a level of indirection. Symbolic(&'a FullNameRef), } + +#[cfg(test)] +mod display_tests; diff --git a/gix-ref/src/name.rs b/gix-ref/src/name.rs index f48a2691420..e6d58f21386 100644 --- a/gix-ref/src/name.rs +++ b/gix-ref/src/name.rs @@ -266,6 +266,18 @@ impl convert::TryFrom for PartialName { } } +impl std::fmt::Display for PartialName { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + std::fmt::Display::fmt(&self.0, f) + } +} + +impl std::fmt::Display for PartialNameRef { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + std::fmt::Display::fmt(&self.0, f) + } +} + /// Note that this method is disagreeing with `gix_validate` as it allows dashes '-' for some reason. /// Since partial names cannot be created with dashes inside we adjusted this as it's probably unintended or git creates pseudo-refs /// which wouldn't pass its safety checks. From e670294d5f0dc2350227dfcfbf6b659a8988e2f4 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sat, 27 Sep 2025 20:22:49 +0200 Subject: [PATCH 2/2] refactor --- gix-ref/src/display_tests.rs | 74 ---------------------------------- gix-ref/src/fullname.rs | 3 +- gix-ref/src/lib.rs | 3 -- gix-ref/tests/refs/fullname.rs | 11 ++++- gix-ref/tests/refs/main.rs | 9 +++++ 5 files changed, 20 insertions(+), 80 deletions(-) delete mode 100644 gix-ref/src/display_tests.rs diff --git a/gix-ref/src/display_tests.rs b/gix-ref/src/display_tests.rs deleted file mode 100644 index f470fa4ef7e..00000000000 --- a/gix-ref/src/display_tests.rs +++ /dev/null @@ -1,74 +0,0 @@ -//! Tests for Display implementations - -#[cfg(test)] -mod display_tests { - use crate::{FullName, PartialName}; - use std::convert::TryFrom; - - #[test] - fn test_full_name_display() { - let full_name = FullName::try_from("refs/heads/main").unwrap(); - assert_eq!(format!("{}", full_name), "refs/heads/main"); - assert_eq!(full_name.to_string(), "refs/heads/main"); - } - - #[test] - fn test_full_name_ref_display() { - let full_name = FullName::try_from("refs/heads/main").unwrap(); - let full_name_ref = full_name.as_ref(); - assert_eq!(format!("{}", full_name_ref), "refs/heads/main"); - assert_eq!(full_name_ref.to_string(), "refs/heads/main"); - } - - #[test] - fn test_partial_name_display() { - let partial_name = PartialName::try_from("heads/main").unwrap(); - assert_eq!(format!("{}", partial_name), "heads/main"); - assert_eq!(partial_name.to_string(), "heads/main"); - } - - #[test] - fn test_partial_name_ref_display() { - let partial_name = PartialName::try_from("heads/main").unwrap(); - let partial_name_ref = partial_name.as_ref(); - assert_eq!(format!("{}", partial_name_ref), "heads/main"); - assert_eq!(partial_name_ref.to_string(), "heads/main"); - } - - #[test] - fn test_display_with_various_ref_types() { - // Test various types of refs - let refs = vec![ - "refs/heads/main", - "refs/remotes/origin/main", - "refs/tags/v1.0.0", - "HEAD", - ]; - - for ref_name in refs { - let full_name = FullName::try_from(ref_name).unwrap(); - let full_name_ref = full_name.as_ref(); - - assert_eq!(format!("{}", full_name), ref_name); - assert_eq!(format!("{}", full_name_ref), ref_name); - } - } - - #[test] - fn test_display_with_partial_names() { - let partial_names = vec![ - "main", - "heads/main", - "remotes/origin/main", - "tags/v1.0.0", - ]; - - for partial_name_str in partial_names { - let partial_name = PartialName::try_from(partial_name_str).unwrap(); - let partial_name_ref = partial_name.as_ref(); - - assert_eq!(format!("{}", partial_name), partial_name_str); - assert_eq!(format!("{}", partial_name_ref), partial_name_str); - } - } -} \ No newline at end of file diff --git a/gix-ref/src/fullname.rs b/gix-ref/src/fullname.rs index 1fdeb0ca532..423baf5a26b 100644 --- a/gix-ref/src/fullname.rs +++ b/gix-ref/src/fullname.rs @@ -1,6 +1,5 @@ -use std::{borrow::Borrow, path::Path}; - use gix_object::bstr::{BStr, BString, ByteSlice}; +use std::{borrow::Borrow, path::Path}; use crate::{bstr::ByteVec, name::is_pseudo_ref, Category, FullName, FullNameRef, Namespace, PartialNameRef}; diff --git a/gix-ref/src/lib.rs b/gix-ref/src/lib.rs index d2a1ceecd66..a1aa5952fa4 100644 --- a/gix-ref/src/lib.rs +++ b/gix-ref/src/lib.rs @@ -213,6 +213,3 @@ pub enum TargetRef<'a> { /// A ref that points to another reference by its validated name, adding a level of indirection. Symbolic(&'a FullNameRef), } - -#[cfg(test)] -mod display_tests; diff --git a/gix-ref/tests/refs/fullname.rs b/gix-ref/tests/refs/fullname.rs index edf2b4fa18e..3208b19dde6 100644 --- a/gix-ref/tests/refs/fullname.rs +++ b/gix-ref/tests/refs/fullname.rs @@ -1,6 +1,6 @@ use std::borrow::Cow; -use gix_ref::{Category, FullNameRef, PartialNameRef}; +use gix_ref::{Category, FullName, FullNameRef, PartialNameRef}; #[test] fn cow() { @@ -137,3 +137,12 @@ fn prefix_with_namespace_and_stripping() { "idempotent stripping" ); } + +#[test] +fn display() { + let full_name = FullName::try_from("refs/heads/main").unwrap(); + assert_eq!(format!("{full_name}"), "refs/heads/main"); + + let full_name_ref = full_name.as_ref(); + assert_eq!(format!("{full_name_ref}"), "refs/heads/main"); +} diff --git a/gix-ref/tests/refs/main.rs b/gix-ref/tests/refs/main.rs index ddd06716f88..bfa056c499a 100644 --- a/gix-ref/tests/refs/main.rs +++ b/gix-ref/tests/refs/main.rs @@ -36,6 +36,15 @@ mod partialname { ); Ok(()) } + + #[test] + fn display() { + let partial_name = PartialName::try_from("heads/main").unwrap(); + assert_eq!(format!("{partial_name}"), "heads/main"); + + let partial_name_ref = partial_name.as_ref(); + assert_eq!(format!("{partial_name_ref}"), "heads/main"); + } } mod namespace; mod packed;