diff options
Diffstat (limited to 'gitk-git')
| -rw-r--r-- | gitk-git/Makefile | 7 | ||||
| -rwxr-xr-x | gitk-git/generate-tcl.sh | 11 | ||||
| -rwxr-xr-x | gitk-git/gitk | 471 | ||||
| -rw-r--r-- | gitk-git/meson.build | 30 | ||||
| -rw-r--r-- | gitk-git/po/meson.build | 20 | ||||
| -rw-r--r-- | gitk-git/po/ta.po | 1457 |
6 files changed, 1845 insertions, 151 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/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 47a7c1d29c..5be8b2aeb0 100755 --- a/gitk-git/gitk +++ b/gitk-git/gitk @@ -9,6 +9,195 @@ exec wish "$0" -- "$@" package require Tk +###################################################################### +## +## Enabling platform-specific code paths + +proc is_Windows {} { + if {$::tcl_platform(platform) eq {windows}} { + return 1 + } + return 0 +} + +###################################################################### +## +## PATH lookup + +if {[is_Windows]} { + set _search_path {} + proc _which {what args} { + global env _search_path + + if {$_search_path eq {}} { + set gitguidir [file dirname [info script]] + regsub -all ";" $gitguidir "\\;" gitguidir + set env(PATH) "$gitguidir;$env(PATH)" + set _search_path [split $env(PATH) {;}] + # Skip empty `PATH` elements + set _search_path [lsearch -all -inline -not -exact \ + $_search_path ""] + } + + if {[lsearch -exact $args -script] >= 0} { + set suffix {} + } else { + set suffix .exe + } + + foreach p $_search_path { + set p [file join $p $what$suffix] + if {[file exists $p]} { + return [file normalize $p] + } + } + return {} + } + + proc sanitize_command_line {command_line from_index} { + set i $from_index + while {$i < [llength $command_line]} { + set cmd [lindex $command_line $i] + if {[llength [file split $cmd]] < 2} { + set fullpath [_which $cmd] + if {$fullpath eq ""} { + throw {NOT-FOUND} "$cmd not found in PATH" + } + lset command_line $i $fullpath + } + + # handle piped commands, e.g. `exec A | B` + for {incr i} {$i < [llength $command_line]} {incr i} { + if {[lindex $command_line $i] eq "|"} { + incr i + break + } + } + } + return $command_line + } + + # Override `exec` to avoid unsafe PATH lookup + + rename exec real_exec + + proc exec {args} { + # skip options + for {set i 0} {$i < [llength $args]} {incr i} { + set arg [lindex $args $i] + if {$arg eq "--"} { + incr i + break + } + if {[string range $arg 0 0] ne "-"} { + break + } + } + set args [sanitize_command_line $args $i] + uplevel 1 real_exec $args + } + + # Override `open` to avoid unsafe PATH lookup + + rename open real_open + + proc open {args} { + set arg0 [lindex $args 0] + if {[string range $arg0 0 0] eq "|"} { + set command_line [string trim [string range $arg0 1 end]] + lset args 0 "| [sanitize_command_line $command_line 0]" + } + uplevel 1 real_open $args + } +} + +# End of safe PATH lookup stuff + +# Wrap exec/open to sanitize arguments + +# unsafe arguments begin with redirections or the pipe or background operators +proc is_arg_unsafe {arg} { + regexp {^([<|>&]|2>)} $arg +} + +proc make_arg_safe {arg} { + if {[is_arg_unsafe $arg]} { + set arg [file join . $arg] + } + return $arg +} + +proc make_arglist_safe {arglist} { + set res {} + foreach arg $arglist { + lappend res [make_arg_safe $arg] + } + return $res +} + +# executes one command +# no redirections or pipelines are possible +# cmd is a list that specifies the command and its arguments +# calls `exec` and returns its value +proc safe_exec {cmd} { + eval exec [make_arglist_safe $cmd] +} + +# executes one command with redirections +# no pipelines are possible +# cmd is a list that specifies the command and its arguments +# redir is a list that specifies redirections (output, background, constant(!) commands) +# calls `exec` and returns its value +proc safe_exec_redirect {cmd redir} { + eval exec [make_arglist_safe $cmd] $redir +} + +proc safe_open_file {filename flags} { + # a file name starting with "|" would attempt to run a process + # but such a file name must be treated as a relative path + # hide the "|" behind "./" + if {[string index $filename 0] eq "|"} { + set filename [file join . $filename] + } + open $filename $flags +} + +# opens a command pipeline for reading +# cmd is a list that specifies the command and its arguments +# calls `open` and returns the file id +proc safe_open_command {cmd} { + open |[make_arglist_safe $cmd] r +} + +# opens a command pipeline for reading and writing +# cmd is a list that specifies the command and its arguments +# calls `open` and returns the file id +proc safe_open_command_rw {cmd} { + open |[make_arglist_safe $cmd] r+ +} + +# opens a command pipeline for reading with redirections +# cmd is a list that specifies the command and its arguments +# redir is a list that specifies redirections +# calls `open` and returns the file id +proc safe_open_command_redirect {cmd redir} { + set cmd [make_arglist_safe $cmd] + open |[concat $cmd $redir] r +} + +# opens a pipeline with several commands for reading +# cmds is a list of lists, each of which specifies a command and its arguments +# calls `open` and returns the file id +proc safe_open_pipeline {cmds} { + set cmd {} + foreach subcmd $cmds { + set cmd [concat $cmd | [make_arglist_safe $subcmd]] + } + open $cmd r +} + +# End exec/open wrappers + proc hasworktree {} { return [expr {[exec git rev-parse --is-bare-repository] == "false" && [exec git rev-parse --is-inside-git-dir] == "false"}] @@ -134,7 +323,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 @@ -296,7 +485,7 @@ proc parseviewrevs {view revs} { } 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"] @@ -353,16 +542,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 @@ -384,7 +563,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 +601,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 +637,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} @@ -576,11 +754,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 @@ -1547,8 +1723,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 +1844,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 != {}} { @@ -1804,7 +1980,7 @@ proc readrefs {} { foreach v {tagids idtags headids idheads otherrefids idotherrefs} { 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 } @@ -1852,7 +2028,7 @@ 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]] } } } @@ -2103,7 +2279,7 @@ proc makewindow {} { global headctxmenu progresscanv progressitem progresscoords statusw global fprogitem fprogcoord lastprogupdate progupdatepending global rprogitem rprogcoord rownumsel numcommits - global have_tk85 use_ttk NS + global have_tk85 have_tk86 use_ttk NS global git_version global worddiff @@ -2116,7 +2292,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} }} @@ -2601,8 +2777,13 @@ 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" + if {$have_tk86} { + bindkey <<NextChar>> "goforw" + bindkey <<PrevChar>> "goback" + } else { + bindkey <Key-Right> "goforw" + bindkey <Key-Left> "goback" + } bind . <Key-Prior> "selnextpage -1" bind . <Key-Next> "selnextpage 1" bind . <$M1B-Home> "allcanvs yview moveto 0.0" @@ -2898,7 +3079,7 @@ proc savestuff {w} { 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" } @@ -3614,7 +3795,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]} { @@ -3636,7 +3817,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 } @@ -3701,7 +3882,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 { @@ -3805,7 +3986,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] @@ -3865,7 +4046,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" } } @@ -3893,7 +4074,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]} { @@ -3916,19 +4097,17 @@ proc show_line_source {} { } set line [lindex $h 1] } - set blameargs {} + set blamefile [file join $cdup $flist_menu_file] if {$from_index ne {}} { - lappend blameargs | git cat-file blob $from_index - } - lappend blameargs | git blame -p -L$line,+1 - 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 @@ -4492,7 +4671,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} { @@ -4853,8 +5032,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 {} @@ -5283,8 +5462,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 @@ -5349,14 +5528,14 @@ proc dodiffindex {} { 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" + set cmd "git diff-index --cached --ignore-submodules=dirty HEAD" } else { - set cmd "|git diff-index --cached HEAD" + set cmd "git diff-index --cached 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] @@ -5381,11 +5560,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] @@ -6999,7 +7178,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] @@ -7013,7 +7192,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 @@ -7174,8 +7353,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" } } @@ -7681,13 +7860,13 @@ 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 @@ -7720,7 +7899,7 @@ proc gettreeline {gtf id} { if {[string index $fname 0] eq "\""} { set fname [lindex $fname 0] } - set fname [encoding convertfrom $fname] + set fname [encoding convertfrom utf-8 $fname] lappend treefilelist($id) $fname } if {![eof $gtf]} { @@ -7751,13 +7930,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 } @@ -7907,7 +8086,7 @@ proc diffcmd {ids flags} { 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 { @@ -7915,7 +8094,7 @@ 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 } @@ -7924,7 +8103,7 @@ proc diffcmd {ids flags} { if {[package vcompare $git_version "1.7.2"] >= 0} { set flags "$flags --ignore-submodules=dirty" } - set cmd [concat | git diff-index --cached $flags] + set cmd [concat git diff-index --cached $flags] if {[llength $ids] > 1} { # comparing index with specific revision if {$j == 0} { @@ -7940,7 +8119,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 } @@ -7952,7 +8131,7 @@ 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 {} @@ -7982,7 +8161,7 @@ proc gettreediffline {gdtf ids} { if {[string index $file 0] eq "\""} { set file [lindex $file 0] } - set file [encoding convertfrom $file] + set file [encoding convertfrom utf-8 $file] if {$file ne [lindex $treediff end]} { lappend treediff $file lappend sublist $file @@ -8072,7 +8251,7 @@ 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 } @@ -8127,7 +8306,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 [encoding convertfrom utf-8 $fname] set diffencoding [get_path_encoding $fname] set i [lsearch -exact $treediffs($ids) $fname] if {$i >= 0} { @@ -8189,7 +8368,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 [encoding convertfrom utf-8 $line] $ctext insert end "$line\n" hunksep continue } @@ -8238,7 +8417,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 [encoding convertfrom utf-8 [string range $line 16 end]] $ctext insert end "\n" set curdiffstart [$ctext index "end - 1c"] lappend ctext_file_names $fname @@ -8291,7 +8470,7 @@ proc parseblobdiffline {ids line} { if {[string index $fname 0] eq "\""} { set fname [lindex $fname 0] } - set fname [encoding convertfrom $fname] + set fname [encoding convertfrom utf-8 $fname] set i [lsearch -exact $treediffs($ids) $fname] if {$i >= 0} { setinlist difffilestart $i $curdiffstart @@ -8310,6 +8489,7 @@ proc parseblobdiffline {ids line} { set diffinhdr 0 return } + set line [encoding convertfrom utf-8 $line] $ctext insert end "$line\n" filesep } else { @@ -8789,7 +8969,7 @@ proc gotocommit {} { 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 } @@ -9095,10 +9275,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" @@ -9194,14 +9372,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 @@ -9341,10 +9519,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} @@ -9413,9 +9588,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 @@ -9483,7 +9658,7 @@ proc copyreference {} { if {$autosellen < 40} { lappend cmd --abbrev=$autosellen } - set reference [eval exec $cmd $rowmenuid] + set reference [safe_exec [concat $cmd $rowmenuid]] clipboard clear clipboard append $reference @@ -9533,7 +9708,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} @@ -9637,7 +9812,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 @@ -9678,7 +9853,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 @@ -9719,7 +9894,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 @@ -9742,7 +9917,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)} \ @@ -9804,7 +9979,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] { @@ -9880,8 +10055,8 @@ proc resethead {} { 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 @@ -9952,7 +10127,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] @@ -9966,12 +10141,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 @@ -10037,7 +10211,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 @@ -10068,7 +10242,7 @@ 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]} { @@ -10228,7 +10402,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 @@ -10237,7 +10411,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" @@ -10265,10 +10439,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 @@ -10658,7 +10833,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 } @@ -11361,7 +11536,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 @@ -11626,13 +11801,11 @@ proc prefspage_general {notebook} { grid x $page.tabstopl $page.tabstop -sticky w ${NS}::label $page.wrapcommentl -text [mc "Wrap comment text"] - ${NS}::combobox $page.wrapcomment -values {none char word} -state readonly \ - -textvariable wrapcomment + makedroplist $page.wrapcomment wrapcomment none char word grid x $page.wrapcommentl $page.wrapcomment -sticky w ${NS}::label $page.wrapdefaultl -text [mc "Wrap other text"] - ${NS}::combobox $page.wrapdefault -values {none char word} -state readonly \ - -textvariable wrapdefault + makedroplist $page.wrapdefault wrapdefault none char word grid x $page.wrapdefaultl $page.wrapdefault -sticky w ${NS}::checkbutton $page.ntag -text [mc "Display nearby tags/heads"] \ @@ -12274,7 +12447,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 @@ -12301,11 +12474,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 [encoding convertfrom utf-8 [lindex $path 0]] } set path_attr_cache($attr,$path) $value } @@ -12335,7 +12508,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 @@ -12354,11 +12526,11 @@ if {[catch {package require Tk 8.4} err]} { # on OSX bring the current Wish process window to front if {[tk windowingsystem] eq "aqua"} { - exec osascript -e [format { + safe_exec [list osascript -e [format { tell application "System Events" set frontmost of processes whose unix id is %d to true end tell - } [pid] ] + } [pid] ]] } # Unset GIT_TRACE var if set @@ -12606,7 +12778,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] @@ -12637,6 +12809,7 @@ set nullid2 "0000000000000000000000000000000000000001" set nullfile "/dev/null" set have_tk85 [expr {[package vcompare $tk_version "8.5"] >= 0}] +set have_tk86 [expr {[package vcompare $tk_version "8.6"] >= 0}] if {![info exists have_ttk]} { set have_ttk [llength [info commands ::ttk::style]] } @@ -12701,28 +12874,32 @@ 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 - - image create photo gitlogominus -width 4 -height 2 - gitlogominus put #C00000 -to 0 0 4 2 - gitlogo copy gitlogominus -to 1 5 - gitlogo copy gitlogominus -to 6 5 - gitlogo copy gitlogominus -to 11 5 - image delete gitlogominus - - image create photo gitlogoplus -width 4 -height 4 - gitlogoplus put #008000 -to 1 0 3 4 - gitlogoplus put #008000 -to 0 1 4 3 - gitlogo copy gitlogoplus -to 1 9 - gitlogo copy gitlogoplus -to 6 9 - gitlogo copy gitlogoplus -to 11 9 - image delete gitlogoplus - - image create photo gitlogo32 -width 32 -height 32 - gitlogo32 copy gitlogo -zoom 2 2 - - wm iconphoto . -default gitlogo gitlogo32 +if {$::tcl_platform(platform) eq {windows} && [file exists $gitk_prefix/etc/git.ico]} { + wm iconbitmap . -default $gitk_prefix/etc/git.ico +} else { + catch { + image create photo gitlogo -width 16 -height 16 + + image create photo gitlogominus -width 4 -height 2 + gitlogominus put #C00000 -to 0 0 4 2 + gitlogo copy gitlogominus -to 1 5 + gitlogo copy gitlogominus -to 6 5 + gitlogo copy gitlogominus -to 11 5 + image delete gitlogominus + + image create photo gitlogoplus -width 4 -height 4 + gitlogoplus put #008000 -to 1 0 3 4 + gitlogoplus put #008000 -to 0 1 4 3 + gitlogo copy gitlogoplus -to 1 9 + gitlogo copy gitlogoplus -to 6 9 + gitlogo copy gitlogoplus -to 11 9 + image delete gitlogoplus + + image create photo gitlogo32 -width 32 -height 32 + gitlogo32 copy gitlogo -zoom 2 2 + + wm iconphoto . -default gitlogo gitlogo32 + } } # wait for the window to become visible if {![winfo viewable .]} {tkwait visibility .} 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/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/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 (நீளம்)" |
