git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] Teach parse_commit_buffer about grafting.

From
Junio C Hamano <junkio@cox.net>
Date
Aug 18, 2005, 02:13 UTC
Message-ID
<7vd5ocouus.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<20050818003036.C53FD353BF9@atlas.denx.de>
Wolfgang Denk <wd@denx.de> writes:
Show 7 quoted lines
> 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 <junkio@cox.net>
---
 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
Previous: Wolfgang DenkNext: Paul Mackerras
Message 12 of 17 in “Linux BKCVS kernel history git import..”
  1. Linus TorvaldsJul 26, 2005
  2. Diego CallejaJul 26, 2005
  3. A Large Angry SCMJul 26, 2005
  4. David WoodhouseJul 27, 2005
  5. Linus TorvaldsJul 27, 2005
  6. David WoodhouseJul 27, 2005
  7. Linus TorvaldsJul 27, 2005
  8. Teach parse_commit_buffer about grafting.Junio C Hamano, Jul 30, 2005
  9. Matthias UrlichsJul 30, 2005
  10. Johannes SchindelinJul 30, 2005
  11. Wolfgang DenkAug 18, 2005
  12. Junio C HamanoAug 18, 2005
  13. Paul MackerrasAug 18, 2005
  14. Linus TorvaldsAug 18, 2005
  15. Paul MackerrasAug 19, 2005
  16. Johannes SchindelinAug 19, 2005
  17. Linus TorvaldsAug 19, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.