git-gui: Display database stats (count-objects -v) on demand.
[gitweb.git] / git-gui.sh
index 386ae989b86c74667e28eccbeed21c4639e438f1..5171db6f278854e60f8473b25cd7acbd58eb024a 100755 (executable)
@@ -805,6 +805,7 @@ proc read_diff {fd} {
 
 proc load_last_commit {} {
        global HEAD PARENT MERGE_HEAD commit_type ui_comm
+       global repo_config
 
        if {[llength $PARENT] == 0} {
                error_popup {There is nothing to amend.
@@ -831,11 +832,18 @@ current merge activity.
        set parents [list]
        if {[catch {
                        set fd [open "| git cat-file commit $curHEAD" 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 {parent *} $line]} {
                                        lappend parents [string range $line 7 end]
+                               } elseif {[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
                } err]} {
@@ -1027,6 +1035,7 @@ proc commit_committree {fd_wt curHEAD msg} {
        global single_commit all_heads current_branch
        global ui_status_value ui_comm selected_commit_type
        global file_states selected_paths rescan_active
+       global repo_config
 
        gets $fd_wt tree_id
        if {$tree_id eq {} || [catch {close $fd_wt} err]} {
@@ -1036,6 +1045,17 @@ proc commit_committree {fd_wt curHEAD msg} {
                return
        }
 
+       # -- Build the message.
+       #
+       set msg_p [gitdir COMMIT_EDITMSG]
+       set msg_wt [open $msg_p w]
+       if {[catch {set enc $repo_config(i18n.commitencoding)}]} {
+               set enc utf-8
+       }
+       fconfigure $msg_wt -encoding $enc -translation binary
+       puts -nonewline $msg_wt $msg
+       close $msg_wt
+
        # -- Create the commit.
        #
        set cmd [list git commit-tree $tree_id]
@@ -1048,7 +1068,7 @@ proc commit_committree {fd_wt curHEAD msg} {
                # git commit-tree writes to stderr during initial commit.
                lappend cmd 2>/dev/null
        }
-       lappend cmd << $msg
+       lappend cmd <$msg_p
        if {[catch {set cmt_id [eval exec $cmd]} err]} {
                error_popup "commit-tree failed:\n\n$err"
                set ui_status_value {Commit failed.}
@@ -1086,6 +1106,7 @@ proc commit_committree {fd_wt curHEAD msg} {
 
        # -- Cleanup after ourselves.
        #
+       catch {file delete $msg_p}
        catch {file delete [gitdir MERGE_HEAD]}
        catch {file delete [gitdir MERGE_MSG]}
        catch {file delete [gitdir SQUASH_MSG]}
@@ -1883,7 +1904,7 @@ proc do_create_branch {} {
                -width 40 \
                -font font_ui
        $w.desc.name_t insert 0.0 $repo_config(gui.newbranchtemplate)
-       grid $w.desc.name_l $w.desc.name_t -stick we -padx {0 5}
+       grid $w.desc.name_l $w.desc.name_t -sticky we -padx {0 5}
        bind $w.desc.name_t <Shift-Key-Tab> {focus [tk_focusPrev %W];break}
        bind $w.desc.name_t <Key-Tab> {focus [tk_focusNext %W];break}
        bind $w.desc.name_t <Key-Return> "do_create_branch_action $w;break"
@@ -1933,7 +1954,7 @@ proc do_create_branch {} {
                -height 1 \
                -width 50 \
                -font font_ui
-       grid $w.from.exp_r $w.from.exp_t -stick we -padx {0 5}
+       grid $w.from.exp_r $w.from.exp_t -sticky we -padx {0 5}
        bind $w.from.exp_t <Shift-Key-Tab> {focus [tk_focusPrev %W];break}
        bind $w.from.exp_t <Key-Tab> {focus [tk_focusNext %W];break}
        bind $w.from.exp_t <Key-Return> "do_create_branch_action $w;break"
@@ -2698,6 +2719,63 @@ proc do_gitk {revs} {
        }
 }
 
+proc do_stats {} {
+       set fd [open "| git count-objects -v" r]
+       while {[gets $fd line] > 0} {
+               if {[regexp {^([^:]+): (\d+)$} $line _ name value]} {
+                       set stats($name) $value
+               }
+       }
+       close $fd
+
+       set w .stats_view
+       toplevel $w
+       wm geometry $w "+[winfo rootx .]+[winfo rooty .]"
+
+       label $w.header -text {Database Statistics} \
+               -font font_uibold
+       pack $w.header -side top -fill x
+
+       frame $w.buttons -border 1
+       button $w.buttons.close -text Close \
+               -font font_ui \
+               -command [list destroy $w]
+       button $w.buttons.gc -text {Compress Database} \
+               -font font_ui \
+               -command "destroy $w;do_gc"
+       pack $w.buttons.close -side right
+       pack $w.buttons.gc -side left
+       pack $w.buttons -side bottom -fill x -pady 10 -padx 10
+
+       frame $w.stat -borderwidth 1 -relief solid
+       foreach s {
+               {count           {Number of loose objects}}
+               {size            {Disk space used by loose objects} { KiB}}
+               {in-pack         {Number of packed objects}}
+               {packs           {Number of packs}}
+               {prune-packable  {Packed objects waiting for pruning}}
+               {garbage         {Garbage files}}
+               } {
+               set name [lindex $s 0]
+               set label [lindex $s 1]
+               if {[catch {set value $stats($name)}]} continue
+               if {[llength $s] > 2} {
+                       set value "$value[lindex $s 2]"
+               }
+
+               label $w.stat.l_$name -text "$label:" -anchor w -font font_ui
+               label $w.stat.v_$name -text $value -anchor w -font font_ui
+               grid $w.stat.l_$name $w.stat.v_$name -sticky we -padx {0 5}
+       }
+       pack $w.stat
+
+       bind $w <Visibility> "grab $w; focus $w"
+       bind $w <Key-Escape> [list destroy $w]
+       bind $w <Key-Return> [list destroy $w]
+       wm title $w "[appname] ([reponame]): Database Statistics"
+       tkwait window $w
+}
+
 proc do_gc {} {
        set w [new_console {gc} {Compressing the object database}]
        console_exec $w {git gc}
@@ -3521,6 +3599,10 @@ if {![is_MacOSX]} {
 .mbar.repository add separator
 
 if {!$single_commit} {
+       .mbar.repository add command -label {Database Statistics} \
+               -command do_stats \
+               -font font_ui
+
        .mbar.repository add command -label {Compress Database} \
                -command do_gc \
                -font font_ui
@@ -3826,7 +3908,7 @@ frame .vpane.lower.commarea
 frame .vpane.lower.diff -relief sunken -borderwidth 1
 pack .vpane.lower.commarea -side top -fill x
 pack .vpane.lower.diff -side bottom -fill both -expand 1
-.vpane add .vpane.lower -stick nsew
+.vpane add .vpane.lower -sticky nsew
 
 # -- Commit Area Buttons
 #