|  | # git-gui object database management support | 
|  | # Copyright (C) 2006, 2007 Shawn Pearce | 
|  |  | 
|  | proc do_stats {} { | 
|  | global use_ttk NS | 
|  | set fd [git_read count-objects -v] | 
|  | while {[gets $fd line] > 0} { | 
|  | if {[regexp {^([^:]+): (\d+)$} $line _ name value]} { | 
|  | set stats($name) $value | 
|  | } | 
|  | } | 
|  | close $fd | 
|  |  | 
|  | set packed_sz 0 | 
|  | foreach p [glob -directory [gitdir objects pack] \ | 
|  | -type f \ | 
|  | -nocomplain -- *] { | 
|  | incr packed_sz [file size $p] | 
|  | } | 
|  | if {$packed_sz > 0} { | 
|  | set stats(size-pack) [expr {$packed_sz / 1024}] | 
|  | } | 
|  |  | 
|  | set w .stats_view | 
|  | Dialog $w | 
|  | wm withdraw $w | 
|  | wm geometry $w "+[winfo rootx .]+[winfo rooty .]" | 
|  |  | 
|  | ${NS}::frame $w.buttons | 
|  | ${NS}::button $w.buttons.close -text [mc Close] \ | 
|  | -default active \ | 
|  | -command [list destroy $w] | 
|  | ${NS}::button $w.buttons.gc -text [mc "Compress Database"] \ | 
|  | -default normal \ | 
|  | -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 | 
|  |  | 
|  | ${NS}::labelframe $w.stat -text [mc "Database Statistics"] | 
|  | foreach s { | 
|  | {count           {mc "Number of loose objects"}} | 
|  | {size            {mc "Disk space used by loose objects"} { KiB}} | 
|  | {in-pack         {mc "Number of packed objects"}} | 
|  | {packs           {mc "Number of packs"}} | 
|  | {size-pack       {mc "Disk space used by packed objects"} { KiB}} | 
|  | {prune-packable  {mc "Packed objects waiting for pruning"}} | 
|  | {garbage         {mc "Garbage files"}} | 
|  | } { | 
|  | set name [lindex $s 0] | 
|  | set label [eval [lindex $s 1]] | 
|  | if {[catch {set value $stats($name)}]} continue | 
|  | if {[llength $s] > 2} { | 
|  | set value "$value[lindex $s 2]" | 
|  | } | 
|  |  | 
|  | ${NS}::label $w.stat.l_$name -text [mc "%s:" $label] -anchor w | 
|  | ${NS}::label $w.stat.v_$name -text $value -anchor w | 
|  | grid $w.stat.l_$name $w.stat.v_$name -sticky we -padx {0 5} | 
|  | } | 
|  | pack $w.stat -pady 10 -padx 10 | 
|  |  | 
|  | bind $w <Visibility> "grab $w; focus $w.buttons.close" | 
|  | bind $w <Key-Escape> [list destroy $w] | 
|  | bind $w <Key-Return> [list destroy $w] | 
|  | wm title $w [mc "%s (%s): Database Statistics" [appname] [reponame]] | 
|  | wm deiconify $w | 
|  | tkwait window $w | 
|  | } | 
|  |  | 
|  | proc do_gc {} { | 
|  | set w [console::new {gc} [mc "Compressing the object database"]] | 
|  | console::chain $w { | 
|  | {exec git pack-refs --prune} | 
|  | {exec git reflog expire --all} | 
|  | {exec git repack -a -d -l} | 
|  | {exec git rerere gc} | 
|  | } | 
|  | } | 
|  |  | 
|  | proc do_fsck_objects {} { | 
|  | set w [console::new {fsck-objects} \ | 
|  | [mc "Verifying the object database with fsck-objects"]] | 
|  | set cmd [list git fsck-objects] | 
|  | lappend cmd --full | 
|  | lappend cmd --cache | 
|  | lappend cmd --strict | 
|  | console::exec $w $cmd | 
|  | } | 
|  |  | 
|  | proc hint_gc {} { | 
|  | set ndirs 1 | 
|  | set limit 8 | 
|  | if {[is_Windows]} { | 
|  | set ndirs 4 | 
|  | set limit 1 | 
|  | } | 
|  |  | 
|  | set count [llength [glob \ | 
|  | -nocomplain \ | 
|  | -- \ | 
|  | [gitdir objects 4\[0-[expr {$ndirs-1}]\]/*]]] | 
|  |  | 
|  | if {$count >= $limit * $ndirs} { | 
|  | set objects_current [expr {$count * 256/$ndirs}] | 
|  | if {[ask_popup \ | 
|  | [mc "This repository currently has approximately %i loose objects. | 
|  |  | 
|  | To maintain optimal performance it is strongly recommended that you compress the database. | 
|  |  | 
|  | Compress the database now?" $objects_current]] eq yes} { | 
|  | do_gc | 
|  | } | 
|  | } | 
|  | } |