Added re-read refs command, and display all refs.
These are features requested by Junio. Any plain file under .git/refs whose contents start with 40 hex characters is taken as a reference and displayed like a head but with a light blue background (unless it is in .git/refs/tags or .git/refs/heads, in which case it is displayed as before). There is now a "Reread references" menu item in the File menu which re-reads all the plain files under .git/refs and redisplays any references that have changed.
This commit is contained in:
parent
04c13d3877
commit
f1d83ba34c
99
gitk
99
gitk
@ -281,6 +281,32 @@ proc readrefs {} {
|
||||
close $fd
|
||||
}
|
||||
}
|
||||
readotherrefs refs {} {tags heads}
|
||||
}
|
||||
|
||||
proc readotherrefs {base dname excl} {
|
||||
global otherrefids idotherrefs
|
||||
|
||||
set git [gitdir]
|
||||
set files [glob -nocomplain -types f [file join $git $base *]]
|
||||
foreach f $files {
|
||||
catch {
|
||||
set fd [open $f r]
|
||||
set line [read $fd 40]
|
||||
if {[regexp {^[0-9a-f]{40}} $line id]} {
|
||||
set name "$dname[file tail $f]"
|
||||
set otherrefids($name) $id
|
||||
lappend idotherrefs($id) $name
|
||||
}
|
||||
close $fd
|
||||
}
|
||||
}
|
||||
set dirs [glob -nocomplain -types d [file join $git $base *]]
|
||||
foreach d $dirs {
|
||||
set dir [file tail $d]
|
||||
if {[lsearch -exact $excl $dir] >= 0} continue
|
||||
readotherrefs [file join $base $dir] "$dname$dir/" {}
|
||||
}
|
||||
}
|
||||
|
||||
proc error_popup msg {
|
||||
@ -305,6 +331,7 @@ proc makewindow {} {
|
||||
menu .bar
|
||||
.bar add cascade -label "File" -menu .bar.file
|
||||
menu .bar.file
|
||||
.bar.file add command -label "Reread references" -command rereadrefs
|
||||
.bar.file add command -label "Quit" -command doquit
|
||||
menu .bar.help
|
||||
.bar add cascade -label "Help" -menu .bar.help
|
||||
@ -751,7 +778,7 @@ proc drawcommitline {level} {
|
||||
global canv canv2 canv3 mainfont namefont canvy linespc
|
||||
global lineid linehtag linentag linedtag commitinfo
|
||||
global colormap numcommits currentparents dupparents
|
||||
global idtags idline idheads
|
||||
global idtags idline idheads idotherrefs
|
||||
global lineno lthickness mainline mainlinearrow sidelines
|
||||
global commitlisted rowtextx idpos lastuse displist
|
||||
global oldnlines olddlevel olddisplist
|
||||
@ -822,7 +849,8 @@ proc drawcommitline {level} {
|
||||
}
|
||||
set rowtextx($lineno) $xt
|
||||
set idpos($id) [list $x $xt $y1]
|
||||
if {[info exists idtags($id)] || [info exists idheads($id)]} {
|
||||
if {[info exists idtags($id)] || [info exists idheads($id)]
|
||||
|| [info exists idotherrefs($id)]} {
|
||||
set xt [drawtags $id $x $xt $y1]
|
||||
}
|
||||
set headline [lindex $commitinfo($id) 0]
|
||||
@ -842,18 +870,23 @@ proc drawcommitline {level} {
|
||||
}
|
||||
|
||||
proc drawtags {id x xt y1} {
|
||||
global idtags idheads
|
||||
global idtags idheads idotherrefs
|
||||
global linespc lthickness
|
||||
global canv mainfont
|
||||
|
||||
set marks {}
|
||||
set ntags 0
|
||||
set nheads 0
|
||||
if {[info exists idtags($id)]} {
|
||||
set marks $idtags($id)
|
||||
set ntags [llength $marks]
|
||||
}
|
||||
if {[info exists idheads($id)]} {
|
||||
set marks [concat $marks $idheads($id)]
|
||||
set nheads [llength $idheads($id)]
|
||||
}
|
||||
if {[info exists idotherrefs($id)]} {
|
||||
set marks [concat $marks $idotherrefs($id)]
|
||||
}
|
||||
if {$marks eq {}} {
|
||||
return $xt
|
||||
@ -882,10 +915,15 @@ proc drawtags {id x xt y1} {
|
||||
$xr $yt $xr $yb $xl $yb $x [expr $yb - $delta] \
|
||||
-width 1 -outline black -fill yellow -tags tag.$id
|
||||
} else {
|
||||
# draw a head
|
||||
# draw a head or other ref
|
||||
if {[incr nheads -1] >= 0} {
|
||||
set col green
|
||||
} else {
|
||||
set col "#ddddff"
|
||||
}
|
||||
set xl [expr $xl - $delta/2]
|
||||
$canv create polygon $x $yt $xr $yt $xr $yb $x $yb \
|
||||
-width 1 -outline black -fill green -tags tag.$id
|
||||
-width 1 -outline black -fill $col -tags tag.$id
|
||||
}
|
||||
$canv create text $xl $y1 -anchor w -text $tag \
|
||||
-font $mainfont -tags tag.$id
|
||||
@ -3307,7 +3345,6 @@ proc mktag {} {
|
||||
|
||||
proc domktag {} {
|
||||
global mktagtop env tagids idtags
|
||||
global idpos idline linehtag canv selectedline
|
||||
|
||||
set id [$mktagtop.sha1 get]
|
||||
set tag [$mktagtop.tag get]
|
||||
@ -3332,6 +3369,13 @@ proc domktag {} {
|
||||
|
||||
set tagids($tag) $id
|
||||
lappend idtags($id) $tag
|
||||
redrawtags $id
|
||||
}
|
||||
|
||||
proc redrawtags {id} {
|
||||
global canv linehtag idline idpos selectedline
|
||||
|
||||
if {![info exists idline($id)]} return
|
||||
$canv delete tag.$id
|
||||
set xt [eval drawtags $id $idpos($id)]
|
||||
$canv coords $linehtag($idline($id)) $xt [lindex $idpos($id) 2]
|
||||
@ -3407,6 +3451,49 @@ proc wrcomcan {} {
|
||||
unset wrcomtop
|
||||
}
|
||||
|
||||
proc listrefs {id} {
|
||||
global idtags idheads idotherrefs
|
||||
|
||||
set x {}
|
||||
if {[info exists idtags($id)]} {
|
||||
set x $idtags($id)
|
||||
}
|
||||
set y {}
|
||||
if {[info exists idheads($id)]} {
|
||||
set y $idheads($id)
|
||||
}
|
||||
set z {}
|
||||
if {[info exists idotherrefs($id)]} {
|
||||
set z $idotherrefs($id)
|
||||
}
|
||||
return [list $x $y $z]
|
||||
}
|
||||
|
||||
proc rereadrefs {} {
|
||||
global idtags idheads idotherrefs
|
||||
global tagids headids otherrefids
|
||||
|
||||
set refids [concat [array names idtags] \
|
||||
[array names idheads] [array names idotherrefs]]
|
||||
foreach id $refids {
|
||||
if {![info exists ref($id)]} {
|
||||
set ref($id) [listrefs $id]
|
||||
}
|
||||
}
|
||||
foreach v {tagids idtags headids idheads otherrefids idotherrefs} {
|
||||
catch {unset $v}
|
||||
}
|
||||
readrefs
|
||||
set refids [lsort -unique [concat $refids [array names idtags] \
|
||||
[array names idheads] [array names idotherrefs]]]
|
||||
foreach id $refids {
|
||||
set v [listrefs $id]
|
||||
if {![info exists ref($id)] || $ref($id) != $v} {
|
||||
redrawtags $id
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
proc doquit {} {
|
||||
global stopped
|
||||
set stopped 100
|
||||
|
Loading…
Reference in New Issue
Block a user