+proc addtocflist {id} {
+ global currentid treediffs cflist treepending
+ if {$id != $currentid} {
+ gettreediffs $currentid
+ return
+ }
+ foreach f $treediffs($currentid) {
+ $cflist insert end $f
+ }
+}
+
+proc gettreediffs {id} {
+ global treediffs parents treepending
+ set treepending $id
+ set treediffs($id) {}
+ set p [lindex $parents($id) 0]
+ if [catch {set gdtf [open "|git-diff-tree -r $p $id" r]}] return
+ fconfigure $gdtf -blocking 0
+ fileevent $gdtf readable "gettreediffline $gdtf $id"
+}
+
+proc gettreediffline {gdtf id} {
+ global treediffs treepending
+ set n [gets $gdtf line]
+ if {$n < 0} {
+ if {![eof $gdtf]} return
+ close $gdtf
+ unset treepending
+ addtocflist $id
+ return
+ }
+ set type [lindex $line 1]
+ set file [lindex $line 3]
+ if {$type == "blob"} {
+ lappend treediffs($id) $file
+ }
+}
+