aboutsummaryrefslogtreecommitdiff
path: root/git-gui/lib/database.tcl
diff options
context:
space:
mode:
authorShawn O. Pearce <spearce@spearce.org>2007-05-07 23:36:31 -0400
committerShawn O. Pearce <spearce@spearce.org>2007-05-07 23:51:00 -0400
commit5f5dbd719d0d8ec136f32a0a56674902bd85f72f (patch)
treef5898a282daf34722256709c7ac2ac7f78f9bbb7 /git-gui/lib/database.tcl
parent3082acfa7c626a34aa419a163585051c2df2bf09 (diff)
parentebcaadabcb90eaf35a3bd69a50cccce4be4dcc2c (diff)
downloadgit-5f5dbd719d0d8ec136f32a0a56674902bd85f72f.tar.gz
git-5f5dbd719d0d8ec136f32a0a56674902bd85f72f.tar.xz
Merge branch 'master' of git://repo.or.cz/git-gui
* 'master' of git://repo.or.cz/git-gui: git-gui: Use vi-like keys in merge dialog git-gui: Include commit id/subject in merge choices git-gui: Show all possible branches for merge git-gui: Move merge support into a namespace git-gui: Allow vi keys to scroll the diff/blame regions git-gui: Move console procs into their own namespace git-gui: Refactor into multiple files to save my sanity git-gui: Track our own embedded values and rebuild when they change git-gui: Refactor to use our git proc more often git-gui: Use option database defaults to set the font git-gui: Cleanup common font handling for font_ui git-gui: Correct line wrapping for too many branch message git-gui: Warn users before making an octopus merge git-gui: Include the subject in the status bar after commit Also perform an evil merge change to update Git's main Makefile to pass the proper options down into git-gui now that it depends on reasonable values for 'sharedir' and 'TCL_PATH'. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Diffstat (limited to 'git-gui/lib/database.tcl')
-rw-r--r--git-gui/lib/database.tcl89
1 files changed, 89 insertions, 0 deletions
diff --git a/git-gui/lib/database.tcl b/git-gui/lib/database.tcl
new file mode 100644
index 000000000..73058a826
--- /dev/null
+++ b/git-gui/lib/database.tcl
@@ -0,0 +1,89 @@
+# git-gui object database management support
+# Copyright (C) 2006, 2007 Shawn Pearce
+
+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 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
+ toplevel $w
+ wm geometry $w "+[winfo rootx .]+[winfo rooty .]"
+
+ label $w.header -text {Database Statistics}
+ pack $w.header -side top -fill x
+
+ frame $w.buttons -border 1
+ button $w.buttons.close -text Close \
+ -default active \
+ -command [list destroy $w]
+ button $w.buttons.gc -text {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
+
+ 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}}
+ {size-pack {Disk space used by packed objects} { KiB}}
+ {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
+ 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 "[appname] ([reponame]): Database Statistics"
+ tkwait window $w
+}
+
+proc do_gc {} {
+ set w [console::new {gc} {Compressing the object database}]
+ console::chain {
+ {exec {git pack-refs --prune}}
+ {exec {git reflog expire --all}}
+ {exec {git repack -a -d -l}}
+ {exec {git rerere gc}}
+ } $w
+}
+
+proc do_fsck_objects {} {
+ set w [console::new {fsck-objects} \
+ {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
+}