lib / database.tclon commit git-gui: Work around bad interaction between Tcl and cmd.exe on ^{tree} (20f1a10)
   1# git-gui object database management support
   2# Copyright (C) 2006, 2007 Shawn Pearce
   3
   4proc do_stats {} {
   5        set fd [open "| git count-objects -v" r]
   6        while {[gets $fd line] > 0} {
   7                if {[regexp {^([^:]+): (\d+)$} $line _ name value]} {
   8                        set stats($name) $value
   9                }
  10        }
  11        close $fd
  12
  13        set packed_sz 0
  14        foreach p [glob -directory [gitdir objects pack] \
  15                -type f \
  16                -nocomplain -- *] {
  17                incr packed_sz [file size $p]
  18        }
  19        if {$packed_sz > 0} {
  20                set stats(size-pack) [expr {$packed_sz / 1024}]
  21        }
  22
  23        set w .stats_view
  24        toplevel $w
  25        wm geometry $w "+[winfo rootx .]+[winfo rooty .]"
  26
  27        label $w.header -text {Database Statistics}
  28        pack $w.header -side top -fill x
  29
  30        frame $w.buttons -border 1
  31        button $w.buttons.close -text Close \
  32                -default active \
  33                -command [list destroy $w]
  34        button $w.buttons.gc -text {Compress Database} \
  35                -default normal \
  36                -command "destroy $w;do_gc"
  37        pack $w.buttons.close -side right
  38        pack $w.buttons.gc -side left
  39        pack $w.buttons -side bottom -fill x -pady 10 -padx 10
  40
  41        frame $w.stat -borderwidth 1 -relief solid
  42        foreach s {
  43                {count           {Number of loose objects}}
  44                {size            {Disk space used by loose objects} { KiB}}
  45                {in-pack         {Number of packed objects}}
  46                {packs           {Number of packs}}
  47                {size-pack       {Disk space used by packed objects} { KiB}}
  48                {prune-packable  {Packed objects waiting for pruning}}
  49                {garbage         {Garbage files}}
  50                } {
  51                set name [lindex $s 0]
  52                set label [lindex $s 1]
  53                if {[catch {set value $stats($name)}]} continue
  54                if {[llength $s] > 2} {
  55                        set value "$value[lindex $s 2]"
  56                }
  57
  58                label $w.stat.l_$name -text "$label:" -anchor w
  59                label $w.stat.v_$name -text $value -anchor w
  60                grid $w.stat.l_$name $w.stat.v_$name -sticky we -padx {0 5}
  61        }
  62        pack $w.stat -pady 10 -padx 10
  63
  64        bind $w <Visibility> "grab $w; focus $w.buttons.close"
  65        bind $w <Key-Escape> [list destroy $w]
  66        bind $w <Key-Return> [list destroy $w]
  67        wm title $w "[appname] ([reponame]): Database Statistics"
  68        tkwait window $w
  69}
  70
  71proc do_gc {} {
  72        set w [console::new {gc} {Compressing the object database}]
  73        console::chain $w {
  74                {exec git pack-refs --prune}
  75                {exec git reflog expire --all}
  76                {exec git repack -a -d -l}
  77                {exec git rerere gc}
  78        }
  79}
  80
  81proc do_fsck_objects {} {
  82        set w [console::new {fsck-objects} \
  83                {Verifying the object database with fsck-objects}]
  84        set cmd [list git fsck-objects]
  85        lappend cmd --full
  86        lappend cmd --cache
  87        lappend cmd --strict
  88        console::exec $w $cmd
  89}