@@ -4,7 +4,7 @@ use but_core::{RefMetadata, ref_metadata};
4
4
use gix:: prelude:: ReferenceExt ;
5
5
use gix:: refs:: Target ;
6
6
use std:: borrow:: Cow ;
7
- use std:: collections:: BTreeSet ;
7
+ use std:: collections:: { BTreeMap , BTreeSet } ;
8
8
9
9
impl Overlay {
10
10
/// Serve the given `refs` from memory, as if they would exist.
@@ -73,19 +73,22 @@ impl Overlay {
73
73
T : RefMetadata ,
74
74
{
75
75
let Overlay {
76
- mut nonoverriding_references,
77
- mut overriding_references,
76
+ nonoverriding_references,
77
+ overriding_references,
78
78
meta_branches,
79
79
workspace,
80
80
entrypoint,
81
81
} = self ;
82
- // Make sure that duplicates from later determine the value.
83
- nonoverriding_references. reverse ( ) ;
84
- overriding_references. reverse ( ) ;
85
82
(
86
83
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 ( ) ,
89
92
inner : repo,
90
93
} ,
91
94
OverlayMetadata {
@@ -100,8 +103,8 @@ impl Overlay {
100
103
101
104
pub ( crate ) struct OverlayRepo < ' repo > {
102
105
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 > ,
105
108
}
106
109
107
110
/// 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> {
115
118
& self ,
116
119
ref_name : & gix:: refs:: FullNameRef ,
117
120
) -> 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) {
123
122
Ok ( Some ( r. clone ( ) . attach ( self . inner ) ) )
124
123
} else if let Some ( rn) = self . inner . try_find_reference ( ref_name) ? {
125
124
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) {
131
126
Ok ( Some ( r. clone ( ) . attach ( self . inner ) ) )
132
127
} else {
133
128
Ok ( None )
@@ -138,11 +133,7 @@ impl<'repo> OverlayRepo<'repo> {
138
133
& self ,
139
134
ref_name : & gix:: refs:: FullNameRef ,
140
135
) -> 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) {
146
137
return Ok ( r. clone ( ) . attach ( self . inner ) ) ;
147
138
}
148
139
Ok ( self
@@ -151,11 +142,7 @@ impl<'repo> OverlayRepo<'repo> {
151
142
. or_else ( |err| match err {
152
143
gix:: reference:: find:: existing:: Error :: Find ( _) => Err ( err) ,
153
144
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) {
159
146
Ok ( r. clone ( ) . attach ( self . inner ) )
160
147
} else {
161
148
Err ( err)
@@ -239,7 +226,7 @@ impl<'repo> OverlayRepo<'repo> {
239
226
// apply overrides - they are seen first and take the spot of everything.
240
227
for ( commit_id, git_reference) in self
241
228
. overriding_references
242
- . iter ( )
229
+ . values ( )
243
230
. filter ( |rn| rn. name . as_bstr ( ) . starts_with ( prefix. as_bytes ( ) ) )
244
231
. filter_map ( |rn| ref_filter ( rn. clone ( ) . attach ( self . inner ) ) )
245
232
{
@@ -263,7 +250,7 @@ impl<'repo> OverlayRepo<'repo> {
263
250
// apply overrides (new only)
264
251
for ( commit_id, git_reference) in self
265
252
. nonoverriding_references
266
- . iter ( )
253
+ . values ( )
267
254
. filter ( |rn| rn. name . as_bstr ( ) . starts_with ( prefix. as_bytes ( ) ) )
268
255
. filter_map ( |rn| ref_filter ( rn. clone ( ) . attach ( self . inner ) ) )
269
256
{
0 commit comments