summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 92e22ca)
raw | patch | inline | side by side (parent: 92e22ca)
author | Paul Mackerras <paulus@samba.org> | |
Sat, 26 Apr 2008 06:00:00 +0000 (16:00 +1000) | ||
committer | Paul Mackerras <paulus@samba.org> | |
Sat, 26 Apr 2008 06:00:00 +0000 (16:00 +1000) |
This moves the scanning of the argument list for each view into a
new function, parseviewargs, which is called from start_rev_list.
This also makes the date mode and the merge mode be per-view rather
than global. In merge mode, we work out the list of relevant files
in a new function called from start_rev_list, so it will be updated
on File->Reload. Plus we now do that after running the argscmd, so
if we have one and it generates a -d or --merge option they will be
correctly handled now.
The other thing this does is to make errors detected in start_rev_list
not be fatal. Now instead of doing exit 1 we just pop up and error
window and put "No commits selected" in the graph pane.
Signed-off-by: Paul Mackerras <paulus@samba.org>
new function, parseviewargs, which is called from start_rev_list.
This also makes the date mode and the merge mode be per-view rather
than global. In merge mode, we work out the list of relevant files
in a new function called from start_rev_list, so it will be updated
on File->Reload. Plus we now do that after running the argscmd, so
if we have one and it generates a -d or --merge option they will be
correctly handled now.
The other thing this does is to make errors detected in start_rev_list
not be fatal. Now instead of doing exit 1 we just pop up and error
window and put "No commits selected" in the graph pane.
Signed-off-by: Paul Mackerras <paulus@samba.org>
gitk | patch | blob | history |
index bf6eb0132ba06c5c7001970fce3e2426187d48fd..4f8397707021ff2fe7a2a13cf3c9afc181bd9e3c 100755 (executable)
--- a/gitk
+++ b/gitk
}
}
}
}
+proc unmerged_files {files} {
+ global nr_unmerged
+
+ # find the list of unmerged files
+ set mlist {}
+ set nr_unmerged 0
+ if {[catch {
+ set fd [open "| git ls-files -u" r]
+ } err]} {
+ show_error {} . "[mc "Couldn't get list of unmerged files:"] $err"
+ exit 1
+ }
+ while {[gets $fd line] >= 0} {
+ set i [string first "\t" $line]
+ if {$i < 0} continue
+ set fname [string range $line [expr {$i+1}] end]
+ if {[lsearch -exact $mlist $fname] >= 0} continue
+ incr nr_unmerged
+ if {$files eq {} || [path_filter $files $fname]} {
+ lappend mlist $fname
+ }
+ }
+ catch {close $fd}
+ return $mlist
+}
+
+proc parseviewargs {n arglist} {
+ global viewargs vdatemode vmergeonly
+
+ set vdatemode($n) 0
+ set vmergeonly($n) 0
+ set glargs {}
+ foreach arg $viewargs($n) {
+ switch -glob -- $arg {
+ "-d" -
+ "--date-order" {
+ set vdatemode($n) 1
+ }
+ "--merge" {
+ set vmergeonly($n) 1
+ lappend glargs $arg
+ }
+ default {
+ lappend glargs $arg
+ }
+ }
+ }
+ return $glargs
+}
+
# Start off a git log process and arrange to read its output
proc start_rev_list {view} {
# Start off a git log process and arrange to read its output
proc start_rev_list {view} {
- global startmsecs
- global commfd leftover tclencoding datemode
- global viewargs viewargscmd viewfiles commitidx viewcomplete
+ global startmsecs commitidx viewcomplete
+ global commfd leftover tclencoding
+ global viewargs viewargscmd vactualargs viewfiles vfilelimit
global showlocalchanges commitinterest mainheadid
global progressdirn progresscoords proglastnc curview
global showlocalchanges commitinterest mainheadid
global progressdirn progresscoords proglastnc curview
- global viewactive loginstance viewinstances
+ global viewactive loginstance viewinstances vmergeonly
global pending_select mainheadid
set startmsecs [clock clicks -milliseconds]
set commitidx($view) 0
global pending_select mainheadid
set startmsecs [clock clicks -milliseconds]
set commitidx($view) 0
- set viewcomplete($view) 0
- set viewactive($view) 1
+ # these are set this way for the error exits
+ set viewcomplete($view) 1
+ set viewactive($view) 0
varcinit $view
set args $viewargs($view)
varcinit $view
set args $viewargs($view)
set str [exec sh -c $viewargscmd($view)]
} err]} {
error_popup "Error executing --argscmd command: $err"
set str [exec sh -c $viewargscmd($view)]
} err]} {
error_popup "Error executing --argscmd command: $err"
- exit 1
+ return 0
}
set args [concat $args [split $str "\n"]]
}
}
set args [concat $args [split $str "\n"]]
}
+ set args [parseviewargs $view $args]
+ set vactualargs($view) $args
+
+ set files $viewfiles($view)
+ if {$vmergeonly($view)} {
+ set files [unmerged_files $files]
+ if {$files eq {}} {
+ global nr_unmerged
+ if {$nr_unmerged == 0} {
+ error_popup [mc "No files selected: --merge specified but\
+ no files are unmerged."]
+ } else {
+ error_popup [mc "No files selected: --merge specified but\
+ no unmerged files are within file limit."]
+ }
+ return 0
+ }
+ }
+ set vfilelimit($view) $files
+
if {[catch {
set fd [open [concat | git log --no-color -z --pretty=raw --parents \
if {[catch {
set fd [open [concat | git log --no-color -z --pretty=raw --parents \
- --boundary $args "--" $viewfiles($view)] r]
+ --boundary $args "--" $files] r]
} err]} {
error_popup "[mc "Error executing git log:"] $err"
} err]} {
error_popup "[mc "Error executing git log:"] $err"
- exit 1
+ return 0
}
set i [incr loginstance]
set viewinstances($view) [list $i]
}
set i [incr loginstance]
set viewinstances($view) [list $i]
set proglastnc 0
set pending_select $mainheadid
}
set proglastnc 0
set pending_select $mainheadid
}
+ set viewcomplete($view) 0
+ set viewactive($view) 1
+ return 1
}
proc stop_rev_list {view} {
}
proc stop_rev_list {view} {
}
proc getcommits {} {
}
proc getcommits {} {
- global canv curview need_redisplay
+ global canv curview need_redisplay viewactive
initlayout
initlayout
- start_rev_list $curview
- show_status [mc "Reading commits..."]
- set need_redisplay 1
+ if {[start_rev_list $curview]} {
+ show_status [mc "Reading commits..."]
+ set need_redisplay 1
+ } else {
+ show_status [mc "No commits selected"]
+ }
}
proc updatecommits {} {
}
proc updatecommits {} {
- global curview viewargs viewfiles viewinstances
+ global curview vactualargs vfilelimit viewinstances
global viewactive viewcomplete loginstance tclencoding mainheadid
global startmsecs commfd showneartags showlocalchanges leftover
global mainheadid pending_select
global viewactive viewcomplete loginstance tclencoding mainheadid
global startmsecs commfd showneartags showlocalchanges leftover
global mainheadid pending_select
set view $curview
if {[catch {
set fd [open [concat | git log --no-color -z --pretty=raw --parents \
set view $curview
if {[catch {
set fd [open [concat | git log --no-color -z --pretty=raw --parents \
- --boundary $viewargs($view) --not [seeds $view] \
- "--" $viewfiles($view)] r]
+ --boundary $vactualargs($view) --not [seeds $view] \
+ "--" $vfilelimit($view)] r]
} err]} {
error_popup "Error executing git log: $err"
exit 1
} err]} {
error_popup "Error executing git log: $err"
exit 1
}
proc newvarc {view id} {
}
proc newvarc {view id} {
- global varcid varctok parents children datemode
+ global varcid varctok parents children vdatemode
global vupptr vdownptr vleftptr vbackptr varcrow varcix varcstart
global commitdata commitinfo vseedcount varccommits vlastins
set a [llength $varctok($view)]
set vid $view,$id
global vupptr vdownptr vleftptr vbackptr varcrow varcix varcstart
global commitdata commitinfo vseedcount varccommits vlastins
set a [llength $varctok($view)]
set vid $view,$id
- if {[llength $children($vid)] == 0 || $datemode} {
+ if {[llength $children($vid)] == 0 || $vdatemode($view)} {
if {![info exists commitinfo($id)]} {
parsecommit $id $commitdata($id) 1
}
if {![info exists commitinfo($id)]} {
parsecommit $id $commitdata($id) 1
}
proc renumbervarc {a v} {
global parents children varctok varcstart varccommits
proc renumbervarc {a v} {
global parents children varctok varcstart varccommits
- global vupptr vdownptr vleftptr vbackptr vlastins varcid vtokmod datemode
+ global vupptr vdownptr vleftptr vbackptr vlastins varcid vtokmod vdatemode
set t1 [clock clicks -milliseconds]
set todo {}
set t1 [clock clicks -milliseconds]
set todo {}
$children($v,$id)]
}
set oldtok [lindex $varctok($v) $a]
$children($v,$id)]
}
set oldtok [lindex $varctok($v) $a]
- if {!$datemode} {
+ if {!$vdatemode($v)} {
set tok {}
} else {
set tok $oldtok
set tok {}
} else {
set tok $oldtok
proc getcommitlines {fd inst view updating} {
global cmitlisted commitinterest leftover
proc getcommitlines {fd inst view updating} {
global cmitlisted commitinterest leftover
- global commitidx commitdata datemode
+ global commitidx commitdata vdatemode
global parents children curview hlview
global idpending ordertok
global parents children curview hlview
global idpending ordertok
- global varccommits varcid varctok vtokmod viewfiles
+ global varccommits varcid varctok vtokmod vfilelimit
set stuff [read $fd 500000]
# git log doesn't terminate the last commit with a null...
set stuff [read $fd 500000]
# git log doesn't terminate the last commit with a null...
set vid $view,$id
if {!$listed && $updating && ![info exists varcid($vid)] &&
set vid $view,$id
if {!$listed && $updating && ![info exists varcid($vid)] &&
- $viewfiles($view) ne {}} {
+ $vfilelimit($view) ne {}} {
# git log doesn't rewrite parents for unlisted commits
# when doing path limiting, so work around that here
# by working out the rewritten parent with git rev-list
# git log doesn't rewrite parents for unlisted commits
# when doing path limiting, so work around that here
# by working out the rewritten parent with git rev-list
# parent as a substitute parent for $id's children.
if {![catch {
set rwid [exec git rev-list --first-parent --max-count=1 \
# parent as a substitute parent for $id's children.
if {![catch {
set rwid [exec git rev-list --first-parent --max-count=1 \
- $id -- $viewfiles($view)]
+ $id -- $vfilelimit($view)]
}]} {
if {$rwid ne {} && [info exists varcid($view,$rwid)]} {
# use $rwid in place of $id
}]} {
if {$rwid ne {} && [info exists varcid($view,$rwid)]} {
# use $rwid in place of $id
} elseif {$a == 0 && [llength $children($vid)] == 1} {
set k [lindex $children($vid) 0]
if {[llength $parents($view,$k)] == 1 &&
} elseif {$a == 0 && [llength $children($vid)] == 1} {
set k [lindex $children($vid) 0]
if {[llength $parents($view,$k)] == 1 &&
- (!$datemode ||
+ (!$vdatemode($view) ||
$varcid($view,$k) == [llength $varctok($view)] - 1)} {
set a $varcid($view,$k)
}
$varcid($view,$k) == [llength $varctok($view)] - 1)} {
set a $varcid($view,$k)
}
}
proc showview {n} {
}
proc showview {n} {
- global curview viewfiles cached_commitrow ordertok
+ global curview cached_commitrow ordertok
global displayorder parentlist rowidlist rowisopt rowfinal
global colormap rowtextx nextcolor canvxmax
global numcommits viewcomplete
global displayorder parentlist rowidlist rowisopt rowfinal
global colormap rowtextx nextcolor canvxmax
global numcommits viewcomplete
global diffids
global parents
global diffcontext
global diffids
global parents
global diffcontext
- global limitdiffs viewfiles curview
+ global limitdiffs vfilelimit curview
set diffmergeid $id
set diffids $id
# this doesn't seem to actually affect anything...
set cmd [concat | git diff-tree --no-commit-id --cc -U$diffcontext $id]
set diffmergeid $id
set diffids $id
# this doesn't seem to actually affect anything...
set cmd [concat | git diff-tree --no-commit-id --cc -U$diffcontext $id]
- if {$limitdiffs && $viewfiles($curview) ne {}} {
- set cmd [concat $cmd -- $viewfiles($curview)]
+ if {$limitdiffs && $vfilelimit($curview) ne {}} {
+ set cmd [concat $cmd -- $vfilelimit($curview)]
}
if {[catch {set mdf [open $cmd r]} err]} {
error_popup "[mc "Error getting merge diffs:"] $err"
}
if {[catch {set mdf [open $cmd r]} err]} {
error_popup "[mc "Error getting merge diffs:"] $err"
proc gettreediffline {gdtf ids} {
global treediff treediffs treepending diffids diffmergeid
proc gettreediffline {gdtf ids} {
global treediff treediffs treepending diffids diffmergeid
- global cmitmode viewfiles curview limitdiffs
+ global cmitmode vfilelimit curview limitdiffs
set nr 0
while {[incr nr] <= 1000 && [gets $gdtf line] >= 0} {
set nr 0
while {[incr nr] <= 1000 && [gets $gdtf line] >= 0} {
return [expr {$nr >= 1000? 2: 1}]
}
close $gdtf
return [expr {$nr >= 1000? 2: 1}]
}
close $gdtf
- if {$limitdiffs && $viewfiles($curview) ne {}} {
+ if {$limitdiffs && $vfilelimit($curview) ne {}} {
set flist {}
foreach f $treediff {
set flist {}
foreach f $treediff {
- if {[path_filter $viewfiles($curview) $f]} {
+ if {[path_filter $vfilelimit($curview) $f]} {
lappend flist $f
}
}
lappend flist $f
}
}
global diffinhdr treediffs
global diffcontext
global ignorespace
global diffinhdr treediffs
global diffcontext
global ignorespace
- global limitdiffs viewfiles curview
+ global limitdiffs vfilelimit curview
set cmd [diffcmd $ids "-p -C --no-commit-id -U$diffcontext"]
if {$ignorespace} {
append cmd " -w"
}
set cmd [diffcmd $ids "-p -C --no-commit-id -U$diffcontext"]
if {$ignorespace} {
append cmd " -w"
}
- if {$limitdiffs && $viewfiles($curview) ne {}} {
- set cmd [concat $cmd -- $viewfiles($curview)]
+ if {$limitdiffs && $vfilelimit($curview) ne {}} {
+ set cmd [concat $cmd -- $vfilelimit($curview)]
}
if {[catch {set bdf [open $cmd r]} err]} {
puts "error getting diffs: $err"
}
if {[catch {set bdf [open $cmd r]} err]} {
puts "error getting diffs: $err"
}
# defaults...
}
# defaults...
-set datemode 0
set wrcomcmd "git diff-tree --stdin -p --pretty"
set gitencoding {}
set wrcomcmd "git diff-tree --stdin -p --pretty"
set gitencoding {}
exit 1
}
exit 1
}
-set mergeonly 0
set revtreeargs {}
set cmdline_files {}
set i 0
set revtreeargs {}
set cmdline_files {}
set i 0
foreach arg $argv {
switch -glob -- $arg {
"" { }
foreach arg $argv {
switch -glob -- $arg {
"" { }
- "-d" { set datemode 1 }
- "--merge" {
- set mergeonly 1
- lappend revtreeargs $arg
- }
"--" {
set cmdline_files [lrange $argv [expr {$i + 1}] end]
break
"--" {
set cmdline_files [lrange $argv [expr {$i + 1}] end]
break
}
if {$i >= [llength $argv] && $revtreeargs ne {}} {
}
if {$i >= [llength $argv] && $revtreeargs ne {}} {
- # no -- on command line, but some arguments (other than -d)
+ # no -- on command line, but some arguments (other than --argscmd)
if {[catch {
set f [eval exec git rev-parse --no-revs --no-flags $revtreeargs]
set cmdline_files [split $f "\n"]
if {[catch {
set f [eval exec git rev-parse --no-revs --no-flags $revtreeargs]
set cmdline_files [split $f "\n"]
}
}
}
}
-if {$mergeonly} {
- # find the list of unmerged files
- set mlist {}
- set nr_unmerged 0
- if {[catch {
- set fd [open "| git ls-files -u" r]
- } err]} {
- show_error {} . "[mc "Couldn't get list of unmerged files:"] $err"
- exit 1
- }
- while {[gets $fd line] >= 0} {
- set i [string first "\t" $line]
- if {$i < 0} continue
- set fname [string range $line [expr {$i+1}] end]
- if {[lsearch -exact $mlist $fname] >= 0} continue
- incr nr_unmerged
- if {$cmdline_files eq {} || [path_filter $cmdline_files $fname]} {
- lappend mlist $fname
- }
- }
- catch {close $fd}
- if {$mlist eq {}} {
- if {$nr_unmerged == 0} {
- show_error {} . [mc "No files selected: --merge specified but\
- no files are unmerged."]
- } else {
- show_error {} . [mc "No files selected: --merge specified but\
- no unmerged files are within file limit."]
- }
- exit 1
- }
- set cmdline_files $mlist
-}
-
set nullid "0000000000000000000000000000000000000000"
set nullid2 "0000000000000000000000000000000000000001"
set nullid "0000000000000000000000000000000000000000"
set nullid2 "0000000000000000000000000000000000000001"
set viewargs(1) $revtreeargs
set viewargscmd(1) $revtreeargscmd
set viewperm(1) 0
set viewargs(1) $revtreeargs
set viewargscmd(1) $revtreeargscmd
set viewperm(1) 0
+ set vdatemode(1) 0
addviewmenu 1
.bar.view entryconf [mc "Edit view..."] -state normal
.bar.view entryconf [mc "Delete view"] -state normal
addviewmenu 1
.bar.view entryconf [mc "Edit view..."] -state normal
.bar.view entryconf [mc "Delete view"] -state normal