@@ -9,6 +9,7 @@ use gix_revision::spec::parse::{
99use crate :: {
1010 bstr:: { BStr , BString , ByteSlice } ,
1111 ext:: ReferenceExt ,
12+ remote,
1213 revision:: spec:: parse:: { Delegate , Error , RefsHint } ,
1314} ;
1415
@@ -106,6 +107,7 @@ impl<'repo> delegate::Revision for Delegate<'repo> {
106107 self . unset_disambiguate_call ( ) ;
107108 match query {
108109 ReflogLookup :: Date ( _date) => {
110+ // TODO: actually do this - this should be possible now despite incomplete date parsing
109111 self . err . push ( Error :: Planned {
110112 dependency : "remote handling and ref-specs are fleshed out more" ,
111113 } ) ;
@@ -215,11 +217,51 @@ impl<'repo> delegate::Revision for Delegate<'repo> {
215217 }
216218 }
217219
218- fn sibling_branch ( & mut self , _kind : SiblingBranch ) -> Option < ( ) > {
220+ fn sibling_branch ( & mut self , kind : SiblingBranch ) -> Option < ( ) > {
219221 self . unset_disambiguate_call ( ) ;
220- self . err . push ( Error :: Planned {
221- dependency : "remote handling and ref-specs are fleshed out more" ,
222- } ) ;
222+ let reference = match & mut self . refs [ self . idx ] {
223+ val @ None => match self . repo . head ( ) . map ( crate :: Head :: try_into_referent) {
224+ Ok ( Some ( r) ) => {
225+ * val = Some ( r. clone ( ) . detach ( ) ) ;
226+ r
227+ }
228+ Ok ( None ) => {
229+ self . err . push ( Error :: UnbornHeadForSibling ) ;
230+ return None ;
231+ }
232+ Err ( err) => {
233+ self . err . push ( err. into ( ) ) ;
234+ return None ;
235+ }
236+ } ,
237+ Some ( r) => r. clone ( ) . attach ( self . repo ) ,
238+ } ;
239+ let direction = match kind {
240+ SiblingBranch :: Upstream => remote:: Direction :: Fetch ,
241+ SiblingBranch :: Push => remote:: Direction :: Push ,
242+ } ;
243+ match reference. remote_tracking_ref_name ( direction) {
244+ None => self . err . push ( Error :: NoTrackingBranch {
245+ name : reference. inner . name ,
246+ direction,
247+ } ) ,
248+ Some ( Err ( err) ) => self . err . push ( Error :: GetTrackingBranch {
249+ name : reference. inner . name ,
250+ direction,
251+ source : Box :: new ( err) ,
252+ } ) ,
253+ Some ( Ok ( name) ) => match self . repo . find_reference ( name. as_ref ( ) ) {
254+ Err ( err) => self . err . push ( Error :: GetTrackingBranch {
255+ name : reference. inner . name ,
256+ direction,
257+ source : Box :: new ( err) ,
258+ } ) ,
259+ Ok ( r) => {
260+ self . refs [ self . idx ] = r. inner . into ( ) ;
261+ return Some ( ( ) ) ;
262+ }
263+ } ,
264+ } ;
223265 None
224266 }
225267}
0 commit comments