git-gui: Support cloning Cygwin based work-dirs

If the user tries to clone a Git repository that is actually a
workdir of another repository (by way of contrib git-new-workdir)
then the contents of .git is a series of Windows .lnk files which
Tcl can't read if this is a native Tcl process.  To read the real
objects directory we need to resolve the link to that location.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
maint
Shawn O. Pearce 2007-10-12 16:24:20 -04:00
parent 51a41ac4ef
commit ba6c761e62
1 changed files with 37 additions and 7 deletions

View File

@ -324,9 +324,42 @@ proc _is_git {path} {
&& [file exists [file join $path config]]} { && [file exists [file join $path config]]} {
return 1 return 1
} }
if {[is_Cygwin]} {
if {[file exists [file join $path HEAD]]
&& [file exists [file join $path objects.lnk]]
&& [file exists [file join $path config.lnk]]} {
return 1
}
}
return 0 return 0
} }


proc _objdir {path} {
set objdir [file join $path .git objects]
if {[file isdirectory $objdir]} {
return $objdir
}

set objdir [file join $path objects]
if {[file isdirectory $objdir]} {
return $objdir
}

if {[is_Cygwin]} {
set objdir [file join $path .git objects.lnk]
if {[file isfile $objdir]} {
return [win32_read_lnk $objdir]
}

set objdir [file join $path objects.lnk]
if {[file isfile $objdir]} {
return [win32_read_lnk $objdir]
}
}

return {}
}

###################################################################### ######################################################################
## ##
## Create New Repository ## Create New Repository
@ -555,15 +588,12 @@ method _do_clone2 {} {
} }


if {$clone_type eq {hardlink} || $clone_type eq {shared}} { if {$clone_type eq {hardlink} || $clone_type eq {shared}} {
set objdir [file join $origin_url .git objects] set objdir [_objdir $origin_url]
if {![file isdirectory $objdir]} { if {$objdir eq {}} {
set objdir [file join $origin_url objects]
if {![file isdirectory $objdir]} {
error_popup [mc "Not a Git repository: %s" [file tail $origin_url]] error_popup [mc "Not a Git repository: %s" [file tail $origin_url]]
return return
} }
} }
}


set giturl $origin_url set giturl $origin_url
if {[is_Cygwin] && [file isdirectory $giturl]} { if {[is_Cygwin] && [file isdirectory $giturl]} {