@@ -4,7 +4,7 @@ use but_core::{RefMetadata, ref_metadata};
44use gix:: prelude:: ReferenceExt ;
55use gix:: refs:: Target ;
66use std:: borrow:: Cow ;
7- use std:: collections:: BTreeSet ;
7+ use std:: collections:: { BTreeMap , BTreeSet } ;
88
99impl Overlay {
1010 /// Serve the given `refs` from memory, as if they would exist.
@@ -73,19 +73,22 @@ impl Overlay {
7373 T : RefMetadata ,
7474 {
7575 let Overlay {
76- mut nonoverriding_references,
77- mut overriding_references,
76+ nonoverriding_references,
77+ overriding_references,
7878 meta_branches,
7979 workspace,
8080 entrypoint,
8181 } = self ;
82- // Make sure that duplicates from later determine the value.
83- nonoverriding_references. reverse ( ) ;
84- overriding_references. reverse ( ) ;
8582 (
8683 OverlayRepo {
87- nonoverriding_references : nonoverriding_references. into_iter ( ) . collect ( ) ,
88- overriding_references : overriding_references. into_iter ( ) . collect ( ) ,
84+ nonoverriding_references : nonoverriding_references
85+ . into_iter ( )
86+ . map ( |r| ( r. name . clone ( ) , r) )
87+ . collect ( ) ,
88+ overriding_references : overriding_references
89+ . into_iter ( )
90+ . map ( |r| ( r. name . clone ( ) , r) )
91+ . collect ( ) ,
8992 inner : repo,
9093 } ,
9194 OverlayMetadata {
@@ -100,8 +103,8 @@ impl Overlay {
100103
101104pub ( crate ) struct OverlayRepo < ' repo > {
102105 inner : & ' repo gix:: Repository ,
103- nonoverriding_references : BTreeSet < gix:: refs:: Reference > ,
104- overriding_references : BTreeSet < gix:: refs:: Reference > ,
106+ nonoverriding_references : BTreeMap < gix :: refs :: FullName , gix:: refs:: Reference > ,
107+ overriding_references : BTreeMap < gix :: refs :: FullName , gix:: refs:: Reference > ,
105108}
106109
107110/// Note that functions with `'repo` in their return value technically leak the bare repo, and it's
@@ -115,19 +118,11 @@ impl<'repo> OverlayRepo<'repo> {
115118 & self ,
116119 ref_name : & gix:: refs:: FullNameRef ,
117120 ) -> anyhow:: Result < Option < gix:: Reference < ' repo > > > {
118- if let Some ( r) = self
119- . overriding_references
120- . iter ( )
121- . find ( |r| r. name . as_ref ( ) == ref_name)
122- {
121+ if let Some ( r) = self . overriding_references . get ( ref_name) {
123122 Ok ( Some ( r. clone ( ) . attach ( self . inner ) ) )
124123 } else if let Some ( rn) = self . inner . try_find_reference ( ref_name) ? {
125124 Ok ( Some ( rn) )
126- } else if let Some ( r) = self
127- . nonoverriding_references
128- . iter ( )
129- . find ( |r| r. name . as_ref ( ) == ref_name)
130- {
125+ } else if let Some ( r) = self . nonoverriding_references . get ( ref_name) {
131126 Ok ( Some ( r. clone ( ) . attach ( self . inner ) ) )
132127 } else {
133128 Ok ( None )
@@ -138,11 +133,7 @@ impl<'repo> OverlayRepo<'repo> {
138133 & self ,
139134 ref_name : & gix:: refs:: FullNameRef ,
140135 ) -> anyhow:: Result < gix:: Reference < ' repo > > {
141- if let Some ( r) = self
142- . overriding_references
143- . iter ( )
144- . find ( |r| r. name . as_ref ( ) == ref_name)
145- {
136+ if let Some ( r) = self . overriding_references . get ( ref_name) {
146137 return Ok ( r. clone ( ) . attach ( self . inner ) ) ;
147138 }
148139 Ok ( self
@@ -151,11 +142,7 @@ impl<'repo> OverlayRepo<'repo> {
151142 . or_else ( |err| match err {
152143 gix:: reference:: find:: existing:: Error :: Find ( _) => Err ( err) ,
153144 gix:: reference:: find:: existing:: Error :: NotFound { .. } => {
154- if let Some ( r) = self
155- . nonoverriding_references
156- . iter ( )
157- . find ( |r| r. name . as_ref ( ) == ref_name)
158- {
145+ if let Some ( r) = self . nonoverriding_references . get ( ref_name) {
159146 Ok ( r. clone ( ) . attach ( self . inner ) )
160147 } else {
161148 Err ( err)
@@ -239,7 +226,7 @@ impl<'repo> OverlayRepo<'repo> {
239226 // apply overrides - they are seen first and take the spot of everything.
240227 for ( commit_id, git_reference) in self
241228 . overriding_references
242- . iter ( )
229+ . values ( )
243230 . filter ( |rn| rn. name . as_bstr ( ) . starts_with ( prefix. as_bytes ( ) ) )
244231 . filter_map ( |rn| ref_filter ( rn. clone ( ) . attach ( self . inner ) ) )
245232 {
@@ -263,7 +250,7 @@ impl<'repo> OverlayRepo<'repo> {
263250 // apply overrides (new only)
264251 for ( commit_id, git_reference) in self
265252 . nonoverriding_references
266- . iter ( )
253+ . values ( )
267254 . filter ( |rn| rn. name . as_bstr ( ) . starts_with ( prefix. as_bytes ( ) ) )
268255 . filter_map ( |rn| ref_filter ( rn. clone ( ) . attach ( self . inner ) ) )
269256 {
0 commit comments