Avoid command-line limits when executing git rev-parse on windows. pt/revparse
authorPat Thoyts <patthoyts@users.sourceforge.net>
Fri, 18 Sep 2009 14:03:03 +0000 (15:03 +0100)
committerPat Thoyts <patthoyts@users.sourceforge.net>
Mon, 21 Sep 2009 23:07:54 +0000 (00:07 +0100)
This patch solves the problem handling large numbers of references
reported by John Murphy that is due to limits in executing processes
in Windows by reading the rev-parse result over a pipe.

Signed-off-by: Pat Thoyts <patthoyts@users.sourceforge.net>
gitk

diff --git a/gitk b/gitk
index a0214b7004f141b7c918a5360d85f8f9e2db285c..f14ed2e49b22ff988c0d759a1271aec5a9137991 100755 (executable)
--- a/gitk
+++ b/gitk
@@ -236,13 +236,23 @@ proc parseviewargs {n arglist} {
     return $allknown
 }
 
+proc git-rev-parse {args} {
+    set ids {}
+    set pipe [open |[linsert $args 0 git rev-parse] r]
+    while {[gets $pipe line] != -1} {
+        lappend ids $line
+    }
+    close $pipe
+    return $ids
+}
+    
 proc parseviewrevs {view revs} {
     global vposids vnegids
 
     if {$revs eq {}} {
        set revs HEAD
     }
-    if {[catch {set ids [eval exec git rev-parse $revs]} err]} {
+    if {[catch {set ids [git-rev-parse $revs]} err]} {
        # we get stdout followed by stderr in $err
        # for an unknown rev, git rev-parse echoes it and then errors out
        set errlines [split $err "\n"]
@@ -273,7 +283,7 @@ proc parseviewrevs {view revs} {
     set pos {}
     set neg {}
     set sdm 0
-    foreach id [split $ids "\n"] {
+    foreach id $ids {
        if {$id eq "--gitk-symmetric-diff-marker"} {
            set sdm 4
        } elseif {[string match "^*" $id]} {