set current_diff_path $path
set current_diff_side $w
set current_diff_header {}
- ui_status "Loading diff of [escape_path $path]..."
+ ui_status [mc "Loading diff of %s..." [escape_path $path]]
# - Git won't give us the diff, there's nothing to compare to!
#
if {$m eq {_O}} {
set max_sz [expr {128 * 1024}]
+ set type unknown
if {[catch {
- set fd [open $path r]
- fconfigure $fd -eofchar {}
- set content [read $fd $max_sz]
- close $fd
- set sz [file size $path]
+ 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]
+ }
+ 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
- ui_status "Unable to display [escape_path $path]"
- error_popup [append [mc "Error loading file:"] "\n\n$err"]
+ ui_status [mc "Unable to display %s" [escape_path $path]]
+ error_popup [strcat [mc "Error loading file:"] "\n\n$err"]
return
}
$ui_diff conf -state normal
- if {![catch {set type [exec file $path]}]} {
+ if {$type eq {submodule}} {
+ $ui_diff insert end [append \
+ "* " \
+ [mc "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]
}
if {[string first "\0" $content] != -1} {
$ui_diff insert end \
- "* Binary file (not showing content)." \
+ [mc "* Binary file (not showing content)."] \
d_@
} else {
if {$sz > $max_sz} {
if {[catch {set fd [eval git_read --nice $cmd]} err]} {
set diff_active 0
unlock_index
- ui_status "Unable to display [escape_path $path]"
- error_popup [append [mc "Error loading diff:"] "\n\n$err"]
+ ui_status [mc "Unable to display %s" [escape_path $path]]
+ error_popup [strcat [mc "Error loading diff:"] "\n\n$err"]
return
}
if {[string match {mode *} $line]
|| [string match {new file *} $line]
+ || [regexp {^(old|new) mode *} $line]
|| [string match {deleted file *} $line]
+ || [string match {deleted symlink} $line]
|| [string match {Binary files * and * differ} $line]
|| $line eq {\ No newline at end of file}
|| [regexp {^\* Unmerged path } $line]} {
display_file $current_diff_path $mi
if {$o eq {_}} {
clear_diff
+ } else {
+ set current_diff_path $current_diff_path
}
}