@@ -63,9 +63,6 @@ impl From<Credential> for git2::RemoteCallbacks<'_> {
6363 }
6464}
6565
66- #[ derive( Clone , Default ) ]
67- pub struct Helper { }
68-
6966#[ derive( Debug , thiserror:: Error ) ]
7067pub enum HelpError {
7168 #[ error( "no url set for remote" ) ]
@@ -78,71 +75,67 @@ pub enum HelpError {
7875 Other ( #[ from] anyhow:: Error ) ,
7976}
8077
81- impl Helper {
82- pub fn help < ' a > (
83- & ' a self ,
84- ctx : & ' a CommandContext ,
85- remote_name : & str ,
86- ) -> Result < Vec < ( git2:: Remote , Vec < Credential > ) > , HelpError > {
87- let remote = ctx. repository ( ) . find_remote ( remote_name) ?;
88- let remote_url = Url :: from_str ( remote. url ( ) . ok_or ( HelpError :: NoUrlSet ) ?)
89- . context ( "failed to parse remote url" ) ?;
78+ pub fn help < ' a > (
79+ ctx : & ' a CommandContext ,
80+ remote_name : & str ,
81+ ) -> Result < Vec < ( git2:: Remote < ' a > , Vec < Credential > ) > , HelpError > {
82+ let remote = ctx. repository ( ) . find_remote ( remote_name) ?;
83+ let remote_url = Url :: from_str ( remote. url ( ) . ok_or ( HelpError :: NoUrlSet ) ?)
84+ . context ( "failed to parse remote url" ) ?;
9085
91- // if file, no auth needed.
92- if remote_url. scheme == Scheme :: File {
93- return Ok ( vec ! [ ( remote, vec![ Credential :: Noop ] ) ] ) ;
94- }
86+ // if file, no auth needed.
87+ if remote_url. scheme == Scheme :: File {
88+ return Ok ( vec ! [ ( remote, vec![ Credential :: Noop ] ) ] ) ;
89+ }
9590
96- match & ctx. project ( ) . preferred_key {
97- AuthKey :: Local { private_key_path } => {
98- let ssh_remote = if remote_url. scheme == Scheme :: Ssh {
99- Ok ( remote)
100- } else {
101- let ssh_url = remote_url. as_ssh ( ) ?;
102- ctx. repository ( ) . remote_anonymous ( & ssh_url. to_string ( ) )
103- } ?;
91+ match & ctx. project ( ) . preferred_key {
92+ AuthKey :: Local { private_key_path } => {
93+ let ssh_remote = if remote_url. scheme == Scheme :: Ssh {
94+ Ok ( remote)
95+ } else {
96+ let ssh_url = remote_url. as_ssh ( ) ?;
97+ ctx. repository ( ) . remote_anonymous ( & ssh_url. to_string ( ) )
98+ } ?;
10499
105- Ok ( vec ! [ (
106- ssh_remote,
107- vec![ Credential :: Ssh ( SshCredential :: Keyfile {
108- key_path: private_key_path. clone( ) ,
109- passphrase: None ,
110- } ) ] ,
111- ) ] )
112- }
113- AuthKey :: GitCredentialsHelper => {
114- let https_remote = if remote_url. scheme == Scheme :: Https {
115- Ok ( remote)
116- } else {
117- let url = remote_url. as_https ( ) ?;
118- ctx. repository ( ) . remote_anonymous ( & url. to_string ( ) )
119- } ?;
120- let flow = Self :: https_flow ( ctx, & remote_url) ?
121- . into_iter ( )
122- . map ( Credential :: Https )
123- . collect :: < Vec < _ > > ( ) ;
124- Ok ( vec ! [ ( https_remote, flow) ] )
125- }
126- AuthKey :: SystemExecutable => {
127- tracing:: error!( "WARNING: FIXME: this codepath should NEVER be hit. Something is seriously wrong." ) ;
128- Ok ( vec ! [ ] )
129- }
100+ Ok ( vec ! [ (
101+ ssh_remote,
102+ vec![ Credential :: Ssh ( SshCredential :: Keyfile {
103+ key_path: private_key_path. clone( ) ,
104+ passphrase: None ,
105+ } ) ] ,
106+ ) ] )
107+ }
108+ AuthKey :: GitCredentialsHelper => {
109+ let https_remote = if remote_url. scheme == Scheme :: Https {
110+ Ok ( remote)
111+ } else {
112+ let url = remote_url. as_https ( ) ?;
113+ ctx. repository ( ) . remote_anonymous ( & url. to_string ( ) )
114+ } ?;
115+ let flow = https_flow ( ctx, & remote_url) ?
116+ . into_iter ( )
117+ . map ( Credential :: Https )
118+ . collect :: < Vec < _ > > ( ) ;
119+ Ok ( vec ! [ ( https_remote, flow) ] )
120+ }
121+ AuthKey :: SystemExecutable => {
122+ tracing:: error!(
123+ "WARNING: FIXME: this codepath should NEVER be hit. Something is seriously wrong."
124+ ) ;
125+ Ok ( vec ! [ ] )
130126 }
131127 }
128+ }
132129
133- fn https_flow (
134- ctx : & CommandContext ,
135- remote_url : & Url ,
136- ) -> Result < Vec < HttpsCredential > , HelpError > {
137- let mut flow = vec ! [ ] ;
138-
139- let mut helper = git2:: CredentialHelper :: new ( & remote_url. to_string ( ) ) ;
140- let config = ctx. repository ( ) . config ( ) ?;
141- helper. config ( & config) ;
142- if let Some ( ( username, password) ) = helper. execute ( ) {
143- flow. push ( HttpsCredential :: CredentialHelper { username, password } ) ;
144- }
130+ fn https_flow ( ctx : & CommandContext , remote_url : & Url ) -> Result < Vec < HttpsCredential > , HelpError > {
131+ let mut flow = vec ! [ ] ;
145132
146- Ok ( flow)
133+ let mut helper = git2:: CredentialHelper :: new ( & remote_url. to_string ( ) ) ;
134+ let config = ctx. repository ( ) . config ( ) ?;
135+ helper. config ( & config) ;
136+ if let Some ( ( username, password) ) = helper. execute ( ) {
137+ flow. push ( HttpsCredential :: CredentialHelper { username, password } ) ;
147138 }
139+
140+ Ok ( flow)
148141}
0 commit comments