]> asedeno.scripts.mit.edu Git - git.git/blobdiff - git-gui.sh
git-gui: Rename GIT_VERSION to GITGUI_VERSION.
[git.git] / git-gui.sh
index 66d85dc6d06cffae2c5e13068886ce50042cbef1..f5010dd47a0416eb18d823f257f4748fec621074 100755 (executable)
@@ -2,7 +2,7 @@
 # Tcl ignores the next line -*- tcl -*- \
 exec wish "$0" -- "$@"
 
-set appvers {@@GIT_VERSION@@}
+set appvers {@@GITGUI_VERSION@@}
 set copyright {
 Copyright © 2006, 2007 Shawn Pearce, Paul Mackerras.
 
@@ -140,7 +140,7 @@ proc load_config {include_global} {
        array unset global_config
        if {$include_global} {
                catch {
-                       set fd_rc [open "| git repo-config --global --list" r]
+                       set fd_rc [open "| git config --global --list" r]
                        while {[gets $fd_rc line] >= 0} {
                                if {[regexp {^([^=]+)=(.*)$} $line line name value]} {
                                        if {[is_many_config $name]} {
@@ -156,7 +156,7 @@ proc load_config {include_global} {
 
        array unset repo_config
        catch {
-               set fd_rc [open "| git repo-config --list" r]
+               set fd_rc [open "| git config --list" r]
                while {[gets $fd_rc line] >= 0} {
                        if {[regexp {^([^=]+)=(.*)$} $line line name value]} {
                                if {[is_many_config $name]} {
@@ -202,14 +202,14 @@ proc save_config {} {
                set value $global_config_new($name)
                if {$value ne $global_config($name)} {
                        if {$value eq $default_config($name)} {
-                               catch {exec git repo-config --global --unset $name}
+                               catch {exec git config --global --unset $name}
                        } else {
                                regsub -all "\[{}\]" $value {"} value
-                               exec git repo-config --global $name $value
+                               exec git config --global $name $value
                        }
                        set global_config($name) $value
                        if {$value eq $repo_config($name)} {
-                               catch {exec git repo-config --unset $name}
+                               catch {exec git config --unset $name}
                                set repo_config($name) $value
                        }
                }
@@ -219,10 +219,10 @@ proc save_config {} {
                set value $repo_config_new($name)
                if {$value ne $repo_config($name)} {
                        if {$value eq $global_config($name)} {
-                               catch {exec git repo-config --unset $name}
+                               catch {exec git config --unset $name}
                        } else {
                                regsub -all "\[{}\]" $value {"} value
-                               exec git repo-config $name $value
+                               exec git config $name $value
                        }
                        set repo_config($name) $value
                }
@@ -3235,7 +3235,6 @@ proc show_blame {commit path} {
                set tl .
        }
        set blame_status($w) {Loading current file content...}
-       set texts [list]
 
        label $w.path -text "$commit:$path" \
                -anchor w \
@@ -3245,84 +3244,16 @@ proc show_blame {commit path} {
                -font font_uibold
        pack $w.path -side top -fill x
 
-       set hbg #e2effa
        frame $w.out
-       label $w.out.commit_l -text Commit \
-               -relief solid \
-               -borderwidth 1 \
-               -background $hbg \
-               -font font_uibold
-       text $w.out.commit_t \
-               -background white -borderwidth 0 \
-               -state disabled \
-               -wrap none \
-               -height 40 \
-               -width 9 \
-               -font font_diff
-       lappend texts $w.out.commit_t
-
-       label $w.out.author_l -text Author \
-               -relief solid \
-               -borderwidth 1 \
-               -background $hbg \
-               -font font_uibold
-       text $w.out.author_t \
-               -background white -borderwidth 0 \
-               -state disabled \
-               -wrap none \
-               -height 40 \
-               -width 20 \
-               -font font_diff
-       lappend texts $w.out.author_t
-
-       label $w.out.date_l -text Date \
-               -relief solid \
-               -borderwidth 1 \
-               -background $hbg \
-               -font font_uibold
-       text $w.out.date_t \
-               -background white -borderwidth 0 \
-               -state disabled \
-               -wrap none \
-               -height 40 \
-               -width [string length "yyyy-mm-dd hh:mm:ss"] \
-               -font font_diff
-       lappend texts $w.out.date_t
-
-       label $w.out.filename_l -text Filename \
-               -relief solid \
-               -borderwidth 1 \
-               -background $hbg \
-               -font font_uibold
-       text $w.out.filename_t \
-               -background white -borderwidth 0 \
-               -state disabled \
-               -wrap none \
-               -height 40 \
-               -width 20 \
-               -font font_diff
-       lappend texts $w.out.filename_t
-
-       label $w.out.origlinenumber_l -text {Orig Line} \
-               -relief solid \
-               -borderwidth 1 \
-               -background $hbg \
-               -font font_uibold
-       text $w.out.origlinenumber_t \
+       text $w.out.loaded_t \
                -background white -borderwidth 0 \
                -state disabled \
                -wrap none \
                -height 40 \
-               -width 5 \
+               -width 1 \
                -font font_diff
-       $w.out.origlinenumber_t tag conf linenumber -justify right
-       lappend texts $w.out.origlinenumber_t
+       $w.out.loaded_t tag conf annotated -background grey
 
-       label $w.out.linenumber_l -text {Curr Line} \
-               -relief solid \
-               -borderwidth 1 \
-               -background $hbg \
-               -font font_uibold
        text $w.out.linenumber_t \
                -background white -borderwidth 0 \
                -state disabled \
@@ -3331,13 +3262,7 @@ proc show_blame {commit path} {
                -width 5 \
                -font font_diff
        $w.out.linenumber_t tag conf linenumber -justify right
-       lappend texts $w.out.linenumber_t
 
-       label $w.out.file_l -text {File Content} \
-               -relief solid \
-               -borderwidth 1 \
-               -background $hbg \
-               -font font_uibold
        text $w.out.file_t \
                -background white -borderwidth 0 \
                -state disabled \
@@ -3346,22 +3271,23 @@ proc show_blame {commit path} {
                -width 80 \
                -xscrollcommand [list $w.out.sbx set] \
                -font font_diff
-       lappend texts $w.out.file_t
 
        scrollbar $w.out.sbx -orient h -command [list $w.out.file_t xview]
        scrollbar $w.out.sby -orient v \
-               -command [list scrollbar2many $texts yview]
-       set labels [list]
-       foreach i $texts {
-               regsub {_t$} $i _l l
-               lappend labels $l
-       }
-       set file_col [expr {[llength $texts] - 1}]
-       eval grid $labels -sticky we
-       eval grid $texts $w.out.sby -sticky nsew
-       grid conf $w.out.sbx -column $file_col -sticky we
-       grid columnconfigure $w.out $file_col -weight 1
-       grid rowconfigure $w.out 1 -weight 1
+               -command [list scrollbar2many [list \
+               $w.out.loaded_t \
+               $w.out.linenumber_t \
+               $w.out.file_t \
+               ] yview]
+       grid \
+               $w.out.linenumber_t \
+               $w.out.loaded_t \
+               $w.out.file_t \
+               $w.out.sby \
+               -sticky nsew
+       grid conf $w.out.sbx -column 2 -sticky we
+       grid columnconfigure $w.out 2 -weight 1
+       grid rowconfigure $w.out 0 -weight 1
        pack $w.out -fill both -expand 1
 
        label $w.status -textvariable blame_status($w) \
@@ -3372,18 +3298,49 @@ proc show_blame {commit path} {
                -font font_ui
        pack $w.status -side bottom -fill x
 
+       frame $w.cm
+       text $w.cm.t \
+               -background white -borderwidth 0 \
+               -state disabled \
+               -wrap none \
+               -height 10 \
+               -width 80 \
+               -xscrollcommand [list $w.cm.sbx set] \
+               -yscrollcommand [list $w.cm.sby set] \
+               -font font_diff
+       scrollbar $w.cm.sbx -orient h -command [list $w.cm.t xview]
+       scrollbar $w.cm.sby -orient v -command [list $w.cm.t yview]
+       pack $w.cm.sby -side right -fill y
+       pack $w.cm.sbx -side bottom -fill x
+       pack $w.cm.t -expand 1 -fill both
+       pack $w.cm -side bottom -fill x
+
        menu $w.ctxm -tearoff 0
        $w.ctxm add command -label "Copy Commit" \
                -font font_ui \
                -command "blame_copycommit $w \$cursorW @\$cursorX,\$cursorY"
 
-       foreach i $texts {
+       foreach i [list \
+               $w.out.loaded_t \
+               $w.out.linenumber_t \
+               $w.out.file_t] {
                $i tag conf in_sel \
                        -background [$i cget -foreground] \
                        -foreground [$i cget -background]
                $i conf -yscrollcommand \
-                       [list many2scrollbar $texts yview $w.out.sby]
-               bind $i <Button-1> "blame_highlight $i @%x,%y $texts;break"
+                       [list many2scrollbar [list \
+                       $w.out.loaded_t \
+                       $w.out.linenumber_t \
+                       $w.out.file_t \
+                       ] yview $w.out.sby]
+               bind $i <Button-1> "
+                       blame_click {$w} \\
+                               $w.cm.t \\
+                               $w.out.linenumber_t \\
+                               $w.out.file_t \\
+                               $i @%x,%y
+                       focus $i
+               "
                bind_button3 $i "
                        set cursorX %x
                        set cursorY %y
@@ -3392,8 +3349,7 @@ proc show_blame {commit path} {
                "
        }
 
-       set blame_data($w,colors) {}
-
+       bind $w.cm.t <Button-1> "focus $w.cm.t"
        bind $tl <Visibility> "focus $tl"
        bind $tl <Destroy> "
                array unset blame_status {$w}
@@ -3401,16 +3357,22 @@ proc show_blame {commit path} {
        "
        wm title $tl "[appname] ([reponame]): File Viewer"
 
+       set blame_data($w,commit_count) 0
+       set blame_data($w,commit_list) {}
        set blame_data($w,total_lines) 0
+       set blame_data($w,blame_lines) 0
+       set blame_data($w,highlight_commit) {}
+       set blame_data($w,highlight_line) -1
+
        set cmd [list git cat-file blob "$commit:$path"]
        set fd [open "| $cmd" r]
        fconfigure $fd -blocking 0 -translation lf -encoding binary
        fileevent $fd readable [list read_blame_catfile \
                $fd $w $commit $path \
-               $texts $w.out.linenumber_t $w.out.file_t]
+               $w.cm.t $w.out.loaded_t $w.out.linenumber_t $w.out.file_t]
 }
 
-proc read_blame_catfile {fd w commit path texts w_lno w_file} {
+proc read_blame_catfile {fd w commit path w_cmit w_load w_line w_file} {
        global blame_status blame_data
 
        if {![winfo exists $w_file]} {
@@ -3419,55 +3381,41 @@ proc read_blame_catfile {fd w commit path texts w_lno w_file} {
        }
 
        set n $blame_data($w,total_lines)
-       foreach i $texts {$i conf -state normal}
+       $w_load conf -state normal
+       $w_line conf -state normal
+       $w_file conf -state normal
        while {[gets $fd line] >= 0} {
                regsub "\r\$" $line {} line
                incr n
-               $w_lno insert end $n linenumber
-               $w_file insert end $line
-               foreach i $texts {$i insert end "\n"}
+               $w_load insert end "\n"
+               $w_line insert end "$n\n" linenumber
+               $w_file insert end "$line\n"
        }
-       foreach i $texts {$i conf -state disabled}
+       $w_load conf -state disabled
+       $w_line conf -state disabled
+       $w_file conf -state disabled
        set blame_data($w,total_lines) $n
 
        if {[eof $fd]} {
                close $fd
-               set blame_status($w) {Loading annotations...}
+               blame_incremental_status $w
                set cmd [list git blame -M -C --incremental]
                lappend cmd $commit -- $path
                set fd [open "| $cmd" r]
                fconfigure $fd -blocking 0 -translation lf -encoding binary
-               set handler [list read_blame_incremental $fd $w]
-               append handler " $texts"
-               fileevent $fd readable $handler
+               fileevent $fd readable [list read_blame_incremental $fd $w \
+                       $w_load $w_cmit $w_line $w_file]
        }
 }
 
-proc read_blame_incremental {fd w
-       w_commit w_author w_date w_filename w_olno
-       w_lno w_file} {
+proc read_blame_incremental {fd w w_load w_cmit w_line w_file} {
        global blame_status blame_data
 
-       if {![winfo exists $w_commit]} {
+       if {![winfo exists $w_file]} {
                catch {close $fd}
                return
        }
 
-       set all [list \
-               $w_commit \
-               $w_author \
-               $w_date \
-               $w_filename \
-               $w_olno \
-               $w_lno \
-               $w_file]
-
-       $w_commit conf -state normal
-       $w_author conf -state normal
-       $w_date conf -state normal
-       $w_filename conf -state normal
-       $w_olno conf -state normal
-
        while {[gets $fd line] >= 0} {
                if {[regexp {^([a-z0-9]{40}) (\d+) (\d+) (\d+)$} $line line \
                        cmit original_line final_line line_count]} {
@@ -3476,103 +3424,173 @@ proc read_blame_incremental {fd w
                        set blame_data($w,final_line) $final_line
                        set blame_data($w,line_count) $line_count
 
-                       if {[catch {set g $blame_data($w,$cmit,seen)}]} {
-                               if {$blame_data($w,colors) eq {}} {
-                                       set blame_data($w,colors) {
-                                               yellow
-                                               red
-                                               pink
-                                               orange
-                                               green
-                                               grey
-                                       }
-                               }
-                               set c [lindex $blame_data($w,colors) 0]
-                               set blame_data($w,colors) \
-                                       [lrange $blame_data($w,colors) 1 end]
-                               foreach t $all {
-                                       $t tag conf g$cmit -background $c
-                               }
-                       } else {
-                               set blame_data($w,$cmit,seen) 1
+                       if {[catch {set g $blame_data($w,$cmit,order)}]} {
+                               $w_line tag conf g$cmit
+                               $w_file tag conf g$cmit
+                               $w_line tag raise in_sel
+                               $w_file tag raise in_sel
+                               $w_file tag raise sel
+                               set blame_data($w,$cmit,order) $blame_data($w,commit_count)
+                               incr blame_data($w,commit_count)
+                               lappend blame_data($w,commit_list) $cmit
                        }
                } elseif {[string match {filename *} $line]} {
+                       set file [string range $line 9 end]
                        set n $blame_data($w,line_count)
                        set lno $blame_data($w,final_line)
-                       set ol $blame_data($w,original_line)
-                       set file [string range $line 9 end]
                        set cmit $blame_data($w,commit)
-                       set abbrev [string range $cmit 0 8]
-
-                       if {[catch {set author $blame_data($w,$cmit,author)} err]} {
-                               set author {}
-                       }
-
-                       if {[catch {set atime $blame_data($w,$cmit,author-time)}]} {
-                               set atime {}
-                       } else {
-                               set atime [clock format $atime -format {%Y-%m-%d %T}]
-                       }
 
                        while {$n > 0} {
-                               if {![catch {set g g$blame_data($w,line$lno,commit)}]} {
-                                       foreach t $all {
-                                               $t tag remove $g $lno.0 "$lno.0 lineend + 1c"
-                                       }
-                               }
-
-                               foreach t [list \
-                                       $w_commit \
-                                       $w_author \
-                                       $w_date \
-                                       $w_filename \
-                                       $w_olno] {
-                                       $t delete $lno.0 "$lno.0 lineend"
-                               }
-
-                               $w_commit insert $lno.0 $abbrev
-                               $w_author insert $lno.0 $author
-                               $w_date insert $lno.0 $atime
-                               $w_filename insert $lno.0 $file
-                               $w_olno insert $lno.0 $ol linenumber
-
-                               set g g$cmit
-                               foreach t $all {
-                                       $t tag add $g $lno.0 "$lno.0 lineend + 1c"
+                               if {[catch {set g g$blame_data($w,line$lno,commit)}]} {
+                                       $w_load tag add annotated $lno.0 "$lno.0 lineend + 1c"
+                               } else {
+                                       $w_line tag remove g$g $lno.0 "$lno.0 lineend + 1c"
+                                       $w_file tag remove g$g $lno.0 "$lno.0 lineend + 1c"
                                }
 
                                set blame_data($w,line$lno,commit) $cmit
+                               set blame_data($w,line$lno,file) $file
+                               $w_line tag add g$cmit $lno.0 "$lno.0 lineend + 1c"
+                               $w_file tag add g$cmit $lno.0 "$lno.0 lineend + 1c"
+
+                               if {$blame_data($w,highlight_line) == -1} {
+                                       if {[lindex [$w_file yview] 0] == 0} {
+                                               $w_file see $lno.0
+                                               blame_showcommit $w $w_cmit $w_line $w_file $lno
+                                       }
+                               } elseif {$blame_data($w,highlight_line) == $lno} {
+                                       blame_showcommit $w $w_cmit $w_line $w_file $lno
+                               }
 
                                incr n -1
                                incr lno
-                               incr ol
+                               incr blame_data($w,blame_lines)
+                       }
+
+                       set hc $blame_data($w,highlight_commit)
+                       if {$hc ne {}
+                               && [expr {$blame_data($w,$hc,order) + 1}]
+                                       == $blame_data($w,$cmit,order)} {
+                               blame_showcommit $w $w_cmit $w_line $w_file \
+                                       $blame_data($w,highlight_line)
                        }
                } elseif {[regexp {^([a-z-]+) (.*)$} $line line header data]} {
                        set blame_data($w,$blame_data($w,commit),$header) $data
                }
        }
 
-       $w_commit conf -state disabled
-       $w_author conf -state disabled
-       $w_date conf -state disabled
-       $w_filename conf -state disabled
-       $w_olno conf -state disabled
-
        if {[eof $fd]} {
                close $fd
                set blame_status($w) {Annotation complete.}
+       } else {
+               blame_incremental_status $w
        }
 }
 
-proc blame_highlight {w pos args} {
-       set lno [lindex [split [$w index $pos] .] 0]
-       foreach i $args {
-               $i tag remove in_sel 0.0 end
-       }
+proc blame_incremental_status {w} {
+       global blame_status blame_data
+
+       set blame_status($w) [format \
+               "Loading annotations... %i of %i lines annotated (%2i%%)" \
+               $blame_data($w,blame_lines) \
+               $blame_data($w,total_lines) \
+               [expr {100 * $blame_data($w,blame_lines)
+                       / $blame_data($w,total_lines)}]]
+}
+
+proc blame_click {w w_cmit w_line w_file cur_w pos} {
+       set lno [lindex [split [$cur_w index $pos] .] 0]
        if {$lno eq {}} return
-       foreach i $args {
-               $i tag add in_sel $lno.0 "$lno.0 + 1 line"
+
+       $w_line tag remove in_sel 0.0 end
+       $w_file tag remove in_sel 0.0 end
+       $w_line tag add in_sel $lno.0 "$lno.0 + 1 line"
+       $w_file tag add in_sel $lno.0 "$lno.0 + 1 line"
+
+       blame_showcommit $w $w_cmit $w_line $w_file $lno
+}
+
+set blame_colors {
+       #ff4040
+       #ff40ff
+       #4040ff
+}
+
+proc blame_showcommit {w w_cmit w_line w_file lno} {
+       global blame_colors blame_data repo_config
+
+       set cmit $blame_data($w,highlight_commit)
+       if {$cmit ne {}} {
+               set idx $blame_data($w,$cmit,order)
+               set i 0
+               foreach c $blame_colors {
+                       set h [lindex $blame_data($w,commit_list) [expr {$idx - 1 + $i}]]
+                       $w_line tag conf g$h -background white
+                       $w_file tag conf g$h -background white
+                       incr i
+               }
+       }
+
+       $w_cmit conf -state normal
+       $w_cmit delete 0.0 end
+       if {[catch {set cmit $blame_data($w,line$lno,commit)}]} {
+               set cmit {}
+               $w_cmit insert end "Loading annotation..."
+       } else {
+               set idx $blame_data($w,$cmit,order)
+               set i 0
+               foreach c $blame_colors {
+                       set h [lindex $blame_data($w,commit_list) [expr {$idx - 1 + $i}]]
+                       $w_line tag conf g$h -background $c
+                       $w_file tag conf g$h -background $c
+                       incr i
+               }
+
+               if {[catch {set msg $blame_data($w,$cmit,message)}]} {
+                       set msg {}
+                       catch {
+                               set fd [open "| git cat-file commit $cmit" r]
+                               fconfigure $fd -encoding binary -translation lf
+                               if {[catch {set enc $repo_config(i18n.commitencoding)}]} {
+                                       set enc utf-8
+                               }
+                               while {[gets $fd line] > 0} {
+                                       if {[string match {encoding *} $line]} {
+                                               set enc [string tolower [string range $line 9 end]]
+                                       }
+                               }
+                               fconfigure $fd -encoding $enc
+                               set msg [string trim [read $fd]]
+                               close $fd
+                       }
+                       set blame_data($w,$cmit,message) $msg
+               }
+
+               set author_name {}
+               set author_email {}
+               set author_time {}
+               catch {set author_name $blame_data($w,$cmit,author)}
+               catch {set author_email $blame_data($w,$cmit,author-mail)}
+               catch {set author_time [clock format $blame_data($w,$cmit,author-time)]}
+
+               set committer_name {}
+               set committer_email {}
+               set committer_time {}
+               catch {set committer_name $blame_data($w,$cmit,committer)}
+               catch {set committer_email $blame_data($w,$cmit,committer-mail)}
+               catch {set committer_time [clock format $blame_data($w,$cmit,committer-time)]}
+
+               $w_cmit insert end "commit $cmit\n"
+               $w_cmit insert end "Author: $author_name $author_email $author_time\n"
+               $w_cmit insert end "Committer: $committer_name $committer_email $committer_time\n"
+               $w_cmit insert end "Original File: [escape_path $blame_data($w,line$lno,file)]\n"
+               $w_cmit insert end "\n"
+               $w_cmit insert end $msg
        }
+       $w_cmit conf -state disabled
+
+       set blame_data($w,highlight_line) $lno
+       set blame_data($w,highlight_commit) $cmit
 }
 
 proc blame_copycommit {w i pos} {
@@ -3997,14 +4015,6 @@ set starting_gitk_msg {Starting gitk... please wait...}
 proc do_gitk {revs} {
        global env ui_status_value starting_gitk_msg
 
-       # -- On Windows gitk is severly broken, and right now it seems like
-       #    nobody cares about fixing it.  The only known workaround is to
-       #    always delete ~/.gitk before starting the program.
-       #
-       if {[is_Windows]} {
-               catch {file delete [file join $env(HOME) .gitk]}
-       }
-
        # -- Always start gitk through whatever we were loaded with.  This
        #    lets us bypass using shell process on Windows systems.
        #
@@ -4151,7 +4161,7 @@ proc do_quit {} {
                        set rc_geometry {}
                }
                if {$cfg_geometry ne $rc_geometry} {
-                       catch {exec git repo-config gui.geometry $cfg_geometry}
+                       catch {exec git config gui.geometry $cfg_geometry}
                }
        }
 
@@ -4917,20 +4927,32 @@ apply_config
 ##
 ## feature option selection
 
+if {[regexp {^git-(.+)$} [appname] _junk subcommand]} {
+       unset _junk
+} else {
+       set subcommand gui
+}
+if {$subcommand eq {gui.sh}} {
+       set subcommand gui
+}
+if {$subcommand eq {gui} && [llength $argv] > 0} {
+       set subcommand [lindex $argv 0]
+       set argv [lrange $argv 1 end]
+}
+
 enable_option multicommit
 enable_option branch
 enable_option transport
 
-if {[appname] eq {git-citool}} {
-       enable_option singlecommit
-
+switch -- $subcommand {
+blame {
        disable_option multicommit
        disable_option branch
        disable_option transport
 }
+citool {
+       enable_option singlecommit
 
-switch -- [lindex $argv 0] {
-blame {
        disable_option multicommit
        disable_option branch
        disable_option transport
@@ -5112,7 +5134,7 @@ if {[is_enabled multicommit] || [is_enabled singlecommit]} {
        lappend disable_on_lock \
                [list .mbar.commit entryconf [.mbar.commit index last] -state]
 
-       .mbar.commit add command -label {Add All To Commit} \
+       .mbar.commit add command -label {Add Existing To Commit} \
                -command do_add_all \
                -accelerator $M1T-I \
                -font font_ui
@@ -5257,20 +5279,30 @@ bind all <$M1B-Key-W> {destroy [winfo toplevel %W]}
 
 # -- Not a normal commit type invocation?  Do that instead!
 #
-switch -- [lindex $argv 0] {
+switch -- $subcommand {
 blame {
-       if {[llength $argv] == 3} {
-               set current_branch [lindex $argv 1]
-               show_blame $current_branch [lindex $argv 2]
-               return
-       } else {
+       if {[llength $argv] != 2} {
                puts stderr "usage: $argv0 blame commit path"
                exit 1
        }
+       set current_branch [lindex $argv 0]
+       show_blame $current_branch [lindex $argv 1]
+       return
+}
+citool -
+gui {
+       if {[llength $argv] != 0} {
+               puts -nonewline stderr "usage: $argv0"
+               if {$subcommand ne {gui} && [appname] ne "git-$subcommand"} {
+                       puts -nonewline stderr " $subcommand"
+               }
+               puts stderr {}
+               exit 1
+       }
+       # fall through to setup UI for commits
 }
-{} {}
 default {
-       puts stderr "usage: $argv0 \[{blame}\]"
+       puts stderr "usage: $argv0 \[{blame|citool}\]"
        exit 1
 }
 }
@@ -5401,7 +5433,7 @@ pack .vpane.lower.commarea.buttons.rescan -side top -fill x
 lappend disable_on_lock \
        {.vpane.lower.commarea.buttons.rescan conf -state}
 
-button .vpane.lower.commarea.buttons.incall -text {Add All} \
+button .vpane.lower.commarea.buttons.incall -text {Add Existing} \
        -command do_add_all \
        -font font_ui
 pack .vpane.lower.commarea.buttons.incall -side top -fill x