Merge with master to pick up gitk updates.
This commit is contained in:
commit
99b25f0f36
@ -88,13 +88,13 @@ esac
|
||||
case "$all,$#" in
|
||||
t,*)
|
||||
git-diff-files --name-only -z |
|
||||
xargs -0 git-update-cache -q --
|
||||
xargs -0 git-update-cache -q --remove --
|
||||
;;
|
||||
,0)
|
||||
;;
|
||||
*)
|
||||
git-diff-files --name-only -z "$@" |
|
||||
xargs -0 git-update-cache -q --
|
||||
xargs -0 git-update-cache -q --remove --
|
||||
;;
|
||||
esac || exit 1
|
||||
git-update-cache -q --refresh || exit 1
|
||||
|
206
gitk
206
gitk
@ -238,7 +238,8 @@ proc parsecommit {id contents listed olds} {
|
||||
}
|
||||
|
||||
proc readrefs {} {
|
||||
global tagids idtags headids idheads
|
||||
global tagids idtags headids idheads tagcontents
|
||||
|
||||
set tags [glob -nocomplain -types f [gitdir]/refs/tags/*]
|
||||
foreach f $tags {
|
||||
catch {
|
||||
@ -248,7 +249,8 @@ proc readrefs {} {
|
||||
set direct [file tail $f]
|
||||
set tagids($direct) $id
|
||||
lappend idtags($id) $direct
|
||||
set contents [split [exec git-cat-file tag $id] "\n"]
|
||||
set tagblob [exec git-cat-file tag $id]
|
||||
set contents [split $tagblob "\n"]
|
||||
set obj {}
|
||||
set type {}
|
||||
set tag {}
|
||||
@ -263,6 +265,7 @@ proc readrefs {} {
|
||||
if {$obj != {} && $type == "commit" && $tag != {}} {
|
||||
set tagids($tag) $obj
|
||||
lappend idtags($obj) $tag
|
||||
set tagcontents($tag) $tagblob
|
||||
}
|
||||
}
|
||||
close $fd
|
||||
@ -281,6 +284,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 +334,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
|
||||
@ -528,6 +558,7 @@ proc click {w} {
|
||||
proc savestuff {w} {
|
||||
global canv canv2 canv3 ctext cflist mainfont textfont
|
||||
global stuffsaved findmergefiles gaudydiff maxgraphpct
|
||||
global maxwidth
|
||||
|
||||
if {$stuffsaved} return
|
||||
if {![winfo viewable .]} return
|
||||
@ -538,6 +569,7 @@ proc savestuff {w} {
|
||||
puts $f [list set findmergefiles $findmergefiles]
|
||||
puts $f [list set gaudydiff $gaudydiff]
|
||||
puts $f [list set maxgraphpct $maxgraphpct]
|
||||
puts $f [list set maxwidth $maxwidth]
|
||||
puts $f "set geometry(width) [winfo width .ctop]"
|
||||
puts $f "set geometry(height) [winfo height .ctop]"
|
||||
puts $f "set geometry(canv1) [expr [winfo width $canv]-2]"
|
||||
@ -749,7 +781,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
|
||||
@ -820,7 +852,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]
|
||||
@ -840,18 +873,23 @@ proc drawcommitline {level} {
|
||||
}
|
||||
|
||||
proc drawtags {id x xt y1} {
|
||||
global idtags idheads
|
||||
global idtags idheads idotherrefs
|
||||
global linespc lthickness
|
||||
global canv mainfont
|
||||
global canv mainfont idline rowtextx
|
||||
|
||||
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
|
||||
@ -876,17 +914,27 @@ proc drawtags {id x xt y1} {
|
||||
set xr [expr $x + $delta + $wid + $lthickness]
|
||||
if {[incr ntags -1] >= 0} {
|
||||
# draw a tag
|
||||
$canv create polygon $x [expr $yt + $delta] $xl $yt\
|
||||
$xr $yt $xr $yb $xl $yb $x [expr $yb - $delta] \
|
||||
-width 1 -outline black -fill yellow -tags tag.$id
|
||||
set t [$canv create polygon $x [expr $yt + $delta] $xl $yt \
|
||||
$xr $yt $xr $yb $xl $yb $x [expr $yb - $delta] \
|
||||
-width 1 -outline black -fill yellow -tags tag.$id]
|
||||
$canv bind $t <1> [list showtag $tag 1]
|
||||
set rowtextx($idline($id)) [expr {$xr + $linespc}]
|
||||
} 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
|
||||
}
|
||||
set t [$canv create text $xl $y1 -anchor w -text $tag \
|
||||
-font $mainfont -tags tag.$id]
|
||||
if {$ntags >= 0} {
|
||||
$canv bind $t <1> [list showtag $tag 1]
|
||||
}
|
||||
$canv create text $xl $y1 -anchor w -text $tag \
|
||||
-font $mainfont -tags tag.$id
|
||||
}
|
||||
return $xt
|
||||
}
|
||||
@ -1019,6 +1067,7 @@ proc drawslants {id needonscreen nohs} {
|
||||
}
|
||||
if {$onscreen($id) == 0} {
|
||||
lappend displist $id
|
||||
set onscreen($id) 1
|
||||
}
|
||||
|
||||
# remove the null entry if present
|
||||
@ -1186,15 +1235,10 @@ proc drawslants {id needonscreen nohs} {
|
||||
set j [lsearch -exact $displist $id]
|
||||
}
|
||||
if {$j != $i || $xspc1($lineno) != $xspc1($lj)
|
||||
|| ($olddlevel <= $i && $i <= $dlevel)
|
||||
|| ($dlevel <= $i && $i <= $olddlevel)} {
|
||||
|| ($olddlevel < $i && $i < $dlevel)
|
||||
|| ($dlevel < $i && $i < $olddlevel)} {
|
||||
set xj [xcoord $j $dlevel $lj]
|
||||
set dx [expr {abs($xi - $xj)}]
|
||||
set yb $y2
|
||||
if {0 && $dx < $linespc} {
|
||||
set yb [expr {$y1 + $dx}]
|
||||
}
|
||||
lappend mainline($id) $xi $y1 $xj $yb
|
||||
lappend mainline($id) $xi $y1 $xj $y2
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1460,7 +1504,7 @@ proc drawrest {} {
|
||||
global phase stopped redisplaying selectedline
|
||||
global datemode todo displayorder
|
||||
global numcommits ncmupdate
|
||||
global nextupdate startmsecs idline
|
||||
global nextupdate startmsecs
|
||||
|
||||
set level [decidenext]
|
||||
if {$level >= 0} {
|
||||
@ -1982,12 +2026,37 @@ proc commit_descriptor {p} {
|
||||
return "$p ($l)"
|
||||
}
|
||||
|
||||
# append some text to the ctext widget, and make any SHA1 ID
|
||||
# that we know about be a clickable link.
|
||||
proc appendwithlinks {text} {
|
||||
global ctext idline linknum
|
||||
|
||||
set start [$ctext index "end - 1c"]
|
||||
$ctext insert end $text
|
||||
$ctext insert end "\n"
|
||||
set links [regexp -indices -all -inline {[0-9a-f]{40}} $text]
|
||||
foreach l $links {
|
||||
set s [lindex $l 0]
|
||||
set e [lindex $l 1]
|
||||
set linkid [string range $text $s $e]
|
||||
if {![info exists idline($linkid)]} continue
|
||||
incr e
|
||||
$ctext tag add link "$start + $s c" "$start + $e c"
|
||||
$ctext tag add link$linknum "$start + $s c" "$start + $e c"
|
||||
$ctext tag bind link$linknum <1> [list selectline $idline($linkid) 1]
|
||||
incr linknum
|
||||
}
|
||||
$ctext tag conf link -foreground blue -underline 1
|
||||
$ctext tag bind link <Enter> { %W configure -cursor hand2 }
|
||||
$ctext tag bind link <Leave> { %W configure -cursor $curtextcursor }
|
||||
}
|
||||
|
||||
proc selectline {l isnew} {
|
||||
global canv canv2 canv3 ctext commitinfo selectedline
|
||||
global lineid linehtag linentag linedtag
|
||||
global canvy0 linespc parents nparents children
|
||||
global cflist currentid sha1entry
|
||||
global commentend idtags idline
|
||||
global commentend idtags idline linknum
|
||||
|
||||
$canv delete hover
|
||||
if {![info exists lineid($l)] || ![info exists linehtag($l)]} return
|
||||
@ -2053,6 +2122,7 @@ proc selectline {l isnew} {
|
||||
|
||||
$ctext conf -state normal
|
||||
$ctext delete 0.0 end
|
||||
set linknum 0
|
||||
$ctext mark set fmark.0 0.0
|
||||
$ctext mark gravity fmark.0 left
|
||||
set info $commitinfo($id)
|
||||
@ -2066,7 +2136,6 @@ proc selectline {l isnew} {
|
||||
$ctext insert end "\n"
|
||||
}
|
||||
|
||||
set commentstart [$ctext index "end - 1c"]
|
||||
set comment {}
|
||||
if {[info exists parents($id)]} {
|
||||
foreach p $parents($id) {
|
||||
@ -2080,26 +2149,9 @@ proc selectline {l isnew} {
|
||||
}
|
||||
append comment "\n"
|
||||
append comment [lindex $info 5]
|
||||
$ctext insert end $comment
|
||||
$ctext insert end "\n"
|
||||
|
||||
# make anything that looks like a SHA1 ID be a clickable link
|
||||
set links [regexp -indices -all -inline {[0-9a-f]{40}} $comment]
|
||||
set i 0
|
||||
foreach l $links {
|
||||
set s [lindex $l 0]
|
||||
set e [lindex $l 1]
|
||||
set linkid [string range $comment $s $e]
|
||||
if {![info exists idline($linkid)]} continue
|
||||
incr e
|
||||
$ctext tag add link "$commentstart + $s c" "$commentstart + $e c"
|
||||
$ctext tag add link$i "$commentstart + $s c" "$commentstart + $e c"
|
||||
$ctext tag bind link$i <1> [list selectline $idline($linkid) 1]
|
||||
incr i
|
||||
}
|
||||
$ctext tag conf link -foreground blue -underline 1
|
||||
$ctext tag bind link <Enter> { %W configure -cursor hand2 }
|
||||
$ctext tag bind link <Leave> { %W configure -cursor $curtextcursor }
|
||||
appendwithlinks $comment
|
||||
|
||||
$ctext tag delete Comments
|
||||
$ctext tag remove found 1.0 end
|
||||
@ -3309,7 +3361,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]
|
||||
@ -3334,6 +3385,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]
|
||||
@ -3409,6 +3467,68 @@ 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 showtag {tag isnew} {
|
||||
global ctext cflist tagcontents tagids linknum
|
||||
|
||||
if {$isnew} {
|
||||
addtohistory [list showtag $tag 0]
|
||||
}
|
||||
$ctext conf -state normal
|
||||
$ctext delete 0.0 end
|
||||
set linknum 0
|
||||
if {[info exists tagcontents($tag)]} {
|
||||
set text $tagcontents($tag)
|
||||
} else {
|
||||
set text "Tag: $tag\nId: $tagids($tag)"
|
||||
}
|
||||
appendwithlinks $text
|
||||
$ctext conf -state disabled
|
||||
$cflist delete 0 end
|
||||
}
|
||||
|
||||
proc doquit {} {
|
||||
global stopped
|
||||
set stopped 100
|
||||
|
Loading…
Reference in New Issue
Block a user