about summary refs log tree commit diff
path: root/third_party/git/git-gui/lib/database.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/git/git-gui/lib/database.tcl')
-rw-r--r--third_party/git/git-gui/lib/database.tcl115
1 files changed, 115 insertions, 0 deletions
diff --git a/third_party/git/git-gui/lib/database.tcl b/third_party/git/git-gui/lib/database.tcl
new file mode 100644
index 0000000000..85783081e0
--- /dev/null
+++ b/third_party/git/git-gui/lib/database.tcl
@@ -0,0 +1,115 @@
+# 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
+		}
+	}
+}