Commits

Anonymous committed ba6c761

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>

Comments (0)

Files changed (1)

lib/choose_repository.tcl

 	 && [file exists [file join $path config]]} {
 		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
 }
 
+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
 	}
 
 	if {$clone_type eq {hardlink} || $clone_type eq {shared}} {
-		set objdir [file join $origin_url .git objects]
-		if {![file isdirectory $objdir]} {
-			set objdir [file join $origin_url objects]
-			if {![file isdirectory $objdir]} {
-				error_popup [mc "Not a Git repository: %s" [file tail $origin_url]]
-				return
-			}
+		set objdir [_objdir $origin_url]
+		if {$objdir eq {}} {
+			error_popup [mc "Not a Git repository: %s" [file tail $origin_url]]
+			return
 		}
 	}