@@ -105,98 +105,81 @@ impl delegate::Revision for Delegate<'_> {
105105
106106    fn  reflog ( & mut  self ,  query :  ReflogLookup )  -> Option < ( ) >  { 
107107        self . unset_disambiguate_call ( ) ; 
108-         match  query { 
109-             ReflogLookup :: Date ( date)  => { 
110-                 let  r = match  & mut  self . refs [ self . idx ]  { 
111-                     Some ( r)  => r. clone ( ) . attach ( self . repo ) , 
112-                     val @ None  => match  self . repo . head ( ) . map ( crate :: Head :: try_into_referent)  { 
113-                         Ok ( Some ( r) )  => { 
114-                             * val = Some ( r. clone ( ) . detach ( ) ) ; 
115-                             r
116-                         } 
117-                         Ok ( None )  => { 
118-                             self . err . push ( Error :: UnbornHeadsHaveNoRefLog ) ; 
119-                             return  None ; 
120-                         } 
121-                         Err ( err)  => { 
122-                             self . err . push ( err. into ( ) ) ; 
123-                             return  None ; 
124-                         } 
125-                     } , 
126-                 } ; 
108+         let  r = match  & mut  self . refs [ self . idx ]  { 
109+             Some ( r)  => r. clone ( ) . attach ( self . repo ) , 
110+             val @ None  => match  self . repo . head ( ) . map ( crate :: Head :: try_into_referent)  { 
111+                 Ok ( Some ( r) )  => { 
112+                     * val = Some ( r. clone ( ) . detach ( ) ) ; 
113+                     r
114+                 } 
115+                 Ok ( None )  => { 
116+                     self . err . push ( Error :: UnbornHeadsHaveNoRefLog ) ; 
117+                     return  None ; 
118+                 } 
119+                 Err ( err)  => { 
120+                     self . err . push ( err. into ( ) ) ; 
121+                     return  None ; 
122+                 } 
123+             } , 
124+         } ; 
127125
128-                 let  mut  platform = r. log_iter ( ) ; 
129-                 match  platform. rev ( ) . ok ( ) . flatten ( )  { 
130-                     Some ( it)  => match  it
126+         let  mut  platform = r. log_iter ( ) ; 
127+         match  platform. rev ( ) . ok ( ) . flatten ( )  { 
128+             Some ( mut  it)  => match  query { 
129+                 ReflogLookup :: Date ( date)  => { 
130+                     let  mut  last = None ; 
131+                     let  id_to_insert = match  it
131132                        . filter_map ( Result :: ok) 
132-                         . min_by_key ( |l| ( date - l. signature . time ) . abs ( ) ) 
133+                         . inspect ( |d| { 
134+                             last = Some ( if  d. previous_oid . is_null ( )  { 
135+                                 d. new_oid 
136+                             }  else  { 
137+                                 d. previous_oid 
138+                             } ) ; 
139+                         } ) 
140+                         . find ( |l| l. signature . time . seconds  <= date. seconds ) 
133141                    { 
134-                         Some ( closest_line)  => { 
135-                             self . objs [ self . idx ] 
136-                                 . get_or_insert_with ( HashSet :: default) 
137-                                 . insert ( closest_line. new_oid ) ; 
138-                             Some ( ( ) ) 
139-                         } 
140-                         None  => { 
141-                             // do we need an another error variant? 
142-                             self . err . push ( Error :: SingleNotFound ) ; 
143-                             None 
144-                         } 
145-                     } , 
146-                     None  => { 
147-                         self . err . push ( Error :: MissingRefLog  { 
148-                             reference :  r. name ( ) . as_bstr ( ) . into ( ) , 
149-                             action :  "lookup entry" , 
150-                         } ) ; 
151-                         None 
152-                     } 
142+                         Some ( closest_line)  => closest_line. new_oid , 
143+                         None  => match  last { 
144+                             None  => { 
145+                                 self . err . push ( Error :: EmptyReflog ) ; 
146+                                 return  None ; 
147+                             } 
148+                             Some ( id)  => id, 
149+                         } , 
150+                     } ; 
151+                     self . objs [ self . idx ] 
152+                         . get_or_insert_with ( HashSet :: default) 
153+                         . insert ( id_to_insert) ; 
154+                     Some ( ( ) ) 
153155                } 
154-             } 
155-             ReflogLookup :: Entry ( no)  => { 
156-                 let  r = match  & mut  self . refs [ self . idx ]  { 
157-                     Some ( r)  => r. clone ( ) . attach ( self . repo ) , 
158-                     val @ None  => match  self . repo . head ( ) . map ( crate :: Head :: try_into_referent)  { 
159-                         Ok ( Some ( r) )  => { 
160-                             * val = Some ( r. clone ( ) . detach ( ) ) ; 
161-                             r
162-                         } 
163-                         Ok ( None )  => { 
164-                             self . err . push ( Error :: UnbornHeadsHaveNoRefLog ) ; 
165-                             return  None ; 
166-                         } 
167-                         Err ( err)  => { 
168-                             self . err . push ( err. into ( ) ) ; 
169-                             return  None ; 
170-                         } 
171-                     } , 
172-                 } ; 
173-                 let  mut  platform = r. log_iter ( ) ; 
174-                 match  platform. rev ( ) . ok ( ) . flatten ( )  { 
175-                     Some ( mut  it)  => match  it. nth ( no) . and_then ( Result :: ok)  { 
176-                         Some ( line)  => { 
177-                             self . objs [ self . idx ] 
178-                                 . get_or_insert_with ( HashSet :: default) 
179-                                 . insert ( line. new_oid ) ; 
180-                             Some ( ( ) ) 
181-                         } 
182-                         None  => { 
183-                             let  available = platform. rev ( ) . ok ( ) . flatten ( ) . map_or ( 0 ,  Iterator :: count) ; 
184-                             self . err . push ( Error :: RefLogEntryOutOfRange  { 
185-                                 reference :  r. detach ( ) , 
186-                                 desired :  no, 
187-                                 available, 
188-                             } ) ; 
189-                             None 
190-                         } 
191-                     } , 
156+                 ReflogLookup :: Entry ( no)  => match  it. nth ( no) . and_then ( Result :: ok)  { 
157+                     Some ( line)  => { 
158+                         self . objs [ self . idx ] 
159+                             . get_or_insert_with ( HashSet :: default) 
160+                             . insert ( line. new_oid ) ; 
161+                         Some ( ( ) ) 
162+                     } 
192163                    None  => { 
193-                         self . err . push ( Error :: MissingRefLog  { 
194-                             reference :  r. name ( ) . as_bstr ( ) . into ( ) , 
195-                             action :  "lookup entry" , 
164+                         let  available = platform. rev ( ) . ok ( ) . flatten ( ) . map_or ( 0 ,  Iterator :: count) ; 
165+                         self . err . push ( Error :: RefLogEntryOutOfRange  { 
166+                             reference :  r. detach ( ) , 
167+                             desired :  no, 
168+                             available, 
196169                        } ) ; 
197170                        None 
198171                    } 
199-                 } 
172+                 } , 
173+             } , 
174+             None  => { 
175+                 self . err . push ( Error :: MissingRefLog  { 
176+                     reference :  r. name ( ) . as_bstr ( ) . into ( ) , 
177+                     action :  match  query { 
178+                         ReflogLookup :: Entry ( _)  => "lookup reflog entry by index" , 
179+                         ReflogLookup :: Date ( _)  => "lookup reflog entry by date" , 
180+                     } , 
181+                 } ) ; 
182+                 None 
200183            } 
201184        } 
202185    } 
0 commit comments