#!/bin/sh
# Tcl ignores the next line -*- tcl -*- \
exec wish "$0" -- "$@"

# Copyright © 2005-2016 Paul Mackerras.  All rights reserved.
# This program is free software; it may be used, copied, modified
# and distributed under the terms of the GNU General Public Licence,
# either version 2, or (at your option) any later version.

if {[catch {package require Tcl 8.6-8.8} err]} {
    catch {wm withdraw .}
    tk_messageBox \
        -icon error \
        -type ok \
        -title "gitk: fatal error" \
        -message $err
    exit 1
}

set MIN_GIT_VERSION 2.20
regexp {^git version ([\d.]*\d)} [exec git version] _ git_version
if {[package vcompare $git_version $MIN_GIT_VERSION] < 0} {
    set message "The git executable found is too old.
The minimum required version is $MIN_GIT_VERSION.0.
The version of git found is $git_version."

    catch {wm withdraw .}
    tk_messageBox \
        -icon error \
        -type ok \
        -title "gitk: fatal error" \
        -message $message
    exit 1
}

######################################################################
##
## Enabling platform-specific code paths

proc is_Windows {} {
    if {$::tcl_platform(platform) eq {windows}} {
        return 1
    }
    return 0
}

######################################################################
##
## PATH lookup

if {[is_Windows]} {
    set _search_path {}
    proc _which {what args} {
        global env _search_path

        if {$_search_path eq {}} {
            set gitguidir [file dirname [info script]]
            regsub -all ";" $gitguidir "\\;" gitguidir
            set env(PATH) "$gitguidir;$env(PATH)"
            set _search_path [split $env(PATH) {;}]
            # Skip empty `PATH` elements
            set _search_path [lsearch -all -inline -not -exact \
                $_search_path ""]
        }

        if {[lsearch -exact $args -script] >= 0} {
            set suffix {}
        } else {
            set suffix .exe
        }

        foreach p $_search_path {
            set p [file join $p $what$suffix]
            if {[file exists $p]} {
                return [file normalize $p]
            }
        }
        return {}
    }

    proc sanitize_command_line {command_line from_index} {
        set i $from_index
        while {$i < [llength $command_line]} {
            set cmd [lindex $command_line $i]
            if {[llength [file split $cmd]] < 2} {
                set fullpath [_which $cmd]
                if {$fullpath eq ""} {
                    throw {NOT-FOUND} "$cmd not found in PATH"
                }
                lset command_line $i $fullpath
            }

            # handle piped commands, e.g. `exec A | B`
            for {incr i} {$i < [llength $command_line]} {incr i} {
                if {[lindex $command_line $i] eq "|"} {
                    incr i
                    break
                }
            }
        }
        return $command_line
    }

    # Override `exec` to avoid unsafe PATH lookup

    rename exec real_exec

    proc exec {args} {
        # skip options
        for {set i 0} {$i < [llength $args]} {incr i} {
            set arg [lindex $args $i]
            if {$arg eq "--"} {
                incr i
                break
            }
            if {[string range $arg 0 0] ne "-"} {
                break
            }
        }
        set args [sanitize_command_line $args $i]
        uplevel 1 real_exec $args
    }

    # Override `open` to avoid unsafe PATH lookup

    rename open real_open

    proc open {args} {
        set arg0 [lindex $args 0]
        if {[string range $arg0 0 0] eq "|"} {
            set command_line [string trim [string range $arg0 1 end]]
            lset args 0 "| [sanitize_command_line $command_line 0]"
        }
        uplevel 1 real_open $args
    }
}

# End of safe PATH lookup stuff

# Wrap exec/open to sanitize arguments

# unsafe arguments begin with redirections or the pipe or background operators
proc is_arg_unsafe {arg} {
    regexp {^([<|>&]|2>)} $arg
}

proc make_arg_safe {arg} {
    if {[is_arg_unsafe $arg]} {
        set arg [file join . $arg]
    }
    return $arg
}

proc make_arglist_safe {arglist} {
    set res {}
    foreach arg $arglist {
        lappend res [make_arg_safe $arg]
    }
    return $res
}

# executes one command
# no redirections or pipelines are possible
# cmd is a list that specifies the command and its arguments
# calls `exec` and returns its value
proc safe_exec {cmd} {
    eval exec [make_arglist_safe $cmd]
}

# executes one command with redirections
# no pipelines are possible
# cmd is a list that specifies the command and its arguments
# redir is a list that specifies redirections (output, background, constant(!) commands)
# calls `exec` and returns its value
proc safe_exec_redirect {cmd redir} {
    eval exec [make_arglist_safe $cmd] $redir
}

proc safe_open_file {filename flags} {
    # a file name starting with "|" would attempt to run a process
    # but such a file name must be treated as a relative path
    # hide the "|" behind "./"
    if {[string index $filename 0] eq "|"} {
        set filename [file join . $filename]
    }
    open $filename $flags
}

# opens a command pipeline for reading
# cmd is a list that specifies the command and its arguments
# calls `open` and returns the file id
proc safe_open_command {cmd} {
    open |[make_arglist_safe $cmd] r
}

# opens a command pipeline for reading and writing
# cmd is a list that specifies the command and its arguments
# calls `open` and returns the file id
proc safe_open_command_rw {cmd} {
    open |[make_arglist_safe $cmd] r+
}

# opens a command pipeline for reading with redirections
# cmd is a list that specifies the command and its arguments
# redir is a list that specifies redirections
# calls `open` and returns the file id
proc safe_open_command_redirect {cmd redir} {
    set cmd [make_arglist_safe $cmd]
    open |[concat $cmd $redir] r
}

# opens a pipeline with several commands for reading
# cmds is a list of lists, each of which specifies a command and its arguments
# calls `open` and returns the file id
proc safe_open_pipeline {cmds} {
    set cmd {}
    foreach subcmd $cmds {
        set cmd [concat $cmd | [make_arglist_safe $subcmd]]
    }
    open $cmd r
}

# End exec/open wrappers

proc hasworktree {} {
    return [expr {[exec git rev-parse --is-bare-repository] == "false" &&
                  [exec git rev-parse --is-inside-git-dir] == "false"}]
}

proc reponame {} {
    global gitdir
    set n [file normalize $gitdir]
    if {[string match "*/.git" $n]} {
        set n [string range $n 0 end-5]
    }
    return [file tail $n]
}

proc gitworktree {} {
    variable _gitworktree
    if {[info exists _gitworktree]} {
        return $_gitworktree
    }
    # v1.7.0 introduced --show-toplevel to return the canonical work-tree
    if {[catch {set _gitworktree [exec git rev-parse --show-toplevel]}]} {
        # try to set work tree from environment, core.worktree or use
        # cdup to obtain a relative path to the top of the worktree. If
        # run from the top, the ./ prefix ensures normalize expands pwd.
        if {[catch { set _gitworktree $env(GIT_WORK_TREE) }]} {
            if {[catch {set _gitworktree [exec git config --get core.worktree]}]} {
                set _gitworktree [file normalize ./[exec git rev-parse --show-cdup]]
            }
        }
    }
    return $_gitworktree
}

# A simple scheduler for compute-intensive stuff.
# The aim is to make sure that event handlers for GUI actions can
# run at least every 50-100 ms.  Unfortunately fileevent handlers are
# run before X event handlers, so reading from a fast source can
# make the GUI completely unresponsive.
proc run args {
    global isonrunq runq currunq

    set script $args
    if {[info exists isonrunq($script)]} return
    if {$runq eq {} && ![info exists currunq]} {
        after idle dorunq
    }
    lappend runq [list {} $script]
    set isonrunq($script) 1
}

proc filerun {fd script} {
    fileevent $fd readable [list filereadable $fd $script]
}

proc filereadable {fd script} {
    global runq currunq

    fileevent $fd readable {}
    if {$runq eq {} && ![info exists currunq]} {
        after idle dorunq
    }
    lappend runq [list $fd $script]
}

proc nukefile {fd} {
    global runq

    for {set i 0} {$i < [llength $runq]} {} {
        if {[lindex $runq $i 0] eq $fd} {
            set runq [lreplace $runq $i $i]
        } else {
            incr i
        }
    }
}

proc dorunq {} {
    global isonrunq runq currunq

    set tstart [clock clicks -milliseconds]
    set t0 $tstart
    while {[llength $runq] > 0} {
        set fd [lindex $runq 0 0]
        set script [lindex $runq 0 1]
        set currunq [lindex $runq 0]
        set runq [lrange $runq 1 end]
        set repeat [eval $script]
        unset currunq
        set t1 [clock clicks -milliseconds]
        set t [expr {$t1 - $t0}]
        if {$repeat ne {} && $repeat} {
            if {$fd eq {} || $repeat == 2} {
                # script returns 1 if it wants to be readded
                # file readers return 2 if they could do more straight away
                lappend runq [list $fd $script]
            } else {
                fileevent $fd readable [list filereadable $fd $script]
            }
        } elseif {$fd eq {}} {
            unset isonrunq($script)
        }
        set t0 $t1
        if {$t1 - $tstart >= 80} break
    }
    if {$runq ne {}} {
        after idle dorunq
    }
}

proc reg_instance {fd} {
    global commfd leftover loginstance

    set i [incr loginstance]
    set commfd($i) $fd
    set leftover($i) {}
    return $i
}

proc unmerged_files {files} {
    global nr_unmerged

    # find the list of unmerged files
    set mlist {}
    set nr_unmerged 0
    if {[catch {
        set fd [safe_open_command {git ls-files -u}]
    } 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 vdatemode vmergeonly vflags vdflags vrevs vfiltered vorigargs env
    global vinlinediff
    global worddiff

    set vdatemode($n) 0
    set vmergeonly($n) 0
    set vinlinediff($n) 0
    set glflags {}
    set diffargs {}
    set nextisval 0
    set revargs {}
    set origargs $arglist
    set allknown 1
    set filtered 0
    set i -1
    foreach arg $arglist {
        incr i
        if {$nextisval} {
            lappend glflags $arg
            set nextisval 0
            continue
        }
        switch -glob -- $arg {
            "-d" -
            "--date-order" {
                set vdatemode($n) 1
                # remove from origargs in case we hit an unknown option
                set origargs [lreplace $origargs $i $i]
                incr i -1
            }
            "-[puabwcrRBMC]" -
            "--no-renames" - "--full-index" - "--binary" - "--abbrev=*" -
            "--find-copies-harder" - "-l*" - "--ext-diff" - "--no-ext-diff" -
            "--src-prefix=*" - "--dst-prefix=*" - "--no-prefix" -
            "-O*" - "--text" - "--full-diff" - "--ignore-space-at-eol" -
            "--ignore-space-change" - "-U*" - "--unified=*" {
                # These request or affect diff output, which we don't want.
                # Some could be used to set our defaults for diff display.
                lappend diffargs $arg
            }
            "--raw" - "--patch-with-raw" - "--patch-with-stat" -
            "--name-only" - "--name-status" - "--color" -
            "--log-size" - "--pretty=*" - "--decorate" - "--abbrev-commit" -
            "--cc" - "-z" - "--header" - "--parents" - "--boundary" -
            "--no-color" - "-g" - "--walk-reflogs" - "--no-walk" -
            "--timestamp" - "relative-date" - "--date=*" - "--stdin" -
            "--objects" - "--objects-edge" - "--reverse" {
                # These cause our parsing of git log's output to fail, or else
                # they're options we want to set ourselves, so ignore them.
            }
            "--color-words*" - "--word-diff=color" {
                # These trigger a word diff in the console interface,
                # so help the user by enabling our own support
                set worddiff [mc "Color words"]
            }
            "--word-diff*" {
                set worddiff [mc "Markup words"]
            }
            "--stat=*" - "--numstat" - "--shortstat" - "--summary" -
            "--check" - "--exit-code" - "--quiet" - "--topo-order" -
            "--full-history" - "--dense" - "--sparse" -
            "--follow" - "--left-right" - "--encoding=*" {
                # These are harmless, and some are even useful
                lappend glflags $arg
            }
            "--diff-filter=*" - "--no-merges" - "--unpacked" -
            "--max-count=*" - "--skip=*" - "--since=*" - "--after=*" -
            "--until=*" - "--before=*" - "--max-age=*" - "--min-age=*" -
            "--author=*" - "--committer=*" - "--grep=*" - "-[iE]" -
            "--remove-empty" - "--first-parent" - "--cherry-pick" -
            "-S*" - "-G*" - "--pickaxe-all" - "--pickaxe-regex" -
            "--simplify-by-decoration" {
                # These mean that we get a subset of the commits
                set filtered 1
                lappend glflags $arg
            }
            "-L*" {
                # Line-log with 'stuck' argument (unstuck form is
                # not supported)
                set filtered 1
                set vinlinediff($n) 1
                set allknown 0
                lappend glflags $arg
            }
            "-n" {
                # This appears to be the only one that has a value as a
                # separate word following it
                set filtered 1
                set nextisval 1
                lappend glflags $arg
            }
            "--not" - "--all" {
                lappend revargs $arg
            }
            "--merge" {
                set vmergeonly($n) 1
                # git rev-parse doesn't understand --merge
                lappend revargs --gitk-symmetric-diff-marker MERGE_HEAD...HEAD
            }
            "--no-replace-objects" {
                set env(GIT_NO_REPLACE_OBJECTS) "1"
            }
            "-*" {
                # Other flag arguments including -<n>
                if {[string is digit -strict [string range $arg 1 end]]} {
                    set filtered 1
                } else {
                    # a flag argument that we don't recognize;
                    # that means we can't optimize
                    set allknown 0
                }
                lappend glflags $arg
            }
            default {
                # Non-flag arguments specify commits or ranges of commits
                if {[string match "*...*" $arg]} {
                    lappend revargs --gitk-symmetric-diff-marker
                }
                lappend revargs $arg
            }
        }
    }
    set vdflags($n) $diffargs
    set vflags($n) $glflags
    set vrevs($n) $revargs
    set vfiltered($n) $filtered
    set vorigargs($n) $origargs
    return $allknown
}

proc parseviewrevs {view revs} {
    global vposids vnegids
    global hashlength

    if {$revs eq {}} {
        set revs HEAD
    } elseif {[lsearch -exact $revs --all] >= 0} {
        lappend revs HEAD
    }
    if {[catch {set ids [safe_exec [concat 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"]
        set badrev {}
        for {set l 0} {$l < [llength $errlines]} {incr l} {
            set line [lindex $errlines $l]
            if {!([string length $line] == $hashlength && [string is xdigit $line])} {
                if {[string match "fatal:*" $line]} {
                    if {[string match "fatal: ambiguous argument*" $line]
                        && $badrev ne {}} {
                        if {[llength $badrev] == 1} {
                            set err "unknown revision $badrev"
                        } else {
                            set err "unknown revisions: [join $badrev ", "]"
                        }
                    } else {
                        set err [join [lrange $errlines $l end] "\n"]
                    }
                    break
                }
                lappend badrev $line
            }
        }
        error_popup "[mc "Error parsing revisions:"] $err"
        return {}
    }
    set ret {}
    set pos {}
    set neg {}
    set sdm 0
    foreach id [split $ids "\n"] {
        if {$id eq "--gitk-symmetric-diff-marker"} {
            set sdm 4
        } elseif {[string match "^*" $id]} {
            if {$sdm != 1} {
                lappend ret $id
                if {$sdm == 3} {
                    set sdm 0
                }
            }
            lappend neg [string range $id 1 end]
        } else {
            if {$sdm != 2} {
                lappend ret $id
            } else {
                lset ret end $id...[lindex $ret end]
            }
            lappend pos $id
        }
        incr sdm -1
    }
    set vposids($view) $pos
    set vnegids($view) $neg
    return $ret
}

# Start off a git log process and arrange to read its output
proc start_rev_list {view} {
    global startmsecs commitidx viewcomplete curview
    global tclencoding
    global viewargs viewargscmd viewfiles vfilelimit
    global showlocalchanges
    global viewactive viewinstances vmergeonly
    global mainheadid viewmainheadid viewmainheadid_orig
    global vcanopt vflags vrevs vorigargs

    set startmsecs [clock clicks -milliseconds]
    set commitidx($view) 0
    # these are set this way for the error exits
    set viewcomplete($view) 1
    set viewactive($view) 0
    varcinit $view

    set args $viewargs($view)
    if {$viewargscmd($view) ne {}} {
        if {[catch {
            set str [safe_exec [list sh -c $viewargscmd($view)]]
        } err]} {
            error_popup "[mc "Error executing --argscmd command:"] $err"
            return 0
        }
        set args [concat $args [split $str "\n"]]
    }
    set vcanopt($view) [parseviewargs $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 {$vcanopt($view)} {
        set revs [parseviewrevs $view $vrevs($view)]
        if {$revs eq {}} {
            return 0
        }
        set args $vflags($view)
    } else {
        set revs {}
        set args $vorigargs($view)
    }

    if {[catch {
        set fd [safe_open_command_redirect [concat git log --no-color -z --pretty=raw --show-notes \
                        --parents --boundary $args --stdin] \
                        [list "<<[join [concat $revs "--" $files] "\n"]"]]
    } err]} {
        error_popup "[mc "Error executing git log:"] $err"
        return 0
    }
    set i [reg_instance $fd]
    set viewinstances($view) [list $i]
    set viewmainheadid($view) $mainheadid
    set viewmainheadid_orig($view) $mainheadid
    if {$files ne {} && $mainheadid ne {}} {
        get_viewmainhead $view
    }
    if {$showlocalchanges && $viewmainheadid($view) ne {}} {
        interestedin $viewmainheadid($view) dodiffindex
    }
    fconfigure $fd -blocking 0 -translation lf -eofchar {}
    if {$tclencoding != {}} {
        fconfigure $fd -encoding $tclencoding
    }
    filerun $fd [list getcommitlines $fd $i $view 0]
    nowbusy $view [mc "Reading"]
    set viewcomplete($view) 0
    set viewactive($view) 1
    return 1
}

proc stop_instance {inst} {
    global commfd leftover

    set fd $commfd($inst)
    catch {
        set pid [pid $fd]

        if {$::tcl_platform(platform) eq {windows}} {
            safe_exec [list taskkill /pid $pid]
        } else {
            safe_exec [list kill $pid]
        }
    }
    catch {close $fd}
    nukefile $fd
    unset commfd($inst)
    unset leftover($inst)
}

proc stop_backends {} {
    global commfd

    foreach inst [array names commfd] {
        stop_instance $inst
    }
}

proc stop_rev_list {view} {
    global viewinstances

    foreach inst $viewinstances($view) {
        stop_instance $inst
    }
    set viewinstances($view) {}
}

proc reset_pending_select {selid} {
    global pending_select mainheadid selectheadid

    if {$selid ne {}} {
        set pending_select $selid
    } elseif {$selectheadid ne {}} {
        set pending_select $selectheadid
    } else {
        set pending_select $mainheadid
    }
}

proc getcommits {selid} {
    global canv curview need_redisplay viewactive

    initlayout
    if {[start_rev_list $curview]} {
        reset_pending_select $selid
        show_status [mc "Reading commits..."]
        set need_redisplay 1
    } else {
        show_status [mc "No commits selected"]
    }
}

proc updatecommits {} {
    global curview vcanopt vorigargs vfilelimit viewinstances
    global viewactive viewcomplete tclencoding
    global startmsecs showneartags showlocalchanges
    global mainheadid viewmainheadid viewmainheadid_orig pending_select
    global hasworktree
    global varcid vposids vnegids vflags vrevs
    global hashlength

    set hasworktree [hasworktree]
    rereadrefs
    set view $curview
    if {$mainheadid ne $viewmainheadid_orig($view)} {
        if {$showlocalchanges} {
            dohidelocalchanges
        }
        set viewmainheadid($view) $mainheadid
        set viewmainheadid_orig($view) $mainheadid
        if {$vfilelimit($view) ne {}} {
            get_viewmainhead $view
        }
    }
    if {$showlocalchanges} {
        doshowlocalchanges
    }
    if {$vcanopt($view)} {
        set oldpos $vposids($view)
        set oldneg $vnegids($view)
        set revs [parseviewrevs $view $vrevs($view)]
        if {$revs eq {}} {
            return
        }
        # note: getting the delta when negative refs change is hard,
        # and could require multiple git log invocations, so in that
        # case we ask git log for all the commits (not just the delta)
        if {$oldneg eq $vnegids($view)} {
            set newrevs {}
            set npos 0
            # take out positive refs that we asked for before or
            # that we have already seen
            foreach rev $revs {
                if {[string length $rev] == $hashlength} {
                    if {[lsearch -exact $oldpos $rev] < 0
                        && ![info exists varcid($view,$rev)]} {
                        lappend newrevs $rev
                        incr npos
                    }
                } else {
                    lappend $newrevs $rev
                }
            }
            if {$npos == 0} return
            set revs $newrevs
            set vposids($view) [lsort -unique [concat $oldpos $vposids($view)]]
        }
        set args $vflags($view)
        foreach r $oldpos {
                lappend revs "^$r"
        }
    } else {
        set revs {}
        set args $vorigargs($view)
    }
    if {[catch {
        set fd [safe_open_command_redirect [concat git log --no-color -z --pretty=raw --show-notes \
                        --parents --boundary $args --stdin] \
                        [list "<<[join [concat $revs "--" $vfilelimit($view)] "\n"]"]]
    } err]} {
        error_popup "[mc "Error executing git log:"] $err"
        return
    }
    if {$viewactive($view) == 0} {
        set startmsecs [clock clicks -milliseconds]
    }
    set i [reg_instance $fd]
    lappend viewinstances($view) $i
    fconfigure $fd -blocking 0 -translation lf -eofchar {}
    if {$tclencoding != {}} {
        fconfigure $fd -encoding $tclencoding
    }
    filerun $fd [list getcommitlines $fd $i $view 1]
    incr viewactive($view)
    set viewcomplete($view) 0
    reset_pending_select {}
    nowbusy $view [mc "Reading"]
    if {$showneartags} {
        getallcommits
    }
}

proc reloadcommits {} {
    global curview viewcomplete selectedline currentid thickerline
    global showneartags treediffs commitinterest cached_commitrow
    global targetid commitinfo

    set selid {}
    if {$selectedline ne {}} {
        set selid $currentid
    }

    if {!$viewcomplete($curview)} {
        stop_rev_list $curview
    }
    resetvarcs $curview
    set selectedline {}
    unset -nocomplain currentid
    unset -nocomplain thickerline
    unset -nocomplain treediffs
    readrefs
    changedrefs
    if {$showneartags} {
        getallcommits
    }
    clear_display
    unset -nocomplain commitinfo
    unset -nocomplain commitinterest
    unset -nocomplain cached_commitrow
    unset -nocomplain targetid
    setcanvscroll
    getcommits $selid
    return 0
}

# This makes a string representation of a positive integer which
# sorts as a string in numerical order
proc strrep {n} {
    if {$n < 16} {
        return [format "%x" $n]
    } elseif {$n < 256} {
        return [format "x%.2x" $n]
    } elseif {$n < 65536} {
        return [format "y%.4x" $n]
    }
    return [format "z%.8x" $n]
}

# Procedures used in reordering commits from git log (without
# --topo-order) into the order for display.

proc varcinit {view} {
    global varcstart vupptr vdownptr vleftptr vbackptr varctok varcrow
    global vtokmod varcmod vrowmod varcix vlastins

    set varcstart($view) {{}}
    set vupptr($view) {0}
    set vdownptr($view) {0}
    set vleftptr($view) {0}
    set vbackptr($view) {0}
    set varctok($view) {{}}
    set varcrow($view) {{}}
    set vtokmod($view) {}
    set varcmod($view) 0
    set vrowmod($view) 0
    set varcix($view) {{}}
    set vlastins($view) {0}
}

proc resetvarcs {view} {
    global varcid varccommits parents children vseedcount ordertok
    global vshortids

    foreach vid [array names varcid $view,*] {
        unset varcid($vid)
        unset children($vid)
        unset parents($vid)
    }
    foreach vid [array names vshortids $view,*] {
        unset vshortids($vid)
    }
    # some commits might have children but haven't been seen yet
    foreach vid [array names children $view,*] {
        unset children($vid)
    }
    foreach va [array names varccommits $view,*] {
        unset varccommits($va)
    }
    foreach vd [array names vseedcount $view,*] {
        unset vseedcount($vd)
    }
    unset -nocomplain ordertok
}

# returns a list of the commits with no children
proc seeds {v} {
    global vdownptr vleftptr varcstart

    set ret {}
    set a [lindex $vdownptr($v) 0]
    while {$a != 0} {
        lappend ret [lindex $varcstart($v) $a]
        set a [lindex $vleftptr($v) $a]
    }
    return $ret
}

proc newvarc {view id} {
    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
    if {[llength $children($vid)] == 0 || $vdatemode($view)} {
        if {![info exists commitinfo($id)]} {
            parsecommit $id $commitdata($id) 1
        }
        set cdate [lindex [lindex $commitinfo($id) 4] 0]
        if {![string is integer -strict $cdate]} {
            set cdate 0
        }
        if {![info exists vseedcount($view,$cdate)]} {
            set vseedcount($view,$cdate) -1
        }
        set c [incr vseedcount($view,$cdate)]
        set cdate [expr {$cdate ^ 0xffffffff}]
        set tok "s[strrep $cdate][strrep $c]"
    } else {
        set tok {}
    }
    set ka 0
    if {[llength $children($vid)] > 0} {
        set kid [lindex $children($vid) end]
        set k $varcid($view,$kid)
        if {[string compare [lindex $varctok($view) $k] $tok] > 0} {
            set ki $kid
            set ka $k
            set tok [lindex $varctok($view) $k]
        }
    }
    if {$ka != 0} {
        set i [lsearch -exact $parents($view,$ki) $id]
        set j [expr {[llength $parents($view,$ki)] - 1 - $i}]
        append tok [strrep $j]
    }
    set c [lindex $vlastins($view) $ka]
    if {$c == 0 || [string compare $tok [lindex $varctok($view) $c]] < 0} {
        set c $ka
        set b [lindex $vdownptr($view) $ka]
    } else {
        set b [lindex $vleftptr($view) $c]
    }
    while {$b != 0 && [string compare $tok [lindex $varctok($view) $b]] >= 0} {
        set c $b
        set b [lindex $vleftptr($view) $c]
    }
    if {$c == $ka} {
        lset vdownptr($view) $ka $a
        lappend vbackptr($view) 0
    } else {
        lset vleftptr($view) $c $a
        lappend vbackptr($view) $c
    }
    lset vlastins($view) $ka $a
    lappend vupptr($view) $ka
    lappend vleftptr($view) $b
    if {$b != 0} {
        lset vbackptr($view) $b $a
    }
    lappend varctok($view) $tok
    lappend varcstart($view) $id
    lappend vdownptr($view) 0
    lappend varcrow($view) {}
    lappend varcix($view) {}
    set varccommits($view,$a) {}
    lappend vlastins($view) 0
    return $a
}

proc splitvarc {p v} {
    global varcid varcstart varccommits varctok vtokmod
    global vupptr vdownptr vleftptr vbackptr varcix varcrow vlastins

    set oa $varcid($v,$p)
    set otok [lindex $varctok($v) $oa]
    set ac $varccommits($v,$oa)
    set i [lsearch -exact $varccommits($v,$oa) $p]
    if {$i <= 0} return
    set na [llength $varctok($v)]
    # "%" sorts before "0"...
    set tok "$otok%[strrep $i]"
    lappend varctok($v) $tok
    lappend varcrow($v) {}
    lappend varcix($v) {}
    set varccommits($v,$oa) [lrange $ac 0 [expr {$i - 1}]]
    set varccommits($v,$na) [lrange $ac $i end]
    lappend varcstart($v) $p
    foreach id $varccommits($v,$na) {
        set varcid($v,$id) $na
    }
    lappend vdownptr($v) [lindex $vdownptr($v) $oa]
    lappend vlastins($v) [lindex $vlastins($v) $oa]
    lset vdownptr($v) $oa $na
    lset vlastins($v) $oa 0
    lappend vupptr($v) $oa
    lappend vleftptr($v) 0
    lappend vbackptr($v) 0
    for {set b [lindex $vdownptr($v) $na]} {$b != 0} {set b [lindex $vleftptr($v) $b]} {
        lset vupptr($v) $b $na
    }
    if {[string compare $otok $vtokmod($v)] <= 0} {
        modify_arc $v $oa
    }
}

proc renumbervarc {a v} {
    global parents children varctok varcstart varccommits
    global vupptr vdownptr vleftptr vbackptr vlastins varcid vtokmod vdatemode

    set t1 [clock clicks -milliseconds]
    set todo {}
    set isrelated($a) 1
    set kidchanged($a) 1
    set ntot 0
    while {$a != 0} {
        if {[info exists isrelated($a)]} {
            lappend todo $a
            set id [lindex $varccommits($v,$a) end]
            foreach p $parents($v,$id) {
                if {[info exists varcid($v,$p)]} {
                    set isrelated($varcid($v,$p)) 1
                }
            }
        }
        incr ntot
        set b [lindex $vdownptr($v) $a]
        if {$b == 0} {
            while {$a != 0} {
                set b [lindex $vleftptr($v) $a]
                if {$b != 0} break
                set a [lindex $vupptr($v) $a]
            }
        }
        set a $b
    }
    foreach a $todo {
        if {![info exists kidchanged($a)]} continue
        set id [lindex $varcstart($v) $a]
        if {[llength $children($v,$id)] > 1} {
            set children($v,$id) [lsort -command [list vtokcmp $v] \
                                      $children($v,$id)]
        }
        set oldtok [lindex $varctok($v) $a]
        if {!$vdatemode($v)} {
            set tok {}
        } else {
            set tok $oldtok
        }
        set ka 0
        set kid [last_real_child $v,$id]
        if {$kid ne {}} {
            set k $varcid($v,$kid)
            if {[string compare [lindex $varctok($v) $k] $tok] > 0} {
                set ki $kid
                set ka $k
                set tok [lindex $varctok($v) $k]
            }
        }
        if {$ka != 0} {
            set i [lsearch -exact $parents($v,$ki) $id]
            set j [expr {[llength $parents($v,$ki)] - 1 - $i}]
            append tok [strrep $j]
        }
        if {$tok eq $oldtok} {
            continue
        }
        set id [lindex $varccommits($v,$a) end]
        foreach p $parents($v,$id) {
            if {[info exists varcid($v,$p)]} {
                set kidchanged($varcid($v,$p)) 1
            } else {
                set sortkids($p) 1
            }
        }
        lset varctok($v) $a $tok
        set b [lindex $vupptr($v) $a]
        if {$b != $ka} {
            if {[string compare [lindex $varctok($v) $ka] $vtokmod($v)] < 0} {
                modify_arc $v $ka
            }
            if {[string compare [lindex $varctok($v) $b] $vtokmod($v)] < 0} {
                modify_arc $v $b
            }
            set c [lindex $vbackptr($v) $a]
            set d [lindex $vleftptr($v) $a]
            if {$c == 0} {
                lset vdownptr($v) $b $d
            } else {
                lset vleftptr($v) $c $d
            }
            if {$d != 0} {
                lset vbackptr($v) $d $c
            }
            if {[lindex $vlastins($v) $b] == $a} {
                lset vlastins($v) $b $c
            }
            lset vupptr($v) $a $ka
            set c [lindex $vlastins($v) $ka]
            if {$c == 0 || \
                    [string compare $tok [lindex $varctok($v) $c]] < 0} {
                set c $ka
                set b [lindex $vdownptr($v) $ka]
            } else {
                set b [lindex $vleftptr($v) $c]
            }
            while {$b != 0 && \
                      [string compare $tok [lindex $varctok($v) $b]] >= 0} {
                set c $b
                set b [lindex $vleftptr($v) $c]
            }
            if {$c == $ka} {
                lset vdownptr($v) $ka $a
                lset vbackptr($v) $a 0
            } else {
                lset vleftptr($v) $c $a
                lset vbackptr($v) $a $c
            }
            lset vleftptr($v) $a $b
            if {$b != 0} {
                lset vbackptr($v) $b $a
            }
            lset vlastins($v) $ka $a
        }
    }
    foreach id [array names sortkids] {
        if {[llength $children($v,$id)] > 1} {
            set children($v,$id) [lsort -command [list vtokcmp $v] \
                                      $children($v,$id)]
        }
    }
    set t2 [clock clicks -milliseconds]
    #puts "renumbervarc did [llength $todo] of $ntot arcs in [expr {$t2-$t1}]ms"
}

# Fix up the graph after we have found out that in view $v,
# $p (a commit that we have already seen) is actually the parent
# of the last commit in arc $a.
proc fix_reversal {p a v} {
    global varcid varcstart varctok vupptr

    set pa $varcid($v,$p)
    if {$p ne [lindex $varcstart($v) $pa]} {
        splitvarc $p $v
        set pa $varcid($v,$p)
    }
    # seeds always need to be renumbered
    if {[lindex $vupptr($v) $pa] == 0 ||
        [string compare [lindex $varctok($v) $a] \
             [lindex $varctok($v) $pa]] > 0} {
        renumbervarc $pa $v
    }
}

proc insertrow {id p v} {
    global cmitlisted children parents varcid varctok vtokmod
    global varccommits ordertok commitidx numcommits curview
    global targetid targetrow vshortids

    readcommit $id
    set vid $v,$id
    set cmitlisted($vid) 1
    set children($vid) {}
    set parents($vid) [list $p]
    set a [newvarc $v $id]
    set varcid($vid) $a
    lappend vshortids($v,[string range $id 0 3]) $id
    if {[string compare [lindex $varctok($v) $a] $vtokmod($v)] < 0} {
        modify_arc $v $a
    }
    lappend varccommits($v,$a) $id
    set vp $v,$p
    if {[llength [lappend children($vp) $id]] > 1} {
        set children($vp) [lsort -command [list vtokcmp $v] $children($vp)]
        unset -nocomplain ordertok
    }
    fix_reversal $p $a $v
    incr commitidx($v)
    if {$v == $curview} {
        set numcommits $commitidx($v)
        setcanvscroll
        if {[info exists targetid]} {
            if {![comes_before $targetid $p]} {
                incr targetrow
            }
        }
    }
}

proc insertfakerow {id p} {
    global varcid varccommits parents children cmitlisted
    global commitidx varctok vtokmod targetid targetrow curview numcommits

    set v $curview
    set a $varcid($v,$p)
    set i [lsearch -exact $varccommits($v,$a) $p]
    if {$i < 0} {
        puts "oops: insertfakerow can't find [shortids $p] on arc $a"
        return
    }
    set children($v,$id) {}
    set parents($v,$id) [list $p]
    set varcid($v,$id) $a
    lappend children($v,$p) $id
    set cmitlisted($v,$id) 1
    set numcommits [incr commitidx($v)]
    # note we deliberately don't update varcstart($v) even if $i == 0
    set varccommits($v,$a) [linsert $varccommits($v,$a) $i $id]
    modify_arc $v $a $i
    if {[info exists targetid]} {
        if {![comes_before $targetid $p]} {
            incr targetrow
        }
    }
    setcanvscroll
    drawvisible
}

proc removefakerow {id} {
    global varcid varccommits parents children commitidx
    global varctok vtokmod cmitlisted currentid selectedline
    global targetid curview numcommits

    set v $curview
    if {[llength $parents($v,$id)] != 1} {
        puts "oops: removefakerow [shortids $id] has [llength $parents($v,$id)] parents"
        return
    }
    set p [lindex $parents($v,$id) 0]
    set a $varcid($v,$id)
    set i [lsearch -exact $varccommits($v,$a) $id]
    if {$i < 0} {
        puts "oops: removefakerow can't find [shortids $id] on arc $a"
        return
    }
    unset varcid($v,$id)
    set varccommits($v,$a) [lreplace $varccommits($v,$a) $i $i]
    unset parents($v,$id)
    unset children($v,$id)
    unset cmitlisted($v,$id)
    set numcommits [incr commitidx($v) -1]
    set j [lsearch -exact $children($v,$p) $id]
    if {$j >= 0} {
        set children($v,$p) [lreplace $children($v,$p) $j $j]
    }
    modify_arc $v $a $i
    if {[info exist currentid] && $id eq $currentid} {
        unset currentid
        set selectedline {}
    }
    if {[info exists targetid] && $targetid eq $id} {
        set targetid $p
    }
    setcanvscroll
    drawvisible
}

proc real_children {vp} {
    global children nullid nullid2

    set kids {}
    foreach id $children($vp) {
        if {$id ne $nullid && $id ne $nullid2} {
            lappend kids $id
        }
    }
    return $kids
}

proc first_real_child {vp} {
    global children nullid nullid2

    foreach id $children($vp) {
        if {$id ne $nullid && $id ne $nullid2} {
            return $id
        }
    }
    return {}
}

proc last_real_child {vp} {
    global children nullid nullid2

    set kids $children($vp)
    for {set i [llength $kids]} {[incr i -1] >= 0} {} {
        set id [lindex $kids $i]
        if {$id ne $nullid && $id ne $nullid2} {
            return $id
        }
    }
    return {}
}

proc vtokcmp {v a b} {
    global varctok varcid

    return [string compare [lindex $varctok($v) $varcid($v,$a)] \
                [lindex $varctok($v) $varcid($v,$b)]]
}

# This assumes that if lim is not given, the caller has checked that
# arc a's token is less than $vtokmod($v)
proc modify_arc {v a {lim {}}} {
    global varctok vtokmod varcmod varcrow vupptr curview vrowmod varccommits

    if {$lim ne {}} {
        set c [string compare [lindex $varctok($v) $a] $vtokmod($v)]
        if {$c > 0} return
        if {$c == 0} {
            set r [lindex $varcrow($v) $a]
            if {$r ne {} && $vrowmod($v) <= $r + $lim} return
        }
    }
    set vtokmod($v) [lindex $varctok($v) $a]
    set varcmod($v) $a
    if {$v == $curview} {
        while {$a != 0 && [lindex $varcrow($v) $a] eq {}} {
            set a [lindex $vupptr($v) $a]
            set lim {}
        }
        set r 0
        if {$a != 0} {
            if {$lim eq {}} {
                set lim [llength $varccommits($v,$a)]
            }
            set r [expr {[lindex $varcrow($v) $a] + $lim}]
        }
        set vrowmod($v) $r
        undolayout $r
    }
}

proc update_arcrows {v} {
    global vtokmod varcmod vrowmod varcrow commitidx currentid selectedline
    global varcid vrownum varcorder varcix varccommits
    global vupptr vdownptr vleftptr varctok
    global displayorder parentlist curview cached_commitrow

    if {$vrowmod($v) == $commitidx($v)} return
    if {$v == $curview} {
        if {[llength $displayorder] > $vrowmod($v)} {
            set displayorder [lrange $displayorder 0 [expr {$vrowmod($v) - 1}]]
            set parentlist [lrange $parentlist 0 [expr {$vrowmod($v) - 1}]]
        }
        unset -nocomplain cached_commitrow
    }
    set narctot [expr {[llength $varctok($v)] - 1}]
    set a $varcmod($v)
    while {$a != 0 && [lindex $varcix($v) $a] eq {}} {
        # go up the tree until we find something that has a row number,
        # or we get to a seed
        set a [lindex $vupptr($v) $a]
    }
    if {$a == 0} {
        set a [lindex $vdownptr($v) 0]
        if {$a == 0} return
        set vrownum($v) {0}
        set varcorder($v) [list $a]
        lset varcix($v) $a 0
        lset varcrow($v) $a 0
        set arcn 0
        set row 0
    } else {
        set arcn [lindex $varcix($v) $a]
        if {[llength $vrownum($v)] > $arcn + 1} {
            set vrownum($v) [lrange $vrownum($v) 0 $arcn]
            set varcorder($v) [lrange $varcorder($v) 0 $arcn]
        }
        set row [lindex $varcrow($v) $a]
    }
    while {1} {
        set p $a
        incr row [llength $varccommits($v,$a)]
        # go down if possible
        set b [lindex $vdownptr($v) $a]
        if {$b == 0} {
            # if not, go left, or go up until we can go left
            while {$a != 0} {
                set b [lindex $vleftptr($v) $a]
                if {$b != 0} break
                set a [lindex $vupptr($v) $a]
            }
            if {$a == 0} break
        }
        set a $b
        incr arcn
        lappend vrownum($v) $row
        lappend varcorder($v) $a
        lset varcix($v) $a $arcn
        lset varcrow($v) $a $row
    }
    set vtokmod($v) [lindex $varctok($v) $p]
    set varcmod($v) $p
    set vrowmod($v) $row
    if {[info exists currentid]} {
        set selectedline [rowofcommit $currentid]
    }
}

# Test whether view $v contains commit $id
proc commitinview {id v} {
    global varcid

    return [info exists varcid($v,$id)]
}

# Return the row number for commit $id in the current view
proc rowofcommit {id} {
    global varcid varccommits varcrow curview cached_commitrow
    global varctok vtokmod

    set v $curview
    if {![info exists varcid($v,$id)]} {
        puts "oops rowofcommit no arc for [shortids $id]"
        return {}
    }
    set a $varcid($v,$id)
    if {[string compare [lindex $varctok($v) $a] $vtokmod($v)] >= 0} {
        update_arcrows $v
    }
    if {[info exists cached_commitrow($id)]} {
        return $cached_commitrow($id)
    }
    set i [lsearch -exact $varccommits($v,$a) $id]
    if {$i < 0} {
        puts "oops didn't find commit [shortids $id] in arc $a"
        return {}
    }
    incr i [lindex $varcrow($v) $a]
    set cached_commitrow($id) $i
    return $i
}

# Returns 1 if a is on an earlier row than b, otherwise 0
proc comes_before {a b} {
    global varcid varctok curview

    set v $curview
    if {$a eq $b || ![info exists varcid($v,$a)] || \
            ![info exists varcid($v,$b)]} {
        return 0
    }
    if {$varcid($v,$a) != $varcid($v,$b)} {
        return [expr {[string compare [lindex $varctok($v) $varcid($v,$a)] \
                           [lindex $varctok($v) $varcid($v,$b)]] < 0}]
    }
    return [expr {[rowofcommit $a] < [rowofcommit $b]}]
}

proc bsearch {l elt} {
    if {[llength $l] == 0 || $elt <= [lindex $l 0]} {
        return 0
    }
    set lo 0
    set hi [llength $l]
    while {$hi - $lo > 1} {
        set mid [expr {int(($lo + $hi) / 2)}]
        set t [lindex $l $mid]
        if {$elt < $t} {
            set hi $mid
        } elseif {$elt > $t} {
            set lo $mid
        } else {
            return $mid
        }
    }
    return $lo
}

# Make sure rows $start..$end-1 are valid in displayorder and parentlist
proc make_disporder {start end} {
    global vrownum curview commitidx displayorder parentlist
    global varccommits varcorder parents vrowmod varcrow
    global d_valid_start d_valid_end

    if {$end > $vrowmod($curview)} {
        update_arcrows $curview
    }
    set ai [bsearch $vrownum($curview) $start]
    set start [lindex $vrownum($curview) $ai]
    set narc [llength $vrownum($curview)]
    for {set r $start} {$ai < $narc && $r < $end} {incr ai} {
        set a [lindex $varcorder($curview) $ai]
        set l [llength $displayorder]
        set al [llength $varccommits($curview,$a)]
        if {$l < $r + $al} {
            if {$l < $r} {
                set pad [ntimes [expr {$r - $l}] {}]
                set displayorder [concat $displayorder $pad]
                set parentlist [concat $parentlist $pad]
            } elseif {$l > $r} {
                set displayorder [lrange $displayorder 0 [expr {$r - 1}]]
                set parentlist [lrange $parentlist 0 [expr {$r - 1}]]
            }
            foreach id $varccommits($curview,$a) {
                lappend displayorder $id
                lappend parentlist $parents($curview,$id)
            }
        } elseif {[lindex $displayorder [expr {$r + $al - 1}]] eq {}} {
            set i $r
            foreach id $varccommits($curview,$a) {
                lset displayorder $i $id
                lset parentlist $i $parents($curview,$id)
                incr i
            }
        }
        incr r $al
    }
}

proc commitonrow {row} {
    global displayorder

    set id [lindex $displayorder $row]
    if {$id eq {}} {
        make_disporder $row [expr {$row + 1}]
        set id [lindex $displayorder $row]
    }
    return $id
}

proc closevarcs {v} {
    global varctok varccommits varcid parents children
    global cmitlisted commitidx vtokmod curview numcommits

    set missing_parents 0
    set scripts {}
    set narcs [llength $varctok($v)]
    for {set a 1} {$a < $narcs} {incr a} {
        set id [lindex $varccommits($v,$a) end]
        foreach p $parents($v,$id) {
            if {[info exists varcid($v,$p)]} continue
            # add p as a new commit
            incr missing_parents
            set cmitlisted($v,$p) 0
            set parents($v,$p) {}
            if {[llength $children($v,$p)] == 1 &&
                [llength $parents($v,$id)] == 1} {
                set b $a
            } else {
                set b [newvarc $v $p]
            }
            set varcid($v,$p) $b
            if {[string compare [lindex $varctok($v) $b] $vtokmod($v)] < 0} {
                modify_arc $v $b
            }
            lappend varccommits($v,$b) $p
            incr commitidx($v)
            if {$v == $curview} {
                set numcommits $commitidx($v)
            }
            set scripts [check_interest $p $scripts]
        }
    }
    if {$missing_parents > 0} {
        foreach s $scripts {
            eval $s
        }
    }
}

# Use $rwid as a substitute for $id, i.e. reparent $id's children to $rwid
# Assumes we already have an arc for $rwid.
proc rewrite_commit {v id rwid} {
    global children parents varcid varctok vtokmod varccommits

    foreach ch $children($v,$id) {
        # make $rwid be $ch's parent in place of $id
        set i [lsearch -exact $parents($v,$ch) $id]
        if {$i < 0} {
            puts "oops rewrite_commit didn't find $id in parent list for $ch"
        }
        set parents($v,$ch) [lreplace $parents($v,$ch) $i $i $rwid]
        # add $ch to $rwid's children and sort the list if necessary
        if {[llength [lappend children($v,$rwid) $ch]] > 1} {
            set children($v,$rwid) [lsort -command [list vtokcmp $v] \
                                        $children($v,$rwid)]
        }
        # fix the graph after joining $id to $rwid
        set a $varcid($v,$ch)
        fix_reversal $rwid $a $v
        # parentlist is wrong for the last element of arc $a
        # even if displayorder is right, hence the 3rd arg here
        modify_arc $v $a [expr {[llength $varccommits($v,$a)] - 1}]
    }
}

# Mechanism for registering a command to be executed when we come
# across a particular commit.  To handle the case when only the
# prefix of the commit is known, the commitinterest array is now
# indexed by the first 4 characters of the ID.  Each element is a
# list of id, cmd pairs.
proc interestedin {id cmd} {
    global commitinterest

    lappend commitinterest([string range $id 0 3]) $id $cmd
}

proc check_interest {id scripts} {
    global commitinterest

    set prefix [string range $id 0 3]
    if {[info exists commitinterest($prefix)]} {
        set newlist {}
        foreach {i script} $commitinterest($prefix) {
            if {[string match "$i*" $id]} {
                lappend scripts [string map [list "%I" $id "%P" $i] $script]
            } else {
                lappend newlist $i $script
            }
        }
        if {$newlist ne {}} {
            set commitinterest($prefix) $newlist
        } else {
            unset commitinterest($prefix)
        }
    }
    return $scripts
}

proc getcommitlines {fd inst view updating}  {
    global cmitlisted leftover
    global commitidx commitdata vdatemode
    global parents children curview hlview
    global idpending ordertok
    global varccommits varcid varctok vtokmod vfilelimit vshortids
    global hashlength

    set stuff [read $fd 500000]
    # git log doesn't terminate the last commit with a null...
    if {$stuff == {} && $leftover($inst) ne {} && [eof $fd]} {
        set stuff "\0"
    }
    if {$stuff == {}} {
        if {![eof $fd]} {
            return 1
        }
        global commfd viewcomplete viewactive viewname
        global viewinstances
        unset commfd($inst)
        set i [lsearch -exact $viewinstances($view) $inst]
        if {$i >= 0} {
            set viewinstances($view) [lreplace $viewinstances($view) $i $i]
        }
        # set it blocking so we wait for the process to terminate
        fconfigure $fd -blocking 1
        if {[catch {close $fd} err]} {
            set fv {}
            if {$view != $curview} {
                set fv " for the \"$viewname($view)\" view"
            }
            if {[string range $err 0 4] == "usage"} {
                set err "Gitk: error reading commits$fv:\
                        bad arguments to git log."
                if {$viewname($view) eq [mc "Command line"]} {
                    append err \
                        "  (Note: arguments to gitk are passed to git log\
                         to allow selection of commits to be displayed.)"
                }
            } else {
                set err "Error reading commits$fv: $err"
            }
            error_popup $err
        }
        if {[incr viewactive($view) -1] <= 0} {
            set viewcomplete($view) 1
            # Check if we have seen any ids listed as parents that haven't
            # appeared in the list
            closevarcs $view
            notbusy $view
        }
        if {$view == $curview} {
            run chewcommits
        }
        return 0
    }
    set start 0
    set gotsome 0
    set scripts {}
    while 1 {
        set i [string first "\0" $stuff $start]
        if {$i < 0} {
            append leftover($inst) [string range $stuff $start end]
            break
        }
        if {$start == 0} {
            set cmit $leftover($inst)
            append cmit [string range $stuff 0 [expr {$i - 1}]]
            set leftover($inst) {}
        } else {
            set cmit [string range $stuff $start [expr {$i - 1}]]
        }
        set start [expr {$i + 1}]
        set j [string first "\n" $cmit]
        set ok 0
        set listed 1
        if {$j >= 0 && [string match "commit *" $cmit]} {
            set ids [string range $cmit 7 [expr {$j - 1}]]
            if {[string match {[-^<>]*} $ids]} {
                switch -- [string index $ids 0] {
                    "-" {set listed 0}
                    "^" {set listed 2}
                    "<" {set listed 3}
                    ">" {set listed 4}
                }
                set ids [string range $ids 1 end]
            }
            set ok 1
            foreach id $ids {
                if {[string length $id] != $hashlength} {
                    set ok 0
                    break
                }
            }
        }
        if {!$ok} {
            set shortcmit $cmit
            if {[string length $shortcmit] > 80} {
                set shortcmit "[string range $shortcmit 0 80]..."
            }
            error_popup "[mc "Can't parse git log output:"] {$shortcmit}"
            exit 1
        }
        set id [lindex $ids 0]
        set vid $view,$id

        lappend vshortids($view,[string range $id 0 3]) $id

        if {!$listed && $updating && ![info exists varcid($vid)] &&
            $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
            # and if we already know about it, using the rewritten
            # parent as a substitute parent for $id's children.
            if {![catch {
                set rwid [safe_exec [list git rev-list --first-parent --max-count=1 \
                              $id -- $vfilelimit($view)]]
            }]} {
                if {$rwid ne {} && [info exists varcid($view,$rwid)]} {
                    # use $rwid in place of $id
                    rewrite_commit $view $id $rwid
                    continue
                }
            }
        }

        set a 0
        if {[info exists varcid($vid)]} {
            if {$cmitlisted($vid) || !$listed} continue
            set a $varcid($vid)
        }
        if {$listed} {
            set olds [lrange $ids 1 end]
        } else {
            set olds {}
        }
        set commitdata($id) [string range $cmit [expr {$j + 1}] end]
        set cmitlisted($vid) $listed
        set parents($vid) $olds
        if {![info exists children($vid)]} {
            set children($vid) {}
        } elseif {$a == 0 && [llength $children($vid)] == 1} {
            set k [lindex $children($vid) 0]
            if {[llength $parents($view,$k)] == 1 &&
                (!$vdatemode($view) ||
                 $varcid($view,$k) == [llength $varctok($view)] - 1)} {
                set a $varcid($view,$k)
            }
        }
        if {$a == 0} {
            # new arc
            set a [newvarc $view $id]
        }
        if {[string compare [lindex $varctok($view) $a] $vtokmod($view)] < 0} {
            modify_arc $view $a
        }
        if {![info exists varcid($vid)]} {
            set varcid($vid) $a
            lappend varccommits($view,$a) $id
            incr commitidx($view)
        }

        set i 0
        foreach p $olds {
            if {$i == 0 || [lsearch -exact $olds $p] >= $i} {
                set vp $view,$p
                if {[llength [lappend children($vp) $id]] > 1 &&
                    [vtokcmp $view [lindex $children($vp) end-1] $id] > 0} {
                    set children($vp) [lsort -command [list vtokcmp $view] \
                                           $children($vp)]
                    unset -nocomplain ordertok
                }
                if {[info exists varcid($view,$p)]} {
                    fix_reversal $p $a $view
                }
            }
            incr i
        }

        set scripts [check_interest $id $scripts]
        set gotsome 1
    }
    if {$gotsome} {
        global numcommits hlview

        if {$view == $curview} {
            set numcommits $commitidx($view)
            run chewcommits
        }
        if {[info exists hlview] && $view == $hlview} {
            # we never actually get here...
            run vhighlightmore
        }
        foreach s $scripts {
            eval $s
        }
    }
    return 2
}

proc chewcommits {} {
    global curview hlview viewcomplete
    global pending_select

    layoutmore
    if {$viewcomplete($curview)} {
        global commitidx varctok
        global numcommits startmsecs

        if {[info exists pending_select]} {
            update
            reset_pending_select {}

            if {[commitinview $pending_select $curview]} {
                selectline [rowofcommit $pending_select] 1
            } else {
                set row [first_real_row]
                selectline $row 1
            }
        }
        if {$commitidx($curview) > 0} {
            #set ms [expr {[clock clicks -milliseconds] - $startmsecs}]
            #puts "overall $ms ms for $numcommits commits"
            #puts "[llength $varctok($view)] arcs, $commitidx($view) commits"
        } else {
            show_status [mc "No commits selected"]
        }
        notbusy layout
    }
    return 0
}

proc do_readcommit {id} {
    global tclencoding

    # Invoke git-log to handle automatic encoding conversion
    set fd [safe_open_command [concat git log --no-color --pretty=raw -1 $id]]
    # Read the results using i18n.logoutputencoding
    fconfigure $fd -translation lf -eofchar {}
    if {$tclencoding != {}} {
        fconfigure $fd -encoding $tclencoding
    }
    set contents [read $fd]
    close $fd
    # Remove the heading line
    regsub {^commit [0-9a-f]+\n} $contents {} contents

    return $contents
}

proc readcommit {id} {
    if {[catch {set contents [do_readcommit $id]}]} return
    parsecommit $id $contents 1
}

proc parsecommit {id contents listed} {
    global commitinfo

    set inhdr 1
    set comment {}
    set headline {}
    set auname {}
    set audate {}
    set comname {}
    set comdate {}
    set hdrend [string first "\n\n" $contents]
    if {$hdrend < 0} {
        # should never happen...
        set hdrend [string length $contents]
    }
    set header [string range $contents 0 [expr {$hdrend - 1}]]
    set comment [string range $contents [expr {$hdrend + 2}] end]
    foreach line [split $header "\n"] {
        set line [split $line " "]
        set tag [lindex $line 0]
        if {$tag == "author"} {
            set audate [lrange $line end-1 end]
            set auname [join [lrange $line 1 end-2] " "]
        } elseif {$tag == "committer"} {
            set comdate [lrange $line end-1 end]
            set comname [join [lrange $line 1 end-2] " "]
        }
    }
    set headline {}
    # take the first non-blank line of the comment as the headline
    set headline [string trimleft $comment]
    set i [string first "\n" $headline]
    if {$i >= 0} {
        set headline [string range $headline 0 $i]
    }
    set headline [string trimright $headline]
    set i [string first "\r" $headline]
    if {$i >= 0} {
        set headline [string trimright [string range $headline 0 $i]]
    }
    if {!$listed} {
        # git log indents the comment by 4 spaces;
        # if we got this via git cat-file, add the indentation
        set newcomment {}
        foreach line [split $comment "\n"] {
            append newcomment "    "
            append newcomment $line
            append newcomment "\n"
        }
        set comment $newcomment
    }
    set hasnote [string first "\nNotes:\n" $contents]
    set diff ""
    # If there is diff output shown in the git-log stream, split it
    # out.  But get rid of the empty line that always precedes the
    # diff.
    set i [string first "\n\ndiff" $comment]
    if {$i >= 0} {
        set diff [string range $comment $i+1 end]
        set comment [string range $comment 0 $i-1]
    }
    set commitinfo($id) [list $headline $auname $audate \
                             $comname $comdate $comment $hasnote $diff]
}

proc getcommit {id} {
    global commitdata commitinfo

    if {[info exists commitdata($id)]} {
        parsecommit $id $commitdata($id) 1
    } else {
        readcommit $id
        if {![info exists commitinfo($id)]} {
            set commitinfo($id) [list [mc "No commit information available"]]
        }
    }
    return 1
}

# Expand an abbreviated commit ID to a list of full 40-char (or 64-char
# for SHA256 repo) IDs that match and are present in the current view.
# This is fairly slow...
proc longid {prefix} {
    global varcid curview vshortids

    set ids {}
    if {[string length $prefix] >= 4} {
        set vshortid $curview,[string range $prefix 0 3]
        if {[info exists vshortids($vshortid)]} {
            foreach id $vshortids($vshortid) {
                if {[string match "$prefix*" $id]} {
                    if {[lsearch -exact $ids $id] < 0} {
                        lappend ids $id
                        if {[llength $ids] >= 2} break
                    }
                }
            }
        }
    } else {
        foreach match [array names varcid "$curview,$prefix*"] {
            lappend ids [lindex [split $match ","] 1]
            if {[llength $ids] >= 2} break
        }
    }
    return $ids
}

proc readrefs {} {
    global tagids idtags headids idheads tagobjid upstreamofref
    global otherrefids idotherrefs mainhead mainheadid
    global selecthead selectheadid
    global hideremotes
    global tclencoding
    global hashlength

    foreach v {tagids idtags headids idheads otherrefids idotherrefs upstreamofref} {
        unset -nocomplain $v
    }
    set refd [safe_open_command [list git show-ref -d]]
    if {$tclencoding != {}} {
        fconfigure $refd -encoding $tclencoding
    }
    while {[gets $refd line] >= 0} {
        if {[string index $line $hashlength] ne " "} continue
        set id [string range $line 0 [expr {$hashlength - 1}]]
        set ref [string range $line [expr {$hashlength + 1}] end]
        if {![string match "refs/*" $ref]} continue
        set name [string range $ref 5 end]
        if {[string match "remotes/*" $name]} {
            if {![string match "*/HEAD" $name] && !$hideremotes} {
                set headids($name) $id
                lappend idheads($id) $name
            }
        } elseif {[string match "heads/*" $name]} {
            set name [string range $name 6 end]
            set headids($name) $id
            lappend idheads($id) $name
        } elseif {[string match "tags/*" $name]} {
            # this lets refs/tags/foo^{} overwrite refs/tags/foo,
            # which is what we want since the former is the commit ID
            set name [string range $name 5 end]
            if {[string match "*^{}" $name]} {
                set name [string range $name 0 end-3]
            } else {
                set tagobjid($name) $id
            }
            set tagids($name) $id
            lappend idtags($id) $name
        } else {
            set otherrefids($name) $id
            lappend idotherrefs($id) $name
        }
    }
    catch {close $refd}
    set mainhead {}
    set mainheadid {}
    catch {
        set mainheadid [exec git rev-parse HEAD]
        set thehead [exec git symbolic-ref HEAD]
        if {[string match "refs/heads/*" $thehead]} {
            set mainhead [string range $thehead 11 end]
        }
    }
    set selectheadid {}
    if {$selecthead ne {}} {
        catch {
            set selectheadid [safe_exec [list git rev-parse --verify $selecthead]]
        }
    }
    #load the local_branch->upstream mapping
    # the result of the for-each-ref command produces: local_branch NUL upstream
    set refd [safe_open_command [list git for-each-ref {--format=%(refname:short)%00%(upstream)} refs/heads/]]
    while {[gets $refd local_tracking] >= 0} {
        set line [split $local_tracking \0]
        if {[lindex $line 1] ne {}} {
            set upstream_ref [string map {"refs/" ""} [lindex $line 1]]
            set upstreamofref([lindex $line 0]) $upstream_ref
        }
    }
    catch {close $refd}
}

# skip over fake commits
proc first_real_row {} {
    global nullid nullid2 numcommits

    for {set row 0} {$row < $numcommits} {incr row} {
        set id [commitonrow $row]
        if {$id ne $nullid && $id ne $nullid2} {
            break
        }
    }
    return $row
}

# update things for a head moved to a child of its previous location
proc movehead {id name} {
    global headids idheads

    removehead $headids($name) $name
    set headids($name) $id
    lappend idheads($id) $name
}

# update things when a head has been removed
proc removehead {id name} {
    global headids idheads

    if {$idheads($id) eq $name} {
        unset idheads($id)
    } else {
        set i [lsearch -exact $idheads($id) $name]
        if {$i >= 0} {
            set idheads($id) [lreplace $idheads($id) $i $i]
        }
    }
    unset headids($name)
}

proc ttk_toplevel {w args} {
    eval [linsert $args 0 ::toplevel $w]
    place [ttk::frame $w._toplevel_background] -x 0 -y 0 -relwidth 1 -relheight 1
    return $w
}

proc make_transient {window origin} {
    wm transient $window $origin

    # Windows fails to place transient windows normally, so
    # schedule a callback to center them on the parent.
    if {[tk windowingsystem] eq {win32}} {
        after idle [list tk::PlaceWindow $window widget $origin]
    }
}

proc show_error {w top msg} {
    if {[wm state $top] eq "withdrawn"} { wm deiconify $top }
    message $w.m -text $msg -justify center -aspect 400
    pack $w.m -side top -fill x -padx 20 -pady 20
    ttk::button $w.ok -default active -text [mc OK] -command "destroy $top"
    pack $w.ok -side bottom -fill x
    bind $top <Visibility> "grab $top; focus $top"
    bind $top <Key-Return> "destroy $top"
    bind $top <Key-space>  "destroy $top"
    bind $top <Key-Escape> "destroy $top"
    tkwait window $top
}

proc error_popup {msg {owner .}} {
    if {[tk windowingsystem] eq "win32"} {
        tk_messageBox -icon error -type ok -title [wm title .] \
            -parent $owner -message $msg
    } else {
        set w .error
        ttk_toplevel $w
        make_transient $w $owner
        show_error $w $w $msg
    }
}

proc confirm_popup {msg {owner .}} {
    global confirm_ok
    set confirm_ok 0
    set w .confirm
    ttk_toplevel $w
    make_transient $w $owner
    message $w.m -text $msg -justify center -aspect 400
    pack $w.m -side top -fill x -padx 20 -pady 20
    ttk::button $w.ok -text [mc OK] -command "set confirm_ok 1; destroy $w"
    pack $w.ok -side left -fill x
    ttk::button $w.cancel -text [mc Cancel] -command "destroy $w"
    pack $w.cancel -side right -fill x
    bind $w <Visibility> "grab $w; focus $w"
    bind $w <Key-Return> "set confirm_ok 1; destroy $w"
    bind $w <Key-space>  "set confirm_ok 1; destroy $w"
    bind $w <Key-Escape> "destroy $w"
    tk::PlaceWindow $w widget $owner
    tkwait window $w
    return $confirm_ok
}

proc haveselectionclipboard {} {
    return [expr {[tk windowingsystem] eq "x11"}]
}

proc setoptions {} {
    if {[tk windowingsystem] ne "win32"} {
        option add *Panedwindow.showHandle 1 startupFile
        option add *Panedwindow.sashRelief raised startupFile
        if {[tk windowingsystem] ne "aqua"} {
            option add *Menu.font uifont startupFile
        }
    } else {
        option add *Menu.TearOff 0 startupFile
    }
    option add *Button.font uifont startupFile
    option add *Checkbutton.font uifont startupFile
    option add *Radiobutton.font uifont startupFile
    option add *Menubutton.font uifont startupFile
    option add *Label.font uifont startupFile
    option add *Message.font uifont startupFile
    option add *Entry.font textfont startupFile
    option add *Text.font textfont startupFile
    option add *Labelframe.font uifont startupFile
    option add *Spinbox.font textfont startupFile
    option add *Listbox.font mainfont startupFile
}

proc setttkstyle {} {
    eval font configure TkDefaultFont [fontflags mainfont]
    eval font configure TkTextFont [fontflags textfont]
    eval font configure TkHeadingFont [fontflags mainfont]
    eval font configure TkCaptionFont [fontflags mainfont] -weight bold
    eval font configure TkTooltipFont [fontflags uifont]
    eval font configure TkFixedFont   [fontflags textfont]
    eval font configure TkIconFont    [fontflags uifont]
    eval font configure TkMenuFont    [fontflags uifont]
    eval font configure TkSmallCaptionFont [fontflags uifont]
}

# Make a menu and submenus.
# m is the window name for the menu, items is the list of menu items to add.
# Each item is a list {mc label type description options...}
# mc is ignored; it's so we can put mc there to alert xgettext
# label is the string that appears in the menu
# type is cascade, command or radiobutton (should add checkbutton)
# description depends on type; it's the sublist for cascade, the
# command to invoke for command, or {variable value} for radiobutton
proc makemenu {m items} {
    menu $m
    if {[tk windowingsystem] eq {aqua}} {
        set Meta1 Cmd
    } else {
        set Meta1 Ctrl
    }
    foreach i $items {
        set name [mc [lindex $i 1]]
        set type [lindex $i 2]
        set thing [lindex $i 3]
        set params [list $type]
        if {$name ne {}} {
            set u [string first "&" [string map {&& x} $name]]
            lappend params -label [string map {&& & & {}} $name]
            if {$u >= 0} {
                lappend params -underline $u
            }
        }
        switch -- $type {
            "cascade" {
                set submenu [string tolower [string map {& ""} [lindex $i 1]]]
                lappend params -menu $m.$submenu
            }
            "command" {
                lappend params -command $thing
            }
            "radiobutton" {
                lappend params -variable [lindex $thing 0] \
                    -value [lindex $thing 1]
            }
        }
        set tail [lrange $i 4 end]
        regsub -all {\yMeta1\y} $tail $Meta1 tail
        eval $m add $params $tail
        if {$type eq "cascade"} {
            makemenu $m.$submenu $thing
        }
    }
}

# translate string and remove ampersands
proc mca {str} {
    return [string map {&& & & {}} [mc $str]]
}

proc cleardropsel {w} {
    $w selection clear
}
proc makedroplist {w varname args} {
    set width 0
    foreach label $args {
        set cx [string length $label]
        if {$cx > $width} {set width $cx}
    }
    set gm [ttk::combobox $w -width $width -state readonly\
        -textvariable $varname -values $args \
        -exportselection false]
    bind $gm <<ComboboxSelected>> [list $gm selection clear]
    return $gm
}

proc scrollval {D {koff 0}} {
    global kscroll scroll_D0
    return [expr int(-($D / $scroll_D0) * max(1, $kscroll-$koff))]
}

proc bind_mousewheel {} {
    global canv cflist ctext
    bindall <MouseWheel> {allcanvs yview scroll [scrollval %D] units}
    bindall <Shift-MouseWheel> break
    bind $ctext <MouseWheel> {$ctext yview scroll [scrollval %D 2] units}
    bind $ctext <Shift-MouseWheel> {$ctext xview scroll [scrollval %D 2] units}
    bind $cflist <MouseWheel> {$cflist yview scroll [scrollval %D 2] units}
    bind $cflist <Shift-MouseWheel> break
    bind $canv <Shift-MouseWheel> {$canv xview scroll [scrollval %D] units}
}

proc bind_mousewheel_buttons {} {
    global canv cflist ctext
        bindall <ButtonRelease-4> {allcanvs yview scroll [scrollval 1] units}
        bindall <ButtonRelease-5> {allcanvs yview scroll [scrollval -1] units}
        bindall <Shift-ButtonRelease-4> break
        bindall <Shift-ButtonRelease-5> break
        bind $ctext <ButtonRelease-4> {$ctext yview scroll [scrollval 1 2] units}
        bind $ctext <ButtonRelease-5> {$ctext yview scroll  [scrollval -1 2] units}
        bind $ctext <Shift-ButtonRelease-4> {$ctext xview scroll [scrollval 1 2] units}
        bind $ctext <Shift-ButtonRelease-5> {$ctext xview scroll  [scrollval -1 2] units}
        bind $cflist <ButtonRelease-4> {$cflist yview scroll [scrollval 1 2] units}
        bind $cflist <ButtonRelease-5> {$cflist yview scroll  [scrollval -1 2] units}
        bind $cflist <Shift-ButtonRelease-4> break
        bind $cflist <Shift-ButtonRelease-5> break
        bind $canv <Shift-ButtonRelease-4> {$canv xview scroll [scrollval 1] units}
        bind $canv <Shift-ButtonRelease-5> {$canv xview scroll [scrollval -1] units}
}

proc makewindow {} {
    global canv canv2 canv3 linespc charspc ctext cflist cscroll
    global tabstop
    global findtype findtypemenu findloc findstring fstring geometry
    global entries sha1entry sha1string sha1but
    global diffcontextstring diffcontext
    global ignorespace
    global maincursor textcursor curtextcursor
    global rowctxmenu fakerowmenu mergemax wrapcomment wrapdefault
    global highlight_files gdttype
    global searchstring sstring
    global bgcolor fgcolor bglist fglist diffcolors diffbgcolors selectbgcolor
    global uifgcolor uifgdisabledcolor
    global filesepbgcolor filesepfgcolor
    global mergecolors foundbgcolor currentsearchhitbgcolor
    global headctxmenu progresscanv progressitem progresscoords statusw
    global fprogitem fprogcoord lastprogupdate progupdatepending
    global rprogitem rprogcoord rownumsel numcommits
    global worddiff
    global hashlength scroll_D0

    # The "mc" arguments here are purely so that xgettext
    # sees the following string as needing to be translated
    set file {
        mc "&File" cascade {
            {mc "&Update" command updatecommits -accelerator F5}
            {mc "&Reload" command reloadcommits -accelerator Shift-F5}
            {mc "Reread re&ferences" command rereadrefs}
            {mc "&List references" command showrefs -accelerator F2}
            {xx "" separator}
            {mc "Start git &gui" command {safe_exec_redirect [list git gui] [list &]}}
            {xx "" separator}
            {mc "&Quit" command doquit -accelerator Meta1-Q}
        }}
    set edit {
        mc "&Edit" cascade {
            {mc "&Preferences" command doprefs}
        }}
    set view {
        mc "&View" cascade {
            {mc "&New view..." command {newview 0} -accelerator Shift-F4}
            {mc "&Edit view..." command editview -state disabled -accelerator F4}
            {mc "&Delete view" command delview -state disabled}
            {xx "" separator}
            {mc "&All files" radiobutton {selectedview 0} -command {showview 0}}
        }}
    if {[tk windowingsystem] ne "aqua"} {
        set help {
        mc "&Help" cascade {
            {mc "&About gitk" command about}
            {mc "&Key bindings" command keys}
        }}
        set bar [list $file $edit $view $help]
    } else {
        proc ::tk::mac::ShowPreferences {} {doprefs}
        proc ::tk::mac::Quit {} {doquit}
        lset file end [lreplace [lindex $file end] end-1 end]
        set apple {
        xx "&Apple" cascade {
            {mc "&About gitk" command about}
            {xx "" separator}
        }}
        set help {
        mc "&Help" cascade {
            {mc "&Key bindings" command keys}
        }}
        set bar [list $apple $file $view $help]
    }
    makemenu .bar $bar
    . configure -menu .bar

    # cover the non-themed toplevel with a themed frame.
    place [ttk::frame ._main_background] -x 0 -y 0 -relwidth 1 -relheight 1

    # the gui has upper and lower half, parts of a paned window.
    ttk::panedwindow .ctop -orient vertical

    # possibly use assumed geometry
    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(pwsash0) [list [expr {40 * $charspc}] 2]
        set geometry(pwsash1) [list [expr {60 * $charspc}] 2]
    }

    # the upper half will have a paned window, a scroll bar to the right, and some stuff below
    ttk::frame .tf -height $geometry(topheight) -width $geometry(topwidth)
    ttk::frame .tf.histframe
    ttk::panedwindow .tf.histframe.pwclist -orient horizontal

    # create three canvases
    set cscroll .tf.histframe.csb
    set canv .tf.histframe.pwclist.canv
    canvas $canv \
        -selectbackground $selectbgcolor \
        -background $bgcolor -bd 0 \
        -xscrollincr $linespc \
        -yscrollincr $linespc -yscrollcommand "scrollcanv $cscroll"
    .tf.histframe.pwclist add $canv
    set canv2 .tf.histframe.pwclist.canv2
    canvas $canv2 \
        -selectbackground $selectbgcolor \
        -background $bgcolor -bd 0 -yscrollincr $linespc
    .tf.histframe.pwclist add $canv2
    set canv3 .tf.histframe.pwclist.canv3
    canvas $canv3 \
        -selectbackground $selectbgcolor \
        -background $bgcolor -bd 0 -yscrollincr $linespc
    .tf.histframe.pwclist add $canv3
    bind .tf.histframe.pwclist <Map> {
        bind %W <Map> {}
        .tf.histframe.pwclist sashpos 1 [lindex $::geometry(pwsash1) 0]
        .tf.histframe.pwclist sashpos 0 [lindex $::geometry(pwsash0) 0]
    }

    # a scroll bar to rule them
    ttk::scrollbar $cscroll -command {allcanvs yview}
    pack $cscroll -side right -fill y
    bind .tf.histframe.pwclist <Configure> {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
    ttk::frame .tf.bar
    ttk::frame .tf.lbar -height 15

    set sha1entry .tf.bar.sha1
    set entries $sha1entry
    set sha1but .tf.bar.sha1label
    button $sha1but -text "[mc "Commit ID:"] " -state disabled -relief flat \
        -command gotocommit -width 8
    $sha1but conf -disabledforeground [$sha1but cget -foreground]
    pack .tf.bar.sha1label -side left
    ttk::entry $sha1entry -width $hashlength -font textfont -textvariable sha1string
    trace add variable sha1string write sha1change
    pack $sha1entry -side left -pady 2

    set bm_left_data {
        #define left_width 16
        #define left_height 16
        static unsigned char left_bits[] = {
        0x00, 0x00, 0xc0, 0x01, 0xe0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1c, 0x00,
        0x0e, 0x00, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x0e, 0x00, 0x1c, 0x00,
        0x38, 0x00, 0x70, 0x00, 0xe0, 0x00, 0xc0, 0x01};
    }
    set bm_right_data {
        #define right_width 16
        #define right_height 16
        static unsigned char right_bits[] = {
        0x00, 0x00, 0xc0, 0x01, 0x80, 0x03, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x1c,
        0x00, 0x38, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x00, 0x38, 0x00, 0x1c,
        0x00, 0x0e, 0x00, 0x07, 0x80, 0x03, 0xc0, 0x01};
    }
    image create bitmap bm-left -data $bm_left_data -foreground $uifgcolor
    image create bitmap bm-left-gray -data $bm_left_data -foreground $uifgdisabledcolor
    image create bitmap bm-right -data $bm_right_data -foreground $uifgcolor
    image create bitmap bm-right-gray -data $bm_right_data -foreground $uifgdisabledcolor

    ttk::button .tf.bar.leftbut -command goback -state disabled -width 26
    .tf.bar.leftbut configure -image [list bm-left disabled bm-left-gray]
    pack .tf.bar.leftbut -side left -fill y
    ttk::button .tf.bar.rightbut -command goforw -state disabled -width 26
    .tf.bar.rightbut configure -image [list bm-right disabled bm-right-gray]
    pack .tf.bar.rightbut -side left -fill y

    ttk::label .tf.bar.rowlabel -text [mc "Row"]
    set rownumsel {}
    ttk::label .tf.bar.rownum -width 7 -textvariable rownumsel \
        -relief sunken -anchor e
    ttk::label .tf.bar.rowlabel2 -text "/"
    ttk::label .tf.bar.numcommits -width 7 -textvariable numcommits \
        -relief sunken -anchor e
    pack .tf.bar.rowlabel .tf.bar.rownum .tf.bar.rowlabel2 .tf.bar.numcommits \
        -side left
    global selectedline
    trace add variable selectedline write selectedline_change

    # Status label and progress bar
    set statusw .tf.bar.status
    ttk::label $statusw -width 15 -relief sunken
    pack $statusw -side left -padx 5
    set progresscanv [ttk::progressbar .tf.bar.progress]
    pack $progresscanv -side right -expand 1 -fill x -padx {0 2}
    set progresscoords {0 0}
    set fprogcoord 0
    set rprogcoord 0
    bind $progresscanv <Configure> adjustprogress
    set lastprogupdate [clock clicks -milliseconds]
    set progupdatepending 0

    # build up the bottom bar of upper window
    ttk::label .tf.lbar.flabel -text "[mc "Find"] "

    set bm_down_data {
        #define down_width 16
        #define down_height 16
        static unsigned char down_bits[] = {
        0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
        0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
        0x87, 0xe1, 0x8e, 0x71, 0x9c, 0x39, 0xb8, 0x1d,
        0xf0, 0x0f, 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01};
    }
    image create bitmap bm-down -data $bm_down_data -foreground $uifgcolor
    ttk::button .tf.lbar.fnext -width 26 -command {dofind 1 1}
    .tf.lbar.fnext configure -image bm-down

    set bm_up_data {
        #define up_width 16
        #define up_height 16
        static unsigned char up_bits[] = {
        0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f,
        0xb8, 0x1d, 0x9c, 0x39, 0x8e, 0x71, 0x87, 0xe1,
        0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
        0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01};
    }
    image create bitmap bm-up -data $bm_up_data -foreground $uifgcolor
    ttk::button .tf.lbar.fprev -width 26 -command {dofind -1 1}
    .tf.lbar.fprev configure -image bm-up

    ttk::label .tf.lbar.flab2 -text " [mc "commit"] "

    pack .tf.lbar.flabel .tf.lbar.fnext .tf.lbar.fprev .tf.lbar.flab2 \
        -side left -fill y
    set gdttype [mc "containing:"]
    set gm [makedroplist .tf.lbar.gdttype gdttype \
                [mc "containing:"] \
                [mc "touching paths:"] \
                [mc "adding/removing string:"] \
                [mc "changing lines matching:"]]
    trace add variable gdttype write gdttype_change
    pack .tf.lbar.gdttype -side left -fill y

    set findstring {}
    set fstring .tf.lbar.findstring
    lappend entries $fstring
    ttk::entry $fstring -width 30 -textvariable findstring
    trace add variable findstring write find_change
    set findtype [mc "Exact"]
    set findtypemenu [makedroplist .tf.lbar.findtype \
                          findtype [mc "Exact"] [mc "IgnCase"] [mc "Regexp"]]
    trace add variable findtype write findcom_change
    set findloc [mc "All fields"]
    makedroplist .tf.lbar.findloc findloc [mc "All fields"] [mc "Headline"] \
        [mc "Comments"] [mc "Author"] [mc "Committer"]
    trace add variable findloc write find_change
    pack .tf.lbar.findloc -side right
    pack .tf.lbar.findtype -side right
    pack $fstring -side left -expand 1 -fill x

    # 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
    ttk::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)]} {
        ttk::frame .bleft -width $geometry(botwidth)
    } else {
        ttk::frame .bleft -width $geometry(botwidth) -height $geometry(botheight)
    }
    ttk::frame .bleft.top
    ttk::frame .bleft.mid
    ttk::frame .bleft.bottom

    # gap between sub-widgets
    set wgap [font measure uifont "i"]

    ttk::button .bleft.top.search -text [mc "Search"] -command dosearch
    pack .bleft.top.search -side left -padx 5
    set sstring .bleft.top.sstring
    set searchstring ""
    ttk::entry $sstring -width 20 -textvariable searchstring
    lappend entries $sstring
    trace add variable searchstring write incrsearch
    pack $sstring -side left -expand 1 -fill x
    ttk::radiobutton .bleft.mid.diff -text [mc "Diff"] \
        -command changediffdisp -variable diffelide -value {0 0}
    ttk::radiobutton .bleft.mid.old -text [mc "Old version"] \
        -command changediffdisp -variable diffelide -value {0 1}
    ttk::radiobutton .bleft.mid.new -text [mc "New version"] \
        -command changediffdisp -variable diffelide -value {1 0}

    ttk::label .bleft.mid.labeldiffcontext -text "      [mc "Lines of context"]: "
    pack .bleft.mid.diff .bleft.mid.old .bleft.mid.new -side left -ipadx $wgap
    spinbox .bleft.mid.diffcontext -width 5 \
        -from 0 -increment 1 -to 10000000 \
        -validate all -validatecommand "diffcontextvalidate %P" \
        -textvariable diffcontextstring
    .bleft.mid.diffcontext set $diffcontext
    trace add variable diffcontextstring write diffcontextchange
    lappend entries .bleft.mid.diffcontext
    pack .bleft.mid.labeldiffcontext .bleft.mid.diffcontext -side left -ipadx $wgap
    ttk::checkbutton .bleft.mid.ignspace -text [mc "Ignore space change"] \
        -command changeignorespace -variable ignorespace
    pack .bleft.mid.ignspace -side left -padx 5

    set worddiff [mc "Line diff"]
    makedroplist .bleft.mid.worddiff worddiff [mc "Line diff"] \
        [mc "Markup words"] [mc "Color words"]
    trace add variable worddiff write changeworddiff
    pack .bleft.mid.worddiff -side left -padx 5

    set ctext .bleft.bottom.ctext
    text $ctext -background $bgcolor -foreground $fgcolor \
        -state disabled -undo 0 -font textfont \
        -yscrollcommand scrolltext -wrap $wrapdefault \
        -xscrollcommand ".bleft.bottom.sbhorizontal set"
    $ctext conf -tabstyle wordprocessor
    ttk::scrollbar .bleft.bottom.sb -command "$ctext yview"
    ttk::scrollbar .bleft.bottom.sbhorizontal -command "$ctext xview" -orient h
    pack .bleft.top -side top -fill x
    pack .bleft.mid -side top -fill x
    grid $ctext .bleft.bottom.sb -sticky nsew
    grid .bleft.bottom.sbhorizontal -sticky ew
    grid columnconfigure .bleft.bottom 0 -weight 1
    grid rowconfigure .bleft.bottom 0 -weight 1
    grid rowconfigure .bleft.bottom 1 -weight 0
    pack .bleft.bottom -side top -fill both -expand 1
    lappend bglist $ctext
    lappend fglist $ctext

    $ctext tag conf comment -wrap $wrapcomment
    $ctext tag conf filesep -font textfontbold -fore $filesepfgcolor -back $filesepbgcolor
    $ctext tag conf hunksep -fore [lindex $diffcolors 2]
    $ctext tag conf d0 -fore [lindex $diffcolors 0]
    $ctext tag conf d0 -back [lindex $diffbgcolors 0]
    $ctext tag conf dresult -fore [lindex $diffcolors 1]
    $ctext tag conf dresult -back [lindex $diffbgcolors 1]
    $ctext tag conf m0 -fore [lindex $mergecolors 0]
    $ctext tag conf m1 -fore [lindex $mergecolors 1]
    $ctext tag conf m2 -fore [lindex $mergecolors 2]
    $ctext tag conf m3 -fore [lindex $mergecolors 3]
    $ctext tag conf m4 -fore [lindex $mergecolors 4]
    $ctext tag conf m5 -fore [lindex $mergecolors 5]
    $ctext tag conf m6 -fore [lindex $mergecolors 6]
    $ctext tag conf m7 -fore [lindex $mergecolors 7]
    $ctext tag conf m8 -fore [lindex $mergecolors 8]
    $ctext tag conf m9 -fore [lindex $mergecolors 9]
    $ctext tag conf m10 -fore [lindex $mergecolors 10]
    $ctext tag conf m11 -fore [lindex $mergecolors 11]
    $ctext tag conf m12 -fore [lindex $mergecolors 12]
    $ctext tag conf m13 -fore [lindex $mergecolors 13]
    $ctext tag conf m14 -fore [lindex $mergecolors 14]
    $ctext tag conf m15 -fore [lindex $mergecolors 15]
    $ctext tag conf mmax -fore darkgrey
    set mergemax 16
    $ctext tag conf mresult -font textfontbold
    $ctext tag conf msep -font textfontbold
    $ctext tag conf found -back $foundbgcolor
    $ctext tag conf currentsearchhit -back $currentsearchhitbgcolor
    $ctext tag conf wwrap -wrap word -lmargin2 1c
    $ctext tag conf bold -font textfontbold
    # set these to the lowest priority:
    $ctext tag lower currentsearchhit
    $ctext tag lower found
    $ctext tag lower filesep
    $ctext tag lower dresult
    $ctext tag lower d0

    .pwbottom add .bleft

    # lower right
    ttk::frame .bright
    ttk::frame .bright.mode
    ttk::radiobutton .bright.mode.patch -text [mc "Patch"] \
        -command reselectline -variable cmitmode -value "patch"
    ttk::radiobutton .bright.mode.tree -text [mc "Tree"] \
        -command reselectline -variable cmitmode -value "tree"
    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 \
        -selectbackground $selectbgcolor \
        -background $bgcolor -foreground $fgcolor \
        -font mainfont \
        -tabs [list $indent [expr {2 * $indent}]] \
        -yscrollcommand ".bright.sb set" \
        -cursor [. cget -cursor] \
        -spacing1 1 -spacing3 1
    lappend bglist $cflist
    lappend fglist $cflist
    ttk::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 mainfontbold

    .pwbottom add .bright
    .ctop add .pwbottom

    # restore window width & height if known
    if {[info exists geometry(main)]} {
        if {[scan $geometry(main) "%dx%d" w h] >= 2} {
            if {$w > [winfo screenwidth .]} {
                set w [winfo screenwidth .]
            }
            if {$h > [winfo screenheight .]} {
                set h [winfo screenheight .]
            }
            wm geometry . "${w}x$h"
        }
    }

    if {[info exists geometry(state)] && $geometry(state) eq "zoomed"} {
        wm state . $geometry(state)
    }

    if {[tk windowingsystem] eq {aqua}} {
        set M1B M1
        set ::BM "3"
    } else {
        set M1B Control
        set ::BM "2"
    }

    bind .ctop <Map> {
        bind %W <Map> {}
        %W sashpos 0 $::geometry(topheight)
    }
    bind .pwbottom <Map> {
        bind %W <Map> {}
        %W sashpos 0 $::geometry(botwidth)
    }
    bind .pwbottom <Configure> {resizecdetpanes %W %w}

    pack .ctop -fill both -expand 1
    bindall <1> {selcanvline %W %x %y}

    #Mouse / touchpad scrolling
    if {[tk windowingsystem] == "win32"} {
        set scroll_D0 120
        bind_mousewheel
    } elseif {[tk windowingsystem] == "x11"} {
        set scroll_D0 1
        bind_mousewheel_buttons
    } elseif {[tk windowingsystem] == "aqua"} {
        set scroll_D0 1
        bind_mousewheel
    } else {
        puts stderr [mc "Unknown windowing system, cannot bind mouse"]
    }
    bindall <$::BM> "canvscan mark %W %x %y"
    bindall <B$::BM-Motion> "canvscan dragto %W %x %y"
    bind all <$M1B-Key-w> {destroy [winfo toplevel %W]}
    bind . <$M1B-Key-w> doquit
    bindkey <Home> selfirstline
    bindkey <End> sellastline
    bind . <Key-Up> "selnextline -1"
    bind . <Key-Down> "selnextline 1"
    bind . <Shift-Key-Up> "dofind -1 0"
    bind . <Shift-Key-Down> "dofind 1 0"
    bindkey <<NextChar>> "goforw"
    bindkey <<PrevChar>> "goback"
    bind . <Key-Prior> "selnextpage -1"
    bind . <Key-Next> "selnextpage 1"
    bind . <$M1B-Home> "allcanvs yview moveto 0.0"
    bind . <$M1B-End> "allcanvs yview moveto 1.0"
    bind . <$M1B-Key-Up> "allcanvs yview scroll -1 units"
    bind . <$M1B-Key-Down> "allcanvs yview scroll 1 units"
    bind . <$M1B-Key-Prior> "allcanvs yview scroll -1 pages"
    bind . <$M1B-Key-Next> "allcanvs yview scroll 1 pages"
    bindkey <Key-Delete> "$ctext yview scroll -1 pages"
    bindkey <Key-BackSpace> "$ctext yview scroll -1 pages"
    bindkey <Key-space> "$ctext yview scroll 1 pages"
    bindkey p "selnextline -1"
    bindkey n "selnextline 1"
    bindkey z "goback"
    bindkey x "goforw"
    bindkey k "selnextline -1"
    bindkey j "selnextline 1"
    bindkey h "goback"
    bindkey l "goforw"
    bindkey b prevfile
    bindkey d "$ctext yview scroll 18 units"
    bindkey u "$ctext yview scroll -18 units"
    bindkey g {$sha1entry delete 0 end; focus $sha1entry}
    bindkey / {focus $fstring}
    bindkey <Key-KP_Divide> {focus $fstring}
    bindkey <Key-Return> {dofind 1 1}
    bindkey ? {dofind -1 1}
    bindkey f nextfile
    bind . <F5> updatecommits
    bindmodfunctionkey Shift 5 reloadcommits
    bind . <F2> showrefs
    bindmodfunctionkey Shift 4 {newview 0}
    bind . <F4> edit_or_newview
    bind . <$M1B-q> doquit
    bind . <$M1B-f> {dofind 1 1}
    bind . <$M1B-g> {dofind 1 0}
    bind . <$M1B-r> dosearchback
    bind . <$M1B-s> dosearch
    bind . <$M1B-equal> {incrfont 1}
    bind . <$M1B-plus> {incrfont 1}
    bind . <$M1B-KP_Add> {incrfont 1}
    bind . <$M1B-minus> {incrfont -1}
    bind . <$M1B-KP_Subtract> {incrfont -1}
    wm protocol . WM_DELETE_WINDOW doquit
    bind . <Destroy> {stop_backends}
    bind . <Button-1> "click %W"
    bind $fstring <Key-Return> {dofind 1 1}
    bind $sha1entry <Key-Return> {gotocommit; break}
    bind $sha1entry <<PasteSelection>> clearsha1
    bind $sha1entry <<Paste>> clearsha1
    bind $cflist <1> {sel_flist %W %x %y; break}
    bind $cflist <B1-Motion> {sel_flist %W %x %y; break}
    bind $cflist <ButtonRelease-1> {treeclick %W %x %y}
    global ctxbut
    bind $cflist $ctxbut {pop_flist_menu %W %X %Y %x %y}
    bind $ctext $ctxbut {pop_diff_menu %W %X %Y %x %y}
    bind $ctext <Button-1> {focus %W}
    bind $ctext <<Selection>> rehighlight_search_results
    for {set i 1} {$i < 10} {incr i} {
        bind . <$M1B-Key-$i> [list go_to_parent $i]
    }

    set maincursor [. cget -cursor]
    set textcursor [$ctext cget -cursor]
    set curtextcursor $textcursor

    set rowctxmenu .rowctxmenu
    makemenu $rowctxmenu {
        {mc "Diff this -> selected" command {diffvssel 0}}
        {mc "Diff selected -> this" command {diffvssel 1}}
        {mc "Make patch" command mkpatch}
        {mc "Create tag" command mktag}
        {mc "Copy commit reference" command copyreference}
        {mc "Write commit to file" command writecommit}
        {mc "Create new branch" command mkbranch}
        {mc "Cherry-pick this commit" command cherrypick}
        {mc "Reset HEAD branch to here" command resethead}
        {mc "Mark this commit" command markhere}
        {mc "Return to mark" command gotomark}
        {mc "Find descendant of this and mark" command find_common_desc}
        {mc "Compare with marked commit" command compare_commits}
        {mc "Diff this -> marked commit" command {diffvsmark 0}}
        {mc "Diff marked commit -> this" command {diffvsmark 1}}
        {mc "Revert this commit" command revert}
    }
    $rowctxmenu configure -tearoff 0

    set fakerowmenu .fakerowmenu
    makemenu $fakerowmenu {
        {mc "Diff this -> selected" command {diffvssel 0}}
        {mc "Diff selected -> this" command {diffvssel 1}}
        {mc "Make patch" command mkpatch}
        {mc "Diff this -> marked commit" command {diffvsmark 0}}
        {mc "Diff marked commit -> this" command {diffvsmark 1}}
    }
    $fakerowmenu configure -tearoff 0

    set headctxmenu .headctxmenu
    makemenu $headctxmenu {
        {mc "Check out this branch" command cobranch}
        {mc "Rename this branch" command mvbranch}
        {mc "Remove this branch" command rmbranch}
        {mc "Copy branch name" command {clipboard clear; clipboard append $headmenuhead}}
    }
    $headctxmenu configure -tearoff 0

    global flist_menu
    set flist_menu .flistctxmenu
    makemenu $flist_menu {
        {mc "Highlight this too" command {flist_hl 0}}
        {mc "Highlight this only" command {flist_hl 1}}
        {mc "External diff" command {external_diff}}
        {mc "Blame parent commit" command {external_blame 1}}
        {mc "Copy path" command {clipboard clear; clipboard append $flist_menu_file}}
    }
    $flist_menu configure -tearoff 0

    global diff_menu
    set diff_menu .diffctxmenu
    makemenu $diff_menu {
        {mc "Show origin of this line" command show_line_source}
        {mc "Run git gui blame on this line" command {external_blame_diff}}
    }
    $diff_menu configure -tearoff 0
}

# Update row number label when selectedline changes
proc selectedline_change {n1 n2 op} {
    global selectedline rownumsel

    if {$selectedline eq {}} {
        set rownumsel {}
    } else {
        set rownumsel [expr {$selectedline + 1}]
    }
}

# mouse-2 makes all windows scan vertically, but only the one
# the cursor is in scans horizontally
proc canvscan {op w x y} {
    global canv canv2 canv3
    foreach c [list $canv $canv2 $canv3] {
        if {$c == $w} {
            $c scan $op $x $y
        } else {
            $c scan $op 0 $y
        }
    }
}

proc scrollcanv {cscroll f0 f1} {
    $cscroll set $f0 $f1
    drawvisible
    flushhighlights
}

# when we make a key binding for the toplevel, make sure
# it doesn't get triggered when that key is pressed in the
# find string entry widget.
proc bindkey {ev script} {
    global entries
    bind . $ev $script
    set escript [bind Entry $ev]
    if {$escript == {}} {
        set escript [bind Entry <Key>]
    }
    foreach e $entries {
        bind $e $ev "$escript; break"
    }
}

proc bindmodfunctionkey {mod n script} {
    bind . <$mod-F$n> $script
    catch { bind . <$mod-XF86_Switch_VT_$n> $script }
}

# set the focus back to the toplevel for any click outside
# the entry widgets
proc click {w} {
    global ctext entries
    foreach e [concat $entries $ctext] {
        if {$w == $e} return
    }
    focus .
}

# Adjust the progress bar for a change in requested extent or canvas size
proc adjustprogress {} {
    global progresscanv
    global fprogcoord

    $progresscanv configure -value [expr {int($fprogcoord * 100)}]
}

proc doprogupdate {} {
    global lastprogupdate progupdatepending

    if {$progupdatepending} {
        set progupdatepending 0
        set lastprogupdate [clock clicks -milliseconds]
        update
    }
}

proc config_check_tmp_exists {tries_left} {
    global config_file_tmp

    if {[file exists $config_file_tmp]} {
        incr tries_left -1
        if {$tries_left > 0} {
            after 100 [list config_check_tmp_exists $tries_left]
        } else {
            error_popup "There appears to be a stale $config_file_tmp\
 file, which will prevent gitk from saving its configuration on exit.\
 Please remove it if it is not being used by any existing gitk process."
        }
    }
}

proc config_init_trace {name} {
    global config_variable_changed config_variable_original

    upvar #0 $name var
    set config_variable_changed($name) 0
    set config_variable_original($name) $var
}

proc config_variable_change_cb {name name2 op} {
    global config_variable_changed config_variable_original

    upvar #0 $name var
    if {$op eq "write" &&
        (![info exists config_variable_original($name)] ||
         $config_variable_original($name) ne $var)} {
        set config_variable_changed($name) 1
    }
}

proc savestuff {w} {
    global stuffsaved
    global config_file config_file_tmp
    global config_variables config_variable_changed
    global viewchanged

    upvar #0 viewname current_viewname
    upvar #0 viewfiles current_viewfiles
    upvar #0 viewargs current_viewargs
    upvar #0 viewargscmd current_viewargscmd
    upvar #0 viewperm current_viewperm
    upvar #0 nextviewnum current_nextviewnum

    if {$stuffsaved} return
    if {![winfo viewable .]} return
    set remove_tmp 0
    if {[catch {
        set try_count 0
        while {[catch {set f [safe_open_file $config_file_tmp {WRONLY CREAT EXCL}]}]} {
            if {[incr try_count] > 50} {
                error "Unable to write config file: $config_file_tmp exists"
            }
            after 100
        }
        set remove_tmp 1
        if {$::tcl_platform(platform) eq {windows}} {
            file attributes $config_file_tmp -hidden true
        }
        if {[file exists $config_file]} {
            source $config_file
        }
        foreach var_name $config_variables {
            upvar #0 $var_name var
            upvar 0 $var_name old_var
            if {!$config_variable_changed($var_name) && [info exists old_var]} {
                puts $f [list set $var_name $old_var]
            } else {
                puts $f [list set $var_name $var]
            }
        }

        puts $f "set geometry(main) [wm geometry .]"
        puts $f "set geometry(state) [wm state .]"
        puts $f "set geometry(topwidth) [winfo width .tf]"
        puts $f "set geometry(topheight) [winfo height .tf]"
        puts $f "set geometry(pwsash0) \"[.tf.histframe.pwclist sashpos 0] 1\""
        puts $f "set geometry(pwsash1) \"[.tf.histframe.pwclist sashpos 1] 1\""
        puts $f "set geometry(botwidth) [winfo width .bleft]"
        puts $f "set geometry(botheight) [winfo height .bleft]"

        array set view_save {}
        array set views {}
        if {![info exists permviews]} { set permviews {} }
        foreach view $permviews {
            set view_save([lindex $view 0]) 1
            set views([lindex $view 0]) $view
        }
        puts -nonewline $f "set permviews {"
        for {set v 1} {$v < $current_nextviewnum} {incr v} {
            if {$viewchanged($v)} {
                if {$current_viewperm($v)} {
                    set views($current_viewname($v)) [list $current_viewname($v) $current_viewfiles($v) $current_viewargs($v) $current_viewargscmd($v)]
                } else {
                    set view_save($current_viewname($v)) 0
                }
            }
        }
        # write old and updated view to their places and append remaining to the end
        foreach view $permviews {
            set view_name [lindex $view 0]
            if {$view_save($view_name)} {
                puts $f "{$views($view_name)}"
            }
            unset views($view_name)
        }
        foreach view_name [array names views] {
            puts $f "{$views($view_name)}"
        }
        puts $f "}"
        close $f
        file rename -force $config_file_tmp $config_file
        set remove_tmp 0
    } err]} {
        puts "Error saving config: $err"
    }
    if {$remove_tmp} {
        file delete -force $config_file_tmp
    }
    set stuffsaved 1
}

proc resizeclistpanes {win w} {
    global oldwidth oldsash
    if {[info exists oldwidth($win)]} {
        if {[info exists oldsash($win)]} {
            set s0 [lindex $oldsash($win) 0]
            set s1 [lindex $oldsash($win) 1]
        } else {
            set s0 [$win sashpos 0]
            set s1 [$win sashpos 1]
        }
        if {$w < 60} {
            set sash0 [expr {int($w/2 - 2)}]
            set sash1 [expr {int($w*5/6 - 2)}]
        } else {
            set factor [expr {1.0 * $w / $oldwidth($win)}]
            set sash0 [expr {int($factor * [lindex $s0 0])}]
            set sash1 [expr {int($factor * [lindex $s1 0])}]
            if {$sash0 < 30} {
                set sash0 30
            }
            if {$sash1 < $sash0 + 20} {
                set sash1 [expr {$sash0 + 20}]
            }
            if {$sash1 > $w - 10} {
                set sash1 [expr {$w - 10}]
                if {$sash0 > $sash1 - 20} {
                    set sash0 [expr {$sash1 - 20}]
                }
            }
        }
        $win sashpos 0 $sash0
        $win sashpos 1 $sash1
        set oldsash($win) [list $sash0 $sash1]
    }
    set oldwidth($win) $w
}

proc resizecdetpanes {win w} {
    global oldwidth oldsash
    if {[info exists oldwidth($win)]} {
        if {[info exists oldsash($win)]} {
            set s0 $oldsash($win)
        } else {
            set s0 [$win sashpos 0]
        }
        if {$w < 60} {
            set sash0 [expr {int($w*3/4 - 2)}]
        } else {
            set factor [expr {1.0 * $w / $oldwidth($win)}]
            set sash0 [expr {int($factor * [lindex $s0 0])}]
            if {$sash0 < 45} {
                set sash0 45
            }
            if {$sash0 > $w - 15} {
                set sash0 [expr {$w - 15}]
            }
        }
        $win sashpos 0 $sash0
        set oldsash($win) $sash0
    }
    set oldwidth($win) $w
}

proc allcanvs args {
    global canv canv2 canv3
    eval $canv $args
    eval $canv2 $args
    eval $canv3 $args
}

proc bindall {event action} {
    global canv canv2 canv3
    bind $canv $event $action
    bind $canv2 $event $action
    bind $canv3 $event $action
}

proc about {} {
    global bgcolor
    set w .about
    if {[winfo exists $w]} {
        raise $w
        return
    }
    ttk_toplevel $w
    wm title $w [mc "About gitk"]
    make_transient $w .
    message $w.m -text [mc "
Gitk - a commit viewer for git

Copyright \u00a9 2005-2016 Paul Mackerras

Use and redistribute under the terms of the GNU General Public License"] \
            -justify center -aspect 400 -border 2 -bg $bgcolor -relief groove
    pack $w.m -side top -fill x -padx 2 -pady 2
    ttk::button $w.ok -text [mc "Close"] -command "destroy $w" -default active
    pack $w.ok -side bottom
    bind $w <Visibility> "focus $w.ok"
    bind $w <Key-Escape> "destroy $w"
    bind $w <Key-Return> "destroy $w"
    tk::PlaceWindow $w widget .
}

proc keys {} {
    global bgcolor
    set w .keys
    if {[winfo exists $w]} {
        raise $w
        return
    }
    if {[tk windowingsystem] eq {aqua}} {
        set M1T Cmd
    } else {
        set M1T Ctrl
    }
    ttk_toplevel $w
    wm title $w [mc "Gitk key bindings"]
    make_transient $w .
    message $w.m -text "
[mc "Gitk key bindings:"]

[mc "<%s-Q>		Quit" $M1T]
[mc "<%s-W>		Close window" $M1T]
[mc "<Home>		Move to first commit"]
[mc "<End>		Move to last commit"]
[mc "<Up>, p, k	Move up one commit"]
[mc "<Down>, n, j	Move down one commit"]
[mc "<Left>, z, h	Go back in history list"]
[mc "<Right>, x, l	Go forward in history list"]
[mc "<%s-n>	Go to n-th parent of current commit in history list" $M1T]
[mc "<PageUp>	Move up one page in commit list"]
[mc "<PageDown>	Move down one page in commit list"]
[mc "<%s-Home>	Scroll to top of commit list" $M1T]
[mc "<%s-End>	Scroll to bottom of commit list" $M1T]
[mc "<%s-Up>	Scroll commit list up one line" $M1T]
[mc "<%s-Down>	Scroll commit list down one line" $M1T]
[mc "<%s-PageUp>	Scroll commit list up one page" $M1T]
[mc "<%s-PageDown>	Scroll commit list down one page" $M1T]
[mc "<Shift-Up>	Find backwards (upwards, later commits)"]
[mc "<Shift-Down>	Find forwards (downwards, earlier commits)"]
[mc "<Delete>, b	Scroll diff view up one page"]
[mc "<Backspace>	Scroll diff view up one page"]
[mc "<Space>		Scroll diff view down one page"]
[mc "u		Scroll diff view up 18 lines"]
[mc "d		Scroll diff view down 18 lines"]
[mc "<%s-F>		Find" $M1T]
[mc "<%s-G>		Move to next find hit" $M1T]
[mc "<Return>	Move to next find hit"]
[mc "g		Go to commit"]
[mc "/		Focus the search box"]
[mc "?		Move to previous find hit"]
[mc "f		Scroll diff view to next file"]
[mc "<%s-S>		Search for next hit in diff view" $M1T]
[mc "<%s-R>		Search for previous hit in diff view" $M1T]
[mc "<%s-KP+>	Increase font size" $M1T]
[mc "<%s-plus>	Increase font size" $M1T]
[mc "<%s-KP->	Decrease font size" $M1T]
[mc "<%s-minus>	Decrease font size" $M1T]
[mc "<F5>		Update"]
" \
            -justify left -bg $bgcolor -border 2 -relief groove
    pack $w.m -side top -fill both -padx 2 -pady 2
    ttk::button $w.ok -text [mc "Close"] -command "destroy $w" -default active
    bind $w <Key-Escape> [list destroy $w]
    pack $w.ok -side bottom
    bind $w <Visibility> "focus $w.ok"
    bind $w <Key-Escape> "destroy $w"
    bind $w <Key-Return> "destroy $w"
}

# Procedures for manipulating the file list window at the
# bottom right of the overall window.

proc treeview {w l openlevs} {
    global treecontents treediropen treeheight treeparent treeindex

    set ix 0
    set treeindex() 0
    set lev 0
    set prefix {}
    set prefixend -1
    set prefendstack {}
    set htstack {}
    set ht 0
    set treecontents() {}
    $w conf -state normal
    foreach f $l {
        while {[string range $f 0 $prefixend] ne $prefix} {
            if {$lev <= $openlevs} {
                $w mark set e:$treeindex($prefix) "end -1c"
                $w mark gravity e:$treeindex($prefix) left
            }
            set treeheight($prefix) $ht
            incr ht [lindex $htstack end]
            set htstack [lreplace $htstack end end]
            set prefixend [lindex $prefendstack end]
            set prefendstack [lreplace $prefendstack end end]
            set prefix [string range $prefix 0 $prefixend]
            incr lev -1
        }
        set tail [string range $f [expr {$prefixend+1}] end]
        while {[set slash [string first "/" $tail]] >= 0} {
            lappend htstack $ht
            set ht 0
            lappend prefendstack $prefixend
            incr prefixend [expr {$slash + 1}]
            set d [string range $tail 0 $slash]
            lappend treecontents($prefix) $d
            set oldprefix $prefix
            append prefix $d
            set treecontents($prefix) {}
            set treeindex($prefix) [incr ix]
            set treeparent($prefix) $oldprefix
            set tail [string range $tail [expr {$slash+1}] end]
            if {$lev <= $openlevs} {
                set ht 1
                set treediropen($prefix) [expr {$lev < $openlevs}]
                set bm [expr {$lev == $openlevs? "tri-rt": "tri-dn"}]
                $w mark set d:$ix "end -1c"
                $w mark gravity d:$ix left
                set str "\n"
                for {set i 0} {$i < $lev} {incr i} {append str "\t"}
                $w insert end $str
                $w image create end -align center -image $bm -padx 1 \
                    -name a:$ix
                $w insert end $d [highlight_tag $prefix]
                $w mark set s:$ix "end -1c"
                $w mark gravity s:$ix left
            }
            incr lev
        }
        if {$tail ne {}} {
            if {$lev <= $openlevs} {
                incr ht
                set str "\n"
                for {set i 0} {$i < $lev} {incr i} {append str "\t"}
                $w insert end $str
                $w insert end $tail [highlight_tag $f]
            }
            lappend treecontents($prefix) $tail
        }
    }
    while {$htstack ne {}} {
        set treeheight($prefix) $ht
        incr ht [lindex $htstack end]
        set htstack [lreplace $htstack end end]
        set prefixend [lindex $prefendstack end]
        set prefendstack [lreplace $prefendstack end end]
        set prefix [string range $prefix 0 $prefixend]
    }
    $w conf -state disabled
}

proc linetoelt {l} {
    global treeheight treecontents

    set y 2
    set prefix {}
    while {1} {
        foreach e $treecontents($prefix) {
            if {$y == $l} {
                return "$prefix$e"
            }
            set n 1
            if {[string index $e end] eq "/"} {
                set n $treeheight($prefix$e)
                if {$y + $n > $l} {
                    append prefix $e
                    incr y
                    break
                }
            }
            incr y $n
        }
    }
}

proc highlight_tree {y prefix} {
    global treeheight treecontents cflist

    foreach e $treecontents($prefix) {
        set path $prefix$e
        if {[highlight_tag $path] ne {}} {
            $cflist tag add bold $y.0 "$y.0 lineend"
        }
        incr y
        if {[string index $e end] eq "/" && $treeheight($path) > 1} {
            set y [highlight_tree $y $path]
        }
    }
    return $y
}

proc treeclosedir {w dir} {
    global treediropen treeheight treeparent treeindex

    set ix $treeindex($dir)
    $w conf -state normal
    $w delete s:$ix e:$ix
    set treediropen($dir) 0
    $w image configure a:$ix -image tri-rt
    $w conf -state disabled
    set n [expr {1 - $treeheight($dir)}]
    while {$dir ne {}} {
        incr treeheight($dir) $n
        set dir $treeparent($dir)
    }
}

proc treeopendir {w dir} {
    global treediropen treeheight treeparent treecontents treeindex

    set ix $treeindex($dir)
    $w conf -state normal
    $w image configure a:$ix -image tri-dn
    $w mark set e:$ix s:$ix
    $w mark gravity e:$ix right
    set lev 0
    set str "\n"
    set n [llength $treecontents($dir)]
    for {set x $dir} {$x ne {}} {set x $treeparent($x)} {
        incr lev
        append str "\t"
        incr treeheight($x) $n
    }
    foreach e $treecontents($dir) {
        set de $dir$e
        if {[string index $e end] eq "/"} {
            set iy $treeindex($de)
            $w mark set d:$iy e:$ix
            $w mark gravity d:$iy left
            $w insert e:$ix $str
            set treediropen($de) 0
            $w image create e:$ix -align center -image tri-rt -padx 1 \
                -name a:$iy
            $w insert e:$ix $e [highlight_tag $de]
            $w mark set s:$iy e:$ix
            $w mark gravity s:$iy left
            set treeheight($de) 1
        } else {
            $w insert e:$ix $str
            $w insert e:$ix $e [highlight_tag $de]
        }
    }
    $w mark gravity e:$ix right
    $w conf -state disabled
    set treediropen($dir) 1
    set top [lindex [split [$w index @0,0] .] 0]
    set ht [$w cget -height]
    set l [lindex [split [$w index s:$ix] .] 0]
    if {$l < $top} {
        $w yview $l.0
    } elseif {$l + $n + 1 > $top + $ht} {
        set top [expr {$l + $n + 2 - $ht}]
        if {$l < $top} {
            set top $l
        }
        $w yview $top.0
    }
}

proc treeclick {w x y} {
    global treediropen cmitmode ctext cflist cflist_top

    if {$cmitmode ne "tree"} return
    if {![info exists cflist_top]} return
    set l [lindex [split [$w index "@$x,$y"] "."] 0]
    $cflist tag remove highlight $cflist_top.0 "$cflist_top.0 lineend"
    $cflist tag add highlight $l.0 "$l.0 lineend"
    set cflist_top $l
    if {$l == 1} {
        $ctext yview 1.0
        return
    }
    set e [linetoelt $l]
    if {[string index $e end] ne "/"} {
        showfile $e
    } elseif {$treediropen($e)} {
        treeclosedir $w $e
    } else {
        treeopendir $w $e
    }
}

proc setfilelist {id} {
    global treefilelist cflist jump_to_here

    treeview $cflist $treefilelist($id) 0
    if {$jump_to_here ne {}} {
        set f [lindex $jump_to_here 0]
        if {[lsearch -exact $treefilelist($id) $f] >= 0} {
            showfile $f
        }
    }
}

image create bitmap tri-rt -background black -foreground blue -data {
    #define tri-rt_width 13
    #define tri-rt_height 13
    static unsigned char tri-rt_bits[] = {
       0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x00, 0x70, 0x00, 0xf0, 0x00,
       0xf0, 0x01, 0xf0, 0x00, 0x70, 0x00, 0x30, 0x00, 0x10, 0x00, 0x00, 0x00,
       0x00, 0x00};
} -maskdata {
    #define tri-rt-mask_width 13
    #define tri-rt-mask_height 13
    static unsigned char tri-rt-mask_bits[] = {
       0x08, 0x00, 0x18, 0x00, 0x38, 0x00, 0x78, 0x00, 0xf8, 0x00, 0xf8, 0x01,
       0xf8, 0x03, 0xf8, 0x01, 0xf8, 0x00, 0x78, 0x00, 0x38, 0x00, 0x18, 0x00,
       0x08, 0x00};
}
image create bitmap tri-dn -background black -foreground blue -data {
    #define tri-dn_width 13
    #define tri-dn_height 13
    static unsigned char tri-dn_bits[] = {
       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0xf8, 0x03,
       0xf0, 0x01, 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       0x00, 0x00};
} -maskdata {
    #define tri-dn-mask_width 13
    #define tri-dn-mask_height 13
    static unsigned char tri-dn-mask_bits[] = {
       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x1f, 0xfe, 0x0f, 0xfc, 0x07,
       0xf8, 0x03, 0xf0, 0x01, 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
       0x00, 0x00};
}

image create bitmap reficon-T -background black -foreground yellow -data {
    #define tagicon_width 13
    #define tagicon_height 9
    static unsigned char tagicon_bits[] = {
       0x00, 0x00, 0x00, 0x00, 0xf0, 0x07, 0xf8, 0x07,
       0xfc, 0x07, 0xf8, 0x07, 0xf0, 0x07, 0x00, 0x00, 0x00, 0x00};
} -maskdata {
    #define tagicon-mask_width 13
    #define tagicon-mask_height 9
    static unsigned char tagicon-mask_bits[] = {
       0x00, 0x00, 0xf0, 0x0f, 0xf8, 0x0f, 0xfc, 0x0f,
       0xfe, 0x0f, 0xfc, 0x0f, 0xf8, 0x0f, 0xf0, 0x0f, 0x00, 0x00};
}
set rectdata {
    #define headicon_width 13
    #define headicon_height 9
    static unsigned char headicon_bits[] = {
       0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, 0xf8, 0x07,
       0xf8, 0x07, 0xf8, 0x07, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00};
}
set rectmask {
    #define headicon-mask_width 13
    #define headicon-mask_height 9
    static unsigned char headicon-mask_bits[] = {
       0x00, 0x00, 0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f,
       0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, 0x00, 0x00};
}
image create bitmap reficon-H -background black -foreground "#00ff00" \
    -data $rectdata -maskdata $rectmask
image create bitmap reficon-R -background black -foreground "#ffddaa" \
    -data $rectdata -maskdata $rectmask
image create bitmap reficon-o -background black -foreground "#ddddff" \
    -data $rectdata -maskdata $rectmask

proc init_flist {first} {
    global cflist cflist_top difffilestart

    $cflist conf -state normal
    $cflist delete 0.0 end
    if {$first ne {}} {
        $cflist insert end $first
        set cflist_top 1
        $cflist tag add highlight 1.0 "1.0 lineend"
    } else {
        unset -nocomplain cflist_top
    }
    $cflist conf -state disabled
    set difffilestart {}
}

proc highlight_tag {f} {
    global highlight_paths

    foreach p $highlight_paths {
        if {[string match $p $f]} {
            return "bold"
        }
    }
    return {}
}

proc highlight_filelist {} {
    global cmitmode cflist

    $cflist conf -state normal
    if {$cmitmode ne "tree"} {
        set end [lindex [split [$cflist index end] .] 0]
        for {set l 2} {$l < $end} {incr l} {
            set line [$cflist get $l.0 "$l.0 lineend"]
            if {[highlight_tag $line] ne {}} {
                $cflist tag add bold $l.0 "$l.0 lineend"
            }
        }
    } else {
        highlight_tree 2 {}
    }
    $cflist conf -state disabled
}

proc unhighlight_filelist {} {
    global cflist

    $cflist conf -state normal
    $cflist tag remove bold 1.0 end
    $cflist conf -state disabled
}

proc add_flist {fl} {
    global cflist

    $cflist conf -state normal
    foreach f $fl {
        $cflist insert end "\n"
        $cflist insert end $f [highlight_tag $f]
    }
    $cflist conf -state disabled
}

proc sel_flist {w x y} {
    global ctext difffilestart cflist cflist_top cmitmode

    if {$cmitmode eq "tree"} return
    if {![info exists cflist_top]} return
    set l [lindex [split [$w index "@$x,$y"] "."] 0]
    $cflist tag remove highlight $cflist_top.0 "$cflist_top.0 lineend"
    $cflist tag add highlight $l.0 "$l.0 lineend"
    set cflist_top $l
    if {$l == 1} {
        $ctext yview 1.0
    } else {
        catch {$ctext yview [lindex $difffilestart [expr {$l - 2}]]}
    }
    suppress_highlighting_file_for_current_scrollpos
}

proc pop_flist_menu {w X Y x y} {
    global ctext cflist cmitmode flist_menu flist_menu_file
    global treediffs diffids

    stopfinding
    set l [lindex [split [$w index "@$x,$y"] "."] 0]
    if {$l <= 1} return
    if {$cmitmode eq "tree"} {
        set e [linetoelt $l]
        if {[string index $e end] eq "/"} return
    } else {
        set e [lindex $treediffs($diffids) [expr {$l-2}]]
    }
    set flist_menu_file $e
    set xdiffstate "normal"
    if {$cmitmode eq "tree"} {
        set xdiffstate "disabled"
    }
    # Disable "External diff" item in tree mode
    $flist_menu entryconf 2 -state $xdiffstate
    tk_popup $flist_menu $X $Y
}

proc find_ctext_fileinfo {line} {
    global ctext_file_names ctext_file_lines

    set ok [bsearch $ctext_file_lines $line]
    set tline [lindex $ctext_file_lines $ok]

    if {$ok >= [llength $ctext_file_lines] || $line < $tline} {
        return {}
    } else {
        return [list [lindex $ctext_file_names $ok] $tline]
    }
}

proc pop_diff_menu {w X Y x y} {
    global ctext diff_menu flist_menu_file
    global diff_menu_txtpos diff_menu_line
    global diff_menu_filebase

    set diff_menu_txtpos [split [$w index "@$x,$y"] "."]
    set diff_menu_line [lindex $diff_menu_txtpos 0]
    # don't pop up the menu on hunk-separator or file-separator lines
    if {[lsearch -glob [$ctext tag names $diff_menu_line.0] "*sep"] >= 0} {
        return
    }
    stopfinding
    set f [find_ctext_fileinfo $diff_menu_line]
    if {$f eq {}} return
    set flist_menu_file [lindex $f 0]
    set diff_menu_filebase [lindex $f 1]
    tk_popup $diff_menu $X $Y
}

proc flist_hl {only} {
    global flist_menu_file findstring gdttype

    set x [shellquote $flist_menu_file]
    if {$only || $findstring eq {} || $gdttype ne [mc "touching paths:"]} {
        set findstring $x
    } else {
        append findstring " " $x
    }
    set gdttype [mc "touching paths:"]
}

proc gitknewtmpdir {} {
    global diffnum gitktmpdir gitdir env

    if {![info exists gitktmpdir]} {
        if {[info exists env(GITK_TMPDIR)]} {
            set tmpdir $env(GITK_TMPDIR)
        } elseif {[info exists env(TMPDIR)]} {
            set tmpdir $env(TMPDIR)
        } else {
            set tmpdir $gitdir
        }
        set gitktmpformat [file join $tmpdir ".gitk-tmp.XXXXXX"]
        if {[catch {set gitktmpdir [safe_exec [list mktemp -d $gitktmpformat]]}]} {
            set gitktmpdir [file join $gitdir [format ".gitk-tmp.%s" [pid]]]
        }
        if {[catch {file mkdir $gitktmpdir} err]} {
            error_popup "[mc "Error creating temporary directory %s:" $gitktmpdir] $err"
            unset gitktmpdir
            return {}
        }
        set diffnum 0
    }
    incr diffnum
    set diffdir [file join $gitktmpdir $diffnum]
    if {[catch {file mkdir $diffdir} err]} {
        error_popup "[mc "Error creating temporary directory %s:" $diffdir] $err"
        return {}
    }
    return $diffdir
}

proc save_file_from_commit {filename output what} {
    global nullfile

    if {[catch {safe_exec_redirect [list git show $filename --] [list > $output]} err]} {
        if {[string match "fatal: bad revision *" $err]} {
            return $nullfile
        }
        error_popup "[mc "Error getting \"%s\" from %s:" $filename $what] $err"
        return {}
    }
    return $output
}

proc external_diff_get_one_file {diffid filename diffdir} {
    global nullid nullid2 nullfile
    global worktree

    if {$diffid == $nullid} {
        set difffile [file join $worktree $filename]
        if {[file exists $difffile]} {
            return $difffile
        }
        return $nullfile
    }
    if {$diffid == $nullid2} {
        set difffile [file join $diffdir "\[index\] [file tail $filename]"]
        return [save_file_from_commit :$filename $difffile index]
    }
    set difffile [file join $diffdir "\[$diffid\] [file tail $filename]"]
    return [save_file_from_commit $diffid:$filename $difffile \
               "revision $diffid"]
}

proc external_diff {} {
    global nullid nullid2
    global flist_menu_file
    global diffids
    global extdifftool

    if {[llength $diffids] == 1} {
        # no reference commit given
        set diffidto [lindex $diffids 0]
        if {$diffidto eq $nullid} {
            # diffing working copy with index
            set diffidfrom $nullid2
        } elseif {$diffidto eq $nullid2} {
            # diffing index with HEAD
            set diffidfrom "HEAD"
        } else {
            # use first parent commit
            global parentlist selectedline
            set diffidfrom [lindex $parentlist $selectedline 0]
        }
    } else {
        set diffidfrom [lindex $diffids 0]
        set diffidto [lindex $diffids 1]
    }

    # make sure that several diffs wont collide
    set diffdir [gitknewtmpdir]
    if {$diffdir eq {}} return

    # gather files to diff
    set difffromfile [external_diff_get_one_file $diffidfrom $flist_menu_file $diffdir]
    set difftofile [external_diff_get_one_file $diffidto $flist_menu_file $diffdir]

    if {$difffromfile ne {} && $difftofile ne {}} {
        set cmd [list [shellsplit $extdifftool] $difffromfile $difftofile]
        if {[catch {set fl [safe_open_command $cmd]} err]} {
            file delete -force $diffdir
            error_popup "$extdifftool: [mc "command failed:"] $err"
        } else {
            fconfigure $fl -blocking 0
            filerun $fl [list delete_at_eof $fl $diffdir]
        }
    }
}

proc find_hunk_blamespec {base line} {
    global ctext

    # Find and parse the hunk header
    set s_lix [$ctext search -backwards -regexp ^@@ "$line.0 lineend" $base.0]
    if {$s_lix eq {}} return

    set s_line [$ctext get $s_lix "$s_lix + 1 lines"]
    if {![regexp {^@@@*(( -\d+(,\d+)?)+) \+(\d+)(,\d+)? @@} $s_line \
            s_line old_specs osz osz1 new_line nsz]} {
        return
    }

    # base lines for the parents
    set base_lines [list $new_line]
    foreach old_spec [lrange [split $old_specs " "] 1 end] {
        if {![regexp -- {-(\d+)(,\d+)?} $old_spec \
                old_spec old_line osz]} {
            return
        }
        lappend base_lines $old_line
    }

    # Now scan the lines to determine offset within the hunk
    set max_parent [expr {[llength $base_lines]-2}]
    set dline 0
    set s_lno [lindex [split $s_lix "."] 0]

    # Determine if the line is removed
    set chunk [$ctext get $line.0 "$line.1 + $max_parent chars"]
    if {[string match {[-+ ]*} $chunk]} {
        set removed_idx [string first "-" $chunk]
        # Choose a parent index
        if {$removed_idx >= 0} {
            set parent $removed_idx
        } else {
            set unchanged_idx [string first " " $chunk]
            if {$unchanged_idx >= 0} {
                set parent $unchanged_idx
            } else {
                # blame the current commit
                set parent -1
            }
        }
        # then count other lines that belong to it
        for {set i $line} {[incr i -1] > $s_lno} {} {
            set chunk [$ctext get $i.0 "$i.1 + $max_parent chars"]
            # Determine if the line is removed
            set removed_idx [string first "-" $chunk]
            if {$parent >= 0} {
                set code [string index $chunk $parent]
                if {$code eq "-" || ($removed_idx < 0 && $code ne "+")} {
                    incr dline
                }
            } else {
                if {$removed_idx < 0} {
                    incr dline
                }
            }
        }
        incr parent
    } else {
        set parent 0
    }

    incr dline [lindex $base_lines $parent]
    return [list $parent $dline]
}

proc external_blame_diff {} {
    global currentid cmitmode
    global diff_menu_txtpos diff_menu_line
    global diff_menu_filebase flist_menu_file

    if {$cmitmode eq "tree"} {
        set parent_idx 0
        set line [expr {$diff_menu_line - $diff_menu_filebase}]
    } else {
        set hinfo [find_hunk_blamespec $diff_menu_filebase $diff_menu_line]
        if {$hinfo ne {}} {
            set parent_idx [lindex $hinfo 0]
            set line [lindex $hinfo 1]
        } else {
            set parent_idx 0
            set line 0
        }
    }

    external_blame $parent_idx $line
}

# Find the SHA1 ID of the blob for file $fname in the index
# at stage 0 or 2
proc index_sha1 {fname} {
    set f [safe_open_command [list git ls-files -s $fname]]
    while {[gets $f line] >= 0} {
        set info [lindex [split $line "\t"] 0]
        set stage [lindex $info 2]
        if {$stage eq "0" || $stage eq "2"} {
            close $f
            return [lindex $info 1]
        }
    }
    close $f
    return {}
}

# Turn an absolute path into one relative to the current directory
proc make_relative {f} {
    if {[file pathtype $f] eq "relative"} {
        return $f
    }
    set elts [file split $f]
    set here [file split [pwd]]
    set ei 0
    set hi 0
    set res {}
    foreach d $here {
        if {$ei < $hi || $ei >= [llength $elts] || [lindex $elts $ei] ne $d} {
            lappend res ".."
        } else {
            incr ei
        }
        incr hi
    }
    set elts [concat $res [lrange $elts $ei end]]
    return [eval file join $elts]
}

proc external_blame {parent_idx {line {}}} {
    global flist_menu_file cdup
    global nullid nullid2
    global parentlist selectedline currentid

    if {$parent_idx > 0} {
        set base_commit [lindex $parentlist $selectedline [expr {$parent_idx-1}]]
    } else {
        set base_commit $currentid
    }

    if {$base_commit eq {} || $base_commit eq $nullid || $base_commit eq $nullid2} {
        error_popup [mc "No such commit"]
        return
    }

    set cmdline [list git gui blame]
    if {$line ne {} && $line > 1} {
        lappend cmdline "--line=$line"
    }
    set f [file join $cdup $flist_menu_file]
    # Unfortunately it seems git gui blame doesn't like
    # being given an absolute path...
    set f [make_relative $f]
    lappend cmdline $base_commit $f
    if {[catch {safe_exec_redirect $cmdline [list &]} err]} {
        error_popup "[mc "git gui blame: command failed:"] $err"
    }
}

proc show_line_source {} {
    global cmitmode currentid parents curview blamestuff blameinst
    global diff_menu_line diff_menu_filebase flist_menu_file
    global nullid nullid2 gitdir cdup

    set from_index {}
    if {$cmitmode eq "tree"} {
        set id $currentid
        set line [expr {$diff_menu_line - $diff_menu_filebase}]
    } else {
        set h [find_hunk_blamespec $diff_menu_filebase $diff_menu_line]
        if {$h eq {}} return
        set pi [lindex $h 0]
        if {$pi == 0} {
            mark_ctext_line $diff_menu_line
            return
        }
        incr pi -1
        if {$currentid eq $nullid} {
            if {$pi > 0} {
                # must be a merge in progress...
                if {[catch {
                    # get the last line from .git/MERGE_HEAD
                    set f [safe_open_file [file join $gitdir MERGE_HEAD] r]
                    set id [lindex [split [read $f] "\n"] end-1]
                    close $f
                } err]} {
                    error_popup [mc "Couldn't read merge head: %s" $err]
                    return
                }
            } elseif {$parents($curview,$currentid) eq $nullid2} {
                # need to do the blame from the index
                if {[catch {
                    set from_index [index_sha1 $flist_menu_file]
                } err]} {
                    error_popup [mc "Error reading index: %s" $err]
                    return
                }
            } else {
                set id $parents($curview,$currentid)
            }
        } else {
            set id [lindex $parents($curview,$currentid) $pi]
        }
        set line [lindex $h 1]
    }
    set blamefile [file join $cdup $flist_menu_file]
    if {$from_index ne {}} {
        set blameargs [list \
            [list git cat-file blob $from_index] \
            [list git blame -p -L$line,+1 --contents - -- $blamefile]]
    } else {
        set blameargs [list \
            [list git blame -p -L$line,+1 $id -- $blamefile]]
    }
    if {[catch {
        set f [safe_open_pipeline $blameargs]
    } err]} {
        error_popup [mc "Couldn't start git blame: %s" $err]
        return
    }
    nowbusy blaming [mc "Searching"]
    fconfigure $f -blocking 0
    set i [reg_instance $f]
    set blamestuff($i) {}
    set blameinst $i
    filerun $f [list read_line_source $f $i]
}

proc stopblaming {} {
    global blameinst

    if {[info exists blameinst]} {
        stop_instance $blameinst
        unset blameinst
        notbusy blaming
    }
}

proc read_line_source {fd inst} {
    global blamestuff curview commfd blameinst nullid nullid2
    global hashlength

    while {[gets $fd line] >= 0} {
        lappend blamestuff($inst) $line
    }
    if {![eof $fd]} {
        return 1
    }
    unset commfd($inst)
    unset blameinst
    notbusy blaming
    fconfigure $fd -blocking 1
    if {[catch {close $fd} err]} {
        error_popup [mc "Error running git blame: %s" $err]
        return 0
    }

    set fname {}
    set line [split [lindex $blamestuff($inst) 0] " "]
    set id [lindex $line 0]
    set lnum [lindex $line 1]
    if {[string length $id] == $hashlength && [string is xdigit $id] &&
        [string is digit -strict $lnum]} {
        # look for "filename" line
        foreach l $blamestuff($inst) {
            if {[string match "filename *" $l]} {
                set fname [string range $l 9 end]
                break
            }
        }
    }
    if {$fname ne {}} {
        # all looks good, select it
        if {$id eq $nullid} {
            # blame uses all-zeroes to mean not committed,
            # which would mean a change in the index
            set id $nullid2
        }
        if {[commitinview $id $curview]} {
            selectline [rowofcommit $id] 1 [list $fname $lnum] 1
        } else {
            error_popup [mc "That line comes from commit %s, \
                             which is not in this view" [shortids $id]]
        }
    } else {
        puts "oops couldn't parse git blame output"
    }
    return 0
}

# delete $dir when we see eof on $f (presumably because the child has exited)
proc delete_at_eof {f dir} {
    while {[gets $f line] >= 0} {}
    if {[eof $f]} {
        if {[catch {close $f} err]} {
            error_popup "[mc "External diff viewer failed:"] $err"
        }
        file delete -force $dir
        return 0
    }
    return 1
}

# Functions for adding and removing shell-type quoting

proc shellquote {str} {
    if {![string match "*\['\"\\ \t]*" $str]} {
        return $str
    }
    if {![string match "*\['\"\\]*" $str]} {
        return "\"$str\""
    }
    if {![string match "*'*" $str]} {
        return "'$str'"
    }
    return "\"[string map {\" \\\" \\ \\\\} $str]\""
}

proc shellarglist {l} {
    set str {}
    foreach a $l {
        if {$str ne {}} {
            append str " "
        }
        append str [shellquote $a]
    }
    return $str
}

proc shelldequote {str} {
    set ret {}
    set used -1
    while {1} {
        incr used
        if {![regexp -start $used -indices "\['\"\\\\ \t]" $str first]} {
            append ret [string range $str $used end]
            set used [string length $str]
            break
        }
        set first [lindex $first 0]
        set ch [string index $str $first]
        if {$first > $used} {
            append ret [string range $str $used [expr {$first - 1}]]
            set used $first
        }
        if {$ch eq " " || $ch eq "\t"} break
        incr used
        if {$ch eq "'"} {
            set first [string first "'" $str $used]
            if {$first < 0} {
                error "unmatched single-quote"
            }
            append ret [string range $str $used [expr {$first - 1}]]
            set used $first
            continue
        }
        if {$ch eq "\\"} {
            if {$used >= [string length $str]} {
                error "trailing backslash"
            }
            append ret [string index $str $used]
            continue
        }
        # here ch == "\""
        while {1} {
            if {![regexp -start $used -indices "\[\"\\\\]" $str first]} {
                error "unmatched double-quote"
            }
            set first [lindex $first 0]
            set ch [string index $str $first]
            if {$first > $used} {
                append ret [string range $str $used [expr {$first - 1}]]
                set used $first
            }
            if {$ch eq "\""} break
            incr used
            append ret [string index $str $used]
            incr used
        }
    }
    return [list $used $ret]
}

proc shellsplit {str} {
    set l {}
    while {1} {
        set str [string trimleft $str]
        if {$str eq {}} break
        set dq [shelldequote $str]
        set n [lindex $dq 0]
        set word [lindex $dq 1]
        set str [string range $str $n end]
        lappend l $word
    }
    return $l
}

proc set_window_title {} {
    global appname curview viewname vrevs
    set rev [mc "All files"]
    if {$curview ne 0} {
        if {$viewname($curview) eq [mc "Command line"]} {
            set rev [string map {"--gitk-symmetric-diff-marker" "--merge"} $vrevs($curview)]
        } else {
            set rev $viewname($curview)
        }
    }
    wm title . "[reponame]: $rev - $appname"
}

# Code to implement multiple views

proc newview {ishighlight} {
    global nextviewnum newviewname newishighlight
    global revtreeargs viewargscmd newviewopts curview

    set newishighlight $ishighlight
    set top .gitkview
    if {[winfo exists $top]} {
        raise $top
        return
    }
    decode_view_opts $nextviewnum $revtreeargs
    set newviewname($nextviewnum) "[mc "View"] $nextviewnum"
    set newviewopts($nextviewnum,perm) 0
    set newviewopts($nextviewnum,cmd)  $viewargscmd($curview)
    vieweditor $top $nextviewnum [mc "Gitk view definition"]
}

set known_view_options {
    {perm      b    .  {}               {mc "Remember this view"}}
    {reflabel  l    +  {}               {mc "References (space separated list):"}}
    {refs      t15  .. {}               {mc "Branches & tags:"}}
    {allrefs   b    *. "--all"          {mc "All refs"}}
    {branches  b    .  "--branches"     {mc "All (local) branches"}}
    {tags      b    .  "--tags"         {mc "All tags"}}
    {remotes   b    .  "--remotes"      {mc "All remote-tracking branches"}}
    {commitlbl l    +  {}               {mc "Commit Info (regular expressions):"}}
    {author    t15  .. "--author=*"     {mc "Author:"}}
    {committer t15  .  "--committer=*"  {mc "Committer:"}}
    {loginfo   t15  .. "--grep=*"       {mc "Commit Message:"}}
    {allmatch  b    .. "--all-match"    {mc "Matches all Commit Info criteria"}}
    {igrep     b    .. "--invert-grep"  {mc "Matches no Commit Info criteria"}}
    {changes_l l    +  {}               {mc "Changes to Files:"}}
    {pickaxe_s r0   .  {}               {mc "Fixed String"}}
    {pickaxe_t r1   .  "--pickaxe-regex"  {mc "Regular Expression"}}
    {pickaxe   t15  .. "-S*"            {mc "Search string:"}}
    {datelabel l    +  {}               {mc "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 15:27:38\"):"}}
    {since     t15  ..  {"--since=*" "--after=*"}  {mc "Since:"}}
    {until     t15  .   {"--until=*" "--before=*"} {mc "Until:"}}
    {limit_lbl l    +  {}               {mc "Limit and/or skip a number of revisions (positive integer):"}}
    {limit     t10  *. "--max-count=*"  {mc "Number to show:"}}
    {skip      t10  .  "--skip=*"       {mc "Number to skip:"}}
    {misc_lbl  l    +  {}               {mc "Miscellaneous options:"}}
    {dorder    b    *. {"--date-order" "-d"}      {mc "Strictly sort by date"}}
    {lright    b    .  "--left-right"   {mc "Mark branch sides"}}
    {first     b    .  "--first-parent" {mc "Limit to first parent"}}
    {smplhst   b    .  "--simplify-by-decoration"   {mc "Simple history"}}
    {args      t50  *. {}               {mc "Additional arguments to git log:"}}
    {allpaths  path +  {}               {mc "Enter files and directories to include, one per line:"}}
    {cmd       t50= +  {}               {mc "Command to generate more commits to include:"}}
    }

# Convert $newviewopts($n, ...) into args for git log.
proc encode_view_opts {n} {
    global known_view_options newviewopts

    set rargs [list]
    foreach opt $known_view_options {
        set patterns [lindex $opt 3]
        if {$patterns eq {}} continue
        set pattern [lindex $patterns 0]

        if {[lindex $opt 1] eq "b"} {
            set val $newviewopts($n,[lindex $opt 0])
            if {$val} {
                lappend rargs $pattern
            }
        } elseif {[regexp {^r(\d+)$} [lindex $opt 1] type value]} {
            regexp {^(.*_)} [lindex $opt 0] uselessvar button_id
            set val $newviewopts($n,$button_id)
            if {$val eq $value} {
                lappend rargs $pattern
            }
        } else {
            set val $newviewopts($n,[lindex $opt 0])
            set val [string trim $val]
            if {$val ne {}} {
                set pfix [string range $pattern 0 end-1]
                lappend rargs $pfix$val
            }
        }
    }
    set rargs [concat $rargs [shellsplit $newviewopts($n,refs)]]
    return [concat $rargs [shellsplit $newviewopts($n,args)]]
}

# Fill $newviewopts($n, ...) based on args for git log.
proc decode_view_opts {n view_args} {
    global known_view_options newviewopts

    foreach opt $known_view_options {
        set id [lindex $opt 0]
        if {[lindex $opt 1] eq "b"} {
            # Checkboxes
            set val 0
        } elseif {[regexp {^r(\d+)$} [lindex $opt 1]]} {
            # Radiobuttons
            regexp {^(.*_)} $id uselessvar id
            set val 0
        } else {
            # Text fields
            set val {}
        }
        set newviewopts($n,$id) $val
    }
    set oargs [list]
    set refargs [list]
    foreach arg $view_args {
        if {[regexp -- {^-([0-9]+)$} $arg arg cnt]
            && ![info exists found(limit)]} {
            set newviewopts($n,limit) $cnt
            set found(limit) 1
            continue
        }
        catch { unset val }
        foreach opt $known_view_options {
            set id [lindex $opt 0]
            if {[info exists found($id)]} continue
            foreach pattern [lindex $opt 3] {
                if {![string match $pattern $arg]} continue
                if {[lindex $opt 1] eq "b"} {
                    # Check buttons
                    set val 1
                } elseif {[regexp {^r(\d+)$} [lindex $opt 1] match num]} {
                    # Radio buttons
                    regexp {^(.*_)} $id uselessvar id
                    set val $num
                } else {
                    # Text input fields
                    set size [string length $pattern]
                    set val [string range $arg [expr {$size-1}] end]
                }
                set newviewopts($n,$id) $val
                set found($id) 1
                break
            }
            if {[info exists val]} break
        }
        if {[info exists val]} continue
        if {[regexp {^-} $arg]} {
            lappend oargs $arg
        } else {
            lappend refargs $arg
        }
    }
    set newviewopts($n,refs) [shellarglist $refargs]
    set newviewopts($n,args) [shellarglist $oargs]
}

proc edit_or_newview {} {
    global curview

    if {$curview > 0} {
        editview
    } else {
        newview 0
    }
}

proc editview {} {
    global curview
    global viewname viewperm newviewname newviewopts
    global viewargs viewargscmd

    set top .gitkvedit-$curview
    if {[winfo exists $top]} {
        raise $top
        return
    }
    decode_view_opts $curview $viewargs($curview)
    set newviewname($curview)      $viewname($curview)
    set newviewopts($curview,perm) $viewperm($curview)
    set newviewopts($curview,cmd)  $viewargscmd($curview)
    vieweditor $top $curview "[mc "Gitk: edit view"] $viewname($curview)"
}

proc vieweditor {top n title} {
    global newviewname newviewopts viewfiles bgcolor
    global known_view_options

    ttk_toplevel $top
    wm title $top [concat $title [mc "-- criteria for selecting revisions"]]
    make_transient $top .

    # View name
    ttk::frame $top.nfr
    ttk::label $top.nl -text [mc "View Name"]
    ttk::entry $top.name -width 20 -textvariable newviewname($n)
    pack $top.nfr -in $top -fill x -pady 5 -padx 3
    pack $top.nl -in $top.nfr -side left -padx {0 5}
    pack $top.name -in $top.nfr -side left -padx {0 25}

    # View options
    set cframe $top.nfr
    set cexpand 0
    set cnt 0
    foreach opt $known_view_options {
        set id [lindex $opt 0]
        set type [lindex $opt 1]
        set flags [lindex $opt 2]
        set title [eval [lindex $opt 4]]
        set lxpad 0

        if {$flags eq "+" || $flags eq "*"} {
            set cframe $top.fr$cnt
            incr cnt
            ttk::frame $cframe
            pack $cframe -in $top -fill x -pady 3 -padx 3
            set cexpand [expr {$flags eq "*"}]
        } elseif {$flags eq ".." || $flags eq "*."} {
            set cframe $top.fr$cnt
            incr cnt
            ttk::frame $cframe
            pack $cframe -in $top -fill x -pady 3 -padx [list 15 3]
            set cexpand [expr {$flags eq "*."}]
        } else {
            set lxpad 5
        }

        if {$type eq "l"} {
            ttk::label $cframe.l_$id -text $title
            pack $cframe.l_$id -in $cframe -side left -pady [list 3 0] -anchor w
        } elseif {$type eq "b"} {
            ttk::checkbutton $cframe.c_$id -text $title -variable newviewopts($n,$id)
            pack $cframe.c_$id -in $cframe -side left \
                -padx [list $lxpad 0] -expand $cexpand -anchor w
        } elseif {[regexp {^r(\d+)$} $type type sz]} {
            regexp {^(.*_)} $id uselessvar button_id
            ttk::radiobutton $cframe.c_$id -text $title -variable newviewopts($n,$button_id) -value $sz
            pack $cframe.c_$id -in $cframe -side left \
                -padx [list $lxpad 0] -expand $cexpand -anchor w
        } elseif {[regexp {^t(\d+)$} $type type sz]} {
            ttk::label $cframe.l_$id -text $title
            ttk::entry $cframe.e_$id -width $sz -background $bgcolor \
                -textvariable newviewopts($n,$id)
            pack $cframe.l_$id -in $cframe -side left -padx [list $lxpad 0]
            pack $cframe.e_$id -in $cframe -side left -expand 1 -fill x
        } elseif {[regexp {^t(\d+)=$} $type type sz]} {
            ttk::label $cframe.l_$id -text $title
            ttk::entry $cframe.e_$id -width $sz -background $bgcolor \
                -textvariable newviewopts($n,$id)
            pack $cframe.l_$id -in $cframe -side top -pady [list 3 0] -anchor w
            pack $cframe.e_$id -in $cframe -side top -fill x
        } elseif {$type eq "path"} {
            ttk::label $top.l -text $title
            pack $top.l -in $top -side top -pady [list 3 0] -anchor w -padx 3
            text $top.t -width 40 -height 5 -background $bgcolor
            if {[info exists viewfiles($n)]} {
                foreach f $viewfiles($n) {
                    $top.t insert end $f
                    $top.t insert end "\n"
                }
                $top.t delete {end - 1c} end
                $top.t mark set insert 0.0
            }
            pack $top.t -in $top -side top -pady [list 0 5] -fill both -expand 1 -padx 3
        }
    }

    ttk::frame $top.buts
    ttk::button $top.buts.ok -text [mc "OK"] -command [list newviewok $top $n]
    ttk::button $top.buts.apply -text [mc "Apply (F5)"] -command [list newviewok $top $n 1]
    ttk::button $top.buts.can -text [mc "Cancel"] -command [list destroy $top]
    bind $top <Control-Return> [list newviewok $top $n]
    bind $top <F5> [list newviewok $top $n 1]
    bind $top <Escape> [list destroy $top]
    grid $top.buts.ok $top.buts.apply $top.buts.can
    grid columnconfigure $top.buts 0 -weight 1 -uniform a
    grid columnconfigure $top.buts 1 -weight 1 -uniform a
    grid columnconfigure $top.buts 2 -weight 1 -uniform a
    pack $top.buts -in $top -side top -fill x
    focus $top.t
}

proc doviewmenu {m first cmd op argv} {
    set nmenu [$m index end]
    for {set i $first} {$i <= $nmenu} {incr i} {
        if {[$m entrycget $i -command] eq $cmd} {
            eval $m $op $i $argv
            break
        }
    }
}

proc allviewmenus {n op args} {
    # global viewhlmenu

    doviewmenu .bar.view 5 [list showview $n] $op $args
    # doviewmenu $viewhlmenu 1 [list addvhighlight $n] $op $args
}

proc newviewok {top n {apply 0}} {
    global nextviewnum newviewperm newviewname newishighlight
    global viewname viewfiles viewperm viewchanged selectedview curview
    global viewargs viewargscmd newviewopts viewhlmenu

    if {[catch {
        set newargs [encode_view_opts $n]
    } err]} {
        error_popup "[mc "Error in commit selection arguments:"] $err" $top
        return
    }
    set files {}
    foreach f [split [$top.t get 0.0 end] "\n"] {
        set ft [string trim $f]
        if {$ft ne {}} {
            lappend files $ft
        }
    }
    if {![info exists viewfiles($n)]} {
        # creating a new view
        incr nextviewnum
        set viewname($n) $newviewname($n)
        set viewperm($n) $newviewopts($n,perm)
        set viewchanged($n) 1
        set viewfiles($n) $files
        set viewargs($n) $newargs
        set viewargscmd($n) $newviewopts($n,cmd)
        addviewmenu $n
        if {!$newishighlight} {
            run showview $n
        } else {
            run addvhighlight $n
        }
    } else {
        # editing an existing view
        set viewperm($n) $newviewopts($n,perm)
        set viewchanged($n) 1
        if {$newviewname($n) ne $viewname($n)} {
            set viewname($n) $newviewname($n)
            doviewmenu .bar.view 5 [list showview $n] \
                entryconf [list -label $viewname($n)]
            # doviewmenu $viewhlmenu 1 [list addvhighlight $n] \
                # entryconf [list -label $viewname($n) -value $viewname($n)]
        }
        if {$files ne $viewfiles($n) || $newargs ne $viewargs($n) || \
                $newviewopts($n,cmd) ne $viewargscmd($n)} {
            set viewfiles($n) $files
            set viewargs($n) $newargs
            set viewargscmd($n) $newviewopts($n,cmd)
            if {$curview == $n} {
                run reloadcommits
            }
        }
    }
    if {$apply} return
    catch {destroy $top}
}

proc delview {} {
    global curview viewperm hlview selectedhlview viewchanged

    if {$curview == 0} return
    if {[info exists hlview] && $hlview == $curview} {
        set selectedhlview [mc "None"]
        unset hlview
    }
    allviewmenus $curview delete
    set viewperm($curview) 0
    set viewchanged($curview) 1
    showview 0
}

proc addviewmenu {n} {
    global viewname viewhlmenu

    .bar.view add radiobutton -label $viewname($n) \
        -command [list showview $n] -variable selectedview -value $n
    #$viewhlmenu add radiobutton -label $viewname($n) \
    #   -command [list addvhighlight $n] -variable selectedhlview
}

proc showview {n} {
    global curview cached_commitrow ordertok
    global displayorder parentlist rowidlist rowisopt rowfinal
    global colormap rowtextx nextcolor canvxmax
    global numcommits viewcomplete
    global selectedline currentid canv canvy0
    global treediffs
    global pending_select mainheadid
    global commitidx
    global selectedview
    global hlview selectedhlview commitinterest

    if {$n == $curview} return
    set selid {}
    set ymax [lindex [$canv cget -scrollregion] 3]
    set span [$canv yview]
    set ytop [expr {[lindex $span 0] * $ymax}]
    set ybot [expr {[lindex $span 1] * $ymax}]
    set yscreen [expr {($ybot - $ytop) / 2}]
    if {$selectedline ne {}} {
        set selid $currentid
        set y [yc $selectedline]
        if {$ytop < $y && $y < $ybot} {
            set yscreen [expr {$y - $ytop}]
        }
    } elseif {[info exists pending_select]} {
        set selid $pending_select
        unset pending_select
    }
    unselectline
    normalline
    unset -nocomplain treediffs
    clear_display
    if {[info exists hlview] && $hlview == $n} {
        unset hlview
        set selectedhlview [mc "None"]
    }
    unset -nocomplain commitinterest
    unset -nocomplain cached_commitrow
    unset -nocomplain ordertok

    set curview $n
    set selectedview $n
    .bar.view entryconf [mca "&Edit view..."] -state [expr {$n == 0? "disabled": "normal"}]
    .bar.view entryconf [mca "&Delete view"] -state [expr {$n == 0? "disabled": "normal"}]

    run refill_reflist
    if {![info exists viewcomplete($n)]} {
        getcommits $selid
        return
    }

    set displayorder {}
    set parentlist {}
    set rowidlist {}
    set rowisopt {}
    set rowfinal {}
    set numcommits $commitidx($n)

    unset -nocomplain colormap
    unset -nocomplain rowtextx
    set nextcolor 0
    set canvxmax [$canv cget -width]
    set curview $n
    set row 0
    setcanvscroll
    set yf 0
    set row {}
    if {$selid ne {} && [commitinview $selid $n]} {
        set row [rowofcommit $selid]
        # try to get the selected row in the same position on the screen
        set ymax [lindex [$canv cget -scrollregion] 3]
        set ytop [expr {[yc $row] - $yscreen}]
        if {$ytop < 0} {
            set ytop 0
        }
        set yf [expr {$ytop * 1.0 / $ymax}]
    }
    allcanvs yview moveto $yf
    drawvisible
    if {$row ne {}} {
        selectline $row 0
    } elseif {!$viewcomplete($n)} {
        reset_pending_select $selid
    } else {
        reset_pending_select {}

        if {[commitinview $pending_select $curview]} {
            selectline [rowofcommit $pending_select] 1
        } else {
            set row [first_real_row]
            if {$row < $numcommits} {
                selectline $row 0
            }
        }
    }
    if {!$viewcomplete($n)} {
        if {$numcommits == 0} {
            show_status [mc "Reading commits..."]
        }
    } elseif {$numcommits == 0} {
        show_status [mc "No commits selected"]
    }
    set_window_title
}

# Stuff relating to the highlighting facility

proc ishighlighted {id} {
    global vhighlights fhighlights nhighlights rhighlights

    if {[info exists nhighlights($id)] && $nhighlights($id) > 0} {
        return $nhighlights($id)
    }
    if {[info exists vhighlights($id)] && $vhighlights($id) > 0} {
        return $vhighlights($id)
    }
    if {[info exists fhighlights($id)] && $fhighlights($id) > 0} {
        return $fhighlights($id)
    }
    if {[info exists rhighlights($id)] && $rhighlights($id) > 0} {
        return $rhighlights($id)
    }
    return 0
}

proc bolden {id font} {
    global canv linehtag currentid boldids need_redisplay markedid

    # need_redisplay = 1 means the display is stale and about to be redrawn
    if {$need_redisplay} return
    lappend boldids $id
    $canv itemconf $linehtag($id) -font $font
    if {[info exists currentid] && $id eq $currentid} {
        $canv delete secsel
        set t [eval $canv create rect [$canv bbox $linehtag($id)] \
                   -outline {{}} -tags secsel \
                   -fill [$canv cget -selectbackground]]
        $canv lower $t
    }
    if {[info exists markedid] && $id eq $markedid} {
        make_idmark $id
    }
}

proc bolden_name {id font} {
    global canv2 linentag currentid boldnameids need_redisplay

    if {$need_redisplay} return
    lappend boldnameids $id
    $canv2 itemconf $linentag($id) -font $font
    if {[info exists currentid] && $id eq $currentid} {
        $canv2 delete secsel
        set t [eval $canv2 create rect [$canv2 bbox $linentag($id)] \
                   -outline {{}} -tags secsel \
                   -fill [$canv2 cget -selectbackground]]
        $canv2 lower $t
    }
}

proc unbolden {} {
    global boldids

    set stillbold {}
    foreach id $boldids {
        if {![ishighlighted $id]} {
            bolden $id mainfont
        } else {
            lappend stillbold $id
        }
    }
    set boldids $stillbold
}

proc addvhighlight {n} {
    global hlview viewcomplete curview vhl_done commitidx

    if {[info exists hlview]} {
        delvhighlight
    }
    set hlview $n
    if {$n != $curview && ![info exists viewcomplete($n)]} {
        start_rev_list $n
    }
    set vhl_done $commitidx($hlview)
    if {$vhl_done > 0} {
        drawvisible
    }
}

proc delvhighlight {} {
    global hlview vhighlights

    if {![info exists hlview]} return
    unset hlview
    unset -nocomplain vhighlights
    unbolden
}

proc vhighlightmore {} {
    global hlview vhl_done commitidx vhighlights curview

    set max $commitidx($hlview)
    set vr [visiblerows]
    set r0 [lindex $vr 0]
    set r1 [lindex $vr 1]
    for {set i $vhl_done} {$i < $max} {incr i} {
        set id [commitonrow $i $hlview]
        if {[commitinview $id $curview]} {
            set row [rowofcommit $id]
            if {$r0 <= $row && $row <= $r1} {
                if {![highlighted $row]} {
                    bolden $id mainfontbold
                }
                set vhighlights($id) 1
            }
        }
    }
    set vhl_done $max
    return 0
}

proc askvhighlight {row id} {
    global hlview vhighlights iddrawn

    if {[commitinview $id $hlview]} {
        if {[info exists iddrawn($id)] && ![ishighlighted $id]} {
            bolden $id mainfontbold
        }
        set vhighlights($id) 1
    } else {
        set vhighlights($id) 0
    }
}

proc hfiles_change {} {
    global highlight_files filehighlight fhighlights fh_serial
    global highlight_paths

    if {[info exists filehighlight]} {
        # delete previous highlights
        catch {close $filehighlight}
        unset filehighlight
        unset -nocomplain fhighlights
        unbolden
        unhighlight_filelist
    }
    set highlight_paths {}
    after cancel do_file_hl $fh_serial
    incr fh_serial
    if {$highlight_files ne {}} {
        after 300 do_file_hl $fh_serial
    }
}

proc gdttype_change {name ix op} {
    global gdttype highlight_files findstring findpattern

    stopfinding
    if {$findstring ne {}} {
        if {$gdttype eq [mc "containing:"]} {
            if {$highlight_files ne {}} {
                set highlight_files {}
                hfiles_change
            }
            findcom_change
        } else {
            if {$findpattern ne {}} {
                set findpattern {}
                findcom_change
            }
            set highlight_files $findstring
            hfiles_change
        }
        drawvisible
    }
    # enable/disable findtype/findloc menus too
}

proc find_change {name ix op} {
    global gdttype findstring highlight_files

    stopfinding
    if {$gdttype eq [mc "containing:"]} {
        findcom_change
    } else {
        if {$highlight_files ne $findstring} {
            set highlight_files $findstring
            hfiles_change
        }
    }
    drawvisible
}

proc findcom_change args {
    global nhighlights boldnameids
    global findpattern findtype findstring gdttype

    stopfinding
    # delete previous highlights, if any
    foreach id $boldnameids {
        bolden_name $id mainfont
    }
    set boldnameids {}
    unset -nocomplain nhighlights
    unbolden
    unmarkmatches
    if {$gdttype ne [mc "containing:"] || $findstring eq {}} {
        set findpattern {}
    } elseif {$findtype eq [mc "Regexp"]} {
        set findpattern $findstring
    } else {
        set e [string map {"*" "\\*" "?" "\\?" "\[" "\\\[" "\\" "\\\\"} \
                   $findstring]
        set findpattern "*$e*"
    }
}

proc makepatterns {l} {
    set ret {}
    foreach e $l {
        set ee [string map {"*" "\\*" "?" "\\?" "\[" "\\\[" "\\" "\\\\"} $e]
        if {[string index $ee end] eq "/"} {
            lappend ret "$ee*"
        } else {
            lappend ret $ee
            lappend ret "$ee/*"
        }
    }
    return $ret
}

proc do_file_hl {serial} {
    global highlight_files filehighlight highlight_paths gdttype fhl_list
    global cdup findtype

    if {$gdttype eq [mc "touching paths:"]} {
        # If "exact" match then convert backslashes to forward slashes.
        # Most useful to support Windows-flavoured file paths.
        if {$findtype eq [mc "Exact"]} {
            set highlight_files [string map {"\\" "/"} $highlight_files]
        }
        if {[catch {set paths [shellsplit $highlight_files]}]} return
        set highlight_paths [makepatterns $paths]
        highlight_filelist
        set relative_paths {}
        foreach path $paths {
            lappend relative_paths [file join $cdup $path]
        }
        set gdtargs [concat -- $relative_paths]
    } elseif {$gdttype eq [mc "adding/removing string:"]} {
        set gdtargs [list "-S$highlight_files"]
    } elseif {$gdttype eq [mc "changing lines matching:"]} {
        set gdtargs [list "-G$highlight_files"]
    } else {
        # must be "containing:", i.e. we're searching commit info
        return
    }
    set cmd [concat git diff-tree -r -s --stdin $gdtargs]
    set filehighlight [safe_open_command_rw $cmd]
    fconfigure $filehighlight -blocking 0
    filerun $filehighlight readfhighlight
    set fhl_list {}
    drawvisible
    flushhighlights
}

proc flushhighlights {} {
    global filehighlight fhl_list

    if {[info exists filehighlight]} {
        lappend fhl_list {}
        puts $filehighlight ""
        flush $filehighlight
    }
}

proc askfilehighlight {row id} {
    global filehighlight fhighlights fhl_list

    lappend fhl_list $id
    set fhighlights($id) -1
    puts $filehighlight $id
}

proc readfhighlight {} {
    global filehighlight fhighlights curview iddrawn
    global fhl_list find_dirn

    if {![info exists filehighlight]} {
        return 0
    }
    set nr 0
    while {[incr nr] <= 100 && [gets $filehighlight line] >= 0} {
        set line [string trim $line]
        set i [lsearch -exact $fhl_list $line]
        if {$i < 0} continue
        for {set j 0} {$j < $i} {incr j} {
            set id [lindex $fhl_list $j]
            set fhighlights($id) 0
        }
        set fhl_list [lrange $fhl_list [expr {$i+1}] end]
        if {$line eq {}} continue
        if {![commitinview $line $curview]} continue
        if {[info exists iddrawn($line)] && ![ishighlighted $line]} {
            bolden $line mainfontbold
        }
        set fhighlights($line) 1
    }
    if {[eof $filehighlight]} {
        # strange...
        puts "oops, git diff-tree died"
        catch {close $filehighlight}
        unset filehighlight
        return 0
    }
    if {[info exists find_dirn]} {
        run findmore
    }
    return 1
}

proc doesmatch {f} {
    global findtype findpattern

    if {$findtype eq [mc "Regexp"]} {
        return [regexp $findpattern $f]
    } elseif {$findtype eq [mc "IgnCase"]} {
        return [string match -nocase $findpattern $f]
    } else {
        return [string match $findpattern $f]
    }
}

proc askfindhighlight {row id} {
    global nhighlights commitinfo iddrawn
    global findloc
    global markingmatches

    if {![info exists commitinfo($id)]} {
        getcommit $id
    }
    set info $commitinfo($id)
    set isbold 0
    set fldtypes [list [mc Headline] [mc Author] "" [mc Committer] "" [mc Comments]]
    foreach f $info ty $fldtypes {
        if {$ty eq ""} continue
        if {($findloc eq [mc "All fields"] || $findloc eq $ty) &&
            [doesmatch $f]} {
            if {$ty eq [mc "Author"]} {
                set isbold 2
                break
            }
            set isbold 1
        }
    }
    if {$isbold && [info exists iddrawn($id)]} {
        if {![ishighlighted $id]} {
            bolden $id mainfontbold
            if {$isbold > 1} {
                bolden_name $id mainfontbold
            }
        }
        if {$markingmatches} {
            markrowmatches $row $id
        }
    }
    set nhighlights($id) $isbold
}

proc markrowmatches {row id} {
    global canv canv2 linehtag linentag commitinfo findloc

    set headline [lindex $commitinfo($id) 0]
    set author [lindex $commitinfo($id) 1]
    $canv delete match$row
    $canv2 delete match$row
    if {$findloc eq [mc "All fields"] || $findloc eq [mc "Headline"]} {
        set m [findmatches $headline]
        if {$m ne {}} {
            markmatches $canv $row $headline $linehtag($id) $m \
                [$canv itemcget $linehtag($id) -font] $row
        }
    }
    if {$findloc eq [mc "All fields"] || $findloc eq [mc "Author"]} {
        set m [findmatches $author]
        if {$m ne {}} {
            markmatches $canv2 $row $author $linentag($id) $m \
                [$canv2 itemcget $linentag($id) -font] $row
        }
    }
}

proc vrel_change {name ix op} {
    global highlight_related

    rhighlight_none
    if {$highlight_related ne [mc "None"]} {
        run drawvisible
    }
}

# prepare for testing whether commits are descendents or ancestors of a
proc rhighlight_sel {a} {
    global descendent desc_todo ancestor anc_todo
    global highlight_related

    unset -nocomplain descendent
    set desc_todo [list $a]
    unset -nocomplain ancestor
    set anc_todo [list $a]
    if {$highlight_related ne [mc "None"]} {
        rhighlight_none
        run drawvisible
    }
}

proc rhighlight_none {} {
    global rhighlights

    unset -nocomplain rhighlights
    unbolden
}

proc is_descendent {a} {
    global curview children descendent desc_todo

    set v $curview
    set la [rowofcommit $a]
    set todo $desc_todo
    set leftover {}
    set done 0
    for {set i 0} {$i < [llength $todo]} {incr i} {
        set do [lindex $todo $i]
        if {[rowofcommit $do] < $la} {
            lappend leftover $do
            continue
        }
        foreach nk $children($v,$do) {
            if {![info exists descendent($nk)]} {
                set descendent($nk) 1
                lappend todo $nk
                if {$nk eq $a} {
                    set done 1
                }
            }
        }
        if {$done} {
            set desc_todo [concat $leftover [lrange $todo [expr {$i+1}] end]]
            return
        }
    }
    set descendent($a) 0
    set desc_todo $leftover
}

proc is_ancestor {a} {
    global curview parents ancestor anc_todo

    set v $curview
    set la [rowofcommit $a]
    set todo $anc_todo
    set leftover {}
    set done 0
    for {set i 0} {$i < [llength $todo]} {incr i} {
        set do [lindex $todo $i]
        if {![commitinview $do $v] || [rowofcommit $do] > $la} {
            lappend leftover $do
            continue
        }
        foreach np $parents($v,$do) {
            if {![info exists ancestor($np)]} {
                set ancestor($np) 1
                lappend todo $np
                if {$np eq $a} {
                    set done 1
                }
            }
        }
        if {$done} {
            set anc_todo [concat $leftover [lrange $todo [expr {$i+1}] end]]
            return
        }
    }
    set ancestor($a) 0
    set anc_todo $leftover
}

proc askrelhighlight {row id} {
    global descendent highlight_related iddrawn rhighlights
    global selectedline ancestor

    if {$selectedline eq {}} return
    set isbold 0
    if {$highlight_related eq [mc "Descendant"] ||
        $highlight_related eq [mc "Not descendant"]} {
        if {![info exists descendent($id)]} {
            is_descendent $id
        }
        if {$descendent($id) == ($highlight_related eq [mc "Descendant"])} {
            set isbold 1
        }
    } elseif {$highlight_related eq [mc "Ancestor"] ||
              $highlight_related eq [mc "Not ancestor"]} {
        if {![info exists ancestor($id)]} {
            is_ancestor $id
        }
        if {$ancestor($id) == ($highlight_related eq [mc "Ancestor"])} {
            set isbold 1
        }
    }
    if {[info exists iddrawn($id)]} {
        if {$isbold && ![ishighlighted $id]} {
            bolden $id mainfontbold
        }
    }
    set rhighlights($id) $isbold
}

# Graph layout functions

proc shortids {ids} {
    global hashlength

    set res {}
    foreach id $ids {
        if {[llength $id] > 1} {
            lappend res [shortids $id]
        } elseif {[regexp [string map "@@ $hashlength" {^[0-9a-f]{@@}$}] $id]} {
            lappend res [string range $id 0 7]
        } else {
            lappend res $id
        }
    }
    return $res
}

proc ntimes {n o} {
    set ret {}
    set o [list $o]
    for {set mask 1} {$mask <= $n} {incr mask $mask} {
        if {($n & $mask) != 0} {
            set ret [concat $ret $o]
        }
        set o [concat $o $o]
    }
    return $ret
}

proc ordertoken {id} {
    global ordertok curview varcid varcstart varctok curview parents children
    global nullid nullid2

    if {[info exists ordertok($id)]} {
        return $ordertok($id)
    }
    set origid $id
    set todo {}
    while {1} {
        if {[info exists varcid($curview,$id)]} {
            set a $varcid($curview,$id)
            set p [lindex $varcstart($curview) $a]
        } else {
            set p [lindex $children($curview,$id) 0]
        }
        if {[info exists ordertok($p)]} {
            set tok $ordertok($p)
            break
        }
        set id [first_real_child $curview,$p]
        if {$id eq {}} {
            # it's a root
            set tok [lindex $varctok($curview) $varcid($curview,$p)]
            break
        }
        if {[llength $parents($curview,$id)] == 1} {
            lappend todo [list $p {}]
        } else {
            set j [lsearch -exact $parents($curview,$id) $p]
            if {$j < 0} {
                puts "oops didn't find [shortids $p] in parents of [shortids $id]"
            }
            lappend todo [list $p [strrep $j]]
        }
    }
    for {set i [llength $todo]} {[incr i -1] >= 0} {} {
        set p [lindex $todo $i 0]
        append tok [lindex $todo $i 1]
        set ordertok($p) $tok
    }
    set ordertok($origid) $tok
    return $tok
}

# Work out where id should go in idlist so that order-token
# values increase from left to right
proc idcol {idlist id {i 0}} {
    set t [ordertoken $id]
    if {$i < 0} {
        set i 0
    }
    if {$i >= [llength $idlist] || $t < [ordertoken [lindex $idlist $i]]} {
        if {$i > [llength $idlist]} {
            set i [llength $idlist]
        }
        while {[incr i -1] >= 0 && $t < [ordertoken [lindex $idlist $i]]} {}
        incr i
    } else {
        if {$t > [ordertoken [lindex $idlist $i]]} {
            while {[incr i] < [llength $idlist] &&
                   $t >= [ordertoken [lindex $idlist $i]]} {}
        }
    }
    return $i
}

proc initlayout {} {
    global rowidlist rowisopt rowfinal displayorder parentlist
    global numcommits canvxmax canv
    global nextcolor
    global colormap rowtextx

    set numcommits 0
    set displayorder {}
    set parentlist {}
    set nextcolor 0
    set rowidlist {}
    set rowisopt {}
    set rowfinal {}
    set canvxmax [$canv cget -width]
    unset -nocomplain colormap
    unset -nocomplain rowtextx
    setcanvscroll
}

proc setcanvscroll {} {
    global canv canv2 canv3 numcommits linespc canvxmax canvy0
    global lastscrollset lastscrollrows

    set ymax [expr {$canvy0 + ($numcommits - 0.5) * $linespc + 2}]
    $canv conf -scrollregion [list 0 0 $canvxmax $ymax]
    $canv2 conf -scrollregion [list 0 0 0 $ymax]
    $canv3 conf -scrollregion [list 0 0 0 $ymax]
    set lastscrollset [clock clicks -milliseconds]
    set lastscrollrows $numcommits
}

proc visiblerows {} {
    global canv numcommits linespc

    set ymax [lindex [$canv cget -scrollregion] 3]
    if {$ymax eq {} || $ymax == 0} return
    set f [$canv yview]
    set y0 [expr {int([lindex $f 0] * $ymax)}]
    set r0 [expr {int(($y0 - 3) / $linespc) - 1}]
    if {$r0 < 0} {
        set r0 0
    }
    set y1 [expr {int([lindex $f 1] * $ymax)}]
    set r1 [expr {int(($y1 - 3) / $linespc) + 1}]
    if {$r1 >= $numcommits} {
        set r1 [expr {$numcommits - 1}]
    }
    return [list $r0 $r1]
}

proc layoutmore {} {
    global commitidx viewcomplete curview
    global numcommits pending_select curview
    global lastscrollset lastscrollrows

    if {$lastscrollrows < 100 || $viewcomplete($curview) ||
        [clock clicks -milliseconds] - $lastscrollset > 500} {
        setcanvscroll
    }
    if {[info exists pending_select] &&
        [commitinview $pending_select $curview]} {
        update
        selectline [rowofcommit $pending_select] 1
    }
    drawvisible
}

# With path limiting, we mightn't get the actual HEAD commit,
# so ask git rev-list what is the first ancestor of HEAD that
# touches a file in the path limit.
proc get_viewmainhead {view} {
    global viewmainheadid vfilelimit viewinstances mainheadid

    catch {
        set rfd [safe_open_command [concat git rev-list -1 $mainheadid \
                           -- $vfilelimit($view)]]
        set j [reg_instance $rfd]
        lappend viewinstances($view) $j
        fconfigure $rfd -blocking 0
        filerun $rfd [list getviewhead $rfd $j $view]
        set viewmainheadid($curview) {}
    }
}

# git rev-list should give us just 1 line to use as viewmainheadid($view)
proc getviewhead {fd inst view} {
    global viewmainheadid commfd curview viewinstances showlocalchanges
    global hashlength

    set id {}
    if {[gets $fd line] < 0} {
        if {![eof $fd]} {
            return 1
        }
    } elseif {[string length $line] == $hashlength && [string is xdigit $line]} {
        set id $line
    }
    set viewmainheadid($view) $id
    close $fd
    unset commfd($inst)
    set i [lsearch -exact $viewinstances($view) $inst]
    if {$i >= 0} {
        set viewinstances($view) [lreplace $viewinstances($view) $i $i]
    }
    if {$showlocalchanges && $id ne {} && $view == $curview} {
        doshowlocalchanges
    }
    return 0
}

proc doshowlocalchanges {} {
    global curview viewmainheadid

    if {$viewmainheadid($curview) eq {}} return
    if {[commitinview $viewmainheadid($curview) $curview]} {
        dodiffindex
    } else {
        interestedin $viewmainheadid($curview) dodiffindex
    }
}

proc dohidelocalchanges {} {
    global nullid nullid2 lserial curview

    if {[commitinview $nullid $curview]} {
        removefakerow $nullid
    }
    if {[commitinview $nullid2 $curview]} {
        removefakerow $nullid2
    }
    incr lserial
}

# spawn off a process to do git diff-index --cached HEAD
proc dodiffindex {} {
    global lserial showlocalchanges vfilelimit curview
    global hasworktree

    if {!$showlocalchanges || !$hasworktree} return
    incr lserial
    set cmd "git diff-index --cached --ignore-submodules=dirty HEAD"
    if {$vfilelimit($curview) ne {}} {
        set cmd [concat $cmd -- $vfilelimit($curview)]
    }
    set fd [safe_open_command $cmd]
    fconfigure $fd -blocking 0
    set i [reg_instance $fd]
    filerun $fd [list readdiffindex $fd $lserial $i]
}

proc readdiffindex {fd serial inst} {
    global viewmainheadid nullid nullid2 curview commitinfo commitdata lserial
    global vfilelimit

    set isdiff 1
    if {[gets $fd line] < 0} {
        if {![eof $fd]} {
            return 1
        }
        set isdiff 0
    }
    # we only need to see one line and we don't really care what it says...
    stop_instance $inst

    if {$serial != $lserial} {
        return 0
    }

    # now see if there are any local changes not checked in to the index
    set cmd "git diff-files"
    if {$vfilelimit($curview) ne {}} {
        set cmd [concat $cmd -- $vfilelimit($curview)]
    }
    set fd [safe_open_command $cmd]
    fconfigure $fd -blocking 0
    set i [reg_instance $fd]
    filerun $fd [list readdifffiles $fd $serial $i]

    if {$isdiff && ![commitinview $nullid2 $curview]} {
        # add the line for the changes in the index to the graph
        set hl [mc "Local changes checked in to index but not committed"]
        set commitinfo($nullid2) [list  $hl {} {} {} {} "    $hl\n"]
        set commitdata($nullid2) "\n    $hl\n"
        if {[commitinview $nullid $curview]} {
            removefakerow $nullid
        }
        insertfakerow $nullid2 $viewmainheadid($curview)
    } elseif {!$isdiff && [commitinview $nullid2 $curview]} {
        if {[commitinview $nullid $curview]} {
            removefakerow $nullid
        }
        removefakerow $nullid2
    }
    return 0
}

proc readdifffiles {fd serial inst} {
    global viewmainheadid nullid nullid2 curview
    global commitinfo commitdata lserial

    set isdiff 1
    if {[gets $fd line] < 0} {
        if {![eof $fd]} {
            return 1
        }
        set isdiff 0
    }
    # we only need to see one line and we don't really care what it says...
    stop_instance $inst

    if {$serial != $lserial} {
        return 0
    }

    if {$isdiff && ![commitinview $nullid $curview]} {
        # add the line for the local diff to the graph
        set hl [mc "Local uncommitted changes, not checked in to index"]
        set commitinfo($nullid) [list  $hl {} {} {} {} "    $hl\n"]
        set commitdata($nullid) "\n    $hl\n"
        if {[commitinview $nullid2 $curview]} {
            set p $nullid2
        } else {
            set p $viewmainheadid($curview)
        }
        insertfakerow $nullid $p
    } elseif {!$isdiff && [commitinview $nullid $curview]} {
        removefakerow $nullid
    }
    return 0
}

proc nextuse {id row} {
    global curview children

    if {[info exists children($curview,$id)]} {
        foreach kid $children($curview,$id) {
            if {![commitinview $kid $curview]} {
                return -1
            }
            if {[rowofcommit $kid] > $row} {
                return [rowofcommit $kid]
            }
        }
    }
    if {[commitinview $id $curview]} {
        return [rowofcommit $id]
    }
    return -1
}

proc prevuse {id row} {
    global curview children

    set ret -1
    if {[info exists children($curview,$id)]} {
        foreach kid $children($curview,$id) {
            if {![commitinview $kid $curview]} break
            if {[rowofcommit $kid] < $row} {
                set ret [rowofcommit $kid]
            }
        }
    }
    return $ret
}

proc make_idlist {row} {
    global displayorder parentlist uparrowlen downarrowlen mingaplen
    global commitidx curview children

    set r [expr {$row - $mingaplen - $downarrowlen - 1}]
    if {$r < 0} {
        set r 0
    }
    set ra [expr {$row - $downarrowlen}]
    if {$ra < 0} {
        set ra 0
    }
    set rb [expr {$row + $uparrowlen}]
    if {$rb > $commitidx($curview)} {
        set rb $commitidx($curview)
    }
    make_disporder $r [expr {$rb + 1}]
    set ids {}
    for {} {$r < $ra} {incr r} {
        set nextid [lindex $displayorder [expr {$r + 1}]]
        foreach p [lindex $parentlist $r] {
            if {$p eq $nextid} continue
            set rn [nextuse $p $r]
            if {$rn >= $row &&
                $rn <= $r + $downarrowlen + $mingaplen + $uparrowlen} {
                lappend ids [list [ordertoken $p] $p]
            }
        }
    }
    for {} {$r < $row} {incr r} {
        set nextid [lindex $displayorder [expr {$r + 1}]]
        foreach p [lindex $parentlist $r] {
            if {$p eq $nextid} continue
            set rn [nextuse $p $r]
            if {$rn < 0 || $rn >= $row} {
                lappend ids [list [ordertoken $p] $p]
            }
        }
    }
    set id [lindex $displayorder $row]
    lappend ids [list [ordertoken $id] $id]
    while {$r < $rb} {
        foreach p [lindex $parentlist $r] {
            set firstkid [lindex $children($curview,$p) 0]
            if {[rowofcommit $firstkid] < $row} {
                lappend ids [list [ordertoken $p] $p]
            }
        }
        incr r
        set id [lindex $displayorder $r]
        if {$id ne {}} {
            set firstkid [lindex $children($curview,$id) 0]
            if {$firstkid ne {} && [rowofcommit $firstkid] < $row} {
                lappend ids [list [ordertoken $id] $id]
            }
        }
    }
    set idlist {}
    foreach idx [lsort -unique $ids] {
        lappend idlist [lindex $idx 1]
    }
    return $idlist
}

proc rowsequal {a b} {
    while {[set i [lsearch -exact $a {}]] >= 0} {
        set a [lreplace $a $i $i]
    }
    while {[set i [lsearch -exact $b {}]] >= 0} {
        set b [lreplace $b $i $i]
    }
    return [expr {$a eq $b}]
}

proc makeupline {id row rend col} {
    global rowidlist uparrowlen downarrowlen mingaplen

    for {set r $rend} {1} {set r $rstart} {
        set rstart [prevuse $id $r]
        if {$rstart < 0} return
        if {$rstart < $row} break
    }
    if {$rstart + $uparrowlen + $mingaplen + $downarrowlen < $rend} {
        set rstart [expr {$rend - $uparrowlen - 1}]
    }
    for {set r $rstart} {[incr r] <= $row} {} {
        set idlist [lindex $rowidlist $r]
        if {$idlist ne {} && [lsearch -exact $idlist $id] < 0} {
            set col [idcol $idlist $id $col]
            lset rowidlist $r [linsert $idlist $col $id]
            changedrow $r
        }
    }
}

proc layoutrows {row endrow} {
    global rowidlist rowisopt rowfinal displayorder
    global uparrowlen downarrowlen maxwidth mingaplen
    global children parentlist
    global commitidx viewcomplete curview

    make_disporder [expr {$row - 1}] [expr {$endrow + $uparrowlen}]
    set idlist {}
    if {$row > 0} {
        set rm1 [expr {$row - 1}]
        foreach id [lindex $rowidlist $rm1] {
            if {$id ne {}} {
                lappend idlist $id
            }
        }
        set final [lindex $rowfinal $rm1]
    }
    for {} {$row < $endrow} {incr row} {
        set rm1 [expr {$row - 1}]
        if {$rm1 < 0 || $idlist eq {}} {
            set idlist [make_idlist $row]
            set final 1
        } else {
            set id [lindex $displayorder $rm1]
            set col [lsearch -exact $idlist $id]
            set idlist [lreplace $idlist $col $col]
            foreach p [lindex $parentlist $rm1] {
                if {[lsearch -exact $idlist $p] < 0} {
                    set col [idcol $idlist $p $col]
                    set idlist [linsert $idlist $col $p]
                    # if not the first child, we have to insert a line going up
                    if {$id ne [lindex $children($curview,$p) 0]} {
                        makeupline $p $rm1 $row $col
                    }
                }
            }
            set id [lindex $displayorder $row]
            if {$row > $downarrowlen} {
                set termrow [expr {$row - $downarrowlen - 1}]
                foreach p [lindex $parentlist $termrow] {
                    set i [lsearch -exact $idlist $p]
                    if {$i < 0} continue
                    set nr [nextuse $p $termrow]
                    if {$nr < 0 || $nr >= $row + $mingaplen + $uparrowlen} {
                        set idlist [lreplace $idlist $i $i]
                    }
                }
            }
            set col [lsearch -exact $idlist $id]
            if {$col < 0} {
                set col [idcol $idlist $id]
                set idlist [linsert $idlist $col $id]
                if {$children($curview,$id) ne {}} {
                    makeupline $id $rm1 $row $col
                }
            }
            set r [expr {$row + $uparrowlen - 1}]
            if {$r < $commitidx($curview)} {
                set x $col
                foreach p [lindex $parentlist $r] {
                    if {[lsearch -exact $idlist $p] >= 0} continue
                    set fk [lindex $children($curview,$p) 0]
                    if {[rowofcommit $fk] < $row} {
                        set x [idcol $idlist $p $x]
                        set idlist [linsert $idlist $x $p]
                    }
                }
                if {[incr r] < $commitidx($curview)} {
                    set p [lindex $displayorder $r]
                    if {[lsearch -exact $idlist $p] < 0} {
                        set fk [lindex $children($curview,$p) 0]
                        if {$fk ne {} && [rowofcommit $fk] < $row} {
                            set x [idcol $idlist $p $x]
                            set idlist [linsert $idlist $x $p]
                        }
                    }
                }
            }
        }
        if {$final && !$viewcomplete($curview) &&
            $row + $uparrowlen + $mingaplen + $downarrowlen
                >= $commitidx($curview)} {
            set final 0
        }
        set l [llength $rowidlist]
        if {$row == $l} {
            lappend rowidlist $idlist
            lappend rowisopt 0
            lappend rowfinal $final
        } elseif {$row < $l} {
            if {![rowsequal $idlist [lindex $rowidlist $row]]} {
                lset rowidlist $row $idlist
                changedrow $row
            }
            lset rowfinal $row $final
        } else {
            set pad [ntimes [expr {$row - $l}] {}]
            set rowidlist [concat $rowidlist $pad]
            lappend rowidlist $idlist
            set rowfinal [concat $rowfinal $pad]
            lappend rowfinal $final
            set rowisopt [concat $rowisopt [ntimes [expr {$row - $l + 1}] 0]]
        }
    }
    return $row
}

proc changedrow {row} {
    global displayorder iddrawn rowisopt need_redisplay

    set l [llength $rowisopt]
    if {$row < $l} {
        lset rowisopt $row 0
        if {$row + 1 < $l} {
            lset rowisopt [expr {$row + 1}] 0
            if {$row + 2 < $l} {
                lset rowisopt [expr {$row + 2}] 0
            }
        }
    }
    set id [lindex $displayorder $row]
    if {[info exists iddrawn($id)]} {
        set need_redisplay 1
    }
}

proc insert_pad {row col npad} {
    global rowidlist

    set pad [ntimes $npad {}]
    set idlist [lindex $rowidlist $row]
    set bef [lrange $idlist 0 [expr {$col - 1}]]
    set aft [lrange $idlist $col end]
    set i [lsearch -exact $aft {}]
    if {$i > 0} {
        set aft [lreplace $aft $i $i]
    }
    lset rowidlist $row [concat $bef $pad $aft]
    changedrow $row
}

proc optimize_rows {row col endrow} {
    global rowidlist rowisopt displayorder curview children

    if {$row < 1} {
        set row 1
    }
    for {} {$row < $endrow} {incr row; set col 0} {
        if {[lindex $rowisopt $row]} continue
        set haspad 0
        set y0 [expr {$row - 1}]
        set ym [expr {$row - 2}]
        set idlist [lindex $rowidlist $row]
        set previdlist [lindex $rowidlist $y0]
        if {$idlist eq {} || $previdlist eq {}} continue
        if {$ym >= 0} {
            set pprevidlist [lindex $rowidlist $ym]
            if {$pprevidlist eq {}} continue
        } else {
            set pprevidlist {}
        }
        set x0 -1
        set xm -1
        for {} {$col < [llength $idlist]} {incr col} {
            set id [lindex $idlist $col]
            if {[lindex $previdlist $col] eq $id} continue
            if {$id eq {}} {
                set haspad 1
                continue
            }
            set x0 [lsearch -exact $previdlist $id]
            if {$x0 < 0} continue
            set z [expr {$x0 - $col}]
            set isarrow 0
            set z0 {}
            if {$ym >= 0} {
                set xm [lsearch -exact $pprevidlist $id]
                if {$xm >= 0} {
                    set z0 [expr {$xm - $x0}]
                }
            }
            if {$z0 eq {}} {
                # if row y0 is the first child of $id then it's not an arrow
                if {[lindex $children($curview,$id) 0] ne
                    [lindex $displayorder $y0]} {
                    set isarrow 1
                }
            }
            if {!$isarrow && $id ne [lindex $displayorder $row] &&
                [lsearch -exact [lindex $rowidlist [expr {$row+1}]] $id] < 0} {
                set isarrow 1
            }
            # Looking at lines from this row to the previous row,
            # make them go straight up if they end in an arrow on
            # the previous row; otherwise make them go straight up
            # or at 45 degrees.
            if {$z < -1 || ($z < 0 && $isarrow)} {
                # Line currently goes left too much;
                # insert pads in the previous row, then optimize it
                set npad [expr {-1 - $z + $isarrow}]
                insert_pad $y0 $x0 $npad
                if {$y0 > 0} {
                    optimize_rows $y0 $x0 $row
                }
                set previdlist [lindex $rowidlist $y0]
                set x0 [lsearch -exact $previdlist $id]
                set z [expr {$x0 - $col}]
                if {$z0 ne {}} {
                    set pprevidlist [lindex $rowidlist $ym]
                    set xm [lsearch -exact $pprevidlist $id]
                    set z0 [expr {$xm - $x0}]
                }
            } elseif {$z > 1 || ($z > 0 && $isarrow)} {
                # Line currently goes right too much;
                # insert pads in this line
                set npad [expr {$z - 1 + $isarrow}]
                insert_pad $row $col $npad
                set idlist [lindex $rowidlist $row]
                incr col $npad
                set z [expr {$x0 - $col}]
                set haspad 1
            }
            if {$z0 eq {} && !$isarrow && $ym >= 0} {
                # this line links to its first child on row $row-2
                set id [lindex $displayorder $ym]
                set xc [lsearch -exact $pprevidlist $id]
                if {$xc >= 0} {
                    set z0 [expr {$xc - $x0}]
                }
            }
            # avoid lines jigging left then immediately right
            if {$z0 ne {} && $z < 0 && $z0 > 0} {
                insert_pad $y0 $x0 1
                incr x0
                optimize_rows $y0 $x0 $row
                set previdlist [lindex $rowidlist $y0]
            }
        }
        if {!$haspad} {
            # Find the first column that doesn't have a line going right
            for {set col [llength $idlist]} {[incr col -1] >= 0} {} {
                set id [lindex $idlist $col]
                if {$id eq {}} break
                set x0 [lsearch -exact $previdlist $id]
                if {$x0 < 0} {
                    # check if this is the link to the first child
                    set kid [lindex $displayorder $y0]
                    if {[lindex $children($curview,$id) 0] eq $kid} {
                        # it is, work out offset to child
                        set x0 [lsearch -exact $previdlist $kid]
                    }
                }
                if {$x0 <= $col} break
            }
            # Insert a pad at that column as long as it has a line and
            # isn't the last column
            if {$x0 >= 0 && [incr col] < [llength $idlist]} {
                set idlist [linsert $idlist $col {}]
                lset rowidlist $row $idlist
                changedrow $row
            }
        }
    }
}

proc xc {row col} {
    global canvx0 linespc
    return [expr {$canvx0 + $col * $linespc}]
}

proc yc {row} {
    global canvy0 linespc
    return [expr {$canvy0 + $row * $linespc}]
}

proc linewidth {id} {
    global thickerline lthickness

    set wid $lthickness
    if {[info exists thickerline] && $id eq $thickerline} {
        set wid [expr {2 * $lthickness}]
    }
    return $wid
}

proc rowranges {id} {
    global curview children uparrowlen downarrowlen
    global rowidlist

    set kids $children($curview,$id)
    if {$kids eq {}} {
        return {}
    }
    set ret {}
    lappend kids $id
    foreach child $kids {
        if {![commitinview $child $curview]} break
        set row [rowofcommit $child]
        if {![info exists prev]} {
            lappend ret [expr {$row + 1}]
        } else {
            if {$row <= $prevrow} {
                puts "oops children of [shortids $id] out of order [shortids $child] $row <= [shortids $prev] $prevrow"
            }
            # see if the line extends the whole way from prevrow to row
            if {$row > $prevrow + $uparrowlen + $downarrowlen &&
                [lsearch -exact [lindex $rowidlist \
                            [expr {int(($row + $prevrow) / 2)}]] $id] < 0} {
                # it doesn't, see where it ends
                set r [expr {$prevrow + $downarrowlen}]
                if {[lsearch -exact [lindex $rowidlist $r] $id] < 0} {
                    while {[incr r -1] > $prevrow &&
                           [lsearch -exact [lindex $rowidlist $r] $id] < 0} {}
                } else {
                    while {[incr r] <= $row &&
                           [lsearch -exact [lindex $rowidlist $r] $id] >= 0} {}
                    incr r -1
                }
                lappend ret $r
                # see where it starts up again
                set r [expr {$row - $uparrowlen}]
                if {[lsearch -exact [lindex $rowidlist $r] $id] < 0} {
                    while {[incr r] < $row &&
                           [lsearch -exact [lindex $rowidlist $r] $id] < 0} {}
                } else {
                    while {[incr r -1] >= $prevrow &&
                           [lsearch -exact [lindex $rowidlist $r] $id] >= 0} {}
                    incr r
                }
                lappend ret $r
            }
        }
        if {$child eq $id} {
            lappend ret $row
        }
        set prev $child
        set prevrow $row
    }
    return $ret
}

proc drawlineseg {id row endrow arrowlow} {
    global rowidlist displayorder iddrawn linesegs
    global canv colormap linespc curview maxlinelen parentlist

    set cols [list [lsearch -exact [lindex $rowidlist $row] $id]]
    set le [expr {$row + 1}]
    set arrowhigh 1
    while {1} {
        set c [lsearch -exact [lindex $rowidlist $le] $id]
        if {$c < 0} {
            incr le -1
            break
        }
        lappend cols $c
        set x [lindex $displayorder $le]
        if {$x eq $id} {
            set arrowhigh 0
            break
        }
        if {[info exists iddrawn($x)] || $le == $endrow} {
            set c [lsearch -exact [lindex $rowidlist [expr {$le+1}]] $id]
            if {$c >= 0} {
                lappend cols $c
                set arrowhigh 0
            }
            break
        }
        incr le
    }
    if {$le <= $row} {
        return $row
    }

    set lines {}
    set i 0
    set joinhigh 0
    if {[info exists linesegs($id)]} {
        set lines $linesegs($id)
        foreach li $lines {
            set r0 [lindex $li 0]
            if {$r0 > $row} {
                if {$r0 == $le && [lindex $li 1] - $row <= $maxlinelen} {
                    set joinhigh 1
                }
                break
            }
            incr i
        }
    }
    set joinlow 0
    if {$i > 0} {
        set li [lindex $lines [expr {$i-1}]]
        set r1 [lindex $li 1]
        if {$r1 == $row && $le - [lindex $li 0] <= $maxlinelen} {
            set joinlow 1
        }
    }

    set x [lindex $cols [expr {$le - $row}]]
    set xp [lindex $cols [expr {$le - 1 - $row}]]
    set dir [expr {$xp - $x}]
    if {$joinhigh} {
        set ith [lindex $lines $i 2]
        set coords [$canv coords $ith]
        set ah [$canv itemcget $ith -arrow]
        set arrowhigh [expr {$ah eq "first" || $ah eq "both"}]
        set x2 [lindex $cols [expr {$le + 1 - $row}]]
        if {$x2 ne {} && $x - $x2 == $dir} {
            set coords [lrange $coords 0 end-2]
        }
    } else {
        set coords [list [xc $le $x] [yc $le]]
    }
    if {$joinlow} {
        set itl [lindex $lines [expr {$i-1}] 2]
        set al [$canv itemcget $itl -arrow]
        set arrowlow [expr {$al eq "last" || $al eq "both"}]
    } elseif {$arrowlow} {
        if {[lsearch -exact [lindex $rowidlist [expr {$row-1}]] $id] >= 0 ||
            [lsearch -exact [lindex $parentlist [expr {$row-1}]] $id] >= 0} {
            set arrowlow 0
        }
    }
    set arrow [lindex {none first last both} [expr {$arrowhigh + 2*$arrowlow}]]
    for {set y $le} {[incr y -1] > $row} {} {
        set x $xp
        set xp [lindex $cols [expr {$y - 1 - $row}]]
        set ndir [expr {$xp - $x}]
        if {$dir != $ndir || $xp < 0} {
            lappend coords [xc $y $x] [yc $y]
        }
        set dir $ndir
    }
    if {!$joinlow} {
        if {$xp < 0} {
            # join parent line to first child
            set ch [lindex $displayorder $row]
            set xc [lsearch -exact [lindex $rowidlist $row] $ch]
            if {$xc < 0} {
                puts "oops: drawlineseg: child $ch not on row $row"
            } elseif {$xc != $x} {
                if {($arrowhigh && $le == $row + 1) || $dir == 0} {
                    set d [expr {int(0.5 * $linespc)}]
                    set x1 [xc $row $x]
                    if {$xc < $x} {
                        set x2 [expr {$x1 - $d}]
                    } else {
                        set x2 [expr {$x1 + $d}]
                    }
                    set y2 [yc $row]
                    set y1 [expr {$y2 + $d}]
                    lappend coords $x1 $y1 $x2 $y2
                } elseif {$xc < $x - 1} {
                    lappend coords [xc $row [expr {$x-1}]] [yc $row]
                } elseif {$xc > $x + 1} {
                    lappend coords [xc $row [expr {$x+1}]] [yc $row]
                }
                set x $xc
            }
            lappend coords [xc $row $x] [yc $row]
        } else {
            set xn [xc $row $xp]
            set yn [yc $row]
            lappend coords $xn $yn
        }
        if {!$joinhigh} {
            assigncolor $id
            set t [$canv create line $coords -width [linewidth $id] \
                       -fill $colormap($id) -tags lines.$id -arrow $arrow]
            $canv lower $t
            bindline $t $id
            set lines [linsert $lines $i [list $row $le $t]]
        } else {
            $canv coords $ith $coords
            if {$arrow ne $ah} {
                $canv itemconf $ith -arrow $arrow
            }
            lset lines $i 0 $row
        }
    } else {
        set xo [lsearch -exact [lindex $rowidlist [expr {$row - 1}]] $id]
        set ndir [expr {$xo - $xp}]
        set clow [$canv coords $itl]
        if {$dir == $ndir} {
            set clow [lrange $clow 2 end]
        }
        set coords [concat $coords $clow]
        if {!$joinhigh} {
            lset lines [expr {$i-1}] 1 $le
        } else {
            # coalesce two pieces
            $canv delete $ith
            set b [lindex $lines [expr {$i-1}] 0]
            set e [lindex $lines $i 1]
            set lines [lreplace $lines [expr {$i-1}] $i [list $b $e $itl]]
        }
        $canv coords $itl $coords
        if {$arrow ne $al} {
            $canv itemconf $itl -arrow $arrow
        }
    }

    set linesegs($id) $lines
    return $le
}

proc drawparentlinks {id row} {
    global rowidlist canv colormap curview parentlist
    global idpos linespc

    set rowids [lindex $rowidlist $row]
    set col [lsearch -exact $rowids $id]
    if {$col < 0} return
    set olds [lindex $parentlist $row]
    set row2 [expr {$row + 1}]
    set x [xc $row $col]
    set y [yc $row]
    set y2 [yc $row2]
    set d [expr {int(0.5 * $linespc)}]
    set ymid [expr {$y + $d}]
    set ids [lindex $rowidlist $row2]
    # rmx = right-most X coord used
    set rmx 0
    foreach p $olds {
        set i [lsearch -exact $ids $p]
        if {$i < 0} {
            puts "oops, parent $p of $id not in list"
            continue
        }
        set x2 [xc $row2 $i]
        if {$x2 > $rmx} {
            set rmx $x2
        }
        set j [lsearch -exact $rowids $p]
        if {$j < 0} {
            # drawlineseg will do this one for us
            continue
        }
        assigncolor $p
        # should handle duplicated parents here...
        set coords [list $x $y]
        if {$i != $col} {
            # if attaching to a vertical segment, draw a smaller
            # slant for visual distinctness
            if {$i == $j} {
                if {$i < $col} {
                    lappend coords [expr {$x2 + $d}] $y $x2 $ymid
                } else {
                    lappend coords [expr {$x2 - $d}] $y $x2 $ymid
                }
            } elseif {$i < $col && $i < $j} {
                # segment slants towards us already
                lappend coords [xc $row $j] $y
            } else {
                if {$i < $col - 1} {
                    lappend coords [expr {$x2 + $linespc}] $y
                } elseif {$i > $col + 1} {
                    lappend coords [expr {$x2 - $linespc}] $y
                }
                lappend coords $x2 $y2
            }
        } else {
            lappend coords $x2 $y2
        }
        set t [$canv create line $coords -width [linewidth $p] \
                   -fill $colormap($p) -tags lines.$p]
        $canv lower $t
        bindline $t $p
    }
    if {$rmx > [lindex $idpos($id) 1]} {
        lset idpos($id) 1 $rmx
        redrawtags $id
    }
}

proc drawlines {id} {
    global canv

    $canv itemconf lines.$id -width [linewidth $id]
}

proc drawcmittext {id row col} {
    global linespc canv canv2 canv3 fgcolor curview
    global cmitlisted commitinfo rowidlist parentlist
    global rowtextx idpos idtags idheads idotherrefs
    global linehtag linentag linedtag selectedline
    global canvxmax boldids boldnameids fgcolor markedid
    global mainheadid nullid nullid2 circleitem circlecolors ctxbut
    global mainheadcirclecolor workingfilescirclecolor indexcirclecolor
    global circleoutlinecolor

    # listed is 0 for boundary, 1 for normal, 2 for negative, 3 for left, 4 for right
    set listed $cmitlisted($curview,$id)
    if {$id eq $nullid} {
        set ofill $workingfilescirclecolor
    } elseif {$id eq $nullid2} {
        set ofill $indexcirclecolor
    } elseif {$id eq $mainheadid} {
        set ofill $mainheadcirclecolor
    } else {
        set ofill [lindex $circlecolors $listed]
    }
    set x [xc $row $col]
    set y [yc $row]
    set orad [expr {$linespc / 3}]
    if {$listed <= 2} {
        set t [$canv create oval [expr {$x - $orad}] [expr {$y - $orad}] \
                   [expr {$x + $orad - 1}] [expr {$y + $orad - 1}] \
                   -fill $ofill -outline $circleoutlinecolor -width 1 -tags circle]
    } elseif {$listed == 3} {
        # triangle pointing left for left-side commits
        set t [$canv create polygon \
                   [expr {$x - $orad}] $y \
                   [expr {$x + $orad - 1}] [expr {$y - $orad}] \
                   [expr {$x + $orad - 1}] [expr {$y + $orad - 1}] \
                   -fill $ofill -outline $circleoutlinecolor -width 1 -tags circle]
    } else {
        # triangle pointing right for right-side commits
        set t [$canv create polygon \
                   [expr {$x + $orad - 1}] $y \
                   [expr {$x - $orad}] [expr {$y - $orad}] \
                   [expr {$x - $orad}] [expr {$y + $orad - 1}] \
                   -fill $ofill -outline $circleoutlinecolor -width 1 -tags circle]
    }
    set circleitem($row) $t
    $canv raise $t
    $canv bind $t <1> {selcanvline {} %x %y}
    set rmx [llength [lindex $rowidlist $row]]
    set olds [lindex $parentlist $row]
    if {$olds ne {}} {
        set nextids [lindex $rowidlist [expr {$row + 1}]]
        foreach p $olds {
            set i [lsearch -exact $nextids $p]
            if {$i > $rmx} {
                set rmx $i
            }
        }
    }
    set xt [xc $row $rmx]
    set rowtextx($row) $xt
    set idpos($id) [list $x $xt $y]
    if {[info exists idtags($id)] || [info exists idheads($id)]
        || [info exists idotherrefs($id)]} {
        set xt [drawtags $id $x $xt $y]
    }
    if {[lindex $commitinfo($id) 6] > 0} {
        set xt [drawnotesign $xt $y]
    }
    set headline [lindex $commitinfo($id) 0]
    set name [lindex $commitinfo($id) 1]
    set date [lindex $commitinfo($id) 2]
    set date [formatdate $date]
    set font mainfont
    set nfont mainfont
    set isbold [ishighlighted $id]
    if {$isbold > 0} {
        lappend boldids $id
        set font mainfontbold
        if {$isbold > 1} {
            lappend boldnameids $id
            set nfont mainfontbold
        }
    }
    set linehtag($id) [$canv create text $xt $y -anchor w -fill $fgcolor \
                           -text $headline -font $font -tags text]
    $canv bind $linehtag($id) $ctxbut "rowmenu %X %Y $id"
    set linentag($id) [$canv2 create text 3 $y -anchor w -fill $fgcolor \
                           -text $name -font $nfont -tags text]
    set linedtag($id) [$canv3 create text 3 $y -anchor w -fill $fgcolor \
                           -text $date -font mainfont -tags text]
    if {$selectedline == $row} {
        make_secsel $id
    }
    if {[info exists markedid] && $markedid eq $id} {
        make_idmark $id
    }
    set xr [expr {$xt + [font measure $font $headline]}]
    if {$xr > $canvxmax} {
        set canvxmax $xr
        setcanvscroll
    }
}

proc drawcmitrow {row} {
    global displayorder rowidlist nrows_drawn
    global iddrawn markingmatches
    global commitinfo numcommits
    global filehighlight fhighlights findpattern nhighlights
    global hlview vhighlights
    global highlight_related rhighlights

    if {$row >= $numcommits} return

    set id [lindex $displayorder $row]
    if {[info exists hlview] && ![info exists vhighlights($id)]} {
        askvhighlight $row $id
    }
    if {[info exists filehighlight] && ![info exists fhighlights($id)]} {
        askfilehighlight $row $id
    }
    if {$findpattern ne {} && ![info exists nhighlights($id)]} {
        askfindhighlight $row $id
    }
    if {$highlight_related ne [mc "None"] && ![info exists rhighlights($id)]} {
        askrelhighlight $row $id
    }
    if {![info exists iddrawn($id)]} {
        set col [lsearch -exact [lindex $rowidlist $row] $id]
        if {$col < 0} {
            puts "oops, row $row id $id not in list"
            return
        }
        if {![info exists commitinfo($id)]} {
            getcommit $id
        }
        assigncolor $id
        drawcmittext $id $row $col
        set iddrawn($id) 1
        incr nrows_drawn
    }
    if {$markingmatches} {
        markrowmatches $row $id
    }
}

proc drawcommits {row {endrow {}}} {
    global numcommits iddrawn displayorder curview need_redisplay
    global parentlist rowidlist rowfinal uparrowlen downarrowlen nrows_drawn

    if {$row < 0} {
        set row 0
    }
    if {$endrow eq {}} {
        set endrow $row
    }
    if {$endrow >= $numcommits} {
        set endrow [expr {$numcommits - 1}]
    }

    set rl1 [expr {$row - $downarrowlen - 3}]
    if {$rl1 < 0} {
        set rl1 0
    }
    set ro1 [expr {$row - 3}]
    if {$ro1 < 0} {
        set ro1 0
    }
    set r2 [expr {$endrow + $uparrowlen + 3}]
    if {$r2 > $numcommits} {
        set r2 $numcommits
    }
    for {set r $rl1} {$r < $r2} {incr r} {
        if {[lindex $rowidlist $r] ne {} && [lindex $rowfinal $r]} {
            if {$rl1 < $r} {
                layoutrows $rl1 $r
            }
            set rl1 [expr {$r + 1}]
        }
    }
    if {$rl1 < $r} {
        layoutrows $rl1 $r
    }
    optimize_rows $ro1 0 $r2
    if {$need_redisplay || $nrows_drawn > 2000} {
        clear_display
    }

    # make the lines join to already-drawn rows either side
    set r [expr {$row - 1}]
    if {$r < 0 || ![info exists iddrawn([lindex $displayorder $r])]} {
        set r $row
    }
    set er [expr {$endrow + 1}]
    if {$er >= $numcommits ||
        ![info exists iddrawn([lindex $displayorder $er])]} {
        set er $endrow
    }
    for {} {$r <= $er} {incr r} {
        set id [lindex $displayorder $r]
        set wasdrawn [info exists iddrawn($id)]
        drawcmitrow $r
        if {$r == $er} break
        set nextid [lindex $displayorder [expr {$r + 1}]]
        if {$wasdrawn && [info exists iddrawn($nextid)]} continue
        drawparentlinks $id $r

        set rowids [lindex $rowidlist $r]
        foreach lid $rowids {
            if {$lid eq {}} continue
            if {[info exists lineend($lid)] && $lineend($lid) > $r} continue
            if {$lid eq $id} {
                # see if this is the first child of any of its parents
                foreach p [lindex $parentlist $r] {
                    if {[lsearch -exact $rowids $p] < 0} {
                        # make this line extend up to the child
                        set lineend($p) [drawlineseg $p $r $er 0]
                    }
                }
            } else {
                set lineend($lid) [drawlineseg $lid $r $er 1]
            }
        }
    }
}

proc undolayout {row} {
    global uparrowlen mingaplen downarrowlen
    global rowidlist rowisopt rowfinal need_redisplay

    set r [expr {$row - ($uparrowlen + $mingaplen + $downarrowlen)}]
    if {$r < 0} {
        set r 0
    }
    if {[llength $rowidlist] > $r} {
        incr r -1
        set rowidlist [lrange $rowidlist 0 $r]
        set rowfinal [lrange $rowfinal 0 $r]
        set rowisopt [lrange $rowisopt 0 $r]
        set need_redisplay 1
        run drawvisible
    }
}

proc drawvisible {} {
    global canv linespc curview vrowmod selectedline targetrow targetid
    global need_redisplay cscroll numcommits

    set fs [$canv yview]
    set ymax [lindex [$canv cget -scrollregion] 3]
    if {$ymax eq {} || $ymax == 0 || $numcommits == 0} return
    set f0 [lindex $fs 0]
    set f1 [lindex $fs 1]
    set y0 [expr {int($f0 * $ymax)}]
    set y1 [expr {int($f1 * $ymax)}]

    if {[info exists targetid]} {
        if {[commitinview $targetid $curview]} {
            set r [rowofcommit $targetid]
            if {$r != $targetrow} {
                # Fix up the scrollregion and change the scrolling position
                # now that our target row has moved.
                set diff [expr {($r - $targetrow) * $linespc}]
                set targetrow $r
                setcanvscroll
                set ymax [lindex [$canv cget -scrollregion] 3]
                incr y0 $diff
                incr y1 $diff
                set f0 [expr {$y0 / $ymax}]
                set f1 [expr {$y1 / $ymax}]
                allcanvs yview moveto $f0
                $cscroll set $f0 $f1
                set need_redisplay 1
            }
        } else {
            unset targetid
        }
    }

    set row [expr {int(($y0 - 3) / $linespc) - 1}]
    set endrow [expr {int(($y1 - 3) / $linespc) + 1}]
    if {$endrow >= $vrowmod($curview)} {
        update_arcrows $curview
    }
    if {$selectedline ne {} &&
        $row <= $selectedline && $selectedline <= $endrow} {
        set targetrow $selectedline
    } elseif {[info exists targetid]} {
        set targetrow [expr {int(($row + $endrow) / 2)}]
    }
    if {[info exists targetrow]} {
        if {$targetrow >= $numcommits} {
            set targetrow [expr {$numcommits - 1}]
        }
        set targetid [commitonrow $targetrow]
    }
    drawcommits $row $endrow
}

proc clear_display {} {
    global iddrawn linesegs need_redisplay nrows_drawn
    global vhighlights fhighlights nhighlights rhighlights
    global linehtag linentag linedtag boldids boldnameids

    allcanvs delete all
    unset -nocomplain iddrawn
    unset -nocomplain linesegs
    unset -nocomplain linehtag
    unset -nocomplain linentag
    unset -nocomplain linedtag
    set boldids {}
    set boldnameids {}
    unset -nocomplain vhighlights
    unset -nocomplain fhighlights
    unset -nocomplain nhighlights
    unset -nocomplain rhighlights
    set need_redisplay 0
    set nrows_drawn 0
}

proc findcrossings {id} {
    global rowidlist parentlist numcommits displayorder

    set cross {}
    set ccross {}
    foreach {s e} [rowranges $id] {
        if {$e >= $numcommits} {
            set e [expr {$numcommits - 1}]
        }
        if {$e <= $s} continue
        for {set row $e} {[incr row -1] >= $s} {} {
            set x [lsearch -exact [lindex $rowidlist $row] $id]
            if {$x < 0} break
            set olds [lindex $parentlist $row]
            set kid [lindex $displayorder $row]
            set kidx [lsearch -exact [lindex $rowidlist $row] $kid]
            if {$kidx < 0} continue
            set nextrow [lindex $rowidlist [expr {$row + 1}]]
            foreach p $olds {
                set px [lsearch -exact $nextrow $p]
                if {$px < 0} continue
                if {($kidx < $x && $x < $px) || ($px < $x && $x < $kidx)} {
                    if {[lsearch -exact $ccross $p] >= 0} continue
                    if {$x == $px + ($kidx < $px? -1: 1)} {
                        lappend ccross $p
                    } elseif {[lsearch -exact $cross $p] < 0} {
                        lappend cross $p
                    }
                }
            }
        }
    }
    return [concat $ccross {{}} $cross]
}

proc assigncolor {id} {
    global colormap colors nextcolor
    global parents children children curview

    if {[info exists colormap($id)]} return
    set ncolors [llength $colors]
    if {[info exists children($curview,$id)]} {
        set kids $children($curview,$id)
    } else {
        set kids {}
    }
    if {[llength $kids] == 1} {
        set child [lindex $kids 0]
        if {[info exists colormap($child)]
            && [llength $parents($curview,$child)] == 1} {
            set colormap($id) $colormap($child)
            return
        }
    }
    set badcolors {}
    set origbad {}
    foreach x [findcrossings $id] {
        if {$x eq {}} {
            # delimiter between corner crossings and other crossings
            if {[llength $badcolors] >= $ncolors - 1} break
            set origbad $badcolors
        }
        if {[info exists colormap($x)]
            && [lsearch -exact $badcolors $colormap($x)] < 0} {
            lappend badcolors $colormap($x)
        }
    }
    if {[llength $badcolors] >= $ncolors} {
        set badcolors $origbad
    }
    set origbad $badcolors
    if {[llength $badcolors] < $ncolors - 1} {
        foreach child $kids {
            if {[info exists colormap($child)]
                && [lsearch -exact $badcolors $colormap($child)] < 0} {
                lappend badcolors $colormap($child)
            }
            foreach p $parents($curview,$child) {
                if {[info exists colormap($p)]
                    && [lsearch -exact $badcolors $colormap($p)] < 0} {
                    lappend badcolors $colormap($p)
                }
            }
        }
        if {[llength $badcolors] >= $ncolors} {
            set badcolors $origbad
        }
    }
    for {set i 0} {$i <= $ncolors} {incr i} {
        set c [lindex $colors $nextcolor]
        if {[incr nextcolor] >= $ncolors} {
            set nextcolor 0
        }
        if {[lsearch -exact $badcolors $c]} break
    }
    set colormap($id) $c
}

proc bindline {t id} {
    global canv

    $canv bind $t <Enter> "lineenter %x %y $id"
    $canv bind $t <Motion> "linemotion %x %y $id"
    $canv bind $t <Leave> "lineleave $id"
    $canv bind $t <Button-1> "lineclick %x %y $id 1"
}

proc graph_pane_width {} {
    set g [.tf.histframe.pwclist sashpos 0]
    return [lindex $g 0]
}

proc totalwidth {l font extra} {
    set tot 0
    foreach str $l {
        set tot [expr {$tot + [font measure $font $str] + $extra}]
    }
    return $tot
}

proc drawtags {id x xt y1} {
    global idtags idheads idotherrefs mainhead
    global linespc lthickness
    global canv rowtextx curview fgcolor bgcolor ctxbut
    global headbgcolor headfgcolor headoutlinecolor remotebgcolor
    global tagbgcolor tagfgcolor tagoutlinecolor
    global reflinecolor

    set marks {}
    set ntags 0
    set nheads 0
    set singletag 0
    set maxtags 3
    set maxtagpct 25
    set maxwidth [expr {[graph_pane_width] * $maxtagpct / 100}]
    set delta [expr {int(0.5 * ($linespc - $lthickness))}]
    set extra [expr {$delta + $lthickness + $linespc}]

    if {[info exists idtags($id)]} {
        set marks $idtags($id)
        set ntags [llength $marks]
        if {$ntags > $maxtags ||
            [totalwidth $marks mainfont $extra] > $maxwidth} {
            # show just a single "n tags..." tag
            set singletag 1
            if {$ntags == 1} {
                set marks [list "tag..."]
            } else {
                set marks [list [format "%d tags..." $ntags]]
            }
            set ntags 1
        }
    }
    if {[info exists idheads($id)]} {
        set marks [concat $marks $idheads($id)]
        set nheads [llength $idheads($id)]
    }
    if {[info exists idotherrefs($id)]} {
        set marks [concat $marks $idotherrefs($id)]
    }
    if {$marks eq {}} {
        return $xt
    }

    set yt [expr {$y1 - 0.5 * $linespc}]
    set yb [expr {$yt + $linespc - 1}]
    set xvals {}
    set wvals {}
    set i -1
    foreach tag $marks {
        incr i
        if {$i >= $ntags && $i < $ntags + $nheads && $tag eq $mainhead} {
            set wid [font measure mainfontbold $tag]
        } else {
            set wid [font measure mainfont $tag]
        }
        lappend xvals $xt
        lappend wvals $wid
        set xt [expr {$xt + $wid + $extra}]
    }
    set t [$canv create line $x $y1 [lindex $xvals end] $y1 \
               -width $lthickness -fill $reflinecolor -tags tag.$id]
    $canv lower $t
    foreach tag $marks x $xvals wid $wvals {
        set tag_quoted [string map {% %%} $tag]
        set xl [expr {$x + $delta}]
        set xr [expr {$x + $delta + $wid + $lthickness}]
        set font mainfont
        if {[incr ntags -1] >= 0} {
            # draw a tag
            set t [$canv create polygon $x [expr {$yt + $delta}] $xl $yt \
                       $xr $yt $xr $yb $xl $yb $x [expr {$yb - $delta}] \
                       -width 1 -outline $tagoutlinecolor -fill $tagbgcolor \
                       -tags tag.$id]
            if {$singletag} {
                set tagclick [list showtags $id 1]
            } else {
                set tagclick [list showtag $tag_quoted 1]
            }
            $canv bind $t <1> $tagclick
            set rowtextx([rowofcommit $id]) [expr {$xr + $linespc}]
        } else {
            # draw a head or other ref
            if {[incr nheads -1] >= 0} {
                set col $headbgcolor
                if {$tag eq $mainhead} {
                    set font mainfontbold
                }
            } else {
                set col "#ddddff"
            }
            set xl [expr {$xl - $delta/2}]
            $canv create polygon $x $yt $xr $yt $xr $yb $x $yb \
                -width 1 -outline black -fill $col -tags tag.$id
            if {[regexp {^(remotes/.*/|remotes/)} $tag match remoteprefix]} {
                set rwid [font measure mainfont $remoteprefix]
                set xi [expr {$x + 1}]
                set yti [expr {$yt + 1}]
                set xri [expr {$x + $rwid}]
                $canv create polygon $xi $yti $xri $yti $xri $yb $xi $yb \
                        -width 0 -fill $remotebgcolor -tags tag.$id
            }
        }
        set t [$canv create text $xl $y1 -anchor w -text $tag -fill $headfgcolor \
                   -font $font -tags [list tag.$id text]]
        if {$ntags >= 0} {
            $canv bind $t <1> $tagclick
        } elseif {$nheads >= 0} {
            $canv bind $t $ctxbut [list headmenu %X %Y $id $tag_quoted]
        }
    }
    return $xt
}

proc drawnotesign {xt y} {
    global linespc canv fgcolor

    set orad [expr {$linespc / 3}]
    set t [$canv create rectangle [expr {$xt - $orad}] [expr {$y - $orad}] \
               [expr {$xt + $orad - 1}] [expr {$y + $orad - 1}] \
               -fill yellow -outline $fgcolor -width 1 -tags circle]
    set xt [expr {$xt + $orad * 3}]
    return $xt
}

proc xcoord {i level ln} {
    global canvx0 xspc1 xspc2

    set x [expr {$canvx0 + $i * $xspc1($ln)}]
    if {$i > 0 && $i == $level} {
        set x [expr {$x + 0.5 * ($xspc2 - $xspc1($ln))}]
    } elseif {$i > $level} {
        set x [expr {$x + $xspc2 - $xspc1($ln)}]
    }
    return $x
}

proc show_status {msg} {
    global canv fgcolor

    clear_display
    set_window_title
    $canv create text 3 3 -anchor nw -text $msg -font mainfont \
        -tags text -fill $fgcolor
}

# Don't change the text pane cursor if it is currently the hand cursor,
# showing that we are over a sha1 ID link.
proc settextcursor {c} {
    global ctext curtextcursor

    if {[$ctext cget -cursor] == $curtextcursor} {
        $ctext config -cursor $c
    }
    set curtextcursor $c
}

proc nowbusy {what {name {}}} {
    global isbusy busyname statusw

    if {[array names isbusy] eq {}} {
        . config -cursor watch
        settextcursor watch
    }
    set isbusy($what) 1
    set busyname($what) $name
    if {$name ne {}} {
        $statusw conf -text $name
    }
}

proc notbusy {what} {
    global isbusy maincursor textcursor busyname statusw

    catch {
        unset isbusy($what)
        if {$busyname($what) ne {} &&
            [$statusw cget -text] eq $busyname($what)} {
            $statusw conf -text {}
        }
    }
    if {[array names isbusy] eq {}} {
        . config -cursor $maincursor
        settextcursor $textcursor
    }
}

proc findmatches {f} {
    global findtype findstring
    if {$findtype == [mc "Regexp"]} {
        set matches [regexp -indices -all -inline $findstring $f]
    } else {
        set fs $findstring
        if {$findtype == [mc "IgnCase"]} {
            set f [string tolower $f]
            set fs [string tolower $fs]
        }
        set matches {}
        set i 0
        set l [string length $fs]
        while {[set j [string first $fs $f $i]] >= 0} {
            lappend matches [list $j [expr {$j+$l-1}]]
            set i [expr {$j + $l}]
        }
    }
    return $matches
}

proc dofind {{dirn 1} {wrap 1}} {
    global findstring findstartline findcurline selectedline numcommits
    global gdttype filehighlight fh_serial find_dirn findallowwrap

    if {[info exists find_dirn]} {
        if {$find_dirn == $dirn} return
        stopfinding
    }
    focus .
    if {$findstring eq {} || $numcommits == 0} return
    if {$selectedline eq {}} {
        set findstartline [lindex [visiblerows] [expr {$dirn < 0}]]
    } else {
        set findstartline $selectedline
    }
    set findcurline $findstartline
    nowbusy finding [mc "Searching"]
    if {$gdttype ne [mc "containing:"] && ![info exists filehighlight]} {
        after cancel do_file_hl $fh_serial
        do_file_hl $fh_serial
    }
    set find_dirn $dirn
    set findallowwrap $wrap
    run findmore
}

proc stopfinding {} {
    global find_dirn findcurline fprogcoord

    if {[info exists find_dirn]} {
        unset find_dirn
        unset findcurline
        notbusy finding
        set fprogcoord 0
        adjustprogress
    }
    stopblaming
}

proc findmore {} {
    global commitdata commitinfo numcommits findpattern findloc
    global findstartline findcurline findallowwrap
    global find_dirn gdttype fhighlights fprogcoord
    global curview varcorder vrownum varccommits vrowmod

    if {![info exists find_dirn]} {
        return 0
    }
    set fldtypes [list [mc "Headline"] [mc "Author"] "" [mc "Committer"] "" [mc "Comments"]]
    set l $findcurline
    set moretodo 0
    if {$find_dirn > 0} {
        incr l
        if {$l >= $numcommits} {
            set l 0
        }
        if {$l <= $findstartline} {
            set lim [expr {$findstartline + 1}]
        } else {
            set lim $numcommits
            set moretodo $findallowwrap
        }
    } else {
        if {$l == 0} {
            set l $numcommits
        }
        incr l -1
        if {$l >= $findstartline} {
            set lim [expr {$findstartline - 1}]
        } else {
            set lim -1
            set moretodo $findallowwrap
        }
    }
    set n [expr {($lim - $l) * $find_dirn}]
    if {$n > 500} {
        set n 500
        set moretodo 1
    }
    if {$l + ($find_dirn > 0? $n: 1) > $vrowmod($curview)} {
        update_arcrows $curview
    }
    set found 0
    set domore 1
    set ai [bsearch $vrownum($curview) $l]
    set a [lindex $varcorder($curview) $ai]
    set arow [lindex $vrownum($curview) $ai]
    set ids [lindex $varccommits($curview,$a)]
    set arowend [expr {$arow + [llength $ids]}]
    if {$gdttype eq [mc "containing:"]} {
        for {} {$n > 0} {incr n -1; incr l $find_dirn} {
            if {$l < $arow || $l >= $arowend} {
                incr ai $find_dirn
                set a [lindex $varcorder($curview) $ai]
                set arow [lindex $vrownum($curview) $ai]
                set ids [lindex $varccommits($curview,$a)]
                set arowend [expr {$arow + [llength $ids]}]
            }
            set id [lindex $ids [expr {$l - $arow}]]
            # shouldn't happen unless git log doesn't give all the commits...
            if {![info exists commitdata($id)] ||
                ![doesmatch $commitdata($id)]} {
                continue
            }
            if {![info exists commitinfo($id)]} {
                getcommit $id
            }
            set info $commitinfo($id)
            foreach f $info ty $fldtypes {
                if {$ty eq ""} continue
                if {($findloc eq [mc "All fields"] || $findloc eq $ty) &&
                    [doesmatch $f]} {
                    set found 1
                    break
                }
            }
            if {$found} break
        }
    } else {
        for {} {$n > 0} {incr n -1; incr l $find_dirn} {
            if {$l < $arow || $l >= $arowend} {
                incr ai $find_dirn
                set a [lindex $varcorder($curview) $ai]
                set arow [lindex $vrownum($curview) $ai]
                set ids [lindex $varccommits($curview,$a)]
                set arowend [expr {$arow + [llength $ids]}]
            }
            set id [lindex $ids [expr {$l - $arow}]]
            if {![info exists fhighlights($id)]} {
                # this sets fhighlights($id) to -1
                askfilehighlight $l $id
            }
            if {$fhighlights($id) > 0} {
                set found $domore
                break
            }
            if {$fhighlights($id) < 0} {
                if {$domore} {
                    set domore 0
                    set findcurline [expr {$l - $find_dirn}]
                }
            }
        }
    }
    if {$found || ($domore && !$moretodo)} {
        unset findcurline
        unset find_dirn
        notbusy finding
        set fprogcoord 0
        adjustprogress
        if {$found} {
            findselectline $l
        } else {
            bell
        }
        return 0
    }
    if {!$domore} {
        flushhighlights
    } else {
        set findcurline [expr {$l - $find_dirn}]
    }
    set n [expr {($findcurline - $findstartline) * $find_dirn - 1}]
    if {$n < 0} {
        incr n $numcommits
    }
    set fprogcoord [expr {$n * 1.0 / $numcommits}]
    adjustprogress
    return $domore
}

proc findselectline {l} {
    global findloc commentend ctext findcurline markingmatches gdttype

    set markingmatches [expr {$gdttype eq [mc "containing:"]}]
    set findcurline $l
    selectline $l 1
    if {$markingmatches &&
        ($findloc eq [mc "All fields"] || $findloc eq [mc "Comments"])} {
        # highlight the matches in the comments
        set f [$ctext get 1.0 $commentend]
        set matches [findmatches $f]
        foreach match $matches {
            set start [lindex $match 0]
            set end [expr {[lindex $match 1] + 1}]
            $ctext tag add found "1.0 + $start c" "1.0 + $end c"
        }
    }
    drawvisible
}

# mark the bits of a headline or author that match a find string
proc markmatches {canv l str tag matches font row} {
    global selectedline foundbgcolor

    set bbox [$canv bbox $tag]
    set x0 [lindex $bbox 0]
    set y0 [lindex $bbox 1]
    set y1 [lindex $bbox 3]
    foreach match $matches {
        set start [lindex $match 0]
        set end [lindex $match 1]
        if {$start > $end} continue
        set xoff [font measure $font [string range $str 0 [expr {$start-1}]]]
        set xlen [font measure $font [string range $str 0 [expr {$end}]]]
        set t [$canv create rect [expr {$x0+$xoff}] $y0 \
                   [expr {$x0+$xlen+2}] $y1 \
                   -outline {} -tags [list match$l matches] -fill $foundbgcolor]
        $canv lower $t
        if {$row == $selectedline} {
            $canv raise $t secsel
        }
    }
}

proc unmarkmatches {} {
    global markingmatches

    allcanvs delete matches
    set markingmatches 0
    stopfinding
}

proc selcanvline {w x y} {
    global canv canvy0 ctext linespc
    global rowtextx
    set ymax [lindex [$canv cget -scrollregion] 3]
    if {$ymax == {}} return
    set yfrac [lindex [$canv yview] 0]
    set y [expr {$y + $yfrac * $ymax}]
    set l [expr {int(($y - $canvy0) / $linespc + 0.5)}]
    if {$l < 0} {
        set l 0
    }
    if {$w eq $canv} {
        set xmax [lindex [$canv cget -scrollregion] 2]
        set xleft [expr {[lindex [$canv xview] 0] * $xmax}]
        if {![info exists rowtextx($l)] || $xleft + $x < $rowtextx($l)} return
    }
    unmarkmatches
    selectline $l 1
}

proc commit_descriptor {p} {
    global commitinfo
    if {![info exists commitinfo($p)]} {
        getcommit $p
    }
    set l "..."
    if {[llength $commitinfo($p)] > 1} {
        set l [lindex $commitinfo($p) 0]
    }
    return "$p ($l)\n"
}

# append some text to the ctext widget, and make any SHA1 ID
# that we know about be a clickable link.
# Also look for URLs of the form "http[s]://..." and make them web links.
proc appendwithlinks {text tags} {
    global ctext linknum curview
    global hashlength

    set start [$ctext index "end - 1c"]
    $ctext insert end $text $tags
    set links [regexp -indices -all -inline [string map "@@ $hashlength" {(?:\m|-g)[0-9a-f]{6,@@}\M}] $text]
    foreach l $links {
        set s [lindex $l 0]
        set e [lindex $l 1]
        set linkid [string range $text $s $e]
        incr e
        $ctext tag delete link$linknum
        $ctext tag add link$linknum "$start + $s c" "$start + $e c"
        setlink $linkid link$linknum
        incr linknum
    }
    set wlinks [regexp -indices -all -inline -line \
                    {https?://[^[:space:]]+} $text]
    foreach l $wlinks {
        set s2 [lindex $l 0]
        set e2 [lindex $l 1]
        set url [string range $text $s2 $e2]
        incr e2
        $ctext tag delete link$linknum
        $ctext tag add link$linknum "$start + $s2 c" "$start + $e2 c"
        setwlink $url link$linknum
        incr linknum
    }
}

proc setlink {id lk} {
    global curview ctext pendinglinks
    global linkfgcolor
    global hashlength

    if {[string range $id 0 1] eq "-g"} {
      set id [string range $id 2 end]
    }

    set known 0
    if {[string length $id] < $hashlength} {
        set matches [longid $id]
        if {[llength $matches] > 0} {
            if {[llength $matches] > 1} return
            set known 1
            set id [lindex $matches 0]
        }
    } else {
        set known [commitinview $id $curview]
    }
    if {$known} {
        $ctext tag conf $lk -foreground $linkfgcolor -underline 1
        $ctext tag bind $lk <1> [list selbyid $id]
        $ctext tag bind $lk <Enter> {linkcursor %W 1}
        $ctext tag bind $lk <Leave> {linkcursor %W -1}
    } else {
        lappend pendinglinks($id) $lk
        interestedin $id {makelink %P}
    }
}

proc setwlink {url lk} {
    global ctext
    global linkfgcolor
    global web_browser

    if {$web_browser eq {}} return
    $ctext tag conf $lk -foreground $linkfgcolor -underline 1
    $ctext tag bind $lk <1> [list browseweb $url]
    $ctext tag bind $lk <Enter> {linkcursor %W 1}
    $ctext tag bind $lk <Leave> {linkcursor %W -1}
}

proc appendshortlink {id {pre {}} {post {}}} {
    global ctext linknum

    $ctext insert end $pre
    $ctext tag delete link$linknum
    $ctext insert end [string range $id 0 7] link$linknum
    $ctext insert end $post
    setlink $id link$linknum
    incr linknum
}

proc makelink {id} {
    global pendinglinks

    if {![info exists pendinglinks($id)]} return
    foreach lk $pendinglinks($id) {
        setlink $id $lk
    }
    unset pendinglinks($id)
}

proc linkcursor {w inc} {
    global linkentercount curtextcursor

    if {[incr linkentercount $inc] > 0} {
        $w configure -cursor hand2
    } else {
        $w configure -cursor $curtextcursor
        if {$linkentercount < 0} {
            set linkentercount 0
        }
    }
}

proc browseweb {url} {
    global web_browser

    if {$web_browser eq {}} return
    # Use concat here in case $web_browser is a command plus some arguments
    if {[catch {safe_exec_redirect [concat $web_browser [list $url]] [list &]} err]} {
        error_popup "[mc "Error starting web browser:"] $err"
    }
}

proc viewnextline {dir} {
    global canv linespc

    $canv delete hover
    set ymax [lindex [$canv cget -scrollregion] 3]
    set wnow [$canv yview]
    set wtop [expr {[lindex $wnow 0] * $ymax}]
    set newtop [expr {$wtop + $dir * $linespc}]
    if {$newtop < 0} {
        set newtop 0
    } elseif {$newtop > $ymax} {
        set newtop $ymax
    }
    allcanvs yview moveto [expr {$newtop * 1.0 / $ymax}]
}

# add a list of tag or branch names at position pos
# returns the number of names inserted
proc appendrefs {pos ids var} {
    global ctext linknum curview $var maxrefs visiblerefs mainheadid

    if {[catch {$ctext index $pos}]} {
        return 0
    }
    $ctext conf -state normal
    $ctext delete $pos "$pos lineend"
    set tags {}
    foreach id $ids {
        foreach tag [set $var\($id\)] {
            lappend tags [list $tag $id]
        }
    }

    set sep {}
    set tags [lsort -index 0 -decreasing $tags]
    set nutags 0

    if {[llength $tags] > $maxrefs} {
        # If we are displaying heads, and there are too many,
        # see if there are some important heads to display.
        # Currently that are the current head and heads listed in $visiblerefs option
        set itags {}
        if {$var eq "idheads"} {
            set utags {}
            foreach ti $tags {
                set hname [lindex $ti 0]
                set id [lindex $ti 1]
                if {([lsearch -exact $visiblerefs $hname] != -1 || $id eq $mainheadid) &&
                    [llength $itags] < $maxrefs} {
                    lappend itags $ti
                } else {
                    lappend utags $ti
                }
            }
            set tags $utags
        }
        if {$itags ne {}} {
            set str [mc "and many more"]
            set sep " "
        } else {
            set str [mc "many"]
        }
        $ctext insert $pos "$str ([llength $tags])"
        set nutags [llength $tags]
        set tags $itags
    }

    foreach ti $tags {
        set id [lindex $ti 1]
        set lk link$linknum
        incr linknum
        $ctext tag delete $lk
        $ctext insert $pos $sep
        $ctext insert $pos [lindex $ti 0] $lk
        setlink $id $lk
        set sep ", "
    }
    $ctext tag add wwrap "$pos linestart" "$pos lineend"
    $ctext conf -state disabled
    return [expr {[llength $tags] + $nutags}]
}

# called when we have finished computing the nearby tags
proc dispneartags {delay} {
    global selectedline currentid showneartags tagphase

    if {$selectedline eq {} || !$showneartags} return
    after cancel dispnexttag
    if {$delay} {
        after 200 dispnexttag
        set tagphase -1
    } else {
        after idle dispnexttag
        set tagphase 0
    }
}

proc dispnexttag {} {
    global selectedline currentid showneartags tagphase ctext

    if {$selectedline eq {} || !$showneartags} return
    switch -- $tagphase {
        0 {
            set dtags [desctags $currentid]
            if {$dtags ne {}} {
                appendrefs precedes $dtags idtags
            }
        }
        1 {
            set atags [anctags $currentid]
            if {$atags ne {}} {
                appendrefs follows $atags idtags
            }
        }
        2 {
            set dheads [descheads $currentid]
            if {$dheads ne {}} {
                if {[appendrefs branch $dheads idheads] > 1
                    && [$ctext get "branch -3c"] eq "h"} {
                    # turn "Branch" into "Branches"
                    $ctext conf -state normal
                    $ctext insert "branch -2c" "es"
                    $ctext conf -state disabled
                }
            }
        }
    }
    if {[incr tagphase] <= 2} {
        after idle dispnexttag
    }
}

proc make_secsel {id} {
    global linehtag linentag linedtag canv canv2 canv3

    if {![info exists linehtag($id)]} return
    $canv delete secsel
    set t [eval $canv create rect [$canv bbox $linehtag($id)] -outline {{}} \
               -tags secsel -fill [$canv cget -selectbackground]]
    $canv lower $t
    $canv2 delete secsel
    set t [eval $canv2 create rect [$canv2 bbox $linentag($id)] -outline {{}} \
               -tags secsel -fill [$canv2 cget -selectbackground]]
    $canv2 lower $t
    $canv3 delete secsel
    set t [eval $canv3 create rect [$canv3 bbox $linedtag($id)] -outline {{}} \
               -tags secsel -fill [$canv3 cget -selectbackground]]
    $canv3 lower $t
}

proc make_idmark {id} {
    global linehtag canv fgcolor

    if {![info exists linehtag($id)]} return
    $canv delete markid
    set t [eval $canv create rect [$canv bbox $linehtag($id)] \
               -tags markid -outline $fgcolor]
    $canv raise $t
}

proc selectline {l isnew {desired_loc {}} {switch_to_patch 0}} {
    global canv ctext commitinfo selectedline
    global canvy0 linespc parents children curview
    global currentid sha1entry
    global commentend idtags linknum
    global mergemax numcommits pending_select
    global cmitmode showneartags allcommits
    global targetrow targetid lastscrollrows
    global autocopy autoselect autosellen jump_to_here
    global vinlinediff

    unset -nocomplain pending_select
    $canv delete hover
    normalline
    unsel_reflist
    stopfinding
    if {$l < 0 || $l >= $numcommits} return
    set id [commitonrow $l]
    set targetid $id
    set targetrow $l
    set selectedline $l
    set currentid $id
    if {$lastscrollrows < $numcommits} {
        setcanvscroll
    }

    if {$cmitmode ne "patch" && $switch_to_patch} {
        set cmitmode "patch"
    }

    set y [expr {$canvy0 + $l * $linespc}]
    set ymax [lindex [$canv cget -scrollregion] 3]
    set ytop [expr {$y - $linespc - 1}]
    set ybot [expr {$y + $linespc + 1}]
    set wnow [$canv yview]
    set wtop [expr {[lindex $wnow 0] * $ymax}]
    set wbot [expr {[lindex $wnow 1] * $ymax}]
    set wh [expr {$wbot - $wtop}]
    set newtop $wtop
    if {$ytop < $wtop} {
        if {$ybot < $wtop} {
            set newtop [expr {$y - $wh / 2.0}]
        } else {
            set newtop $ytop
            if {$newtop > $wtop - $linespc} {
                set newtop [expr {$wtop - $linespc}]
            }
        }
    } elseif {$ybot > $wbot} {
        if {$ytop > $wbot} {
            set newtop [expr {$y - $wh / 2.0}]
        } else {
            set newtop [expr {$ybot - $wh}]
            if {$newtop < $wtop + $linespc} {
                set newtop [expr {$wtop + $linespc}]
            }
        }
    }
    if {$newtop != $wtop} {
        if {$newtop < 0} {
            set newtop 0
        }
        allcanvs yview moveto [expr {$newtop * 1.0 / $ymax}]
        drawvisible
    }

    make_secsel $id

    if {$isnew} {
        addtohistory [list selbyid $id 0] savecmitpos
    }

    $sha1entry delete 0 end
    $sha1entry insert 0 $id
    if {$autoselect && [haveselectionclipboard]} {
        $sha1entry selection range 0 $autosellen
    }
    if {$autocopy} {
        clipboard clear
        clipboard append [string range $id 0 [expr $autosellen - 1]]
    }
    rhighlight_sel $id

    $ctext conf -state normal
    clear_ctext
    set linknum 0
    if {![info exists commitinfo($id)]} {
        getcommit $id
    }
    set info $commitinfo($id)
    set date [formatdate [lindex $info 2]]
    $ctext insert end "[mc "Author"]: [lindex $info 1]  $date\n"
    set date [formatdate [lindex $info 4]]
    $ctext insert end "[mc "Committer"]: [lindex $info 3]  $date\n"
    if {[info exists idtags($id)]} {
        $ctext insert end [mc "Tags:"]
        foreach tag $idtags($id) {
            $ctext insert end " $tag"
        }
        $ctext insert end "\n"
    }

    set headers {}
    set olds $parents($curview,$id)
    if {[llength $olds] > 1} {
        set np 0
        foreach p $olds {
            if {$np >= $mergemax} {
                set tag mmax
            } else {
                set tag m$np
            }
            $ctext insert end "[mc "Parent"]: " $tag
            appendwithlinks [commit_descriptor $p] {}
            incr np
        }
    } else {
        foreach p $olds {
            append headers "[mc "Parent"]: [commit_descriptor $p]"
        }
    }

    foreach c $children($curview,$id) {
        append headers "[mc "Child"]:  [commit_descriptor $c]"
    }

    # make anything that looks like a SHA1 ID be a clickable link
    appendwithlinks $headers {}
    if {$showneartags} {
        if {![info exists allcommits]} {
            getallcommits
        }
        $ctext insert end "[mc "Branch"]: "
        $ctext mark set branch "end -1c"
        $ctext mark gravity branch left
        $ctext insert end "\n[mc "Follows"]: "
        $ctext mark set follows "end -1c"
        $ctext mark gravity follows left
        $ctext insert end "\n[mc "Precedes"]: "
        $ctext mark set precedes "end -1c"
        $ctext mark gravity precedes left
        $ctext insert end "\n"
        dispneartags 1
    }
    $ctext insert end "\n"
    set comment [lindex $info 5]
    if {[string first "\r" $comment] >= 0} {
        set comment [string map {"\r" "\n    "} $comment]
    }
    appendwithlinks $comment {comment}

    $ctext tag remove found 1.0 end
    $ctext conf -state disabled
    set commentend [$ctext index "end - 1c"]

    set jump_to_here $desired_loc
    init_flist [mc "Comments"]
    if {$cmitmode eq "tree"} {
        gettree $id
    } elseif {$vinlinediff($curview) == 1} {
        showinlinediff $id
    } elseif {[llength $olds] <= 1} {
        startdiff $id
    } else {
        mergediff $id
    }
}

proc selfirstline {} {
    unmarkmatches
    selectline 0 1
}

proc sellastline {} {
    global numcommits
    unmarkmatches
    set l [expr {$numcommits - 1}]
    selectline $l 1
}

proc selnextline {dir} {
    global selectedline
    focus .
    if {$selectedline eq {}} return
    set l [expr {$selectedline + $dir}]
    unmarkmatches
    selectline $l 1
}

proc selnextpage {dir} {
    global canv linespc selectedline numcommits

    set lpp [expr {([winfo height $canv] - 2) / $linespc}]
    if {$lpp < 1} {
        set lpp 1
    }
    allcanvs yview scroll [expr {$dir * $lpp}] units
    drawvisible
    if {$selectedline eq {}} return
    set l [expr {$selectedline + $dir * $lpp}]
    if {$l < 0} {
        set l 0
    } elseif {$l >= $numcommits} {
        set l [expr $numcommits - 1]
    }
    unmarkmatches
    selectline $l 1
}

proc unselectline {} {
    global selectedline currentid

    set selectedline {}
    unset -nocomplain currentid
    allcanvs delete secsel
    rhighlight_none
}

proc reselectline {} {
    global selectedline

    if {$selectedline ne {}} {
        selectline $selectedline 0
    }
}

proc addtohistory {cmd {saveproc {}}} {
    global history historyindex curview

    unset_posvars
    save_position
    set elt [list $curview $cmd $saveproc {}]
    if {$historyindex > 0
        && [lindex $history [expr {$historyindex - 1}]] == $elt} {
        return
    }

    if {$historyindex < [llength $history]} {
        set history [lreplace $history $historyindex end $elt]
    } else {
        lappend history $elt
    }
    incr historyindex
    if {$historyindex > 1} {
        .tf.bar.leftbut conf -state normal
    } else {
        .tf.bar.leftbut conf -state disabled
    }
    .tf.bar.rightbut conf -state disabled
}

# save the scrolling position of the diff display pane
proc save_position {} {
    global historyindex history

    if {$historyindex < 1} return
    set hi [expr {$historyindex - 1}]
    set fn [lindex $history $hi 2]
    if {$fn ne {}} {
        lset history $hi 3 [eval $fn]
    }
}

proc unset_posvars {} {
    global last_posvars

    if {[info exists last_posvars]} {
        foreach {var val} $last_posvars {
            global $var
            unset -nocomplain $var
        }
        unset last_posvars
    }
}

proc godo {elt} {
    global curview last_posvars

    set view [lindex $elt 0]
    set cmd [lindex $elt 1]
    set pv [lindex $elt 3]
    if {$curview != $view} {
        showview $view
    }
    unset_posvars
    foreach {var val} $pv {
        global $var
        set $var $val
    }
    set last_posvars $pv
    eval $cmd
}

proc goback {} {
    global history historyindex
    focus .

    if {$historyindex > 1} {
        save_position
        incr historyindex -1
        godo [lindex $history [expr {$historyindex - 1}]]
        .tf.bar.rightbut conf -state normal
    }
    if {$historyindex <= 1} {
        .tf.bar.leftbut conf -state disabled
    }
}

proc goforw {} {
    global history historyindex
    focus .

    if {$historyindex < [llength $history]} {
        save_position
        set cmd [lindex $history $historyindex]
        incr historyindex
        godo $cmd
        .tf.bar.leftbut conf -state normal
    }
    if {$historyindex >= [llength $history]} {
        .tf.bar.rightbut conf -state disabled
    }
}

proc go_to_parent {i} {
    global parents curview targetid
    set ps $parents($curview,$targetid)
    if {[llength $ps] >= $i} {
        selbyid [lindex $ps [expr $i - 1]]
    }
}

proc gettree {id} {
    global treefilelist treeidlist diffids diffmergeid treepending
    global nullid nullid2

    set diffids $id
    unset -nocomplain diffmergeid
    if {![info exists treefilelist($id)]} {
        if {![info exists treepending]} {
            if {$id eq $nullid} {
                set cmd [list git ls-files]
            } elseif {$id eq $nullid2} {
                set cmd [list git ls-files --stage -t]
            } else {
                set cmd [list git ls-tree -r $id]
            }
            if {[catch {set gtf [safe_open_command $cmd]}]} {
                return
            }
            set treepending $id
            set treefilelist($id) {}
            set treeidlist($id) {}
            fconfigure $gtf -blocking 0 -encoding binary
            filerun $gtf [list gettreeline $gtf $id]
        }
    } else {
        setfilelist $id
    }
}

proc gettreeline {gtf id} {
    global treefilelist treeidlist treepending cmitmode diffids nullid nullid2

    set nl 0
    while {[incr nl] <= 1000 && [gets $gtf line] >= 0} {
        if {$diffids eq $nullid} {
            set fname $line
        } else {
            set i [string first "\t" $line]
            if {$i < 0} continue
            set fname [string range $line [expr {$i+1}] end]
            set line [string range $line 0 [expr {$i-1}]]
            if {$diffids ne $nullid2 && [lindex $line 1] ne "blob"} continue
            set sha1 [lindex $line 2]
            lappend treeidlist($id) $sha1
        }
        if {[string index $fname 0] eq "\""} {
            set fname [lindex $fname 0]
        }
        set fname [encoding convertfrom utf-8 $fname]
        lappend treefilelist($id) $fname
    }
    if {![eof $gtf]} {
        return [expr {$nl >= 1000? 2: 1}]
    }
    close $gtf
    unset treepending
    if {$cmitmode ne "tree"} {
        if {![info exists diffmergeid]} {
            gettreediffs $diffids
        }
    } elseif {$id ne $diffids} {
        gettree $diffids
    } else {
        setfilelist $id
    }
    return 0
}

proc showfile {f} {
    global treefilelist treeidlist diffids nullid nullid2
    global ctext_file_names ctext_file_lines
    global ctext commentend

    set i [lsearch -exact $treefilelist($diffids) $f]
    if {$i < 0} {
        puts "oops, $f not in list for id $diffids"
        return
    }
    if {$diffids eq $nullid} {
        if {[catch {set bf [safe_open_file $f r]} err]} {
            puts "oops, can't read $f: $err"
            return
        }
    } else {
        set blob [lindex $treeidlist($diffids) $i]
        if {[catch {set bf [safe_open_command [concat git cat-file blob $blob]]} err]} {
            puts "oops, error reading blob $blob: $err"
            return
        }
    }
    fconfigure $bf -blocking 0 -encoding [get_path_encoding $f]
    filerun $bf [list getblobline $bf $diffids]
    $ctext config -state normal
    clear_ctext $commentend
    lappend ctext_file_names $f
    lappend ctext_file_lines [lindex [split $commentend "."] 0]
    $ctext insert end "\n"
    $ctext insert end "$f\n" filesep
    $ctext config -state disabled
    $ctext yview $commentend
    settabs 0
}

proc getblobline {bf id} {
    global diffids cmitmode ctext

    if {$id ne $diffids || $cmitmode ne "tree"} {
        catch {close $bf}
        return 0
    }
    $ctext config -state normal
    set nl 0
    while {[incr nl] <= 1000 && [gets $bf line] >= 0} {
        $ctext insert end "$line\n"
    }
    if {[eof $bf]} {
        global jump_to_here ctext_file_names commentend

        # delete last newline
        $ctext delete "end - 2c" "end - 1c"
        close $bf
        if {$jump_to_here ne {} &&
            [lindex $jump_to_here 0] eq [lindex $ctext_file_names 0]} {
            set lnum [expr {[lindex $jump_to_here 1] +
                            [lindex [split $commentend .] 0]}]
            mark_ctext_line $lnum
        }
        $ctext config -state disabled
        return 0
    }
    $ctext config -state disabled
    return [expr {$nl >= 1000? 2: 1}]
}

proc mark_ctext_line {lnum} {
    global ctext markbgcolor

    $ctext tag delete omark
    $ctext tag add omark $lnum.0 "$lnum.0 + 1 line"
    $ctext tag conf omark -background $markbgcolor
    $ctext see $lnum.0
}

proc mergediff {id} {
    global diffmergeid
    global diffids treediffs
    global parents curview

    set diffmergeid $id
    set diffids $id
    set treediffs($id) {}
    set np [llength $parents($curview,$id)]
    settabs $np
    getblobdiffs $id
}

proc startdiff {ids} {
    global treediffs diffids treepending diffmergeid nullid nullid2

    settabs 1
    set diffids $ids
    unset -nocomplain diffmergeid
    if {![info exists treediffs($ids)] ||
        [lsearch -exact $ids $nullid] >= 0 ||
        [lsearch -exact $ids $nullid2] >= 0} {
        if {![info exists treepending]} {
            gettreediffs $ids
        }
    } else {
        addtocflist $ids
    }
}

proc showinlinediff {ids} {
    global commitinfo commitdata ctext
    global treediffs

    set info $commitinfo($ids)
    set diff [lindex $info 7]
    set difflines [split $diff "\n"]

    initblobdiffvars
    set treediff {}

    set inhdr 0
    foreach line $difflines {
        if {![string compare -length 5 "diff " $line]} {
            set inhdr 1
        } elseif {$inhdr && ![string compare -length 4 "+++ " $line]} {
            # offset also accounts for the b/ prefix
            lappend treediff [string range $line 6 end]
            set inhdr 0
        }
    }

    set treediffs($ids) $treediff
    add_flist $treediff

    $ctext conf -state normal
    foreach line $difflines {
        parseblobdiffline $ids $line
    }
    maybe_scroll_ctext 1
    $ctext conf -state disabled
}

# If the filename (name) is under any of the passed filter paths
# then return true to include the file in the listing.
proc path_filter {filter name} {
    set worktree [gitworktree]
    foreach p $filter {
        set fq_p [file normalize $p]
        set fq_n [file normalize [file join $worktree $name]]
        if {[string match [file normalize $fq_p]* $fq_n]} {
            return 1
        }
    }
    return 0
}

proc addtocflist {ids} {
    global treediffs

    add_flist $treediffs($ids)
    getblobdiffs $ids
}

proc diffcmd {ids flags} {
    global log_showroot nullid nullid2

    set i [lsearch -exact $ids $nullid]
    set j [lsearch -exact $ids $nullid2]
    if {$i >= 0} {
        if {[llength $ids] > 1 && $j < 0} {
            # comparing working directory with some specific revision
            set cmd [concat git diff-index $flags]
            if {$i == 0} {
                lappend cmd -R [lindex $ids 1]
            } else {
                lappend cmd [lindex $ids 0]
            }
        } else {
            # comparing working directory with index
            set cmd [concat git diff-files $flags]
            if {$j == 1} {
                lappend cmd -R
            }
        }
    } elseif {$j >= 0} {
        set flags "$flags --ignore-submodules=dirty"
        set cmd [concat git diff-index --cached $flags]
        if {[llength $ids] > 1} {
            # comparing index with specific revision
            if {$j == 0} {
                lappend cmd -R [lindex $ids 1]
            } else {
                lappend cmd [lindex $ids 0]
            }
        } else {
            # comparing index with HEAD
            lappend cmd HEAD
        }
    } else {
        if {$log_showroot} {
            lappend flags --root
        }
        set cmd [concat git diff-tree -r $flags $ids]
    }
    return $cmd
}

proc gettreediffs {ids} {
    global treediff treepending limitdiffs vfilelimit curview

    set cmd [diffcmd $ids {--no-commit-id}]
    if {$limitdiffs && $vfilelimit($curview) ne {}} {
            set cmd [concat $cmd -- $vfilelimit($curview)]
    }
    if {[catch {set gdtf [safe_open_command $cmd]}]} return

    set treepending $ids
    set treediff {}
    fconfigure $gdtf -blocking 0 -encoding binary
    filerun $gdtf [list gettreediffline $gdtf $ids]
}

proc gettreediffline {gdtf ids} {
    global treediff treediffs treepending diffids diffmergeid
    global cmitmode vfilelimit curview limitdiffs perfile_attrs

    set nr 0
    set sublist {}
    set max 1000
    if {$perfile_attrs} {
        # cache_gitattr is slow, and even slower on win32 where we
        # have to invoke it for only about 30 paths at a time
        set max 500
        if {[tk windowingsystem] == "win32"} {
            set max 120
        }
    }
    while {[incr nr] <= $max && [gets $gdtf line] >= 0} {
        set i [string first "\t" $line]
        if {$i >= 0} {
            set file [string range $line [expr {$i+1}] end]
            if {[string index $file 0] eq "\""} {
                set file [lindex $file 0]
            }
            set file [encoding convertfrom utf-8 $file]
            if {$file ne [lindex $treediff end]} {
                lappend treediff $file
                lappend sublist $file
            }
        }
    }
    if {$perfile_attrs} {
        cache_gitattr encoding $sublist
    }
    if {![eof $gdtf]} {
        return [expr {$nr >= $max? 2: 1}]
    }
    close $gdtf
    set treediffs($ids) $treediff
    unset treepending
    if {$cmitmode eq "tree" && [llength $diffids] == 1} {
        gettree $diffids
    } elseif {$ids != $diffids} {
        if {![info exists diffmergeid]} {
            gettreediffs $diffids
        }
    } else {
        addtocflist $ids
    }
    return 0
}

# empty string or positive integer
proc diffcontextvalidate {v} {
    return [regexp {^(|[1-9][0-9]*)$} $v]
}

proc diffcontextchange {n1 n2 op} {
    global diffcontextstring diffcontext

    if {[string is integer -strict $diffcontextstring]} {
        if {$diffcontextstring >= 0} {
            set diffcontext $diffcontextstring
            reselectline
        }
    }
}

proc changeignorespace {} {
    reselectline
}

proc changeworddiff {name ix op} {
    reselectline
}

proc initblobdiffvars {} {
    global diffencoding targetline diffnparents
    global diffinhdr currdiffsubmod diffseehere
    set targetline {}
    set diffnparents 0
    set diffinhdr 0
    set diffencoding [get_path_encoding {}]
    set currdiffsubmod ""
    set diffseehere -1
}

proc getblobdiffs {ids} {
    global blobdifffd diffids env
    global treediffs
    global diffcontext
    global ignorespace
    global worddiff
    global limitdiffs vfilelimit curview

    set cmd [diffcmd $ids "-p --textconv --submodule -C --cc --no-commit-id -U$diffcontext"]
    if {$ignorespace} {
        append cmd " -w"
    }
    if {$worddiff ne [mc "Line diff"]} {
        append cmd " --word-diff=porcelain"
    }
    if {$limitdiffs && $vfilelimit($curview) ne {}} {
        set cmd [concat $cmd -- $vfilelimit($curview)]
    }
    if {[catch {set bdf [safe_open_command $cmd]} err]} {
        error_popup [mc "Error getting diffs: %s" $err]
        return
    }
    fconfigure $bdf -blocking 0 -encoding binary -eofchar {}
    set blobdifffd($ids) $bdf
    initblobdiffvars
    filerun $bdf [list getblobdiffline $bdf $diffids]
}

proc savecmitpos {} {
    global ctext cmitmode

    if {$cmitmode eq "tree"} {
        return {}
    }
    return [list target_scrollpos [$ctext index @0,0]]
}

proc savectextpos {} {
    global ctext

    return [list target_scrollpos [$ctext index @0,0]]
}

proc maybe_scroll_ctext {ateof} {
    global ctext target_scrollpos

    if {![info exists target_scrollpos]} return
    if {!$ateof} {
        set nlines [expr {[winfo height $ctext]
                          / [font metrics textfont -linespace]}]
        if {[$ctext compare "$target_scrollpos + $nlines lines" <= end]} return
    }
    $ctext yview $target_scrollpos
    unset target_scrollpos
}

proc setinlist {var i val} {
    global $var

    while {[llength [set $var]] < $i} {
        lappend $var {}
    }
    if {[llength [set $var]] == $i} {
        lappend $var $val
    } else {
        lset $var $i $val
    }
}

proc makediffhdr {fname ids} {
    global ctext curdiffstart treediffs diffencoding
    global ctext_file_names jump_to_here targetline diffline

    set fname [encoding convertfrom utf-8 $fname]
    set diffencoding [get_path_encoding $fname]
    set i [lsearch -exact $treediffs($ids) $fname]
    if {$i >= 0} {
        setinlist difffilestart $i $curdiffstart
    }
    lset ctext_file_names end $fname
    set l [expr {(78 - [string length $fname]) / 2}]
    set pad [string range "----------------------------------------" 1 $l]
    $ctext insert $curdiffstart "$pad $fname $pad" filesep
    set targetline {}
    if {$jump_to_here ne {} && [lindex $jump_to_here 0] eq $fname} {
        set targetline [lindex $jump_to_here 1]
    }
    set diffline 0
}

proc blobdiffmaybeseehere {ateof} {
    global diffseehere
    if {$diffseehere >= 0} {
        mark_ctext_line [lindex [split $diffseehere .] 0]
    }
    maybe_scroll_ctext $ateof
}

proc getblobdiffline {bdf ids} {
    global diffids blobdifffd
    global ctext

    set nr 0
    $ctext conf -state normal
    while {[incr nr] <= 1000 && [gets $bdf line] >= 0} {
        if {$ids != $diffids || $bdf != $blobdifffd($ids)} {
            # Older diff read. Abort it.
            catch {close $bdf}
            if {$ids != $diffids} {
                array unset blobdifffd $ids
            }
            return 0
        }
        parseblobdiffline $ids $line
    }
    $ctext conf -state disabled
    blobdiffmaybeseehere [eof $bdf]
    if {[eof $bdf]} {
        catch {close $bdf}
        array unset blobdifffd $ids
        return 0
    }
    return [expr {$nr >= 1000? 2: 1}]
}

proc parseblobdiffline {ids line} {
    global ctext curdiffstart
    global diffnexthead diffnextnote difffilestart
    global ctext_file_names ctext_file_lines
    global diffinhdr treediffs mergemax diffnparents
    global diffencoding jump_to_here targetline diffline currdiffsubmod
    global worddiff diffseehere

    if {![string compare -length 5 "diff " $line]} {
        if {![regexp {^diff (--cc|--git) } $line m type]} {
            set line [encoding convertfrom utf-8 $line]
            $ctext insert end "$line\n" hunksep
            continue
        }
        # start of a new file
        set diffinhdr 1
        set currdiffsubmod ""

        $ctext insert end "\n"
        set curdiffstart [$ctext index "end - 1c"]
        lappend ctext_file_names ""
        lappend ctext_file_lines [lindex [split $curdiffstart "."] 0]
        $ctext insert end "\n" filesep

        if {$type eq "--cc"} {
            # start of a new file in a merge diff
            set fname [string range $line 10 end]
            if {[lsearch -exact $treediffs($ids) $fname] < 0} {
                lappend treediffs($ids) $fname
                add_flist [list $fname]
            }

        } else {
            set line [string range $line 11 end]
            # If the name hasn't changed the length will be odd,
            # the middle char will be a space, and the two bits either
            # side will be a/name and b/name, or "a/name" and "b/name".
            # If the name has changed we'll get "rename from" and
            # "rename to" or "copy from" and "copy to" lines following
            # this, and we'll use them to get the filenames.
            # This complexity is necessary because spaces in the
            # filename(s) don't get escaped.
            set l [string length $line]
            set i [expr {$l / 2}]
            if {!(($l & 1) && [string index $line $i] eq " " &&
                  [string range $line 2 [expr {$i - 1}]] eq \
                      [string range $line [expr {$i + 3}] end])} {
                return
            }
            # unescape if quoted and chop off the a/ from the front
            if {[string index $line 0] eq "\""} {
                set fname [string range [lindex $line 0] 2 end]
            } else {
                set fname [string range $line 2 [expr {$i - 1}]]
            }
        }
        makediffhdr $fname $ids

    } elseif {![string compare -length 16 "* Unmerged path " $line]} {
        set fname [encoding convertfrom utf-8 [string range $line 16 end]]
        $ctext insert end "\n"
        set curdiffstart [$ctext index "end - 1c"]
        lappend ctext_file_names $fname
        lappend ctext_file_lines [lindex [split $curdiffstart "."] 0]
        $ctext insert end "$line\n" filesep
        set i [lsearch -exact $treediffs($ids) $fname]
        if {$i >= 0} {
            setinlist difffilestart $i $curdiffstart
        }

    } elseif {![string compare -length 2 "@@" $line]} {
        regexp {^@@+} $line ats
        set line [encoding convertfrom $diffencoding $line]
        $ctext insert end "$line\n" hunksep
        if {[regexp { \+(\d+),\d+ @@} $line m nl]} {
            set diffline $nl
        }
        set diffnparents [expr {[string length $ats] - 1}]
        set diffinhdr 0

    } elseif {![string compare -length 10 "Submodule " $line]} {
        # start of a new submodule
        if {[regexp -indices "\[0-9a-f\]+\\.\\." $line nameend]} {
            set fname [string range $line 10 [expr [lindex $nameend 0] - 2]]
        } else {
            set fname [string range $line 10 [expr [string first "contains " $line] - 2]]
        }
        if {$currdiffsubmod != $fname} {
            $ctext insert end "\n";     # Add newline after commit message
        }
        if {$currdiffsubmod != $fname} {
            set curdiffstart [$ctext index "end - 1c"]
            lappend ctext_file_names ""
            lappend ctext_file_lines [lindex [split $curdiffstart "."] 0]
            makediffhdr $fname $ids
            set currdiffsubmod $fname
            $ctext insert end "\n$line\n" filesep
        } else {
            $ctext insert end "$line\n" filesep
        }
    } elseif {$currdiffsubmod != "" && ![string compare -length 3 "  >" $line]} {
        set line [encoding convertfrom $diffencoding $line]
        $ctext insert end "$line\n" dresult
    } elseif {$currdiffsubmod != "" && ![string compare -length 3 "  <" $line]} {
        set line [encoding convertfrom $diffencoding $line]
        $ctext insert end "$line\n" d0
    } elseif {$diffinhdr} {
        if {![string compare -length 12 "rename from " $line]} {
            set fname [string range $line [expr 6 + [string first " from " $line] ] end]
            if {[string index $fname 0] eq "\""} {
                set fname [lindex $fname 0]
            }
            set fname [encoding convertfrom utf-8 $fname]
            set i [lsearch -exact $treediffs($ids) $fname]
            if {$i >= 0} {
                setinlist difffilestart $i $curdiffstart
            }
        } elseif {![string compare -length 10 $line "rename to "] ||
                  ![string compare -length 8 $line "copy to "]} {
            set fname [string range $line [expr 4 + [string first " to " $line] ] end]
            if {[string index $fname 0] eq "\""} {
                set fname [lindex $fname 0]
            }
            makediffhdr $fname $ids
        } elseif {[string compare -length 3 $line "---"] == 0} {
            # do nothing
            return
        } elseif {[string compare -length 3 $line "+++"] == 0} {
            set diffinhdr 0
            return
        }
        set line [encoding convertfrom utf-8 $line]
        $ctext insert end "$line\n" filesep

    } else {
        set line [string map {\x1A ^Z} \
                      [encoding convertfrom $diffencoding $line]]
        # parse the prefix - one ' ', '-' or '+' for each parent
        set prefix [string range $line 0 [expr {$diffnparents - 1}]]
        set tag [expr {$diffnparents > 1? "m": "d"}]
        set dowords [expr {$worddiff ne [mc "Line diff"] && $diffnparents == 1}]
        set words_pre_markup ""
        set words_post_markup ""
        if {[string trim $prefix " -+"] eq {}} {
            # prefix only has " ", "-" and "+" in it: normal diff line
            set num [string first "-" $prefix]
            if {$dowords} {
                set line [string range $line 1 end]
            }
            if {$num >= 0} {
                # removed line, first parent with line is $num
                if {$num >= $mergemax} {
                    set num "max"
                }
                if {$dowords && $worddiff eq [mc "Markup words"]} {
                    $ctext insert end "\[-$line-\]" $tag$num
                } else {
                    $ctext insert end "$line" $tag$num
                }
                if {!$dowords} {
                    $ctext insert end "\n" $tag$num
                }
            } else {
                set tags {}
                if {[string first "+" $prefix] >= 0} {
                    # added line
                    lappend tags ${tag}result
                    if {$diffnparents > 1} {
                        set num [string first " " $prefix]
                        if {$num >= 0} {
                            if {$num >= $mergemax} {
                                set num "max"
                            }
                            lappend tags m$num
                        }
                    }
                    set words_pre_markup "{+"
                    set words_post_markup "+}"
                }
                if {$targetline ne {}} {
                    if {$diffline == $targetline} {
                        set diffseehere [$ctext index "end - 1 chars"]
                        set targetline {}
                    } else {
                        incr diffline
                    }
                }
                if {$dowords && $worddiff eq [mc "Markup words"]} {
                    $ctext insert end "$words_pre_markup$line$words_post_markup" $tags
                } else {
                    $ctext insert end "$line" $tags
                }
                if {!$dowords} {
                    $ctext insert end "\n" $tags
                }
            }
        } elseif {$dowords && $prefix eq "~"} {
            $ctext insert end "\n" {}
        } else {
            # "\ No newline at end of file",
            # or something else we don't recognize
            $ctext insert end "$line\n" hunksep
        }
    }
}

proc changediffdisp {} {
    global ctext diffelide

    $ctext tag conf d0 -elide [lindex $diffelide 0]
    $ctext tag conf dresult -elide [lindex $diffelide 1]
}

proc highlightfile {cline} {
    global cflist cflist_top

    if {![info exists cflist_top]} return

    $cflist tag remove highlight $cflist_top.0 "$cflist_top.0 lineend"
    $cflist tag add highlight $cline.0 "$cline.0 lineend"
    $cflist see $cline.0
    set cflist_top $cline
}

proc highlightfile_for_scrollpos {topidx} {
    global cmitmode difffilestart

    if {$cmitmode eq "tree"} return
    if {![info exists difffilestart]} return

    set top [lindex [split $topidx .] 0]
    if {$difffilestart eq {} || $top < [lindex $difffilestart 0]} {
        highlightfile 0
    } else {
        highlightfile [expr {[bsearch $difffilestart $top] + 2}]
    }
}

proc prevfile {} {
    global difffilestart ctext cmitmode

    if {$cmitmode eq "tree"} return
    set prev 0.0
    set here [$ctext index @0,0]
    foreach loc $difffilestart {
        if {[$ctext compare $loc >= $here]} {
            $ctext yview $prev
            return
        }
        set prev $loc
    }
    $ctext yview $prev
}

proc nextfile {} {
    global difffilestart ctext cmitmode

    if {$cmitmode eq "tree"} return
    set here [$ctext index @0,0]
    foreach loc $difffilestart {
        if {[$ctext compare $loc > $here]} {
            $ctext yview $loc
            return
        }
    }
}

proc clear_ctext {{first 1.0}} {
    global ctext smarktop smarkbot
    global ctext_file_names ctext_file_lines
    global pendinglinks

    set l [lindex [split $first .] 0]
    if {![info exists smarktop] || [$ctext compare $first < $smarktop.0]} {
        set smarktop $l
    }
    if {![info exists smarkbot] || [$ctext compare $first < $smarkbot.0]} {
        set smarkbot $l
    }
    $ctext delete $first end
    if {$first eq "1.0"} {
        unset -nocomplain pendinglinks
    }
    set ctext_file_names {}
    set ctext_file_lines {}
}

proc settabs {{firstab {}}} {
    global firsttabstop tabstop ctext

    if {$firstab ne {}} {
        set firsttabstop $firstab
    }
    set w [font measure textfont "0"]
    if {$firsttabstop != 0} {
        $ctext conf -tabs [list [expr {($firsttabstop + $tabstop) * $w}] \
                               [expr {($firsttabstop + 2 * $tabstop) * $w}]]
    } else {
        $ctext conf -tabs [expr {$tabstop * $w}]
    }
}

proc incrsearch {name ix op} {
    global ctext searchstring searchdirn

    if {[catch {$ctext index anchor}]} {
        # no anchor set, use start of selection, or of visible area
        set sel [$ctext tag ranges sel]
        if {$sel ne {}} {
            $ctext mark set anchor [lindex $sel 0]
        } elseif {$searchdirn eq "-forwards"} {
            $ctext mark set anchor @0,0
        } else {
            $ctext mark set anchor @0,[winfo height $ctext]
        }
    }
    if {$searchstring ne {}} {
        set here [$ctext search -count mlen $searchdirn -- $searchstring anchor]
        if {$here ne {}} {
            $ctext see $here
            set mend "$here + $mlen c"
            $ctext tag remove sel 1.0 end
            $ctext tag add sel $here $mend
            suppress_highlighting_file_for_current_scrollpos
            highlightfile_for_scrollpos $here
        }
    }
    rehighlight_search_results
}

proc dosearch {} {
    global sstring ctext searchstring searchdirn

    focus $sstring
    $sstring icursor end
    set searchdirn -forwards
    if {$searchstring ne {}} {
        set sel [$ctext tag ranges sel]
        if {$sel ne {}} {
            set start "[lindex $sel 0] + 1c"
        } elseif {[catch {set start [$ctext index anchor]}]} {
            set start "@0,0"
        }
        set match [$ctext search -count mlen -- $searchstring $start]
        $ctext tag remove sel 1.0 end
        if {$match eq {}} {
            bell
            return
        }
        $ctext see $match
        suppress_highlighting_file_for_current_scrollpos
        highlightfile_for_scrollpos $match
        set mend "$match + $mlen c"
        $ctext tag add sel $match $mend
        $ctext mark unset anchor
        rehighlight_search_results
    }
}

proc dosearchback {} {
    global sstring ctext searchstring searchdirn

    focus $sstring
    $sstring icursor end
    set searchdirn -backwards
    if {$searchstring ne {}} {
        set sel [$ctext tag ranges sel]
        if {$sel ne {}} {
            set start [lindex $sel 0]
        } elseif {[catch {set start [$ctext index anchor]}]} {
            set start @0,[winfo height $ctext]
        }
        set match [$ctext search -backwards -count ml -- $searchstring $start]
        $ctext tag remove sel 1.0 end
        if {$match eq {}} {
            bell
            return
        }
        $ctext see $match
        suppress_highlighting_file_for_current_scrollpos
        highlightfile_for_scrollpos $match
        set mend "$match + $ml c"
        $ctext tag add sel $match $mend
        $ctext mark unset anchor
        rehighlight_search_results
    }
}

proc rehighlight_search_results {} {
    global ctext searchstring

    $ctext tag remove found 1.0 end
    $ctext tag remove currentsearchhit 1.0 end

    if {$searchstring ne {}} {
        searchmarkvisible 1
    }
}

proc searchmark {first last} {
    global ctext searchstring

    set sel [$ctext tag ranges sel]

    set mend $first.0
    while {1} {
        set match [$ctext search -count mlen -- $searchstring $mend $last.end]
        if {$match eq {}} break
        set mend "$match + $mlen c"
        if {$sel ne {} && [$ctext compare $match == [lindex $sel 0]]} {
            $ctext tag add currentsearchhit $match $mend
        } else {
            $ctext tag add found $match $mend
        }
    }
}

proc searchmarkvisible {doall} {
    global ctext smarktop smarkbot

    set topline [lindex [split [$ctext index @0,0] .] 0]
    set botline [lindex [split [$ctext index @0,[winfo height $ctext]] .] 0]
    if {$doall || $botline < $smarktop || $topline > $smarkbot} {
        # no overlap with previous
        searchmark $topline $botline
        set smarktop $topline
        set smarkbot $botline
    } else {
        if {$topline < $smarktop} {
            searchmark $topline [expr {$smarktop-1}]
            set smarktop $topline
        }
        if {$botline > $smarkbot} {
            searchmark [expr {$smarkbot+1}] $botline
            set smarkbot $botline
        }
    }
}

proc suppress_highlighting_file_for_current_scrollpos {} {
    global ctext suppress_highlighting_file_for_this_scrollpos

    set suppress_highlighting_file_for_this_scrollpos [$ctext index @0,0]
}

proc scrolltext {f0 f1} {
    global searchstring cmitmode ctext
    global suppress_highlighting_file_for_this_scrollpos

    set topidx [$ctext index @0,0]
    if {![info exists suppress_highlighting_file_for_this_scrollpos]
        || $topidx ne $suppress_highlighting_file_for_this_scrollpos} {
        highlightfile_for_scrollpos $topidx
    }

    unset -nocomplain suppress_highlighting_file_for_this_scrollpos

    .bleft.bottom.sb set $f0 $f1
    if {$searchstring ne {}} {
        searchmarkvisible 0
    }
}

proc setcoords {} {
    global linespc charspc canvx0 canvy0
    global xspc1 xspc2 lthickness

    set linespc [font metrics mainfont -linespace]
    set charspc [font measure mainfont "m"]
    set canvy0 [expr {int(3 + 0.5 * $linespc)}]
    set canvx0 [expr {int(3 + 0.5 * $linespc)}]
    set lthickness [expr {int($linespc / 9) + 1}]
    set xspc1(0) $linespc
    set xspc2 $linespc
}

proc redisplay {} {
    global canv
    global selectedline

    set ymax [lindex [$canv cget -scrollregion] 3]
    if {$ymax eq {} || $ymax == 0} return
    set span [$canv yview]
    clear_display
    setcanvscroll
    allcanvs yview moveto [lindex $span 0]
    drawvisible
    if {$selectedline ne {}} {
        selectline $selectedline 0
        allcanvs yview moveto [lindex $span 0]
    }
}

proc parsefont {f n} {
    global fontattr

    set fontattr($f,family) [lindex $n 0]
    set s [lindex $n 1]
    if {$s eq {} || $s == 0} {
        set s 10
    } elseif {$s < 0} {
        set s [expr {int(-$s / [winfo fpixels . 1p] + 0.5)}]
    }
    set fontattr($f,size) $s
    set fontattr($f,weight) normal
    set fontattr($f,slant) roman
    foreach style [lrange $n 2 end] {
        switch -- $style {
            "normal" -
            "bold"   {set fontattr($f,weight) $style}
            "roman" -
            "italic" {set fontattr($f,slant) $style}
        }
    }
}

proc fontflags {f {isbold 0}} {
    global fontattr

    return [list -family $fontattr($f,family) -size $fontattr($f,size) \
                -weight [expr {$isbold? "bold": $fontattr($f,weight)}] \
                -slant $fontattr($f,slant)]
}

proc fontname {f} {
    global fontattr

    set n [list $fontattr($f,family) $fontattr($f,size)]
    if {$fontattr($f,weight) eq "bold"} {
        lappend n "bold"
    }
    if {$fontattr($f,slant) eq "italic"} {
        lappend n "italic"
    }
    return $n
}

proc incrfont {inc} {
    global mainfont textfont ctext canv cflist showrefstop
    global stopped entries fontattr

    unmarkmatches
    set s $fontattr(mainfont,size)
    incr s $inc
    if {$s < 1} {
        set s 1
    }
    set fontattr(mainfont,size) $s
    font config mainfont -size $s
    font config mainfontbold -size $s
    set mainfont [fontname mainfont]
    set s $fontattr(textfont,size)
    incr s $inc
    if {$s < 1} {
        set s 1
    }
    set fontattr(textfont,size) $s
    font config textfont -size $s
    font config textfontbold -size $s
    set textfont [fontname textfont]
    setcoords
    settabs
    redisplay
}

proc clearsha1 {} {
    global sha1entry sha1string
    global hashlength

    if {[string length $sha1string] == $hashlength} {
        $sha1entry delete 0 end
    }
}

proc sha1change {n1 n2 op} {
    global sha1string currentid sha1but

    if {$sha1string == {}
        || ([info exists currentid] && $sha1string == $currentid)} {
        set state disabled
    } else {
        set state normal
    }
    if {[$sha1but cget -state] == $state} return
    if {$state == "normal"} {
        $sha1but conf -state normal -relief raised -text "[mc "Goto:"] "
    } else {
        $sha1but conf -state disabled -relief flat -text "[mc "Commit ID:"] "
    }
}

proc gotocommit {} {
    global sha1string tagids headids curview varcid
    global hashlength

    if {$sha1string == {}
        || ([info exists currentid] && $sha1string == $currentid)} return
    if {[info exists tagids($sha1string)]} {
        set id $tagids($sha1string)
    } elseif {[info exists headids($sha1string)]} {
        set id $headids($sha1string)
    } else {
        set id [string tolower $sha1string]
        if {[regexp {^[0-9a-f]{4,63}$} $id]} {
            set matches [longid $id]
            if {$matches ne {}} {
                if {[llength $matches] > 1} {
                    error_popup [mc "Short commit ID %s is ambiguous" $id]
                    return
                }
                set id [lindex $matches 0]
            }
        } else {
            if {[catch {set id [safe_exec [list git rev-parse --verify $sha1string]]}]} {
                error_popup [mc "Revision %s is not known" $sha1string]
                return
            }
        }
    }
    if {[commitinview $id $curview]} {
        selectline [rowofcommit $id] 1
        return
    }
    if {[regexp {^[0-9a-fA-F]{4,}$} $sha1string]} {
        set msg [mc "Commit ID %s is not known" $sha1string]
    } else {
        set msg [mc "Revision %s is not in the current view" $sha1string]
    }
    error_popup $msg
}

proc lineenter {x y id} {
    global hoverx hovery hoverid hovertimer
    global commitinfo canv

    if {![info exists commitinfo($id)] && ![getcommit $id]} return
    set hoverx $x
    set hovery $y
    set hoverid $id
    if {[info exists hovertimer]} {
        after cancel $hovertimer
    }
    set hovertimer [after 500 linehover]
    $canv delete hover
}

proc linemotion {x y id} {
    global hoverx hovery hoverid hovertimer

    if {[info exists hoverid] && $id == $hoverid} {
        set hoverx $x
        set hovery $y
        if {[info exists hovertimer]} {
            after cancel $hovertimer
        }
        set hovertimer [after 500 linehover]
    }
}

proc lineleave {id} {
    global hoverid hovertimer canv

    if {[info exists hoverid] && $id == $hoverid} {
        $canv delete hover
        if {[info exists hovertimer]} {
            after cancel $hovertimer
            unset hovertimer
        }
        unset hoverid
    }
}

proc linehover {} {
    global hoverx hovery hoverid hovertimer
    global canv linespc lthickness
    global linehoverbgcolor linehoverfgcolor linehoveroutlinecolor

    global commitinfo

    set text [lindex $commitinfo($hoverid) 0]
    set ymax [lindex [$canv cget -scrollregion] 3]
    if {$ymax == {}} return
    set yfrac [lindex [$canv yview] 0]
    set x [expr {$hoverx + 2 * $linespc}]
    set y [expr {$hovery + $yfrac * $ymax - $linespc / 2}]
    set x0 [expr {$x - 2 * $lthickness}]
    set y0 [expr {$y - 2 * $lthickness}]
    set x1 [expr {$x + [font measure mainfont $text] + 2 * $lthickness}]
    set y1 [expr {$y + $linespc + 2 * $lthickness}]
    set t [$canv create rectangle $x0 $y0 $x1 $y1 \
               -fill $linehoverbgcolor -outline $linehoveroutlinecolor \
               -width 1 -tags hover]
    $canv raise $t
    set t [$canv create text $x $y -anchor nw -text $text -tags hover \
               -font mainfont -fill $linehoverfgcolor]
    $canv raise $t
}

proc clickisonarrow {id y} {
    global lthickness

    set ranges [rowranges $id]
    set thresh [expr {2 * $lthickness + 6}]
    set n [expr {[llength $ranges] - 1}]
    for {set i 1} {$i < $n} {incr i} {
        set row [lindex $ranges $i]
        if {abs([yc $row] - $y) < $thresh} {
            return $i
        }
    }
    return {}
}

proc arrowjump {id n y} {
    global canv

    # 1 <-> 2, 3 <-> 4, etc...
    set n [expr {(($n - 1) ^ 1) + 1}]
    set row [lindex [rowranges $id] $n]
    set yt [yc $row]
    set ymax [lindex [$canv cget -scrollregion] 3]
    if {$ymax eq {} || $ymax <= 0} return
    set view [$canv yview]
    set yspan [expr {[lindex $view 1] - [lindex $view 0]}]
    set yfrac [expr {$yt / $ymax - $yspan / 2}]
    if {$yfrac < 0} {
        set yfrac 0
    }
    allcanvs yview moveto $yfrac
}

proc lineclick {x y id isnew} {
    global ctext commitinfo children canv thickerline curview

    if {![info exists commitinfo($id)] && ![getcommit $id]} return
    unmarkmatches
    unselectline
    normalline
    $canv delete hover
    # draw this line thicker than normal
    set thickerline $id
    drawlines $id
    if {$isnew} {
        set ymax [lindex [$canv cget -scrollregion] 3]
        if {$ymax eq {}} return
        set yfrac [lindex [$canv yview] 0]
        set y [expr {$y + $yfrac * $ymax}]
    }
    set dirn [clickisonarrow $id $y]
    if {$dirn ne {}} {
        arrowjump $id $dirn $y
        return
    }

    if {$isnew} {
        addtohistory [list lineclick $x $y $id 0] savectextpos
    }
    # fill the details pane with info about this line
    $ctext conf -state normal
    clear_ctext
    settabs 0
    $ctext insert end "[mc "Parent"]:\t"
    $ctext insert end $id link0
    setlink $id link0
    set info $commitinfo($id)
    $ctext insert end "\n\t[lindex $info 0]\n"
    $ctext insert end "\t[mc "Author"]:\t[lindex $info 1]\n"
    set date [formatdate [lindex $info 2]]
    $ctext insert end "\t[mc "Date"]:\t$date\n"
    set kids $children($curview,$id)
    if {$kids ne {}} {
        $ctext insert end "\n[mc "Children"]:"
        set i 0
        foreach child $kids {
            incr i
            if {![info exists commitinfo($child)] && ![getcommit $child]} continue
            set info $commitinfo($child)
            $ctext insert end "\n\t"
            $ctext insert end $child link$i
            setlink $child link$i
            $ctext insert end "\n\t[lindex $info 0]"
            $ctext insert end "\n\t[mc "Author"]:\t[lindex $info 1]"
            set date [formatdate [lindex $info 2]]
            $ctext insert end "\n\t[mc "Date"]:\t$date\n"
        }
    }
    maybe_scroll_ctext 1
    $ctext conf -state disabled
    init_flist {}
}

proc normalline {} {
    global thickerline
    if {[info exists thickerline]} {
        set id $thickerline
        unset thickerline
        drawlines $id
    }
}

proc selbyid {id {isnew 1}} {
    global curview
    if {[commitinview $id $curview]} {
        selectline [rowofcommit $id] $isnew
    }
}

proc mstime {} {
    global startmstime
    if {![info exists startmstime]} {
        set startmstime [clock clicks -milliseconds]
    }
    return [format "%.3f" [expr {([clock click -milliseconds] - $startmstime) / 1000.0}]]
}

proc rowmenu {x y id} {
    global rowctxmenu selectedline rowmenuid curview
    global nullid nullid2 fakerowmenu mainhead markedid

    stopfinding
    set rowmenuid $id
    if {$selectedline eq {} || [rowofcommit $id] eq $selectedline} {
        set state disabled
    } else {
        set state normal
    }
    if {[info exists markedid] && $markedid ne $id} {
        set mstate normal
    } else {
        set mstate disabled
    }
    if {$id ne $nullid && $id ne $nullid2} {
        set menu $rowctxmenu
        if {$mainhead ne {}} {
            $menu entryconfigure 8 -label [mc "Reset %s branch to here" $mainhead] -state normal
        } else {
            $menu entryconfigure 8 -label [mc "Detached head: can't reset" $mainhead] -state disabled
        }
        $menu entryconfigure 10 -state $mstate
        $menu entryconfigure 11 -state $mstate
        $menu entryconfigure 12 -state $mstate
    } else {
        set menu $fakerowmenu
    }
    $menu entryconfigure [mca "Diff this -> selected"] -state $state
    $menu entryconfigure [mca "Diff selected -> this"] -state $state
    $menu entryconfigure [mca "Make patch"] -state $state
    $menu entryconfigure [mca "Diff this -> marked commit"] -state $mstate
    $menu entryconfigure [mca "Diff marked commit -> this"] -state $mstate
    tk_popup $menu $x $y
}

proc markhere {} {
    global rowmenuid markedid canv

    set markedid $rowmenuid
    make_idmark $markedid
}

proc gotomark {} {
    global markedid

    if {[info exists markedid]} {
        selbyid $markedid
    }
}

proc replace_by_kids {l r} {
    global curview children

    set id [commitonrow $r]
    set l [lreplace $l 0 0]
    foreach kid $children($curview,$id) {
        lappend l [rowofcommit $kid]
    }
    return [lsort -integer -decreasing -unique $l]
}

proc find_common_desc {} {
    global markedid rowmenuid curview children

    if {![info exists markedid]} return
    if {![commitinview $markedid $curview] ||
        ![commitinview $rowmenuid $curview]} return
    #set t1 [clock clicks -milliseconds]
    set l1 [list [rowofcommit $markedid]]
    set l2 [list [rowofcommit $rowmenuid]]
    while 1 {
        set r1 [lindex $l1 0]
        set r2 [lindex $l2 0]
        if {$r1 eq {} || $r2 eq {}} break
        if {$r1 == $r2} {
            selectline $r1 1
            break
        }
        if {$r1 > $r2} {
            set l1 [replace_by_kids $l1 $r1]
        } else {
            set l2 [replace_by_kids $l2 $r2]
        }
    }
    #set t2 [clock clicks -milliseconds]
    #puts "took [expr {$t2-$t1}]ms"
}

proc compare_commits {} {
    global markedid rowmenuid curview children

    if {![info exists markedid]} return
    if {![commitinview $markedid $curview]} return
    addtohistory [list do_cmp_commits $markedid $rowmenuid]
    do_cmp_commits $markedid $rowmenuid
}

proc getpatchid {id} {
    global patchids

    if {![info exists patchids($id)]} {
        set cmd [diffcmd [list $id] {-p --root}]
        if {[catch {
            set x [safe_exec_redirect $cmd [list | git patch-id]]
            set patchids($id) [lindex $x 0]
        }]} {
            set patchids($id) "error"
        }
    }
    return $patchids($id)
}

proc do_cmp_commits {a b} {
    global ctext curview parents children patchids commitinfo

    $ctext conf -state normal
    clear_ctext
    init_flist {}
    for {set i 0} {$i < 100} {incr i} {
        set skipa 0
        set skipb 0
        if {[llength $parents($curview,$a)] > 1} {
            appendshortlink $a [mc "Skipping merge commit "] "\n"
            set skipa 1
        } else {
            set patcha [getpatchid $a]
        }
        if {[llength $parents($curview,$b)] > 1} {
            appendshortlink $b [mc "Skipping merge commit "] "\n"
            set skipb 1
        } else {
            set patchb [getpatchid $b]
        }
        if {!$skipa && !$skipb} {
            set heada [lindex $commitinfo($a) 0]
            set headb [lindex $commitinfo($b) 0]
            if {$patcha eq "error"} {
                appendshortlink $a [mc "Error getting patch ID for "] \
                    [mc " - stopping\n"]
                break
            }
            if {$patchb eq "error"} {
                appendshortlink $b [mc "Error getting patch ID for "] \
                    [mc " - stopping\n"]
                break
            }
            if {$patcha eq $patchb} {
                if {$heada eq $headb} {
                    appendshortlink $a [mc "Commit "]
                    appendshortlink $b " == " "  $heada\n"
                } else {
                    appendshortlink $a [mc "Commit "] "  $heada\n"
                    appendshortlink $b [mc " is the same patch as\n       "] \
                        "  $headb\n"
                }
                set skipa 1
                set skipb 1
            } else {
                $ctext insert end "\n"
                appendshortlink $a [mc "Commit "] "  $heada\n"
                appendshortlink $b [mc " differs from\n       "] \
                    "  $headb\n"
                $ctext insert end [mc "Diff of commits:\n\n"]
                $ctext conf -state disabled
                update
                diffcommits $a $b
                return
            }
        }
        if {$skipa} {
            set kids [real_children $curview,$a]
            if {[llength $kids] != 1} {
                $ctext insert end "\n"
                appendshortlink $a [mc "Commit "] \
                    [mc " has %s children - stopping\n" [llength $kids]]
                break
            }
            set a [lindex $kids 0]
        }
        if {$skipb} {
            set kids [real_children $curview,$b]
            if {[llength $kids] != 1} {
                appendshortlink $b [mc "Commit "] \
                    [mc " has %s children - stopping\n" [llength $kids]]
                break
            }
            set b [lindex $kids 0]
        }
    }
    $ctext conf -state disabled
}

proc diffcommits {a b} {
    global diffcontext diffids blobdifffd diffinhdr currdiffsubmod

    set tmpdir [gitknewtmpdir]
    set fna [file join $tmpdir "commit-[string range $a 0 7]"]
    set fnb [file join $tmpdir "commit-[string range $b 0 7]"]
    if {[catch {
        safe_exec_redirect [list git diff-tree -p --pretty $a] [list >$fna]
        safe_exec_redirect [list git diff-tree -p --pretty $b] [list >$fnb]
    } err]} {
        error_popup [mc "Error writing commit to file: %s" $err]
        return
    }
    if {[catch {
        set fd [safe_open_command "diff -U$diffcontext $fna $fnb"]
    } err]} {
        error_popup [mc "Error diffing commits: %s" $err]
        return
    }
    set diffids [list commits $a $b]
    set blobdifffd($diffids) $fd
    set diffinhdr 0
    set currdiffsubmod ""
    filerun $fd [list getblobdiffline $fd $diffids]
}

proc diffvssel {dirn} {
    global rowmenuid selectedline

    if {$selectedline eq {}} return
    if {$dirn} {
        set oldid [commitonrow $selectedline]
        set newid $rowmenuid
    } else {
        set oldid $rowmenuid
        set newid [commitonrow $selectedline]
    }
    addtohistory [list doseldiff $oldid $newid] savectextpos
    doseldiff $oldid $newid
}

proc diffvsmark {dirn} {
    global rowmenuid markedid

    if {![info exists markedid]} return
    if {$dirn} {
        set oldid $markedid
        set newid $rowmenuid
    } else {
        set oldid $rowmenuid
        set newid $markedid
    }
    addtohistory [list doseldiff $oldid $newid] savectextpos
    doseldiff $oldid $newid
}

proc doseldiff {oldid newid} {
    global ctext
    global commitinfo

    $ctext conf -state normal
    clear_ctext
    init_flist [mc "Top"]
    $ctext insert end "[mc "From"] "
    $ctext insert end $oldid link0
    setlink $oldid link0
    $ctext insert end "\n     "
    $ctext insert end [lindex $commitinfo($oldid) 0]
    $ctext insert end "\n\n[mc "To"]   "
    $ctext insert end $newid link1
    setlink $newid link1
    $ctext insert end "\n     "
    $ctext insert end [lindex $commitinfo($newid) 0]
    $ctext insert end "\n"
    $ctext conf -state disabled
    $ctext tag remove found 1.0 end
    startdiff [list $oldid $newid]
}

proc mkpatch {} {
    global rowmenuid currentid commitinfo patchtop patchnum
    global hashlength

    if {![info exists currentid]} return
    set oldid $currentid
    set oldhead [lindex $commitinfo($oldid) 0]
    set newid $rowmenuid
    set newhead [lindex $commitinfo($newid) 0]
    set top .patch
    set patchtop $top
    catch {destroy $top}
    ttk_toplevel $top
    make_transient $top .
    ttk::label $top.title -text [mc "Generate patch"]
    grid $top.title - -pady 10
    ttk::label $top.from -text [mc "From:"]
    ttk::entry $top.fromsha1 -width $hashlength
    $top.fromsha1 insert 0 $oldid
    $top.fromsha1 conf -state readonly
    grid $top.from $top.fromsha1 -sticky w
    ttk::entry $top.fromhead -width 60
    $top.fromhead insert 0 $oldhead
    $top.fromhead conf -state readonly
    grid x $top.fromhead -sticky w
    ttk::label $top.to -text [mc "To:"]
    ttk::entry $top.tosha1 -width $hashlength
    $top.tosha1 insert 0 $newid
    $top.tosha1 conf -state readonly
    grid $top.to $top.tosha1 -sticky w
    ttk::entry $top.tohead -width 60
    $top.tohead insert 0 $newhead
    $top.tohead conf -state readonly
    grid x $top.tohead -sticky w
    ttk::button $top.rev -text [mc "Reverse"] -command mkpatchrev
    grid $top.rev x -pady 10 -padx 5
    ttk::label $top.flab -text [mc "Output file:"]
    ttk::entry $top.fname -width 60
    $top.fname insert 0 [file normalize "patch$patchnum.patch"]
    incr patchnum
    grid $top.flab $top.fname -sticky w
    ttk::frame $top.buts
    ttk::button $top.buts.gen -text [mc "Generate"] -command mkpatchgo
    ttk::button $top.buts.can -text [mc "Cancel"] -command mkpatchcan
    bind $top <Key-Return> mkpatchgo
    bind $top <Key-Escape> mkpatchcan
    grid $top.buts.gen $top.buts.can
    grid columnconfigure $top.buts 0 -weight 1 -uniform a
    grid columnconfigure $top.buts 1 -weight 1 -uniform a
    grid $top.buts - -pady 10 -sticky ew
    focus $top.fname
}

proc mkpatchrev {} {
    global patchtop

    set oldid [$patchtop.fromsha1 get]
    set oldhead [$patchtop.fromhead get]
    set newid [$patchtop.tosha1 get]
    set newhead [$patchtop.tohead get]
    foreach e [list fromsha1 fromhead tosha1 tohead] \
            v [list $newid $newhead $oldid $oldhead] {
        $patchtop.$e conf -state normal
        $patchtop.$e delete 0 end
        $patchtop.$e insert 0 $v
        $patchtop.$e conf -state readonly
    }
}

proc mkpatchgo {} {
    global patchtop nullid nullid2

    set oldid [$patchtop.fromsha1 get]
    set newid [$patchtop.tosha1 get]
    set fname [$patchtop.fname get]
    set cmd [diffcmd [list $oldid $newid] -p]
    if {[catch {safe_exec_redirect $cmd [list >$fname &]} err]} {
        error_popup "[mc "Error creating patch:"] $err" $patchtop
    }
    catch {destroy $patchtop}
    unset patchtop
}

proc mkpatchcan {} {
    global patchtop

    catch {destroy $patchtop}
    unset patchtop
}

proc mktag {} {
    global rowmenuid mktagtop commitinfo
    global hashlength

    set top .maketag
    set mktagtop $top
    catch {destroy $top}
    ttk_toplevel $top
    make_transient $top .
    ttk::label $top.title -text [mc "Create tag"]
    grid $top.title - -pady 10
    ttk::label $top.id -text [mc "ID:"]
    ttk::entry $top.sha1 -width $hashlength
    $top.sha1 insert 0 $rowmenuid
    $top.sha1 conf -state readonly
    grid $top.id $top.sha1 -sticky w
    ttk::entry $top.head -width 60
    $top.head insert 0 [lindex $commitinfo($rowmenuid) 0]
    $top.head conf -state readonly
    grid x $top.head -sticky w
    ttk::label $top.tlab -text [mc "Tag name:"]
    ttk::entry $top.tag -width 60
    grid $top.tlab $top.tag -sticky w
    ttk::label $top.op -text [mc "Tag message is optional"]
    grid $top.op -columnspan 2 -sticky we
    ttk::label $top.mlab -text [mc "Tag message:"]
    ttk::entry $top.msg -width 60
    grid $top.mlab $top.msg -sticky w
    ttk::frame $top.buts
    ttk::button $top.buts.gen -text [mc "Create"] -command mktaggo
    ttk::button $top.buts.can -text [mc "Cancel"] -command mktagcan
    bind $top <Key-Return> mktaggo
    bind $top <Key-Escape> mktagcan
    grid $top.buts.gen $top.buts.can
    grid columnconfigure $top.buts 0 -weight 1 -uniform a
    grid columnconfigure $top.buts 1 -weight 1 -uniform a
    grid $top.buts - -pady 10 -sticky ew
    focus $top.tag
}

proc domktag {} {
    global mktagtop env tagids idtags

    set id [$mktagtop.sha1 get]
    set tag [$mktagtop.tag get]
    set msg [$mktagtop.msg get]
    if {$tag == {}} {
        error_popup [mc "No tag name specified"] $mktagtop
        return 0
    }
    if {[info exists tagids($tag)]} {
        error_popup [mc "Tag \"%s\" already exists" $tag] $mktagtop
        return 0
    }
    if {[catch {
        if {$msg != {}} {
            safe_exec [list git tag -a -m $msg $tag $id]
        } else {
            safe_exec [list git tag $tag $id]
        }
    } err]} {
        error_popup "[mc "Error creating tag:"] $err" $mktagtop
        return 0
    }

    set tagids($tag) $id
    lappend idtags($id) $tag
    redrawtags $id
    addedtag $id
    dispneartags 0
    run refill_reflist
    return 1
}

proc redrawtags {id} {
    global canv linehtag idpos currentid curview cmitlisted markedid
    global canvxmax iddrawn circleitem mainheadid circlecolors
    global mainheadcirclecolor

    if {![commitinview $id $curview]} return
    if {![info exists iddrawn($id)]} return
    set row [rowofcommit $id]
    if {$id eq $mainheadid} {
        set ofill $mainheadcirclecolor
    } else {
        set ofill [lindex $circlecolors $cmitlisted($curview,$id)]
    }
    $canv itemconf $circleitem($row) -fill $ofill
    $canv delete tag.$id
    set xt [eval drawtags $id $idpos($id)]
    $canv coords $linehtag($id) $xt [lindex $idpos($id) 2]
    set text [$canv itemcget $linehtag($id) -text]
    set font [$canv itemcget $linehtag($id) -font]
    set xr [expr {$xt + [font measure $font $text]}]
    if {$xr > $canvxmax} {
        set canvxmax $xr
        setcanvscroll
    }
    if {[info exists currentid] && $currentid == $id} {
        make_secsel $id
    }
    if {[info exists markedid] && $markedid eq $id} {
        make_idmark $id
    }
}

proc mktagcan {} {
    global mktagtop

    catch {destroy $mktagtop}
    unset mktagtop
}

proc mktaggo {} {
    if {![domktag]} return
    mktagcan
}

proc copyreference {} {
    global rowmenuid autosellen
    global hashlength

    set format "%h (\"%s\", %ad)"
    set cmd [list git show -s --pretty=format:$format --date=short]
    if {$autosellen < $hashlength} {
        lappend cmd --abbrev=$autosellen
    }
    set reference [safe_exec [concat $cmd $rowmenuid]]

    clipboard clear
    clipboard append $reference
}

proc writecommit {} {
    global rowmenuid wrcomtop commitinfo wrcomcmd
    global hashlength

    set top .writecommit
    set wrcomtop $top
    catch {destroy $top}
    ttk_toplevel $top
    make_transient $top .
    ttk::label $top.title -text [mc "Write commit to file"]
    grid $top.title - -pady 10
    ttk::label $top.id -text [mc "ID:"]
    ttk::entry $top.sha1 -width $hashlength
    $top.sha1 insert 0 $rowmenuid
    $top.sha1 conf -state readonly
    grid $top.id $top.sha1 -sticky w
    ttk::entry $top.head -width 60
    $top.head insert 0 [lindex $commitinfo($rowmenuid) 0]
    $top.head conf -state readonly
    grid x $top.head -sticky w
    ttk::label $top.clab -text [mc "Command:"]
    ttk::entry $top.cmd -width 60 -textvariable wrcomcmd
    grid $top.clab $top.cmd -sticky w -pady 10
    ttk::label $top.flab -text [mc "Output file:"]
    ttk::entry $top.fname -width 60
    $top.fname insert 0 [file normalize "commit-[string range $rowmenuid 0 6]"]
    grid $top.flab $top.fname -sticky w
    ttk::frame $top.buts
    ttk::button $top.buts.gen -text [mc "Write"] -command wrcomgo
    ttk::button $top.buts.can -text [mc "Cancel"] -command wrcomcan
    bind $top <Key-Return> wrcomgo
    bind $top <Key-Escape> wrcomcan
    grid $top.buts.gen $top.buts.can
    grid columnconfigure $top.buts 0 -weight 1 -uniform a
    grid columnconfigure $top.buts 1 -weight 1 -uniform a
    grid $top.buts - -pady 10 -sticky ew
    focus $top.fname
}

proc wrcomgo {} {
    global wrcomtop

    set id [$wrcomtop.sha1 get]
    set cmd "echo $id | [$wrcomtop.cmd get]"
    set fname [$wrcomtop.fname get]
    if {[catch {safe_exec_redirect [list sh -c $cmd] [list >$fname &]} err]} {
        error_popup "[mc "Error writing commit:"] $err" $wrcomtop
    }
    catch {destroy $wrcomtop}
    unset wrcomtop
}

proc wrcomcan {} {
    global wrcomtop

    catch {destroy $wrcomtop}
    unset wrcomtop
}

proc mkbranch {} {
    global rowmenuid

    set top .branchdialog

    set val(name) ""
    set val(id) $rowmenuid
    set val(command) [list mkbrgo $top]

    set ui(title) [mc "Create branch"]
    set ui(accept) [mc "Create"]

    branchdia $top val ui
}

proc mvbranch {} {
    global headmenuid headmenuhead

    set top .branchdialog

    set val(name) $headmenuhead
    set val(id) $headmenuid
    set val(command) [list mvbrgo $top $headmenuhead]

    set ui(title) [mc "Rename branch %s" $headmenuhead]
    set ui(accept) [mc "Rename"]

    branchdia $top val ui
}

proc branchdia {top valvar uivar} {
    global commitinfo
    global hashlength
    upvar $valvar val $uivar ui

    catch {destroy $top}
    ttk_toplevel $top
    make_transient $top .
    ttk::label $top.title -text $ui(title)
    grid $top.title - -pady 10
    ttk::label $top.id -text [mc "ID:"]
    ttk::entry $top.sha1 -width $hashlength
    $top.sha1 insert 0 $val(id)
    $top.sha1 conf -state readonly
    grid $top.id $top.sha1 -sticky w
    ttk::entry $top.head -width 60
    $top.head insert 0 [lindex $commitinfo($val(id)) 0]
    $top.head conf -state readonly
    grid x $top.head -sticky ew
    grid columnconfigure $top 1 -weight 1
    ttk::label $top.nlab -text [mc "Name:"]
    ttk::entry $top.name -width $hashlength
    $top.name insert 0 $val(name)
    grid $top.nlab $top.name -sticky w
    ttk::frame $top.buts
    ttk::button $top.buts.go -text $ui(accept) -command $val(command)
    ttk::button $top.buts.can -text [mc "Cancel"] -command "catch {destroy $top}"
    bind $top <Key-Return> $val(command)
    bind $top <Key-Escape> "catch {destroy $top}"
    grid $top.buts.go $top.buts.can
    grid columnconfigure $top.buts 0 -weight 1 -uniform a
    grid columnconfigure $top.buts 1 -weight 1 -uniform a
    grid $top.buts - -pady 10 -sticky ew
    focus $top.name
}

proc mkbrgo {top} {
    global headids idheads

    set name [$top.name get]
    set id [$top.sha1 get]
    set cmdargs {}
    set old_id {}
    if {$name eq {}} {
        error_popup [mc "Please specify a name for the new branch"] $top
        return
    }
    if {[info exists headids($name)]} {
        if {![confirm_popup [mc \
                "Branch '%s' already exists. Overwrite?" $name] $top]} {
            return
        }
        set old_id $headids($name)
        lappend cmdargs -f
    }
    catch {destroy $top}
    lappend cmdargs $name $id
    nowbusy newbranch
    update
    if {[catch {
        safe_exec [concat git branch $cmdargs]
    } err]} {
        notbusy newbranch
        error_popup $err
    } else {
        notbusy newbranch
        if {$old_id ne {}} {
            movehead $id $name
            movedhead $id $name
            redrawtags $old_id
            redrawtags $id
        } else {
            set headids($name) $id
            lappend idheads($id) $name
            addedhead $id $name
            redrawtags $id
        }
        dispneartags 0
        run refill_reflist
    }
}

proc mvbrgo {top prevname} {
    global headids idheads mainhead mainheadid

    set name [$top.name get]
    set id [$top.sha1 get]
    set cmdargs {}
    if {$name eq $prevname} {
        catch {destroy $top}
        return
    }
    if {$name eq {}} {
        error_popup [mc "Please specify a new name for the branch"] $top
        return
    }
    catch {destroy $top}
    lappend cmdargs -m $prevname $name
    nowbusy renamebranch
    update
    if {[catch {
        safe_exec [concat git branch $cmdargs]
    } err]} {
        notbusy renamebranch
        error_popup $err
    } else {
        notbusy renamebranch
        removehead $id $prevname
        removedhead $id $prevname
        set headids($name) $id
        lappend idheads($id) $name
        addedhead $id $name
        if {$prevname eq $mainhead} {
            set mainhead $name
            set mainheadid $id
        }
        redrawtags $id
        dispneartags 0
        run refill_reflist
    }
}

proc exec_citool {tool_args {baseid {}}} {
    global commitinfo env

    set save_env [array get env GIT_AUTHOR_*]

    if {$baseid ne {}} {
        if {![info exists commitinfo($baseid)]} {
            getcommit $baseid
        }
        set author [lindex $commitinfo($baseid) 1]
        set date [lindex $commitinfo($baseid) 2]
        if {[regexp {^\s*(\S.*\S|\S)\s*<(.*)>\s*$} \
                    $author author name email]
            && $date ne {}} {
            set env(GIT_AUTHOR_NAME) $name
            set env(GIT_AUTHOR_EMAIL) $email
            set env(GIT_AUTHOR_DATE) $date
        }
    }

    safe_exec_redirect [concat git citool $tool_args] [list &]

    array unset env GIT_AUTHOR_*
    array set env $save_env
}

proc cherrypick {} {
    global rowmenuid curview
    global mainhead mainheadid
    global gitdir

    set oldhead [exec git rev-parse HEAD]
    set dheads [descheads $rowmenuid]
    if {$dheads ne {} && [lsearch -exact $dheads $oldhead] >= 0} {
        set ok [confirm_popup [mc "Commit %s is already\
                included in branch %s -- really re-apply it?" \
                                   [string range $rowmenuid 0 7] $mainhead]]
        if {!$ok} return
    }
    nowbusy cherrypick [mc "Cherry-picking"]
    update
    # Unfortunately git-cherry-pick writes stuff to stderr even when
    # no error occurs, and exec takes that as an indication of error...
    if {[catch {safe_exec [list sh -c "git cherry-pick -r $rowmenuid 2>&1"]} err]} {
        notbusy cherrypick
        if {[regexp -line \
                 {Entry '(.*)' (would be overwritten by merge|not uptodate)} \
                 $err msg fname]} {
            error_popup [mc "Cherry-pick failed because of local changes\
                        to file '%s'.\nPlease commit, reset or stash\
                        your changes and try again." $fname]
        } elseif {[regexp -line \
                       {^(CONFLICT \(.*\):|Automatic cherry-pick failed|error: could not apply)} \
                       $err]} {
            if {[confirm_popup [mc "Cherry-pick failed because of merge\
                        conflict.\nDo you wish to run git citool to\
                        resolve it?"]]} {
                # Force citool to read MERGE_MSG
                file delete [file join $gitdir "GITGUI_MSG"]
                exec_citool {} $rowmenuid
            }
        } else {
            error_popup $err
        }
        run updatecommits
        return
    }
    set newhead [exec git rev-parse HEAD]
    if {$newhead eq $oldhead} {
        notbusy cherrypick
        error_popup [mc "No changes committed"]
        return
    }
    addnewchild $newhead $oldhead
    if {[commitinview $oldhead $curview]} {
        # XXX this isn't right if we have a path limit...
        insertrow $newhead $oldhead $curview
        if {$mainhead ne {}} {
            movehead $newhead $mainhead
            movedhead $newhead $mainhead
        }
        set mainheadid $newhead
        redrawtags $oldhead
        redrawtags $newhead
        selbyid $newhead
    }
    notbusy cherrypick
}

proc revert {} {
    global rowmenuid curview
    global mainhead mainheadid
    global gitdir

    set oldhead [exec git rev-parse HEAD]
    set dheads [descheads $rowmenuid]
    if { $dheads eq {} || [lsearch -exact $dheads $oldhead] == -1 } {
       set ok [confirm_popup [mc "Commit %s is not\
           included in branch %s -- really revert it?" \
                      [string range $rowmenuid 0 7] $mainhead]]
       if {!$ok} return
    }
    nowbusy revert [mc "Reverting"]
    update

    if [catch {safe_exec [list git revert --no-edit $rowmenuid]} err] {
        notbusy revert
        if [regexp {files would be overwritten by merge:(\n(( |\t)+[^\n]+\n)+)}\
                $err match files] {
            regsub {\n( |\t)+} $files "\n" files
            error_popup [mc "Revert failed because of local changes to\
                the following files:%s Please commit, reset or stash \
                your changes and try again." $files]
        } elseif [regexp {error: could not revert} $err] {
            if [confirm_popup [mc "Revert failed because of merge conflict.\n\
                Do you wish to run git citool to resolve it?"]] {
                # Force citool to read MERGE_MSG
                file delete [file join $gitdir "GITGUI_MSG"]
                exec_citool {} $rowmenuid
            }
        } else { error_popup $err }
        run updatecommits
        return
    }

    set newhead [exec git rev-parse HEAD]
    if { $newhead eq $oldhead } {
        notbusy revert
        error_popup [mc "No changes committed"]
        return
    }

    addnewchild $newhead $oldhead

    if [commitinview $oldhead $curview] {
        # XXX this isn't right if we have a path limit...
        insertrow $newhead $oldhead $curview
        if {$mainhead ne {}} {
            movehead $newhead $mainhead
            movedhead $newhead $mainhead
        }
        set mainheadid $newhead
        redrawtags $oldhead
        redrawtags $newhead
        selbyid $newhead
    }

    notbusy revert
}

proc resethead {} {
    global mainhead rowmenuid confirm_ok resettype

    set confirm_ok 0
    set w ".confirmreset"
    ttk_toplevel $w
    make_transient $w .
    wm title $w [mc "Confirm reset"]
    ttk::label $w.m -text \
        [mc "Reset branch %s to %s?" $mainhead [string range $rowmenuid 0 7]]
    pack $w.m -side top -fill x -padx 20 -pady 20
    ttk::labelframe $w.f -text [mc "Reset type:"]
    set resettype mixed
    ttk::radiobutton $w.f.soft -value soft -variable resettype \
        -text [mc "Soft: Leave working tree and index untouched"]
    grid $w.f.soft -sticky w
    ttk::radiobutton $w.f.mixed -value mixed -variable resettype \
        -text [mc "Mixed: Leave working tree untouched, reset index"]
    grid $w.f.mixed -sticky w
    ttk::radiobutton $w.f.hard -value hard -variable resettype \
        -text [mc "Hard: Reset working tree and index\n(discard ALL local changes)"]
    grid $w.f.hard -sticky w
    pack $w.f -side top -fill x -padx 4
    ttk::button $w.ok -text [mc OK] -command "set confirm_ok 1; destroy $w"
    pack $w.ok -side left -fill x -padx 20 -pady 20
    ttk::button $w.cancel -text [mc Cancel] -command "destroy $w"
    bind $w <Key-Escape> [list destroy $w]
    pack $w.cancel -side right -fill x -padx 20 -pady 20
    bind $w <Visibility> "grab $w; focus $w"
    tkwait window $w
    if {!$confirm_ok} return
    if {[catch {set fd [safe_open_command_redirect \
            [list git reset --$resettype $rowmenuid] [list 2>@1]]} err]} {
        error_popup $err
    } else {
        dohidelocalchanges
        filerun $fd [list readresetstat $fd]
        nowbusy reset [mc "Resetting"]
        selbyid $rowmenuid
    }
}

proc readresetstat {fd} {
    global mainhead mainheadid showlocalchanges rprogcoord

    if {[gets $fd line] >= 0} {
        if {[regexp {([0-9]+)% \(([0-9]+)/([0-9]+)\)} $line match p m n]} {
            set rprogcoord [expr {1.0 * $m / $n}]
            adjustprogress
        }
        return 1
    }
    set rprogcoord 0
    adjustprogress
    notbusy reset
    if {[catch {close $fd} err]} {
        error_popup $err
    }
    set oldhead $mainheadid
    set newhead [exec git rev-parse HEAD]
    if {$newhead ne $oldhead} {
        movehead $newhead $mainhead
        movedhead $newhead $mainhead
        set mainheadid $newhead
        redrawtags $oldhead
        redrawtags $newhead
    }
    if {$showlocalchanges} {
        doshowlocalchanges
    }
    return 0
}

# context menu for a head
proc headmenu {x y id head} {
    global headmenuid headmenuhead headctxmenu mainhead headids

    stopfinding
    set headmenuid $id
    set headmenuhead $head
    array set state {0 normal 1 normal 2 normal}
    if {[string match "remotes/*" $head]} {
        set localhead [string range $head [expr [string last / $head] + 1] end]
        if {[info exists headids($localhead)]} {
            set state(0) disabled
        }
        array set state {1 disabled 2 disabled}
    }
    if {$head eq $mainhead} {
        array set state {0 disabled 2 disabled}
    }
    foreach i {0 1 2} {
        $headctxmenu entryconfigure $i -state $state($i)
    }
    tk_popup $headctxmenu $x $y
}

proc cobranch {} {
    global headmenuid headmenuhead headids
    global showlocalchanges

    # check the tree is clean first??
    set newhead $headmenuhead
    set command [list git checkout]
    if {[string match "remotes/*" $newhead]} {
        set remote $newhead
        set newhead [string range $newhead [expr [string last / $newhead] + 1] end]
        # The following check is redundant - the menu option should
        # be disabled to begin with...
        if {[info exists headids($newhead)]} {
            error_popup [mc "A local branch named %s exists already" $newhead]
            return
        }
        lappend command -b $newhead --track $remote
    } else {
        lappend command $newhead
    }
    nowbusy checkout [mc "Checking out"]
    update
    dohidelocalchanges
    if {[catch {
        set fd [safe_open_command_redirect $command [list 2>@1]]
    } err]} {
        notbusy checkout
        error_popup $err
        if {$showlocalchanges} {
            dodiffindex
        }
    } else {
        filerun $fd [list readcheckoutstat $fd $newhead $headmenuid]
    }
}

proc readcheckoutstat {fd newhead newheadid} {
    global mainhead mainheadid headids idheads showlocalchanges progresscoords
    global viewmainheadid curview

    if {[gets $fd line] >= 0} {
        if {[regexp {([0-9]+)% \(([0-9]+)/([0-9]+)\)} $line match p m n]} {
            set progresscoords [list 0 [expr {1.0 * $m / $n}]]
            adjustprogress
        }
        return 1
    }
    set progresscoords {0 0}
    adjustprogress
    notbusy checkout
    if {[catch {close $fd} err]} {
        error_popup $err
        return
    }
    set oldmainid $mainheadid
    if {! [info exists headids($newhead)]} {
        set headids($newhead) $newheadid
        lappend idheads($newheadid) $newhead
        addedhead $newheadid $newhead
    }
    set mainhead $newhead
    set mainheadid $newheadid
    set viewmainheadid($curview) $newheadid
    redrawtags $oldmainid
    redrawtags $newheadid
    selbyid $newheadid
    if {$showlocalchanges} {
        dodiffindex
    }
}

proc rmbranch {} {
    global headmenuid headmenuhead mainhead
    global idheads

    set head $headmenuhead
    set id $headmenuid
    # this check shouldn't be needed any more...
    if {$head eq $mainhead} {
        error_popup [mc "Cannot delete the currently checked-out branch"]
        return
    }
    set dheads [descheads $id]
    if {[llength $dheads] == 1 && $idheads($dheads) eq $head} {
        # the stuff on this branch isn't on any other branch
        if {![confirm_popup [mc "The commits on branch %s aren't on any other\
                        branch.\nReally delete branch %s?" $head $head]]} return
    }
    nowbusy rmbranch
    update
    if {[catch {safe_exec [list git branch -D $head]} err]} {
        notbusy rmbranch
        error_popup $err
        return
    }
    removehead $id $head
    removedhead $id $head
    redrawtags $id
    notbusy rmbranch
    dispneartags 0
    run refill_reflist
}

# Display a list of tags and heads
proc showrefs {} {
    global showrefstop bgcolor fgcolor selectbgcolor
    global bglist fglist reflistfilter reflist maincursor

    set top .showrefs
    set showrefstop $top
    if {[winfo exists $top]} {
        raise $top
        refill_reflist
        return
    }
    ttk_toplevel $top
    wm title $top [mc "Tags and heads: %s" [file tail [pwd]]]
    make_transient $top .
    text $top.list -background $bgcolor -foreground $fgcolor \
        -selectbackground $selectbgcolor -font mainfont \
        -xscrollcommand "$top.xsb set" -yscrollcommand "$top.ysb set" \
        -width 60 -height 20 -cursor $maincursor \
        -spacing1 1 -spacing3 1 -state disabled
    $top.list tag configure highlight -background $selectbgcolor
    if {![lsearch -exact $bglist $top.list]} {
        lappend bglist $top.list
        lappend fglist $top.list
    }
    ttk::scrollbar $top.ysb -command "$top.list yview" -orient vertical
    ttk::scrollbar $top.xsb -command "$top.list xview" -orient horizontal
    grid $top.list $top.ysb -sticky nsew
    grid $top.xsb x -sticky ew
    ttk::frame $top.f
    ttk::label $top.f.l -text "[mc "Filter"]: "
    ttk::entry $top.f.e -width 20 -textvariable reflistfilter
    set reflistfilter "*"
    trace add variable reflistfilter write reflistfilter_change
    pack $top.f.e -side right -fill x -expand 1
    pack $top.f.l -side left
    grid $top.f - -sticky ew -pady 2
    ttk::checkbutton $top.sort -text [mc "Sort refs by type"] \
        -variable sortrefsbytype -command {refill_reflist}
    grid $top.sort - -sticky w -pady 2
    ttk::button $top.close -command [list destroy $top] -text [mc "Close"]
    bind $top <Key-Escape> [list destroy $top]
    grid $top.close -
    grid columnconfigure $top 0 -weight 1
    grid rowconfigure $top 0 -weight 1
    bind $top.list <1> {break}
    bind $top.list <B1-Motion> {break}
    bind $top.list <ButtonRelease-1> {sel_reflist %W %x %y; break}
    set reflist {}
    refill_reflist
}

proc sel_reflist {w x y} {
    global showrefstop reflist headids tagids otherrefids

    if {![winfo exists $showrefstop]} return
    set l [lindex [split [$w index "@$x,$y"] "."] 0]
    set ref [lindex $reflist [expr {$l-1}]]
    set n [lindex $ref 0]
    switch -- [lindex $ref 1] {
        "H" {selbyid $headids($n)}
        "R" {selbyid $headids($n)}
        "T" {selbyid $tagids($n)}
        "o" {selbyid $otherrefids($n)}
    }
    $showrefstop.list tag add highlight $l.0 "$l.0 lineend"
}

proc unsel_reflist {} {
    global showrefstop

    if {![info exists showrefstop] || ![winfo exists $showrefstop]} return
    $showrefstop.list tag remove highlight 0.0 end
}

proc reflistfilter_change {n1 n2 op} {
    global reflistfilter

    after cancel refill_reflist
    after 200 refill_reflist
}

proc refill_reflist {} {
    global reflist reflistfilter showrefstop headids tagids otherrefids sortrefsbytype
    global curview upstreamofref

    if {![info exists showrefstop] || ![winfo exists $showrefstop]} return
    set localrefs {}
    set remoterefs {}
    set trackedremoterefs {}
    set tagrefs {}
    set otherrefs {}

    foreach n [array names headids] {
        if {![string match "remotes/*" $n] && [string match $reflistfilter $n]} {
            if {[commitinview $headids($n) $curview]} {
                lappend localrefs [list $n H]
                if {[info exists upstreamofref($n)]} {
                    lappend trackedremoterefs [list $upstreamofref($n) R]
                }
            } else {
                interestedin $headids($n) {run refill_reflist}
            }
        }
    }
    set trackedremoterefs [lsort -index 0 $trackedremoterefs]
    set localrefs [lsort -index 0 $localrefs]

    foreach n [array names headids] {
        if {[string match "remotes/*" $n] && [string match $reflistfilter $n]} {
            if {[commitinview $headids($n) $curview]} {
                if {[lsearch -exact $trackedremoterefs [list $n R]] < 0} {
                    lappend remoterefs [list $n R]
                }
            } else {
                interestedin $headids($n) {run refill_reflist}
            }
        }
    }
    set remoterefs [lsort -index 0 $remoterefs]

    foreach n [array names tagids] {
        if {[string match $reflistfilter $n]} {
            if {[commitinview $tagids($n) $curview]} {
                lappend tagrefs [list $n T]
            } else {
                interestedin $tagids($n) {run refill_reflist}
            }
        }
    }
    set tagrefs [lsort -index 0 $tagrefs]

    foreach n [array names otherrefids] {
        if {[string match $reflistfilter $n]} {
            if {[commitinview $otherrefids($n) $curview]} {
                lappend otherrefs [list "$n" o]
            } else {
                interestedin $otherrefids($n) {run refill_reflist}
            }
        }
    }
    set otherrefs [lsort -index 0 $otherrefs]

    set refs [concat $localrefs $trackedremoterefs $remoterefs $tagrefs $otherrefs]
    if {!$sortrefsbytype} {
        set refs [lsort -index 0 $refs]
    }

    if {$refs eq $reflist} return

    # Update the contents of $showrefstop.list according to the
    # differences between $reflist (old) and $refs (new)
    $showrefstop.list conf -state normal
    $showrefstop.list insert end "\n"
    set i 0
    set j 0
    while {$i < [llength $reflist] || $j < [llength $refs]} {
        if {$i < [llength $reflist]} {
            if {$j < [llength $refs]} {
                set cmp [string compare [lindex $reflist $i 0] \
                             [lindex $refs $j 0]]
                if {$cmp == 0} {
                    set cmp [string compare [lindex $reflist $i 1] \
                                 [lindex $refs $j 1]]
                }
            } else {
                set cmp -1
            }
        } else {
            set cmp 1
        }
        switch -- $cmp {
            -1 {
                $showrefstop.list delete "[expr {$j+1}].0" "[expr {$j+2}].0"
                incr i
            }
            0 {
                incr i
                incr j
            }
            1 {
                set l [expr {$j + 1}]
                $showrefstop.list image create $l.0 -align baseline \
                    -image reficon-[lindex $refs $j 1] -padx 2
                $showrefstop.list insert $l.1 "[lindex $refs $j 0]\n"
                incr j
            }
        }
    }
    set reflist $refs
    # delete last newline
    $showrefstop.list delete end-2c end-1c
    $showrefstop.list conf -state disabled
}

# Stuff for finding nearby tags
proc getallcommits {} {
    global allcommits nextarc seeds allccache allcwait cachedarcs allcupdate
    global idheads idtags idotherrefs allparents tagobjid
    global gitdir

    if {![info exists allcommits]} {
        set nextarc 0
        set allcommits 0
        set seeds {}
        set allcwait 0
        set cachedarcs 0
        set allccache [file join $gitdir "gitk.cache"]
        if {![catch {
            set f [safe_open_file $allccache r]
            set allcwait 1
            getcache $f
        }]} return
    }

    if {$allcwait} {
        return
    }
    set cmd [list git rev-list --parents]
    set allcupdate [expr {$seeds ne {}}]
    if {!$allcupdate} {
        set ids "--all"
    } else {
        set refs [concat [array names idheads] [array names idtags] \
                      [array names idotherrefs]]
        set ids {}
        set tagobjs {}
        foreach name [array names tagobjid] {
            lappend tagobjs $tagobjid($name)
        }
        foreach id [lsort -unique $refs] {
            if {![info exists allparents($id)] &&
                [lsearch -exact $tagobjs $id] < 0} {
                lappend ids $id
            }
        }
        if {$ids ne {}} {
            foreach id $seeds {
                lappend ids "^$id"
            }
            lappend ids "--"
        }
    }
    if {$ids ne {}} {
        if {$ids eq "--all"} {
            set cmd [concat $cmd "--all"]
            set fd [safe_open_command $cmd]
        } else {
            set cmd [concat $cmd --stdin]
            set fd [safe_open_command_redirect $cmd [list "<<[join $ids "\n"]"]]
        }
        fconfigure $fd -blocking 0
        incr allcommits
        nowbusy allcommits
        filerun $fd [list getallclines $fd]
    } else {
        dispneartags 0
    }
}

# Since most commits have 1 parent and 1 child, we group strings of
# such commits into "arcs" joining branch/merge points (BMPs), which
# are commits that either don't have 1 parent or don't have 1 child.
#
# arcnos(id) - incoming arcs for BMP, arc we're on for other nodes
# arcout(id) - outgoing arcs for BMP
# arcids(a) - list of IDs on arc including end but not start
# arcstart(a) - BMP ID at start of arc
# arcend(a) - BMP ID at end of arc
# growing(a) - arc a is still growing
# arctags(a) - IDs out of arcids (excluding end) that have tags
# archeads(a) - IDs out of arcids (excluding end) that have heads
# The start of an arc is at the descendent end, so "incoming" means
# coming from descendents, and "outgoing" means going towards ancestors.

proc getallclines {fd} {
    global allparents allchildren idtags idheads nextarc
    global arcnos arcids arctags arcout arcend arcstart archeads growing
    global seeds allcommits cachedarcs allcupdate

    set nid 0
    while {[incr nid] <= 1000 && [gets $fd line] >= 0} {
        set id [lindex $line 0]
        if {[info exists allparents($id)]} {
            # seen it already
            continue
        }
        set cachedarcs 0
        set olds [lrange $line 1 end]
        set allparents($id) $olds
        if {![info exists allchildren($id)]} {
            set allchildren($id) {}
            set arcnos($id) {}
            lappend seeds $id
        } else {
            set a $arcnos($id)
            if {[llength $olds] == 1 && [llength $a] == 1} {
                lappend arcids($a) $id
                if {[info exists idtags($id)]} {
                    lappend arctags($a) $id
                }
                if {[info exists idheads($id)]} {
                    lappend archeads($a) $id
                }
                if {[info exists allparents($olds)]} {
                    # seen parent already
                    if {![info exists arcout($olds)]} {
                        splitarc $olds
                    }
                    lappend arcids($a) $olds
                    set arcend($a) $olds
                    unset growing($a)
                }
                lappend allchildren($olds) $id
                lappend arcnos($olds) $a
                continue
            }
        }
        foreach a $arcnos($id) {
            lappend arcids($a) $id
            set arcend($a) $id
            unset growing($a)
        }

        set ao {}
        foreach p $olds {
            lappend allchildren($p) $id
            set a [incr nextarc]
            set arcstart($a) $id
            set archeads($a) {}
            set arctags($a) {}
            set archeads($a) {}
            set arcids($a) {}
            lappend ao $a
            set growing($a) 1
            if {[info exists allparents($p)]} {
                # seen it already, may need to make a new branch
                if {![info exists arcout($p)]} {
                    splitarc $p
                }
                lappend arcids($a) $p
                set arcend($a) $p
                unset growing($a)
            }
            lappend arcnos($p) $a
        }
        set arcout($id) $ao
    }
    if {$nid > 0} {
        global cached_dheads cached_dtags cached_atags
        unset -nocomplain cached_dheads
        unset -nocomplain cached_dtags
        unset -nocomplain cached_atags
    }
    if {![eof $fd]} {
        return [expr {$nid >= 1000? 2: 1}]
    }
    set cacheok 1
    if {[catch {
        fconfigure $fd -blocking 1
        close $fd
    } err]} {
        # got an error reading the list of commits
        # if we were updating, try rereading the whole thing again
        if {$allcupdate} {
            incr allcommits -1
            dropcache $err
            return
        }
        error_popup "[mc "Error reading commit topology information;\
                branch and preceding/following tag information\
                will be incomplete."]\n($err)"
        set cacheok 0
    }
    if {[incr allcommits -1] == 0} {
        notbusy allcommits
        if {$cacheok} {
            run savecache
        }
    }
    dispneartags 0
    return 0
}

proc recalcarc {a} {
    global arctags archeads arcids idtags idheads

    set at {}
    set ah {}
    foreach id [lrange $arcids($a) 0 end-1] {
        if {[info exists idtags($id)]} {
            lappend at $id
        }
        if {[info exists idheads($id)]} {
            lappend ah $id
        }
    }
    set arctags($a) $at
    set archeads($a) $ah
}

proc splitarc {p} {
    global arcnos arcids nextarc arctags archeads idtags idheads
    global arcstart arcend arcout allparents growing

    set a $arcnos($p)
    if {[llength $a] != 1} {
        puts "oops splitarc called but [llength $a] arcs already"
        return
    }
    set a [lindex $a 0]
    set i [lsearch -exact $arcids($a) $p]
    if {$i < 0} {
        puts "oops splitarc $p not in arc $a"
        return
    }
    set na [incr nextarc]
    if {[info exists arcend($a)]} {
        set arcend($na) $arcend($a)
    } else {
        set l [lindex $allparents([lindex $arcids($a) end]) 0]
        set j [lsearch -exact $arcnos($l) $a]
        set arcnos($l) [lreplace $arcnos($l) $j $j $na]
    }
    set tail [lrange $arcids($a) [expr {$i+1}] end]
    set arcids($a) [lrange $arcids($a) 0 $i]
    set arcend($a) $p
    set arcstart($na) $p
    set arcout($p) $na
    set arcids($na) $tail
    if {[info exists growing($a)]} {
        set growing($na) 1
        unset growing($a)
    }

    foreach id $tail {
        if {[llength $arcnos($id)] == 1} {
            set arcnos($id) $na
        } else {
            set j [lsearch -exact $arcnos($id) $a]
            set arcnos($id) [lreplace $arcnos($id) $j $j $na]
        }
    }

    # reconstruct tags and heads lists
    if {$arctags($a) ne {} || $archeads($a) ne {}} {
        recalcarc $a
        recalcarc $na
    } else {
        set arctags($na) {}
        set archeads($na) {}
    }
}

# Update things for a new commit added that is a child of one
# existing commit.  Used when cherry-picking.
proc addnewchild {id p} {
    global allparents allchildren idtags nextarc
    global arcnos arcids arctags arcout arcend arcstart archeads growing
    global seeds allcommits

    if {![info exists allcommits] || ![info exists arcnos($p)]} return
    set allparents($id) [list $p]
    set allchildren($id) {}
    set arcnos($id) {}
    lappend seeds $id
    lappend allchildren($p) $id
    set a [incr nextarc]
    set arcstart($a) $id
    set archeads($a) {}
    set arctags($a) {}
    set arcids($a) [list $p]
    set arcend($a) $p
    if {![info exists arcout($p)]} {
        splitarc $p
    }
    lappend arcnos($p) $a
    set arcout($id) [list $a]
}

# This implements a cache for the topology information.
# The cache saves, for each arc, the start and end of the arc,
# the ids on the arc, and the outgoing arcs from the end.
proc readcache {f} {
    global arcnos arcids arcout arcstart arcend arctags archeads nextarc
    global idtags idheads allparents cachedarcs possible_seeds seeds growing
    global allcwait

    set a $nextarc
    set lim $cachedarcs
    if {$lim - $a > 500} {
        set lim [expr {$a + 500}]
    }
    if {[catch {
        if {$a == $lim} {
            # finish reading the cache and setting up arctags, etc.
            set line [gets $f]
            if {$line ne "1"} {error "bad final version"}
            close $f
            foreach id [array names idtags] {
                if {[info exists arcnos($id)] && [llength $arcnos($id)] == 1 &&
                    [llength $allparents($id)] == 1} {
                    set a [lindex $arcnos($id) 0]
                    if {$arctags($a) eq {}} {
                        recalcarc $a
                    }
                }
            }
            foreach id [array names idheads] {
                if {[info exists arcnos($id)] && [llength $arcnos($id)] == 1 &&
                    [llength $allparents($id)] == 1} {
                    set a [lindex $arcnos($id) 0]
                    if {$archeads($a) eq {}} {
                        recalcarc $a
                    }
                }
            }
            foreach id [lsort -unique $possible_seeds] {
                if {$arcnos($id) eq {}} {
                    lappend seeds $id
                }
            }
            set allcwait 0
        } else {
            while {[incr a] <= $lim} {
                set line [gets $f]
                if {[llength $line] != 3} {error "bad line"}
                set s [lindex $line 0]
                set arcstart($a) $s
                lappend arcout($s) $a
                if {![info exists arcnos($s)]} {
                    lappend possible_seeds $s
                    set arcnos($s) {}
                }
                set e [lindex $line 1]
                if {$e eq {}} {
                    set growing($a) 1
                } else {
                    set arcend($a) $e
                    if {![info exists arcout($e)]} {
                        set arcout($e) {}
                    }
                }
                set arcids($a) [lindex $line 2]
                foreach id $arcids($a) {
                    lappend allparents($s) $id
                    set s $id
                    lappend arcnos($id) $a
                }
                if {![info exists allparents($s)]} {
                    set allparents($s) {}
                }
                set arctags($a) {}
                set archeads($a) {}
            }
            set nextarc [expr {$a - 1}]
        }
    } err]} {
        dropcache $err
        return 0
    }
    if {!$allcwait} {
        getallcommits
    }
    return $allcwait
}

proc getcache {f} {
    global nextarc cachedarcs possible_seeds

    if {[catch {
        set line [gets $f]
        if {[llength $line] != 2 || [lindex $line 0] ne "1"} {error "bad version"}
        # make sure it's an integer
        set cachedarcs [expr {int([lindex $line 1])}]
        if {$cachedarcs < 0} {error "bad number of arcs"}
        set nextarc 0
        set possible_seeds {}
        run readcache $f
    } err]} {
        dropcache $err
    }
    return 0
}

proc dropcache {err} {
    global allcwait nextarc cachedarcs seeds

    #puts "dropping cache ($err)"
    foreach v {arcnos arcout arcids arcstart arcend growing \
                   arctags archeads allparents allchildren} {
        global $v
        unset -nocomplain $v
    }
    set allcwait 0
    set nextarc 0
    set cachedarcs 0
    set seeds {}
    getallcommits
}

proc writecache {f} {
    global cachearc cachedarcs allccache
    global arcstart arcend arcnos arcids arcout

    set a $cachearc
    set lim $cachedarcs
    if {$lim - $a > 1000} {
        set lim [expr {$a + 1000}]
    }
    if {[catch {
        while {[incr a] <= $lim} {
            if {[info exists arcend($a)]} {
                puts $f [list $arcstart($a) $arcend($a) $arcids($a)]
            } else {
                puts $f [list $arcstart($a) {} $arcids($a)]
            }
        }
    } err]} {
        catch {close $f}
        catch {file delete $allccache}
        #puts "writing cache failed ($err)"
        return 0
    }
    set cachearc [expr {$a - 1}]
    if {$a > $cachedarcs} {
        puts $f "1"
        close $f
        return 0
    }
    return 1
}

proc savecache {} {
    global nextarc cachedarcs cachearc allccache

    if {$nextarc == $cachedarcs} return
    set cachearc 0
    set cachedarcs $nextarc
    catch {
        set f [safe_open_file $allccache w]
        puts $f [list 1 $cachedarcs]
        run writecache $f
    }
}

# Returns 1 if a is an ancestor of b, -1 if b is an ancestor of a,
# or 0 if neither is true.
proc anc_or_desc {a b} {
    global arcout arcstart arcend arcnos cached_isanc

    if {$arcnos($a) eq $arcnos($b)} {
        # Both are on the same arc(s); either both are the same BMP,
        # or if one is not a BMP, the other is also not a BMP or is
        # the BMP at end of the arc (and it only has 1 incoming arc).
        # Or both can be BMPs with no incoming arcs.
        if {$a eq $b || $arcnos($a) eq {}} {
            return 0
        }
        # assert {[llength $arcnos($a)] == 1}
        set arc [lindex $arcnos($a) 0]
        set i [lsearch -exact $arcids($arc) $a]
        set j [lsearch -exact $arcids($arc) $b]
        if {$i < 0 || $i > $j} {
            return 1
        } else {
            return -1
        }
    }

    if {![info exists arcout($a)]} {
        set arc [lindex $arcnos($a) 0]
        if {[info exists arcend($arc)]} {
            set aend $arcend($arc)
        } else {
            set aend {}
        }
        set a $arcstart($arc)
    } else {
        set aend $a
    }
    if {![info exists arcout($b)]} {
        set arc [lindex $arcnos($b) 0]
        if {[info exists arcend($arc)]} {
            set bend $arcend($arc)
        } else {
            set bend {}
        }
        set b $arcstart($arc)
    } else {
        set bend $b
    }
    if {$a eq $bend} {
        return 1
    }
    if {$b eq $aend} {
        return -1
    }
    if {[info exists cached_isanc($a,$bend)]} {
        if {$cached_isanc($a,$bend)} {
            return 1
        }
    }
    if {[info exists cached_isanc($b,$aend)]} {
        if {$cached_isanc($b,$aend)} {
            return -1
        }
        if {[info exists cached_isanc($a,$bend)]} {
            return 0
        }
    }

    set todo [list $a $b]
    set anc($a) a
    set anc($b) b
    for {set i 0} {$i < [llength $todo]} {incr i} {
        set x [lindex $todo $i]
        if {$anc($x) eq {}} {
            continue
        }
        foreach arc $arcnos($x) {
            set xd $arcstart($arc)
            if {$xd eq $bend} {
                set cached_isanc($a,$bend) 1
                set cached_isanc($b,$aend) 0
                return 1
            } elseif {$xd eq $aend} {
                set cached_isanc($b,$aend) 1
                set cached_isanc($a,$bend) 0
                return -1
            }
            if {![info exists anc($xd)]} {
                set anc($xd) $anc($x)
                lappend todo $xd
            } elseif {$anc($xd) ne $anc($x)} {
                set anc($xd) {}
            }
        }
    }
    set cached_isanc($a,$bend) 0
    set cached_isanc($b,$aend) 0
    return 0
}

# This identifies whether $desc has an ancestor that is
# a growing tip of the graph and which is not an ancestor of $anc
# and returns 0 if so and 1 if not.
# If we subsequently discover a tag on such a growing tip, and that
# turns out to be a descendent of $anc (which it could, since we
# don't necessarily see children before parents), then $desc
# isn't a good choice to display as a descendent tag of
# $anc (since it is the descendent of another tag which is
# a descendent of $anc).  Similarly, $anc isn't a good choice to
# display as a ancestor tag of $desc.
#
proc is_certain {desc anc} {
    global arcnos arcout arcstart arcend growing problems

    set certain {}
    if {[llength $arcnos($anc)] == 1} {
        # tags on the same arc are certain
        if {$arcnos($desc) eq $arcnos($anc)} {
            return 1
        }
        if {![info exists arcout($anc)]} {
            # if $anc is partway along an arc, use the start of the arc instead
            set a [lindex $arcnos($anc) 0]
            set anc $arcstart($a)
        }
    }
    if {[llength $arcnos($desc)] > 1 || [info exists arcout($desc)]} {
        set x $desc
    } else {
        set a [lindex $arcnos($desc) 0]
        set x $arcend($a)
    }
    if {$x == $anc} {
        return 1
    }
    set anclist [list $x]
    set dl($x) 1
    set nnh 1
    set ngrowanc 0
    for {set i 0} {$i < [llength $anclist] && ($nnh > 0 || $ngrowanc > 0)} {incr i} {
        set x [lindex $anclist $i]
        if {$dl($x)} {
            incr nnh -1
        }
        set done($x) 1
        foreach a $arcout($x) {
            if {[info exists growing($a)]} {
                if {![info exists growanc($x)] && $dl($x)} {
                    set growanc($x) 1
                    incr ngrowanc
                }
            } else {
                set y $arcend($a)
                if {[info exists dl($y)]} {
                    if {$dl($y)} {
                        if {!$dl($x)} {
                            set dl($y) 0
                            if {![info exists done($y)]} {
                                incr nnh -1
                            }
                            if {[info exists growanc($x)]} {
                                incr ngrowanc -1
                            }
                            set xl [list $y]
                            for {set k 0} {$k < [llength $xl]} {incr k} {
                                set z [lindex $xl $k]
                                foreach c $arcout($z) {
                                    if {[info exists arcend($c)]} {
                                        set v $arcend($c)
                                        if {[info exists dl($v)] && $dl($v)} {
                                            set dl($v) 0
                                            if {![info exists done($v)]} {
                                                incr nnh -1
                                            }
                                            if {[info exists growanc($v)]} {
                                                incr ngrowanc -1
                                            }
                                            lappend xl $v
                                        }
                                    }
                                }
                            }
                        }
                    }
                } elseif {$y eq $anc || !$dl($x)} {
                    set dl($y) 0
                    lappend anclist $y
                } else {
                    set dl($y) 1
                    lappend anclist $y
                    incr nnh
                }
            }
        }
    }
    foreach x [array names growanc] {
        if {$dl($x)} {
            return 0
        }
        return 0
    }
    return 1
}

proc validate_arctags {a} {
    global arctags idtags

    set i -1
    set na $arctags($a)
    foreach id $arctags($a) {
        incr i
        if {![info exists idtags($id)]} {
            set na [lreplace $na $i $i]
            incr i -1
        }
    }
    set arctags($a) $na
}

proc validate_archeads {a} {
    global archeads idheads

    set i -1
    set na $archeads($a)
    foreach id $archeads($a) {
        incr i
        if {![info exists idheads($id)]} {
            set na [lreplace $na $i $i]
            incr i -1
        }
    }
    set archeads($a) $na
}

# Return the list of IDs that have tags that are descendents of id,
# ignoring IDs that are descendents of IDs already reported.
proc desctags {id} {
    global arcnos arcstart arcids arctags idtags allparents
    global growing cached_dtags

    if {![info exists allparents($id)]} {
        return {}
    }
    set t1 [clock clicks -milliseconds]
    set argid $id
    if {[llength $arcnos($id)] == 1 && [llength $allparents($id)] == 1} {
        # part-way along an arc; check that arc first
        set a [lindex $arcnos($id) 0]
        if {$arctags($a) ne {}} {
            validate_arctags $a
            set i [lsearch -exact $arcids($a) $id]
            set tid {}
            foreach t $arctags($a) {
                set j [lsearch -exact $arcids($a) $t]
                if {$j >= $i} break
                set tid $t
            }
            if {$tid ne {}} {
                return $tid
            }
        }
        set id $arcstart($a)
        if {[info exists idtags($id)]} {
            return $id
        }
    }
    if {[info exists cached_dtags($id)]} {
        return $cached_dtags($id)
    }

    set origid $id
    set todo [list $id]
    set queued($id) 1
    set nc 1
    for {set i 0} {$i < [llength $todo] && $nc > 0} {incr i} {
        set id [lindex $todo $i]
        set done($id) 1
        set ta [info exists hastaggedancestor($id)]
        if {!$ta} {
            incr nc -1
        }
        # ignore tags on starting node
        if {!$ta && $i > 0} {
            if {[info exists idtags($id)]} {
                set tagloc($id) $id
                set ta 1
            } elseif {[info exists cached_dtags($id)]} {
                set tagloc($id) $cached_dtags($id)
                set ta 1
            }
        }
        foreach a $arcnos($id) {
            set d $arcstart($a)
            if {!$ta && $arctags($a) ne {}} {
                validate_arctags $a
                if {$arctags($a) ne {}} {
                    lappend tagloc($id) [lindex $arctags($a) end]
                }
            }
            if {$ta || $arctags($a) ne {}} {
                set tomark [list $d]
                for {set j 0} {$j < [llength $tomark]} {incr j} {
                    set dd [lindex $tomark $j]
                    if {![info exists hastaggedancestor($dd)]} {
                        if {[info exists done($dd)]} {
                            foreach b $arcnos($dd) {
                                lappend tomark $arcstart($b)
                            }
                            if {[info exists tagloc($dd)]} {
                                unset tagloc($dd)
                            }
                        } elseif {[info exists queued($dd)]} {
                            incr nc -1
                        }
                        set hastaggedancestor($dd) 1
                    }
                }
            }
            if {![info exists queued($d)]} {
                lappend todo $d
                set queued($d) 1
                if {![info exists hastaggedancestor($d)]} {
                    incr nc
                }
            }
        }
    }
    set tags {}
    foreach id [array names tagloc] {
        if {![info exists hastaggedancestor($id)]} {
            foreach t $tagloc($id) {
                if {[lsearch -exact $tags $t] < 0} {
                    lappend tags $t
                }
            }
        }
    }
    set t2 [clock clicks -milliseconds]
    set loopix $i

    # remove tags that are descendents of other tags
    for {set i 0} {$i < [llength $tags]} {incr i} {
        set a [lindex $tags $i]
        for {set j 0} {$j < $i} {incr j} {
            set b [lindex $tags $j]
            set r [anc_or_desc $a $b]
            if {$r == 1} {
                set tags [lreplace $tags $j $j]
                incr j -1
                incr i -1
            } elseif {$r == -1} {
                set tags [lreplace $tags $i $i]
                incr i -1
                break
            }
        }
    }

    if {[array names growing] ne {}} {
        # graph isn't finished, need to check if any tag could get
        # eclipsed by another tag coming later.  Simply ignore any
        # tags that could later get eclipsed.
        set ctags {}
        foreach t $tags {
            if {[is_certain $t $origid]} {
                lappend ctags $t
            }
        }
        if {$tags eq $ctags} {
            set cached_dtags($origid) $tags
        } else {
            set tags $ctags
        }
    } else {
        set cached_dtags($origid) $tags
    }
    set t3 [clock clicks -milliseconds]
    if {0 && $t3 - $t1 >= 100} {
        puts "iterating descendents ($loopix/[llength $todo] nodes) took\
            [expr {$t2-$t1}]+[expr {$t3-$t2}]ms, $nc candidates left"
    }
    return $tags
}

proc anctags {id} {
    global arcnos arcids arcout arcend arctags idtags allparents
    global growing cached_atags

    if {![info exists allparents($id)]} {
        return {}
    }
    set t1 [clock clicks -milliseconds]
    set argid $id
    if {[llength $arcnos($id)] == 1 && [llength $allparents($id)] == 1} {
        # part-way along an arc; check that arc first
        set a [lindex $arcnos($id) 0]
        if {$arctags($a) ne {}} {
            validate_arctags $a
            set i [lsearch -exact $arcids($a) $id]
            foreach t $arctags($a) {
                set j [lsearch -exact $arcids($a) $t]
                if {$j > $i} {
                    return $t
                }
            }
        }
        if {![info exists arcend($a)]} {
            return {}
        }
        set id $arcend($a)
        if {[info exists idtags($id)]} {
            return $id
        }
    }
    if {[info exists cached_atags($id)]} {
        return $cached_atags($id)
    }

    set origid $id
    set todo [list $id]
    set queued($id) 1
    set taglist {}
    set nc 1
    for {set i 0} {$i < [llength $todo] && $nc > 0} {incr i} {
        set id [lindex $todo $i]
        set done($id) 1
        set td [info exists hastaggeddescendent($id)]
        if {!$td} {
            incr nc -1
        }
        # ignore tags on starting node
        if {!$td && $i > 0} {
            if {[info exists idtags($id)]} {
                set tagloc($id) $id
                set td 1
            } elseif {[info exists cached_atags($id)]} {
                set tagloc($id) $cached_atags($id)
                set td 1
            }
        }
        foreach a $arcout($id) {
            if {!$td && $arctags($a) ne {}} {
                validate_arctags $a
                if {$arctags($a) ne {}} {
                    lappend tagloc($id) [lindex $arctags($a) 0]
                }
            }
            if {![info exists arcend($a)]} continue
            set d $arcend($a)
            if {$td || $arctags($a) ne {}} {
                set tomark [list $d]
                for {set j 0} {$j < [llength $tomark]} {incr j} {
                    set dd [lindex $tomark $j]
                    if {![info exists hastaggeddescendent($dd)]} {
                        if {[info exists done($dd)]} {
                            foreach b $arcout($dd) {
                                if {[info exists arcend($b)]} {
                                    lappend tomark $arcend($b)
                                }
                            }
                            if {[info exists tagloc($dd)]} {
                                unset tagloc($dd)
                            }
                        } elseif {[info exists queued($dd)]} {
                            incr nc -1
                        }
                        set hastaggeddescendent($dd) 1
                    }
                }
            }
            if {![info exists queued($d)]} {
                lappend todo $d
                set queued($d) 1
                if {![info exists hastaggeddescendent($d)]} {
                    incr nc
                }
            }
        }
    }
    set t2 [clock clicks -milliseconds]
    set loopix $i
    set tags {}
    foreach id [array names tagloc] {
        if {![info exists hastaggeddescendent($id)]} {
            foreach t $tagloc($id) {
                if {[lsearch -exact $tags $t] < 0} {
                    lappend tags $t
                }
            }
        }
    }

    # remove tags that are ancestors of other tags
    for {set i 0} {$i < [llength $tags]} {incr i} {
        set a [lindex $tags $i]
        for {set j 0} {$j < $i} {incr j} {
            set b [lindex $tags $j]
            set r [anc_or_desc $a $b]
            if {$r == -1} {
                set tags [lreplace $tags $j $j]
                incr j -1
                incr i -1
            } elseif {$r == 1} {
                set tags [lreplace $tags $i $i]
                incr i -1
                break
            }
        }
    }

    if {[array names growing] ne {}} {
        # graph isn't finished, need to check if any tag could get
        # eclipsed by another tag coming later.  Simply ignore any
        # tags that could later get eclipsed.
        set ctags {}
        foreach t $tags {
            if {[is_certain $origid $t]} {
                lappend ctags $t
            }
        }
        if {$tags eq $ctags} {
            set cached_atags($origid) $tags
        } else {
            set tags $ctags
        }
    } else {
        set cached_atags($origid) $tags
    }
    set t3 [clock clicks -milliseconds]
    if {0 && $t3 - $t1 >= 100} {
        puts "iterating ancestors ($loopix/[llength $todo] nodes) took\
            [expr {$t2-$t1}]+[expr {$t3-$t2}]ms, $nc candidates left"
    }
    return $tags
}

# Return the list of IDs that have heads that are descendents of id,
# including id itself if it has a head.
proc descheads {id} {
    global arcnos arcstart arcids archeads idheads cached_dheads
    global allparents arcout

    if {![info exists allparents($id)]} {
        return {}
    }
    set aret {}
    if {![info exists arcout($id)]} {
        # part-way along an arc; check it first
        set a [lindex $arcnos($id) 0]
        if {$archeads($a) ne {}} {
            validate_archeads $a
            set i [lsearch -exact $arcids($a) $id]
            foreach t $archeads($a) {
                set j [lsearch -exact $arcids($a) $t]
                if {$j > $i} break
                lappend aret $t
            }
        }
        set id $arcstart($a)
    }
    set origid $id
    set todo [list $id]
    set seen($id) 1
    set ret {}
    for {set i 0} {$i < [llength $todo]} {incr i} {
        set id [lindex $todo $i]
        if {[info exists cached_dheads($id)]} {
            set ret [concat $ret $cached_dheads($id)]
        } else {
            if {[info exists idheads($id)]} {
                lappend ret $id
            }
            foreach a $arcnos($id) {
                if {$archeads($a) ne {}} {
                    validate_archeads $a
                    if {$archeads($a) ne {}} {
                        set ret [concat $ret $archeads($a)]
                    }
                }
                set d $arcstart($a)
                if {![info exists seen($d)]} {
                    lappend todo $d
                    set seen($d) 1
                }
            }
        }
    }
    set ret [lsort -unique $ret]
    set cached_dheads($origid) $ret
    return [concat $ret $aret]
}

proc addedtag {id} {
    global arcnos arcout cached_dtags cached_atags

    if {![info exists arcnos($id)]} return
    if {![info exists arcout($id)]} {
        recalcarc [lindex $arcnos($id) 0]
    }
    unset -nocomplain cached_dtags
    unset -nocomplain cached_atags
}

proc addedhead {hid head} {
    global arcnos arcout cached_dheads

    if {![info exists arcnos($hid)]} return
    if {![info exists arcout($hid)]} {
        recalcarc [lindex $arcnos($hid) 0]
    }
    unset -nocomplain cached_dheads
}

proc removedhead {hid head} {
    global cached_dheads

    unset -nocomplain cached_dheads
}

proc movedhead {hid head} {
    global arcnos arcout cached_dheads

    if {![info exists arcnos($hid)]} return
    if {![info exists arcout($hid)]} {
        recalcarc [lindex $arcnos($hid) 0]
    }
    unset -nocomplain cached_dheads
}

proc changedrefs {} {
    global cached_dheads cached_dtags cached_atags cached_tagcontent
    global arctags archeads arcnos arcout idheads idtags

    foreach id [concat [array names idheads] [array names idtags]] {
        if {[info exists arcnos($id)] && ![info exists arcout($id)]} {
            set a [lindex $arcnos($id) 0]
            if {![info exists donearc($a)]} {
                recalcarc $a
                set donearc($a) 1
            }
        }
    }
    unset -nocomplain cached_tagcontent
    unset -nocomplain cached_dtags
    unset -nocomplain cached_atags
    unset -nocomplain cached_dheads
}

proc rereadrefs {} {
    global idtags idheads idotherrefs mainheadid

    set refids [concat [array names idtags] \
                    [array names idheads] [array names idotherrefs]]
    foreach id $refids {
        if {![info exists ref($id)]} {
            set ref($id) [listrefs $id]
        }
    }
    set oldmainhead $mainheadid
    readrefs
    changedrefs
    set refids [lsort -unique [concat $refids [array names idtags] \
                        [array names idheads] [array names idotherrefs]]]
    foreach id $refids {
        set v [listrefs $id]
        if {![info exists ref($id)] || $ref($id) != $v} {
            redrawtags $id
        }
    }
    if {$oldmainhead ne $mainheadid} {
        redrawtags $oldmainhead
        redrawtags $mainheadid
    }
    run refill_reflist
}

proc listrefs {id} {
    global idtags idheads idotherrefs

    set x {}
    if {[info exists idtags($id)]} {
        set x $idtags($id)
    }
    set y {}
    if {[info exists idheads($id)]} {
        set y $idheads($id)
    }
    set z {}
    if {[info exists idotherrefs($id)]} {
        set z $idotherrefs($id)
    }
    return [list $x $y $z]
}

proc add_tag_ctext {tag} {
    global ctext cached_tagcontent tagids

    if {![info exists cached_tagcontent($tag)]} {
        catch {
            set cached_tagcontent($tag) [safe_exec [list git cat-file -p $tag]]
        }
    }
    $ctext insert end "[mc "Tag"]: $tag\n" bold
    if {[info exists cached_tagcontent($tag)]} {
        set text $cached_tagcontent($tag)
    } else {
        set text "[mc "Id"]:  $tagids($tag)"
    }
    appendwithlinks $text {}
}

proc showtag {tag isnew} {
    global ctext cached_tagcontent tagids linknum tagobjid

    if {$isnew} {
        addtohistory [list showtag $tag 0] savectextpos
    }
    $ctext conf -state normal
    clear_ctext
    settabs 0
    set linknum 0
    add_tag_ctext $tag
    maybe_scroll_ctext 1
    $ctext conf -state disabled
    init_flist {}
}

proc showtags {id isnew} {
    global idtags ctext linknum

    if {$isnew} {
        addtohistory [list showtags $id 0] savectextpos
    }
    $ctext conf -state normal
    clear_ctext
    settabs 0
    set linknum 0
    set sep {}
    foreach tag $idtags($id) {
        $ctext insert end $sep
        add_tag_ctext $tag
        set sep "\n\n"
    }
    maybe_scroll_ctext 1
    $ctext conf -state disabled
    init_flist {}
}

proc doquit {} {
    global stopped
    global gitktmpdir

    set stopped 100
    savestuff .
    destroy .

    if {[info exists gitktmpdir]} {
        catch {file delete -force $gitktmpdir}
    }
}

proc mkfontdisp {font top which} {
    global fontattr fontpref $font

    set fontpref($font) [set $font]
    ttk::button $top.${font}but -text $which \
        -command [list choosefont $font $which]
    ttk::label $top.$font -relief flat -font $font \
        -text $fontattr($font,family) -justify left
    grid x $top.${font}but $top.$font -sticky w
}

proc centertext {w} {
    $w coords text [expr {[winfo width $w] / 2}] [expr {[winfo height $w] / 2}]
}

proc fontok {} {
    global fontparam fontpref prefstop

    set f $fontparam(font)
    set fontpref($f) [list $fontparam(family) $fontparam(size)]
    if {$fontparam(weight) eq "bold"} {
        lappend fontpref($f) "bold"
    }
    if {$fontparam(slant) eq "italic"} {
        lappend fontpref($f) "italic"
    }
    set w $prefstop.notebook.fonts.$f
    $w conf -text $fontparam(family) -font $fontpref($f)

    fontcan
}

proc fontcan {} {
    global fonttop fontparam

    if {[info exists fonttop]} {
        catch {destroy $fonttop}
        catch {font delete sample}
        unset fonttop
        unset fontparam
    }
}

proc choosefont {font which} {
    tk fontchooser configure -title $which -font $font \
        -command [list on_choosefont $font $which]
    tk fontchooser show
}
proc on_choosefont {font which newfont} {
    global fontparam
    array set f [font actual $newfont]
    set fontparam(which) $which
    set fontparam(font) $font
    set fontparam(family) $f(-family)
    set fontparam(size) $f(-size)
    set fontparam(weight) $f(-weight)
    set fontparam(slant) $f(-slant)
    fontok
}

proc selfontfam {} {
    global fonttop fontparam

    set i [$fonttop.f.fam curselection]
    if {$i ne {}} {
        set fontparam(family) [$fonttop.f.fam get $i]
    }
}

proc chg_fontparam {v sub op} {
    global fontparam

    font config sample -$sub $fontparam($sub)
}

# Create a property sheet tab page
proc create_prefs_page {w} {
    ttk::frame $w
}

proc prefspage_general {notebook} {
    global {*}$::config_variables
    global hashlength

    set page [create_prefs_page $notebook.general]

    ttk::label $page.ldisp -text [mc "Commit list display options"] -font mainfontbold
    grid $page.ldisp - -sticky w -pady 10
    ttk::label $page.spacer -text " "
    ttk::label $page.maxwidthl -text [mc "Maximum graph width (lines)"]
    spinbox $page.maxwidth -from 0 -to 100 -width 4 -textvariable maxwidth
    grid $page.spacer $page.maxwidthl $page.maxwidth -sticky w
                                         #xgettext:no-tcl-format
    ttk::label $page.maxpctl -text [mc "Maximum graph width (% of pane)"]
    spinbox $page.maxpct -from 1 -to 100 -width 4 -textvariable maxgraphpct
    grid x $page.maxpctl $page.maxpct -sticky w
    ttk::checkbutton $page.showlocal -text [mc "Show local changes"] \
        -variable showlocalchanges
    grid x $page.showlocal -sticky w
    ttk::checkbutton $page.hideremotes -text [mc "Hide remote refs"] \
        -variable hideremotes
    grid x $page.hideremotes -sticky w

    ttk::checkbutton $page.autocopy -text [mc "Copy commit ID to clipboard"] \
        -variable autocopy
    grid x $page.autocopy -sticky w
    if {[haveselectionclipboard]} {
        ttk::checkbutton $page.autoselect -text [mc "Copy commit ID to X11 selection"] \
            -variable autoselect
        grid x $page.autoselect -sticky w
    }

    spinbox $page.autosellen -from 1 -to $hashlength -width 4 -textvariable autosellen
    ttk::label $page.autosellenl -text [mc "Length of commit ID to copy"]
    grid x $page.autosellenl $page.autosellen -sticky w
    ttk::label $page.kscroll1 -text [mc "Wheel scrolling multiplier"]
    spinbox $page.kscroll -from 1 -to 20 -width 4 -textvariable kscroll
    grid x $page.kscroll1 $page.kscroll -sticky w

    ttk::label $page.ddisp -text [mc "Diff display options"] -font mainfontbold
    grid $page.ddisp - -sticky w -pady 10
    ttk::label $page.tabstopl -text [mc "Tab spacing"]
    spinbox $page.tabstop -from 1 -to 20 -width 4 -textvariable tabstop
    grid x $page.tabstopl $page.tabstop -sticky w

    ttk::label $page.wrapcommentl -text [mc "Wrap comment text"]
    makedroplist $page.wrapcomment wrapcomment none char word
    grid x $page.wrapcommentl $page.wrapcomment -sticky w

    ttk::label $page.wrapdefaultl -text [mc "Wrap other text"]
    makedroplist $page.wrapdefault wrapdefault none char word
    grid x $page.wrapdefaultl $page.wrapdefault -sticky w

    ttk::checkbutton $page.ntag -text [mc "Display nearby tags/heads"] \
        -variable showneartags
    grid x $page.ntag -sticky w
    ttk::label $page.maxrefsl -text [mc "Maximum # tags/heads to show"]
    spinbox $page.maxrefs -from 1 -to 1000 -width 4 -textvariable maxrefs
    grid x $page.maxrefsl $page.maxrefs -sticky w
    ttk::checkbutton $page.ldiff -text [mc "Limit diffs to listed paths"] \
        -variable limitdiffs
    grid x $page.ldiff -sticky w
    ttk::checkbutton $page.lattr -text [mc "Support per-file encodings"] \
        -variable perfile_attrs
    grid x $page.lattr -sticky w

    ttk::entry $page.extdifft -textvariable extdifftool
    ttk::frame $page.extdifff
    ttk::label $page.extdifff.l -text [mc "External diff tool" ]
    ttk::button $page.extdifff.b -text [mc "Choose..."] -command choose_extdiff
    pack $page.extdifff.l $page.extdifff.b -side left
    pack configure $page.extdifff.l -padx 10
    grid x $page.extdifff $page.extdifft -sticky ew

    ttk::entry $page.webbrowser -textvariable web_browser
    ttk::frame $page.webbrowserf
    ttk::label $page.webbrowserf.l -text [mc "Web browser" ]
    pack $page.webbrowserf.l -side left
    pack configure $page.webbrowserf.l -padx 10
    grid x $page.webbrowserf $page.webbrowser -sticky ew

    return $page
}

proc prefspage_colors {notebook} {
    global uicolor bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor
    global diffbgcolors

    set page [create_prefs_page $notebook.colors]

    ttk::label $page.cdisp -text [mc "Colors: press to choose"] -font mainfontbold
    grid $page.cdisp - -sticky w -pady 10
    label $page.ui -padx 40 -relief sunk -background $uicolor
    ttk::button $page.uibut -text [mc "Interface"] \
       -command [list choosecolor uicolor {} $page.ui [mc "interface"] setui]
    grid x $page.uibut $page.ui -sticky w
    label $page.bg -padx 40 -relief sunk -background $bgcolor
    ttk::button $page.bgbut -text [mc "Background"] \
        -command [list choosecolor bgcolor {} $page.bg [mc "background"] setbg]
    grid x $page.bgbut $page.bg -sticky w
    label $page.fg -padx 40 -relief sunk -background $fgcolor
    ttk::button $page.fgbut -text [mc "Foreground"] \
        -command [list choosecolor fgcolor {} $page.fg [mc "foreground"] setfg]
    grid x $page.fgbut $page.fg -sticky w
    label $page.diffold -padx 40 -relief sunk -background [lindex $diffcolors 0]
    ttk::button $page.diffoldbut -text [mc "Diff: old lines"] \
        -command [list choosecolor diffcolors 0 $page.diffold [mc "diff old lines"] \
                      [list $ctext tag conf d0 -foreground]]
    grid x $page.diffoldbut $page.diffold -sticky w
    label $page.diffoldbg -padx 40 -relief sunk -background [lindex $diffbgcolors 0]
    ttk::button $page.diffoldbgbut -text [mc "Diff: old lines bg"] \
        -command [list choosecolor diffbgcolors 0 $page.diffoldbg \
                      [mc "diff old lines bg"] \
                      [list $ctext tag conf d0 -background]]
    grid x $page.diffoldbgbut $page.diffoldbg -sticky w
    label $page.diffnew -padx 40 -relief sunk -background [lindex $diffcolors 1]
    ttk::button $page.diffnewbut -text [mc "Diff: new lines"] \
        -command [list choosecolor diffcolors 1 $page.diffnew [mc "diff new lines"] \
                      [list $ctext tag conf dresult -foreground]]
    grid x $page.diffnewbut $page.diffnew -sticky w
    label $page.diffnewbg -padx 40 -relief sunk -background [lindex $diffbgcolors 1]
    ttk::button $page.diffnewbgbut -text [mc "Diff: new lines bg"] \
        -command [list choosecolor diffbgcolors 1 $page.diffnewbg \
                      [mc "diff new lines bg"] \
                      [list $ctext tag conf dresult -background]]
    grid x $page.diffnewbgbut $page.diffnewbg -sticky w
    label $page.hunksep -padx 40 -relief sunk -background [lindex $diffcolors 2]
    ttk::button $page.hunksepbut -text [mc "Diff: hunk header"] \
        -command [list choosecolor diffcolors 2 $page.hunksep \
                      [mc "diff hunk header"] \
                      [list $ctext tag conf hunksep -foreground]]
    grid x $page.hunksepbut $page.hunksep -sticky w
    label $page.markbgsep -padx 40 -relief sunk -background $markbgcolor
    ttk::button $page.markbgbut -text [mc "Marked line bg"] \
        -command [list choosecolor markbgcolor {} $page.markbgsep \
                      [mc "marked line background"] \
                      [list $ctext tag conf omark -background]]
    grid x $page.markbgbut $page.markbgsep -sticky w
    label $page.selbgsep -padx 40 -relief sunk -background $selectbgcolor
    ttk::button $page.selbgbut -text [mc "Select bg"] \
        -command [list choosecolor selectbgcolor {} $page.selbgsep [mc "background"] setselbg]
    grid x $page.selbgbut $page.selbgsep -sticky w
    return $page
}

proc prefspage_fonts {notebook} {
    set page [create_prefs_page $notebook.fonts]
    ttk::label $page.cfont -text [mc "Fonts: press to choose"] -font mainfontbold
    grid $page.cfont - -sticky w -pady 10
    mkfontdisp mainfont $page [mc "Main font"]
    mkfontdisp textfont $page [mc "Diff display font"]
    mkfontdisp uifont $page [mc "User interface font"]
    return $page
}

proc doprefs {} {
    global oldprefs prefstop
    global {*}$::config_variables

    set top .gitkprefs
    set prefstop $top
    if {[winfo exists $top]} {
        raise $top
        return
    }
    foreach v $::config_variables {
        set oldprefs($v) [set $v]
    }
    ttk_toplevel $top
    wm title $top [mc "Gitk preferences"]
    make_transient $top .

    set notebook [ttk::notebook $top.notebook]

    lappend pages [prefspage_general $notebook] [mc "General"]
    lappend pages [prefspage_colors $notebook] [mc "Colors"]
    lappend pages [prefspage_fonts $notebook] [mc "Fonts"]
    set col 0
    foreach {page title} $pages {
        $notebook add $page -text $title
    }

    grid columnconfigure $notebook 0 -weight 1
    grid rowconfigure $notebook 1 -weight 1
    raise [lindex $pages 0]

    grid $notebook -sticky news -padx 2 -pady 2
    grid rowconfigure $top 0 -weight 1
    grid columnconfigure $top 0 -weight 1

    ttk::frame $top.buts
    ttk::button $top.buts.ok -text [mc "OK"] -command prefsok -default active
    ttk::button $top.buts.can -text [mc "Cancel"] -command prefscan -default normal
    bind $top <Key-Return> prefsok
    bind $top <Key-Escape> prefscan
    grid $top.buts.ok $top.buts.can
    grid columnconfigure $top.buts 0 -weight 1 -uniform a
    grid columnconfigure $top.buts 1 -weight 1 -uniform a
    grid $top.buts - - -pady 10 -sticky ew
    grid columnconfigure $top 2 -weight 1
    bind $top <Visibility> [list focus $top.buts.ok]
}

proc choose_extdiff {} {
    global extdifftool

    set prog [tk_getOpenFile -title [mc "External diff tool"] -multiple false]
    if {$prog ne {}} {
        set extdifftool $prog
    }
}

proc choosecolor {v vi w x cmd} {
    global $v

    set c [tk_chooseColor -initialcolor [lindex [set $v] $vi] \
               -title [mc "Gitk: choose color for %s" $x]]
    if {$c eq {}} return
    $w conf -background $c
    lset $v $vi $c
    eval $cmd $c
}

proc setselbg {c} {
    global bglist cflist
    foreach w $bglist {
        if {[winfo exists $w]} {
            $w configure -selectbackground $c
        }
    }
    $cflist tag configure highlight \
        -background [$cflist cget -selectbackground]
    allcanvs itemconf secsel -fill $c
}

# This sets the background color and the color scheme for the whole UI.
# For some reason, tk_setPalette chooses a nasty dark red for selectColor
# if we don't specify one ourselves, which makes the checkbuttons and
# radiobuttons look bad.  This chooses white for selectColor if the
# background color is light, or black if it is dark.
proc setui {c} {
    if {[tk windowingsystem] eq "win32"} { return }
    set bg [winfo rgb . $c]
    set selc black
    if {[lindex $bg 0] + 1.5 * [lindex $bg 1] + 0.5 * [lindex $bg 2] > 100000} {
        set selc white
    }
    tk_setPalette background $c selectColor $selc
}

proc setbg {c} {
    global bglist

    foreach w $bglist {
        if {[winfo exists $w]} {
            $w conf -background $c
        }
    }
}

proc setfg {c} {
    global fglist canv

    foreach w $fglist {
        if {[winfo exists $w]} {
            $w conf -foreground $c
        }
    }
    allcanvs itemconf text -fill $c
    $canv itemconf circle -outline $c
    $canv itemconf markid -outline $c
}

proc prefscan {} {
    global oldprefs prefstop
    global {*}$::config_variables

    foreach v $::config_variables {
        set $v $oldprefs($v)
    }
    catch {destroy $prefstop}
    unset prefstop
    fontcan
}

proc prefsok {} {
    global oldprefs prefstop fontpref treediffs
    global {*}$::config_variables
    global ctext

    catch {destroy $prefstop}
    unset prefstop
    fontcan
    set fontchanged 0
    if {$mainfont ne $fontpref(mainfont)} {
        set mainfont $fontpref(mainfont)
        parsefont mainfont $mainfont
        eval font configure mainfont [fontflags mainfont]
        eval font configure mainfontbold [fontflags mainfont 1]
        setcoords
        set fontchanged 1
    }
    if {$textfont ne $fontpref(textfont)} {
        set textfont $fontpref(textfont)
        parsefont textfont $textfont
        eval font configure textfont [fontflags textfont]
        eval font configure textfontbold [fontflags textfont 1]
    }
    if {$uifont ne $fontpref(uifont)} {
        set uifont $fontpref(uifont)
        parsefont uifont $uifont
        eval font configure uifont [fontflags uifont]
    }
    settabs
    if {$showlocalchanges != $oldprefs(showlocalchanges)} {
        if {$showlocalchanges} {
            doshowlocalchanges
        } else {
            dohidelocalchanges
        }
    }
    if {$limitdiffs != $oldprefs(limitdiffs) ||
        ($perfile_attrs && !$oldprefs(perfile_attrs))} {
        # treediffs elements are limited by path;
        # won't have encodings cached if perfile_attrs was just turned on
        unset -nocomplain treediffs
    }
    if {$fontchanged || $maxwidth != $oldprefs(maxwidth)
        || $maxgraphpct != $oldprefs(maxgraphpct)} {
        redisplay
    } elseif {$showneartags != $oldprefs(showneartags) ||
          $limitdiffs != $oldprefs(limitdiffs)} {
        reselectline
    }
    if {$hideremotes != $oldprefs(hideremotes)} {
        rereadrefs
    }
    if {$wrapcomment != $oldprefs(wrapcomment)} {
        $ctext tag conf comment -wrap $wrapcomment
    }
    if {$wrapdefault != $oldprefs(wrapdefault)} {
        $ctext configure -wrap $wrapdefault
    }
}

proc formatdate {d} {
    global datetimeformat
    if {$d ne {}} {
        # If $datetimeformat includes a timezone, display in the
        # timezone of the argument.  Otherwise, display in local time.
        if {[string match {*%[zZ]*} $datetimeformat]} {
            if {[catch {set d [clock format [lindex $d 0] -timezone [lindex $d 1] -format $datetimeformat]}]} {
                # Tcl < 8.5 does not support -timezone.  Emulate it by
                # setting TZ (e.g. TZ=<-0430>+04:30).
                global env
                if {[info exists env(TZ)]} {
                    set savedTZ $env(TZ)
                }
                set zone [lindex $d 1]
                set sign [string map {+ - - +} [string index $zone 0]]
                set env(TZ) <$zone>$sign[string range $zone 1 2]:[string range $zone 3 4]
                set d [clock format [lindex $d 0] -format $datetimeformat]
                if {[info exists savedTZ]} {
                    set env(TZ) $savedTZ
                } else {
                    unset env(TZ)
                }
            }
        } else {
            set d [clock format [lindex $d 0] -format $datetimeformat]
        }
    }
    return $d
}

# This list of encoding names and aliases is distilled from
# https://www.iana.org/assignments/character-sets.
# Not all of them are supported by Tcl.
set encoding_aliases {
    { ANSI_X3.4-1968 iso-ir-6 ANSI_X3.4-1986 ISO_646.irv:1991 ASCII
      ISO646-US US-ASCII us IBM367 cp367 csASCII }
    { ISO-10646-UTF-1 csISO10646UTF1 }
    { ISO_646.basic:1983 ref csISO646basic1983 }
    { INVARIANT csINVARIANT }
    { ISO_646.irv:1983 iso-ir-2 irv csISO2IntlRefVersion }
    { BS_4730 iso-ir-4 ISO646-GB gb uk csISO4UnitedKingdom }
    { NATS-SEFI iso-ir-8-1 csNATSSEFI }
    { NATS-SEFI-ADD iso-ir-8-2 csNATSSEFIADD }
    { NATS-DANO iso-ir-9-1 csNATSDANO }
    { NATS-DANO-ADD iso-ir-9-2 csNATSDANOADD }
    { SEN_850200_B iso-ir-10 FI ISO646-FI ISO646-SE se csISO10Swedish }
    { SEN_850200_C iso-ir-11 ISO646-SE2 se2 csISO11SwedishForNames }
    { KS_C_5601-1987 iso-ir-149 KS_C_5601-1989 KSC_5601 korean csKSC56011987 }
    { ISO-2022-KR csISO2022KR }
    { EUC-KR csEUCKR }
    { ISO-2022-JP csISO2022JP }
    { ISO-2022-JP-2 csISO2022JP2 }
    { JIS_C6220-1969-jp JIS_C6220-1969 iso-ir-13 katakana x0201-7
      csISO13JISC6220jp }
    { JIS_C6220-1969-ro iso-ir-14 jp ISO646-JP csISO14JISC6220ro }
    { IT iso-ir-15 ISO646-IT csISO15Italian }
    { PT iso-ir-16 ISO646-PT csISO16Portuguese }
    { ES iso-ir-17 ISO646-ES csISO17Spanish }
    { greek7-old iso-ir-18 csISO18Greek7Old }
    { latin-greek iso-ir-19 csISO19LatinGreek }
    { DIN_66003 iso-ir-21 de ISO646-DE csISO21German }
    { NF_Z_62-010_(1973) iso-ir-25 ISO646-FR1 csISO25French }
    { Latin-greek-1 iso-ir-27 csISO27LatinGreek1 }
    { ISO_5427 iso-ir-37 csISO5427Cyrillic }
    { JIS_C6226-1978 iso-ir-42 csISO42JISC62261978 }
    { BS_viewdata iso-ir-47 csISO47BSViewdata }
    { INIS iso-ir-49 csISO49INIS }
    { INIS-8 iso-ir-50 csISO50INIS8 }
    { INIS-cyrillic iso-ir-51 csISO51INISCyrillic }
    { ISO_5427:1981 iso-ir-54 ISO5427Cyrillic1981 }
    { ISO_5428:1980 iso-ir-55 csISO5428Greek }
    { GB_1988-80 iso-ir-57 cn ISO646-CN csISO57GB1988 }
    { GB_2312-80 iso-ir-58 chinese csISO58GB231280 }
    { NS_4551-1 iso-ir-60 ISO646-NO no csISO60DanishNorwegian
      csISO60Norwegian1 }
    { NS_4551-2 ISO646-NO2 iso-ir-61 no2 csISO61Norwegian2 }
    { NF_Z_62-010 iso-ir-69 ISO646-FR fr csISO69French }
    { videotex-suppl iso-ir-70 csISO70VideotexSupp1 }
    { PT2 iso-ir-84 ISO646-PT2 csISO84Portuguese2 }
    { ES2 iso-ir-85 ISO646-ES2 csISO85Spanish2 }
    { MSZ_7795.3 iso-ir-86 ISO646-HU hu csISO86Hungarian }
    { JIS_C6226-1983 iso-ir-87 x0208 JIS_X0208-1983 csISO87JISX0208 }
    { greek7 iso-ir-88 csISO88Greek7 }
    { ASMO_449 ISO_9036 arabic7 iso-ir-89 csISO89ASMO449 }
    { iso-ir-90 csISO90 }
    { JIS_C6229-1984-a iso-ir-91 jp-ocr-a csISO91JISC62291984a }
    { JIS_C6229-1984-b iso-ir-92 ISO646-JP-OCR-B jp-ocr-b
      csISO92JISC62991984b }
    { JIS_C6229-1984-b-add iso-ir-93 jp-ocr-b-add csISO93JIS62291984badd }
    { JIS_C6229-1984-hand iso-ir-94 jp-ocr-hand csISO94JIS62291984hand }
    { JIS_C6229-1984-hand-add iso-ir-95 jp-ocr-hand-add
      csISO95JIS62291984handadd }
    { JIS_C6229-1984-kana iso-ir-96 csISO96JISC62291984kana }
    { ISO_2033-1983 iso-ir-98 e13b csISO2033 }
    { ANSI_X3.110-1983 iso-ir-99 CSA_T500-1983 NAPLPS csISO99NAPLPS }
    { ISO_8859-1:1987 iso-ir-100 ISO_8859-1 ISO-8859-1 latin1 l1 IBM819
      CP819 csISOLatin1 }
    { ISO_8859-2:1987 iso-ir-101 ISO_8859-2 ISO-8859-2 latin2 l2 csISOLatin2 }
    { T.61-7bit iso-ir-102 csISO102T617bit }
    { T.61-8bit T.61 iso-ir-103 csISO103T618bit }
    { ISO_8859-3:1988 iso-ir-109 ISO_8859-3 ISO-8859-3 latin3 l3 csISOLatin3 }
    { ISO_8859-4:1988 iso-ir-110 ISO_8859-4 ISO-8859-4 latin4 l4 csISOLatin4 }
    { ECMA-cyrillic iso-ir-111 KOI8-E csISO111ECMACyrillic }
    { CSA_Z243.4-1985-1 iso-ir-121 ISO646-CA csa7-1 ca csISO121Canadian1 }
    { CSA_Z243.4-1985-2 iso-ir-122 ISO646-CA2 csa7-2 csISO122Canadian2 }
    { CSA_Z243.4-1985-gr iso-ir-123 csISO123CSAZ24341985gr }
    { ISO_8859-6:1987 iso-ir-127 ISO_8859-6 ISO-8859-6 ECMA-114 ASMO-708
      arabic csISOLatinArabic }
    { ISO_8859-6-E csISO88596E ISO-8859-6-E }
    { ISO_8859-6-I csISO88596I ISO-8859-6-I }
    { ISO_8859-7:1987 iso-ir-126 ISO_8859-7 ISO-8859-7 ELOT_928 ECMA-118
      greek greek8 csISOLatinGreek }
    { T.101-G2 iso-ir-128 csISO128T101G2 }
    { ISO_8859-8:1988 iso-ir-138 ISO_8859-8 ISO-8859-8 hebrew
      csISOLatinHebrew }
    { ISO_8859-8-E csISO88598E ISO-8859-8-E }
    { ISO_8859-8-I csISO88598I ISO-8859-8-I }
    { CSN_369103 iso-ir-139 csISO139CSN369103 }
    { JUS_I.B1.002 iso-ir-141 ISO646-YU js yu csISO141JUSIB1002 }
    { ISO_6937-2-add iso-ir-142 csISOTextComm }
    { IEC_P27-1 iso-ir-143 csISO143IECP271 }
    { ISO_8859-5:1988 iso-ir-144 ISO_8859-5 ISO-8859-5 cyrillic
      csISOLatinCyrillic }
    { JUS_I.B1.003-serb iso-ir-146 serbian csISO146Serbian }
    { JUS_I.B1.003-mac macedonian iso-ir-147 csISO147Macedonian }
    { ISO_8859-9:1989 iso-ir-148 ISO_8859-9 ISO-8859-9 latin5 l5 csISOLatin5 }
    { greek-ccitt iso-ir-150 csISO150 csISO150GreekCCITT }
    { NC_NC00-10:81 cuba iso-ir-151 ISO646-CU csISO151Cuba }
    { ISO_6937-2-25 iso-ir-152 csISO6937Add }
    { GOST_19768-74 ST_SEV_358-88 iso-ir-153 csISO153GOST1976874 }
    { ISO_8859-supp iso-ir-154 latin1-2-5 csISO8859Supp }
    { ISO_10367-box iso-ir-155 csISO10367Box }
    { ISO-8859-10 iso-ir-157 l6 ISO_8859-10:1992 csISOLatin6 latin6 }
    { latin-lap lap iso-ir-158 csISO158Lap }
    { JIS_X0212-1990 x0212 iso-ir-159 csISO159JISX02121990 }
    { DS_2089 DS2089 ISO646-DK dk csISO646Danish }
    { us-dk csUSDK }
    { dk-us csDKUS }
    { JIS_X0201 X0201 csHalfWidthKatakana }
    { KSC5636 ISO646-KR csKSC5636 }
    { ISO-10646-UCS-2 csUnicode }
    { ISO-10646-UCS-4 csUCS4 }
    { DEC-MCS dec csDECMCS }
    { hp-roman8 roman8 r8 csHPRoman8 }
    { macintosh mac csMacintosh }
    { IBM037 cp037 ebcdic-cp-us ebcdic-cp-ca ebcdic-cp-wt ebcdic-cp-nl
      csIBM037 }
    { IBM038 EBCDIC-INT cp038 csIBM038 }
    { IBM273 CP273 csIBM273 }
    { IBM274 EBCDIC-BE CP274 csIBM274 }
    { IBM275 EBCDIC-BR cp275 csIBM275 }
    { IBM277 EBCDIC-CP-DK EBCDIC-CP-NO csIBM277 }
    { IBM278 CP278 ebcdic-cp-fi ebcdic-cp-se csIBM278 }
    { IBM280 CP280 ebcdic-cp-it csIBM280 }
    { IBM281 EBCDIC-JP-E cp281 csIBM281 }
    { IBM284 CP284 ebcdic-cp-es csIBM284 }
    { IBM285 CP285 ebcdic-cp-gb csIBM285 }
    { IBM290 cp290 EBCDIC-JP-kana csIBM290 }
    { IBM297 cp297 ebcdic-cp-fr csIBM297 }
    { IBM420 cp420 ebcdic-cp-ar1 csIBM420 }
    { IBM423 cp423 ebcdic-cp-gr csIBM423 }
    { IBM424 cp424 ebcdic-cp-he csIBM424 }
    { IBM437 cp437 437 csPC8CodePage437 }
    { IBM500 CP500 ebcdic-cp-be ebcdic-cp-ch csIBM500 }
    { IBM775 cp775 csPC775Baltic }
    { IBM850 cp850 850 csPC850Multilingual }
    { IBM851 cp851 851 csIBM851 }
    { IBM852 cp852 852 csPCp852 }
    { IBM855 cp855 855 csIBM855 }
    { IBM857 cp857 857 csIBM857 }
    { IBM860 cp860 860 csIBM860 }
    { IBM861 cp861 861 cp-is csIBM861 }
    { IBM862 cp862 862 csPC862LatinHebrew }
    { IBM863 cp863 863 csIBM863 }
    { IBM864 cp864 csIBM864 }
    { IBM865 cp865 865 csIBM865 }
    { IBM866 cp866 866 csIBM866 }
    { IBM868 CP868 cp-ar csIBM868 }
    { IBM869 cp869 869 cp-gr csIBM869 }
    { IBM870 CP870 ebcdic-cp-roece ebcdic-cp-yu csIBM870 }
    { IBM871 CP871 ebcdic-cp-is csIBM871 }
    { IBM880 cp880 EBCDIC-Cyrillic csIBM880 }
    { IBM891 cp891 csIBM891 }
    { IBM903 cp903 csIBM903 }
    { IBM904 cp904 904 csIBBM904 }
    { IBM905 CP905 ebcdic-cp-tr csIBM905 }
    { IBM918 CP918 ebcdic-cp-ar2 csIBM918 }
    { IBM1026 CP1026 csIBM1026 }
    { EBCDIC-AT-DE csIBMEBCDICATDE }
    { EBCDIC-AT-DE-A csEBCDICATDEA }
    { EBCDIC-CA-FR csEBCDICCAFR }
    { EBCDIC-DK-NO csEBCDICDKNO }
    { EBCDIC-DK-NO-A csEBCDICDKNOA }
    { EBCDIC-FI-SE csEBCDICFISE }
    { EBCDIC-FI-SE-A csEBCDICFISEA }
    { EBCDIC-FR csEBCDICFR }
    { EBCDIC-IT csEBCDICIT }
    { EBCDIC-PT csEBCDICPT }
    { EBCDIC-ES csEBCDICES }
    { EBCDIC-ES-A csEBCDICESA }
    { EBCDIC-ES-S csEBCDICESS }
    { EBCDIC-UK csEBCDICUK }
    { EBCDIC-US csEBCDICUS }
    { UNKNOWN-8BIT csUnknown8BiT }
    { MNEMONIC csMnemonic }
    { MNEM csMnem }
    { VISCII csVISCII }
    { VIQR csVIQR }
    { KOI8-R csKOI8R }
    { IBM00858 CCSID00858 CP00858 PC-Multilingual-850+euro }
    { IBM00924 CCSID00924 CP00924 ebcdic-Latin9--euro }
    { IBM01140 CCSID01140 CP01140 ebcdic-us-37+euro }
    { IBM01141 CCSID01141 CP01141 ebcdic-de-273+euro }
    { IBM01142 CCSID01142 CP01142 ebcdic-dk-277+euro ebcdic-no-277+euro }
    { IBM01143 CCSID01143 CP01143 ebcdic-fi-278+euro ebcdic-se-278+euro }
    { IBM01144 CCSID01144 CP01144 ebcdic-it-280+euro }
    { IBM01145 CCSID01145 CP01145 ebcdic-es-284+euro }
    { IBM01146 CCSID01146 CP01146 ebcdic-gb-285+euro }
    { IBM01147 CCSID01147 CP01147 ebcdic-fr-297+euro }
    { IBM01148 CCSID01148 CP01148 ebcdic-international-500+euro }
    { IBM01149 CCSID01149 CP01149 ebcdic-is-871+euro }
    { IBM1047 IBM-1047 }
    { PTCP154 csPTCP154 PT154 CP154 Cyrillic-Asian }
    { Amiga-1251 Ami1251 Amiga1251 Ami-1251 }
    { UNICODE-1-1 csUnicode11 }
    { CESU-8 csCESU-8 }
    { BOCU-1 csBOCU-1 }
    { UNICODE-1-1-UTF-7 csUnicode11UTF7 }
    { ISO-8859-14 iso-ir-199 ISO_8859-14:1998 ISO_8859-14 latin8 iso-celtic
      l8 }
    { ISO-8859-15 ISO_8859-15 Latin-9 }
    { ISO-8859-16 iso-ir-226 ISO_8859-16:2001 ISO_8859-16 latin10 l10 }
    { GBK CP936 MS936 windows-936 }
    { JIS_Encoding csJISEncoding }
    { Shift_JIS MS_Kanji csShiftJIS ShiftJIS Shift-JIS }
    { Extended_UNIX_Code_Packed_Format_for_Japanese csEUCPkdFmtJapanese
      EUC-JP }
    { Extended_UNIX_Code_Fixed_Width_for_Japanese csEUCFixWidJapanese }
    { ISO-10646-UCS-Basic csUnicodeASCII }
    { ISO-10646-Unicode-Latin1 csUnicodeLatin1 ISO-10646 }
    { ISO-Unicode-IBM-1261 csUnicodeIBM1261 }
    { ISO-Unicode-IBM-1268 csUnicodeIBM1268 }
    { ISO-Unicode-IBM-1276 csUnicodeIBM1276 }
    { ISO-Unicode-IBM-1264 csUnicodeIBM1264 }
    { ISO-Unicode-IBM-1265 csUnicodeIBM1265 }
    { ISO-8859-1-Windows-3.0-Latin-1 csWindows30Latin1 }
    { ISO-8859-1-Windows-3.1-Latin-1 csWindows31Latin1 }
    { ISO-8859-2-Windows-Latin-2 csWindows31Latin2 }
    { ISO-8859-9-Windows-Latin-5 csWindows31Latin5 }
    { Adobe-Standard-Encoding csAdobeStandardEncoding }
    { Ventura-US csVenturaUS }
    { Ventura-International csVenturaInternational }
    { PC8-Danish-Norwegian csPC8DanishNorwegian }
    { PC8-Turkish csPC8Turkish }
    { IBM-Symbols csIBMSymbols }
    { IBM-Thai csIBMThai }
    { HP-Legal csHPLegal }
    { HP-Pi-font csHPPiFont }
    { HP-Math8 csHPMath8 }
    { Adobe-Symbol-Encoding csHPPSMath }
    { HP-DeskTop csHPDesktop }
    { Ventura-Math csVenturaMath }
    { Microsoft-Publishing csMicrosoftPublishing }
    { Windows-31J csWindows31J }
    { GB2312 csGB2312 }
    { Big5 csBig5 }
}

proc tcl_encoding {enc} {
    global encoding_aliases tcl_encoding_cache
    if {[info exists tcl_encoding_cache($enc)]} {
        return $tcl_encoding_cache($enc)
    }
    set names [encoding names]
    set lcnames [string tolower $names]
    set enc [string tolower $enc]
    set i [lsearch -exact $lcnames $enc]
    if {$i < 0} {
        # look for "isonnn" instead of "iso-nnn" or "iso_nnn"
        if {[regsub {^(iso|cp|ibm|jis)[-_]} $enc {\1} encx]} {
            set i [lsearch -exact $lcnames $encx]
        }
    }
    if {$i < 0} {
        foreach l $encoding_aliases {
            set ll [string tolower $l]
            if {[lsearch -exact $ll $enc] < 0} continue
            # look through the aliases for one that tcl knows about
            foreach e $ll {
                set i [lsearch -exact $lcnames $e]
                if {$i < 0} {
                    if {[regsub {^(iso|cp|ibm|jis)[-_]} $e {\1} ex]} {
                        set i [lsearch -exact $lcnames $ex]
                    }
                }
                if {$i >= 0} break
            }
            break
        }
    }
    set tclenc {}
    if {$i >= 0} {
        set tclenc [lindex $names $i]
    }
    set tcl_encoding_cache($enc) $tclenc
    return $tclenc
}

proc gitattr {path attr default} {
    global path_attr_cache
    if {[info exists path_attr_cache($attr,$path)]} {
        set r $path_attr_cache($attr,$path)
    } else {
        set r "unspecified"
        if {![catch {set line [safe_exec [list git check-attr $attr -- $path]]}]} {
            regexp "(.*): $attr: (.*)" $line m f r
        }
        set path_attr_cache($attr,$path) $r
    }
    if {$r eq "unspecified"} {
        return $default
    }
    return $r
}

proc cache_gitattr {attr pathlist} {
    global path_attr_cache
    set newlist {}
    foreach path $pathlist {
        if {![info exists path_attr_cache($attr,$path)]} {
            lappend newlist $path
        }
    }
    set lim 1000
    if {[tk windowingsystem] == "win32"} {
        # windows has a 32k limit on the arguments to a command...
        set lim 30
    }
    while {$newlist ne {}} {
        set head [lrange $newlist 0 [expr {$lim - 1}]]
        set newlist [lrange $newlist $lim end]
        if {![catch {set rlist [safe_exec [concat git check-attr $attr -- $head]]}]} {
            foreach row [split $rlist "\n"] {
                if {[regexp "(.*): $attr: (.*)" $row m path value]} {
                    if {[string index $path 0] eq "\""} {
                        set path [encoding convertfrom utf-8 [lindex $path 0]]
                    }
                    set path_attr_cache($attr,$path) $value
                }
            }
        }
    }
}

proc get_path_encoding {path} {
    global gui_encoding perfile_attrs
    set tcl_enc $gui_encoding
    if {$path ne {} && $perfile_attrs} {
        set enc2 [tcl_encoding [gitattr $path encoding $tcl_enc]]
        if {$enc2 ne {}} {
            set tcl_enc $enc2
        }
    }
    return $tcl_enc
}

## For msgcat loading, first locate the installation location.
if { [info exists ::env(GITK_MSGSDIR)] } {
    ## Msgsdir was manually set in the environment.
    set gitk_msgsdir $::env(GITK_MSGSDIR)
} else {
    ## Let's guess the prefix from argv0.
    set gitk_prefix [file dirname [file dirname [file normalize $argv0]]]
    set gitk_libdir [file join $gitk_prefix share gitk lib]
    set gitk_msgsdir [file join $gitk_libdir msgs]
}

## Internationalization (i18n) through msgcat and gettext. See
## http://www.gnu.org/software/gettext/manual/html_node/Tcl.html
package require msgcat
namespace import ::msgcat::mc
## And eventually load the actual message catalog
::msgcat::mcload $gitk_msgsdir

# on OSX bring the current Wish process window to front
if {[tk windowingsystem] eq "aqua"} {
    safe_exec [list osascript -e [format {
        tell application "System Events"
            set frontmost of processes whose unix id is %d to true
        end tell
    } [pid] ]]
}

# Unset GIT_TRACE var if set
if { [info exists ::env(GIT_TRACE)] } {
    unset ::env(GIT_TRACE)
}

# defaults...
set wrcomcmd "git diff-tree --stdin -p --pretty=email"

set gitencoding {}
catch {
    set gitencoding [exec git config --get i18n.commitencoding]
}
catch {
    set gitencoding [exec git config --get i18n.logoutputencoding]
}
if {$gitencoding == ""} {
    set gitencoding "utf-8"
}
set tclencoding [tcl_encoding $gitencoding]
if {$tclencoding == {}} {
    puts stderr "Warning: encoding $gitencoding is not supported by Tcl/Tk"
}

set gui_encoding [encoding system]
catch {
    set enc [exec git config --get gui.encoding]
    if {$enc ne {}} {
        set tclenc [tcl_encoding $enc]
        if {$tclenc ne {}} {
            set gui_encoding $tclenc
        } else {
            puts stderr "Warning: encoding $enc is not supported by Tcl/Tk"
        }
    }
}

# Use object format as hash algorightm (either "sha1" or "sha256")
set hashalgorithm [exec git rev-parse --show-object-format]
if {$hashalgorithm eq "sha1"} {
    set hashlength 40
} elseif {$hashalgorithm eq "sha256"} {
    set hashlength 64
} else {
    puts stderr "Unknown hash algorithm: $hashalgorithm"
    exit 1
}

set log_showroot true
catch {
    set log_showroot [exec git config --bool --get log.showroot]
}

if {[tk windowingsystem] eq "aqua"} {
    set mainfont {{Lucida Grande} 9}
    set textfont {Monaco 9}
    set uifont {{Lucida Grande} 9 bold}
} elseif {![catch {::tk::pkgconfig get fontsystem} xft] && $xft eq "xft"} {
    # fontconfig!
    set mainfont {sans 9}
    set textfont {monospace 9}
    set uifont {sans 9 bold}
} else {
    set mainfont {Helvetica 9}
    set textfont {Courier 9}
    set uifont {Helvetica 9 bold}
}
set tabstop 8
set findmergefiles 0
set maxgraphpct 50
set maxwidth 16
set revlistorder 0
set fastdate 0
set uparrowlen 5
set downarrowlen 5
set mingaplen 100
set cmitmode "patch"
set wrapcomment "none"
set wrapdefault "none"
set showneartags 1
set hideremotes 0
set sortrefsbytype 1
set maxrefs 20
set visiblerefs {"master"}
set maxlinelen 200
set showlocalchanges 1
set limitdiffs 1
set kscroll 3
set datetimeformat "%Y-%m-%d %H:%M:%S"
set autocopy 0
set autoselect 1
set autosellen $hashlength
set perfile_attrs 0

if {[tk windowingsystem] eq "aqua"} {
    set extdifftool "opendiff"
} else {
    set extdifftool "meld"
}

set colors {"#00ff00" red blue magenta darkgrey brown orange}
if {[tk windowingsystem] eq "win32"} {
    set uicolor SystemButtonFace
    set uifgcolor SystemButtonText
    set uifgdisabledcolor SystemDisabledText
    set bgcolor SystemWindow
    set fgcolor SystemWindowText
    set selectbgcolor SystemHighlight
    set web_browser "cmd /c start"
} else {
    set uicolor grey85
    set uifgcolor black
    set uifgdisabledcolor "#999"
    set bgcolor white
    set fgcolor black
    set selectbgcolor gray85
    if {[tk windowingsystem] eq "aqua"} {
        set web_browser "open"
    } else {
        set web_browser "xdg-open"
    }
}
set diffcolors {"#c30000" "#009800" blue}
set diffbgcolors {"#fff3f3" "#f0fff0"}
set diffcontext 3
set mergecolors {red blue "#00ff00" purple brown "#009090" magenta "#808000" "#009000" "#ff0080" cyan "#b07070" "#70b0f0" "#70f0b0" "#f0b070" "#ff70b0"}
set ignorespace 0
set worddiff ""
set markbgcolor "#e0e0ff"

set headbgcolor "#00ff00"
set headfgcolor black
set headoutlinecolor black
set remotebgcolor #ffddaa
set tagbgcolor yellow
set tagfgcolor black
set tagoutlinecolor black
set reflinecolor black
set filesepbgcolor #aaaaaa
set filesepfgcolor black
set linehoverbgcolor #ffff80
set linehoverfgcolor black
set linehoveroutlinecolor black
set mainheadcirclecolor yellow
set workingfilescirclecolor red
set indexcirclecolor "#00ff00"
set circlecolors {white blue gray blue blue}
set linkfgcolor blue
set circleoutlinecolor $fgcolor
set foundbgcolor yellow
set currentsearchhitbgcolor orange

# button for popping up context menus
if {[tk windowingsystem] eq "aqua"} {
    set ctxbut <Button-2>
} else {
    set ctxbut <Button-3>
}

catch {
    # follow the XDG base directory specification by default. See
    # https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
    if {[info exists env(XDG_CONFIG_HOME)] && $env(XDG_CONFIG_HOME) ne ""} {
        # XDG_CONFIG_HOME environment variable is set
        set config_file [file join $env(XDG_CONFIG_HOME) git gitk]
        set config_file_tmp [file join $env(XDG_CONFIG_HOME) git gitk-tmp]
    } else {
        # default XDG_CONFIG_HOME
        set config_file "~/.config/git/gitk"
        set config_file_tmp "~/.config/git/gitk-tmp"
    }
    if {![file exists $config_file]} {
        # for backward compatibility use the old config file if it exists
        if {[file exists "~/.gitk"]} {
            set config_file "~/.gitk"
            set config_file_tmp "~/.gitk-tmp"
        } elseif {![file exists [file dirname $config_file]]} {
            file mkdir [file dirname $config_file]
        }
    }
    source $config_file
}
config_check_tmp_exists 50

set config_variables {
    autocopy
    autoselect
    autosellen
    bgcolor
    circlecolors
    circleoutlinecolor
    cmitmode
    colors
    currentsearchhitbgcolor
    datetimeformat
    diffbgcolors
    diffcolors
    diffcontext
    extdifftool
    fgcolor
    filesepbgcolor
    filesepfgcolor
    findmergefiles
    foundbgcolor
    headbgcolor
    headfgcolor
    headoutlinecolor
    hideremotes
    indexcirclecolor
    kscroll
    limitdiffs
    linehoverbgcolor
    linehoverfgcolor
    linehoveroutlinecolor
    linkfgcolor
    mainfont
    mainheadcirclecolor
    markbgcolor
    maxgraphpct
    maxrefs
    maxwidth
    mergecolors
    perfile_attrs
    reflinecolor
    remotebgcolor
    selectbgcolor
    showlocalchanges
    showneartags
    sortrefsbytype
    tabstop
    tagbgcolor
    tagfgcolor
    tagoutlinecolor
    textfont
    uicolor
    uifgcolor
    uifgdisabledcolor
    uifont
    visiblerefs
    web_browser
    workingfilescirclecolor
    wrapcomment
    wrapdefault
}

foreach var $config_variables {
    config_init_trace $var
    trace add variable $var write config_variable_change_cb
}

parsefont mainfont $mainfont
eval font create mainfont [fontflags mainfont]
eval font create mainfontbold [fontflags mainfont 1]

parsefont textfont $textfont
eval font create textfont [fontflags textfont]
eval font create textfontbold [fontflags textfont 1]

parsefont uifont $uifont
eval font create uifont [fontflags uifont]

setui $uicolor

setoptions

# check that we can find a .git directory somewhere...
if {[catch {set gitdir [exec git rev-parse --git-dir]}]} {
    show_error {} . [mc "Cannot find a git repository here."]
    exit 1
}

set selecthead {}
set selectheadid {}

set revtreeargs {}
set cmdline_files {}
set i 0
set revtreeargscmd {}
foreach arg $argv {
    switch -glob -- $arg {
        "" { }
        "--" {
            set cmdline_files [lrange $argv [expr {$i + 1}] end]
            break
        }
        "--select-commit=*" {
            set selecthead [string range $arg 16 end]
        }
        "--argscmd=*" {
            set revtreeargscmd [string range $arg 10 end]
        }
        default {
            lappend revtreeargs $arg
        }
    }
    incr i
}

if {$selecthead eq "HEAD"} {
    set selecthead {}
}

if {$i >= [llength $argv] && $revtreeargs ne {}} {
    # no -- on command line, but some arguments (other than --argscmd)
    if {[catch {
        set f [safe_exec [concat git rev-parse --no-revs --no-flags $revtreeargs]]
        set cmdline_files [split $f "\n"]
        set n [llength $cmdline_files]
        set revtreeargs [lrange $revtreeargs 0 end-$n]
        # Unfortunately git rev-parse doesn't produce an error when
        # something is both a revision and a filename.  To be consistent
        # with git log and git rev-list, check revtreeargs for filenames.
        foreach arg $revtreeargs {
            if {[file exists $arg]} {
                show_error {} . [mc "Ambiguous argument '%s': both revision\
                                 and filename" $arg]
                exit 1
            }
        }
    } err]} {
        # unfortunately we get both stdout and stderr in $err,
        # so look for "fatal:".
        set i [string first "fatal:" $err]
        if {$i > 0} {
            set err [string range $err [expr {$i + 6}] end]
        }
        show_error {} . "[mc "Bad arguments to gitk:"]\n$err"
        exit 1
    }
}

set nullid "0000000000000000000000000000000000000000"
set nullid2 "0000000000000000000000000000000000000001"
set nullfile "/dev/null"

setttkstyle
set appname "gitk"

set runq {}
set history {}
set historyindex 0
set fh_serial 0
set nhl_names {}
set highlight_paths {}
set findpattern {}
set searchdirn -forwards
set boldids {}
set boldnameids {}
set diffelide {0 0}
set markingmatches 0
set linkentercount 0
set need_redisplay 0
set nrows_drawn 0
set firsttabstop 0

set nextviewnum 1
set curview 0
set selectedview 0
set selectedhlview [mc "None"]
set highlight_related [mc "None"]
set highlight_files {}
set viewfiles(0) {}
set viewperm(0) 0
set viewchanged(0) 0
set viewargs(0) {}
set viewargscmd(0) {}

set selectedline {}
set numcommits 0
set loginstance 0
set cmdlineok 0
set stopped 0
set stuffsaved 0
set patchnum 0
set lserial 0
set hasworktree [hasworktree]
set cdup {}
if {[expr {[exec git rev-parse --is-inside-work-tree] == "true"}]} {
    set cdup [exec git rev-parse --show-cdup]
}
set worktree [gitworktree]
setcoords
makewindow
if {$::tcl_platform(platform) eq {windows} && [file exists $gitk_prefix/etc/git.ico]} {
    wm iconbitmap . -default $gitk_prefix/etc/git.ico
} else {
    catch {
        image create photo gitlogo      -width 16 -height 16

        image create photo gitlogominus -width  4 -height  2
        gitlogominus put #C00000 -to 0 0 4 2
        gitlogo copy gitlogominus -to  1 5
        gitlogo copy gitlogominus -to  6 5
        gitlogo copy gitlogominus -to 11 5
        image delete gitlogominus

        image create photo gitlogoplus  -width  4 -height  4
        gitlogoplus  put #008000 -to 1 0 3 4
        gitlogoplus  put #008000 -to 0 1 4 3
        gitlogo copy gitlogoplus  -to  1 9
        gitlogo copy gitlogoplus  -to  6 9
        gitlogo copy gitlogoplus  -to 11 9
        image delete gitlogoplus

        image create photo gitlogo32    -width 32 -height 32
        gitlogo32 copy gitlogo -zoom 2 2

        wm iconphoto . -default gitlogo gitlogo32
    }
}
# wait for the window to become visible
if {![winfo viewable .]} {tkwait visibility .}
set_window_title
update
readrefs

if {$cmdline_files ne {} || $revtreeargs ne {} || $revtreeargscmd ne {}} {
    # create a view for the files/dirs specified on the command line
    set curview 1
    set selectedview 1
    set nextviewnum 2
    set viewname(1) [mc "Command line"]
    set viewfiles(1) $cmdline_files
    set viewargs(1) $revtreeargs
    set viewargscmd(1) $revtreeargscmd
    set viewperm(1) 0
    set viewchanged(1) 0
    set vdatemode(1) 0
    addviewmenu 1
    .bar.view entryconf [mca "&Edit view..."] -state normal
    .bar.view entryconf [mca "&Delete view"] -state normal
}

if {[info exists permviews]} {
    foreach v $permviews {
        set n $nextviewnum
        incr nextviewnum
        set viewname($n) [lindex $v 0]
        set viewfiles($n) [lindex $v 1]
        set viewargs($n) [lindex $v 2]
        set viewargscmd($n) [lindex $v 3]
        set viewperm($n) 1
        set viewchanged($n) 0
        addviewmenu $n
    }
}

if {[tk windowingsystem] eq "win32"} {
    focus -force .
}

getcommits {}

# Local variables:
# mode: tcl
# indent-tabs-mode: t
# tab-width: 8
# End:
