From mboxrd@z Thu Jan 1 00:00:00 1970 From: Junio C Hamano Subject: Re: [PATCH] Teach parse_commit_buffer about grafting. Date: Wed, 17 Aug 2005 19:13:31 -0700 Message-ID: <7vd5ocouus.fsf@assigned-by-dhcp.cox.net> References: <7vslxw4tb1.fsf_-_@assigned-by-dhcp.cox.net> <20050818003036.C53FD353BF9@atlas.denx.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: Paul Mackerras X-From: git-owner@vger.kernel.org Thu Aug 18 04:13:45 2005 Return-path: Received: from vger.kernel.org ([209.132.176.167]) by ciao.gmane.org with esmtp (Exim 4.43) id 1E5ZuX-00034L-DV for gcvg-git@gmane.org; Thu, 18 Aug 2005 04:13:41 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932098AbVHRCNd (ORCPT ); Wed, 17 Aug 2005 22:13:33 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S932101AbVHRCNd (ORCPT ); Wed, 17 Aug 2005 22:13:33 -0400 Received: from fed1rmmtao08.cox.net ([68.230.241.31]:56823 "EHLO fed1rmmtao08.cox.net") by vger.kernel.org with ESMTP id S932098AbVHRCNd (ORCPT ); Wed, 17 Aug 2005 22:13:33 -0400 Received: from assigned-by-dhcp.cox.net ([68.4.9.127]) by fed1rmmtao08.cox.net (InterMail vM.6.01.04.00 201-2131-118-20041027) with ESMTP id <20050818021331.EAKU16890.fed1rmmtao08.cox.net@assigned-by-dhcp.cox.net>; Wed, 17 Aug 2005 22:13:31 -0400 To: Wolfgang Denk cc: git@vger.kernel.org User-Agent: Gnus/5.110004 (No Gnus v0.4) Emacs/21.4 (gnu/linux) Sender: git-owner@vger.kernel.org Precedence: bulk X-Mailing-List: git@vger.kernel.org Wolfgang Denk writes: > The display in gitk --all gets changed a bit (before the branch was > the leftmost line, now it's the rightmost one), but it's still a > dangling head, and the selected "merge point" (commit 24ee89) is > still displayed with just one parent (de180e) - I would expect to > also see d9af3c listed as parent, and the branch merging in here? > > Am I missing something? The graft info is not used by anything other than those that use parse_commit() to figure out the commit ancestry information. The list of commits that appear in the top pane of the gitk is generated by git-rev-list which knows how to do it, but the parent and child links, and the lines between nodes are drawn by gitk using the information it reads directly from the commit objects. My Tcl/Tk is really rusty, and I do not like this patch, but here is my stab at teaching the code that reads commit objects how to use grafts as well. ------------ [PATCH] Teach gitk to use grafts info Finding commits to draw is done by git-rev-list which knows how to do the grafts, but the lines between commits and the parent / child links needs to be drawn by reading from the commit objects. Teach that part of the code how to grok grafts info so that "fake" ancestry is shown sensibly in gitk. Signed-off-by: Junio C Hamano --- gitk | 36 +++++++++++++++++++++++++++++++++++- 1 files changed, 35 insertions(+), 1 deletion(-) diff --git a/gitk b/gitk --- a/gitk +++ b/gitk @@ -155,7 +155,7 @@ proc readcommit {id} { } proc parsecommit {id contents listed} { - global commitinfo children nchildren parents nparents cdate ncleft + global commitinfo children nchildren parents nparents cdate ncleft grafts set inhdr 1 set comment {} @@ -171,6 +171,23 @@ proc parsecommit {id contents listed} { } set parents($id) {} set nparents($id) 0 + set has_graft [array get grafts $id] + if {"" != $has_graft} { + set parents($id) $grafts($id) + set nparents($id) [llength $parents($id)] + foreach p $parents($id) { + if {![info exists nchildren($p)]} { + set children($p) {} + set nchildren($p) 0 + set ncleft($p) 0 + } + if {$listed && [lsearch -exact $children($p) $id] < 0} { + lappend children($p) $id + incr nchildren($p) + incr ncleft($p) + } + } + } foreach line [split $contents "\n"] { if {$inhdr} { if {$line == {}} { @@ -178,6 +195,9 @@ proc parsecommit {id contents listed} { } else { set tag [lindex $line 0] if {$tag == "parent"} { + if {"" != $has_graft} { + continue + } set p [lindex $line 1] if {![info exists nchildren($p)]} { set children($p) {} @@ -3194,6 +3214,20 @@ foreach arg $argv { set history {} set historyindex 0 +set grafts('') nothing +array unset grafts '' +if {![catch { set graft [exec cat [gitdir]/info/grafts] }]} { + global grafts + foreach line [split $graft "\n"] { + set commit [lindex $line 0] + set llen [llength $line] + set pp {} + for {set i 1} {$i < $llen} {incr i} { + lappend pp [lindex $line $i] + } + set grafts($commit) $pp + } +} set stopped 0 set redisplaying 0