Spaces:
Running
Running
# 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 | |
} | |
} | |
} | |