From 27cb61ca14c05303d8aad2f17136f2e9f0c5fd2b Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Thu, 15 Feb 2007 08:54:34 +1100 Subject: [PATCH 01/11] Change git repo-config to git config This is the gitk part of e0d10e1c63bc52b37bbec99b07deee794058d9b4 from Tom Prince. Signed-off-by: Paul Mackerras --- gitk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gitk b/gitk index 031c829f26..31d0aad450 100755 --- a/gitk +++ b/gitk @@ -6193,7 +6193,7 @@ set wrcomcmd "git diff-tree --stdin -p --pretty" set gitencoding {} catch { - set gitencoding [exec git repo-config --get i18n.commitencoding] + set gitencoding [exec git config --get i18n.commitencoding] } if {$gitencoding == ""} { set gitencoding "utf-8" From 40b87ff8777a9827c544bc572d656e8a1a041a39 Mon Sep 17 00:00:00 2001 From: Mark Levedahl Date: Thu, 1 Feb 2007 08:44:46 -0500 Subject: [PATCH 02/11] [PATCH] gitk - remove trailing whitespace from a few lines. Signed-off-by: Mark Levedahl Signed-off-by: Junio C Hamano Signed-off-by: Paul Mackerras --- gitk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gitk b/gitk index 31d0aad450..650435e7d2 100755 --- a/gitk +++ b/gitk @@ -427,7 +427,7 @@ proc makewindow {} { .bar.view add separator .bar.view add radiobutton -label "All files" -command {showview 0} \ -variable selectedview -value 0 - + menu .bar.help .bar add cascade -label "Help" -menu .bar.help .bar.help add command -label "About gitk" -command about @@ -1402,7 +1402,7 @@ proc newview {ishighlight} { set newviewname($nextviewnum) "View $nextviewnum" set newviewperm($nextviewnum) 0 set newviewargs($nextviewnum) [shellarglist $revtreeargs] - vieweditor $top $nextviewnum "Gitk view definition" + vieweditor $top $nextviewnum "Gitk view definition" } proc editview {} { @@ -3897,7 +3897,7 @@ proc selectline {l isnew} { } $ctext insert end "\n" } - + set headers {} set olds [lindex $parentlist $l] if {[llength $olds] > 1} { @@ -4006,7 +4006,7 @@ proc selnextpage {dir} { set l [expr $numcommits - 1] } unmarkmatches - selectline $l 1 + selectline $l 1 } proc unselectline {} { From e9937d2a03a426b50a424927fbd0cdfbe2ac2b40 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Thu, 1 Feb 2007 08:46:38 -0500 Subject: [PATCH 03/11] [PATCH] Make gitk work reasonably well on Cygwin. The gitk gui layout was completely broken on Cygwin. If gitk was started without previous geometry in ~/.gitk, the user could drag the window sashes to get a useable layout. However, if ~/.gitk existed, this was not possible at all. The fix was to rewrite makewindow, changing the toplevel containers and the particular geometry information saved between sessions. Numerous bugs in both the Cygwin and the Linux Tk versions make this a delicate balancing act: the version here works in both but many subtle variants are competely broken in one or the other environment. Three user visible changes result: 1 - The viewer is fully functional under Cygwin. 2 - The search bar moves from the bottom to the top of the lower left pane. This was necessary to get around a layout problem on Cygwin. 3 - The window size and position is saved and restored between sessions. Again, this is necessary to get around a layout problem on Cygwin. Signed-off-by: Mark Levedahl Signed-off-by: Junio C Hamano Signed-off-by: Paul Mackerras --- gitk | 272 ++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 148 insertions(+), 124 deletions(-) diff --git a/gitk b/gitk index 650435e7d2..8132812b50 100755 --- a/gitk +++ b/gitk @@ -435,56 +435,59 @@ proc makewindow {} { .bar.help configure -font $uifont . configure -menu .bar - if {![info exists geometry(canv1)]} { - set geometry(canv1) [expr {45 * $charspc}] - set geometry(canv2) [expr {30 * $charspc}] - set geometry(canv3) [expr {15 * $charspc}] - set geometry(canvh) [expr {25 * $linespc + 4}] - set geometry(ctextw) 80 - set geometry(ctexth) 30 - set geometry(cflistw) 30 - } + # the gui has upper and lower half, parts of a paned window. panedwindow .ctop -orient vertical - if {[info exists geometry(width)]} { - .ctop conf -width $geometry(width) -height $geometry(height) - set texth [expr {$geometry(height) - $geometry(canvh) - 56}] - set geometry(ctexth) [expr {($texth - 8) / - [font metrics $textfont -linespace]}] + + # possibly use assumed geometry + if {![info exists geometry(topheight)]} { + set geometry(topheight) [expr {15 * $linespc}] + set geometry(topwidth) [expr {80 * $charspc}] + set geometry(botheight) [expr {15 * $linespc}] + set geometry(botwidth) [expr {50 * $charspc}] + set geometry(canv) [expr {40 * $charspc}] + set geometry(canv2) [expr {20 * $charspc}] + set geometry(canv3) [expr {20 * $charspc}] } - frame .ctop.top - frame .ctop.top.bar - frame .ctop.top.lbar - pack .ctop.top.lbar -side bottom -fill x - pack .ctop.top.bar -side bottom -fill x - set cscroll .ctop.top.csb - scrollbar $cscroll -command {allcanvs yview} -highlightthickness 0 - pack $cscroll -side right -fill y - panedwindow .ctop.top.clist -orient horizontal -sashpad 0 -handlesize 4 - pack .ctop.top.clist -side top -fill both -expand 1 - .ctop add .ctop.top - set canv .ctop.top.clist.canv - canvas $canv -height $geometry(canvh) -width $geometry(canv1) \ + + # the upper half will have a paned window, a scroll bar to the right, and some stuff below + frame .tf -height $geometry(topheight) -width $geometry(topwidth) + frame .tf.histframe + panedwindow .tf.histframe.pwclist -orient horizontal -sashpad 0 -handlesize 4 + + # create three canvases + set cscroll .tf.histframe.csb + set canv .tf.histframe.pwclist.canv + canvas $canv -width $geometry(canv) \ -background $bgcolor -bd 0 \ -yscrollincr $linespc -yscrollcommand "scrollcanv $cscroll" - .ctop.top.clist add $canv - set canv2 .ctop.top.clist.canv2 - canvas $canv2 -height $geometry(canvh) -width $geometry(canv2) \ + .tf.histframe.pwclist add $canv + set canv2 .tf.histframe.pwclist.canv2 + canvas $canv2 -width $geometry(canv2) \ -background $bgcolor -bd 0 -yscrollincr $linespc - .ctop.top.clist add $canv2 - set canv3 .ctop.top.clist.canv3 - canvas $canv3 -height $geometry(canvh) -width $geometry(canv3) \ + .tf.histframe.pwclist add $canv2 + set canv3 .tf.histframe.pwclist.canv3 + canvas $canv3 -width $geometry(canv3) \ -background $bgcolor -bd 0 -yscrollincr $linespc - .ctop.top.clist add $canv3 - bind .ctop.top.clist {resizeclistpanes %W %w} - lappend bglist $canv $canv2 $canv3 + .tf.histframe.pwclist add $canv3 - set sha1entry .ctop.top.bar.sha1 + # a scroll bar to rule them + scrollbar $cscroll -command {allcanvs yview} -highlightthickness 0 + pack $cscroll -side right -fill y + bind .tf.histframe.pwclist {resizeclistpanes %W %w} + lappend bglist $canv $canv2 $canv3 + pack .tf.histframe.pwclist -fill both -expand 1 -side left + + # we have two button bars at bottom of top frame. Bar 1 + frame .tf.bar + frame .tf.lbar -height 15 + + set sha1entry .tf.bar.sha1 set entries $sha1entry - set sha1but .ctop.top.bar.sha1label + set sha1but .tf.bar.sha1label button $sha1but -text "SHA1 ID: " -state disabled -relief flat \ -command gotocommit -width 8 -font $uifont $sha1but conf -disabledforeground [$sha1but cget -foreground] - pack .ctop.top.bar.sha1label -side left + pack .tf.bar.sha1label -side left entry $sha1entry -width 40 -font $textfont -textvariable sha1string trace add variable sha1string write sha1change pack $sha1entry -side left -pady 2 @@ -505,91 +508,105 @@ proc makewindow {} { 0x00, 0x38, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x00, 0x38, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x07, 0x80, 0x03, 0xc0, 0x01}; } - button .ctop.top.bar.leftbut -image bm-left -command goback \ + button .tf.bar.leftbut -image bm-left -command goback \ -state disabled -width 26 - pack .ctop.top.bar.leftbut -side left -fill y - button .ctop.top.bar.rightbut -image bm-right -command goforw \ + pack .tf.bar.leftbut -side left -fill y + button .tf.bar.rightbut -image bm-right -command goforw \ -state disabled -width 26 - pack .ctop.top.bar.rightbut -side left -fill y + pack .tf.bar.rightbut -side left -fill y - button .ctop.top.bar.findbut -text "Find" -command dofind -font $uifont - pack .ctop.top.bar.findbut -side left + button .tf.bar.findbut -text "Find" -command dofind -font $uifont + pack .tf.bar.findbut -side left set findstring {} - set fstring .ctop.top.bar.findstring + set fstring .tf.bar.findstring lappend entries $fstring entry $fstring -width 30 -font $textfont -textvariable findstring trace add variable findstring write find_change - pack $fstring -side left -expand 1 -fill x + pack $fstring -side left -expand 1 -fill x -in .tf.bar set findtype Exact - set findtypemenu [tk_optionMenu .ctop.top.bar.findtype \ - findtype Exact IgnCase Regexp] + set findtypemenu [tk_optionMenu .tf.bar.findtype \ + findtype Exact IgnCase Regexp] trace add variable findtype write find_change - .ctop.top.bar.findtype configure -font $uifont - .ctop.top.bar.findtype.menu configure -font $uifont + .tf.bar.findtype configure -font $uifont + .tf.bar.findtype.menu configure -font $uifont set findloc "All fields" - tk_optionMenu .ctop.top.bar.findloc findloc "All fields" Headline \ + tk_optionMenu .tf.bar.findloc findloc "All fields" Headline \ Comments Author Committer trace add variable findloc write find_change - .ctop.top.bar.findloc configure -font $uifont - .ctop.top.bar.findloc.menu configure -font $uifont - pack .ctop.top.bar.findloc -side right - pack .ctop.top.bar.findtype -side right + .tf.bar.findloc configure -font $uifont + .tf.bar.findloc.menu configure -font $uifont + pack .tf.bar.findloc -side right + pack .tf.bar.findtype -side right - label .ctop.top.lbar.flabel -text "Highlight: Commits " \ - -font $uifont - pack .ctop.top.lbar.flabel -side left -fill y + # build up the bottom bar of upper window + label .tf.lbar.flabel -text "Highlight: Commits " \ + -font $uifont + pack .tf.lbar.flabel -side left -fill y set gdttype "touching paths:" - set gm [tk_optionMenu .ctop.top.lbar.gdttype gdttype "touching paths:" \ - "adding/removing string:"] + set gm [tk_optionMenu .tf.lbar.gdttype gdttype "touching paths:" \ + "adding/removing string:"] trace add variable gdttype write hfiles_change $gm conf -font $uifont - .ctop.top.lbar.gdttype conf -font $uifont - pack .ctop.top.lbar.gdttype -side left -fill y - entry .ctop.top.lbar.fent -width 25 -font $textfont \ + .tf.lbar.gdttype conf -font $uifont + pack .tf.lbar.gdttype -side left -fill y + entry .tf.lbar.fent -width 25 -font $textfont \ -textvariable highlight_files trace add variable highlight_files write hfiles_change - lappend entries .ctop.top.lbar.fent - pack .ctop.top.lbar.fent -side left -fill x -expand 1 - label .ctop.top.lbar.vlabel -text " OR in view" -font $uifont - pack .ctop.top.lbar.vlabel -side left -fill y + lappend entries .tf.lbar.fent + pack .tf.lbar.fent -side left -fill x -expand 1 + label .tf.lbar.vlabel -text " OR in view" -font $uifont + pack .tf.lbar.vlabel -side left -fill y global viewhlmenu selectedhlview - set viewhlmenu [tk_optionMenu .ctop.top.lbar.vhl selectedhlview None] + set viewhlmenu [tk_optionMenu .tf.lbar.vhl selectedhlview None] $viewhlmenu entryconf None -command delvhighlight $viewhlmenu conf -font $uifont - .ctop.top.lbar.vhl conf -font $uifont - pack .ctop.top.lbar.vhl -side left -fill y - label .ctop.top.lbar.rlabel -text " OR " -font $uifont - pack .ctop.top.lbar.rlabel -side left -fill y + .tf.lbar.vhl conf -font $uifont + pack .tf.lbar.vhl -side left -fill y + label .tf.lbar.rlabel -text " OR " -font $uifont + pack .tf.lbar.rlabel -side left -fill y global highlight_related - set m [tk_optionMenu .ctop.top.lbar.relm highlight_related None \ - "Descendent" "Not descendent" "Ancestor" "Not ancestor"] + set m [tk_optionMenu .tf.lbar.relm highlight_related None \ + "Descendent" "Not descendent" "Ancestor" "Not ancestor"] $m conf -font $uifont - .ctop.top.lbar.relm conf -font $uifont + .tf.lbar.relm conf -font $uifont trace add variable highlight_related write vrel_change - pack .ctop.top.lbar.relm -side left -fill y + pack .tf.lbar.relm -side left -fill y - panedwindow .ctop.cdet -orient horizontal - .ctop add .ctop.cdet - frame .ctop.cdet.left - frame .ctop.cdet.left.bot - pack .ctop.cdet.left.bot -side bottom -fill x - button .ctop.cdet.left.bot.search -text "Search" -command dosearch \ + # Finish putting the upper half of the viewer together + pack .tf.lbar -in .tf -side bottom -fill x + pack .tf.bar -in .tf -side bottom -fill x + pack .tf.histframe -fill both -side top -expand 1 + .ctop add .tf + + # now build up the bottom + panedwindow .pwbottom -orient horizontal + + # lower left, a text box over search bar, scroll bar to the right + # if we know window height, then that will set the lower text height, otherwise + # we set lower text height which will drive window height + if {[info exists geometry(main)]} { + frame .bleft -width $geometry(botwidth) + } else { + frame .bleft -width $geometry(botwidth) -height $geometry(botheight) + } + frame .bleft.top + + button .bleft.top.search -text "Search" -command dosearch \ -font $uifont - pack .ctop.cdet.left.bot.search -side left -padx 5 - set sstring .ctop.cdet.left.bot.sstring + pack .bleft.top.search -side left -padx 5 + set sstring .bleft.top.sstring entry $sstring -width 20 -font $textfont -textvariable searchstring lappend entries $sstring trace add variable searchstring write incrsearch pack $sstring -side left -expand 1 -fill x - set ctext .ctop.cdet.left.ctext + set ctext .bleft.ctext text $ctext -background $bgcolor -foreground $fgcolor \ -state disabled -font $textfont \ - -width $geometry(ctextw) -height $geometry(ctexth) \ -yscrollcommand scrolltext -wrap none - scrollbar .ctop.cdet.left.sb -command "$ctext yview" - pack .ctop.cdet.left.sb -side right -fill y + scrollbar .bleft.sb -command "$ctext yview" + pack .bleft.top -side top -fill x + pack .bleft.sb -side right -fill y pack $ctext -side left -fill both -expand 1 - .ctop.cdet add .ctop.cdet.left lappend bglist $ctext lappend fglist $ctext @@ -620,36 +637,45 @@ proc makewindow {} { $ctext tag conf msep -font [concat $textfont bold] $ctext tag conf found -back yellow - frame .ctop.cdet.right - frame .ctop.cdet.right.mode - radiobutton .ctop.cdet.right.mode.patch -text "Patch" \ + .pwbottom add .bleft + + # lower right + frame .bright + frame .bright.mode + radiobutton .bright.mode.patch -text "Patch" \ -command reselectline -variable cmitmode -value "patch" - radiobutton .ctop.cdet.right.mode.tree -text "Tree" \ + radiobutton .bright.mode.tree -text "Tree" \ -command reselectline -variable cmitmode -value "tree" - grid .ctop.cdet.right.mode.patch .ctop.cdet.right.mode.tree -sticky ew - pack .ctop.cdet.right.mode -side top -fill x - set cflist .ctop.cdet.right.cfiles + grid .bright.mode.patch .bright.mode.tree -sticky ew + pack .bright.mode -side top -fill x + set cflist .bright.cfiles set indent [font measure $mainfont "nn"] - text $cflist -width $geometry(cflistw) \ + text $cflist \ -background $bgcolor -foreground $fgcolor \ -font $mainfont \ -tabs [list $indent [expr {2 * $indent}]] \ - -yscrollcommand ".ctop.cdet.right.sb set" \ + -yscrollcommand ".bright.sb set" \ -cursor [. cget -cursor] \ -spacing1 1 -spacing3 1 lappend bglist $cflist lappend fglist $cflist - scrollbar .ctop.cdet.right.sb -command "$cflist yview" - pack .ctop.cdet.right.sb -side right -fill y + scrollbar .bright.sb -command "$cflist yview" + pack .bright.sb -side right -fill y pack $cflist -side left -fill both -expand 1 $cflist tag configure highlight \ -background [$cflist cget -selectbackground] $cflist tag configure bold -font [concat $mainfont bold] - .ctop.cdet add .ctop.cdet.right - bind .ctop.cdet {resizecdetpanes %W %w} - pack .ctop -side top -fill both -expand 1 + .pwbottom add .bright + .ctop add .pwbottom + # restore window position if known + if {[info exists geometry(main)]} { + wm geometry . "$geometry(main)" + } + + bind .pwbottom {resizecdetpanes %W %w} + pack .ctop -fill both -expand 1 bindall <1> {selcanvline %W %x %y} #bindall {selcanvline %W %x %y} bindall "allcanvs yview scroll -5 units" @@ -802,18 +828,16 @@ proc savestuff {w} { puts $f [list set fgcolor $fgcolor] puts $f [list set colors $colors] puts $f [list set diffcolors $diffcolors] - 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}]" - puts $f "set geometry(canv2) [expr {[winfo width $canv2]-2}]" - puts $f "set geometry(canv3) [expr {[winfo width $canv3]-2}]" - puts $f "set geometry(canvh) [expr {[winfo height $canv]-2}]" - set wid [expr {([winfo width $ctext] - 8) \ - / [font measure $textfont "0"]}] - puts $f "set geometry(ctextw) $wid" - set wid [expr {([winfo width $cflist] - 11) \ - / [font measure [$cflist cget -font] "0"]}] - puts $f "set geometry(cflistw) $wid" + + puts $f "set geometry(main) [winfo geometry .]" + puts $f "set geometry(topwidth) [winfo width .tf]" + puts $f "set geometry(topheight) [winfo height .tf]" + puts $f "set geometry(canv) [expr {[winfo width $canv]-0}]" + puts $f "set geometry(canv2) [expr {[winfo width $canv2]-0}]" + puts $f "set geometry(canv3) [expr {[winfo width $canv3]-0}]" + puts $f "set geometry(botwidth) [winfo width .bleft]" + puts $f "set geometry(botheight) [winfo height .bleft]" + puts -nonewline $f "set permviews {" for {set v 0} {$v < $nextviewnum} {incr v} { if {$viewperm($v)} { @@ -4043,11 +4067,11 @@ proc addtohistory {cmd} { } incr historyindex if {$historyindex > 1} { - .ctop.top.bar.leftbut conf -state normal + .tf.bar.leftbut conf -state normal } else { - .ctop.top.bar.leftbut conf -state disabled + .tf.bar.leftbut conf -state disabled } - .ctop.top.bar.rightbut conf -state disabled + .tf.bar.rightbut conf -state disabled } proc godo {elt} { @@ -4067,10 +4091,10 @@ proc goback {} { if {$historyindex > 1} { incr historyindex -1 godo [lindex $history [expr {$historyindex - 1}]] - .ctop.top.bar.rightbut conf -state normal + .tf.bar.rightbut conf -state normal } if {$historyindex <= 1} { - .ctop.top.bar.leftbut conf -state disabled + .tf.bar.leftbut conf -state disabled } } @@ -4081,10 +4105,10 @@ proc goforw {} { set cmd [lindex $history $historyindex] incr historyindex godo $cmd - .ctop.top.bar.leftbut conf -state normal + .tf.bar.leftbut conf -state normal } if {$historyindex >= [llength $history]} { - .ctop.top.bar.rightbut conf -state disabled + .tf.bar.rightbut conf -state disabled } } @@ -4591,7 +4615,7 @@ proc searchmarkvisible {doall} { proc scrolltext {f0 f1} { global searchstring - .ctop.cdet.left.sb set $f0 $f1 + .bleft.sb set $f0 $f1 if {$searchstring ne {}} { searchmarkvisible 0 } From 7426eb74694b2f8b3909065edeec35b7a9117b35 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 29 Jan 2007 21:53:28 -0800 Subject: [PATCH 04/11] [PATCH] gitk: Use show-ref instead of ls-remote It used to be ls-remote on self was the only easy way to grab the ref information. Now we have show-ref which does not involve fork and IPC, so use it. Signed-off-by: Junio C Hamano Signed-off-by: Paul Mackerras --- gitk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gitk b/gitk index 8132812b50..1c36235bff 100755 --- a/gitk +++ b/gitk @@ -309,9 +309,9 @@ proc readrefs {} { foreach v {tagids idtags headids idheads otherrefids idotherrefs} { catch {unset $v} } - set refd [open [list | git ls-remote [gitdir]] r] + set refd [open [list | git show-ref] r] while {0 <= [set n [gets $refd line]]} { - if {![regexp {^([0-9a-f]{40}) refs/([^^]*)$} $line \ + if {![regexp {^([0-9a-f]{40}) refs/([^^]*)$} $line \ match id path]} { continue } From b6047c5a8166a71e01c6b63ebbb67c6894d95114 Mon Sep 17 00:00:00 2001 From: Mark Levedahl Date: Thu, 8 Feb 2007 22:22:24 -0500 Subject: [PATCH 05/11] Make gitk save and restore the user set window position. gitk was saving widget sizes and positions when the main window was destroyed, which is after all child widgets are destroyed. The cure is to trap the WM_DELETE_WINDOW event before the gui is torn down. Also, the saved geometry was captured using "winfo geometry .", rather than "wm geometry ." Under Linux, these two return different answers and the latter one is correct. [jc: credit goes to Brett Schwarz for suggesting the use of "wm protocol"; I also squashed the follow-up patch to remove extraneous -0 from expressions.] Signed-off-by: Mark Levedahl Signed-off-by: Junio C Hamano --- gitk | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/gitk b/gitk index 1c36235bff..df1ce8cbbd 100755 --- a/gitk +++ b/gitk @@ -725,7 +725,7 @@ proc makewindow {} { bind . {incrfont 1} bind . {incrfont -1} bind . {incrfont -1} - bind . {savestuff %W} + wm protocol . WM_DELETE_WINDOW doquit bind . "click %W" bind $fstring dofind bind $sha1entry gotocommit @@ -829,12 +829,12 @@ proc savestuff {w} { puts $f [list set colors $colors] puts $f [list set diffcolors $diffcolors] - puts $f "set geometry(main) [winfo geometry .]" + puts $f "set geometry(main) [wm geometry .]" puts $f "set geometry(topwidth) [winfo width .tf]" puts $f "set geometry(topheight) [winfo height .tf]" - puts $f "set geometry(canv) [expr {[winfo width $canv]-0}]" - puts $f "set geometry(canv2) [expr {[winfo width $canv2]-0}]" - puts $f "set geometry(canv3) [expr {[winfo width $canv3]-0}]" + puts $f "set geometry(canv) [winfo width $canv]" + puts $f "set geometry(canv2) [winfo width $canv2]" + puts $f "set geometry(canv3) [winfo width $canv3]" puts $f "set geometry(botwidth) [winfo width .bleft]" puts $f "set geometry(botheight) [winfo height .bleft]" @@ -5800,6 +5800,7 @@ proc showtag {tag isnew} { proc doquit {} { global stopped set stopped 100 + savestuff . destroy . } From 9ca72f4f60269fb6328bc9c4034d19b9479637ea Mon Sep 17 00:00:00 2001 From: Mark Levedahl Date: Mon, 12 Feb 2007 19:19:34 -0500 Subject: [PATCH 06/11] Make gitk save and restore window pane position on Linux and Cygwin. Subtle bugs remained on both Cygwin and Linux that caused the various window panes to be restored in positions different than where the user last placed them. Sergey Vlasov posed a pair of suggested fixes to this, what is done here is slightly different. The basic fix here involves a) explicitly remembering and restoring the sash positions for the upper window, and b) using paneconfigure to redundantly set height and width of other elements. This redundancy is needed as Cygwin Tcl has a nasty habit of setting pane sizes to zero if their slaves are not configured with a specific size, but Linux Tcl does not honor the specific size given. Signed-off-by: Mark Levedahl Signed-off-by: Junio C Hamano --- gitk | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/gitk b/gitk index df1ce8cbbd..9ddff3e7f7 100755 --- a/gitk +++ b/gitk @@ -439,14 +439,13 @@ proc makewindow {} { panedwindow .ctop -orient vertical # possibly use assumed geometry - if {![info exists geometry(topheight)]} { + if {![info exists geometry(pwsash0)]} { set geometry(topheight) [expr {15 * $linespc}] set geometry(topwidth) [expr {80 * $charspc}] set geometry(botheight) [expr {15 * $linespc}] set geometry(botwidth) [expr {50 * $charspc}] - set geometry(canv) [expr {40 * $charspc}] - set geometry(canv2) [expr {20 * $charspc}] - set geometry(canv3) [expr {20 * $charspc}] + set geometry(pwsash0) "[expr {40 * $charspc}] 2" + set geometry(pwsash1) "[expr {60 * $charspc}] 2" } # the upper half will have a paned window, a scroll bar to the right, and some stuff below @@ -457,18 +456,20 @@ proc makewindow {} { # create three canvases set cscroll .tf.histframe.csb set canv .tf.histframe.pwclist.canv - canvas $canv -width $geometry(canv) \ + canvas $canv \ -background $bgcolor -bd 0 \ -yscrollincr $linespc -yscrollcommand "scrollcanv $cscroll" .tf.histframe.pwclist add $canv set canv2 .tf.histframe.pwclist.canv2 - canvas $canv2 -width $geometry(canv2) \ + canvas $canv2 \ -background $bgcolor -bd 0 -yscrollincr $linespc .tf.histframe.pwclist add $canv2 set canv3 .tf.histframe.pwclist.canv3 - canvas $canv3 -width $geometry(canv3) \ + canvas $canv3 \ -background $bgcolor -bd 0 -yscrollincr $linespc .tf.histframe.pwclist add $canv3 + eval .tf.histframe.pwclist sash place 0 $geometry(pwsash0) + eval .tf.histframe.pwclist sash place 1 $geometry(pwsash1) # a scroll bar to rule them scrollbar $cscroll -command {allcanvs yview} -highlightthickness 0 @@ -577,6 +578,8 @@ proc makewindow {} { pack .tf.bar -in .tf -side bottom -fill x pack .tf.histframe -fill both -side top -expand 1 .ctop add .tf + .ctop paneconfigure .tf -height $geometry(topheight) + .ctop paneconfigure .tf -width $geometry(topwidth) # now build up the bottom panedwindow .pwbottom -orient horizontal @@ -638,6 +641,7 @@ proc makewindow {} { $ctext tag conf found -back yellow .pwbottom add .bleft + .pwbottom paneconfigure .bleft -width $geometry(botwidth) # lower right frame .bright @@ -832,9 +836,8 @@ proc savestuff {w} { puts $f "set geometry(main) [wm geometry .]" puts $f "set geometry(topwidth) [winfo width .tf]" puts $f "set geometry(topheight) [winfo height .tf]" - puts $f "set geometry(canv) [winfo width $canv]" - puts $f "set geometry(canv2) [winfo width $canv2]" - puts $f "set geometry(canv3) [winfo width $canv3]" + puts $f "set geometry(pwsash0) \"[.tf.histframe.pwclist sash coord 0]\"" + puts $f "set geometry(pwsash1) \"[.tf.histframe.pwclist sash coord 1]\"" puts $f "set geometry(botwidth) [winfo width .bleft]" puts $f "set geometry(botheight) [winfo height .bleft]" From f44213258de3fbef932f9c655213202f69dccc80 Mon Sep 17 00:00:00 2001 From: Tommi Kyntola Date: Fri, 16 Feb 2007 10:50:58 +0200 Subject: [PATCH 07/11] git-blame: prevent argument parsing segfault The 3rd branch in builtin-blame.c should also check for lacking arguments. Running that in top dir does not trigger the problem because the 'prefix' is NULL. Signed-off-by: Tommi Kyntola Signed-off-by: Junio C Hamano --- builtin-blame.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/builtin-blame.c b/builtin-blame.c index 69fc145a38..1a752b95bb 100644 --- a/builtin-blame.c +++ b/builtin-blame.c @@ -2200,6 +2200,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix) if (!strcmp(argv[j], "--")) seen_dashdash = j; if (seen_dashdash) { + /* (2) */ if (seen_dashdash + 1 != argc - 1) usage(blame_usage); path = add_prefix(prefix, argv[seen_dashdash + 1]); @@ -2208,6 +2209,8 @@ int cmd_blame(int argc, const char **argv, const char *prefix) } else { /* (3) */ + if (argc <= i) + usage(blame_usage); path = add_prefix(prefix, argv[i]); if (i + 1 == argc - 1) { final_commit_name = argv[i + 1]; From 185c975faaa790a98a4e00f124461473283500d6 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Fri, 16 Feb 2007 22:43:48 -0800 Subject: [PATCH 08/11] Do not take mode bits from index after type change. When we do not trust executable bit from lstat(2), we copied existing ce_mode bits without checking if the filesystem object is a regular file (which is the only thing we apply the "trust executable bit" business) nor if the blob in the index is a regular file (otherwise, we should do the same as registering a new regular file, which is to default non-executable). Noticed by Johannes Sixt. Signed-off-by: Junio C Hamano --- builtin-apply.c | 2 +- builtin-update-index.c | 13 +++++++------ cache.h | 10 ++++++++++ diff-lib.c | 4 +--- read-cache.c | 13 +++++++------ t/t3700-add.sh | 20 ++++++++++++++++++++ 6 files changed, 46 insertions(+), 16 deletions(-) diff --git a/builtin-apply.c b/builtin-apply.c index 3fefdacd94..abe3538715 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -1988,7 +1988,7 @@ static int check_patch(struct patch *patch, struct patch *prev_patch) return error("%s: %s", old_name, strerror(errno)); if (!cached) - st_mode = ntohl(create_ce_mode(st.st_mode)); + st_mode = ntohl(ce_mode_from_stat(ce, st.st_mode)); if (patch->is_new < 0) patch->is_new = 0; diff --git a/builtin-update-index.c b/builtin-update-index.c index 1ac613a788..772aaba7bb 100644 --- a/builtin-update-index.c +++ b/builtin-update-index.c @@ -109,16 +109,17 @@ static int add_file_to_cache(const char *path) ce->ce_flags = htons(namelen); fill_stat_cache_info(ce, &st); - ce->ce_mode = create_ce_mode(st.st_mode); - if (!trust_executable_bit) { + if (trust_executable_bit) + ce->ce_mode = create_ce_mode(st.st_mode); + else { /* If there is an existing entry, pick the mode bits * from it, otherwise assume unexecutable. */ + struct cache_entry *ent; int pos = cache_name_pos(path, namelen); - if (0 <= pos) - ce->ce_mode = active_cache[pos]->ce_mode; - else if (S_ISREG(st.st_mode)) - ce->ce_mode = create_ce_mode(S_IFREG | 0666); + + ent = (0 <= pos) ? active_cache[pos] : NULL; + ce->ce_mode = ce_mode_from_stat(ent, st.st_mode); } if (index_path(ce->sha1, path, &st, !info_only)) diff --git a/cache.h b/cache.h index c62b0b090d..04f8e63baf 100644 --- a/cache.h +++ b/cache.h @@ -106,6 +106,16 @@ static inline unsigned int create_ce_mode(unsigned int mode) return htonl(S_IFLNK); return htonl(S_IFREG | ce_permissions(mode)); } +static inline unsigned int ce_mode_from_stat(struct cache_entry *ce, unsigned int mode) +{ + extern int trust_executable_bit; + if (!trust_executable_bit && S_ISREG(mode)) { + if (ce && S_ISREG(ntohl(ce->ce_mode))) + return ce->ce_mode; + return create_ce_mode(0666); + } + return create_ce_mode(mode); +} #define canon_mode(mode) \ (S_ISREG(mode) ? (S_IFREG | ce_permissions(mode)) : \ S_ISLNK(mode) ? S_IFLNK : S_IFDIR) diff --git a/diff-lib.c b/diff-lib.c index 91cd87742f..556d5345bf 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -170,9 +170,7 @@ static int get_stat_data(struct cache_entry *ce, } changed = ce_match_stat(ce, &st, 0); if (changed) { - mode = create_ce_mode(st.st_mode); - if (!trust_executable_bit && S_ISREG(st.st_mode)) - mode = ce->ce_mode; + mode = ce_mode_from_stat(ce, st.st_mode); sha1 = no_sha1; } } diff --git a/read-cache.c b/read-cache.c index c54a611877..605b352396 100644 --- a/read-cache.c +++ b/read-cache.c @@ -344,16 +344,17 @@ int add_file_to_index(const char *path, int verbose) ce->ce_flags = htons(namelen); fill_stat_cache_info(ce, &st); - ce->ce_mode = create_ce_mode(st.st_mode); - if (!trust_executable_bit) { + if (trust_executable_bit) + ce->ce_mode = create_ce_mode(st.st_mode); + else { /* If there is an existing entry, pick the mode bits * from it, otherwise assume unexecutable. */ + struct cache_entry *ent; int pos = cache_name_pos(path, namelen); - if (pos >= 0) - ce->ce_mode = active_cache[pos]->ce_mode; - else if (S_ISREG(st.st_mode)) - ce->ce_mode = create_ce_mode(S_IFREG | 0666); + + ent = (0 <= pos) ? active_cache[pos] : NULL; + ce->ce_mode = ce_mode_from_stat(ent, st.st_mode); } if (index_path(ce->sha1, path, &st, 1)) diff --git a/t/t3700-add.sh b/t/t3700-add.sh index caaab26c2f..08e035220c 100755 --- a/t/t3700-add.sh +++ b/t/t3700-add.sh @@ -30,6 +30,16 @@ test_expect_success \ *) echo fail; git-ls-files --stage xfoo1; (exit 1);; esac' +test_expect_success 'git-add: filemode=0 should not get confused by symlink' ' + rm -f xfoo1 && + ln -s foo xfoo1 && + git-add xfoo1 && + case "`git-ls-files --stage xfoo1`" in + 120000" "*xfoo1) echo ok;; + *) echo fail; git-ls-files --stage xfoo1; (exit 1);; + esac +' + test_expect_success \ 'git-update-index --add: Test that executable bit is not used...' \ 'git config core.filemode 0 && @@ -41,6 +51,16 @@ test_expect_success \ *) echo fail; git-ls-files --stage xfoo2; (exit 1);; esac' +test_expect_success 'git-add: filemode=0 should not get confused by symlink' ' + rm -f xfoo2 && + ln -s foo xfoo2 && + git update-index --add xfoo2 && + case "`git-ls-files --stage xfoo2`" in + 120000" "*xfoo2) echo ok;; + *) echo fail; git-ls-files --stage xfoo2; (exit 1);; + esac +' + test_expect_success \ 'git-update-index --add: Test that executable bit is not used...' \ 'git config core.filemode 0 && From 5ca2db53763ed93a75de7ddbda753fc09327d7aa Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Sat, 17 Feb 2007 04:31:50 -0500 Subject: [PATCH 09/11] Attempt to improve git-rebase lead-in description. It was mentioned on #git this morning that the lead-in description of git-rebase is very confusing. Too many branch this and branch that in a very short run of text. This new description attempts to walk the user through the command syntax, while also describing exactly what git-rebase is doing to their repository. Signed-off-by: Shawn O. Pearce Signed-off-by: Junio C Hamano --- Documentation/git-rebase.txt | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index f2ef1f7dc0..a66b2d73c5 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -13,11 +13,20 @@ SYNOPSIS DESCRIPTION ----------- -git-rebase replaces with a new branch of the same name. When -the --onto option is provided the new branch starts out with a HEAD equal -to , otherwise it is equal to . It then attempts to -create a new commit for each commit from the original that does -not exist in the branch. +If is specified, git-rebase will perform an automatic +`git checkout ` before doing anything else. Otherwise +it remains on the current branch. + +All changes made by commits in the current branch but that are not +in are saved to a temporary area. This is the same set +of commits that would be shown by `git log ..HEAD`. + +The current branch is reset to , or if the +--onto option was supplied. This has the exact same effect as +`git reset --hard ` (or ). + +The commits that were previously saved into the temporary area are +then reapplied to the current branch, one by one, in order. It is possible that a merge failure will prevent this process from being completely automatic. You will have to resolve any such merge failure @@ -26,9 +35,6 @@ that caused the merge failure with `git rebase --skip`. To restore the original and remove the .dotest working files, use the command `git rebase --abort` instead. -Note that if is not specified on the command line, the currently -checked out branch is used. - Assume the following history exists and the current branch is "topic": ------------ From d7f078b8b92b1a29f9dd62c2c470fa51e15e2ffa Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Sat, 17 Feb 2007 04:43:42 -0500 Subject: [PATCH 10/11] Convert update-index references in docs to add. Since `git add` is the approved porcelain for an end-user to invoke when they want to manipulate the index, porcelain documentation should steer the user to this command rather than the pure plumbing update-index. Signed-off-by: Shawn O. Pearce Signed-off-by: Junio C Hamano --- Documentation/core-intro.txt | 3 ++- Documentation/git-checkout.txt | 7 ++++--- Documentation/git-merge.txt | 2 +- Documentation/git-rebase.txt | 2 +- Documentation/git-rerere.txt | 3 +-- Documentation/git-reset.txt | 4 ++-- Documentation/git-runstatus.txt | 2 +- Documentation/git-status.txt | 2 +- Documentation/tutorial-2.txt | 4 ++-- 9 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Documentation/core-intro.txt b/Documentation/core-intro.txt index abafefc71c..6bee448e7d 100644 --- a/Documentation/core-intro.txt +++ b/Documentation/core-intro.txt @@ -106,7 +106,8 @@ directory tree, and renaming a file does not change the object that file is associated with in any way. A blob is typically created when gitlink:git-update-index[1] -is run, and its data can be accessed by gitlink:git-cat-file[1]. +(or gitlink:git-add[1]) is run, and its data can be accessed by +gitlink:git-cat-file[1]. Tree Object ~~~~~~~~~~~ diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index e4ffde4fdd..1ae77be450 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -61,7 +61,8 @@ OPTIONS + When a merge conflict happens, the index entries for conflicting paths are left unmerged, and you need to resolve the conflicts -and mark the resolved paths with `git update-index`. +and mark the resolved paths with `git add` (or `git rm` if the merge +should result in deletion of the path). :: Name for the new branch. @@ -179,11 +180,11 @@ fatal: merge program failed At this point, `git diff` shows the changes cleanly merged as in the previous example, as well as the changes in the conflicted files. Edit and resolve the conflict and mark it resolved with -`git update-index` as usual: +`git add` as usual: + ------------ $ edit frotz -$ git update-index frotz +$ git add frotz ------------ diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt index e53ff4b4e7..9c08efa53a 100644 --- a/Documentation/git-merge.txt +++ b/Documentation/git-merge.txt @@ -136,7 +136,7 @@ After seeing a conflict, you can do two things: * Resolve the conflicts. `git-diff` would report only the conflicting paths because of the above 2. and 3.. Edit the - working tree files into a desirable shape, `git-update-index` + working tree files into a desirable shape, `git-add` or `git-rm` them, to make the index file contain what the merge result should be, and run `git-commit` to commit the result. diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index a66b2d73c5..2f417a8f85 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -148,7 +148,7 @@ file you edit, you need to tell git that the conflict has been resolved, typically this would be done with - git update-index + git add After resolving the conflict manually and updating the index with the diff --git a/Documentation/git-rerere.txt b/Documentation/git-rerere.txt index 139b6eb773..7ff9b05e68 100644 --- a/Documentation/git-rerere.txt +++ b/Documentation/git-rerere.txt @@ -163,8 +163,7 @@ If this three-way merge resolves cleanly, the result is written out to your working tree file, so you would not have to manually resolve it. Note that `git-rerere` leaves the index file alone, so you still need to do the final sanity checks with `git diff` -(or `git diff -c`) and `git update-index` when you are -satisfied. +(or `git diff -c`) and `git add` when you are satisfied. As a convenience measure, `git-merge` automatically invokes `git-rerere` when it exits with a failed automerge, which diff --git a/Documentation/git-reset.txt b/Documentation/git-reset.txt index 04475a9216..5b55cda512 100644 --- a/Documentation/git-reset.txt +++ b/Documentation/git-reset.txt @@ -94,11 +94,11 @@ current HEAD. <2> Rewind the master branch to get rid of those three commits. <3> Switch to "topic/wip" branch and keep working. -Undo update-index:: +Undo add:: + ------------ $ edit <1> -$ git-update-index frotz.c filfre.c +$ git add frotz.c filfre.c $ mailx <2> $ git reset <3> $ git pull git://info.example.com/ nitfol <4> diff --git a/Documentation/git-runstatus.txt b/Documentation/git-runstatus.txt index 89d7b92731..8bb52f4687 100644 --- a/Documentation/git-runstatus.txt +++ b/Documentation/git-runstatus.txt @@ -16,7 +16,7 @@ DESCRIPTION Examines paths in the working tree that has changes unrecorded to the index file, and changes between the index file and the current HEAD commit. The former paths are what you _could_ -commit by running 'git-update-index' before running 'git +commit by running 'git add' (or 'git rm' if you are deleting) before running 'git commit', and the latter paths are what you _would_ commit by running 'git commit'. diff --git a/Documentation/git-status.txt b/Documentation/git-status.txt index 03871e5d73..e9e193f008 100644 --- a/Documentation/git-status.txt +++ b/Documentation/git-status.txt @@ -15,7 +15,7 @@ DESCRIPTION Examines paths in the working tree that has changes unrecorded to the index file, and changes between the index file and the current HEAD commit. The former paths are what you _could_ -commit by running 'git-update-index' before running 'git +commit by running 'git add' before running 'git commit', and the latter paths are what you _would_ commit by running 'git commit'. diff --git a/Documentation/tutorial-2.txt b/Documentation/tutorial-2.txt index 8d89992712..af8d43bd12 100644 --- a/Documentation/tutorial-2.txt +++ b/Documentation/tutorial-2.txt @@ -227,7 +227,7 @@ $ git diff @@ -1 +1,2 @@ hello world! +hello world, again -$ git update-index file.txt +$ git add file.txt $ git diff ------------------------------------------------ @@ -260,7 +260,7 @@ hello world! hello world, again ------------------------------------------------ -So what our "git update-index" did was store a new blob and then put +So what our "git add" did was store a new blob and then put a reference to it in the index file. If we modify the file again, we'll see that the new modifications are reflected in the "git-diff" output: From 21b4875a51dd9aae68a1c4932d54cad9fc589401 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sat, 17 Feb 2007 15:47:46 -0800 Subject: [PATCH 11/11] Update draft release notes for 1.5.0.1 Signed-off-by: Junio C Hamano --- Documentation/RelNotes-1.5.0.1.txt | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/Documentation/RelNotes-1.5.0.1.txt b/Documentation/RelNotes-1.5.0.1.txt index 982282a899..5dff2a212d 100644 --- a/Documentation/RelNotes-1.5.0.1.txt +++ b/Documentation/RelNotes-1.5.0.1.txt @@ -7,14 +7,31 @@ Fixes since v1.5.0 * Documentation updates - Clarifications and corrections to 1.5.0 release notes. + - The main documentation did not link to git-remote documentation. + - Clarified introductory text of git-rebase documentation. + + - Converted remaining mentions of update-index on Porcelain + documents to git-add/git-rm. + * Bugfixes - git-daemon marks the listening sockets with FD_CLOEXEC so that it won't be leaked into the children. + - segfault from git-blame when the mandatory pathname + parameter was missing was fixed; usage() message is given + instead. + +* Tweaks + + - sliding mmap() inefficiently mmaped the same region of a + packfile with an access pattern that used objects in the + reverse order. This has been made more efficient. + -- -O=v1.5.0-7-g37b73cf +exec >/var/tmp/1 +O=v1.5.0-24-g460ca30 echo O=`git describe maint` -git shortlog --no-merges $O.. +git shortlog --no-merges $O..maint