@@ -85,6 +85,9 @@ pub fn ensure_ssh_env() {
8585}
8686
8787pub fn ensure_git_ssh_command ( ) -> Result < bool > {
88+ if !git_config_writable ( ) {
89+ return Ok ( false ) ;
90+ }
8891 let Some ( sock) = preferred_agent_sock ( ) else {
8992 return Ok ( false ) ;
9093 } ;
@@ -128,6 +131,9 @@ pub fn ensure_git_ssh_command_for_sock(sock: &Path, force: bool) -> Result<bool>
128131}
129132
130133pub fn ensure_git_https_insteadof ( ) -> Result < bool > {
134+ if !git_config_writable ( ) {
135+ return Ok ( false ) ;
136+ }
131137 let desired = [ "git@github.com:" , "ssh://git@github.com/" ] ;
132138 let mut changed = false ;
133139
@@ -142,6 +148,9 @@ pub fn ensure_git_https_insteadof() -> Result<bool> {
142148}
143149
144150pub fn clear_git_https_insteadof ( ) -> Result < bool > {
151+ if !git_config_writable ( ) {
152+ return Ok ( false ) ;
153+ }
145154 let desired = [ "git@github.com:" , "ssh://git@github.com/" ] ;
146155 let mut changed = false ;
147156
@@ -372,6 +381,33 @@ fn git_config_get(key: &str) -> Result<Option<String>> {
372381 Ok ( Some ( value) )
373382}
374383
384+ fn git_config_writable ( ) -> bool {
385+ let home = match std:: env:: var_os ( "HOME" ) {
386+ Some ( val) => PathBuf :: from ( val) ,
387+ None => return false ,
388+ } ;
389+ if !home. is_dir ( ) {
390+ return false ;
391+ }
392+
393+ let path = home. join ( ".gitconfig" ) ;
394+ let meta = match fs:: symlink_metadata ( & path) {
395+ Ok ( meta) => meta,
396+ Err ( _) => return true ,
397+ } ;
398+ if meta. is_dir ( ) {
399+ return false ;
400+ }
401+ if meta. file_type ( ) . is_symlink ( ) {
402+ match fs:: metadata ( & path) {
403+ Ok ( target_meta) => target_meta. is_file ( ) ,
404+ Err ( _) => false ,
405+ }
406+ } else {
407+ true
408+ }
409+ }
410+
375411fn git_config_get_all ( key : & str ) -> Result < Vec < String > > {
376412 let output = Command :: new ( "git" )
377413 . args ( [ "config" , "--global" , "--get-all" , key] )
0 commit comments