diff options
Diffstat (limited to 'gitk-git')
| -rw-r--r-- | gitk-git/Makefile | 7 | ||||
| -rw-r--r-- | gitk-git/README.md | 93 | ||||
| -rwxr-xr-x | gitk-git/generate-tcl.sh | 11 | ||||
| -rwxr-xr-x | gitk-git/gitk | 2029 | ||||
| -rw-r--r-- | gitk-git/meson.build | 30 | ||||
| -rw-r--r-- | gitk-git/po/bg.po | 435 | ||||
| -rw-r--r-- | gitk-git/po/meson.build | 20 | ||||
| -rw-r--r-- | gitk-git/po/sv.po | 734 | ||||
| -rw-r--r-- | gitk-git/po/ta.po | 1457 |
9 files changed, 3187 insertions, 1629 deletions
diff --git a/gitk-git/Makefile b/gitk-git/Makefile index e1f0aff4a1..cc32dcab4b 100644 --- a/gitk-git/Makefile +++ b/gitk-git/Makefile @@ -8,6 +8,7 @@ gitk_libdir ?= $(sharedir)/gitk/lib msgsdir ?= $(gitk_libdir)/msgs msgsdir_SQ = $(subst ','\'',$(msgsdir)) +SHELL_PATH ?= /bin/sh TCL_PATH ?= tclsh TCLTK_PATH ?= wish INSTALL ?= install @@ -64,9 +65,7 @@ clean:: gitk-wish: gitk GIT-TCLTK-VARS $(QUIET_GEN)$(RM) $@ $@+ && \ - sed -e '1,3s|^exec .* "$$0"|exec $(subst |,'\|',$(TCLTK_PATH_SQ)) "$$0"|' <gitk >$@+ && \ - chmod +x $@+ && \ - mv -f $@+ $@ + $(SHELL_PATH) ./generate-tcl.sh "$(TCLTK_PATH_SQ)" "$<" "$@" $(PO_TEMPLATE): gitk $(XGETTEXT) -kmc -LTcl -o $@ gitk @@ -74,7 +73,7 @@ update-po:: $(PO_TEMPLATE) $(foreach p, $(ALL_POFILES), echo Updating $p ; msgmerge -U $p $(PO_TEMPLATE) ; ) $(ALL_MSGFILES): %.msg : %.po @echo Generating catalog $@ - $(MSGFMT) --statistics --tcl $< -l $(basename $(notdir $<)) -d $(dir $@) + $(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< .PHONY: all install uninstall clean update-po .PHONY: FORCE diff --git a/gitk-git/README.md b/gitk-git/README.md new file mode 100644 index 0000000000..2e307463c6 --- /dev/null +++ b/gitk-git/README.md @@ -0,0 +1,93 @@ +Gitk - The Git Repository Browser +================================= + +Gitk is a graphical Git repository browser. It displays the commit +history of a Git repository as a graph, showing the relationships +between commits, branches, and tags. + +Usage +===== + +To view the history of the current repository: +```bash +gitk +``` + +To view the history of specific files or directories: +```bash +gitk path/to/file +gitk path/to/directory +``` + +To view a specific branch or range of commits: +```bash +gitk branch-name +gitk v1.0..v2.0 +``` + +For more usage examples and options, see the [gitk manual](https://git-scm.com/docs/gitk). + +Building +======== + +Gitk is a Tcl/Tk application. It requires Tcl/Tk to be installed on +your system. + +Running directly +---------------- + +Gitk can be run from the source directory without installation: + +```bash +./gitk +``` + +This allows for quick testing of changes. + +Installation +------------ + +To install system-wide, you can use either `make` or `meson`: + +```bash +# Install to default location ($HOME/bin) +make install + +# Install to system-wide location +sudo make install prefix=/usr/local + +# Install to custom location +make install prefix=/opt/gitk + +# Using Meson +meson setup builddir +meson compile -C builddir +meson install -C builddir +``` + +Both build systems will handle setting the correct Tcl/Tk interpreter +path and installing translation files. + +Contributing +============ + +Contributions are welcome! The preferred method for submitting patches +is via email to the Git mailing list, as this allows for more thorough +review and broader community feedback. However, GitHub pull requests +are also accepted. + +All commits must be signed off (use `git commit --signoff`) and should +have commit messages prefixed with `gitk:`. + +Email Patches +------------- + +Send patches to git@vger.kernel.org and CC j6t@kdbg.org. See the Git +project's [patch submission guidelines](https://git-scm.com/docs/SubmittingPatches) +for detailed instructions on creating and sending patches. + +License +======= + +Gitk is distributed under the GNU General Public License, either +version 2, or (at your option) any later version. diff --git a/gitk-git/generate-tcl.sh b/gitk-git/generate-tcl.sh new file mode 100755 index 0000000000..46bba6d246 --- /dev/null +++ b/gitk-git/generate-tcl.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +WISH=$(echo "$1" | sed 's/|/\\|/g') +INPUT="$2" +OUTPUT="$3" + +sed -e "1,3s|^exec .* \"\$0\"|exec $WISH \"\$0\"|" "$INPUT" >"$OUTPUT"+ +chmod a+x "$OUTPUT"+ +mv "$OUTPUT"+ "$OUTPUT" diff --git a/gitk-git/gitk b/gitk-git/gitk index 7a087f123d..c02db0194d 100755 --- a/gitk-git/gitk +++ b/gitk-git/gitk @@ -7,7 +7,240 @@ exec wish "$0" -- "$@" # and distributed under the terms of the GNU General Public Licence, # either version 2, or (at your option) any later version. -package require Tk +if {[catch {package require Tcl 8.6-} 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 +} + +###################################################################### +## Enable Tcl8 profile in Tcl9, allowing consumption of data that has +## bytes not conforming to the assumed encoding profile. + +if {[package vcompare $::tcl_version 9.0] >= 0} { + rename open _strict_open + proc open args { + set f [_strict_open {*}$args] + chan configure $f -profile tcl8 + return $f + } + proc convertfrom args { + return [encoding convertfrom -profile tcl8 {*}$args] + } +} else { + proc convertfrom args { + return [encoding convertfrom {*}$args] + } +} + +###################################################################### +## +## 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" && @@ -134,7 +367,7 @@ proc unmerged_files {files} { set mlist {} set nr_unmerged 0 if {[catch { - set fd [open "| git ls-files -u" r] + set fd [safe_open_command {git ls-files -u}] } err]} { show_error {} . "[mc "Couldn't get list of unmerged files:"] $err" exit 1 @@ -156,7 +389,7 @@ proc unmerged_files {files} { proc parseviewargs {n arglist} { global vdatemode vmergeonly vflags vdflags vrevs vfiltered vorigargs env global vinlinediff - global worddiff git_version + global worddiff set vdatemode($n) 0 set vmergeonly($n) 0 @@ -207,14 +440,10 @@ proc parseviewargs {n arglist} { "--color-words*" - "--word-diff=color" { # These trigger a word diff in the console interface, # so help the user by enabling our own support - if {[package vcompare $git_version "1.7.2"] >= 0} { - set worddiff [mc "Color words"] - } + set worddiff [mc "Color words"] } "--word-diff*" { - if {[package vcompare $git_version "1.7.2"] >= 0} { - set worddiff [mc "Markup words"] - } + set worddiff [mc "Markup words"] } "--stat=*" - "--numstat" - "--shortstat" - "--summary" - "--check" - "--exit-code" - "--quiet" - "--topo-order" - @@ -290,20 +519,21 @@ proc parseviewargs {n arglist} { 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 [eval exec git rev-parse $revs]} err]} { + 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] == 40 && [string is xdigit $line])} { + if {!([string length $line] == $hashlength && [string is xdigit $line])} { if {[string match "fatal:*" $line]} { if {[string match "fatal: ambiguous argument*" $line] && $badrev ne {}} { @@ -353,16 +583,6 @@ proc parseviewrevs {view revs} { return $ret } -# Escapes a list of filter paths to be passed to git log via stdin. Note that -# paths must not be quoted. -proc escape_filter_paths {paths} { - set escaped [list] - foreach path $paths { - lappend escaped [string map {\\ \\\\ "\ " "\\\ "} $path] - } - return $escaped -} - # Start off a git log process and arrange to read its output proc start_rev_list {view} { global startmsecs commitidx viewcomplete curview @@ -372,7 +592,6 @@ proc start_rev_list {view} { global viewactive viewinstances vmergeonly global mainheadid viewmainheadid viewmainheadid_orig global vcanopt vflags vrevs vorigargs - global show_notes set startmsecs [clock clicks -milliseconds] set commitidx($view) 0 @@ -384,7 +603,7 @@ proc start_rev_list {view} { set args $viewargs($view) if {$viewargscmd($view) ne {}} { if {[catch { - set str [exec sh -c $viewargscmd($view)] + set str [safe_exec [list sh -c $viewargscmd($view)]] } err]} { error_popup "[mc "Error executing --argscmd command:"] $err" return 0 @@ -422,10 +641,9 @@ proc start_rev_list {view} { } if {[catch { - set fd [open [concat | git log --no-color -z --pretty=raw $show_notes \ - --parents --boundary $args --stdin \ - "<<[join [concat $revs "--" \ - [escape_filter_paths $files]] "\\n"]"] r] + 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 @@ -459,9 +677,9 @@ proc stop_instance {inst} { set pid [pid $fd] if {$::tcl_platform(platform) eq {windows}} { - exec taskkill /pid $pid + safe_exec [list taskkill /pid $pid] } else { - exec kill $pid + safe_exec [list kill $pid] } } catch {close $fd} @@ -519,7 +737,7 @@ proc updatecommits {} { global mainheadid viewmainheadid viewmainheadid_orig pending_select global hasworktree global varcid vposids vnegids vflags vrevs - global show_notes + global hashlength set hasworktree [hasworktree] rereadrefs @@ -553,7 +771,7 @@ proc updatecommits {} { # take out positive refs that we asked for before or # that we have already seen foreach rev $revs { - if {[string length $rev] == 40} { + if {[string length $rev] == $hashlength} { if {[lsearch -exact $oldpos $rev] < 0 && ![info exists varcid($view,$rev)]} { lappend newrevs $rev @@ -576,11 +794,9 @@ proc updatecommits {} { set args $vorigargs($view) } if {[catch { - set fd [open [concat | git log --no-color -z --pretty=raw $show_notes \ - --parents --boundary $args --stdin \ - "<<[join [concat $revs "--" \ - [escape_filter_paths \ - $vfilelimit($view)]] "\\n"]"] r] + 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 @@ -1438,6 +1654,7 @@ proc getcommitlines {fd inst view updating} { 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... @@ -1520,7 +1737,7 @@ proc getcommitlines {fd inst view updating} { } set ok 1 foreach id $ids { - if {[string length $id] != 40} { + if {[string length $id] != $hashlength} { set ok 0 break } @@ -1547,8 +1764,8 @@ proc getcommitlines {fd inst view updating} { # and if we already know about it, using the rewritten # parent as a substitute parent for $id's children. if {![catch { - set rwid [exec git rev-list --first-parent --max-count=1 \ - $id -- $vfilelimit($view)] + 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 @@ -1668,7 +1885,7 @@ proc do_readcommit {id} { global tclencoding # Invoke git-log to handle automatic encoding conversion - set fd [open [concat | git log --no-color --pretty=raw -1 $id] r] + 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 != {}} { @@ -1766,8 +1983,8 @@ proc getcommit {id} { return 1 } -# Expand an abbreviated commit ID to a list of full 40-char IDs that match -# and are present in the current view. +# 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 @@ -1795,23 +2012,24 @@ proc longid {prefix} { } proc readrefs {} { - global tagids idtags headids idheads tagobjid + 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} { + foreach v {tagids idtags headids idheads otherrefids idotherrefs upstreamofref} { unset -nocomplain $v } - set refd [open [list | git show-ref -d] r] + 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 40] ne " "} continue - set id [string range $line 0 39] - set ref [string range $line 41 end] + 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]} { @@ -1835,8 +2053,10 @@ proc readrefs {} { set tagids($name) $id lappend idtags($id) $name } else { - set otherrefids($name) $id - lappend idotherrefs($id) $name + if [is_other_ref_visible $name] { + set otherrefids($name) $id + lappend idotherrefs($id) $name + } } } catch {close $refd} @@ -1852,9 +2072,20 @@ proc readrefs {} { set selectheadid {} if {$selecthead ne {}} { catch { - set selectheadid [exec git rev-parse --verify $selecthead] + 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 @@ -1895,23 +2126,12 @@ proc removehead {id name} { } proc ttk_toplevel {w args} { - global use_ttk eval [linsert $args 0 ::toplevel $w] - if {$use_ttk} { - place [ttk::frame $w._toplevel_background] -x 0 -y 0 -relwidth 1 -relheight 1 - } + place [ttk::frame $w._toplevel_background] -x 0 -y 0 -relwidth 1 -relheight 1 return $w } proc make_transient {window origin} { - global have_tk85 - - # In MacOS Tk 8.4 transient appears to work by setting - # overrideredirect, which is utterly useless, since the - # windows get no border, and are not even kept above - # the parent. - if {!$have_tk85 && [tk windowingsystem] eq {aqua}} return - wm transient $window $origin # Windows fails to place transient windows normally, so @@ -1922,12 +2142,10 @@ proc make_transient {window origin} { } proc show_error {w top msg} { - global NS - if {![info exists NS]} {set NS ""} 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 - ${NS}::button $w.ok -default active -text [mc OK] -command "destroy $top" + 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" @@ -1949,16 +2167,16 @@ proc error_popup {msg {owner .}} { } proc confirm_popup {msg {owner .}} { - global confirm_ok NS + 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 - ${NS}::button $w.ok -text [mc OK] -command "set confirm_ok 1; destroy $w" + ttk::button $w.ok -text [mc OK] -command "set confirm_ok 1; destroy $w" pack $w.ok -side left -fill x - ${NS}::button $w.cancel -text [mc Cancel] -command "destroy $w" + 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" @@ -1969,9 +2187,11 @@ proc confirm_popup {msg {owner .}} { return $confirm_ok } -proc setoptions {} { - global use_ttk +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 @@ -1995,6 +2215,7 @@ proc setoptions {} { } proc setttkstyle {} { + global theme eval font configure TkDefaultFont [fontflags mainfont] eval font configure TkTextFont [fontflags textfont] eval font configure TkHeadingFont [fontflags mainfont] @@ -2004,6 +2225,10 @@ proc setttkstyle {} { eval font configure TkIconFont [fontflags uifont] eval font configure TkMenuFont [fontflags uifont] eval font configure TkSmallCaptionFont [fontflags uifont] + + if {[catch {ttk::style theme use $theme} err]} { + set theme [ttk::style theme use] + } } # Make a menu and submenus. @@ -2064,23 +2289,86 @@ proc cleardropsel {w} { $w selection clear } proc makedroplist {w varname args} { - global use_ttk - if {$use_ttk} { - 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] - } else { - set gm [eval [linsert $args 0 tk_optionMenu $w $varname]] - } + 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 precisescrollval {D {koff 0}} { + global kscroll + return [expr (-($D / 10.0) * 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} + + if {[package vcompare $::tcl_version 8.7] >= 0} { + bindall <Alt-MouseWheel> {allcanvs yview scroll [scrollval 5*%D] units} + bindall <Alt-Shift-MouseWheel> break + bind $ctext <Alt-MouseWheel> {$ctext yview scroll [scrollval 5*%D 2] units} + bind $ctext <Alt-Shift-MouseWheel> {$ctext xview scroll [scrollval 5*%D 2] units} + bind $cflist <Alt-MouseWheel> {$cflist yview scroll [scrollval 5*%D 2] units} + bind $cflist <Alt-Shift-MouseWheel> break + bind $canv <Alt-Shift-MouseWheel> {$canv xview scroll [scrollval 5*%D] units} + + bindall <TouchpadScroll> { + lassign [tk::PreciseScrollDeltas %D] deltaX deltaY + allcanvs yview scroll [precisescrollval $deltaY] units + } + bind $ctext <TouchpadScroll> { + lassign [tk::PreciseScrollDeltas %D] deltaX deltaY + $ctext yview scroll [precisescrollval $deltaY 2] units + $ctext xview scroll [precisescrollval $deltaX 2] units + } + bind $cflist <TouchpadScroll> { + lassign [tk::PreciseScrollDeltas %D] deltaX deltaY + $cflist yview scroll [precisescrollval $deltaY 2] units + } + bind $canv <TouchpadScroll> { + lassign [tk::PreciseScrollDeltas %D] deltaX deltaY + $canv xview scroll [precisescrollval $deltaX] units + allcanvs yview scroll [precisescrollval $deltaY] 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 @@ -2089,19 +2377,17 @@ proc makewindow {} { global diffcontextstring diffcontext global ignorespace global maincursor textcursor curtextcursor - global rowctxmenu fakerowmenu mergemax wrapcomment + 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 have_tk85 use_ttk NS - global git_version global worddiff + global hashlength scroll_D0 # The "mc" arguments here are purely so that xgettext # sees the following string as needing to be translated @@ -2112,7 +2398,7 @@ proc makewindow {} { {mc "Reread re&ferences" command rereadrefs} {mc "&List references" command showrefs -accelerator F2} {xx "" separator} - {mc "Start git &gui" command {exec git gui &}} + {mc "Start git &gui" command {safe_exec_redirect [list git gui] [list &]}} {xx "" separator} {mc "&Quit" command doquit -accelerator Meta1-Q} }} @@ -2153,13 +2439,11 @@ proc makewindow {} { makemenu .bar $bar . configure -menu .bar - if {$use_ttk} { - # cover the non-themed toplevel with a themed frame. - place [ttk::frame ._main_background] -x 0 -y 0 -relwidth 1 -relheight 1 - } + # 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. - ${NS}::panedwindow .ctop -orient vertical + ttk::panedwindow .ctop -orient vertical # possibly use assumed geometry if {![info exists geometry(pwsash0)]} { @@ -2172,12 +2456,9 @@ proc makewindow {} { } # the upper half will have a paned window, a scroll bar to the right, and some stuff below - ${NS}::frame .tf -height $geometry(topheight) -width $geometry(topwidth) - ${NS}::frame .tf.histframe - ${NS}::panedwindow .tf.histframe.pwclist -orient horizontal - if {!$use_ttk} { - .tf.histframe.pwclist configure -sashpad 0 -handlesize 4 - } + 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 @@ -2185,6 +2466,7 @@ proc makewindow {} { 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 @@ -2197,105 +2479,57 @@ proc makewindow {} { -selectbackground $selectbgcolor \ -background $bgcolor -bd 0 -yscrollincr $linespc .tf.histframe.pwclist add $canv3 - if {$use_ttk} { - 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] - } - } else { - eval .tf.histframe.pwclist sash place 0 $geometry(pwsash0) - eval .tf.histframe.pwclist sash place 1 $geometry(pwsash1) + 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 - ${NS}::scrollbar $cscroll -command {allcanvs yview} - if {!$use_ttk} {$cscroll configure -highlightthickness 0} + 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 - ${NS}::frame .tf.bar - ${NS}::frame .tf.lbar -height 15 + 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 "SHA1 ID:"] " -state disabled -relief flat \ + ttk::button $sha1but -text "[mc "Commit ID:"] " -state disabled \ -command gotocommit -width 8 - $sha1but conf -disabledforeground [$sha1but cget -foreground] pack .tf.bar.sha1label -side left - ${NS}::entry $sha1entry -width 40 -font textfont -textvariable sha1string + 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 - - ${NS}::button .tf.bar.leftbut -command goback -state disabled -width 26 - if {$use_ttk} { - .tf.bar.leftbut configure -image [list bm-left disabled bm-left-gray] - } else { - .tf.bar.leftbut configure -image bm-left - } + ttk::button .tf.bar.leftbut -command goback -state disabled + .tf.bar.leftbut configure -text \u2190 -width 3 pack .tf.bar.leftbut -side left -fill y - ${NS}::button .tf.bar.rightbut -command goforw -state disabled -width 26 - if {$use_ttk} { - .tf.bar.rightbut configure -image [list bm-right disabled bm-right-gray] - } else { - .tf.bar.rightbut configure -image bm-right - } + ttk::button .tf.bar.rightbut -command goforw -state disabled + .tf.bar.rightbut configure -text \u2192 -width 3 pack .tf.bar.rightbut -side left -fill y - ${NS}::label .tf.bar.rowlabel -text [mc "Row"] + ttk::label .tf.bar.rowlabel -text [mc "Row"] set rownumsel {} - ${NS}::label .tf.bar.rownum -width 7 -textvariable rownumsel \ + ttk::label .tf.bar.rownum -width 7 -textvariable rownumsel \ -relief sunken -anchor e - ${NS}::label .tf.bar.rowlabel2 -text "/" - ${NS}::label .tf.bar.numcommits -width 7 -textvariable numcommits \ + 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 - if {!$use_ttk} { - foreach w {rownum numcommits} {.tf.bar.$w configure -font textfont} - } global selectedline trace add variable selectedline write selectedline_change # Status label and progress bar set statusw .tf.bar.status - ${NS}::label $statusw -width 15 -relief sunken + ttk::label $statusw -width 15 -relief sunken pack $statusw -side left -padx 5 - if {$use_ttk} { - set progresscanv [ttk::progressbar .tf.bar.progress] - } else { - set h [expr {[font metrics uifont -linespace] + 2}] - set progresscanv .tf.bar.progress - canvas $progresscanv -relief sunken -height $h -borderwidth 2 - set progressitem [$progresscanv create rect -1 0 0 $h -fill "#00ff00"] - set fprogitem [$progresscanv create rect -1 0 0 $h -fill yellow] - set rprogitem [$progresscanv create rect -1 0 0 $h -fill red] - } + 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 @@ -2305,35 +2539,12 @@ proc makewindow {} { set progupdatepending 0 # build up the bottom bar of upper window - ${NS}::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 - ${NS}::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 - ${NS}::button .tf.lbar.fprev -width 26 -command {dofind -1 1} - .tf.lbar.fprev configure -image bm-up - - ${NS}::label .tf.lbar.flab2 -text " [mc "commit"] " + ttk::label .tf.lbar.flabel -text "[mc "Find"] " + + ttk::button .tf.lbar.fnext -command {dofind 1 1} -text \u2193 -width 3 + ttk::button .tf.lbar.fprev -command {dofind -1 1} -text \u2191 -width 3 + + 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 @@ -2349,7 +2560,7 @@ proc makewindow {} { set findstring {} set fstring .tf.lbar.findstring lappend entries $fstring - ${NS}::entry $fstring -width 30 -textvariable findstring + ttk::entry $fstring -width 30 -textvariable findstring trace add variable findstring write find_change set findtype [mc "Exact"] set findtypemenu [makedroplist .tf.lbar.findtype \ @@ -2368,47 +2579,43 @@ proc makewindow {} { pack .tf.bar -in .tf -side bottom -fill x pack .tf.histframe -fill both -side top -expand 1 .ctop add .tf - if {!$use_ttk} { - .ctop paneconfigure .tf -height $geometry(topheight) - .ctop paneconfigure .tf -width $geometry(topwidth) - } # now build up the bottom - ${NS}::panedwindow .pwbottom -orient horizontal + 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)]} { - ${NS}::frame .bleft -width $geometry(botwidth) + ttk::frame .bleft -width $geometry(botwidth) } else { - ${NS}::frame .bleft -width $geometry(botwidth) -height $geometry(botheight) + ttk::frame .bleft -width $geometry(botwidth) -height $geometry(botheight) } - ${NS}::frame .bleft.top - ${NS}::frame .bleft.mid - ${NS}::frame .bleft.bottom + ttk::frame .bleft.top + ttk::frame .bleft.mid + ttk::frame .bleft.bottom # gap between sub-widgets set wgap [font measure uifont "i"] - ${NS}::button .bleft.top.search -text [mc "Search"] -command dosearch + 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 "" - ${NS}::entry $sstring -width 20 -textvariable 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 - ${NS}::radiobutton .bleft.mid.diff -text [mc "Diff"] \ + ttk::radiobutton .bleft.mid.diff -text [mc "Diff"] \ -command changediffdisp -variable diffelide -value {0 0} - ${NS}::radiobutton .bleft.mid.old -text [mc "Old version"] \ + ttk::radiobutton .bleft.mid.old -text [mc "Old version"] \ -command changediffdisp -variable diffelide -value {0 1} - ${NS}::radiobutton .bleft.mid.new -text [mc "New version"] \ + ttk::radiobutton .bleft.mid.new -text [mc "New version"] \ -command changediffdisp -variable diffelide -value {1 0} - ${NS}::label .bleft.mid.labeldiffcontext -text " [mc "Lines of context"]: " + 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 \ + ttk::spinbox .bleft.mid.diffcontext -width 5 \ -from 0 -increment 1 -to 10000000 \ -validate all -validatecommand "diffcontextvalidate %P" \ -textvariable diffcontextstring @@ -2416,28 +2623,24 @@ proc makewindow {} { trace add variable diffcontextstring write diffcontextchange lappend entries .bleft.mid.diffcontext pack .bleft.mid.labeldiffcontext .bleft.mid.diffcontext -side left -ipadx $wgap - ${NS}::checkbutton .bleft.mid.ignspace -text [mc "Ignore space change"] \ + 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"] - if {[package vcompare $git_version "1.7.2"] >= 0} { - 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 - } + 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 none \ + -yscrollcommand scrolltext -wrap $wrapdefault \ -xscrollcommand ".bleft.bottom.sbhorizontal set" - if {$have_tk85} { - $ctext conf -tabstyle wordprocessor - } - ${NS}::scrollbar .bleft.bottom.sb -command "$ctext yview" - ${NS}::scrollbar .bleft.bottom.sbhorizontal -command "$ctext xview" -orient h + $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 @@ -2488,16 +2691,13 @@ proc makewindow {} { $ctext tag lower d0 .pwbottom add .bleft - if {!$use_ttk} { - .pwbottom paneconfigure .bleft -width $geometry(botwidth) - } # lower right - ${NS}::frame .bright - ${NS}::frame .bright.mode - ${NS}::radiobutton .bright.mode.patch -text [mc "Patch"] \ + ttk::frame .bright + ttk::frame .bright.mode + ttk::radiobutton .bright.mode.patch -text [mc "Patch"] \ -command reselectline -variable cmitmode -value "patch" - ${NS}::radiobutton .bright.mode.tree -text [mc "Tree"] \ + 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 @@ -2513,7 +2713,7 @@ proc makewindow {} { -spacing1 1 -spacing3 1 lappend bglist $cflist lappend fglist $cflist - ${NS}::scrollbar .bright.sb -command "$cflist yview" + 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 \ @@ -2548,44 +2748,31 @@ proc makewindow {} { set ::BM "2" } - if {$use_ttk} { - 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} + 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} - #bindall <B1-Motion> {selcanvline %W %x %y} - if {[tk windowingsystem] == "win32"} { - bind . <MouseWheel> { windows_mousewheel_redirector %W %X %Y %D } - bind $ctext <MouseWheel> { windows_mousewheel_redirector %W %X %Y %D ; break } + + #Mouse / touchpad scrolling + if {[tk windowingsystem] == "win32" || [package vcompare $::tcl_version 8.7] >= 0} { + 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 { - bindall <ButtonRelease-4> "allcanvs yview scroll -5 units" - bindall <ButtonRelease-5> "allcanvs yview scroll 5 units" - bind $ctext <Button> { - if {"%b" eq 6} { - $ctext xview scroll -5 units - } elseif {"%b" eq 7} { - $ctext xview scroll 5 units - } - } - if {[tk windowingsystem] eq "aqua"} { - bindall <MouseWheel> { - set delta [expr {- (%D)}] - allcanvs yview scroll $delta units - } - bindall <Shift-MouseWheel> { - set delta [expr {- (%D)}] - $canv xview scroll $delta units - } - } + 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" @@ -2597,8 +2784,8 @@ proc makewindow {} { bind . <Key-Down> "selnextline 1" bind . <Shift-Key-Up> "dofind -1 0" bind . <Shift-Key-Down> "dofind 1 0" - bindkey <Key-Right> "goforw" - bindkey <Key-Left> "goback" + bindkey <<NextChar>> "goforw" + bindkey <<PrevChar>> "goback" bind . <Key-Prior> "selnextpage -1" bind . <Key-Next> "selnextpage 1" bind . <$M1B-Home> "allcanvs yview moveto 0.0" @@ -2725,24 +2912,6 @@ proc makewindow {} { $diff_menu configure -tearoff 0 } -# Windows sends all mouse wheel events to the current focused window, not -# the one where the mouse hovers, so bind those events here and redirect -# to the correct window -proc windows_mousewheel_redirector {W X Y D} { - global canv canv2 canv3 - set w [winfo containing -displayof $W $X $Y] - if {$w ne ""} { - set u [expr {$D < 0 ? 5 : -5}] - if {$w == $canv || $w == $canv2 || $w == $canv3} { - allcanvs yview scroll $u units - } else { - catch { - $w yview scroll $u units - } - } - } -} - # Update row number label when selectedline changes proc selectedline_change {n1 n2 op} { global selectedline rownumsel @@ -2805,30 +2974,10 @@ proc click {w} { # Adjust the progress bar for a change in requested extent or canvas size proc adjustprogress {} { - global progresscanv progressitem progresscoords - global fprogitem fprogcoord lastprogupdate progupdatepending - global rprogitem rprogcoord use_ttk + global progresscanv + global fprogcoord - if {$use_ttk} { - $progresscanv configure -value [expr {int($fprogcoord * 100)}] - return - } - - set w [expr {[winfo width $progresscanv] - 4}] - set x0 [expr {$w * [lindex $progresscoords 0]}] - set x1 [expr {$w * [lindex $progresscoords 1]}] - set h [winfo height $progresscanv] - $progresscanv coords $progressitem $x0 0 $x1 $h - $progresscanv coords $fprogitem 0 0 [expr {$w * $fprogcoord}] $h - $progresscanv coords $rprogitem 0 0 [expr {$w * $rprogcoord}] $h - set now [clock clicks -milliseconds] - if {$now >= $lastprogupdate + 100} { - set progupdatepending 0 - update - } elseif {!$progupdatepending} { - set progupdatepending 1 - after [expr {$lastprogupdate + 100 - $now}] doprogupdate - } + $progresscanv configure -value [expr {int($fprogcoord * 100)}] } proc doprogupdate {} { @@ -2887,14 +3036,13 @@ proc savestuff {w} { upvar #0 viewargscmd current_viewargscmd upvar #0 viewperm current_viewperm upvar #0 nextviewnum current_nextviewnum - upvar #0 use_ttk current_use_ttk if {$stuffsaved} return if {![winfo viewable .]} return set remove_tmp 0 if {[catch { set try_count 0 - while {[catch {set f [open $config_file_tmp {WRONLY CREAT EXCL}]}]} { + 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" } @@ -2921,13 +3069,8 @@ proc savestuff {w} { puts $f "set geometry(state) [wm state .]" puts $f "set geometry(topwidth) [winfo width .tf]" puts $f "set geometry(topheight) [winfo height .tf]" - if {$current_use_ttk} { - puts $f "set geometry(pwsash0) \"[.tf.histframe.pwclist sashpos 0] 1\"" - puts $f "set geometry(pwsash1) \"[.tf.histframe.pwclist sashpos 1] 1\"" - } else { - puts $f "set geometry(pwsash0) \"[.tf.histframe.pwclist sash coord 0]\"" - puts $f "set geometry(pwsash1) \"[.tf.histframe.pwclist sash coord 1]\"" - } + puts $f "set geometry(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]" @@ -2973,17 +3116,14 @@ proc savestuff {w} { } proc resizeclistpanes {win w} { - global oldwidth oldsash use_ttk + 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] - } elseif {$use_ttk} { + } else { set s0 [$win sashpos 0] set s1 [$win sashpos 1] - } else { - set s0 [$win sash coord 0] - set s1 [$win sash coord 1] } if {$w < 60} { set sash0 [expr {int($w/2 - 2)}] @@ -3005,29 +3145,20 @@ proc resizeclistpanes {win w} { } } } - if {$use_ttk} { - $win sashpos 0 $sash0 - $win sashpos 1 $sash1 - } else { - $win sash place 0 $sash0 [lindex $s0 1] - $win sash place 1 $sash1 [lindex $s1 1] - set sash0 [list $sash0 [lindex $s0 1]] - set sash1 [list $sash1 [lindex $s1 1]] - } + $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 use_ttk + global oldwidth oldsash if {[info exists oldwidth($win)]} { if {[info exists oldsash($win)]} { set s0 $oldsash($win) - } elseif {$use_ttk} { - set s0 [$win sashpos 0] } else { - set s0 [$win sash coord 0] + set s0 [$win sashpos 0] } if {$w < 60} { set sash0 [expr {int($w*3/4 - 2)}] @@ -3041,12 +3172,7 @@ proc resizecdetpanes {win w} { set sash0 [expr {$w - 15}] } } - if {$use_ttk} { - $win sashpos 0 $sash0 - } else { - $win sash place 0 $sash0 [lindex $s0 1] - set sash0 [list $sash0 [lindex $s0 1]] - } + $win sashpos 0 $sash0 set oldsash($win) $sash0 } set oldwidth($win) $w @@ -3067,7 +3193,7 @@ proc bindall {event action} { } proc about {} { - global bgcolor NS + global bgcolor set w .about if {[winfo exists $w]} { raise $w @@ -3084,7 +3210,7 @@ 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 - ${NS}::button $w.ok -text [mc "Close"] -command "destroy $w" -default active + 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" @@ -3093,7 +3219,7 @@ Use and redistribute under the terms of the GNU General Public License"] \ } proc keys {} { - global bgcolor NS + global bgcolor set w .keys if {[winfo exists $w]} { raise $w @@ -3151,7 +3277,7 @@ proc keys {} { " \ -justify left -bg $bgcolor -border 2 -relief groove pack $w.m -side top -fill both -padx 2 -pady 2 - ${NS}::button $w.ok -text [mc "Close"] -command "destroy $w" -default active + 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" @@ -3610,7 +3736,7 @@ proc gitknewtmpdir {} { set tmpdir $gitdir } set gitktmpformat [file join $tmpdir ".gitk-tmp.XXXXXX"] - if {[catch {set gitktmpdir [exec mktemp -d $gitktmpformat]}]} { + 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]} { @@ -3632,7 +3758,7 @@ proc gitknewtmpdir {} { proc save_file_from_commit {filename output what} { global nullfile - if {[catch {exec git show $filename -- > $output} err]} { + if {[catch {safe_exec_redirect [list git show $filename --] [list > $output]} err]} { if {[string match "fatal: bad revision *" $err]} { return $nullfile } @@ -3697,7 +3823,7 @@ proc external_diff {} { if {$difffromfile ne {} && $difftofile ne {}} { set cmd [list [shellsplit $extdifftool] $difffromfile $difftofile] - if {[catch {set fl [open |$cmd r]} err]} { + if {[catch {set fl [safe_open_command $cmd]} err]} { file delete -force $diffdir error_popup "$extdifftool: [mc "command failed:"] $err" } else { @@ -3801,7 +3927,7 @@ proc external_blame_diff {} { # Find the SHA1 ID of the blob for file $fname in the index # at stage 0 or 2 proc index_sha1 {fname} { - set f [open [list | git ls-files -s $fname] r] + 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] @@ -3861,7 +3987,7 @@ proc external_blame {parent_idx {line {}}} { # being given an absolute path... set f [make_relative $f] lappend cmdline $base_commit $f - if {[catch {eval exec $cmdline &} err]} { + if {[catch {safe_exec_redirect $cmdline [list &]} err]} { error_popup "[mc "git gui blame: command failed:"] $err" } } @@ -3889,7 +4015,7 @@ proc show_line_source {} { # must be a merge in progress... if {[catch { # get the last line from .git/MERGE_HEAD - set f [open [file join $gitdir MERGE_HEAD] r] + set f [safe_open_file [file join $gitdir MERGE_HEAD] r] set id [lindex [split [read $f] "\n"] end-1] close $f } err]} { @@ -3912,19 +4038,17 @@ proc show_line_source {} { } set line [lindex $h 1] } - set blameargs {} - if {$from_index ne {}} { - lappend blameargs | git cat-file blob $from_index - } - lappend blameargs | git blame -p -L$line,+1 + set blamefile [file join $cdup $flist_menu_file] if {$from_index ne {}} { - lappend blameargs --contents - + set blameargs [list \ + [list git cat-file blob $from_index] \ + [list git blame -p -L$line,+1 --contents - -- $blamefile]] } else { - lappend blameargs $id + set blameargs [list \ + [list git blame -p -L$line,+1 $id -- $blamefile]] } - lappend blameargs -- [file join $cdup $flist_menu_file] if {[catch { - set f [open $blameargs r] + set f [safe_open_pipeline $blameargs] } err]} { error_popup [mc "Couldn't start git blame: %s" $err] return @@ -3949,6 +4073,7 @@ proc stopblaming {} { proc read_line_source {fd inst} { global blamestuff curview commfd blameinst nullid nullid2 + global hashlength while {[gets $fd line] >= 0} { lappend blamestuff($inst) $line @@ -3969,7 +4094,7 @@ proc read_line_source {fd inst} { set line [split [lindex $blamestuff($inst) 0] " "] set id [lindex $line 0] set lnum [lindex $line 1] - if {[string length $id] == 40 && [string is xdigit $id] && + if {[string length $id] == $hashlength && [string is xdigit $id] && [string is digit -strict $lnum]} { # look for "filename" line foreach l $blamestuff($inst) { @@ -4297,16 +4422,16 @@ proc editview {} { proc vieweditor {top n title} { global newviewname newviewopts viewfiles bgcolor - global known_view_options NS + global known_view_options ttk_toplevel $top wm title $top [concat $title [mc "-- criteria for selecting revisions"]] make_transient $top . # View name - ${NS}::frame $top.nfr - ${NS}::label $top.nl -text [mc "View Name"] - ${NS}::entry $top.name -width 20 -textvariable newviewname($n) + 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} @@ -4325,13 +4450,13 @@ proc vieweditor {top n title} { if {$flags eq "+" || $flags eq "*"} { set cframe $top.fr$cnt incr cnt - ${NS}::frame $cframe + 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 - ${NS}::frame $cframe + ttk::frame $cframe pack $cframe -in $top -fill x -pady 3 -padx [list 15 3] set cexpand [expr {$flags eq "*."}] } else { @@ -4339,31 +4464,31 @@ proc vieweditor {top n title} { } if {$type eq "l"} { - ${NS}::label $cframe.l_$id -text $title + 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"} { - ${NS}::checkbutton $cframe.c_$id -text $title -variable newviewopts($n,$id) + 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 - ${NS}::radiobutton $cframe.c_$id -text $title -variable newviewopts($n,$button_id) -value $sz + 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]} { - ${NS}::label $cframe.l_$id -text $title - ${NS}::entry $cframe.e_$id -width $sz -background $bgcolor \ + 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]} { - ${NS}::label $cframe.l_$id -text $title - ${NS}::entry $cframe.e_$id -width $sz -background $bgcolor \ + 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"} { - ${NS}::label $top.l -text $title + 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)]} { @@ -4378,10 +4503,10 @@ proc vieweditor {top n title} { } } - ${NS}::frame $top.buts - ${NS}::button $top.buts.ok -text [mc "OK"] -command [list newviewok $top $n] - ${NS}::button $top.buts.apply -text [mc "Apply (F5)"] -command [list newviewok $top $n 1] - ${NS}::button $top.buts.can -text [mc "Cancel"] -command [list destroy $top] + 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] @@ -4488,7 +4613,7 @@ proc addviewmenu {n} { .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 + # -command [list addvhighlight $n] -variable selectedhlview } proc showview {n} { @@ -4849,8 +4974,8 @@ proc do_file_hl {serial} { # must be "containing:", i.e. we're searching commit info return } - set cmd [concat | git diff-tree -r -s --stdin $gdtargs] - set filehighlight [open $cmd r+] + 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 {} @@ -5113,11 +5238,13 @@ proc askrelhighlight {row id} { # Graph layout functions proc shortids {ids} { + global hashlength + set res {} foreach id $ids { if {[llength $id] > 1} { lappend res [shortids $id] - } elseif {[regexp {^[0-9a-f]{40}$} $id]} { + } elseif {[regexp [string map "@@ $hashlength" {^[0-9a-f]{@@}$}] $id]} { lappend res [string range $id 0 7] } else { lappend res $id @@ -5279,8 +5406,8 @@ proc get_viewmainhead {view} { global viewmainheadid vfilelimit viewinstances mainheadid catch { - set rfd [open [concat | git rev-list -1 $mainheadid \ - -- $vfilelimit($view)] r] + 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 @@ -5292,13 +5419,14 @@ proc get_viewmainhead {view} { # 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] == 40 && [string is xdigit $line]} { + } elseif {[string length $line] == $hashlength && [string is xdigit $line]} { set id $line } set viewmainheadid($view) $id @@ -5340,19 +5468,15 @@ proc dohidelocalchanges {} { # spawn off a process to do git diff-index --cached HEAD proc dodiffindex {} { global lserial showlocalchanges vfilelimit curview - global hasworktree git_version + global hasworktree if {!$showlocalchanges || !$hasworktree} return incr lserial - if {[package vcompare $git_version "1.7.2"] >= 0} { - set cmd "|git diff-index --cached --ignore-submodules=dirty HEAD" - } else { - set cmd "|git diff-index --cached HEAD" - } + set cmd "git diff-index --cached --ignore-submodules=dirty HEAD" if {$vfilelimit($curview) ne {}} { set cmd [concat $cmd -- $vfilelimit($curview)] } - set fd [open $cmd r] + set fd [safe_open_command $cmd] fconfigure $fd -blocking 0 set i [reg_instance $fd] filerun $fd [list readdiffindex $fd $lserial $i] @@ -5377,11 +5501,11 @@ proc readdiffindex {fd serial inst} { } # now see if there are any local changes not checked in to the index - set cmd "|git diff-files" + set cmd "git diff-files" if {$vfilelimit($curview) ne {}} { set cmd [concat $cmd -- $vfilelimit($curview)] } - set fd [open $cmd r] + set fd [safe_open_command $cmd] fconfigure $fd -blocking 0 set i [reg_instance $fd] filerun $fd [list readdifffiles $fd $serial $i] @@ -6576,13 +6700,7 @@ proc bindline {t id} { } proc graph_pane_width {} { - global use_ttk - - if {$use_ttk} { - set g [.tf.histframe.pwclist sashpos 0] - } else { - set g [.tf.histframe.pwclist sash coord 0] - } + set g [.tf.histframe.pwclist sashpos 0] return [lindex $g 0] } @@ -6995,7 +7113,7 @@ proc findselectline {l} { # mark the bits of a headline or author that match a find string proc markmatches {canv l str tag matches font row} { - global selectedline + global selectedline foundbgcolor set bbox [$canv bbox $tag] set x0 [lindex $bbox 0] @@ -7009,7 +7127,7 @@ proc markmatches {canv l str tag matches font row} { 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 yellow] + -outline {} -tags [list match$l matches] -fill $foundbgcolor] $canv lower $t if {$row == $selectedline} { $canv raise $t secsel @@ -7062,10 +7180,11 @@ proc commit_descriptor {p} { # 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 {(?:\m|-g)[0-9a-f]{6,40}\M} $text] + 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] @@ -7093,13 +7212,14 @@ proc appendwithlinks {text tags} { 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] < 40} { + if {[string length $id] < $hashlength} { set matches [longid $id] if {[llength $matches] > 0} { if {[llength $matches] > 1} return @@ -7170,8 +7290,8 @@ proc browseweb {url} { global web_browser if {$web_browser eq {}} return - # Use eval here in case $web_browser is a command plus some arguments - if {[catch {eval exec $web_browser [list $url] &} err]} { + # 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" } } @@ -7344,7 +7464,7 @@ proc selectline {l isnew {desired_loc {}} {switch_to_patch 0}} { global mergemax numcommits pending_select global cmitmode showneartags allcommits global targetrow targetid lastscrollrows - global autoselect autosellen jump_to_here + global autocopy autoselect autosellen jump_to_here global vinlinediff unset -nocomplain pending_select @@ -7410,9 +7530,13 @@ proc selectline {l isnew {desired_loc {}} {switch_to_patch 0}} { $sha1entry delete 0 end $sha1entry insert 0 $id - if {$autoselect} { + 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 @@ -7673,19 +7797,19 @@ proc gettree {id} { if {![info exists treefilelist($id)]} { if {![info exists treepending]} { if {$id eq $nullid} { - set cmd [list | git ls-files] + set cmd [list git ls-files] } elseif {$id eq $nullid2} { - set cmd [list | git ls-files --stage -t] + set cmd [list git ls-files --stage -t] } else { - set cmd [list | git ls-tree -r $id] + set cmd [list git ls-tree -r $id] } - if {[catch {set gtf [open $cmd r]}]} { + if {[catch {set gtf [safe_open_command $cmd]}]} { return } set treepending $id set treefilelist($id) {} set treeidlist($id) {} - fconfigure $gtf -blocking 0 -encoding binary + fconfigure $gtf -blocking 0 -translation binary filerun $gtf [list gettreeline $gtf $id] } } else { @@ -7712,7 +7836,7 @@ proc gettreeline {gtf id} { if {[string index $fname 0] eq "\""} { set fname [lindex $fname 0] } - set fname [encoding convertfrom $fname] + set fname [convertfrom utf-8 $fname] lappend treefilelist($id) $fname } if {![eof $gtf]} { @@ -7743,13 +7867,13 @@ proc showfile {f} { return } if {$diffids eq $nullid} { - if {[catch {set bf [open $f r]} err]} { + 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 [open [concat | git cat-file blob $blob] r]} err]} { + if {[catch {set bf [safe_open_command [concat git cat-file blob $blob]]} err]} { puts "oops, error reading blob $blob: $err" return } @@ -7892,14 +8016,14 @@ proc addtocflist {ids} { } proc diffcmd {ids flags} { - global log_showroot nullid nullid2 git_version + 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] + set cmd [concat git diff-index $flags] if {$i == 0} { lappend cmd -R [lindex $ids 1] } else { @@ -7907,16 +8031,14 @@ proc diffcmd {ids flags} { } } else { # comparing working directory with index - set cmd [concat | git diff-files $flags] + set cmd [concat git diff-files $flags] if {$j == 1} { lappend cmd -R } } } elseif {$j >= 0} { - if {[package vcompare $git_version "1.7.2"] >= 0} { - set flags "$flags --ignore-submodules=dirty" - } - set cmd [concat | git diff-index --cached $flags] + 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} { @@ -7932,7 +8054,7 @@ proc diffcmd {ids flags} { if {$log_showroot} { lappend flags --root } - set cmd [concat | git diff-tree -r $flags $ids] + set cmd [concat git diff-tree -r $flags $ids] } return $cmd } @@ -7944,11 +8066,11 @@ proc gettreediffs {ids} { if {$limitdiffs && $vfilelimit($curview) ne {}} { set cmd [concat $cmd -- $vfilelimit($curview)] } - if {[catch {set gdtf [open $cmd r]}]} return + if {[catch {set gdtf [safe_open_command $cmd]}]} return set treepending $ids set treediff {} - fconfigure $gdtf -blocking 0 -encoding binary + fconfigure $gdtf -blocking 0 -translation binary filerun $gdtf [list gettreediffline $gdtf $ids] } @@ -7974,7 +8096,7 @@ proc gettreediffline {gdtf ids} { if {[string index $file 0] eq "\""} { set file [lindex $file 0] } - set file [encoding convertfrom $file] + set file [convertfrom utf-8 $file] if {$file ne [lindex $treediff end]} { lappend treediff $file lappend sublist $file @@ -8044,17 +8166,8 @@ proc getblobdiffs {ids} { global ignorespace global worddiff global limitdiffs vfilelimit curview - global git_version - set textconv {} - if {[package vcompare $git_version "1.6.1"] >= 0} { - set textconv "--textconv" - } - set submodule {} - if {[package vcompare $git_version "1.6.6"] >= 0} { - set submodule "--submodule" - } - set cmd [diffcmd $ids "-p $textconv $submodule -C --cc --no-commit-id -U$diffcontext"] + set cmd [diffcmd $ids "-p --textconv --submodule -C --cc --no-commit-id -U$diffcontext"] if {$ignorespace} { append cmd " -w" } @@ -8064,11 +8177,11 @@ proc getblobdiffs {ids} { if {$limitdiffs && $vfilelimit($curview) ne {}} { set cmd [concat $cmd -- $vfilelimit($curview)] } - if {[catch {set bdf [open $cmd r]} err]} { + 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 {} + fconfigure $bdf -blocking 0 -translation binary set blobdifffd($ids) $bdf initblobdiffvars filerun $bdf [list getblobdiffline $bdf $diffids] @@ -8119,7 +8232,7 @@ proc makediffhdr {fname ids} { global ctext curdiffstart treediffs diffencoding global ctext_file_names jump_to_here targetline diffline - set fname [encoding convertfrom $fname] + set fname [convertfrom utf-8 $fname] set diffencoding [get_path_encoding $fname] set i [lsearch -exact $treediffs($ids) $fname] if {$i >= 0} { @@ -8181,7 +8294,7 @@ proc parseblobdiffline {ids line} { if {![string compare -length 5 "diff " $line]} { if {![regexp {^diff (--cc|--git) } $line m type]} { - set line [encoding convertfrom $line] + set line [convertfrom utf-8 $line] $ctext insert end "$line\n" hunksep continue } @@ -8230,7 +8343,7 @@ proc parseblobdiffline {ids line} { makediffhdr $fname $ids } elseif {![string compare -length 16 "* Unmerged path " $line]} { - set fname [encoding convertfrom [string range $line 16 end]] + set fname [convertfrom utf-8 [string range $line 16 end]] $ctext insert end "\n" set curdiffstart [$ctext index "end - 1c"] lappend ctext_file_names $fname @@ -8243,7 +8356,7 @@ proc parseblobdiffline {ids line} { } elseif {![string compare -length 2 "@@" $line]} { regexp {^@@+} $line ats - set line [encoding convertfrom $diffencoding $line] + set line [convertfrom $diffencoding $line] $ctext insert end "$line\n" hunksep if {[regexp { \+(\d+),\d+ @@} $line m nl]} { set diffline $nl @@ -8272,10 +8385,10 @@ proc parseblobdiffline {ids line} { $ctext insert end "$line\n" filesep } } elseif {$currdiffsubmod != "" && ![string compare -length 3 " >" $line]} { - set line [encoding convertfrom $diffencoding $line] + set line [convertfrom $diffencoding $line] $ctext insert end "$line\n" dresult } elseif {$currdiffsubmod != "" && ![string compare -length 3 " <" $line]} { - set line [encoding convertfrom $diffencoding $line] + set line [convertfrom $diffencoding $line] $ctext insert end "$line\n" d0 } elseif {$diffinhdr} { if {![string compare -length 12 "rename from " $line]} { @@ -8283,7 +8396,7 @@ proc parseblobdiffline {ids line} { if {[string index $fname 0] eq "\""} { set fname [lindex $fname 0] } - set fname [encoding convertfrom $fname] + set fname [convertfrom utf-8 $fname] set i [lsearch -exact $treediffs($ids) $fname] if {$i >= 0} { setinlist difffilestart $i $curdiffstart @@ -8302,11 +8415,12 @@ proc parseblobdiffline {ids line} { set diffinhdr 0 return } + set line [convertfrom utf-8 $line] $ctext insert end "$line\n" filesep } else { set line [string map {\x1A ^Z} \ - [encoding convertfrom $diffencoding $line]] + [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"}] @@ -8458,19 +8572,17 @@ proc clear_ctext {{first 1.0}} { } proc settabs {{firstab {}}} { - global firsttabstop tabstop ctext have_tk85 + global firsttabstop tabstop ctext - if {$firstab ne {} && $have_tk85} { + 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}]] - } elseif {$have_tk85 || $tabstop != 8} { - $ctext conf -tabs [expr {$tabstop * $w}] } else { - $ctext conf -tabs {} + $ctext conf -tabs [expr {$tabstop * $w}] } } @@ -8739,13 +8851,16 @@ proc incrfont {inc} { proc clearsha1 {} { global sha1entry sha1string - if {[string length $sha1string] == 40} { + 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 @@ -8754,14 +8869,15 @@ proc sha1change {n1 n2 op} { } if {[$sha1but cget -state] == $state} return if {$state == "normal"} { - $sha1but conf -state normal -relief raised -text "[mc "Goto:"] " + $sha1but conf -state normal -text "[mc "Goto:"] " } else { - $sha1but conf -state disabled -relief flat -text "[mc "SHA1 ID:"] " + $sha1but conf -state disabled -text "[mc "Commit ID:"] " } } proc gotocommit {} { global sha1string tagids headids curview varcid + global hashlength if {$sha1string == {} || ([info exists currentid] && $sha1string == $currentid)} return @@ -8771,17 +8887,17 @@ proc gotocommit {} { set id $headids($sha1string) } else { set id [string tolower $sha1string] - if {[regexp {^[0-9a-f]{4,39}$} $id]} { + if {[regexp {^[0-9a-f]{4,63}$} $id]} { set matches [longid $id] if {$matches ne {}} { if {[llength $matches] > 1} { - error_popup [mc "Short SHA1 id %s is ambiguous" $id] + error_popup [mc "Short commit ID %s is ambiguous" $id] return } set id [lindex $matches 0] } } else { - if {[catch {set id [exec git rev-parse --verify $sha1string]}]} { + if {[catch {set id [safe_exec [list git rev-parse --verify $sha1string]]}]} { error_popup [mc "Revision %s is not known" $sha1string] return } @@ -8792,7 +8908,7 @@ proc gotocommit {} { return } if {[regexp {^[0-9a-fA-F]{4,}$} $sha1string]} { - set msg [mc "SHA1 id %s is not known" $sha1string] + set msg [mc "Commit ID %s is not known" $sha1string] } else { set msg [mc "Revision %s is not in the current view" $sha1string] } @@ -9087,10 +9203,8 @@ proc getpatchid {id} { if {![info exists patchids($id)]} { set cmd [diffcmd [list $id] {-p --root}] - # trim off the initial "|" - set cmd [lrange $cmd 1 end] if {[catch { - set x [eval exec $cmd | git patch-id] + set x [safe_exec_redirect $cmd [list | git patch-id]] set patchids($id) [lindex $x 0] }]} { set patchids($id) "error" @@ -9186,14 +9300,14 @@ proc diffcommits {a b} { set fna [file join $tmpdir "commit-[string range $a 0 7]"] set fnb [file join $tmpdir "commit-[string range $b 0 7]"] if {[catch { - exec git diff-tree -p --pretty $a >$fna - exec git diff-tree -p --pretty $b >$fnb + 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 [open "| diff -U$diffcontext $fna $fnb" r] + set fd [safe_open_command "diff -U$diffcontext $fna $fnb"] } err]} { error_popup [mc "Error diffing commits: %s" $err] return @@ -9259,7 +9373,8 @@ proc doseldiff {oldid newid} { } proc mkpatch {} { - global rowmenuid currentid commitinfo patchtop patchnum NS + global rowmenuid currentid commitinfo patchtop patchnum + global hashlength if {![info exists currentid]} return set oldid $currentid @@ -9271,36 +9386,36 @@ proc mkpatch {} { catch {destroy $top} ttk_toplevel $top make_transient $top . - ${NS}::label $top.title -text [mc "Generate patch"] + ttk::label $top.title -text [mc "Generate patch"] grid $top.title - -pady 10 - ${NS}::label $top.from -text [mc "From:"] - ${NS}::entry $top.fromsha1 -width 40 + 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 - ${NS}::entry $top.fromhead -width 60 + ttk::entry $top.fromhead -width 60 $top.fromhead insert 0 $oldhead $top.fromhead conf -state readonly grid x $top.fromhead -sticky w - ${NS}::label $top.to -text [mc "To:"] - ${NS}::entry $top.tosha1 -width 40 + 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 - ${NS}::entry $top.tohead -width 60 + ttk::entry $top.tohead -width 60 $top.tohead insert 0 $newhead $top.tohead conf -state readonly grid x $top.tohead -sticky w - ${NS}::button $top.rev -text [mc "Reverse"] -command mkpatchrev + ttk::button $top.rev -text [mc "Reverse"] -command mkpatchrev grid $top.rev x -pady 10 -padx 5 - ${NS}::label $top.flab -text [mc "Output file:"] - ${NS}::entry $top.fname -width 60 + 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 - ${NS}::frame $top.buts - ${NS}::button $top.buts.gen -text [mc "Generate"] -command mkpatchgo - ${NS}::button $top.buts.can -text [mc "Cancel"] -command mkpatchcan + 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 @@ -9333,10 +9448,7 @@ proc mkpatchgo {} { set newid [$patchtop.tosha1 get] set fname [$patchtop.fname get] set cmd [diffcmd [list $oldid $newid] -p] - # trim off the initial "|" - set cmd [lrange $cmd 1 end] - lappend cmd >$fname & - if {[catch {eval exec $cmd} err]} { + if {[catch {safe_exec_redirect $cmd [list >$fname &]} err]} { error_popup "[mc "Error creating patch:"] $err" $patchtop } catch {destroy $patchtop} @@ -9351,35 +9463,36 @@ proc mkpatchcan {} { } proc mktag {} { - global rowmenuid mktagtop commitinfo NS + global rowmenuid mktagtop commitinfo + global hashlength set top .maketag set mktagtop $top catch {destroy $top} ttk_toplevel $top make_transient $top . - ${NS}::label $top.title -text [mc "Create tag"] + ttk::label $top.title -text [mc "Create tag"] grid $top.title - -pady 10 - ${NS}::label $top.id -text [mc "ID:"] - ${NS}::entry $top.sha1 -width 40 + 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 - ${NS}::entry $top.head -width 60 + 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 - ${NS}::label $top.tlab -text [mc "Tag name:"] - ${NS}::entry $top.tag -width 60 + ttk::label $top.tlab -text [mc "Tag name:"] + ttk::entry $top.tag -width 60 grid $top.tlab $top.tag -sticky w - ${NS}::label $top.op -text [mc "Tag message is optional"] + ttk::label $top.op -text [mc "Tag message is optional"] grid $top.op -columnspan 2 -sticky we - ${NS}::label $top.mlab -text [mc "Tag message:"] - ${NS}::entry $top.msg -width 60 + ttk::label $top.mlab -text [mc "Tag message:"] + ttk::entry $top.msg -width 60 grid $top.mlab $top.msg -sticky w - ${NS}::frame $top.buts - ${NS}::button $top.buts.gen -text [mc "Create"] -command mktaggo - ${NS}::button $top.buts.can -text [mc "Cancel"] -command mktagcan + 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 @@ -9405,9 +9518,9 @@ proc domktag {} { } if {[catch { if {$msg != {}} { - exec git tag -a -m $msg $tag $id + safe_exec [list git tag -a -m $msg $tag $id] } else { - exec git tag $tag $id + safe_exec [list git tag $tag $id] } } err]} { error_popup "[mc "Error creating tag:"] $err" $mktagtop @@ -9469,47 +9582,49 @@ proc mktaggo {} { 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 < 40} { + if {$autosellen < $hashlength} { lappend cmd --abbrev=$autosellen } - set reference [eval exec $cmd $rowmenuid] + set reference [safe_exec [concat $cmd $rowmenuid]] clipboard clear clipboard append $reference } proc writecommit {} { - global rowmenuid wrcomtop commitinfo wrcomcmd NS + global rowmenuid wrcomtop commitinfo wrcomcmd + global hashlength set top .writecommit set wrcomtop $top catch {destroy $top} ttk_toplevel $top make_transient $top . - ${NS}::label $top.title -text [mc "Write commit to file"] + ttk::label $top.title -text [mc "Write commit to file"] grid $top.title - -pady 10 - ${NS}::label $top.id -text [mc "ID:"] - ${NS}::entry $top.sha1 -width 40 + 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 - ${NS}::entry $top.head -width 60 + 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 - ${NS}::label $top.clab -text [mc "Command:"] - ${NS}::entry $top.cmd -width 60 -textvariable wrcomcmd + ttk::label $top.clab -text [mc "Command:"] + ttk::entry $top.cmd -width 60 -textvariable wrcomcmd grid $top.clab $top.cmd -sticky w -pady 10 - ${NS}::label $top.flab -text [mc "Output file:"] - ${NS}::entry $top.fname -width 60 + 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 - ${NS}::frame $top.buts - ${NS}::button $top.buts.gen -text [mc "Write"] -command wrcomgo - ${NS}::button $top.buts.can -text [mc "Cancel"] -command wrcomcan + 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 @@ -9525,7 +9640,7 @@ proc wrcomgo {} { set id [$wrcomtop.sha1 get] set cmd "echo $id | [$wrcomtop.cmd get]" set fname [$wrcomtop.fname get] - if {[catch {exec sh -c $cmd >$fname &} err]} { + if {[catch {safe_exec_redirect [list sh -c $cmd] [list >$fname &]} err]} { error_popup "[mc "Error writing commit:"] $err" $wrcomtop } catch {destroy $wrcomtop} @@ -9540,7 +9655,7 @@ proc wrcomcan {} { } proc mkbranch {} { - global NS rowmenuid + global rowmenuid set top .branchdialog @@ -9555,7 +9670,6 @@ proc mkbranch {} { } proc mvbranch {} { - global NS global headmenuid headmenuhead set top .branchdialog @@ -9571,31 +9685,32 @@ proc mvbranch {} { } proc branchdia {top valvar uivar} { - global NS commitinfo + global commitinfo + global hashlength upvar $valvar val $uivar ui catch {destroy $top} ttk_toplevel $top make_transient $top . - ${NS}::label $top.title -text $ui(title) + ttk::label $top.title -text $ui(title) grid $top.title - -pady 10 - ${NS}::label $top.id -text [mc "ID:"] - ${NS}::entry $top.sha1 -width 40 + 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 - ${NS}::entry $top.head -width 60 + 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 - ${NS}::label $top.nlab -text [mc "Name:"] - ${NS}::entry $top.name -width 40 + 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 - ${NS}::frame $top.buts - ${NS}::button $top.buts.go -text $ui(accept) -command $val(command) - ${NS}::button $top.buts.can -text [mc "Cancel"] -command "catch {destroy $top}" + 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 @@ -9629,7 +9744,7 @@ proc mkbrgo {top} { nowbusy newbranch update if {[catch { - eval exec git branch $cmdargs + safe_exec [concat git branch $cmdargs] } err]} { notbusy newbranch error_popup $err @@ -9670,7 +9785,7 @@ proc mvbrgo {top prevname} { nowbusy renamebranch update if {[catch { - eval exec git branch $cmdargs + safe_exec [concat git branch $cmdargs] } err]} { notbusy renamebranch error_popup $err @@ -9711,7 +9826,7 @@ proc exec_citool {tool_args {baseid {}}} { } } - eval exec git citool $tool_args & + safe_exec_redirect [concat git citool $tool_args] [list &] array unset env GIT_AUTHOR_* array set env $save_env @@ -9734,7 +9849,7 @@ proc cherrypick {} { 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 {exec sh -c "git cherry-pick -r $rowmenuid 2>&1"} err]} { + 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)} \ @@ -9796,7 +9911,7 @@ proc revert {} { nowbusy revert [mc "Reverting"] update - if [catch {exec git revert --no-edit $rowmenuid} err] { + 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] { @@ -9842,38 +9957,38 @@ proc revert {} { } proc resethead {} { - global mainhead rowmenuid confirm_ok resettype NS + 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"] - ${NS}::label $w.m -text \ + 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 - ${NS}::labelframe $w.f -text [mc "Reset type:"] + ttk::labelframe $w.f -text [mc "Reset type:"] set resettype mixed - ${NS}::radiobutton $w.f.soft -value soft -variable resettype \ + ttk::radiobutton $w.f.soft -value soft -variable resettype \ -text [mc "Soft: Leave working tree and index untouched"] grid $w.f.soft -sticky w - ${NS}::radiobutton $w.f.mixed -value mixed -variable resettype \ + ttk::radiobutton $w.f.mixed -value mixed -variable resettype \ -text [mc "Mixed: Leave working tree untouched, reset index"] grid $w.f.mixed -sticky w - ${NS}::radiobutton $w.f.hard -value hard -variable resettype \ + 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 - ${NS}::button $w.ok -text [mc OK] -command "set confirm_ok 1; destroy $w" + 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 - ${NS}::button $w.cancel -text [mc Cancel] -command "destroy $w" + 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 [open \ - [list | git reset --$resettype $rowmenuid 2>@1] r]} err]} { + if {[catch {set fd [safe_open_command_redirect \ + [list git reset --$resettype $rowmenuid] [list 2>@1]]} err]} { error_popup $err } else { dohidelocalchanges @@ -9944,7 +10059,7 @@ proc cobranch {} { # check the tree is clean first?? set newhead $headmenuhead - set command [list | git checkout] + set command [list git checkout] if {[string match "remotes/*" $newhead]} { set remote $newhead set newhead [string range $newhead [expr [string last / $newhead] + 1] end] @@ -9958,12 +10073,11 @@ proc cobranch {} { } else { lappend command $newhead } - lappend command 2>@1 nowbusy checkout [mc "Checking out"] update dohidelocalchanges if {[catch { - set fd [open $command r] + set fd [safe_open_command_redirect $command [list 2>@1]] } err]} { notbusy checkout error_popup $err @@ -10029,7 +10143,7 @@ proc rmbranch {} { } nowbusy rmbranch update - if {[catch {exec git branch -D $head} err]} { + if {[catch {safe_exec [list git branch -D $head]} err]} { notbusy rmbranch error_popup $err return @@ -10044,7 +10158,7 @@ proc rmbranch {} { # Display a list of tags and heads proc showrefs {} { - global showrefstop bgcolor fgcolor selectbgcolor NS + global showrefstop bgcolor fgcolor selectbgcolor global bglist fglist reflistfilter reflist maincursor set top .showrefs @@ -10060,26 +10174,29 @@ proc showrefs {} { text $top.list -background $bgcolor -foreground $fgcolor \ -selectbackground $selectbgcolor -font mainfont \ -xscrollcommand "$top.xsb set" -yscrollcommand "$top.ysb set" \ - -width 30 -height 20 -cursor $maincursor \ + -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 } - ${NS}::scrollbar $top.ysb -command "$top.list yview" -orient vertical - ${NS}::scrollbar $top.xsb -command "$top.list xview" -orient horizontal + 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 - ${NS}::frame $top.f - ${NS}::label $top.f.l -text "[mc "Filter"]: " - ${NS}::entry $top.f.e -width 20 -textvariable reflistfilter + 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 - ${NS}::button $top.close -command [list destroy $top] -text [mc "Close"] + 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 @@ -10122,43 +10239,73 @@ proc reflistfilter_change {n1 n2 op} { } proc refill_reflist {} { - global reflist reflistfilter showrefstop headids tagids otherrefids - global curview + global reflist reflistfilter showrefstop headids tagids otherrefids sortrefsbytype + global curview upstreamofref if {![info exists showrefstop] || ![winfo exists $showrefstop]} return - set refs {} + set localrefs {} + set remoterefs {} + set trackedremoterefs {} + set tagrefs {} + set otherrefs {} + foreach n [array names headids] { - if {[string match $reflistfilter $n]} { + if {![string match "remotes/*" $n] && [string match $reflistfilter $n]} { if {[commitinview $headids($n) $curview]} { - if {[string match "remotes/*" $n]} { - lappend refs [list $n R] - } else { - lappend refs [list $n H] + lappend localrefs [list $n H] + if {[info exists upstreamofref($n)] && \ + [info exists headids($upstreamofref($n))] && \ + [commitinview $headids($upstreamofref($n)) $curview]} { + lappend trackedremoterefs [list $upstreamofref($n) R] + } + } else { + interestedin $headids($n) {run refill_reflist} + } + } + } + set trackedremoterefs [lsort -index 0 -unique $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 refs [list $n T] + 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 refs [list $n o] + lappend otherrefs [list "$n" o] } else { interestedin $otherrefids($n) {run refill_reflist} } } } - set refs [lsort -index 0 $refs] + 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 @@ -10220,7 +10367,7 @@ proc getallcommits {} { set cachedarcs 0 set allccache [file join $gitdir "gitk.cache"] if {![catch { - set f [open $allccache r] + set f [safe_open_file $allccache r] set allcwait 1 getcache $f }]} return @@ -10229,7 +10376,7 @@ proc getallcommits {} { if {$allcwait} { return } - set cmd [list | git rev-list --parents] + set cmd [list git rev-list --parents] set allcupdate [expr {$seeds ne {}}] if {!$allcupdate} { set ids "--all" @@ -10257,10 +10404,11 @@ proc getallcommits {} { if {$ids ne {}} { if {$ids eq "--all"} { set cmd [concat $cmd "--all"] + set fd [safe_open_command $cmd] } else { - set cmd [concat $cmd --stdin "<<[join $ids "\\n"]"] + set cmd [concat $cmd --stdin] + set fd [safe_open_command_redirect $cmd [list "<<[join $ids "\n"]"]] } - set fd [open $cmd r] fconfigure $fd -blocking 0 incr allcommits nowbusy allcommits @@ -10650,7 +10798,7 @@ proc savecache {} { set cachearc 0 set cachedarcs $nextarc catch { - set f [open $allccache w] + set f [safe_open_file $allccache w] puts $f [list 1 $cachedarcs] run writecache $f } @@ -11353,7 +11501,7 @@ proc add_tag_ctext {tag} { if {![info exists cached_tagcontent($tag)]} { catch { - set cached_tagcontent($tag) [exec git cat-file -p $tag] + set cached_tagcontent($tag) [safe_exec [list git cat-file -p $tag]] } } $ctext insert end "[mc "Tag"]: $tag\n" bold @@ -11416,82 +11564,15 @@ proc doquit {} { } proc mkfontdisp {font top which} { - global fontattr fontpref $font NS use_ttk + global fontattr fontpref $font set fontpref($font) [set $font] - ${NS}::button $top.${font}but -text $which \ + ttk::button $top.${font}but -text $which \ -command [list choosefont $font $which] - ${NS}::label $top.$font -relief flat -font $font \ - -text $fontattr($font,family) -justify left + ttk::label $top.$font -font $font \ + -text $fontattr($font,family) grid x $top.${font}but $top.$font -sticky w -} - -proc choosefont {font which} { - global fontparam fontlist fonttop fontattr - global prefstop NS - - set fontparam(which) $which - set fontparam(font) $font - set fontparam(family) [font actual $font -family] - set fontparam(size) $fontattr($font,size) - set fontparam(weight) $fontattr($font,weight) - set fontparam(slant) $fontattr($font,slant) - set top .gitkfont - set fonttop $top - if {![winfo exists $top]} { - font create sample - eval font config sample [font actual $font] - ttk_toplevel $top - make_transient $top $prefstop - wm title $top [mc "Gitk font chooser"] - ${NS}::label $top.l -textvariable fontparam(which) - pack $top.l -side top - set fontlist [lsort [font families]] - ${NS}::frame $top.f - listbox $top.f.fam -listvariable fontlist \ - -yscrollcommand [list $top.f.sb set] - bind $top.f.fam <<ListboxSelect>> selfontfam - ${NS}::scrollbar $top.f.sb -command [list $top.f.fam yview] - pack $top.f.sb -side right -fill y - pack $top.f.fam -side left -fill both -expand 1 - pack $top.f -side top -fill both -expand 1 - ${NS}::frame $top.g - spinbox $top.g.size -from 4 -to 40 -width 4 \ - -textvariable fontparam(size) \ - -validatecommand {string is integer -strict %s} - checkbutton $top.g.bold -padx 5 \ - -font {{Times New Roman} 12 bold} -text [mc "B"] -indicatoron 0 \ - -variable fontparam(weight) -onvalue bold -offvalue normal - checkbutton $top.g.ital -padx 5 \ - -font {{Times New Roman} 12 italic} -text [mc "I"] -indicatoron 0 \ - -variable fontparam(slant) -onvalue italic -offvalue roman - pack $top.g.size $top.g.bold $top.g.ital -side left - pack $top.g -side top - canvas $top.c -width 150 -height 50 -border 2 -relief sunk \ - -background white - $top.c create text 100 25 -anchor center -text $which -font sample \ - -fill black -tags text - bind $top.c <Configure> [list centertext $top.c] - pack $top.c -side top -fill x - ${NS}::frame $top.buts - ${NS}::button $top.buts.ok -text [mc "OK"] -command fontok -default active - ${NS}::button $top.buts.can -text [mc "Cancel"] -command fontcan -default normal - bind $top <Key-Return> fontok - bind $top <Key-Escape> fontcan - 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 - pack $top.buts -side bottom -fill x - trace add variable fontparam write chg_fontparam - } else { - raise $top - $top.c itemconf text -text $which - } - set i [lsearch -exact $fontlist $fontparam(family)] - if {$i >= 0} { - $top.f.fam selection set $i - $top.f.fam see $i - } + grid configure $top.$font -sticky ew } proc centertext {w} { @@ -11526,26 +11607,21 @@ proc fontcan {} { } } -if {[package vsatisfies [package provide Tk] 8.6]} { - # In Tk 8.6 we have a native font chooser dialog. Overwrite the above - # function to make use of it. - 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 - puts stderr "$font $newfont" - 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 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 {} { @@ -11565,167 +11641,221 @@ proc chg_fontparam {v sub op} { # Create a property sheet tab page proc create_prefs_page {w} { - global NS - set parent [join [lrange [split $w .] 0 end-1] .] - if {[winfo class $parent] eq "TNotebook"} { - ${NS}::frame $w - } else { - ${NS}::labelframe $w - } + ttk::frame $w } proc prefspage_general {notebook} { - global NS maxwidth maxgraphpct showneartags showlocalchanges - global tabstop limitdiffs autoselect autosellen extdifftool perfile_attrs - global hideremotes want_ttk have_ttk maxrefs web_browser + global {*}$::config_variables + global hashlength set page [create_prefs_page $notebook.general] - ${NS}::label $page.ldisp -text [mc "Commit list display options"] + ttk::label $page.ldisp -text [mc "Commit list display options"] -font mainfontbold grid $page.ldisp - -sticky w -pady 10 - ${NS}::label $page.spacer -text " " - ${NS}::label $page.maxwidthl -text [mc "Maximum graph width (lines)"] - spinbox $page.maxwidth -from 0 -to 100 -width 4 -textvariable maxwidth + + ttk::label $page.spacer -text " " + ttk::label $page.maxwidthl -text [mc "Maximum graph width (lines)"] + ttk::spinbox $page.maxwidth -from 0 -to 100 -width 4 -textvariable maxwidth grid $page.spacer $page.maxwidthl $page.maxwidth -sticky w #xgettext:no-tcl-format - ${NS}::label $page.maxpctl -text [mc "Maximum graph width (% of pane)"] - spinbox $page.maxpct -from 1 -to 100 -width 4 -textvariable maxgraphpct + ttk::label $page.maxpctl -text [mc "Maximum graph width (% of pane)"] + ttk::spinbox $page.maxpct -from 1 -to 100 -width 4 -textvariable maxgraphpct grid x $page.maxpctl $page.maxpct -sticky w - ${NS}::checkbutton $page.showlocal -text [mc "Show local changes"] \ + + ttk::checkbutton $page.showlocal -text [mc "Show local changes"] \ -variable showlocalchanges grid x $page.showlocal -sticky w - ${NS}::checkbutton $page.autoselect -text [mc "Auto-select SHA1 (length)"] \ - -variable autoselect - spinbox $page.autosellen -from 1 -to 40 -width 4 -textvariable autosellen - grid x $page.autoselect $page.autosellen -sticky w - ${NS}::checkbutton $page.hideremotes -text [mc "Hide remote refs"] \ + + ttk::checkbutton $page.hideremotes -text [mc "Hide remote refs"] \ -variable hideremotes grid x $page.hideremotes -sticky w - ${NS}::label $page.ddisp -text [mc "Diff display options"] + ttk::entry $page.refstohide -textvariable refstohide + ttk::label $page.refstohidel -text [mc "Refs to hide (space-separated globs)"] + grid x $page.refstohidel $page.refstohide -sticky ew + grid configure $page.refstohide -padx {0 5} + + 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 + } + + ttk::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"] + ttk::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 - ${NS}::label $page.tabstopl -text [mc "Tab spacing"] - spinbox $page.tabstop -from 1 -to 20 -width 4 -textvariable tabstop + + ttk::label $page.tabstopl -text [mc "Tab spacing"] + ttk::spinbox $page.tabstop -from 1 -to 20 -width 4 -textvariable tabstop grid x $page.tabstopl $page.tabstop -sticky w - ${NS}::checkbutton $page.ntag -text [mc "Display nearby tags/heads"] \ + + 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 - ${NS}::label $page.maxrefsl -text [mc "Maximum # tags/heads to show"] - spinbox $page.maxrefs -from 1 -to 1000 -width 4 -textvariable maxrefs + + ttk::label $page.maxrefsl -text [mc "Maximum # tags/heads to show"] + ttk::spinbox $page.maxrefs -from 1 -to 1000 -width 4 -textvariable maxrefs grid x $page.maxrefsl $page.maxrefs -sticky w - ${NS}::checkbutton $page.ldiff -text [mc "Limit diffs to listed paths"] \ + + ttk::checkbutton $page.ldiff -text [mc "Limit diffs to listed paths"] \ -variable limitdiffs grid x $page.ldiff -sticky w - ${NS}::checkbutton $page.lattr -text [mc "Support per-file encodings"] \ + + ttk::checkbutton $page.lattr -text [mc "Support per-file encodings"] \ -variable perfile_attrs grid x $page.lattr -sticky w - ${NS}::entry $page.extdifft -textvariable extdifftool - ${NS}::frame $page.extdifff - ${NS}::label $page.extdifff.l -text [mc "External diff tool" ] - ${NS}::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 + 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 -side left + pack $page.extdifff.b -side right -padx {0 5} grid x $page.extdifff $page.extdifft -sticky ew + grid configure $page.extdifft -padx {0 5} + + ttk::entry $page.webbrowser -textvariable web_browser + ttk::label $page.webbrowserl -text [mc "Web browser" ] + grid x $page.webbrowserl $page.webbrowser -sticky ew + grid configure $page.webbrowser -padx {0 5} + + grid columnconfigure $page 2 -weight 1 - ${NS}::entry $page.webbrowser -textvariable web_browser - ${NS}::frame $page.webbrowserf - ${NS}::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 - - ${NS}::label $page.lgen -text [mc "General options"] - grid $page.lgen - -sticky w -pady 10 - ${NS}::checkbutton $page.want_ttk -variable want_ttk \ - -text [mc "Use themed widgets"] - if {$have_ttk} { - ${NS}::label $page.ttk_note -text [mc "(change requires restart)"] - } else { - ${NS}::label $page.ttk_note -text [mc "(currently unavailable)"] - } - grid x $page.want_ttk $page.ttk_note -sticky w return $page } proc prefspage_colors {notebook} { - global NS uicolor bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor + global bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor global diffbgcolors + global themeloader set page [create_prefs_page $notebook.colors] - ${NS}::label $page.cdisp -text [mc "Colors: press to choose"] + ttk::label $page.themesel -font mainfontbold \ + -text [mc "Themes - change requires restart"] + grid $page.themesel - -sticky w -pady 10 + + ttk::label $page.themelabel -text [mc "Theme to use after restart"] + makedroplist $page.theme theme {*}[lsort [ttk::style theme names]] + grid x $page.themelabel $page.theme -sticky w + + ttk::entry $page.tloadvar -textvariable themeloader + ttk::frame $page.tloadframe + ttk::label $page.tloadframe.l -text [mc "Theme definition file"] + ttk::button $page.tloadframe.b -text [mc "Choose..."] \ + -command [list choose_themeloader $page] + pack $page.tloadframe.l -side left + pack $page.tloadframe.b -side right -padx {0 5} + pack configure $page.tloadframe.l -padx 0 + grid x $page.tloadframe $page.tloadvar -sticky ew + grid configure $page.tloadvar -padx {0 5} + + ttk::label $page.themelabel2 -text \ + [mc "The theme definition file may affect all themes."] + ttk::button $page.themebut2 -text [mc "Apply theme"] \ + -command [list updatetheme $page] + grid x $page.themebut2 $page.themelabel2 -sticky w + + 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 - ${NS}::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 - ${NS}::button $page.bgbut -text [mc "Background"] \ - -command [list choosecolor bgcolor {} $page.bg [mc "background"] setbg] + ttk::button $page.bgbut -text [mc "Background"] \ + -command [list choosecolor bgcolor {} $page [mc "background"]] grid x $page.bgbut $page.bg -sticky w + label $page.fg -padx 40 -relief sunk -background $fgcolor - ${NS}::button $page.fgbut -text [mc "Foreground"] \ - -command [list choosecolor fgcolor {} $page.fg [mc "foreground"] setfg] + ttk::button $page.fgbut -text [mc "Foreground"] \ + -command [list choosecolor fgcolor {} $page [mc "foreground"]] grid x $page.fgbut $page.fg -sticky w + label $page.diffold -padx 40 -relief sunk -background [lindex $diffcolors 0] - ${NS}::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]] + ttk::button $page.diffoldbut -text [mc "Diff: old lines"] \ + -command [list choosecolor diffcolors 0 $page [mc "diff old lines"]] grid x $page.diffoldbut $page.diffold -sticky w + label $page.diffoldbg -padx 40 -relief sunk -background [lindex $diffbgcolors 0] - ${NS}::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]] + ttk::button $page.diffoldbgbut -text [mc "Diff: old lines bg"] \ + -command [list choosecolor diffbgcolors 0 $page [mc "diff old lines bg"]] grid x $page.diffoldbgbut $page.diffoldbg -sticky w + label $page.diffnew -padx 40 -relief sunk -background [lindex $diffcolors 1] - ${NS}::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]] + ttk::button $page.diffnewbut -text [mc "Diff: new lines"] \ + -command [list choosecolor diffcolors 1 $page [mc "diff new lines"]] grid x $page.diffnewbut $page.diffnew -sticky w + label $page.diffnewbg -padx 40 -relief sunk -background [lindex $diffbgcolors 1] - ${NS}::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]] + ttk::button $page.diffnewbgbut -text [mc "Diff: new lines bg"] \ + -command [list choosecolor diffbgcolors 1 $page [mc "diff new lines bg"]] grid x $page.diffnewbgbut $page.diffnewbg -sticky w + label $page.hunksep -padx 40 -relief sunk -background [lindex $diffcolors 2] - ${NS}::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]] + ttk::button $page.hunksepbut -text [mc "Diff: hunk header"] \ + -command [list choosecolor diffcolors 2 $page [mc "diff hunk header"]] grid x $page.hunksepbut $page.hunksep -sticky w + label $page.markbgsep -padx 40 -relief sunk -background $markbgcolor - ${NS}::button $page.markbgbut -text [mc "Marked line bg"] \ - -command [list choosecolor markbgcolor {} $page.markbgsep \ - [mc "marked line background"] \ - [list $ctext tag conf omark -background]] + ttk::button $page.markbgbut -text [mc "Marked line bg"] \ + -command [list choosecolor markbgcolor {} $page [mc "marked line background"]] grid x $page.markbgbut $page.markbgsep -sticky w + label $page.selbgsep -padx 40 -relief sunk -background $selectbgcolor - ${NS}::button $page.selbgbut -text [mc "Select bg"] \ - -command [list choosecolor selectbgcolor {} $page.selbgsep [mc "background"] setselbg] + ttk::button $page.selbgbut -text [mc "Select bg"] \ + -command [list choosecolor selectbgcolor {} $page [mc "background"]] grid x $page.selbgbut $page.selbgsep -sticky w + + grid columnconfigure $page 2 -weight 1 + return $page } +proc prefspage_set_colorswatches {page} { + global bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor + global diffbgcolors + + $page.bg configure -background $bgcolor + $page.fg configure -background $fgcolor + $page.diffold configure -background [lindex $diffcolors 0] + $page.diffoldbg configure -background [lindex $diffbgcolors 0] + $page.diffnew configure -background [lindex $diffcolors 1] + $page.diffnewbg configure -background [lindex $diffbgcolors 1] + $page.hunksep configure -background [lindex $diffcolors 2] + $page.markbgsep configure -background $markbgcolor + $page.selbgsep configure -background $selectbgcolor +} + proc prefspage_fonts {notebook} { - global NS set page [create_prefs_page $notebook.fonts] - ${NS}::label $page.cfont -text [mc "Fonts: press to choose"] + 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"] + grid columnconfigure $page 2 -weight 1 return $page } proc doprefs {} { - global maxwidth maxgraphpct use_ttk NS - global oldprefs prefstop showneartags showlocalchanges - global uicolor bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor - global tabstop limitdiffs autoselect autosellen extdifftool perfile_attrs - global hideremotes want_ttk have_ttk + global oldprefs prefstop + global {*}$::config_variables set top .gitkprefs set prefstop $top @@ -11733,57 +11863,43 @@ proc doprefs {} { raise $top return } - foreach v {maxwidth maxgraphpct showneartags showlocalchanges \ - limitdiffs tabstop perfile_attrs hideremotes want_ttk} { + foreach v $::config_variables { set oldprefs($v) [set $v] } ttk_toplevel $top wm title $top [mc "Gitk preferences"] make_transient $top . - if {[set use_notebook [expr {$use_ttk && [info command ::ttk::notebook] ne ""}]]} { - set notebook [ttk::notebook $top.notebook] - } else { - set notebook [${NS}::frame $top.notebook -borderwidth 0 -relief flat] - } + 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 { - if {$use_notebook} { - $notebook add $page -text $title - } else { - set btn [${NS}::button $notebook.b_[string map {. X} $page] \ - -text $title -command [list raise $page]] - $page configure -text $title - grid $btn -row 0 -column [incr col] -sticky w - grid $page -row 1 -column 0 -sticky news -columnspan 100 - } + $notebook add $page -text $title } - if {!$use_notebook} { - grid columnconfigure $notebook 0 -weight 1 - grid rowconfigure $notebook 1 -weight 1 - raise [lindex $pages 0] - } + 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 $notebook -sticky news -padx 3 -pady 3 grid rowconfigure $top 0 -weight 1 grid columnconfigure $top 0 -weight 1 - ${NS}::frame $top.buts - ${NS}::button $top.buts.ok -text [mc "OK"] -command prefsok -default active - ${NS}::button $top.buts.can -text [mc "Cancel"] -command prefscan -default normal + 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 + grid $top.buts.ok $top.buts.can -padx 20 + grid $top.buts -sticky w -pady 10 bind $top <Visibility> [list focus $top.buts.ok] + + # let geometry manager determine run, set minimum size + update idletasks + wm minsize $top [winfo reqwidth $top] [winfo reqheight $top] } proc choose_extdiff {} { @@ -11795,15 +11911,60 @@ proc choose_extdiff {} { } } -proc choosecolor {v vi w x cmd} { +proc run_themeloader {f} { + if {![info exists ::_themefiles_seen]} { + set ::_themefiles_seen [dict create] + } + + set fn [file normalize $f] + if {![dict exists $::_themefiles_seen $fn]} { + if {[catch {source $fn} err]} { + error_popup "could not interpret: $fn\n$err" + dict set ::_themefiles_seen $fn 0 + } else { + dict set ::_themefiles_seen $fn 1 + } + } + return [dict get $::_themefiles_seen $fn] +} + +proc updatetheme {prefspage {dotheme 1}} { + global theme + global themeloader + if {$themeloader ne {}} { + if {![run_themeloader $themeloader]} { + set themeloader {} + return + } else { + $prefspage.theme configure -values \ + [lsort [ttk::style theme names]] + } + } + if {$dotheme} { + ttk::style theme use $theme + set_gui_colors + prefspage_set_colorswatches $prefspage + } +} + +proc choose_themeloader {prefspage} { + global themeloader + set tfile [tk_getOpenFile -title [mc "Gitk: select theme definition"] -multiple false] + if {$tfile ne {}} { + set themeloader $tfile + updatetheme $prefspage 0 + } +} + +proc choosecolor {v vi prefspage x} { 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 + set_gui_colors + prefspage_set_colorswatches $prefspage } proc setselbg {c} { @@ -11818,21 +11979,6 @@ proc setselbg {c} { 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 @@ -11856,25 +12002,39 @@ proc setfg {c} { $canv itemconf markid -outline $c } +proc set_gui_colors {} { + global bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor + global diffbgcolors + + setbg $bgcolor + setfg $fgcolor + $ctext tag conf d0 -foreground [lindex $diffcolors 0] + $ctext tag conf d0 -background [lindex $diffbgcolors 0] + $ctext tag conf dresult -foreground [lindex $diffcolors 1] + $ctext tag conf dresult -background [lindex $diffbgcolors 1] + $ctext tag conf hunksep -foreground [lindex $diffcolors 2] + $ctext tag conf omark -background $markbgcolor + setselbg $selectbgcolor +} + proc prefscan {} { global oldprefs prefstop + global {*}$::config_variables - foreach v {maxwidth maxgraphpct showneartags showlocalchanges \ - limitdiffs tabstop perfile_attrs hideremotes want_ttk} { - global $v + foreach v $::config_variables { set $v $oldprefs($v) } catch {destroy $prefstop} unset prefstop fontcan + setttkstyle + set_gui_colors } proc prefsok {} { - global maxwidth maxgraphpct - global oldprefs prefstop showneartags showlocalchanges - global fontpref mainfont textfont uifont - global limitdiffs treediffs perfile_attrs - global hideremotes + global oldprefs prefstop fontpref treediffs + global {*}$::config_variables + global ctext catch {destroy $prefstop} unset prefstop @@ -11920,9 +12080,15 @@ proc prefsok {} { $limitdiffs != $oldprefs(limitdiffs)} { reselectline } - if {$hideremotes != $oldprefs(hideremotes)} { + if {$hideremotes != $oldprefs(hideremotes) || $refstohide != $oldprefs(refstohide)} { rereadrefs } + if {$wrapcomment != $oldprefs(wrapcomment)} { + $ctext tag conf comment -wrap $wrapcomment + } + if {$wrapdefault != $oldprefs(wrapdefault)} { + $ctext configure -wrap $wrapdefault + } } proc formatdate {d} { @@ -12239,7 +12405,7 @@ proc gitattr {path attr default} { set r $path_attr_cache($attr,$path) } else { set r "unspecified" - if {![catch {set line [exec git check-attr $attr -- $path]}]} { + 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 @@ -12266,11 +12432,11 @@ proc cache_gitattr {attr pathlist} { while {$newlist ne {}} { set head [lrange $newlist 0 [expr {$lim - 1}]] set newlist [lrange $newlist $lim end] - if {![catch {set rlist [eval exec git check-attr $attr -- $head]}]} { + 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 [lindex $path 0]] + set path [convertfrom utf-8 [lindex $path 0]] } set path_attr_cache($attr,$path) $value } @@ -12291,6 +12457,23 @@ proc get_path_encoding {path} { return $tcl_enc } +proc is_other_ref_visible {ref} { + global refstohide + + if {$refstohide eq {}} { + return 1 + } + + foreach pat [split $refstohide " "] { + if {$pat eq {}} continue + if {[string match $pat $ref]} { + return 0 + } + } + + return 1 +} + ## For msgcat loading, first locate the installation location. if { [info exists ::env(GITK_MSGSDIR)] } { ## Msgsdir was manually set in the environment. @@ -12300,7 +12483,6 @@ if { [info exists ::env(GITK_MSGSDIR)] } { 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] - unset gitk_prefix } ## Internationalization (i18n) through msgcat and gettext. See @@ -12310,20 +12492,15 @@ namespace import ::msgcat::mc ## And eventually load the actual message catalog ::msgcat::mcload $gitk_msgsdir -# First check that Tcl/Tk is recent enough -if {[catch {package require Tk 8.4} err]} { - show_error {} . [mc "Sorry, gitk cannot run with this version of Tcl/Tk.\n\ - Gitk requires at least Tcl/Tk 8.4."] - exit 1 -} - # on OSX bring the current Wish process window to front if {[tk windowingsystem] eq "aqua"} { - exec osascript -e [format { - tell application "System Events" - set frontmost of processes whose unix id is %d to true - end tell - } [pid] ] + catch { + 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 @@ -12362,6 +12539,17 @@ catch { } } +# 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] @@ -12392,18 +12580,22 @@ set downarrowlen 5 set mingaplen 100 set cmitmode "patch" set wrapcomment "none" +set wrapdefault "none" set showneartags 1 set hideremotes 0 +set refstohide "" +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 40 +set autosellen $hashlength set perfile_attrs 0 -set want_ttk 1 if {[tk windowingsystem] eq "aqua"} { set extdifftool "opendiff" @@ -12413,17 +12605,11 @@ if {[tk windowingsystem] eq "aqua"} { 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 @@ -12463,8 +12649,14 @@ set circleoutlinecolor $fgcolor set foundbgcolor yellow set currentsearchhitbgcolor orange +set theme [ttk::style theme use] +set themeloader {} +set uicolor {} +set uifgcolor {} +set uifgdisabledcolor {} + # button for popping up context menus -if {[tk windowingsystem] eq "aqua"} { +if {[tk windowingsystem] eq "aqua" && [package vcompare $::tcl_version 8.7] < 0} { set ctxbut <Button-2> } else { set ctxbut <Button-3> @@ -12479,14 +12671,14 @@ catch { 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" + set config_file "$env(HOME)/.config/git/gitk" + set config_file_tmp "$env(HOME)/.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" + if {[file exists "$env(HOME)/.gitk"]} { + set config_file "$env(HOME)/.gitk" + set config_file_tmp "$env(HOME)/.gitk-tmp" } elseif {![file exists [file dirname $config_file]]} { file mkdir [file dirname $config_file] } @@ -12496,18 +12688,69 @@ catch { config_check_tmp_exists 50 set config_variables { - mainfont textfont uifont tabstop findmergefiles maxgraphpct maxwidth - cmitmode wrapcomment autoselect autosellen showneartags maxrefs visiblerefs - hideremotes showlocalchanges datetimeformat limitdiffs uicolor want_ttk - bgcolor fgcolor uifgcolor uifgdisabledcolor colors diffcolors mergecolors - markbgcolor diffcontext selectbgcolor foundbgcolor currentsearchhitbgcolor - extdifftool perfile_attrs headbgcolor headfgcolor headoutlinecolor - remotebgcolor tagbgcolor tagfgcolor tagoutlinecolor reflinecolor - filesepbgcolor filesepfgcolor linehoverbgcolor linehoverfgcolor - linehoveroutlinecolor mainheadcirclecolor workingfilescirclecolor - indexcirclecolor circlecolors linkfgcolor circleoutlinecolor diffbgcolors + 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 + refstohide + remotebgcolor + selectbgcolor + showlocalchanges + showneartags + sortrefsbytype + tabstop + tagbgcolor + tagfgcolor + tagoutlinecolor + textfont + theme + themeloader + 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 @@ -12524,8 +12767,6 @@ 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... @@ -12568,7 +12809,7 @@ if {$selecthead eq "HEAD"} { if {$i >= [llength $argv] && $revtreeargs ne {}} { # no -- on command line, but some arguments (other than --argscmd) if {[catch { - set f [eval exec git rev-parse --no-revs --no-flags $revtreeargs] + set 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] @@ -12598,22 +12839,11 @@ set nullid "0000000000000000000000000000000000000000" set nullid2 "0000000000000000000000000000000000000001" set nullfile "/dev/null" -set have_tk85 [expr {[package vcompare $tk_version "8.5"] >= 0}] -if {![info exists have_ttk]} { - set have_ttk [llength [info commands ::ttk::style]] -} -set use_ttk [expr {$have_ttk && $want_ttk}] -set NS [expr {$use_ttk ? "ttk" : ""}] - -if {$use_ttk} { - setttkstyle -} - -regexp {^git version ([\d.]*\d)} [exec git version] _ git_version - -set show_notes {} -if {[package vcompare $git_version "1.6.6.2"] >= 0} { - set show_notes "--show-notes" +if {[file exists $themeloader]} { + if {![run_themeloader $themeloader]} { + puts stderr "Could not interpret themeloader: $themeloader" + exit 1 + } } set appname "gitk" @@ -12663,31 +12893,35 @@ if {[expr {[exec git rev-parse --is-inside-work-tree] == "true"}]} { set worktree [gitworktree] setcoords makewindow -catch { - image create photo gitlogo -width 16 -height 16 +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 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 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 + image create photo gitlogo32 -width 32 -height 32 + gitlogo32 copy gitlogo -zoom 2 2 - wm iconphoto . -default gitlogo gitlogo32 + wm iconphoto . -default gitlogo gitlogo32 + } } # wait for the window to become visible -tkwait visibility . +if {![winfo viewable .]} {tkwait visibility .} set_window_title update readrefs @@ -12727,6 +12961,9 @@ if {[tk windowingsystem] eq "win32"} { focus -force . } +setttkstyle +set_gui_colors + getcommits {} # Local variables: diff --git a/gitk-git/meson.build b/gitk-git/meson.build new file mode 100644 index 0000000000..ca3c0cec58 --- /dev/null +++ b/gitk-git/meson.build @@ -0,0 +1,30 @@ +project('gitk') + +shell = find_program('sh') +wish = find_program('wish') + +# Verify that dependencies of "generate-tcl.sh" are satisfied. +foreach dependency : [ 'chmod', 'mv', 'sed' ] + find_program(dependency) +endforeach + +custom_target( + command: [ + shell, + meson.current_source_dir() / 'generate-tcl.sh', + wish.full_path(), + '@INPUT@', + '@OUTPUT@', + ], + input: 'gitk', + output: 'gitk', + depend_files: [ + 'generate-tcl.sh', + ], + install: true, + install_dir: get_option('bindir'), +) + +if find_program('msgfmt').found() + subdir('po') +endif diff --git a/gitk-git/po/bg.po b/gitk-git/po/bg.po index 87ab1fac24..d1e7d92425 100644 --- a/gitk-git/po/bg.po +++ b/gitk-git/po/bg.po @@ -1,15 +1,15 @@ # Bulgarian translation of gitk po-file. -# Copyright (C) 2014, 2015, 2019 Alexander Shopov <ash@kambanaria.org>. +# Copyright (C) 2014, 2015, 2019, 2020, 2024, 2025 Alexander Shopov <ash@kambanaria.org>. # This file is distributed under the same license as the git package. -# Alexander Shopov <ash@kambanaria.org>, 2014, 2015, 2019. +# Alexander Shopov <ash@kambanaria.org>, 2014, 2015, 2019, 2020, 2024, 2025. # # msgid "" msgstr "" "Project-Id-Version: gitk master\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-03-04 11:27+0100\n" -"PO-Revision-Date: 2019-03-04 11:39+0100\n" +"POT-Creation-Date: 2025-07-22 18:34+0200\n" +"PO-Revision-Date: 2025-07-28 13:38+0200\n" "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n" "Language-Team: Bulgarian <dict@fsa-bg.org>\n" "Language: bg\n" @@ -18,32 +18,25 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: gitk:140 msgid "Couldn't get list of unmerged files:" -msgstr "Списъкът с неслети файлове не може да бъде получен:" +msgstr "Списъкът с неслети файлове не може да се получи:" -#: gitk:212 gitk:2403 msgid "Color words" msgstr "Оцветяване на думите" -#: gitk:217 gitk:2403 gitk:8249 gitk:8282 msgid "Markup words" msgstr "Отбелязване на думите" -#: gitk:324 msgid "Error parsing revisions:" msgstr "Грешка при анализ на версиите:" -#: gitk:380 msgid "Error executing --argscmd command:" msgstr "Грешка при изпълнение на командата с „--argscmd“." -#: gitk:393 msgid "No files selected: --merge specified but no files are unmerged." msgstr "" "Не са избрани файлове — указана е опцията „--merge“, но няма неслети файлове." -#: gitk:396 msgid "" "No files selected: --merge specified but no unmerged files are within file " "limit." @@ -51,326 +44,246 @@ msgstr "" "Не са избрани файлове — указана е опцията „--merge“, но няма неслети файлове " "в ограниченията." -#: gitk:418 gitk:566 msgid "Error executing git log:" msgstr "Грешка при изпълнение на „git log“:" -#: gitk:436 gitk:582 msgid "Reading" msgstr "Прочитане" -#: gitk:496 gitk:4549 msgid "Reading commits..." msgstr "Прочитане на подаванията…" -#: gitk:499 gitk:1641 gitk:4552 msgid "No commits selected" msgstr "Не са избрани подавания" -#: gitk:1449 gitk:4069 gitk:12583 msgid "Command line" msgstr "Команден ред" -#: gitk:1515 msgid "Can't parse git log output:" msgstr "Изходът от „git log“ не може да се анализира:" -#: gitk:1744 msgid "No commit information available" msgstr "Липсва информация за подавания" -#: gitk:1907 gitk:1936 gitk:4339 gitk:9789 gitk:11388 gitk:11668 msgid "OK" msgstr "Добре" -#: gitk:1938 gitk:4341 gitk:9225 gitk:9304 gitk:9434 gitk:9520 gitk:9791 -#: gitk:11389 gitk:11669 msgid "Cancel" msgstr "Отказ" -#: gitk:2087 msgid "&Update" msgstr "&Обновяване" -#: gitk:2088 msgid "&Reload" msgstr "&Презареждане" -#: gitk:2089 msgid "Reread re&ferences" -msgstr "&Наново прочитане" +msgstr "Прочитане &наново" -#: gitk:2090 msgid "&List references" msgstr "&Изброяване на указателите" -#: gitk:2092 msgid "Start git &gui" msgstr "&Стартиране на „git gui“" -#: gitk:2094 msgid "&Quit" msgstr "&Спиране на програмата" -#: gitk:2086 msgid "&File" msgstr "&Файл" -#: gitk:2098 msgid "&Preferences" msgstr "&Настройки" -#: gitk:2097 msgid "&Edit" msgstr "&Редактиране" -#: gitk:2102 msgid "&New view..." msgstr "&Нов изглед…" -#: gitk:2103 msgid "&Edit view..." msgstr "&Редактиране на изгледа…" -#: gitk:2104 msgid "&Delete view" msgstr "&Изтриване на изгледа" -#: gitk:2106 msgid "&All files" msgstr "&Всички файлове" -#: gitk:2101 msgid "&View" msgstr "&Изглед" -#: gitk:2111 gitk:2121 msgid "&About gitk" msgstr "&Относно gitk" -#: gitk:2112 gitk:2126 msgid "&Key bindings" msgstr "&Клавишни комбинации" -#: gitk:2110 gitk:2125 msgid "&Help" msgstr "Помо&щ" -#: gitk:2203 gitk:8681 -msgid "SHA1 ID:" -msgstr "SHA1:" +msgid "Commit ID:" +msgstr "Подаване:" -#: gitk:2247 msgid "Row" msgstr "Ред" -#: gitk:2285 msgid "Find" msgstr "Търсене" -#: gitk:2313 msgid "commit" msgstr "подаване" -#: gitk:2317 gitk:2319 gitk:4711 gitk:4734 gitk:4758 gitk:6779 gitk:6851 -#: gitk:6936 msgid "containing:" msgstr "съдържащо:" -#: gitk:2320 gitk:3550 gitk:3555 gitk:4787 msgid "touching paths:" msgstr "в пътищата:" -#: gitk:2321 gitk:4801 msgid "adding/removing string:" msgstr "добавящо/премахващо низ" -#: gitk:2322 gitk:4803 msgid "changing lines matching:" msgstr "променящо редове напасващи:" -#: gitk:2331 gitk:2333 gitk:4790 msgid "Exact" msgstr "Точно" -#: gitk:2333 gitk:4878 gitk:6747 msgid "IgnCase" msgstr "Без регистър" -#: gitk:2333 gitk:4760 gitk:4876 gitk:6743 msgid "Regexp" msgstr "Рег. израз" -#: gitk:2335 gitk:2336 gitk:4898 gitk:4928 gitk:4935 gitk:6872 gitk:6940 msgid "All fields" msgstr "Всички полета" -#: gitk:2336 gitk:4895 gitk:4928 gitk:6810 msgid "Headline" msgstr "Първи ред" -#: gitk:2337 gitk:4895 gitk:6810 gitk:6940 gitk:7413 msgid "Comments" msgstr "Коментари" -#: gitk:2337 gitk:4895 gitk:4900 gitk:4935 gitk:6810 gitk:7348 gitk:8859 -#: gitk:8874 msgid "Author" msgstr "Автор" -#: gitk:2337 gitk:4895 gitk:6810 gitk:7350 msgid "Committer" msgstr "Подаващ" -#: gitk:2371 msgid "Search" msgstr "Търсене" -#: gitk:2379 msgid "Diff" msgstr "Разлики" -#: gitk:2381 msgid "Old version" msgstr "Стара версия" -#: gitk:2383 msgid "New version" msgstr "Нова версия" -#: gitk:2386 msgid "Lines of context" msgstr "Контекст в редове" -#: gitk:2396 msgid "Ignore space change" msgstr "Празните знаци без значение" -#: gitk:2400 gitk:2402 gitk:7983 gitk:8235 msgid "Line diff" msgstr "Поредови разлики" -#: gitk:2467 msgid "Patch" msgstr "Кръпка" -#: gitk:2469 msgid "Tree" msgstr "Дърво" -#: gitk:2639 gitk:2660 +msgid "Unknown windowing system, cannot bind mouse" +msgstr "Непозната графична система, не може да се установи връзка с мишка" + msgid "Diff this -> selected" msgstr "Разлики между това и избраното" -#: gitk:2640 gitk:2661 msgid "Diff selected -> this" msgstr "Разлики между избраното и това" -#: gitk:2641 gitk:2662 msgid "Make patch" msgstr "Създаване на кръпка" -#: gitk:2642 gitk:9283 msgid "Create tag" msgstr "Създаване на етикет" -#: gitk:2643 -msgid "Copy commit summary" -msgstr "Копиране на информацията за подаване" +msgid "Copy commit reference" +msgstr "Копиране на указателя на подаване" -#: gitk:2644 gitk:9414 msgid "Write commit to file" msgstr "Запазване на подаването във файл" -#: gitk:2645 msgid "Create new branch" msgstr "Създаване на нов клон" -#: gitk:2646 msgid "Cherry-pick this commit" msgstr "Отбиране на това подаване" -#: gitk:2647 msgid "Reset HEAD branch to here" msgstr "Привеждане на върха на клона към текущото подаване" -#: gitk:2648 msgid "Mark this commit" msgstr "Отбелязване на това подаване" -#: gitk:2649 msgid "Return to mark" msgstr "Връщане към отбелязаното подаване" -#: gitk:2650 msgid "Find descendant of this and mark" msgstr "Откриване и отбелязване на наследниците" -#: gitk:2651 msgid "Compare with marked commit" msgstr "Сравнение с отбелязаното подаване" -#: gitk:2652 gitk:2663 msgid "Diff this -> marked commit" msgstr "Разлики между това и отбелязаното" -#: gitk:2653 gitk:2664 msgid "Diff marked commit -> this" msgstr "Разлики между отбелязаното и това" -#: gitk:2654 msgid "Revert this commit" msgstr "Отмяна на това подаване" -#: gitk:2670 msgid "Check out this branch" msgstr "Изтегляне на този клон" -#: gitk:2671 msgid "Rename this branch" msgstr "Преименуване на този клон" -#: gitk:2672 msgid "Remove this branch" msgstr "Изтриване на този клон" -#: gitk:2673 msgid "Copy branch name" msgstr "Копиране на името на клона" -#: gitk:2680 msgid "Highlight this too" msgstr "Отбелязване и на това" -#: gitk:2681 msgid "Highlight this only" msgstr "Отбелязване само на това" -#: gitk:2682 msgid "External diff" msgstr "Външна програма за разлики" -#: gitk:2683 msgid "Blame parent commit" msgstr "Анотиране на родителското подаване" -#: gitk:2684 msgid "Copy path" msgstr "Копиране на пътя" -#: gitk:2691 msgid "Show origin of this line" msgstr "Показване на произхода на този ред" -#: gitk:2692 msgid "Run git gui blame on this line" msgstr "Изпълнение на „git gui blame“ върху този ред" -#: gitk:3036 msgid "About gitk" msgstr "Относно gitk" -#: gitk:3038 msgid "" "\n" "Gitk - a commit viewer for git\n" @@ -386,324 +299,250 @@ msgstr "" "\n" "Използвайте и разпространявайте при условията на ОПЛ на ГНУ" -#: gitk:3046 gitk:3113 gitk:10004 msgid "Close" msgstr "Затваряне" -#: gitk:3067 msgid "Gitk key bindings" msgstr "Клавишни комбинации" -#: gitk:3070 msgid "Gitk key bindings:" msgstr "Клавишни комбинации:" -#: gitk:3072 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\tСпиране на програмата" -#: gitk:3073 #, tcl-format msgid "<%s-W>\t\tClose window" msgstr "<%s-W>\t\tЗатваряне на прозореца" -#: gitk:3074 msgid "<Home>\t\tMove to first commit" msgstr "<Home>\t\tКъм първото подаване" -#: gitk:3075 msgid "<End>\t\tMove to last commit" msgstr "<End>\t\tКъм последното подаване" -#: gitk:3076 msgid "<Up>, p, k\tMove up one commit" msgstr "<Up>, p, k\tЕдно подаване нагоре" -#: gitk:3077 msgid "<Down>, n, j\tMove down one commit" msgstr "<Down>, n, j\tЕдно подаване надолу" -#: gitk:3078 msgid "<Left>, z, h\tGo back in history list" msgstr "<Left>, z, h\tНазад в историята" -#: gitk:3079 msgid "<Right>, x, l\tGo forward in history list" msgstr "<Right>, x, l\tНапред в историята" -#: gitk:3080 #, tcl-format msgid "<%s-n>\tGo to n-th parent of current commit in history list" msgstr "<%s-n>\tКъм n-тия родител на текущото подаване в историята" -#: gitk:3081 msgid "<PageUp>\tMove up one page in commit list" msgstr "<PageUp>\tСтраница нагоре в списъка с подаванията" -#: gitk:3082 msgid "<PageDown>\tMove down one page in commit list" msgstr "<PageDown>\tСтраница надолу в списъка с подаванията" -#: gitk:3083 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Home>\tКъм началото на списъка с подаванията" -#: gitk:3084 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-End>\tКъм края на списъка с подаванията" -#: gitk:3085 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Up>\tРед нагоре в списъка с подавания" -#: gitk:3086 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Down>\tРед надолу в списъка с подавания" -#: gitk:3087 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-PageUp>\tСтраница нагоре в списъка с подавания" -#: gitk:3088 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-PageDown>\tСтраница надолу в списъка с подавания" -#: gitk:3089 msgid "<Shift-Up>\tFind backwards (upwards, later commits)" msgstr "<Shift-Up>\tТърсене назад (визуално нагоре, исторически — последващи)" -#: gitk:3090 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" msgstr "" "<Shift-Down>\tТърсене напред (визуално надолу, исторически — предхождащи)" -#: gitk:3091 msgid "<Delete>, b\tScroll diff view up one page" msgstr "<Delete>, b\tСтраница нагоре в изгледа за разлики" -#: gitk:3092 msgid "<Backspace>\tScroll diff view up one page" msgstr "<Backspace>\tСтраница надолу в изгледа за разлики" -#: gitk:3093 msgid "<Space>\t\tScroll diff view down one page" msgstr "<Space>\t\tСтраница надолу в изгледа за разлики" -#: gitk:3094 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\t18 реда нагоре в изгледа за разлики" -#: gitk:3095 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\t18 реда надолу в изгледа за разлики" -#: gitk:3096 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\tТърсене" -#: gitk:3097 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\tКъм следващата поява" -#: gitk:3098 msgid "<Return>\tMove to next find hit" msgstr "<Return>\tКъм следващата поява" -#: gitk:3099 msgid "g\t\tGo to commit" msgstr "g\t\tКъм последното подаване" -#: gitk:3100 msgid "/\t\tFocus the search box" msgstr "/\t\tФокус върху полето за търсене" -#: gitk:3101 msgid "?\t\tMove to previous find hit" msgstr "?\t\tКъм предишната поява" -#: gitk:3102 msgid "f\t\tScroll diff view to next file" msgstr "f\t\tСледващ файл в изгледа за разлики" -#: gitk:3103 #, tcl-format msgid "<%s-S>\t\tSearch for next hit in diff view" msgstr "<%s-S>\t\tТърсене на следващата поява в изгледа за разлики" -#: gitk:3104 #, tcl-format msgid "<%s-R>\t\tSearch for previous hit in diff view" msgstr "<%s-R>\t\tТърсене на предишната поява в изгледа за разлики" -#: gitk:3105 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-KP+>\tПо-голям размер на шрифта" -#: gitk:3106 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-plus>\tПо-голям размер на шрифта" -#: gitk:3107 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-KP->\tПо-малък размер на шрифта" -#: gitk:3108 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-minus>\tПо-малък размер на шрифта" -#: gitk:3109 msgid "<F5>\t\tUpdate" msgstr "<F5>\t\tОбновяване" -#: gitk:3574 gitk:3583 #, tcl-format msgid "Error creating temporary directory %s:" msgstr "Грешка при създаването на временната директория „%s“:" -#: gitk:3596 #, tcl-format msgid "Error getting \"%s\" from %s:" msgstr "Грешка при получаването на „%s“ от %s:" -#: gitk:3659 msgid "command failed:" msgstr "неуспешно изпълнение на команда:" -#: gitk:3808 msgid "No such commit" msgstr "Такова подаване няма" -#: gitk:3822 msgid "git gui blame: command failed:" msgstr "„git gui blame“: неуспешно изпълнение на команда:" -#: gitk:3853 #, tcl-format msgid "Couldn't read merge head: %s" -msgstr "Върхът за сливане не може да бъде прочетен: %s" +msgstr "Върхът за сливане не може да се прочете: %s" -#: gitk:3861 #, tcl-format msgid "Error reading index: %s" msgstr "Грешка при прочитане на индекса: %s" -#: gitk:3886 #, tcl-format msgid "Couldn't start git blame: %s" -msgstr "Командата „git blame“ не може да бъде стартирана: %s" +msgstr "Командата „git blame“ не може да се стартира: %s" -#: gitk:3889 gitk:6778 msgid "Searching" msgstr "Търсене" -#: gitk:3921 #, tcl-format msgid "Error running git blame: %s" msgstr "Грешка при изпълнението на „git blame“: %s" -#: gitk:3949 #, tcl-format msgid "That line comes from commit %s, which is not in this view" msgstr "Този ред идва от подаването %s, което не е в изгледа" -#: gitk:3963 msgid "External diff viewer failed:" msgstr "Неуспешно изпълнение на външната програма за разлики:" -#: gitk:4067 msgid "All files" msgstr "Всички файлове" -#: gitk:4091 msgid "View" msgstr "Изглед" -#: gitk:4094 msgid "Gitk view definition" msgstr "Дефиниция на изглед в Gitk" -#: gitk:4098 msgid "Remember this view" msgstr "Запазване на този изглед" -#: gitk:4099 msgid "References (space separated list):" msgstr "Указатели (списък с разделител интервал):" -#: gitk:4100 msgid "Branches & tags:" msgstr "Клони и етикети:" -#: gitk:4101 msgid "All refs" msgstr "Всички указатели" -#: gitk:4102 msgid "All (local) branches" msgstr "Всички (локални) клони" -#: gitk:4103 msgid "All tags" msgstr "Всички етикети" -#: gitk:4104 msgid "All remote-tracking branches" msgstr "Всички следящи клони" -#: gitk:4105 msgid "Commit Info (regular expressions):" msgstr "Информация за подаване (рег. изр.):" -#: gitk:4106 msgid "Author:" msgstr "Автор:" -#: gitk:4107 msgid "Committer:" msgstr "Подал:" -#: gitk:4108 msgid "Commit Message:" msgstr "Съобщение при подаване:" -#: gitk:4109 msgid "Matches all Commit Info criteria" msgstr "Съвпадение по всички характеристики на подаването" -#: gitk:4110 msgid "Matches no Commit Info criteria" msgstr "Не съвпада по никоя от характеристиките на подаването" -#: gitk:4111 msgid "Changes to Files:" msgstr "Промени по файловете:" -#: gitk:4112 msgid "Fixed String" msgstr "Дословен низ" -#: gitk:4113 msgid "Regular Expression" msgstr "Регулярен израз" -#: gitk:4114 msgid "Search string:" msgstr "Низ за търсене:" -#: gitk:4115 msgid "" "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" @@ -711,204 +550,159 @@ msgstr "" "Дата на подаване („2 weeks ago“ (преди 2 седмици), „2009-03-17 15:27:38“, " "„March 17, 2009 15:27:38“):" -#: gitk:4116 msgid "Since:" msgstr "От:" -#: gitk:4117 msgid "Until:" msgstr "До:" -#: gitk:4118 msgid "Limit and/or skip a number of revisions (positive integer):" msgstr "" "Ограничаване и/или прескачане на определен брой версии (неотрицателно цяло " "число):" -#: gitk:4119 msgid "Number to show:" msgstr "Брой показани:" -#: gitk:4120 msgid "Number to skip:" msgstr "Брой прескочени:" -#: gitk:4121 msgid "Miscellaneous options:" msgstr "Разни:" -#: gitk:4122 msgid "Strictly sort by date" msgstr "Подреждане по дата" -#: gitk:4123 msgid "Mark branch sides" msgstr "Отбелязване на страните по клона" -#: gitk:4124 msgid "Limit to first parent" msgstr "Само първия родител" -#: gitk:4125 msgid "Simple history" msgstr "Опростена история" -#: gitk:4126 msgid "Additional arguments to git log:" msgstr "Допълнителни аргументи към „git log“:" -#: gitk:4127 msgid "Enter files and directories to include, one per line:" msgstr "Въведете файловете и директориите за включване, по елемент на ред" -#: gitk:4128 msgid "Command to generate more commits to include:" msgstr "" -"Команда за генерирането на допълнителни подавания, които да бъдат включени:" +"Команда за генерирането на допълнителни подавания, които да се включат:" -#: gitk:4252 msgid "Gitk: edit view" msgstr "Gitk: редактиране на изглед" -#: gitk:4260 msgid "-- criteria for selecting revisions" msgstr "— критерии за избор на версии" -#: gitk:4265 msgid "View Name" msgstr "Име на изглед" -#: gitk:4340 msgid "Apply (F5)" msgstr "Прилагане (F5)" -#: gitk:4378 msgid "Error in commit selection arguments:" msgstr "Грешка в аргументите за избор на подавания:" -#: gitk:4433 gitk:4486 gitk:4948 gitk:4962 gitk:6232 gitk:12524 gitk:12525 msgid "None" msgstr "Няма" -#: gitk:5045 gitk:5050 msgid "Descendant" msgstr "Наследник" -#: gitk:5046 msgid "Not descendant" msgstr "Не е наследник" -#: gitk:5053 gitk:5058 msgid "Ancestor" msgstr "Предшественик" -#: gitk:5054 msgid "Not ancestor" msgstr "Не е предшественик" -#: gitk:5348 msgid "Local changes checked in to index but not committed" msgstr "Локални промени добавени към индекса, но неподадени" -#: gitk:5384 msgid "Local uncommitted changes, not checked in to index" msgstr "Локални промени извън индекса" -#: gitk:7158 +msgid "Error starting web browser:" +msgstr "Грешка при стартирането на уеб браузър:" + msgid "and many more" msgstr "и още много" -#: gitk:7161 msgid "many" msgstr "много" -#: gitk:7352 msgid "Tags:" msgstr "Етикети:" -#: gitk:7369 gitk:7375 gitk:8854 msgid "Parent" msgstr "Родител" -#: gitk:7380 msgid "Child" msgstr "Дете" -#: gitk:7389 msgid "Branch" msgstr "Клон" -#: gitk:7392 msgid "Follows" msgstr "Следва" -#: gitk:7395 msgid "Precedes" msgstr "Предшества" -#: gitk:7990 #, tcl-format msgid "Error getting diffs: %s" msgstr "Грешка при получаването на разликите: %s" -#: gitk:8679 msgid "Goto:" msgstr "Към ред:" -#: gitk:8700 #, tcl-format -msgid "Short SHA1 id %s is ambiguous" -msgstr "Съкратената сума по SHA1 %s не е еднозначна" +msgid "Short commit ID %s is ambiguous" +msgstr "Съкратената контролна сума %s не е еднозначна" -#: gitk:8707 #, tcl-format msgid "Revision %s is not known" msgstr "Непозната версия %s" -#: gitk:8717 #, tcl-format -msgid "SHA1 id %s is not known" -msgstr "Непозната сума по SHA1 %s" +msgid "Commit ID %s is not known" +msgstr "Непозната контролна сума %s" -#: gitk:8719 #, tcl-format msgid "Revision %s is not in the current view" msgstr "Версия %s не е в текущия изглед" -#: gitk:8861 gitk:8876 msgid "Date" msgstr "Дата" -#: gitk:8864 msgid "Children" msgstr "Деца" -#: gitk:8927 #, tcl-format msgid "Reset %s branch to here" msgstr "Зануляване на клона „%s“ към текущото подаване" -#: gitk:8929 msgid "Detached head: can't reset" msgstr "Несвързан връх: невъзможно зануляване" -#: gitk:9034 gitk:9040 msgid "Skipping merge commit " msgstr "Пропускане на подаването на сливането" -#: gitk:9049 gitk:9054 msgid "Error getting patch ID for " msgstr "Грешка при получаването на идентификатора на " -#: gitk:9050 gitk:9055 msgid " - stopping\n" msgstr " — спиране\n" -#: gitk:9060 gitk:9063 gitk:9071 gitk:9085 gitk:9094 msgid "Commit " msgstr "Подаване" -#: gitk:9064 msgid "" " is the same patch as\n" " " @@ -916,7 +710,6 @@ msgstr "" " е същата кръпка като\n" " " -#: gitk:9072 msgid "" " differs from\n" " " @@ -924,7 +717,6 @@ msgstr "" " се различава от\n" " " -#: gitk:9074 msgid "" "Diff of commits:\n" "\n" @@ -932,147 +724,113 @@ msgstr "" "Разлика между подаванията:\n" "\n" -#: gitk:9086 gitk:9095 #, tcl-format msgid " has %s children - stopping\n" msgstr " има %s деца — спиране\n" -#: gitk:9114 #, tcl-format msgid "Error writing commit to file: %s" msgstr "Грешка при запазването на подаването във файл: %s" -#: gitk:9120 #, tcl-format msgid "Error diffing commits: %s" msgstr "Грешка при изчисляването на разликите между подаванията: %s" -#: gitk:9166 msgid "Top" msgstr "Най-горе" -#: gitk:9167 msgid "From" msgstr "От" -#: gitk:9172 msgid "To" msgstr "До" -#: gitk:9196 msgid "Generate patch" msgstr "Генериране на кръпка" -#: gitk:9198 msgid "From:" msgstr "От:" -#: gitk:9207 msgid "To:" msgstr "До:" -#: gitk:9216 msgid "Reverse" msgstr "Обръщане" -#: gitk:9218 gitk:9428 msgid "Output file:" msgstr "Запазване във файла:" -#: gitk:9224 msgid "Generate" msgstr "Генериране" -#: gitk:9262 msgid "Error creating patch:" msgstr "Грешка при създаването на кръпка:" -#: gitk:9285 gitk:9416 gitk:9504 msgid "ID:" msgstr "Идентификатор:" -#: gitk:9294 msgid "Tag name:" msgstr "Име на етикет:" -#: gitk:9297 msgid "Tag message is optional" msgstr "Съобщението за етикет е незадължително" -#: gitk:9299 msgid "Tag message:" msgstr "Съобщение за етикет:" -#: gitk:9303 gitk:9474 msgid "Create" msgstr "Създаване" -#: gitk:9321 msgid "No tag name specified" msgstr "Липсва име на етикет" -#: gitk:9325 #, tcl-format msgid "Tag \"%s\" already exists" msgstr "Етикетът „%s“ вече съществува" -#: gitk:9335 msgid "Error creating tag:" msgstr "Грешка при създаването на етикет:" -#: gitk:9425 msgid "Command:" msgstr "Команда:" -#: gitk:9433 msgid "Write" msgstr "Запазване" -#: gitk:9451 msgid "Error writing commit:" msgstr "Грешка при запазването на подаването:" -#: gitk:9473 msgid "Create branch" msgstr "Създаване на клон" -#: gitk:9489 #, tcl-format msgid "Rename branch %s" msgstr "Преименуване на клона „%s“" -#: gitk:9490 msgid "Rename" msgstr "Преименуване" -#: gitk:9514 msgid "Name:" msgstr "Име:" -#: gitk:9538 msgid "Please specify a name for the new branch" msgstr "Укажете име за новия клон" -#: gitk:9543 #, tcl-format msgid "Branch '%s' already exists. Overwrite?" -msgstr "Клонът „%s“ вече съществува. Да бъде ли презаписан?" +msgstr "Клонът „%s“ вече съществува. Да се презапише ли?" -#: gitk:9587 msgid "Please specify a new name for the branch" msgstr "Укажете ново име за клона" -#: gitk:9650 #, tcl-format msgid "Commit %s is already included in branch %s -- really re-apply it?" msgstr "" -"Подаването „%s“ вече е включено в клона „%s“ — да бъде ли приложено отново?" +"Подаването „%s“ вече е включено в клона „%s“ — да се приложи ли отново?" -#: gitk:9655 msgid "Cherry-picking" msgstr "Отбиране" -#: gitk:9664 #, tcl-format msgid "" "Cherry-pick failed because of local changes to file '%s'.\n" @@ -1081,7 +839,6 @@ msgstr "" "Неуспешно отбиране, защото във файла „%s“ има локални промени.\n" "Подайте, занулете или ги скатайте и пробвайте отново." -#: gitk:9670 msgid "" "Cherry-pick failed because of merge conflict.\n" "Do you wish to run git citool to resolve it?" @@ -1089,20 +846,16 @@ msgstr "" "Неуспешно отбиране поради конфликти при сливане.\n" "Искате ли да ги коригирате чрез „git citool“?" -#: gitk:9686 gitk:9744 msgid "No changes committed" msgstr "Не са подадени промени" -#: gitk:9713 #, tcl-format msgid "Commit %s is not included in branch %s -- really revert it?" -msgstr "Подаването „%s“ не е включено в клона „%s“. Да бъде ли отменено?" +msgstr "Подаването „%s“ не е включено в клона „%s“. Да се отменени ли?" -#: gitk:9718 msgid "Reverting" msgstr "Отмяна" -#: gitk:9726 #, tcl-format msgid "" "Revert failed because of local changes to the following files:%s Please " @@ -1111,7 +864,6 @@ msgstr "" "Неуспешна отмяна, защото във файла „%s“ има локални промени.\n" "Подайте, занулете или ги скатайте и пробвайте отново." -#: gitk:9730 msgid "" "Revert failed because of merge conflict.\n" " Do you wish to run git citool to resolve it?" @@ -1119,53 +871,42 @@ msgstr "" "Неуспешно отмяна поради конфликти при сливане.\n" "Искате ли да ги коригирате чрез „git citool“?" -#: gitk:9773 msgid "Confirm reset" msgstr "Потвърждаване на зануляването" -#: gitk:9775 #, tcl-format msgid "Reset branch %s to %s?" msgstr "Да се занули ли клонът „%s“ към „%s“?" -#: gitk:9777 msgid "Reset type:" msgstr "Вид зануляване:" -#: gitk:9780 msgid "Soft: Leave working tree and index untouched" msgstr "Слабо: работното дърво и индекса остават същите" -#: gitk:9783 msgid "Mixed: Leave working tree untouched, reset index" msgstr "Смесено: работното дърво остава същото, индексът се занулява" -#: gitk:9786 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" msgstr "" "Силно: зануляване и на работното дърво, и на индекса\n" -"(ВСИЧКИ локални промени ще бъдат безвъзвратно загубени)" +"(ВСИЧКИ локални промени ще се загубят безвъзвратно)" -#: gitk:9803 msgid "Resetting" msgstr "Зануляване" -#: gitk:9876 #, tcl-format msgid "A local branch named %s exists already" msgstr "Вече съществува локален клон „%s“." -#: gitk:9884 msgid "Checking out" msgstr "Изтегляне" -#: gitk:9943 msgid "Cannot delete the currently checked-out branch" -msgstr "Текущо изтегленият клон не може да бъде изтрит" +msgstr "Текущо изтегленият клон не може да се изтрие" -#: gitk:9949 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -1174,16 +915,16 @@ msgstr "" "Подаванията на клона „%s“ не са на никой друг клон.\n" "Наистина ли искате да изтриете клона „%s“?" -#: gitk:9980 #, tcl-format msgid "Tags and heads: %s" msgstr "Етикети и върхове: %s" -#: gitk:9997 msgid "Filter" msgstr "Филтриране" -#: gitk:10293 +msgid "Sort refs by type" +msgstr "Подредба на указателите по вид" + msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." @@ -1191,217 +932,167 @@ msgstr "" "Грешка при прочитането на топологията на подаванията. Информацията за клона " "и предшестващите/следващите етикети ще е непълна." -#: gitk:11270 msgid "Tag" msgstr "Етикет" -#: gitk:11274 msgid "Id" msgstr "Идентификатор" -#: gitk:11357 -msgid "Gitk font chooser" -msgstr "Избор на шрифт за Gitk" - -#: gitk:11374 -msgid "B" -msgstr "Ч" - -#: gitk:11377 -msgid "I" -msgstr "К" - -#: gitk:11495 msgid "Commit list display options" msgstr "Настройки на списъка с подавания" -#: gitk:11498 msgid "Maximum graph width (lines)" msgstr "Максимална широчина на графа (в редове)" -#: gitk:11502 #, no-tcl-format msgid "Maximum graph width (% of pane)" msgstr "Максимална широчина на графа (% от панела)" -#: gitk:11505 msgid "Show local changes" msgstr "Показване на локалните промени" -#: gitk:11508 -msgid "Auto-select SHA1 (length)" -msgstr "Автоматично избиране на SHA1 (дължина)" - -#: gitk:11512 msgid "Hide remote refs" msgstr "Скриване на отдалечените указатели" -#: gitk:11516 +msgid "Copy commit ID to clipboard" +msgstr "Копиране на контролната сума към буфера за обмен" + +msgid "Copy commit ID to X11 selection" +msgstr "Копиране на контролната сума в селекцията на X11" + +msgid "Length of commit ID to copy" +msgstr "Дължина на контролната сума, която се копира" + +msgid "Wheel scrolling multiplier" +msgstr "Множител за колелцето на мишката" + msgid "Diff display options" msgstr "Настройки на показването на разликите" -#: gitk:11518 msgid "Tab spacing" msgstr "Широчина на табулатора" -#: gitk:11521 +msgid "Wrap comment text" +msgstr "Пренасяне на думите в коментарите" + +msgid "Wrap other text" +msgstr "Пренасяне на другия текст" + msgid "Display nearby tags/heads" msgstr "Извеждане на близките етикети и върхове" -#: gitk:11524 msgid "Maximum # tags/heads to show" msgstr "Максимален брой етикети/върхове за показване" -#: gitk:11527 msgid "Limit diffs to listed paths" msgstr "Разлика само в избраните пътища" -#: gitk:11530 msgid "Support per-file encodings" msgstr "Поддръжка на различни кодирания за всеки файл" -#: gitk:11536 gitk:11683 msgid "External diff tool" msgstr "Външен инструмент за разлики" -#: gitk:11537 msgid "Choose..." msgstr "Избор…" -#: gitk:11542 -msgid "General options" -msgstr "Общи настройки" - -#: gitk:11545 -msgid "Use themed widgets" -msgstr "Използване на тема за графичните обекти" - -#: gitk:11547 -msgid "(change requires restart)" -msgstr "(промяната изисква рестартиране на Gitk)" +msgid "Web browser" +msgstr "Уеб браузър" -#: gitk:11549 -msgid "(currently unavailable)" -msgstr "(в момента недостъпно)" - -#: gitk:11560 msgid "Colors: press to choose" msgstr "Цветове: избира се с натискане" -#: gitk:11563 msgid "Interface" msgstr "Интерфейс" -#: gitk:11564 msgid "interface" msgstr "интерфейс" -#: gitk:11567 msgid "Background" msgstr "Фон" -#: gitk:11568 gitk:11598 msgid "background" msgstr "фон" -#: gitk:11571 msgid "Foreground" msgstr "Знаци" -#: gitk:11572 msgid "foreground" msgstr "знаци" -#: gitk:11575 msgid "Diff: old lines" msgstr "Разлика: стари редове" -#: gitk:11576 msgid "diff old lines" msgstr "разлика, стари редове" -#: gitk:11580 +msgid "Diff: old lines bg" +msgstr "Разлика: фон на стари редове" + +msgid "diff old lines bg" +msgstr "разлика, фон на стари редове" + msgid "Diff: new lines" msgstr "Разлика: нови редове" -#: gitk:11581 msgid "diff new lines" msgstr "разлика, нови редове" -#: gitk:11585 +msgid "Diff: new lines bg" +msgstr "Разлика: фон на нови редове" + +msgid "diff new lines bg" +msgstr "разлика, фон на нови редове" + msgid "Diff: hunk header" msgstr "Разлика: начало на парче" -#: gitk:11587 msgid "diff hunk header" msgstr "разлика, начало на парче" -#: gitk:11591 msgid "Marked line bg" msgstr "Фон на отбелязан ред" -#: gitk:11593 msgid "marked line background" msgstr "фон на отбелязан ред" -#: gitk:11597 msgid "Select bg" msgstr "Избор на фон" -#: gitk:11606 msgid "Fonts: press to choose" msgstr "Шрифтове: избира се с натискане" -#: gitk:11608 msgid "Main font" msgstr "Основен шрифт" -#: gitk:11609 msgid "Diff display font" msgstr "Шрифт за разликите" -#: gitk:11610 msgid "User interface font" msgstr "Шрифт на интерфейса" -#: gitk:11632 msgid "Gitk preferences" msgstr "Настройки на Gitk" -#: gitk:11641 msgid "General" msgstr "Общи" -#: gitk:11642 msgid "Colors" msgstr "Цветове" -#: gitk:11643 msgid "Fonts" msgstr "Шрифтове" -#: gitk:11693 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk: избор на цвят на „%s“" -#: gitk:12206 -msgid "" -"Sorry, gitk cannot run with this version of Tcl/Tk.\n" -" Gitk requires at least Tcl/Tk 8.4." -msgstr "" -"Тази версия на Tcl/Tk не се поддържа от Gitk.\n" -" Необходима ви е поне Tcl/Tk 8.4." - -#: gitk:12416 msgid "Cannot find a git repository here." msgstr "Тук липсва хранилище на Git." -#: gitk:12463 #, tcl-format msgid "Ambiguous argument '%s': both revision and filename" msgstr "Нееднозначен аргумент „%s“: има и такава версия, и такъв файл" -#: gitk:12475 msgid "Bad arguments to gitk:" msgstr "Неправилни аргументи на gitk:" diff --git a/gitk-git/po/meson.build b/gitk-git/po/meson.build new file mode 100644 index 0000000000..c00b3d5c8d --- /dev/null +++ b/gitk-git/po/meson.build @@ -0,0 +1,20 @@ +import('i18n').gettext('gitk', + languages: [ + 'bg', + 'ca', + 'de', + 'es', + 'fr', + 'hu', + 'it', + 'ja', + 'pt_br', + 'pt_pt', + 'ru', + 'sv', + 'ta', + 'vi', + 'zh_cn', + ], + install: true, +) diff --git a/gitk-git/po/sv.po b/gitk-git/po/sv.po index 2a06fe5bbc..5afbe6da1d 100644 --- a/gitk-git/po/sv.po +++ b/gitk-git/po/sv.po @@ -3,14 +3,14 @@ # This file is distributed under the same license as the gitk package. # # Mikael Magnusson <mikachu@gmail.com>, 2008. -# Peter Krefting <peter@softwolves.pp.se>, 2008, 2009, 2010, 2012, 2013, 2015. +# Peter Krefting <peter@softwolves.pp.se>, 2008-2023. # msgid "" msgstr "" "Project-Id-Version: sv\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-12-09 09:40+0100\n" -"PO-Revision-Date: 2015-12-11 09:46+0100\n" +"POT-Creation-Date: 2023-10-26 21:39+0100\n" +"PO-Revision-Date: 2023-10-26 21:42+0100\n" "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n" "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" "Language: sv\n" @@ -18,35 +18,35 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Gtranslator 2.91.6\n" +"X-Generator: Gtranslator 3.38.0\n" -#: gitk:140 +#: gitk:139 msgid "Couldn't get list of unmerged files:" msgstr "Kunde inte hämta lista över ej sammanslagna filer:" -#: gitk:212 gitk:2381 +#: gitk:211 gitk:2406 msgid "Color words" msgstr "Färga ord" -#: gitk:217 gitk:2381 gitk:8221 gitk:8254 +#: gitk:216 gitk:2406 gitk:8307 gitk:8340 msgid "Markup words" msgstr "Märk upp ord" -#: gitk:324 +#: gitk:323 msgid "Error parsing revisions:" msgstr "Fel vid tolkning av revisioner:" -#: gitk:380 +#: gitk:379 msgid "Error executing --argscmd command:" msgstr "Fel vid körning av --argscmd-kommando:" -#: gitk:393 +#: gitk:392 msgid "No files selected: --merge specified but no files are unmerged." msgstr "" "Inga filer valdes: --merge angavs men det finns inga filer som inte har " "slagits samman." -#: gitk:396 +#: gitk:395 msgid "" "No files selected: --merge specified but no unmerged files are within file " "limit." @@ -54,322 +54,326 @@ msgstr "" "Inga filer valdes: --merge angavs men det finns inga filer inom " "filbegränsningen." -#: gitk:418 gitk:566 +#: gitk:417 gitk:565 msgid "Error executing git log:" msgstr "Fel vid körning av git log:" -#: gitk:436 gitk:582 +#: gitk:435 gitk:581 msgid "Reading" msgstr "Läser" -#: gitk:496 gitk:4526 +#: gitk:495 gitk:4572 msgid "Reading commits..." msgstr "Läser incheckningar..." -#: gitk:499 gitk:1637 gitk:4529 +#: gitk:498 gitk:1640 gitk:4575 msgid "No commits selected" msgstr "Inga incheckningar markerade" -#: gitk:1445 gitk:4046 gitk:12447 +#: gitk:1448 gitk:4092 gitk:12674 msgid "Command line" msgstr "Kommandorad" -#: gitk:1511 +#: gitk:1514 msgid "Can't parse git log output:" msgstr "Kan inte tolka utdata från git log:" -#: gitk:1740 +#: gitk:1743 msgid "No commit information available" msgstr "Ingen incheckningsinformation är tillgänglig" -#: gitk:1903 gitk:1932 gitk:4316 gitk:9684 gitk:11256 gitk:11536 +#: gitk:1910 gitk:1939 gitk:4362 gitk:9847 gitk:11451 gitk:11751 msgid "OK" msgstr "OK" -#: gitk:1934 gitk:4318 gitk:9197 gitk:9276 gitk:9406 gitk:9455 gitk:9686 -#: gitk:11257 gitk:11537 +#: gitk:1941 gitk:4364 gitk:9283 gitk:9362 gitk:9492 gitk:9578 gitk:9849 +#: gitk:11452 gitk:11752 msgid "Cancel" msgstr "Avbryt" -#: gitk:2069 +#: gitk:2090 msgid "&Update" msgstr "&Uppdatera" -#: gitk:2070 +#: gitk:2091 msgid "&Reload" msgstr "Läs &om" -#: gitk:2071 +#: gitk:2092 msgid "Reread re&ferences" msgstr "Läs om &referenser" -#: gitk:2072 +#: gitk:2093 msgid "&List references" msgstr "&Visa referenser" -#: gitk:2074 +#: gitk:2095 msgid "Start git &gui" msgstr "Starta git &gui" -#: gitk:2076 +#: gitk:2097 msgid "&Quit" msgstr "&Avsluta" -#: gitk:2068 +#: gitk:2089 msgid "&File" msgstr "&Arkiv" -#: gitk:2080 +#: gitk:2101 msgid "&Preferences" msgstr "&Inställningar" -#: gitk:2079 +#: gitk:2100 msgid "&Edit" msgstr "&Redigera" -#: gitk:2084 +#: gitk:2105 msgid "&New view..." msgstr "&Ny vy..." -#: gitk:2085 +#: gitk:2106 msgid "&Edit view..." msgstr "&Ändra vy..." -#: gitk:2086 +#: gitk:2107 msgid "&Delete view" msgstr "&Ta bort vy" -#: gitk:2088 +#: gitk:2109 msgid "&All files" msgstr "&Alla filer" -#: gitk:2083 +#: gitk:2104 msgid "&View" msgstr "&Visa" -#: gitk:2093 gitk:2103 +#: gitk:2114 gitk:2124 msgid "&About gitk" msgstr "&Om gitk" -#: gitk:2094 gitk:2108 +#: gitk:2115 gitk:2129 msgid "&Key bindings" msgstr "&Tangentbordsbindningar" -#: gitk:2092 gitk:2107 +#: gitk:2113 gitk:2128 msgid "&Help" msgstr "&Hjälp" -#: gitk:2185 gitk:8653 +#: gitk:2206 gitk:8739 msgid "SHA1 ID:" msgstr "SHA1-id:" -#: gitk:2229 +#: gitk:2250 msgid "Row" msgstr "Rad" -#: gitk:2267 +#: gitk:2288 msgid "Find" msgstr "Sök" -#: gitk:2295 +#: gitk:2316 msgid "commit" msgstr "incheckning" -#: gitk:2299 gitk:2301 gitk:4688 gitk:4711 gitk:4735 gitk:6756 gitk:6828 -#: gitk:6913 +#: gitk:2320 gitk:2322 gitk:4734 gitk:4757 gitk:4781 gitk:6802 gitk:6874 +#: gitk:6959 msgid "containing:" msgstr "som innehåller:" -#: gitk:2302 gitk:3527 gitk:3532 gitk:4764 +#: gitk:2323 gitk:3573 gitk:3578 gitk:4810 msgid "touching paths:" msgstr "som rör sökväg:" -#: gitk:2303 gitk:4778 +#: gitk:2324 gitk:4824 msgid "adding/removing string:" msgstr "som lägger/till tar bort sträng:" -#: gitk:2304 gitk:4780 +#: gitk:2325 gitk:4826 msgid "changing lines matching:" msgstr "ändrar rader som matchar:" -#: gitk:2313 gitk:2315 gitk:4767 +#: gitk:2334 gitk:2336 gitk:4813 msgid "Exact" msgstr "Exakt" -#: gitk:2315 gitk:4855 gitk:6724 +#: gitk:2336 gitk:4901 gitk:6770 msgid "IgnCase" msgstr "IgnVersaler" -#: gitk:2315 gitk:4737 gitk:4853 gitk:6720 +#: gitk:2336 gitk:4783 gitk:4899 gitk:6766 msgid "Regexp" msgstr "Reg.uttr." -#: gitk:2317 gitk:2318 gitk:4875 gitk:4905 gitk:4912 gitk:6849 gitk:6917 +#: gitk:2338 gitk:2339 gitk:4921 gitk:4951 gitk:4958 gitk:6895 gitk:6963 msgid "All fields" msgstr "Alla fält" -#: gitk:2318 gitk:4872 gitk:4905 gitk:6787 +#: gitk:2339 gitk:4918 gitk:4951 gitk:6833 msgid "Headline" msgstr "Rubrik" -#: gitk:2319 gitk:4872 gitk:6787 gitk:6917 gitk:7390 +#: gitk:2340 gitk:4918 gitk:6833 gitk:6963 gitk:7471 msgid "Comments" msgstr "Kommentarer" -#: gitk:2319 gitk:4872 gitk:4877 gitk:4912 gitk:6787 gitk:7325 gitk:8831 -#: gitk:8846 +#: gitk:2340 gitk:4918 gitk:4923 gitk:4958 gitk:6833 gitk:7406 gitk:8917 +#: gitk:8932 msgid "Author" msgstr "Författare" -#: gitk:2319 gitk:4872 gitk:6787 gitk:7327 +#: gitk:2340 gitk:4918 gitk:6833 gitk:7408 msgid "Committer" msgstr "Incheckare" -#: gitk:2350 +#: gitk:2374 msgid "Search" msgstr "Sök" -#: gitk:2358 +#: gitk:2382 msgid "Diff" msgstr "Diff" -#: gitk:2360 +#: gitk:2384 msgid "Old version" msgstr "Gammal version" -#: gitk:2362 +#: gitk:2386 msgid "New version" msgstr "Ny version" -#: gitk:2364 +#: gitk:2389 msgid "Lines of context" msgstr "Rader sammanhang" -#: gitk:2374 +#: gitk:2399 msgid "Ignore space change" msgstr "Ignorera ändringar i blanksteg" -#: gitk:2378 gitk:2380 gitk:7960 gitk:8207 +#: gitk:2403 gitk:2405 gitk:8041 gitk:8293 msgid "Line diff" msgstr "Rad-diff" -#: gitk:2445 +#: gitk:2478 msgid "Patch" msgstr "Patch" -#: gitk:2447 +#: gitk:2480 msgid "Tree" msgstr "Träd" -#: gitk:2617 gitk:2638 +#: gitk:2650 gitk:2671 msgid "Diff this -> selected" msgstr "Diff denna -> markerad" -#: gitk:2618 gitk:2639 +#: gitk:2651 gitk:2672 msgid "Diff selected -> this" msgstr "Diff markerad -> denna" -#: gitk:2619 gitk:2640 +#: gitk:2652 gitk:2673 msgid "Make patch" msgstr "Skapa patch" -#: gitk:2620 gitk:9255 +#: gitk:2653 gitk:9341 msgid "Create tag" msgstr "Skapa tagg" -#: gitk:2621 -msgid "Copy commit summary" -msgstr "Kopiera incheckningssammanfattning" +#: gitk:2654 +msgid "Copy commit reference" +msgstr "Kopiera incheckningsreferens" -#: gitk:2622 gitk:9386 +#: gitk:2655 gitk:9472 msgid "Write commit to file" msgstr "Skriv incheckning till fil" -#: gitk:2623 gitk:9443 +#: gitk:2656 msgid "Create new branch" msgstr "Skapa ny gren" -#: gitk:2624 +#: gitk:2657 msgid "Cherry-pick this commit" msgstr "Plocka denna incheckning" -#: gitk:2625 +#: gitk:2658 msgid "Reset HEAD branch to here" msgstr "Återställ HEAD-grenen hit" -#: gitk:2626 +#: gitk:2659 msgid "Mark this commit" msgstr "Markera denna incheckning" -#: gitk:2627 +#: gitk:2660 msgid "Return to mark" msgstr "Återgå till markering" -#: gitk:2628 +#: gitk:2661 msgid "Find descendant of this and mark" msgstr "Hitta efterföljare till denna och markera" -#: gitk:2629 +#: gitk:2662 msgid "Compare with marked commit" msgstr "Jämför med markerad incheckning" -#: gitk:2630 gitk:2641 +#: gitk:2663 gitk:2674 msgid "Diff this -> marked commit" msgstr "Diff denna -> markerad incheckning" -#: gitk:2631 gitk:2642 +#: gitk:2664 gitk:2675 msgid "Diff marked commit -> this" msgstr "Diff markerad incheckning -> denna" -#: gitk:2632 +#: gitk:2665 msgid "Revert this commit" msgstr "Ångra denna incheckning" -#: gitk:2648 +#: gitk:2681 msgid "Check out this branch" msgstr "Checka ut denna gren" -#: gitk:2649 +#: gitk:2682 +msgid "Rename this branch" +msgstr "Byt namn på denna gren" + +#: gitk:2683 msgid "Remove this branch" msgstr "Ta bort denna gren" -#: gitk:2650 +#: gitk:2684 msgid "Copy branch name" msgstr "Kopiera namn på gren" -#: gitk:2657 +#: gitk:2691 msgid "Highlight this too" msgstr "Markera även detta" -#: gitk:2658 +#: gitk:2692 msgid "Highlight this only" msgstr "Markera bara detta" -#: gitk:2659 +#: gitk:2693 msgid "External diff" msgstr "Extern diff" -#: gitk:2660 +#: gitk:2694 msgid "Blame parent commit" msgstr "Klandra föräldraincheckning" -#: gitk:2661 +#: gitk:2695 msgid "Copy path" msgstr "Kopiera sökväg" -#: gitk:2668 +#: gitk:2702 msgid "Show origin of this line" msgstr "Visa ursprunget för den här raden" -#: gitk:2669 +#: gitk:2703 msgid "Run git gui blame on this line" msgstr "Kör git gui blame på den här raden" -#: gitk:3013 +#: gitk:3057 msgid "About gitk" msgstr "Om gitk" -#: gitk:3015 +#: gitk:3059 msgid "" "\n" "Gitk - a commit viewer for git\n" @@ -385,525 +389,529 @@ msgstr "" "\n" "Använd och vidareförmedla enligt villkoren i GNU General Public License" -#: gitk:3023 gitk:3090 gitk:9872 +#: gitk:3067 gitk:3134 gitk:10062 msgid "Close" msgstr "Stäng" -#: gitk:3044 +#: gitk:3088 msgid "Gitk key bindings" msgstr "Tangentbordsbindningar för Gitk" -#: gitk:3047 +#: gitk:3091 msgid "Gitk key bindings:" msgstr "Tangentbordsbindningar för Gitk:" -#: gitk:3049 +#: gitk:3093 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\tAvsluta" -#: gitk:3050 +#: gitk:3094 #, tcl-format msgid "<%s-W>\t\tClose window" msgstr "<%s-W>\t\tStäng fönster" -#: gitk:3051 +#: gitk:3095 msgid "<Home>\t\tMove to first commit" msgstr "<Home>\t\tGå till första incheckning" -#: gitk:3052 +#: gitk:3096 msgid "<End>\t\tMove to last commit" msgstr "<End>\t\tGå till sista incheckning" -#: gitk:3053 +#: gitk:3097 msgid "<Up>, p, k\tMove up one commit" msgstr "<Upp>, p, k\tGå en incheckning upp" -#: gitk:3054 +#: gitk:3098 msgid "<Down>, n, j\tMove down one commit" msgstr "<Ned>, n, j\tGå en incheckning ned" -#: gitk:3055 +#: gitk:3099 msgid "<Left>, z, h\tGo back in history list" msgstr "<Vänster>, z, h\tGå bakåt i historiken" -#: gitk:3056 +#: gitk:3100 msgid "<Right>, x, l\tGo forward in history list" msgstr "<Höger>, x, l\tGå framåt i historiken" -#: gitk:3057 +#: gitk:3101 #, tcl-format msgid "<%s-n>\tGo to n-th parent of current commit in history list" msgstr "<%s-n>\tGå till aktuell inchecknings n:te förälder i historielistan" -#: gitk:3058 +#: gitk:3102 msgid "<PageUp>\tMove up one page in commit list" msgstr "<PageUp>\tGå upp en sida i incheckningslistan" -#: gitk:3059 +#: gitk:3103 msgid "<PageDown>\tMove down one page in commit list" msgstr "<PageDown>\tGå ned en sida i incheckningslistan" -#: gitk:3060 +#: gitk:3104 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Home>\tRulla till början av incheckningslistan" -#: gitk:3061 +#: gitk:3105 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-End>\tRulla till slutet av incheckningslistan" -#: gitk:3062 +#: gitk:3106 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Upp>\tRulla incheckningslistan upp ett steg" -#: gitk:3063 +#: gitk:3107 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Ned>\tRulla incheckningslistan ned ett steg" -#: gitk:3064 +#: gitk:3108 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-PageUp>\tRulla incheckningslistan upp en sida" -#: gitk:3065 +#: gitk:3109 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-PageDown>\tRulla incheckningslistan ned en sida" -#: gitk:3066 +#: gitk:3110 msgid "<Shift-Up>\tFind backwards (upwards, later commits)" msgstr "<Skift-Upp>\tSök bakåt (uppåt, senare incheckningar)" -#: gitk:3067 +#: gitk:3111 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" msgstr "<Skift-Ned>\tSök framåt (nedåt, tidigare incheckningar)" -#: gitk:3068 +#: gitk:3112 msgid "<Delete>, b\tScroll diff view up one page" msgstr "<Delete>, b\tRulla diffvisningen upp en sida" -#: gitk:3069 +#: gitk:3113 msgid "<Backspace>\tScroll diff view up one page" msgstr "<Baksteg>\tRulla diffvisningen upp en sida" -#: gitk:3070 +#: gitk:3114 msgid "<Space>\t\tScroll diff view down one page" msgstr "<Blanksteg>\tRulla diffvisningen ned en sida" -#: gitk:3071 +#: gitk:3115 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\tRulla diffvisningen upp 18 rader" -#: gitk:3072 +#: gitk:3116 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\tRulla diffvisningen ned 18 rader" -#: gitk:3073 +#: gitk:3117 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\tSök" -#: gitk:3074 +#: gitk:3118 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\tGå till nästa sökträff" -#: gitk:3075 +#: gitk:3119 msgid "<Return>\tMove to next find hit" msgstr "<Return>\t\tGå till nästa sökträff" -#: gitk:3076 +#: gitk:3120 msgid "g\t\tGo to commit" msgstr "g\t\tGå till incheckning" -#: gitk:3077 +#: gitk:3121 msgid "/\t\tFocus the search box" msgstr "/\t\tFokusera sökrutan" -#: gitk:3078 +#: gitk:3122 msgid "?\t\tMove to previous find hit" msgstr "?\t\tGå till föregående sökträff" -#: gitk:3079 +#: gitk:3123 msgid "f\t\tScroll diff view to next file" msgstr "f\t\tRulla diffvisningen till nästa fil" -#: gitk:3080 +#: gitk:3124 #, tcl-format msgid "<%s-S>\t\tSearch for next hit in diff view" msgstr "<%s-S>\t\tGå till nästa sökträff i diffvisningen" -#: gitk:3081 +#: gitk:3125 #, tcl-format msgid "<%s-R>\t\tSearch for previous hit in diff view" msgstr "<%s-R>\t\tGå till föregående sökträff i diffvisningen" -#: gitk:3082 +#: gitk:3126 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-Num+>\tÖka teckenstorlek" -#: gitk:3083 +#: gitk:3127 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-plus>\tÖka teckenstorlek" -#: gitk:3084 +#: gitk:3128 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-Num->\tMinska teckenstorlek" -#: gitk:3085 +#: gitk:3129 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-minus>\tMinska teckenstorlek" -#: gitk:3086 +#: gitk:3130 msgid "<F5>\t\tUpdate" msgstr "<F5>\t\tUppdatera" -#: gitk:3551 gitk:3560 +#: gitk:3597 gitk:3606 #, tcl-format msgid "Error creating temporary directory %s:" msgstr "Fel vid skapande av temporär katalog %s:" -#: gitk:3573 +#: gitk:3619 #, tcl-format msgid "Error getting \"%s\" from %s:" -msgstr "Fel vid hämtning av \"%s\" från %s:" +msgstr "Fel vid hämtning av ”%s” från %s:" -#: gitk:3636 +#: gitk:3682 msgid "command failed:" msgstr "kommando misslyckades:" -#: gitk:3785 +#: gitk:3831 msgid "No such commit" msgstr "Incheckning saknas" -#: gitk:3799 +#: gitk:3845 msgid "git gui blame: command failed:" msgstr "git gui blame: kommando misslyckades:" -#: gitk:3830 +#: gitk:3876 #, tcl-format msgid "Couldn't read merge head: %s" msgstr "Kunde inte läsa sammanslagningshuvud: %s" -#: gitk:3838 +#: gitk:3884 #, tcl-format msgid "Error reading index: %s" msgstr "Fel vid läsning av index: %s" -#: gitk:3863 +#: gitk:3909 #, tcl-format msgid "Couldn't start git blame: %s" msgstr "Kunde inte starta git blame: %s" -#: gitk:3866 gitk:6755 +#: gitk:3912 gitk:6801 msgid "Searching" msgstr "Söker" -#: gitk:3898 +#: gitk:3944 #, tcl-format msgid "Error running git blame: %s" msgstr "Fel vid körning av git blame: %s" -#: gitk:3926 +#: gitk:3972 #, tcl-format msgid "That line comes from commit %s, which is not in this view" msgstr "Raden kommer från incheckningen %s, som inte finns i denna vy" -#: gitk:3940 +#: gitk:3986 msgid "External diff viewer failed:" msgstr "Externt diff-verktyg misslyckades:" -#: gitk:4044 +#: gitk:4090 msgid "All files" msgstr "Alla filer" -#: gitk:4068 +#: gitk:4114 msgid "View" msgstr "Visa" -#: gitk:4071 +#: gitk:4117 msgid "Gitk view definition" msgstr "Definition av Gitk-vy" -#: gitk:4075 +#: gitk:4121 msgid "Remember this view" msgstr "Spara denna vy" -#: gitk:4076 +#: gitk:4122 msgid "References (space separated list):" msgstr "Referenser (blankstegsavdelad lista):" -#: gitk:4077 +#: gitk:4123 msgid "Branches & tags:" msgstr "Grenar & taggar:" -#: gitk:4078 +#: gitk:4124 msgid "All refs" msgstr "Alla referenser" -#: gitk:4079 +#: gitk:4125 msgid "All (local) branches" msgstr "Alla (lokala) grenar" -#: gitk:4080 +#: gitk:4126 msgid "All tags" msgstr "Alla taggar" -#: gitk:4081 +#: gitk:4127 msgid "All remote-tracking branches" msgstr "Alla fjärrspårande grenar" -#: gitk:4082 +#: gitk:4128 msgid "Commit Info (regular expressions):" msgstr "Incheckningsinfo (reguljära uttryck):" -#: gitk:4083 +#: gitk:4129 msgid "Author:" msgstr "Författare:" -#: gitk:4084 +#: gitk:4130 msgid "Committer:" msgstr "Incheckare:" -#: gitk:4085 +#: gitk:4131 msgid "Commit Message:" msgstr "Incheckningsmeddelande:" -#: gitk:4086 +#: gitk:4132 msgid "Matches all Commit Info criteria" msgstr "Motsvarar alla kriterier för incheckningsinfo" -#: gitk:4087 +#: gitk:4133 msgid "Matches no Commit Info criteria" msgstr "Motsvarar inga kriterier för incheckningsinfo" -#: gitk:4088 +#: gitk:4134 msgid "Changes to Files:" msgstr "Ändringar av filer:" -#: gitk:4089 +#: gitk:4135 msgid "Fixed String" msgstr "Fast sträng" -#: gitk:4090 +#: gitk:4136 msgid "Regular Expression" msgstr "Reguljärt uttryck" -#: gitk:4091 +#: gitk:4137 msgid "Search string:" msgstr "Söksträng:" -#: gitk:4092 +#: gitk:4138 msgid "" "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" msgstr "" -"Incheckingsdatum (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " -"15:27:38\"):" +"Incheckningsdatum (”2 weeks ago”, ”2009-03-17 15:27:38”, ”March 17, 2009 " +"15:27:38”):" -#: gitk:4093 +#: gitk:4139 msgid "Since:" msgstr "Från:" -#: gitk:4094 +#: gitk:4140 msgid "Until:" msgstr "Till:" -#: gitk:4095 +#: gitk:4141 msgid "Limit and/or skip a number of revisions (positive integer):" msgstr "Begränsa och/eller hoppa över ett antal revisioner (positivt heltal):" -#: gitk:4096 +#: gitk:4142 msgid "Number to show:" msgstr "Antal att visa:" -#: gitk:4097 +#: gitk:4143 msgid "Number to skip:" msgstr "Antal att hoppa över:" -#: gitk:4098 +#: gitk:4144 msgid "Miscellaneous options:" msgstr "Diverse alternativ:" -#: gitk:4099 +#: gitk:4145 msgid "Strictly sort by date" msgstr "Strikt datumsortering" -#: gitk:4100 +#: gitk:4146 msgid "Mark branch sides" msgstr "Markera sidogrenar" -#: gitk:4101 +#: gitk:4147 msgid "Limit to first parent" msgstr "Begränsa till första förälder" -#: gitk:4102 +#: gitk:4148 msgid "Simple history" msgstr "Enkel historik" -#: gitk:4103 +#: gitk:4149 msgid "Additional arguments to git log:" msgstr "Ytterligare argument till git log:" -#: gitk:4104 +#: gitk:4150 msgid "Enter files and directories to include, one per line:" msgstr "Ange filer och kataloger att ta med, en per rad:" -#: gitk:4105 +#: gitk:4151 msgid "Command to generate more commits to include:" msgstr "Kommando för att generera fler incheckningar att ta med:" -#: gitk:4229 +#: gitk:4275 msgid "Gitk: edit view" msgstr "Gitk: redigera vy" -#: gitk:4237 +#: gitk:4283 msgid "-- criteria for selecting revisions" msgstr " - kriterier för val av revisioner" -#: gitk:4242 +#: gitk:4288 msgid "View Name" msgstr "Namn på vy" -#: gitk:4317 +#: gitk:4363 msgid "Apply (F5)" msgstr "Använd (F5)" -#: gitk:4355 +#: gitk:4401 msgid "Error in commit selection arguments:" msgstr "Fel i argument för val av incheckningar:" -#: gitk:4410 gitk:4463 gitk:4925 gitk:4939 gitk:6209 gitk:12388 gitk:12389 +#: gitk:4456 gitk:4509 gitk:4971 gitk:4985 gitk:6255 gitk:12615 gitk:12616 msgid "None" msgstr "Inget" -#: gitk:5022 gitk:5027 +#: gitk:5068 gitk:5073 msgid "Descendant" msgstr "Avkomling" -#: gitk:5023 +#: gitk:5069 msgid "Not descendant" msgstr "Inte avkomling" -#: gitk:5030 gitk:5035 +#: gitk:5076 gitk:5081 msgid "Ancestor" msgstr "Förfader" -#: gitk:5031 +#: gitk:5077 msgid "Not ancestor" msgstr "Inte förfader" -#: gitk:5325 +#: gitk:5371 msgid "Local changes checked in to index but not committed" msgstr "Lokala ändringar sparade i indexet men inte incheckade" -#: gitk:5361 +#: gitk:5407 msgid "Local uncommitted changes, not checked in to index" msgstr "Lokala ändringar, ej sparade i indexet" -#: gitk:7135 +#: gitk:7155 +msgid "Error starting web browser:" +msgstr "Fel när webbläsaren skulle startas:" + +#: gitk:7216 msgid "and many more" msgstr "med många flera" -#: gitk:7138 +#: gitk:7219 msgid "many" msgstr "många" -#: gitk:7329 +#: gitk:7410 msgid "Tags:" msgstr "Taggar:" -#: gitk:7346 gitk:7352 gitk:8826 +#: gitk:7427 gitk:7433 gitk:8912 msgid "Parent" msgstr "Förälder" -#: gitk:7357 +#: gitk:7438 msgid "Child" msgstr "Barn" -#: gitk:7366 +#: gitk:7447 msgid "Branch" msgstr "Gren" -#: gitk:7369 +#: gitk:7450 msgid "Follows" msgstr "Följer" -#: gitk:7372 +#: gitk:7453 msgid "Precedes" msgstr "Föregår" -#: gitk:7967 +#: gitk:8048 #, tcl-format msgid "Error getting diffs: %s" msgstr "Fel vid hämtning av diff: %s" -#: gitk:8651 +#: gitk:8737 msgid "Goto:" msgstr "Gå till:" -#: gitk:8672 +#: gitk:8758 #, tcl-format msgid "Short SHA1 id %s is ambiguous" msgstr "Förkortat SHA1-id %s är tvetydigt" -#: gitk:8679 +#: gitk:8765 #, tcl-format msgid "Revision %s is not known" msgstr "Revisionen %s är inte känd" -#: gitk:8689 +#: gitk:8775 #, tcl-format msgid "SHA1 id %s is not known" msgstr "SHA-id:t %s är inte känt" -#: gitk:8691 +#: gitk:8777 #, tcl-format msgid "Revision %s is not in the current view" msgstr "Revisionen %s finns inte i den nuvarande vyn" -#: gitk:8833 gitk:8848 +#: gitk:8919 gitk:8934 msgid "Date" msgstr "Datum" -#: gitk:8836 +#: gitk:8922 msgid "Children" msgstr "Barn" -#: gitk:8899 +#: gitk:8985 #, tcl-format msgid "Reset %s branch to here" msgstr "Återställ grenen %s hit" -#: gitk:8901 +#: gitk:8987 msgid "Detached head: can't reset" msgstr "Frånkopplad head: kan inte återställa" -#: gitk:9006 gitk:9012 +#: gitk:9092 gitk:9098 msgid "Skipping merge commit " msgstr "Hoppar över sammanslagningsincheckning " -#: gitk:9021 gitk:9026 +#: gitk:9107 gitk:9112 msgid "Error getting patch ID for " msgstr "Fel vid hämtning av patch-id för " -#: gitk:9022 gitk:9027 +#: gitk:9108 gitk:9113 msgid " - stopping\n" msgstr " - stannar\n" -#: gitk:9032 gitk:9035 gitk:9043 gitk:9057 gitk:9066 +#: gitk:9118 gitk:9121 gitk:9129 gitk:9143 gitk:9152 msgid "Commit " msgstr "Incheckning " -#: gitk:9036 +#: gitk:9122 msgid "" " is the same patch as\n" " " @@ -911,7 +919,7 @@ msgstr "" " är samma patch som\n" " " -#: gitk:9044 +#: gitk:9130 msgid "" " differs from\n" " " @@ -919,7 +927,7 @@ msgstr "" " skiljer sig från\n" " " -#: gitk:9046 +#: gitk:9132 msgid "" "Diff of commits:\n" "\n" @@ -927,141 +935,158 @@ msgstr "" "Skillnad mellan incheckningar:\n" "\n" -#: gitk:9058 gitk:9067 +#: gitk:9144 gitk:9153 #, tcl-format msgid " has %s children - stopping\n" msgstr " har %s barn - stannar\n" -#: gitk:9086 +#: gitk:9172 #, tcl-format msgid "Error writing commit to file: %s" msgstr "Fel vid skrivning av incheckning till fil: %s" -#: gitk:9092 +#: gitk:9178 #, tcl-format msgid "Error diffing commits: %s" msgstr "Fel vid jämförelse av incheckningar: %s" -#: gitk:9138 +#: gitk:9224 msgid "Top" msgstr "Topp" -#: gitk:9139 +#: gitk:9225 msgid "From" msgstr "Från" -#: gitk:9144 +#: gitk:9230 msgid "To" msgstr "Till" -#: gitk:9168 +#: gitk:9254 msgid "Generate patch" msgstr "Generera patch" -#: gitk:9170 +#: gitk:9256 msgid "From:" msgstr "Från:" -#: gitk:9179 +#: gitk:9265 msgid "To:" msgstr "Till:" -#: gitk:9188 +#: gitk:9274 msgid "Reverse" msgstr "Vänd" -#: gitk:9190 gitk:9400 +#: gitk:9276 gitk:9486 msgid "Output file:" msgstr "Utdatafil:" -#: gitk:9196 +#: gitk:9282 msgid "Generate" msgstr "Generera" -#: gitk:9234 +#: gitk:9320 msgid "Error creating patch:" msgstr "Fel vid generering av patch:" -#: gitk:9257 gitk:9388 gitk:9445 +#: gitk:9343 gitk:9474 gitk:9562 msgid "ID:" msgstr "Id:" -#: gitk:9266 +#: gitk:9352 msgid "Tag name:" msgstr "Taggnamn:" -#: gitk:9269 +#: gitk:9355 msgid "Tag message is optional" msgstr "Taggmeddelandet är valfritt" -#: gitk:9271 +#: gitk:9357 msgid "Tag message:" msgstr "Taggmeddelande:" -#: gitk:9275 gitk:9454 +#: gitk:9361 gitk:9532 msgid "Create" msgstr "Skapa" -#: gitk:9293 +#: gitk:9379 msgid "No tag name specified" msgstr "Inget taggnamn angavs" -#: gitk:9297 +#: gitk:9383 #, tcl-format msgid "Tag \"%s\" already exists" -msgstr "Taggen \"%s\" finns redan" +msgstr "Taggen ”%s” finns redan" -#: gitk:9307 +#: gitk:9393 msgid "Error creating tag:" msgstr "Fel vid skapande av tagg:" -#: gitk:9397 +#: gitk:9483 msgid "Command:" msgstr "Kommando:" -#: gitk:9405 +#: gitk:9491 msgid "Write" msgstr "Skriv" -#: gitk:9423 +#: gitk:9509 msgid "Error writing commit:" msgstr "Fel vid skrivning av incheckning:" -#: gitk:9450 +#: gitk:9531 +msgid "Create branch" +msgstr "Skapa gren" + +#: gitk:9547 +#, tcl-format +msgid "Rename branch %s" +msgstr "Byt namn på grenen %s" + +#: gitk:9548 +msgid "Rename" +msgstr "Byt namn" + +#: gitk:9572 msgid "Name:" msgstr "Namn:" -#: gitk:9473 +#: gitk:9596 msgid "Please specify a name for the new branch" msgstr "Ange ett namn för den nya grenen" -#: gitk:9478 +#: gitk:9601 #, tcl-format msgid "Branch '%s' already exists. Overwrite?" -msgstr "Grenen \"%s\" finns redan. Skriva över?" +msgstr "Grenen ”%s” finns redan. Skriva över?" + +#: gitk:9645 +msgid "Please specify a new name for the branch" +msgstr "Ange ett nytt namn för grenen" -#: gitk:9545 +#: gitk:9708 #, tcl-format msgid "Commit %s is already included in branch %s -- really re-apply it?" msgstr "" "Incheckningen %s finns redan på grenen %s -- skall den verkligen appliceras " "på nytt?" -#: gitk:9550 +#: gitk:9713 msgid "Cherry-picking" msgstr "Plockar" -#: gitk:9559 +#: gitk:9722 #, tcl-format msgid "" "Cherry-pick failed because of local changes to file '%s'.\n" "Please commit, reset or stash your changes and try again." msgstr "" -"Cherry-pick misslyckades på grund av lokala ändringar i filen \"%s\".\n" +"Cherry-pick misslyckades på grund av lokala ändringar i filen ”%s”.\n" "Checka in, återställ eller spara undan (stash) dina ändringar och försök " "igen." -#: gitk:9565 +#: gitk:9728 msgid "" "Cherry-pick failed because of merge conflict.\n" "Do you wish to run git citool to resolve it?" @@ -1069,20 +1094,20 @@ msgstr "" "Cherry-pick misslyckades på grund av en sammanslagningskonflikt.\n" "Vill du köra git citool för att lösa den?" -#: gitk:9581 gitk:9639 +#: gitk:9744 gitk:9802 msgid "No changes committed" msgstr "Inga ändringar incheckade" -#: gitk:9608 +#: gitk:9771 #, tcl-format msgid "Commit %s is not included in branch %s -- really revert it?" msgstr "Incheckningen %s finns inte på grenen %s -- vill du verkligen ångra?" -#: gitk:9613 +#: gitk:9776 msgid "Reverting" msgstr "Ångrar" -#: gitk:9621 +#: gitk:9784 #, tcl-format msgid "" "Revert failed because of local changes to the following files:%s Please " @@ -1092,7 +1117,7 @@ msgstr "" "Checka in, återställ eller spara undan (stash) dina ändringar och försök " "igen." -#: gitk:9625 +#: gitk:9788 msgid "" "Revert failed because of merge conflict.\n" " Do you wish to run git citool to resolve it?" @@ -1100,28 +1125,28 @@ msgstr "" "Misslyckades med att ångra på grund av en sammanslagningskonflikt.\n" " Vill du köra git citool för att lösa den?" -#: gitk:9668 +#: gitk:9831 msgid "Confirm reset" msgstr "Bekräfta återställning" -#: gitk:9670 +#: gitk:9833 #, tcl-format msgid "Reset branch %s to %s?" msgstr "Återställa grenen %s till %s?" -#: gitk:9672 +#: gitk:9835 msgid "Reset type:" msgstr "Typ av återställning:" -#: gitk:9675 +#: gitk:9838 msgid "Soft: Leave working tree and index untouched" msgstr "Mjuk: Rör inte utcheckning och index" -#: gitk:9678 +#: gitk:9841 msgid "Mixed: Leave working tree untouched, reset index" msgstr "Blandad: Rör inte utcheckning, återställ index" -#: gitk:9681 +#: gitk:9844 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" @@ -1129,19 +1154,24 @@ msgstr "" "Hård: Återställ utcheckning och index\n" "(förkastar ALLA lokala ändringar)" -#: gitk:9698 +#: gitk:9861 msgid "Resetting" msgstr "Återställer" -#: gitk:9758 +#: gitk:9934 +#, tcl-format +msgid "A local branch named %s exists already" +msgstr "Det finns redan en lokal gren som heter %s" + +#: gitk:9942 msgid "Checking out" msgstr "Checkar ut" -#: gitk:9811 +#: gitk:10001 msgid "Cannot delete the currently checked-out branch" msgstr "Kan inte ta bort den just nu utcheckade grenen" -#: gitk:9817 +#: gitk:10007 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -1150,16 +1180,16 @@ msgstr "" "Incheckningarna på grenen %s existerar inte på någon annan gren.\n" "Vill du verkligen ta bort grenen %s?" -#: gitk:9848 +#: gitk:10038 #, tcl-format msgid "Tags and heads: %s" msgstr "Taggar och huvuden: %s" -#: gitk:9865 +#: gitk:10055 msgid "Filter" msgstr "Filter" -#: gitk:10161 +#: gitk:10356 msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." @@ -1167,201 +1197,221 @@ msgstr "" "Fel vid läsning av information om incheckningstopologi; information om " "grenar och föregående/senare taggar kommer inte vara komplett." -#: gitk:11138 +#: gitk:11333 msgid "Tag" msgstr "Tagg" -#: gitk:11142 +#: gitk:11337 msgid "Id" msgstr "Id" -#: gitk:11225 +#: gitk:11420 msgid "Gitk font chooser" msgstr "Teckensnittsväljare för Gitk" -#: gitk:11242 +#: gitk:11437 msgid "B" msgstr "F" -#: gitk:11245 +#: gitk:11440 msgid "I" msgstr "K" -#: gitk:11363 +#: gitk:11558 msgid "Commit list display options" msgstr "Alternativ för incheckningslistvy" -#: gitk:11366 +#: gitk:11561 msgid "Maximum graph width (lines)" msgstr "Maximal grafbredd (rader)" -#: gitk:11370 +#: gitk:11565 #, no-tcl-format msgid "Maximum graph width (% of pane)" msgstr "Maximal grafbredd (% av ruta)" -#: gitk:11373 +#: gitk:11568 msgid "Show local changes" msgstr "Visa lokala ändringar" -#: gitk:11376 +#: gitk:11571 msgid "Auto-select SHA1 (length)" msgstr "Välj SHA1 (längd) automatiskt" -#: gitk:11380 +#: gitk:11575 msgid "Hide remote refs" msgstr "Dölj fjärr-referenser" -#: gitk:11384 +#: gitk:11579 msgid "Diff display options" msgstr "Alternativ för diffvy" -#: gitk:11386 +#: gitk:11581 msgid "Tab spacing" msgstr "Blanksteg för tabulatortecken" -#: gitk:11389 +#: gitk:11584 msgid "Display nearby tags/heads" msgstr "Visa närliggande taggar/huvuden" -#: gitk:11392 +#: gitk:11587 msgid "Maximum # tags/heads to show" msgstr "Maximalt antal taggar/huvuden att visa" -#: gitk:11395 +#: gitk:11590 msgid "Limit diffs to listed paths" msgstr "Begränsa diff till listade sökvägar" -#: gitk:11398 +#: gitk:11593 msgid "Support per-file encodings" msgstr "Stöd för filspecifika teckenkodningar" -#: gitk:11404 gitk:11551 +#: gitk:11599 gitk:11766 msgid "External diff tool" msgstr "Externt diff-verktyg" -#: gitk:11405 +#: gitk:11600 msgid "Choose..." msgstr "Välj..." -#: gitk:11410 +#: gitk:11607 +msgid "Web browser" +msgstr "Webbläsare" + +#: gitk:11612 msgid "General options" msgstr "Allmänna inställningar" -#: gitk:11413 +#: gitk:11615 msgid "Use themed widgets" msgstr "Använd tema på fönsterelement" -#: gitk:11415 +#: gitk:11617 msgid "(change requires restart)" msgstr "(ändringen kräver omstart)" -#: gitk:11417 +#: gitk:11619 msgid "(currently unavailable)" msgstr "(för närvarande inte tillgängligt)" -#: gitk:11428 +#: gitk:11631 msgid "Colors: press to choose" msgstr "Färger: tryck för att välja" -#: gitk:11431 +#: gitk:11634 msgid "Interface" msgstr "Gränssnitt" -#: gitk:11432 +#: gitk:11635 msgid "interface" msgstr "gränssnitt" -#: gitk:11435 +#: gitk:11638 msgid "Background" msgstr "Bakgrund" -#: gitk:11436 gitk:11466 +#: gitk:11639 gitk:11681 msgid "background" msgstr "bakgrund" -#: gitk:11439 +#: gitk:11642 msgid "Foreground" msgstr "Förgrund" -#: gitk:11440 +#: gitk:11643 msgid "foreground" msgstr "förgrund" -#: gitk:11443 +#: gitk:11646 msgid "Diff: old lines" msgstr "Diff: gamla rader" -#: gitk:11444 +#: gitk:11647 msgid "diff old lines" msgstr "diff gamla rader" -#: gitk:11448 +#: gitk:11651 +msgid "Diff: old lines bg" +msgstr "Diff: gamla rader bg" + +#: gitk:11653 +msgid "diff old lines bg" +msgstr "diff gamla rader bg" + +#: gitk:11657 msgid "Diff: new lines" msgstr "Diff: nya rader" -#: gitk:11449 +#: gitk:11658 msgid "diff new lines" msgstr "diff nya rader" -#: gitk:11453 +#: gitk:11662 +msgid "Diff: new lines bg" +msgstr "Diff: nya rader bg" + +#: gitk:11664 +msgid "diff new lines bg" +msgstr "diff nya rader bg" + +#: gitk:11668 msgid "Diff: hunk header" msgstr "Diff: delhuvud" -#: gitk:11455 +#: gitk:11670 msgid "diff hunk header" msgstr "diff delhuvud" -#: gitk:11459 +#: gitk:11674 msgid "Marked line bg" msgstr "Markerad rad bakgrund" -#: gitk:11461 +#: gitk:11676 msgid "marked line background" msgstr "markerad rad bakgrund" -#: gitk:11465 +#: gitk:11680 msgid "Select bg" msgstr "Markerad bakgrund" -#: gitk:11474 +#: gitk:11689 msgid "Fonts: press to choose" msgstr "Teckensnitt: tryck för att välja" -#: gitk:11476 +#: gitk:11691 msgid "Main font" msgstr "Huvudteckensnitt" -#: gitk:11477 +#: gitk:11692 msgid "Diff display font" msgstr "Teckensnitt för diffvisning" -#: gitk:11478 +#: gitk:11693 msgid "User interface font" msgstr "Teckensnitt för användargränssnitt" -#: gitk:11500 +#: gitk:11715 msgid "Gitk preferences" msgstr "Inställningar för Gitk" -#: gitk:11509 +#: gitk:11724 msgid "General" msgstr "Allmänt" -#: gitk:11510 +#: gitk:11725 msgid "Colors" msgstr "Färger" -#: gitk:11511 +#: gitk:11726 msgid "Fonts" msgstr "Teckensnitt" -#: gitk:11561 +#: gitk:11776 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk: välj färg för %s" -#: gitk:12074 +#: gitk:12289 msgid "" "Sorry, gitk cannot run with this version of Tcl/Tk.\n" " Gitk requires at least Tcl/Tk 8.4." @@ -1369,45 +1419,15 @@ msgstr "" "Gitk kan tyvärr inte köra med denna version av Tcl/Tk.\n" " Gitk kräver åtminstone Tcl/Tk 8.4." -#: gitk:12284 +#: gitk:12507 msgid "Cannot find a git repository here." msgstr "Hittar inget git-arkiv här." -#: gitk:12331 +#: gitk:12554 #, tcl-format msgid "Ambiguous argument '%s': both revision and filename" -msgstr "Tvetydigt argument \"%s\": både revision och filnamn" +msgstr "Tvetydigt argument ”%s”: både revision och filnamn" -#: gitk:12343 +#: gitk:12566 msgid "Bad arguments to gitk:" msgstr "Felaktiga argument till gitk:" - -#~ msgid "mc" -#~ msgstr "mc" - -#~ msgid "next" -#~ msgstr "nästa" - -#~ msgid "prev" -#~ msgstr "föreg" - -#~ msgid "CDate" -#~ msgstr "Skapat datum" - -#~ msgid "Cannot find the git directory \"%s\"." -#~ msgstr "Hittar inte git-katalogen \"%s\"." - -#~ msgid "SHA1 ID: " -#~ msgstr "SHA1-id: " - -#~ msgid "- stopping\n" -#~ msgstr "- stannar\n" - -#~ msgid "Tag/Head %s is not known" -#~ msgstr "Tagg/huvud %s är okänt" - -#~ msgid "/\t\tMove to next find hit, or redo find" -#~ msgstr "/\t\tGå till nästa sökträff, eller sök på nytt" - -#~ msgid "Name" -#~ msgstr "Namn" diff --git a/gitk-git/po/ta.po b/gitk-git/po/ta.po new file mode 100644 index 0000000000..0e390c5153 --- /dev/null +++ b/gitk-git/po/ta.po @@ -0,0 +1,1457 @@ +# Translation of gitk +# Copyright (C) 2024-2025 தமிழ்நேரம் +# This file is distributed under the same license as the gitk package. +# தமிழ்நேரம் (TamilNeram.github.io), 2025. +# +# +msgid "" +msgstr "" +"Project-Id-Version: gitk\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-05-07 08:01+0530\n" +"PO-Revision-Date: 2025-05-07 09:17\n" +"Last-Translator: தமிழ்நேரம் (TamilNeram.github.io)\n" +"Language-Team: Tamil\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: gitk:274 +msgid "Couldn't get list of unmerged files:" +msgstr "ஒருங்கிணைக்கப்படாத கோப்புகளின் பட்டியலைப் பெற முடியவில்லை:" + +#: gitk:346 gitk:2565 +msgid "Color words" +msgstr "வண்ண சொற்கள்" + +#: gitk:351 gitk:2565 gitk:8476 gitk:8509 +msgid "Markup words" +msgstr "குறிக்கப்பட்ட சொற்கள்" + +#: gitk:458 +msgid "Error parsing revisions:" +msgstr "பிழைகளை பாகுபடுத்துதல்:" + +#: gitk:524 +msgid "Error executing --argscmd command:" +msgstr "--argscmd கட்டளையை இயக்குவதில் பிழை:" + +#: gitk:537 +msgid "No files selected: --merge specified but no files are unmerged." +msgstr "" +"கோப்புகள் எதுவும் தேர்ந்தெடுக்கப்படவில்லை: --ஒன்றிணை குறிப்பிடப்பட்டுள்ளது, " +"ஆனால் கோப்புகள் எதுவும் அவிழ்க்கப்படவில்லை." + +#: gitk:540 +msgid "" +"No files selected: --merge specified but no unmerged files are within file " +"limit." +msgstr "" +"கோப்புகள் எதுவும் தேர்ந்தெடுக்கப்படவில்லை: --ஒன்றிணை குறிப்பிடப்பட்டுள்ளது, " +"ஆனால் அவிழ்க்கப்படாத கோப்புகள் எதுவும் கோப்பு வரம்பிற்குள் இல்லை." + +#: gitk:565 gitk:720 +msgid "Error executing git log:" +msgstr "அறிவிலி பதிவை இயக்குவதில் பிழை:" + +#: gitk:583 gitk:736 +msgid "Reading" +msgstr "படித்தல்" + +#: gitk:643 gitk:4736 +msgid "Reading commits..." +msgstr "உறுதிமொழிகளைப் படித்தல்..." + +#: gitk:646 gitk:1795 gitk:4739 +msgid "No commits selected" +msgstr "எந்த உறுதிமொழிகளும் தேர்ந்தெடுக்கப்படவில்லை" + +#: gitk:1603 gitk:4256 gitk:12883 +msgid "Command line" +msgstr "கட்டளை வரி" + +#: gitk:1669 +msgid "Can't parse git log output:" +msgstr "அறிவிலி பதிவு வெளியீட்டை அலச முடியாது:" + +#: gitk:1898 +msgid "No commit information available" +msgstr "உறுதிமொழி செய்தி எதுவும் கிடைக்கவில்லை" + +#: gitk:2065 gitk:2094 gitk:4526 gitk:10016 gitk:11626 gitk:11946 +msgid "OK" +msgstr "சரி" + +#: gitk:2096 gitk:4528 gitk:9452 gitk:9531 gitk:9661 gitk:9747 gitk:10018 +#: gitk:11627 gitk:11947 +msgid "Cancel" +msgstr "நீக்கறல்" + +#: gitk:2249 +msgid "&Update" +msgstr "புதுப்பித்தல்" + +#: gitk:2250 +msgid "&Reload" +msgstr "மீண்டும் ஏற்று" + +#: gitk:2251 +msgid "Reread re&ferences" +msgstr "குறிப்புகளை மீண்டும் படி" + +#: gitk:2252 +msgid "&List references" +msgstr "பட்டியல் குறிப்புகள்" + +#: gitk:2254 +msgid "Start git &gui" +msgstr "அறிவிலி இடைமுகத்தைத் தொடங்கு" + +#: gitk:2256 +msgid "&Quit" +msgstr "வெளியேறு" + +#: gitk:2248 +msgid "&File" +msgstr "கோப்பு" + +#: gitk:2260 +msgid "&Preferences" +msgstr "விருப்பத்தேர்வுகள்" + +#: gitk:2259 +msgid "&Edit" +msgstr "திருத்து" + +#: gitk:2264 +msgid "&New view..." +msgstr "புதிய பார்வை..." + +#: gitk:2265 +msgid "&Edit view..." +msgstr "பார்வையைத் திருத்து..." + +#: gitk:2266 +msgid "&Delete view" +msgstr "பார்வையை நீக்கு" + +#: gitk:2268 +msgid "&All files" +msgstr "அனைத்து கோப்புகளும்" + +#: gitk:2263 +msgid "&View" +msgstr "காண்க" + +#: gitk:2273 gitk:2283 +msgid "&About gitk" +msgstr "அறிவிலிகே பற்றி" + +#: gitk:2274 gitk:2288 +msgid "&Key bindings" +msgstr "முக்கிய பிணைப்புகள்" + +#: gitk:2272 gitk:2287 +msgid "&Help" +msgstr "உதவி" + +#: gitk:2365 gitk:8908 +msgid "Commit ID:" +msgstr "உறுதிமொழி அடையாளம்:" + +#: gitk:2409 +msgid "Row" +msgstr "நிரை" + +#: gitk:2447 +msgid "Find" +msgstr "கண்டுபிடி" + +#: gitk:2475 +msgid "commit" +msgstr "உறுதிமொழி" + +#: gitk:2479 gitk:2481 gitk:4898 gitk:4921 gitk:4945 gitk:6966 gitk:7038 +#: gitk:7123 +msgid "containing:" +msgstr "கொண்டிருக்கிறது:" + +#: gitk:2482 gitk:3737 gitk:3742 gitk:4974 +msgid "touching paths:" +msgstr "தொடும் பாதைகள்:" + +#: gitk:2483 gitk:4988 +msgid "adding/removing string:" +msgstr "சரத்தைச் சேர்ப்பது/அகற்றுவது:" + +#: gitk:2484 gitk:4990 +msgid "changing lines matching:" +msgstr "பொருந்தக்கூடிய வரிகளை மாற்றுதல்:" + +#: gitk:2493 gitk:2495 gitk:4977 +msgid "Exact" +msgstr "சரியான" + +#: gitk:2495 gitk:5065 gitk:6934 +msgid "IgnCase" +msgstr "வழக்குதவிர்" + +#: gitk:2495 gitk:4947 gitk:5063 gitk:6930 +msgid "Regexp" +msgstr "வழக்கவெளி" + +#: gitk:2497 gitk:2498 gitk:5085 gitk:5115 gitk:5122 gitk:7059 gitk:7127 +msgid "All fields" +msgstr "அனைத்து புலங்களும்" + +#: gitk:2498 gitk:5082 gitk:5115 gitk:6997 +msgid "Headline" +msgstr "தலைப்பு" + +#: gitk:2499 gitk:5082 gitk:6997 gitk:7127 gitk:7639 +msgid "Comments" +msgstr "கருத்துகள்" + +#: gitk:2499 gitk:5082 gitk:5087 gitk:5122 gitk:6997 gitk:7574 gitk:9086 +#: gitk:9101 +msgid "Author" +msgstr "நூலாசிரியர்" + +#: gitk:2499 gitk:5082 gitk:6997 gitk:7576 +msgid "Committer" +msgstr "உறுதிமொழிபவர்" + +#: gitk:2533 +msgid "Search" +msgstr "தேடு" + +#: gitk:2541 +msgid "Diff" +msgstr "வேறுபாடு" + +#: gitk:2543 +msgid "Old version" +msgstr "பழைய பதிப்பு" + +#: gitk:2545 +msgid "New version" +msgstr "புதிய பதிப்பு" + +#: gitk:2548 +msgid "Lines of context" +msgstr "சூழலின் வரிகள்" + +#: gitk:2558 +msgid "Ignore space change" +msgstr "இடைவெளி மாற்றத்தை புறக்கணி" + +#: gitk:2562 gitk:2564 gitk:8209 gitk:8462 +msgid "Line diff" +msgstr "வரி வேறுபாடு" + +#: gitk:2637 +msgid "Patch" +msgstr "ஒட்டு" + +#: gitk:2639 +msgid "Tree" +msgstr "மரம்" + +#: gitk:2814 gitk:2835 +msgid "Diff this -> selected" +msgstr "இதை வேறுபடுத்துங்கள் -> தேர்ந்தெடுக்கப்பட்டது" + +#: gitk:2815 gitk:2836 +msgid "Diff selected -> this" +msgstr "வேறுபாடு தேர்ந்தெடுக்கப்பட்டது -> இது" + +#: gitk:2816 gitk:2837 +msgid "Make patch" +msgstr "ஒட்டு செய்" + +#: gitk:2817 gitk:9510 +msgid "Create tag" +msgstr "குறிச்சொல்லை உருவாக்கு" + +#: gitk:2818 +msgid "Copy commit reference" +msgstr "உறுதிமொழி குறிப்பு நகலெடு" + +#: gitk:2819 gitk:9641 +msgid "Write commit to file" +msgstr "கோப்பில் உறவை எழுதுங்கள்" + +#: gitk:2820 +msgid "Create new branch" +msgstr "புதிய கிளையை உருவாக்கு" + +#: gitk:2821 +msgid "Cherry-pick this commit" +msgstr "கனி-எடு இந்த உறுதிமொழி" + +#: gitk:2822 +msgid "Reset HEAD branch to here" +msgstr "தலை கிளையை இங்கே மீட்டமை" + +#: gitk:2823 +msgid "Mark this commit" +msgstr "இந்த உறுதிமொழியைக் குறி" + +#: gitk:2824 +msgid "Return to mark" +msgstr "மார்க்குக்குத் திரும்பு" + +#: gitk:2825 +msgid "Find descendant of this and mark" +msgstr "இதன் வழித்தோன்றலைக் கண்டுபிடித்து குறி" + +#: gitk:2826 +msgid "Compare with marked commit" +msgstr "குறிக்கப்பட்ட உறுதிப்பாட்டுடன் ஒப்பிடுக" + +#: gitk:2827 gitk:2838 +msgid "Diff this -> marked commit" +msgstr "இதை வேறுபடுத்துங்கள் -> குறிக்கப்பட்ட உறுதிமொழி" + +#: gitk:2828 gitk:2839 +msgid "Diff marked commit -> this" +msgstr "வேறுபாடு குறிக்கப்பட்ட உறுதிமொழி -> இது" + +#: gitk:2829 +msgid "Revert this commit" +msgstr "இந்த உறுதிப்பாட்டை மாற்றவும்" + +#: gitk:2845 +msgid "Check out this branch" +msgstr "இந்த கிளையைப் பாருங்கள்" + +#: gitk:2846 +msgid "Rename this branch" +msgstr "இந்த கிளையை மறுபெயரிடு" + +#: gitk:2847 +msgid "Remove this branch" +msgstr "இந்த கிளையை அகற்று" + +#: gitk:2848 +msgid "Copy branch name" +msgstr "கிளை பெயரை நகலெடு" + +#: gitk:2855 +msgid "Highlight this too" +msgstr "இதை முன்னிலைப்படுத்து" + +#: gitk:2856 +msgid "Highlight this only" +msgstr "இதை முன்னிலைப்படுத்து" + +#: gitk:2857 +msgid "External diff" +msgstr "வெளிப்புற வேறுபாடு" + +#: gitk:2858 +msgid "Blame parent commit" +msgstr "பெற்றோரை குற்றம் சாட்டு" + +#: gitk:2859 +msgid "Copy path" +msgstr "நகல் பாதை" + +#: gitk:2866 +msgid "Show origin of this line" +msgstr "இந்த வரியின் தோற்றத்தைக் காட்டு" + +#: gitk:2867 +msgid "Run git gui blame on this line" +msgstr "இந்த வரியில் அறிவிலி இடைமுகம் பழியை இயக்கு" + +#: gitk:3221 +msgid "About gitk" +msgstr "அறிவிலிகே பற்றி" + +#: gitk:3223 +msgid "" +"\n" +"Gitk - a commit viewer for git\n" +"\n" +"Copyright © 2005-2016 Paul Mackerras\n" +"\n" +"Use and redistribute under the terms of the GNU General Public License" +msgstr "" +"\n" +"அறிவிலிகே - அறிவிலி ஒரு உறுதிமொழி பார்வையாளர் \n" +"\n" +"பதிப்புரிமை © 2005-2016 பால் மெக்கெராச் \n" +"\n" +"குனு பொது பொதுமக்கள் உரிமத்தின் விதிமுறைகளின் கீழ் பயன்படுத்தவும் மறுபகிர்வு செய்யவும்" + +#: gitk:3231 gitk:3298 gitk:10231 +msgid "Close" +msgstr "மூடு" + +#: gitk:3252 +msgid "Gitk key bindings" +msgstr "அறிவிலிகே விசை பிணைப்புகள்" + +#: gitk:3255 +msgid "Gitk key bindings:" +msgstr "அறிவிலிகே விசை பிணைப்புகள்:" + +#: gitk:3257 +#, tcl-format +msgid "<%s-Q>\t\tQuit" +msgstr "<%s-Q>\t\tவெளியேறு" + +#: gitk:3258 +#, tcl-format +msgid "<%s-W>\t\tClose window" +msgstr "<%s-w>\t\tசாளரத்தை மூடு" + +#: gitk:3259 +msgid "<Home>\t\tMove to first commit" +msgstr "<வீடு> முதல் உறுதிமொழிக்கு நகர்த்து" + +#: gitk:3260 +msgid "<End>\t\tMove to last commit" +msgstr "<முடி> கடைசி உறுதிமொழிக்கு நகர்த்து" + +#: gitk:3261 +msgid "<Up>, p, k\tMove up one commit" +msgstr "<மேலே>, பி, கே\tஒரு உறுதிமொழியை மேலே நகர்த்து" + +#: gitk:3262 +msgid "<Down>, n, j\tMove down one commit" +msgstr "<கீழ்>, n, j\tஒரு உறுதிமொழியை கீழே நகர்த்து" + +#: gitk:3263 +msgid "<Left>, z, h\tGo back in history list" +msgstr "<இடது>, z, h\tவரலாற்று பட்டியலில் திரும்பிச் செல்" + +#: gitk:3264 +msgid "<Right>, x, l\tGo forward in history list" +msgstr "<வலது>, x, l\tவரலாற்று பட்டியலில் முன்னோக்கி செல்" + +#: gitk:3265 +#, tcl-format +msgid "<%s-n>\tGo to n-th parent of current commit in history list" +msgstr "" +"<%s-n> வரலாற்று பட்டியலில் தற்போதைய உறுதிப்பாட்டின் n- வது பெற்றோரிடம் " +"செல்" + +#: gitk:3266 +msgid "<PageUp>\tMove up one page in commit list" +msgstr "<பக்கம்மேல்>\tஉறுதிமொழி பட்டியலில் ஒரு பக்கத்தை நகர்த்து" + +#: gitk:3267 +msgid "<PageDown>\tMove down one page in commit list" +msgstr "<பக்கம்கீழ்>\tஉறுதிமொழி பட்டியலில் ஒரு பக்கத்தை நகர்த்து" + +#: gitk:3268 +#, tcl-format +msgid "<%s-Home>\tScroll to top of commit list" +msgstr "<%s-வீடு>\tஉறுதிமொழி பட்டியலை மேல் பகுதிக்கு உருட்டவும்" + +#: gitk:3269 +#, tcl-format +msgid "<%s-End>\tScroll to bottom of commit list" +msgstr "<%s-முடி> உறுதிமொழி பட்டியலின் கீழ் பகுதிக்கு உருட்டவும்" + +#: gitk:3270 +#, tcl-format +msgid "<%s-Up>\tScroll commit list up one line" +msgstr "<%s-மேலே>\tஉறுதிமொழி பட்டியலை ஒரு வரி மேலே உருட்டவும்" + +#: gitk:3271 +#, tcl-format +msgid "<%s-Down>\tScroll commit list down one line" +msgstr "<%s-கீழ்>\tஉறுதிமொழி பட்டியலை ஒரு வரி கீழே உருட்டவும்" + +#: gitk:3272 +#, tcl-format +msgid "<%s-PageUp>\tScroll commit list up one page" +msgstr "<%s-பக்கம்மேலே>\tஉறுதிமொழி பட்டியலை ஒரு பக்கம் மேலே உருட்டவும்" + +#: gitk:3273 +#, tcl-format +msgid "<%s-PageDown>\tScroll commit list down one page" +msgstr "<%s-பக்கம்கீழ்>\tஉறுதிமொழி பட்டியலை ஒரு பக்கம் கீழே உருட்டவும்" + +#: gitk:3274 +msgid "<Shift-Up>\tFind backwards (upwards, later commits)" +msgstr "<உயர்த்து-மேலே>\tபின்னோக்கி கண்டுபிடி (மேல்நோக்கி, பின்னர் உறுதிமொழிகள்)" + +#: gitk:3275 +msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" +msgstr "" +"<உயர்த்து-கீழே>\tமுன்னோக்குகளைக் கண்டறியவும் (கீழ்நோக்கி, முந்தைய " +"உறுதிமொழிகள்)" + +#: gitk:3276 +msgid "<Delete>, b\tScroll diff view up one page" +msgstr "<நீக்கு>, b\tசுருள் வேறுபாடு ஒரு பக்கத்தை மேலே காண்க" + +#: gitk:3277 +msgid "<Backspace>\tScroll diff view up one page" +msgstr "<பின்வெளி>\tசுருள் வேறுபாடு ஒரு பக்கத்தை மேலே காண்க" + +#: gitk:3278 +msgid "<Space>\t\tScroll diff view down one page" +msgstr "<Space>\t\tசுருள் வேறுபாடு ஒரு பக்கத்தைக் கீழே காண்க" + +#: gitk:3279 +msgid "u\t\tScroll diff view up 18 lines" +msgstr "u\t\tசுருள் வேறுபாடு 18 வரிகளை மேலே காண்க" + +#: gitk:3280 +msgid "d\t\tScroll diff view down 18 lines" +msgstr "d\t\tசுருள் வேறுபாடு 18 வரிகளைக் கீழே காண்க" + +#: gitk:3281 +#, tcl-format +msgid "<%s-F>\t\tFind" +msgstr "<%s-F>\t\tகண்டுபிடி" + +#: gitk:3282 +#, tcl-format +msgid "<%s-G>\t\tMove to next find hit" +msgstr "<%s-G>\t\tஅடுத்த கண்டுபிடிப்பு வெற்றிக்கு செல்" + +#: gitk:3283 +msgid "<Return>\tMove to next find hit" +msgstr "<திரும்பு>\tஅடுத்ததைக் கண்டுபிடி" + +#: gitk:3284 +msgid "g\t\tGo to commit" +msgstr "g\t\tஉறுதிமொழிக்கு செல்" + +#: gitk:3285 +msgid "/\t\tFocus the search box" +msgstr "/\t\tதேடல் பெட்டியில் கவனம் செலுத்து" + +#: gitk:3286 +msgid "?\t\tMove to previous find hit" +msgstr "?\t\tமுந்தைய கண்டுபிடிப்பு வெற்றிக்கு செல்" + +#: gitk:3287 +msgid "f\t\tScroll diff view to next file" +msgstr "f\t\tஅடுத்த கோப்பிற்கு உருள் வேறுபாடு பார்வை" + +#: gitk:3288 +#, tcl-format +msgid "<%s-S>\t\tSearch for next hit in diff view" +msgstr "<%s-S>\t\tவேறுபாடு பார்வையில் அடுத்த வெற்றியைத் தேடுங்கள்" + +#: gitk:3289 +#, tcl-format +msgid "<%s-R>\t\tSearch for previous hit in diff view" +msgstr "<%s-r> வேறுபட்ட பார்வையில் முந்தைய வெற்றியைத் தேடுங்கள்" + +#: gitk:3290 +#, tcl-format +msgid "<%s-KP+>\tIncrease font size" +msgstr "<%s-KP+>\tஎழுத்துரு அளவை அதிகரி" + +#: gitk:3291 +#, tcl-format +msgid "<%s-plus>\tIncrease font size" +msgstr "<%s-plus>\tஎழுத்துரு அளவை அதிகரி" + +#: gitk:3292 +#, tcl-format +msgid "<%s-KP->\tDecrease font size" +msgstr "<%s-KP->\tஎழுத்துரு அளவைக் குறை" + +#: gitk:3293 +#, tcl-format +msgid "<%s-minus>\tDecrease font size" +msgstr "<%s-minus>\tஎழுத்துரு அளவைக் குறை" + +#: gitk:3294 +msgid "<F5>\t\tUpdate" +msgstr "<F5>\t\tபுதுப்பிப்பு" + +#: gitk:3761 gitk:3770 +#, tcl-format +msgid "Error creating temporary directory %s:" +msgstr "தற்காலிக அடைவு %s ஐ உருவாக்குவது பிழை:" + +#: gitk:3783 +#, tcl-format +msgid "Error getting \"%s\" from %s:" +msgstr "%s இலிருந்து \" %s\" பெறுவது பிழை:" + +#: gitk:3846 +msgid "command failed:" +msgstr "கட்டளை தோல்வியுற்றது:" + +#: gitk:3995 +msgid "No such commit" +msgstr "அத்தகைய உறுதிமொழி இல்லை" + +#: gitk:4009 +msgid "git gui blame: command failed:" +msgstr "அறிவிலி இடைமுக பழி: கட்டளை தோல்வியுற்றது:" + +#: gitk:4040 +#, tcl-format +msgid "Couldn't read merge head: %s" +msgstr "ஒன்றிணைப்பு தலையைப் படிக்க முடியவில்லை: %s" + +#: gitk:4048 +#, tcl-format +msgid "Error reading index: %s" +msgstr "பிழை வாசிப்பு குறியீடு: %s" + +#: gitk:4073 +#, tcl-format +msgid "Couldn't start git blame: %s" +msgstr "அறிவிலி பழியைத் தொடங்க முடியவில்லை: %s" + +#: gitk:4076 gitk:6965 +msgid "Searching" +msgstr "தேடுகிறது" + +#: gitk:4108 +#, tcl-format +msgid "Error running git blame: %s" +msgstr "பிழை இயங்கும் அறிவிலி பழி: %s" + +#: gitk:4136 +#, tcl-format +msgid "That line comes from commit %s, which is not in this view" +msgstr "" +"அந்த வரி உறுதிமொழி %s என்பதிலிருந்து வருகிறது, இது இந்த பார்வையில் இல்லை" + +#: gitk:4150 +msgid "External diff viewer failed:" +msgstr "வெளிப்புற வேறுபாடு பார்வையாளர் தோல்வியுற்றது:" + +#: gitk:4254 +msgid "All files" +msgstr "அனைத்து கோப்புகளும்" + +#: gitk:4278 +msgid "View" +msgstr "காண்க" + +#: gitk:4281 +msgid "Gitk view definition" +msgstr "அறிவிலிகே பார்வை வரையறை" + +#: gitk:4285 +msgid "Remember this view" +msgstr "இந்த பார்வையை நினைவில் கொள்ளுங்கள்" + +#: gitk:4286 +msgid "References (space separated list):" +msgstr "குறிப்புகள் (இடைவெளி பிரிக்கப்பட்ட பட்டியல்):" + +#: gitk:4287 +msgid "Branches & tags:" +msgstr "கிளைகள் மற்றும் குறிச்சொற்கள்:" + +#: gitk:4288 +msgid "All refs" +msgstr "அனைத்து குறிப்புகள்" + +#: gitk:4289 +msgid "All (local) branches" +msgstr "அனைத்து (உள்ளக) கிளைகளும்" + +#: gitk:4290 +msgid "All tags" +msgstr "அனைத்து குறிச்சொற்களும்" + +#: gitk:4291 +msgid "All remote-tracking branches" +msgstr "அனைத்து தொலை-கண்காணிப்பு கிளைகளும்" + +#: gitk:4292 +msgid "Commit Info (regular expressions):" +msgstr "உறுதிமொழி செய்தி (வழக்கமான வெளிப்பாடுகள்):" + +#: gitk:4293 +msgid "Author:" +msgstr "ஆசிரியர்:" + +#: gitk:4294 +msgid "Committer:" +msgstr "உறுதிமொழிபவர்:" + +#: gitk:4295 +msgid "Commit Message:" +msgstr "உறுதிமொழி செய்தி:" + +#: gitk:4296 +msgid "Matches all Commit Info criteria" +msgstr "அனைத்து உறுதிமொழி செய்தி அளவுகோல்களையும் பொருத்துகிறது" + +#: gitk:4297 +msgid "Matches no Commit Info criteria" +msgstr "உறுதிமொழி செய்தி அளவுகோல்களுடன் பொருந்தவில்லை" + +#: gitk:4298 +msgid "Changes to Files:" +msgstr "கோப்புகளில் மாற்றங்கள்:" + +#: gitk:4299 +msgid "Fixed String" +msgstr "நிலையான சரம்" + +#: gitk:4300 +msgid "Regular Expression" +msgstr "வழக்கமான வெளிப்பாடு" + +#: gitk:4301 +msgid "Search string:" +msgstr "தேடல் சரம்:" + +#: gitk:4302 +msgid "" +"Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " +"15:27:38\"):" +msgstr "" +"உறுதிமொழி தேதிகள் (\"2 வாரங்களுக்கு முன்பு\", \"2009-01-16 15:27:38\", \"மார்ச் 17, " +"2009 15:27:38\"):" + +#: gitk:4303 +msgid "Since:" +msgstr "பின்னர்:" + +#: gitk:4304 +msgid "Until:" +msgstr "வரை:" + +#: gitk:4305 +msgid "Limit and/or skip a number of revisions (positive integer):" +msgstr "" +"பல திருத்தங்களை (நேர்மறை முழு எண்) கட்டுப்படுத்து மற்றும்/அல்லது தவிர்:" + +#: gitk:4306 +msgid "Number to show:" +msgstr "காண்பிக்க எண்:" + +#: gitk:4307 +msgid "Number to skip:" +msgstr "தவிர்க்க எண்:" + +#: gitk:4308 +msgid "Miscellaneous options:" +msgstr "இதர விருப்பங்கள்:" + +#: gitk:4309 +msgid "Strictly sort by date" +msgstr "கண்டிப்பாக தேதியின்படி வரிசைப்படுத்து" + +#: gitk:4310 +msgid "Mark branch sides" +msgstr "கிளை பக்கங்களைக் குறி" + +#: gitk:4311 +msgid "Limit to first parent" +msgstr "முதல் பெற்றோருக்கு வரம்பு" + +#: gitk:4312 +msgid "Simple history" +msgstr "எளிய வரலாறு" + +#: gitk:4313 +msgid "Additional arguments to git log:" +msgstr "அறிவிலி பதிவுக்கு கூடுதல் வாதங்கள்:" + +#: gitk:4314 +msgid "Enter files and directories to include, one per line:" +msgstr "சேர்க்க கோப்புகள் மற்றும் கோப்பகங்களை உள்ளிடவும், ஒரு வரிக்கு ஒன்று:" + +#: gitk:4315 +msgid "Command to generate more commits to include:" +msgstr "சேர்க்க கூடுதல் உறுதிமொழிகளை உருவாக்க கட்டளை:" + +#: gitk:4439 +msgid "Gitk: edit view" +msgstr "அறிவிலிகே: திருத்து பார்வை" + +#: gitk:4447 +msgid "-- criteria for selecting revisions" +msgstr "-- திருத்தங்களைத் தேர்ந்தெடுப்பதற்கான அளவுகோல்கள்" + +#: gitk:4452 +msgid "View Name" +msgstr "பெயரைக் காண்க" + +#: gitk:4527 +msgid "Apply (F5)" +msgstr "இடு (F5)" + +#: gitk:4565 +msgid "Error in commit selection arguments:" +msgstr "உறுதிமொழி தேர்வு வாதங்களில் பிழை:" + +#: gitk:4620 gitk:4673 gitk:5135 gitk:5149 gitk:6419 gitk:12820 gitk:12821 +msgid "None" +msgstr "எதுவுமில்லை" + +#: gitk:5232 gitk:5237 +msgid "Descendant" +msgstr "வழித்தோன்றல்" + +#: gitk:5233 +msgid "Not descendant" +msgstr "வழித்தோன்றல் அல்ல" + +#: gitk:5240 gitk:5245 +msgid "Ancestor" +msgstr "மூதாதையர்" + +#: gitk:5241 +msgid "Not ancestor" +msgstr "மூதாதையர் அல்ல" + +#: gitk:5535 +msgid "Local changes checked in to index but not committed" +msgstr "" +"உள்ளக மாற்றங்கள் குறியீட்டில் சரிபார்க்கப்பட்டன, ஆனால் உறுதிமொழியவில்லை" + +#: gitk:5571 +msgid "Local uncommitted changes, not checked in to index" +msgstr "உள்ளக உறுதிமொழியாத மாற்றங்கள், குறியீட்டில் சரிபார்க்கப்படவில்லை" + +#: gitk:7319 +msgid "Error starting web browser:" +msgstr "வலை உலாவியைத் தொடங்குவதில் பிழை:" + +#: gitk:7380 +msgid "and many more" +msgstr "மற்றும் மேலும் பல" + +#: gitk:7383 +msgid "many" +msgstr "பல" + +#: gitk:7578 +msgid "Tags:" +msgstr "குறிச்சொற்கள்:" + +#: gitk:7595 gitk:7601 gitk:9081 +msgid "Parent" +msgstr "பெற்றோர்" + +#: gitk:7606 +msgid "Child" +msgstr "குழந்தை" + +#: gitk:7615 +msgid "Branch" +msgstr "கிளை" + +#: gitk:7618 +msgid "Follows" +msgstr "பின்வருமாறு" + +#: gitk:7621 +msgid "Precedes" +msgstr "முன்னால்" + +#: gitk:8216 +#, tcl-format +msgid "Error getting diffs: %s" +msgstr "வேறுபாடு பெறுவதில் பிழை: %s" + +#: gitk:8906 +msgid "Goto:" +msgstr "செல்:" + +#: gitk:8927 +#, tcl-format +msgid "Short commit ID %s is ambiguous" +msgstr "குறுகிய உறுதிமொழி அடையாளம் %s தெளிவற்றவை" + +#: gitk:8934 +#, tcl-format +msgid "Revision %s is not known" +msgstr "திருத்தம் %s தெரியவில்லை" + +#: gitk:8944 +#, tcl-format +msgid "Commit ID %s is not known" +msgstr "உறுதிமொழி அடையாளம் %s அறியப்படவில்லை" + +#: gitk:8946 +#, tcl-format +msgid "Revision %s is not in the current view" +msgstr "திருத்தம் %s தற்போதைய பார்வையில் இல்லை" + +#: gitk:9088 gitk:9103 +msgid "Date" +msgstr "திகதி" + +#: gitk:9091 +msgid "Children" +msgstr "குழந்தைகள்" + +#: gitk:9154 +#, tcl-format +msgid "Reset %s branch to here" +msgstr "%s கிளையை இங்கே மீட்டமை" + +#: gitk:9156 +msgid "Detached head: can't reset" +msgstr "பிரிக்கப்பட்ட தலை: மீட்டமைக்க முடியாது" + +#: gitk:9261 gitk:9267 +msgid "Skipping merge commit " +msgstr "ஒன்றிணை உறுதிமொழியை தவர்கிறது " + +#: gitk:9276 gitk:9281 +msgid "Error getting patch ID for " +msgstr "ஒட்டு அடையாளத்தைப் பெறுவதில் பிழை" + +#: gitk:9277 gitk:9282 +msgid " - stopping\n" +msgstr "- நிறுத்துதல்\n" + +#: gitk:9287 gitk:9290 gitk:9298 gitk:9312 gitk:9321 +msgid "Commit " +msgstr "உறுதிமொழி" + +#: gitk:9291 +msgid "" +" is the same patch as\n" +" " +msgstr "அதே ஒட்டு\n" +" " + +#: gitk:9299 +msgid "" +" differs from\n" +" " +msgstr "இருந்து வேறுபடுகிறது\n" +" " + +#: gitk:9301 +msgid "" +"Diff of commits:\n" +"\n" +msgstr "உறுதிமொழியின் வேறுபாடு:\n" +"\n" + +#: gitk:9313 gitk:9322 +#, tcl-format +msgid " has %s children - stopping\n" +msgstr "%s குழந்தைகள் உள்ளனர் - நிறுத்துதல்\n" + +#: gitk:9341 +#, tcl-format +msgid "Error writing commit to file: %s" +msgstr "உறுதிமொழி கோப்பில் எழுதுதல் பிழை: %s" + +#: gitk:9347 +#, tcl-format +msgid "Error diffing commits: %s" +msgstr "உறுதிமொழிகள் வேறுபாடு பிழை: %s" + +#: gitk:9393 +msgid "Top" +msgstr "மேலே" + +#: gitk:9394 +msgid "From" +msgstr "இருந்து" + +#: gitk:9399 +msgid "To" +msgstr "பெறுநர்" + +#: gitk:9423 +msgid "Generate patch" +msgstr "ஒட்டை உருவாக்கு" + +#: gitk:9425 +msgid "From:" +msgstr "இருந்து:" + +#: gitk:9434 +msgid "To:" +msgstr "இதற்கு:" + +#: gitk:9443 +msgid "Reverse" +msgstr "தலைகீழ்" + +#: gitk:9445 gitk:9655 +msgid "Output file:" +msgstr "வெளியீட்டு கோப்பு:" + +#: gitk:9451 +msgid "Generate" +msgstr "உருவாக்கு" + +#: gitk:9489 +msgid "Error creating patch:" +msgstr "ஒட்டை உருவாக்கு பிழை:" + +#: gitk:9512 gitk:9643 gitk:9731 +msgid "ID:" +msgstr "அடையாளம்:" + +#: gitk:9521 +msgid "Tag name:" +msgstr "குறிச்சொல் பெயர்:" + +#: gitk:9524 +msgid "Tag message is optional" +msgstr "குறிச்சொல் செய்தி விருப்பமானது" + +#: gitk:9526 +msgid "Tag message:" +msgstr "குறிச்சொல் செய்தி:" + +#: gitk:9530 gitk:9701 +msgid "Create" +msgstr "உருவாக்கு" + +#: gitk:9548 +msgid "No tag name specified" +msgstr "குறிச்சொல் பெயர் குறிப்பிடப்படவில்லை" + +#: gitk:9552 +#, tcl-format +msgid "Tag \"%s\" already exists" +msgstr "குறிச்சொல் \"%s\" ஏற்கனவே உள்ளது" + +#: gitk:9562 +msgid "Error creating tag:" +msgstr "குறிச்சொல்லை உருவாக்கு பிழை:" + +#: gitk:9652 +msgid "Command:" +msgstr "கட்டளை:" + +#: gitk:9660 +msgid "Write" +msgstr "எழுது" + +#: gitk:9678 +msgid "Error writing commit:" +msgstr "பிழை எழுதுதல் உறுதிமொழி:" + +#: gitk:9700 +msgid "Create branch" +msgstr "கிளையை உருவாக்கு" + +#: gitk:9716 +#, tcl-format +msgid "Rename branch %s" +msgstr "%s கிளையை மறுபெயரிடு" + +#: gitk:9717 +msgid "Rename" +msgstr "மறுபெயரிடு" + +#: gitk:9741 +msgid "Name:" +msgstr "பெயர்:" + +#: gitk:9765 +msgid "Please specify a name for the new branch" +msgstr "புதிய கிளைக்கு ஒரு பெயரைக் குறிப்பிடு" + +#: gitk:9770 +#, tcl-format +msgid "Branch '%s' already exists. Overwrite?" +msgstr "கிளை '%s' ஏற்கனவே உள்ளது. மேலெழுதவா?" + +#: gitk:9814 +msgid "Please specify a new name for the branch" +msgstr "கிளைக்கு ஒரு புதிய பெயரைக் குறிப்பிடு" + +#: gitk:9877 +#, tcl-format +msgid "Commit %s is already included in branch %s -- really re-apply it?" +msgstr "" +"உறுதிமொழி %s ஏற்கனவே கிளை %s சேர்க்கப்பட்டுள்ளன-உண்மையில் அதை மீண்டும் இடவா?" + +#: gitk:9882 +msgid "Cherry-picking" +msgstr "கனி எடுக்கும்" + +#: gitk:9891 +#, tcl-format +msgid "" +"Cherry-pick failed because of local changes to file '%s'.\n" +"Please commit, reset or stash your changes and try again." +msgstr "" +"'%s' கோப்பில் உள்ளக மாற்றங்கள் காரணமாக கனி-எடு தோல்வியடைந்தது. \n" +"தயவுசெய்து உங்கள் மாற்றங்களைச் உறுதிமொழி, மீட்டமை அல்லது சேமி பிறகு மீண்டும் முயற்சி." + +#: gitk:9897 +msgid "" +"Cherry-pick failed because of merge conflict.\n" +"Do you wish to run git citool to resolve it?" +msgstr "" +"ஒன்றிணைக்கும் மோதல் காரணமாக கனி-எடு தோல்வியடைந்தது. \n" +"அதை தீர்க்க அறிவிலி சிஐகருவியை இயக்க விரும்புகிறீர்களா?" + +#: gitk:9913 gitk:9971 +msgid "No changes committed" +msgstr "எந்த மாற்றங்களும் உறுதிமொழியப்படவில்லை" + +#: gitk:9940 +#, tcl-format +msgid "Commit %s is not included in branch %s -- really revert it?" +msgstr "" +"உறுதிமொழி %s கிளை %s சேர்க்கப்படவில்லை - உண்மையில் அதை மீட்டெடுக்கவா?" + +#: gitk:9945 +msgid "Reverting" +msgstr "மீட்டெடுத்தல்" + +#: gitk:9953 +#, tcl-format +msgid "" +"Revert failed because of local changes to the following files:%s Please " +"commit, reset or stash your changes and try again." +msgstr "" +"பின்வரும் கோப்புகளில் உள்ளக மாற்றங்கள் காரணமாக மீட்டெடு தோல்வியுற்றது:%s " +"தயவுசெய்து உங்கள் மாற்றங்களைச் உறுதிமொழி, மீட்டமை அல்லது " +"சேமி மற்றும் மீண்டும் முயற்சி." + +#: gitk:9957 +msgid "" +"Revert failed because of merge conflict.\n" +" Do you wish to run git citool to resolve it?" +msgstr "" +"ஒன்றிணைக்கும் மோதல் காரணமாக மீட்டெடு தோல்வியடைந்தது. \n" +"அதை தீர்க்க அறிவிலி சிஐகருவியை இயக்க விரும்புகிறீர்களா?" + +#: gitk:10000 +msgid "Confirm reset" +msgstr "மீட்டமைப்பை உறுதிப்படுத்து" + +#: gitk:10002 +#, tcl-format +msgid "Reset branch %s to %s?" +msgstr "%s கிளையை %s க்கு மீட்டமைக்கவா?" + +#: gitk:10004 +msgid "Reset type:" +msgstr "மீட்டமை வகை:" + +#: gitk:10007 +msgid "Soft: Leave working tree and index untouched" +msgstr "" +"மென்மை: வேலை செய்யும் மரம் மற்றும் குறியீட்டைத் தீண்டாமல் விடு" + +#: gitk:10010 +msgid "Mixed: Leave working tree untouched, reset index" +msgstr "" +"கலப்பு: வேலை செய்யும் மரத்தை தீண்டாமல் விடு, குறியீட்டை மீட்டமை" + +#: gitk:10013 +msgid "" +"Hard: Reset working tree and index\n" +"(discard ALL local changes)" +msgstr "" +"கடினம்: வேலை செய்யும் மரம் மற்றும் குறியீட்டை மீட்டமை \n" +"(அனைத்து உள்ளக மாற்றங்களையும் நிராகரி)" + +#: gitk:10030 +msgid "Resetting" +msgstr "மீட்டமைத்தல்" + +#: gitk:10103 +#, tcl-format +msgid "A local branch named %s exists already" +msgstr "%s என்ற உள்ளக கிளை ஏற்கனவே உள்ளது" + +#: gitk:10111 +msgid "Checking out" +msgstr "சரிபார்" + +#: gitk:10170 +msgid "Cannot delete the currently checked-out branch" +msgstr "தற்போது சரிபார்க்கப்பட்ட கிளையை நீக்க முடியாது" + +#: gitk:10176 +#, tcl-format +msgid "" +"The commits on branch %s aren't on any other branch.\n" +"Really delete branch %s?" +msgstr "" +"கிளை %s மீதான உறுதிமொழிகள் வேறு எந்த கிளையிலும் இல்லை. \n" +"உண்மையில் கிளை %s நீக்கவா?" + +#: gitk:10207 +#, tcl-format +msgid "Tags and heads: %s" +msgstr "குறிச்சொற்கள் மற்றும் தலைகள்: %s" + +#: gitk:10224 +msgid "Filter" +msgstr "வடிப்பி" + +#: gitk:10531 +msgid "" +"Error reading commit topology information; branch and preceding/following " +"tag information will be incomplete." +msgstr "" +"உறுதிமொழி இடவியல் தகவலை படிப்பதில் பிழை; கிளை மற்றும் அதற்கு " +"முந்தைய/பின்வரும் குறிச்சொல் செய்தி முழுமையடையாது." + +#: gitk:11508 +msgid "Tag" +msgstr "குறிச்சொல்" + +#: gitk:11512 +msgid "Id" +msgstr "அடையாளம்" + +#: gitk:11595 +msgid "Gitk font chooser" +msgstr "அறிவிலிகே எழுத்துரு தேர்வு" + +#: gitk:11612 +msgid "B" +msgstr "பி" + +#: gitk:11615 +msgid "I" +msgstr "ஐ" + +#: gitk:11734 +msgid "Commit list display options" +msgstr "உறுதிமொழி பட்டியல் காட்சி விருப்பங்கள்" + +#: gitk:11737 +msgid "Maximum graph width (lines)" +msgstr "அதிகபட்ச வரைபட அகலம் (கோடுகள்)" + +#: gitk:11741 +#, no-tcl-format +msgid "Maximum graph width (% of pane)" +msgstr "அதிகபட்ச வரைபட அகலம் (பலகத்தின் %)" + +#: gitk:11744 +msgid "Show local changes" +msgstr "உள்ளக மாற்றங்களைக் காட்டு" + +#: gitk:11747 +msgid "Hide remote refs" +msgstr "தொலை குறிகளை மறை" + +#: gitk:11751 +msgid "Copy commit ID to clipboard" +msgstr "இடைநிலைப்பலகைக்கு அடையாளத்தை நகலெடு" + +#: gitk:11755 +msgid "Copy commit ID to X11 selection" +msgstr "உறுதிமொழி அடையாளத்தை ஃ11 பகுதிக்கு நகலெடு" + +#: gitk:11760 +msgid "Length of commit ID to copy" +msgstr "நகலெடுக்க உறுதிமொழி அடையாளத்தின் நீளம்" + +#: gitk:11763 +msgid "Diff display options" +msgstr "வேறுபாடு காட்சி விருப்பங்கள்" + +#: gitk:11765 +msgid "Tab spacing" +msgstr "தாவல் இடைவெளி" + +#: gitk:11769 +msgid "Wrap comment text" +msgstr "கருத்து உரையை மடி" + +#: gitk:11774 +msgid "Wrap other text" +msgstr "மற்ற உரையை மடி" + +#: gitk:11779 +msgid "Display nearby tags/heads" +msgstr "அருகிலுள்ள குறிச்சொற்கள்/தலைகளைக் காண்பி" + +#: gitk:11782 +msgid "Maximum # tags/heads to show" +msgstr "காண்பிக்க அதிகபட்ச # குறிச்சொற்கள்/தலைகள்" + +#: gitk:11785 +msgid "Limit diffs to listed paths" +msgstr "பட்டியலிடப்பட்ட பாதைகளுக்கு வரம்பு வேறுபடுகிறது" + +#: gitk:11788 +msgid "Support per-file encodings" +msgstr "ஒரு கோப்பு குறியீடுகளை ஆதரி" + +#: gitk:11794 gitk:11961 +msgid "External diff tool" +msgstr "வெளிப்புற வேறுபாடு கருவி" + +#: gitk:11795 +msgid "Choose..." +msgstr "தேர்வு..." + +#: gitk:11802 +msgid "Web browser" +msgstr "வலை உலாவி" + +#: gitk:11807 +msgid "General options" +msgstr "பொது விருப்பங்கள்" + +#: gitk:11810 +msgid "Use themed widgets" +msgstr "கருப்பொருள் நிரல்பலகைகளைப் பயன்படுத்து" + +#: gitk:11812 +msgid "(change requires restart)" +msgstr "(மாற்றத்திற்கு மறுதொடக்கம் தேவை)" + +#: gitk:11814 +msgid "(currently unavailable)" +msgstr "(தற்போது கிடைக்கவில்லை)" + +#: gitk:11826 +msgid "Colors: press to choose" +msgstr "நிறங்கள்: தேர்வு செய்ய அழுத்தவும்" + +#: gitk:11829 +msgid "Interface" +msgstr "இடைமுகம்" + +#: gitk:11830 +msgid "interface" +msgstr "இடைமுகம்" + +#: gitk:11833 +msgid "Background" +msgstr "பின்னணி" + +#: gitk:11834 gitk:11876 +msgid "background" +msgstr "பின்னணி" + +#: gitk:11837 +msgid "Foreground" +msgstr "முன்புறம்" + +#: gitk:11838 +msgid "foreground" +msgstr "முன்புறம்" + +#: gitk:11841 +msgid "Diff: old lines" +msgstr "வேறுபாடு: பழைய வரிகள்" + +#: gitk:11842 +msgid "diff old lines" +msgstr "பழைய வரிகள் வேறுபாடு" + +#: gitk:11846 +msgid "Diff: old lines bg" +msgstr "வேறுபாடு: பழைய வரிகள் பின்ணனி" + +#: gitk:11848 +msgid "diff old lines bg" +msgstr "பழைய வரிகள் பின்ணனி வேறுபாடு" + +#: gitk:11852 +msgid "Diff: new lines" +msgstr "வேறுபாடு: புதிய கோடுகள்" + +#: gitk:11853 +msgid "diff new lines" +msgstr "புதிய வரிகள் வேறுபாடு" + +#: gitk:11857 +msgid "Diff: new lines bg" +msgstr "வேறுபாடு: புதிய வரிகள் பின்ணனி" + +#: gitk:11859 +msgid "diff new lines bg" +msgstr "புதிய வரிகளை பின்ணனி வேறுபாடு" + +#: gitk:11863 +msgid "Diff: hunk header" +msgstr "வேறுபாடு: அங்க் தலைப்பு" + +#: gitk:11865 +msgid "diff hunk header" +msgstr "அங்க் தலைப்பு வேறுபாடு" + +#: gitk:11869 +msgid "Marked line bg" +msgstr "குறிக்கப்பட்ட வரி பின்னணி" + +#: gitk:11871 +msgid "marked line background" +msgstr "குறிக்கப்பட்ட வரி பின்னணி" + +#: gitk:11875 +msgid "Select bg" +msgstr "பின்னணி தேர்வு" + +#: gitk:11884 +msgid "Fonts: press to choose" +msgstr "எழுத்துருக்கள்: தேர்வு செய்ய அழுத்து" + +#: gitk:11886 +msgid "Main font" +msgstr "முதன்மையான எழுத்துரு" + +#: gitk:11887 +msgid "Diff display font" +msgstr "காட்சி எழுத்துரு வேறுபாடு" + +#: gitk:11888 +msgid "User interface font" +msgstr "பயனர் இடைமுக எழுத்துரு" + +#: gitk:11910 +msgid "Gitk preferences" +msgstr "அறிவிலிகே விருப்பத்தேர்வுகள்" + +#: gitk:11919 +msgid "General" +msgstr "பொது" + +#: gitk:11920 +msgid "Colors" +msgstr "நிறங்கள்" + +#: gitk:11921 +msgid "Fonts" +msgstr "எழுத்துருக்கள்" + +#: gitk:11971 +#, tcl-format +msgid "Gitk: choose color for %s" +msgstr "அறிவிலிகே: %s க்கு வண்ணத்தைத் தேர்வுசெய்க" + +#: gitk:12490 +msgid "" +"Sorry, gitk cannot run with this version of Tcl/Tk.\n" +" Gitk requires at least Tcl/Tk 8.4." +msgstr "" +"மன்னிக்கவும், டிசிஎல்/டிகேயின் இந்த பதிப்பைக் கொண்டு அறிவிலிகே இயக்க முடியாது. \n" +"அறிவிலிகேவுக்கு குறைந்தபட்சம் டிசிஎல்/டிகே 8.4 தேவைப்படுகிறது." + +#: gitk:12711 +msgid "Cannot find a git repository here." +msgstr "இங்கே ஒரு அறிவிலி களஞ்சியத்தைக் கண்டுபிடிக்க முடியவில்லை." + +#: gitk:12758 +#, tcl-format +msgid "Ambiguous argument '%s': both revision and filename" +msgstr "தெளிவற்ற வாதம் '%s': திருத்தம் மற்றும் கோப்பு பெயர்" + +#: gitk:12770 +msgid "Bad arguments to gitk:" +msgstr "அறிவிலிகேவிற்கு மோசமான வாதங்கள்:" + +#~ msgid "SHA1 ID:" +#~ msgstr "சா1 அடையாளம்:" + +#~ msgid "Auto-select SHA1 (length)" +#~ msgstr "தானாக தேர்ந்தெடுக்கப்பட்ட சா1 (நீளம்)" |
