Merge branch 'tg/split-index-fixes'
[git] / git-gui / lib / database.tcl
1 # git-gui object database management support
2 # Copyright (C) 2006, 2007 Shawn Pearce
3
4 proc do_stats {} {
5         global use_ttk NS
6         set fd [git_read count-objects -v]
7         while {[gets $fd line] > 0} {
8                 if {[regexp {^([^:]+): (\d+)$} $line _ name value]} {
9                         set stats($name) $value
10                 }
11         }
12         close $fd
13
14         set packed_sz 0
15         foreach p [glob -directory [gitdir objects pack] \
16                 -type f \
17                 -nocomplain -- *] {
18                 incr packed_sz [file size $p]
19         }
20         if {$packed_sz > 0} {
21                 set stats(size-pack) [expr {$packed_sz / 1024}]
22         }
23
24         set w .stats_view
25         Dialog $w
26         wm withdraw $w
27         wm geometry $w "+[winfo rootx .]+[winfo rooty .]"
28
29         ${NS}::frame $w.buttons
30         ${NS}::button $w.buttons.close -text [mc Close] \
31                 -default active \
32                 -command [list destroy $w]
33         ${NS}::button $w.buttons.gc -text [mc "Compress Database"] \
34                 -default normal \
35                 -command "destroy $w;do_gc"
36         pack $w.buttons.close -side right
37         pack $w.buttons.gc -side left
38         pack $w.buttons -side bottom -fill x -pady 10 -padx 10
39
40         ${NS}::labelframe $w.stat -text [mc "Database Statistics"]
41         foreach s {
42                 {count           {mc "Number of loose objects"}}
43                 {size            {mc "Disk space used by loose objects"} { KiB}}
44                 {in-pack         {mc "Number of packed objects"}}
45                 {packs           {mc "Number of packs"}}
46                 {size-pack       {mc "Disk space used by packed objects"} { KiB}}
47                 {prune-packable  {mc "Packed objects waiting for pruning"}}
48                 {garbage         {mc "Garbage files"}}
49                 } {
50                 set name [lindex $s 0]
51                 set label [eval [lindex $s 1]]
52                 if {[catch {set value $stats($name)}]} continue
53                 if {[llength $s] > 2} {
54                         set value "$value[lindex $s 2]"
55                 }
56
57                 ${NS}::label $w.stat.l_$name -text [mc "%s:" $label] -anchor w
58                 ${NS}::label $w.stat.v_$name -text $value -anchor w
59                 grid $w.stat.l_$name $w.stat.v_$name -sticky we -padx {0 5}
60         }
61         pack $w.stat -pady 10 -padx 10
62
63         bind $w <Visibility> "grab $w; focus $w.buttons.close"
64         bind $w <Key-Escape> [list destroy $w]
65         bind $w <Key-Return> [list destroy $w]
66         wm title $w [mc "%s (%s): Database Statistics" [appname] [reponame]]
67         wm deiconify $w
68         tkwait window $w
69 }
70
71 proc do_gc {} {
72         set w [console::new {gc} [mc "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
81 proc do_fsck_objects {} {
82         set w [console::new {fsck-objects} \
83                 [mc "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 }
90
91 proc hint_gc {} {
92         set ndirs 1
93         set limit 8
94         if {[is_Windows]} {
95                 set ndirs 4
96                 set limit 1
97         }
98
99         set count [llength [glob \
100                 -nocomplain \
101                 -- \
102                 [gitdir objects 4\[0-[expr {$ndirs-1}]\]/*]]]
103
104         if {$count >= $limit * $ndirs} {
105                 set objects_current [expr {$count * 256/$ndirs}]
106                 if {[ask_popup \
107                         [mc "This repository currently has approximately %i loose objects.
108
109 To maintain optimal performance it is strongly recommended that you compress the database.
110
111 Compress the database now?" $objects_current]] eq yes} {
112                         do_gc
113                 }
114         }
115 }