Code

git-gui: Assume untracked directories are Git submodules
authorShawn O. Pearce <spearce@spearce.org>
Mon, 10 Sep 2007 00:13:10 +0000 (20:13 -0400)
committerShawn O. Pearce <spearce@spearce.org>
Mon, 10 Sep 2007 00:39:42 +0000 (20:39 -0400)
If `git ls-files --others` returned us the name of a directory then
it is because Git has decided that this directory itself contains a
valid Git repository and its files shouldn't be listed as untracked
for this repository.

In such a case we should label the object as a Git repository and
not just as a directory.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
lib/diff.tcl

index a1d5e523d2efd900c96c7905f8b0d6b76f4b2f32..694834ab7a515667dbd14b38165fbe74b37a0349 100644 (file)
@@ -84,17 +84,30 @@ proc show_diff {path w {lno {}}} {
        #
        if {$m eq {_O}} {
                set max_sz [expr {128 * 1024}]
+               set type unknown
                if {[catch {
-                               if {[file type $path] == {link}} {
+                               set type [file type $path]
+                               switch -- $type {
+                               directory {
+                                       set type submodule
+                                       set content {}
+                                       set sz 0
+                               }
+                               link {
                                        set content [file readlink $path]
                                        set sz [string length $content]
-                               } else {
+                               }
+                               file {
                                        set fd [open $path r]
                                        fconfigure $fd -eofchar {}
                                        set content [read $fd $max_sz]
                                        close $fd
                                        set sz [file size $path]
                                }
+                               default {
+                                       error "'$type' not supported"
+                               }
+                               }
                        } err ]} {
                        set diff_active 0
                        unlock_index
@@ -103,7 +116,9 @@ proc show_diff {path w {lno {}}} {
                        return
                }
                $ui_diff conf -state normal
-               if {![catch {set type [exec file $path]}]} {
+               if {$type eq {submodule}} {
+                       $ui_diff insert end "* Git Repository (subproject)\n" d_@
+               } elseif {![catch {set type [exec file $path]}]} {
                        set n [string length $path]
                        if {[string equal -length $n $path $type]} {
                                set type [string range $type $n end]