From: Junio C Hamano Date: Sun, 19 Apr 2015 01:35:48 +0000 (-0700) Subject: Merge tag 'gitgui-0.20.0' of http://repo.or.cz/r/git-gui X-Git-Tag: v2.4.0-rc3~9 X-Git-Url: https://www.git.lorimer.id.au/gitweb.git/diff_plain/1eb0545cce4a4ed652425798b87cb0e777c03b3f Merge tag 'gitgui-0.20.0' of repo.or.cz/r/git-gui git-gui 0.20.0 * tag 'gitgui-0.20.0' of http://repo.or.cz/r/git-gui: git-gui: set version 0.20 git-gui: sv.po: Update Swedish translation (547t0f0u) git-gui i18n: Updated Bulgarian translation (547t,0f,0u) git-gui: Makes chooser set 'gitdir' to the resolved path git-gui: Fixes chooser not accepting gitfiles git-gui: reinstate support for Tcl 8.4 git-gui: fix problem with gui.maxfilesdisplayed git-gui: fix verbose loading when git path contains spaces. git-gui/gitk: Do not depend on Cygwin's "kill" command on Windows git-gui: add configurable tab size to the diff view git-gui: Make git-gui lib dir configurable at runime git-gui i18n: Updated Bulgarian translation (520t,0f,0u) L10n: vi.po (543t): Init translation for Vietnamese git-gui: align the new recursive checkbox with the radiobuttons. git-gui: Add a 'recursive' checkbox in the clone menu. --- 1eb0545cce4a4ed652425798b87cb0e777c03b3f diff --cc git-gui/GIT-VERSION-GEN index a9ea21826a,0000000000..a88b6824b9 mode 100755,000000..100755 --- a/git-gui/GIT-VERSION-GEN +++ b/git-gui/GIT-VERSION-GEN @@@ -1,80 -1,0 +1,80 @@@ +#!/bin/sh + +GVF=GIT-VERSION-FILE - DEF_VER=0.19.GITGUI ++DEF_VER=0.20.GITGUI + +LF=' +' + +tree_search () +{ + head=$1 + tree=$2 + for p in $(git rev-list --parents --max-count=1 $head 2>/dev/null) + do + test $tree = $(git rev-parse $p^{tree} 2>/dev/null) && + vn=$(git describe --abbrev=4 $p 2>/dev/null) && + case "$vn" in + gitgui-[0-9]*) echo $vn; break;; + esac + done +} + +# Always use the tarball version file if found, just +# in case we are somehow contained in a larger git +# repository that doesn't actually track our state. +# (At least one package manager is doing this.) +# +# We may be a subproject, so try looking for the merge +# commit that supplied this directory content if we are +# not at the toplevel. We probably will always be the +# second parent in the commit, but we shouldn't rely on +# that fact. +# +# If we are at the toplevel or the merge assumption fails +# try looking for a gitgui-* tag. + +if test -f version && + VN=$(cat version) +then + : happy +elif prefix="$(git rev-parse --show-prefix 2>/dev/null)" + test -n "$prefix" && + head=$(git rev-list --max-count=1 HEAD -- . 2>/dev/null) && + tree=$(git rev-parse --verify "HEAD:$prefix" 2>/dev/null) && + VN=$(tree_search $head $tree) + case "$VN" in + gitgui-[0-9]*) : happy ;; + *) (exit 1) ;; + esac +then + VN=$(echo "$VN" | sed -e 's/^gitgui-//;s/-/./g'); +elif VN=$(git describe --abbrev=4 HEAD 2>/dev/null) && + case "$VN" in + gitgui-[0-9]*) : happy ;; + *) (exit 1) ;; + esac +then + VN=$(echo "$VN" | sed -e 's/^gitgui-//;s/-/./g'); +else + VN="$DEF_VER" +fi + +dirty=$(sh -c 'git diff-index --name-only HEAD' 2>/dev/null) || dirty= +case "$dirty" in +'') + ;; +*) + VN="$VN-dirty" ;; +esac + +if test -r $GVF +then + VC=$(sed -e 's/^GITGUI_VERSION = //' <$GVF) +else + VC=unset +fi +test "$VN" = "$VC" || { + echo >&2 "GITGUI_VERSION = $VN" + echo "GITGUI_VERSION = $VN" >$GVF +} diff --cc git-gui/Makefile index cde8b2ea31,0000000000..4f00bdd3d6 mode 100644,000000..100644 --- a/git-gui/Makefile +++ b/git-gui/Makefile @@@ -1,344 -1,0 +1,345 @@@ +all:: + +# Define V=1 to have a more verbose compile. +# +# Define NO_MSGFMT if you do not have msgfmt from the GNU gettext +# package and want to use our rough pure Tcl po->msg translator. +# TCL_PATH must be valid for this to work. +# + +GIT-VERSION-FILE: FORCE + @$(SHELL_PATH) ./GIT-VERSION-GEN +-include GIT-VERSION-FILE + +uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not') +uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not') +uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not') + +SCRIPT_SH = git-gui.sh +GITGUI_MAIN := git-gui +GITGUI_BUILT_INS = git-citool +ALL_LIBFILES = $(wildcard lib/*.tcl) +PRELOAD_FILES = lib/class.tcl +NONTCL_LIBFILES = \ + lib/git-gui.ico \ + $(wildcard lib/win32_*.js) \ +#end NONTCL_LIBFILES + +ifndef SHELL_PATH + SHELL_PATH = /bin/sh +endif + +ifndef gitexecdir + gitexecdir := $(shell git --exec-path) +endif + +ifndef sharedir +ifeq (git-core,$(notdir $(gitexecdir))) + sharedir := $(dir $(patsubst %/,%,$(dir $(gitexecdir))))share +else + sharedir := $(dir $(gitexecdir))share +endif +endif + +ifndef INSTALL + INSTALL = install +endif + +RM_RF ?= rm -rf +RMDIR ?= rmdir + +INSTALL_D0 = $(INSTALL) -d -m 755 # space is required here +INSTALL_D1 = +INSTALL_R0 = $(INSTALL) -m 644 # space is required here +INSTALL_R1 = +INSTALL_X0 = $(INSTALL) -m 755 # space is required here +INSTALL_X1 = +INSTALL_A0 = find # space is required here +INSTALL_A1 = | cpio -pud +INSTALL_L0 = rm -f # space is required here +INSTALL_L1 = && ln # space is required here +INSTALL_L2 = +INSTALL_L3 = + +REMOVE_D0 = $(RMDIR) # space is required here +REMOVE_D1 = || true +REMOVE_F0 = $(RM_RF) # space is required here +REMOVE_F1 = +CLEAN_DST = true + +ifndef V + QUIET = @ + QUIET_GEN = $(QUIET)echo ' ' GEN '$@' && + QUIET_INDEX = $(QUIET)echo ' ' INDEX $(dir $@) && + QUIET_MSGFMT0 = $(QUIET)printf ' MSGFMT %12s ' $@ && v=` + QUIET_MSGFMT1 = 2>&1` && echo "$$v" | sed -e 's/fuzzy translations/fuzzy/' | sed -e 's/ messages*//g' + QUIET_2DEVNULL = 2>/dev/null + + INSTALL_D0 = dir= + INSTALL_D1 = && echo ' ' DEST $$dir && $(INSTALL) -d -m 755 "$$dir" + INSTALL_R0 = src= + INSTALL_R1 = && echo ' ' INSTALL 644 `basename $$src` && $(INSTALL) -m 644 $$src + INSTALL_X0 = src= + INSTALL_X1 = && echo ' ' INSTALL 755 `basename $$src` && $(INSTALL) -m 755 $$src + INSTALL_A0 = src= + INSTALL_A1 = && echo ' ' INSTALL ' ' `basename "$$src"` && find "$$src" | cpio -pud + + INSTALL_L0 = dst= + INSTALL_L1 = && src= + INSTALL_L2 = && dst= + INSTALL_L3 = && echo ' ' 'LINK ' `basename "$$dst"` '->' `basename "$$src"` && rm -f "$$dst" && ln "$$src" "$$dst" + + CLEAN_DST = echo ' ' UNINSTALL + REMOVE_D0 = dir= + REMOVE_D1 = && echo ' ' REMOVE $$dir && test -d "$$dir" && $(RMDIR) "$$dir" || true + REMOVE_F0 = dst= + REMOVE_F1 = && echo ' ' REMOVE `basename "$$dst"` && $(RM_RF) "$$dst" +endif + +TCLTK_PATH ?= wish +ifeq (./,$(dir $(TCLTK_PATH))) + TCL_PATH ?= $(subst wish,tclsh,$(TCLTK_PATH)) +else + TCL_PATH ?= $(dir $(TCLTK_PATH))$(notdir $(subst wish,tclsh,$(TCLTK_PATH))) +endif + +ifeq ($(uname_S),Darwin) + TKFRAMEWORK = /Library/Frameworks/Tk.framework/Resources/Wish.app + ifeq ($(shell echo "$(uname_R)" | awk -F. '{if ($$1 >= 9) print "y"}')_$(shell test -d $(TKFRAMEWORK) || echo n),y_n) + TKFRAMEWORK = /System/Library/Frameworks/Tk.framework/Resources/Wish.app + ifeq ($(shell test -d $(TKFRAMEWORK) || echo n),n) + TKFRAMEWORK = /System/Library/Frameworks/Tk.framework/Resources/Wish\ Shell.app + endif + endif + TKEXECUTABLE = $(shell basename "$(TKFRAMEWORK)" .app) +endif + +ifeq ($(findstring $(MAKEFLAGS),s),s) +QUIET_GEN = +endif + +-include config.mak + +DESTDIR_SQ = $(subst ','\'',$(DESTDIR)) +gitexecdir_SQ = $(subst ','\'',$(gitexecdir)) +SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH)) +TCL_PATH_SQ = $(subst ','\'',$(TCL_PATH)) +TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH)) +TCLTK_PATH_SED = $(subst ','\'',$(subst \,\\,$(TCLTK_PATH))) + +gg_libdir ?= $(sharedir)/git-gui/lib +libdir_SQ = $(subst ','\'',$(gg_libdir)) +libdir_SED = $(subst ','\'',$(subst \,\\,$(gg_libdir_sed_in))) +exedir = $(dir $(gitexecdir))share/git-gui/lib + +GITGUI_SCRIPT := $$0 +GITGUI_RELATIVE := +GITGUI_MACOSXAPP := + +ifeq ($(uname_O),Cygwin) + GITGUI_SCRIPT := `cygpath --windows --absolute "$(GITGUI_SCRIPT)"` + + # Is this a Cygwin Tcl/Tk binary? If so it knows how to do + # POSIX path translation just like cygpath does and we must + # keep libdir in POSIX format so Cygwin packages of git-gui + # work no matter where the user installs them. + # + ifeq ($(shell echo 'puts [file normalize /]' | '$(TCL_PATH_SQ)'),$(shell cygpath --mixed --absolute /)) + gg_libdir_sed_in := $(gg_libdir) + else + gg_libdir_sed_in := $(shell cygpath --windows --absolute "$(gg_libdir)") + endif +else + ifeq ($(exedir),$(gg_libdir)) + GITGUI_RELATIVE := 1 + endif + gg_libdir_sed_in := $(gg_libdir) +endif +ifeq ($(uname_S),Darwin) + ifeq ($(shell test -d $(TKFRAMEWORK) && echo y),y) + GITGUI_MACOSXAPP := YesPlease + endif +endif +ifneq (,$(findstring MINGW,$(uname_S))) + NO_MSGFMT=1 + GITGUI_WINDOWS_WRAPPER := YesPlease + GITGUI_RELATIVE := 1 +endif + +ifdef GITGUI_MACOSXAPP +GITGUI_MAIN := git-gui.tcl + +git-gui: GIT-VERSION-FILE GIT-GUI-VARS + $(QUIET_GEN)rm -f $@ $@+ && \ + echo '#!$(SHELL_PATH_SQ)' >$@+ && \ + echo 'if test "z$$*" = zversion ||' >>$@+ && \ + echo ' test "z$$*" = z--version' >>$@+ && \ + echo then >>$@+ && \ + echo ' 'echo \'git-gui version '$(GITGUI_VERSION)'\' >>$@+ && \ + echo else >>$@+ && \ - echo ' 'exec \''$(libdir_SQ)/Git Gui.app/Contents/MacOS/$(subst \,,$(TKEXECUTABLE))'\' \ ++ echo ' libdir="$${GIT_GUI_LIB_DIR:-$(libdir_SQ)}"' >>$@+ && \ ++ echo ' 'exec \"'$$libdir/Git Gui.app/Contents/MacOS/$(subst \,,$(TKEXECUTABLE))'\" \ + '"$$0" "$$@"' >>$@+ && \ + echo fi >>$@+ && \ + chmod +x $@+ && \ + mv $@+ $@ + +Git\ Gui.app: GIT-VERSION-FILE GIT-GUI-VARS \ + macosx/Info.plist \ + macosx/git-gui.icns \ + macosx/AppMain.tcl \ + $(TKFRAMEWORK)/Contents/MacOS/$(TKEXECUTABLE) + $(QUIET_GEN)rm -rf '$@' '$@'+ && \ + mkdir -p '$@'+/Contents/MacOS && \ + mkdir -p '$@'+/Contents/Resources/Scripts && \ + cp '$(subst ','\'',$(subst \,,$(TKFRAMEWORK)/Contents/MacOS/$(TKEXECUTABLE)))' \ + '$@'+/Contents/MacOS && \ + cp macosx/git-gui.icns '$@'+/Contents/Resources && \ + sed -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \ + -e 's/@@GITGUI_TKEXECUTABLE@@/$(TKEXECUTABLE)/g' \ + macosx/Info.plist \ + >'$@'+/Contents/Info.plist && \ + sed -e 's|@@gitexecdir@@|$(gitexecdir_SQ)|' \ + -e 's|@@GITGUI_LIBDIR@@|$(libdir_SED)|' \ + macosx/AppMain.tcl \ + >'$@'+/Contents/Resources/Scripts/AppMain.tcl && \ + mv '$@'+ '$@' +endif + +ifdef GITGUI_WINDOWS_WRAPPER +GITGUI_MAIN := git-gui.tcl + +git-gui: windows/git-gui.sh + cp $< $@ +endif + +$(GITGUI_MAIN): git-gui.sh GIT-VERSION-FILE GIT-GUI-VARS + $(QUIET_GEN)rm -f $@ $@+ && \ + sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ + -e 's|@@SHELL_PATH@@|$(SHELL_PATH_SQ)|' \ + -e '1,30s|^ argv0=$$0| argv0=$(GITGUI_SCRIPT)|' \ + -e '1,30s|^ exec wish | exec '\''$(TCLTK_PATH_SED)'\'' |' \ + -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \ + -e 's|@@GITGUI_RELATIVE@@|$(GITGUI_RELATIVE)|' \ + -e '$(GITGUI_RELATIVE)s|@@GITGUI_LIBDIR@@|$(libdir_SED)|' \ + git-gui.sh >$@+ && \ + chmod +x $@+ && \ + mv $@+ $@ + +XGETTEXT ?= xgettext +ifdef NO_MSGFMT + MSGFMT ?= $(TCL_PATH) po/po2msg.sh +else + MSGFMT ?= msgfmt + ifneq ($(shell $(MSGFMT) --tcl -l C -d . /dev/null 2>/dev/null; echo $$?),0) + MSGFMT := $(TCL_PATH) po/po2msg.sh + endif +endif + +msgsdir = $(gg_libdir)/msgs +msgsdir_SQ = $(subst ','\'',$(msgsdir)) +PO_TEMPLATE = po/git-gui.pot +ALL_POFILES = $(wildcard po/*.po) +ALL_MSGFILES = $(subst .po,.msg,$(ALL_POFILES)) + +$(PO_TEMPLATE): $(SCRIPT_SH) $(ALL_LIBFILES) + $(XGETTEXT) -kmc -LTcl -o $@ $(SCRIPT_SH) $(ALL_LIBFILES) +update-po:: $(PO_TEMPLATE) + $(foreach p, $(ALL_POFILES), echo Updating $p ; msgmerge -U $p $(PO_TEMPLATE) ; ) +$(ALL_MSGFILES): %.msg : %.po + $(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1) + +lib/tclIndex: $(ALL_LIBFILES) GIT-GUI-VARS + $(QUIET_INDEX)if echo \ + $(foreach p,$(PRELOAD_FILES),source $p\;) \ + auto_mkindex lib '*.tcl' \ + | $(TCL_PATH) $(QUIET_2DEVNULL); then : ok; \ + else \ + echo >&2 " * $(TCL_PATH) failed; using unoptimized loading"; \ + rm -f $@ ; \ + echo '# Autogenerated by git-gui Makefile' >$@ && \ + echo >>$@ && \ + $(foreach p,$(PRELOAD_FILES) $(ALL_LIBFILES),echo '$(subst lib/,,$p)' >>$@ &&) \ + echo >>$@ ; \ + fi + +TRACK_VARS = \ + $(subst ','\'',SHELL_PATH='$(SHELL_PATH_SQ)') \ + $(subst ','\'',TCL_PATH='$(TCL_PATH_SQ)') \ + $(subst ','\'',TCLTK_PATH='$(TCLTK_PATH_SQ)') \ + $(subst ','\'',gitexecdir='$(gitexecdir_SQ)') \ + $(subst ','\'',gg_libdir='$(libdir_SQ)') \ + GITGUI_MACOSXAPP=$(GITGUI_MACOSXAPP) \ +#end TRACK_VARS + +GIT-GUI-VARS: FORCE + @VARS='$(TRACK_VARS)'; \ + if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \ + echo >&2 " * new locations or Tcl/Tk interpreter"; \ + echo >$@ "$$VARS"; \ + fi + +ifdef GITGUI_MACOSXAPP +all:: git-gui Git\ Gui.app +endif +ifdef GITGUI_WINDOWS_WRAPPER +all:: git-gui +endif +all:: $(GITGUI_MAIN) lib/tclIndex $(ALL_MSGFILES) + +install: all + $(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(gitexecdir_SQ)' $(INSTALL_D1) + $(QUIET)$(INSTALL_X0)git-gui $(INSTALL_X1) '$(DESTDIR_SQ)$(gitexecdir_SQ)' + $(QUIET)$(INSTALL_X0)git-gui--askpass $(INSTALL_X1) '$(DESTDIR_SQ)$(gitexecdir_SQ)' + $(QUIET)$(foreach p,$(GITGUI_BUILT_INS), $(INSTALL_L0)'$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' $(INSTALL_L1)'$(DESTDIR_SQ)$(gitexecdir_SQ)/git-gui' $(INSTALL_L2)'$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' $(INSTALL_L3) &&) true +ifdef GITGUI_WINDOWS_WRAPPER + $(QUIET)$(INSTALL_R0)git-gui.tcl $(INSTALL_R1) '$(DESTDIR_SQ)$(gitexecdir_SQ)' +endif + $(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(libdir_SQ)' $(INSTALL_D1) + $(QUIET)$(INSTALL_R0)lib/tclIndex $(INSTALL_R1) '$(DESTDIR_SQ)$(libdir_SQ)' +ifdef GITGUI_MACOSXAPP + $(QUIET)$(INSTALL_A0)'Git Gui.app' $(INSTALL_A1) '$(DESTDIR_SQ)$(libdir_SQ)' + $(QUIET)$(INSTALL_X0)git-gui.tcl $(INSTALL_X1) '$(DESTDIR_SQ)$(libdir_SQ)' +endif + $(QUIET)$(foreach p,$(ALL_LIBFILES) $(NONTCL_LIBFILES), $(INSTALL_R0)$p $(INSTALL_R1) '$(DESTDIR_SQ)$(libdir_SQ)' &&) true + $(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(msgsdir_SQ)' $(INSTALL_D1) + $(QUIET)$(foreach p,$(ALL_MSGFILES), $(INSTALL_R0)$p $(INSTALL_R1) '$(DESTDIR_SQ)$(msgsdir_SQ)' &&) true + +uninstall: + $(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(gitexecdir_SQ)' + $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui $(REMOVE_F1) + $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui--askpass $(REMOVE_F1) + $(QUIET)$(foreach p,$(GITGUI_BUILT_INS), $(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/$p $(REMOVE_F1) &&) true +ifdef GITGUI_WINDOWS_WRAPPER + $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui.tcl $(REMOVE_F1) +endif + $(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(libdir_SQ)' + $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/tclIndex $(REMOVE_F1) +ifdef GITGUI_MACOSXAPP + $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)/Git Gui.app' $(REMOVE_F1) + $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/git-gui.tcl $(REMOVE_F1) +endif + $(QUIET)$(foreach p,$(ALL_LIBFILES) $(NONTCL_LIBFILES), $(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/$(notdir $p) $(REMOVE_F1) &&) true + $(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(msgsdir_SQ)' + $(QUIET)$(foreach p,$(ALL_MSGFILES), $(REMOVE_F0)'$(DESTDIR_SQ)$(msgsdir_SQ)'/$(notdir $p) $(REMOVE_F1) &&) true + $(QUIET)$(REMOVE_D0)'$(DESTDIR_SQ)$(gitexecdir_SQ)' $(REMOVE_D1) + $(QUIET)$(REMOVE_D0)'$(DESTDIR_SQ)$(msgsdir_SQ)' $(REMOVE_D1) + $(QUIET)$(REMOVE_D0)'$(DESTDIR_SQ)$(libdir_SQ)' $(REMOVE_D1) + $(QUIET)$(REMOVE_D0)`dirname '$(DESTDIR_SQ)$(libdir_SQ)'` $(REMOVE_D1) + +dist-version: + @mkdir -p $(TARDIR) + @echo $(GITGUI_VERSION) > $(TARDIR)/version + +clean:: + $(RM_RF) $(GITGUI_MAIN) lib/tclIndex po/*.msg + $(RM_RF) GIT-VERSION-FILE GIT-GUI-VARS +ifdef GITGUI_MACOSXAPP + $(RM_RF) 'Git Gui.app'* git-gui +endif +ifdef GITGUI_WINDOWS_WRAPPER + $(RM_RF) git-gui +endif + +.PHONY: all install uninstall dist-version clean +.PHONY: FORCE diff --cc git-gui/git-gui.sh index b186329d28,0000000000..11048c7a0e mode 100755,000000..100755 --- a/git-gui/git-gui.sh +++ b/git-gui/git-gui.sh @@@ -1,4015 -1,0 +1,4021 @@@ +#!/bin/sh +# Tcl ignores the next line -*- tcl -*- \ + if test "z$*" = zversion \ + || test "z$*" = z--version; \ + then \ + echo 'git-gui version @@GITGUI_VERSION@@'; \ + exit; \ + fi; \ + argv0=$0; \ + exec wish "$argv0" -- "$@" + +set appvers {@@GITGUI_VERSION@@} +set copyright [string map [list (c) \u00a9] { +Copyright (c) 2006-2010 Shawn Pearce, et. al. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA}] + +###################################################################### +## +## Tcl/Tk sanity check + +if {[catch {package require Tcl 8.4} err] + || [catch {package require Tk 8.4} err] +} { + catch {wm withdraw .} + tk_messageBox \ + -icon error \ + -type ok \ + -title "git-gui: fatal error" \ + -message $err + exit 1 +} + +catch {rename send {}} ; # What an evil concept... + +###################################################################### +## +## locate our library + - set oguilib {@@GITGUI_LIBDIR@@} ++if { [info exists ::env(GIT_GUI_LIB_DIR) ] } { ++ set oguilib $::env(GIT_GUI_LIB_DIR) ++} else { ++ set oguilib {@@GITGUI_LIBDIR@@} ++} +set oguirel {@@GITGUI_RELATIVE@@} +if {$oguirel eq {1}} { + set oguilib [file dirname [file normalize $argv0]] + if {[file tail $oguilib] eq {git-core}} { + set oguilib [file dirname $oguilib] + } + set oguilib [file dirname $oguilib] + set oguilib [file join $oguilib share git-gui lib] + set oguimsg [file join $oguilib msgs] +} elseif {[string match @@* $oguirel]} { + set oguilib [file join [file dirname [file normalize $argv0]] lib] + set oguimsg [file join [file dirname [file normalize $argv0]] po] +} else { + set oguimsg [file join $oguilib msgs] +} +unset oguirel + +###################################################################### +## +## enable verbose loading? + +if {![catch {set _verbose $env(GITGUI_VERBOSE)}]} { + unset _verbose + rename auto_load real__auto_load + proc auto_load {name args} { + puts stderr "auto_load $name" + return [uplevel 1 real__auto_load $name $args] + } + rename source real__source - proc source {name} { - puts stderr "source $name" - uplevel 1 real__source $name ++ proc source {args} { ++ puts stderr "source $args" ++ uplevel 1 [linsert $args 0 real__source] + } + if {[tk windowingsystem] eq "win32"} { console show } +} + +###################################################################### +## +## Internationalization (i18n) through msgcat and gettext. See +## http://www.gnu.org/software/gettext/manual/html_node/Tcl.html + +package require msgcat + +# Check for Windows 7 MUI language pack (missed by msgcat < 1.4.4) +if {[tk windowingsystem] eq "win32" + && [package vcompare [package provide msgcat] 1.4.4] < 0 +} then { + proc _mc_update_locale {} { + set key {HKEY_CURRENT_USER\Control Panel\Desktop} + if {![catch { + package require registry + set uilocale [registry get $key "PreferredUILanguages"] + msgcat::ConvertLocale [string map {- _} [lindex $uilocale 0]] + } uilocale]} { + if {[string length $uilocale] > 0} { + msgcat::mclocale $uilocale + } + } + } + _mc_update_locale +} + +proc _mc_trim {fmt} { + set cmk [string first @@ $fmt] + if {$cmk > 0} { + return [string range $fmt 0 [expr {$cmk - 1}]] + } + return $fmt +} + +proc mc {en_fmt args} { + set fmt [_mc_trim [::msgcat::mc $en_fmt]] + if {[catch {set msg [eval [list format $fmt] $args]} err]} { + set msg [eval [list format [_mc_trim $en_fmt]] $args] + } + return $msg +} + +proc strcat {args} { + return [join $args {}] +} + +::msgcat::mcload $oguimsg +unset oguimsg + +###################################################################### +## +## On Mac, bring the current Wish process window to front + +if {[tk windowingsystem] eq "aqua"} { + catch { + exec osascript -e [format { + tell application "System Events" + set frontmost of processes whose unix id is %d to true + end tell + } [pid]] + } +} + +###################################################################### +## +## read only globals + +set _appname {Git Gui} +set _gitdir {} +set _gitworktree {} +set _isbare {} +set _gitexec {} +set _githtmldir {} +set _reponame {} +set _iscygwin {} +set _search_path {} +set _shellpath {@@SHELL_PATH@@} + +set _trace [lsearch -exact $argv --trace] +if {$_trace >= 0} { + set argv [lreplace $argv $_trace $_trace] + set _trace 1 + if {[tk windowingsystem] eq "win32"} { console show } +} else { + set _trace 0 +} + +# variable for the last merged branch (useful for a default when deleting +# branches). +set _last_merged_branch {} + +proc shellpath {} { + global _shellpath env + if {[string match @@* $_shellpath]} { + if {[info exists env(SHELL)]} { + return $env(SHELL) + } else { + return /bin/sh + } + } + return $_shellpath +} + +proc appname {} { + global _appname + return $_appname +} + +proc gitdir {args} { + global _gitdir + if {$args eq {}} { + return $_gitdir + } + return [eval [list file join $_gitdir] $args] +} + +proc gitexec {args} { + global _gitexec + if {$_gitexec eq {}} { + if {[catch {set _gitexec [git --exec-path]} err]} { + error "Git not installed?\n\n$err" + } + if {[is_Cygwin]} { + set _gitexec [exec cygpath \ + --windows \ + --absolute \ + $_gitexec] + } else { + set _gitexec [file normalize $_gitexec] + } + } + if {$args eq {}} { + return $_gitexec + } + return [eval [list file join $_gitexec] $args] +} + +proc githtmldir {args} { + global _githtmldir + if {$_githtmldir eq {}} { + if {[catch {set _githtmldir [git --html-path]}]} { + # Git not installed or option not yet supported + return {} + } + if {[is_Cygwin]} { + set _githtmldir [exec cygpath \ + --windows \ + --absolute \ + $_githtmldir] + } else { + set _githtmldir [file normalize $_githtmldir] + } + } + if {$args eq {}} { + return $_githtmldir + } + return [eval [list file join $_githtmldir] $args] +} + +proc reponame {} { + return $::_reponame +} + +proc is_MacOSX {} { + if {[tk windowingsystem] eq {aqua}} { + return 1 + } + return 0 +} + +proc is_Windows {} { + if {$::tcl_platform(platform) eq {windows}} { + return 1 + } + return 0 +} + +proc is_Cygwin {} { + global _iscygwin + if {$_iscygwin eq {}} { + if {$::tcl_platform(platform) eq {windows}} { + if {[catch {set p [exec cygpath --windir]} err]} { + set _iscygwin 0 + } else { + set _iscygwin 1 + } + } else { + set _iscygwin 0 + } + } + return $_iscygwin +} + +proc is_enabled {option} { + global enabled_options + if {[catch {set on $enabled_options($option)}]} {return 0} + return $on +} + +proc enable_option {option} { + global enabled_options + set enabled_options($option) 1 +} + +proc disable_option {option} { + global enabled_options + set enabled_options($option) 0 +} + +###################################################################### +## +## config + +proc is_many_config {name} { + switch -glob -- $name { + gui.recentrepo - + remote.*.fetch - + remote.*.push + {return 1} + * + {return 0} + } +} + +proc is_config_true {name} { + global repo_config + if {[catch {set v $repo_config($name)}]} { + return 0 + } + set v [string tolower $v] + if {$v eq {} || $v eq {true} || $v eq {1} || $v eq {yes} || $v eq {on}} { + return 1 + } else { + return 0 + } +} + +proc is_config_false {name} { + global repo_config + if {[catch {set v $repo_config($name)}]} { + return 0 + } + set v [string tolower $v] + if {$v eq {false} || $v eq {0} || $v eq {no} || $v eq {off}} { + return 1 + } else { + return 0 + } +} + +proc get_config {name} { + global repo_config + if {[catch {set v $repo_config($name)}]} { + return {} + } else { + return $v + } +} + +proc is_bare {} { + global _isbare + global _gitdir + global _gitworktree + + if {$_isbare eq {}} { + if {[catch { + set _bare [git rev-parse --is-bare-repository] + switch -- $_bare { + true { set _isbare 1 } + false { set _isbare 0} + default { throw } + } + }]} { + if {[is_config_true core.bare] + || ($_gitworktree eq {} + && [lindex [file split $_gitdir] end] ne {.git})} { + set _isbare 1 + } else { + set _isbare 0 + } + } + } + return $_isbare +} + +###################################################################### +## +## handy utils + +proc _trace_exec {cmd} { + if {!$::_trace} return + set d {} + foreach v $cmd { + if {$d ne {}} { + append d { } + } + if {[regexp {[ \t\r\n'"$?*]} $v]} { + set v [sq $v] + } + append d $v + } + puts stderr $d +} + +#'" fix poor old emacs font-lock mode + +proc _git_cmd {name} { + global _git_cmd_path + + if {[catch {set v $_git_cmd_path($name)}]} { + switch -- $name { + version - + --version - + --exec-path { return [list $::_git $name] } + } + + set p [gitexec git-$name$::_search_exe] + if {[file exists $p]} { + set v [list $p] + } elseif {[is_Windows] && [file exists [gitexec git-$name]]} { + # Try to determine what sort of magic will make + # git-$name go and do its thing, because native + # Tcl on Windows doesn't know it. + # + set p [gitexec git-$name] + set f [open $p r] + set s [gets $f] + close $f + + switch -glob -- [lindex $s 0] { + #!*sh { set i sh } + #!*perl { set i perl } + #!*python { set i python } + default { error "git-$name is not supported: $s" } + } + + upvar #0 _$i interp + if {![info exists interp]} { + set interp [_which $i] + } + if {$interp eq {}} { + error "git-$name requires $i (not in PATH)" + } + set v [concat [list $interp] [lrange $s 1 end] [list $p]] + } else { + # Assume it is builtin to git somehow and we + # aren't actually able to see a file for it. + # + set v [list $::_git $name] + } + set _git_cmd_path($name) $v + } + return $v +} + +proc _which {what args} { + global env _search_exe _search_path + + if {$_search_path eq {}} { + if {[is_Cygwin] && [regexp {^(/|\.:)} $env(PATH)]} { + set _search_path [split [exec cygpath \ + --windows \ + --path \ + --absolute \ + $env(PATH)] {;}] + set _search_exe .exe + } elseif {[is_Windows]} { + set gitguidir [file dirname [info script]] + regsub -all ";" $gitguidir "\\;" gitguidir + set env(PATH) "$gitguidir;$env(PATH)" + set _search_path [split $env(PATH) {;}] + set _search_exe .exe + } else { + set _search_path [split $env(PATH) :] + set _search_exe {} + } + } + + if {[is_Windows] && [lsearch -exact $args -script] >= 0} { + set suffix {} + } else { + set suffix $_search_exe + } + + foreach p $_search_path { + set p [file join $p $what$suffix] + if {[file exists $p]} { + return [file normalize $p] + } + } + return {} +} + +# Test a file for a hashbang to identify executable scripts on Windows. +proc is_shellscript {filename} { + if {![file exists $filename]} {return 0} + set f [open $filename r] + fconfigure $f -encoding binary + set magic [read $f 2] + close $f + return [expr {$magic eq "#!"}] +} + +# Run a command connected via pipes on stdout. +# This is for use with textconv filters and uses sh -c "..." to allow it to +# contain a command with arguments. On windows we must check for shell +# scripts specifically otherwise just call the filter command. +proc open_cmd_pipe {cmd path} { + global env + if {![file executable [shellpath]]} { + set exe [auto_execok [lindex $cmd 0]] + if {[is_shellscript [lindex $exe 0]]} { + set run [linsert [auto_execok sh] end -c "$cmd \"\$0\"" $path] + } else { + set run [concat $exe [lrange $cmd 1 end] $path] + } + } else { + set run [list [shellpath] -c "$cmd \"\$0\"" $path] + } + return [open |$run r] +} + +proc _lappend_nice {cmd_var} { + global _nice + upvar $cmd_var cmd + + if {![info exists _nice]} { + set _nice [_which nice] + if {[catch {exec $_nice git version}]} { + set _nice {} + } elseif {[is_Windows] && [file dirname $_nice] ne [file dirname $::_git]} { + set _nice {} + } + } + if {$_nice ne {}} { + lappend cmd $_nice + } +} + +proc git {args} { + set opt [list] + + while {1} { + switch -- [lindex $args 0] { + --nice { + _lappend_nice opt + } + + default { + break + } + + } + + set args [lrange $args 1 end] + } + + set cmdp [_git_cmd [lindex $args 0]] + set args [lrange $args 1 end] + + _trace_exec [concat $opt $cmdp $args] + set result [eval exec $opt $cmdp $args] + if {$::_trace} { + puts stderr "< $result" + } + return $result +} + +proc _open_stdout_stderr {cmd} { + _trace_exec $cmd + if {[catch { + set fd [open [concat [list | ] $cmd] r] + } err]} { + if { [lindex $cmd end] eq {2>@1} + && $err eq {can not find channel named "1"} + } { + # Older versions of Tcl 8.4 don't have this 2>@1 IO + # redirect operator. Fallback to |& cat for those. + # The command was not actually started, so its safe + # to try to start it a second time. + # + set fd [open [concat \ + [list | ] \ + [lrange $cmd 0 end-1] \ + [list |& cat] \ + ] r] + } else { + error $err + } + } + fconfigure $fd -eofchar {} + return $fd +} + +proc git_read {args} { + set opt [list] + + while {1} { + switch -- [lindex $args 0] { + --nice { + _lappend_nice opt + } + + --stderr { + lappend args 2>@1 + } + + default { + break + } + + } + + set args [lrange $args 1 end] + } + + set cmdp [_git_cmd [lindex $args 0]] + set args [lrange $args 1 end] + + return [_open_stdout_stderr [concat $opt $cmdp $args]] +} + +proc git_write {args} { + set opt [list] + + while {1} { + switch -- [lindex $args 0] { + --nice { + _lappend_nice opt + } + + default { + break + } + + } + + set args [lrange $args 1 end] + } + + set cmdp [_git_cmd [lindex $args 0]] + set args [lrange $args 1 end] + + _trace_exec [concat $opt $cmdp $args] + return [open [concat [list | ] $opt $cmdp $args] w] +} + +proc githook_read {hook_name args} { + set pchook [gitdir hooks $hook_name] + lappend args 2>@1 + + # On Windows [file executable] might lie so we need to ask + # the shell if the hook is executable. Yes that's annoying. + # + if {[is_Windows]} { + upvar #0 _sh interp + if {![info exists interp]} { + set interp [_which sh] + } + if {$interp eq {}} { + error "hook execution requires sh (not in PATH)" + } + + set scr {if test -x "$1";then exec "$@";fi} + set sh_c [list $interp -c $scr $interp $pchook] + return [_open_stdout_stderr [concat $sh_c $args]] + } + + if {[file executable $pchook]} { + return [_open_stdout_stderr [concat [list $pchook] $args]] + } + + return {} +} + +proc kill_file_process {fd} { + set process [pid $fd] + + catch { + if {[is_Windows]} { - # Use a Cygwin-specific flag to allow killing - # native Windows processes - exec kill -f $process ++ exec taskkill /pid $process + } else { + exec kill $process + } + } +} + +proc gitattr {path attr default} { + if {[catch {set r [git check-attr $attr -- $path]}]} { + set r unspecified + } else { + set r [join [lrange [split $r :] 2 end] :] + regsub {^ } $r {} r + } + if {$r eq {unspecified}} { + return $default + } + return $r +} + +proc sq {value} { + regsub -all ' $value "'\\''" value + return "'$value'" +} + +proc load_current_branch {} { + global current_branch is_detached + + set fd [open [gitdir HEAD] r] + if {[gets $fd ref] < 1} { + set ref {} + } + close $fd + + set pfx {ref: refs/heads/} + set len [string length $pfx] + if {[string equal -length $len $pfx $ref]} { + # We're on a branch. It might not exist. But + # HEAD looks good enough to be a branch. + # + set current_branch [string range $ref $len end] + set is_detached 0 + } else { + # Assume this is a detached head. + # + set current_branch HEAD + set is_detached 1 + } +} + +auto_load tk_optionMenu +rename tk_optionMenu real__tkOptionMenu +proc tk_optionMenu {w varName args} { + set m [eval real__tkOptionMenu $w $varName $args] + $m configure -font font_ui + $w configure -font font_ui + return $m +} + +proc rmsel_tag {text} { + $text tag conf sel \ + -background [$text cget -background] \ + -foreground [$text cget -foreground] \ + -borderwidth 0 + $text tag conf in_sel -background lightgray + bind $text break + return $text +} + +wm withdraw . +set root_exists 0 +bind . { + bind . {} + set root_exists 1 +} + +if {[is_Windows]} { + wm iconbitmap . -default $oguilib/git-gui.ico + set ::tk::AlwaysShowSelection 1 + bind . {console show} + + # Spoof an X11 display for SSH + if {![info exists env(DISPLAY)]} { + set env(DISPLAY) :9999 + } +} else { + catch { + image create photo gitlogo -width 16 -height 16 + + gitlogo put #33CC33 -to 7 0 9 2 + gitlogo put #33CC33 -to 4 2 12 4 + gitlogo put #33CC33 -to 7 4 9 6 + gitlogo put #CC3333 -to 4 6 12 8 + gitlogo put gray26 -to 4 9 6 10 + gitlogo put gray26 -to 3 10 6 12 + gitlogo put gray26 -to 8 9 13 11 + gitlogo put gray26 -to 8 11 10 12 + gitlogo put gray26 -to 11 11 13 14 + gitlogo put gray26 -to 3 12 5 14 + gitlogo put gray26 -to 5 13 + gitlogo put gray26 -to 10 13 + gitlogo put gray26 -to 4 14 12 15 + gitlogo put gray26 -to 5 15 11 16 + gitlogo redither + + image create photo gitlogo32 -width 32 -height 32 + gitlogo32 copy gitlogo -zoom 2 2 + + wm iconphoto . -default gitlogo gitlogo32 + } +} + +###################################################################### +## +## config defaults + +set cursor_ptr arrow +font create font_ui +if {[lsearch -exact [font names] TkDefaultFont] != -1} { + eval [linsert [font actual TkDefaultFont] 0 font configure font_ui] + eval [linsert [font actual TkFixedFont] 0 font create font_diff] +} else { + font create font_diff -family Courier -size 10 + catch { + label .dummy + eval font configure font_ui [font actual [.dummy cget -font]] + destroy .dummy + } +} + +font create font_uiitalic +font create font_uibold +font create font_diffbold +font create font_diffitalic + +foreach class {Button Checkbutton Entry Label + Labelframe Listbox Message + Radiobutton Spinbox Text} { + option add *$class.font font_ui +} +if {![is_MacOSX]} { + option add *Menu.font font_ui + option add *Entry.borderWidth 1 startupFile + option add *Entry.relief sunken startupFile + option add *RadioButton.anchor w startupFile +} +unset class + +if {[is_Windows] || [is_MacOSX]} { + option add *Menu.tearOff 0 +} + +if {[is_MacOSX]} { + set M1B M1 + set M1T Cmd +} else { + set M1B Control + set M1T Ctrl +} + +proc bind_button3 {w cmd} { + bind $w $cmd + if {[is_MacOSX]} { + # Mac OS X sends Button-2 on right click through three-button mouse, + # or through trackpad right-clicking (two-finger touch + click). + bind $w $cmd + bind $w $cmd + } +} + +proc apply_config {} { + global repo_config font_descs + + foreach option $font_descs { + set name [lindex $option 0] + set font [lindex $option 1] + if {[catch { + set need_weight 1 + foreach {cn cv} $repo_config(gui.$name) { + if {$cn eq {-weight}} { + set need_weight 0 + } + font configure $font $cn $cv + } + if {$need_weight} { + font configure $font -weight normal + } + } err]} { + error_popup [strcat [mc "Invalid font specified in %s:" "gui.$name"] "\n\n$err"] + } + foreach {cn cv} [font configure $font] { + font configure ${font}bold $cn $cv + font configure ${font}italic $cn $cv + } + font configure ${font}bold -weight bold + font configure ${font}italic -slant italic + } + + global use_ttk NS + set use_ttk 0 + set NS {} + if {$repo_config(gui.usettk)} { + set use_ttk [package vsatisfies [package provide Tk] 8.5] + if {$use_ttk} { + set NS ttk + bind [winfo class .] <> [list InitTheme] + pave_toplevel . + } + } +} + +set default_config(branch.autosetupmerge) true +set default_config(merge.tool) {} +set default_config(mergetool.keepbackup) true +set default_config(merge.diffstat) true +set default_config(merge.summary) false +set default_config(merge.verbosity) 2 +set default_config(user.name) {} +set default_config(user.email) {} + +set default_config(gui.encoding) [encoding system] +set default_config(gui.matchtrackingbranch) false +set default_config(gui.textconv) true +set default_config(gui.pruneduringfetch) false +set default_config(gui.trustmtime) false +set default_config(gui.fastcopyblame) false +set default_config(gui.maxrecentrepo) 10 +set default_config(gui.copyblamethreshold) 40 +set default_config(gui.blamehistoryctx) 7 +set default_config(gui.diffcontext) 5 +set default_config(gui.diffopts) {} +set default_config(gui.commitmsgwidth) 75 +set default_config(gui.newbranchtemplate) {} +set default_config(gui.spellingdictionary) {} +set default_config(gui.fontui) [font configure font_ui] +set default_config(gui.fontdiff) [font configure font_diff] +# TODO: this option should be added to the git-config documentation +set default_config(gui.maxfilesdisplayed) 5000 +set default_config(gui.usettk) 1 +set default_config(gui.warndetachedcommit) 1 ++set default_config(gui.tabsize) 8 +set font_descs { + {fontui font_ui {mc "Main Font"}} + {fontdiff font_diff {mc "Diff/Console Font"}} +} +set default_config(gui.stageuntracked) ask +set default_config(gui.displayuntracked) true + +###################################################################### +## +## find git + +set _git [_which git] +if {$_git eq {}} { + catch {wm withdraw .} + tk_messageBox \ + -icon error \ + -type ok \ + -title [mc "git-gui: fatal error"] \ + -message [mc "Cannot find git in PATH."] + exit 1 +} + +###################################################################### +## +## version check + +if {[catch {set _git_version [git --version]} err]} { + catch {wm withdraw .} + tk_messageBox \ + -icon error \ + -type ok \ + -title [mc "git-gui: fatal error"] \ + -message "Cannot determine Git version: + +$err + +[appname] requires Git 1.5.0 or later." + exit 1 +} +if {![regsub {^git version } $_git_version {} _git_version]} { + catch {wm withdraw .} + tk_messageBox \ + -icon error \ + -type ok \ + -title [mc "git-gui: fatal error"] \ + -message [strcat [mc "Cannot parse Git version string:"] "\n\n$_git_version"] + exit 1 +} + +proc get_trimmed_version {s} { + set r {} + foreach x [split $s -._] { + if {[string is integer -strict $x]} { + lappend r $x + } else { + break + } + } + return [join $r .] +} +set _real_git_version $_git_version +set _git_version [get_trimmed_version $_git_version] + +if {![regexp {^[1-9]+(\.[0-9]+)+$} $_git_version]} { + catch {wm withdraw .} + if {[tk_messageBox \ + -icon warning \ + -type yesno \ + -default no \ + -title "[appname]: warning" \ + -message [mc "Git version cannot be determined. + +%s claims it is version '%s'. + +%s requires at least Git 1.5.0 or later. + +Assume '%s' is version 1.5.0? +" $_git $_real_git_version [appname] $_real_git_version]] eq {yes}} { + set _git_version 1.5.0 + } else { + exit 1 + } +} +unset _real_git_version + +proc git-version {args} { + global _git_version + + switch [llength $args] { + 0 { + return $_git_version + } + + 2 { + set op [lindex $args 0] + set vr [lindex $args 1] + set cm [package vcompare $_git_version $vr] + return [expr $cm $op 0] + } + + 4 { + set type [lindex $args 0] + set name [lindex $args 1] + set parm [lindex $args 2] + set body [lindex $args 3] + + if {($type ne {proc} && $type ne {method})} { + error "Invalid arguments to git-version" + } + if {[llength $body] < 2 || [lindex $body end-1] ne {default}} { + error "Last arm of $type $name must be default" + } + + foreach {op vr cb} [lrange $body 0 end-2] { + if {[git-version $op $vr]} { + return [uplevel [list $type $name $parm $cb]] + } + } + + return [uplevel [list $type $name $parm [lindex $body end]]] + } + + default { + error "git-version >= x" + } + + } +} + +if {[git-version < 1.5]} { + catch {wm withdraw .} + tk_messageBox \ + -icon error \ + -type ok \ + -title [mc "git-gui: fatal error"] \ + -message "[appname] requires Git 1.5.0 or later. + +You are using [git-version]: + +[git --version]" + exit 1 +} + +###################################################################### +## +## configure our library + +set idx [file join $oguilib tclIndex] +if {[catch {set fd [open $idx r]} err]} { + catch {wm withdraw .} + tk_messageBox \ + -icon error \ + -type ok \ + -title [mc "git-gui: fatal error"] \ + -message $err + exit 1 +} +if {[gets $fd] eq {# Autogenerated by git-gui Makefile}} { + set idx [list] + while {[gets $fd n] >= 0} { + if {$n ne {} && ![string match #* $n]} { + lappend idx $n + } + } +} else { + set idx {} +} +close $fd + +if {$idx ne {}} { + set loaded [list] + foreach p $idx { + if {[lsearch -exact $loaded $p] >= 0} continue + source [file join $oguilib $p] + lappend loaded $p + } + unset loaded p +} else { + set auto_path [concat [list $oguilib] $auto_path] +} +unset -nocomplain idx fd + +###################################################################### +## +## config file parsing + +git-version proc _parse_config {arr_name args} { + >= 1.5.3 { + upvar $arr_name arr + array unset arr + set buf {} + catch { + set fd_rc [eval \ + [list git_read config] \ + $args \ + [list --null --list]] + fconfigure $fd_rc -translation binary + set buf [read $fd_rc] + close $fd_rc + } + foreach line [split $buf "\0"] { + if {[regexp {^([^\n]+)\n(.*)$} $line line name value]} { + if {[is_many_config $name]} { + lappend arr($name) $value + } else { + set arr($name) $value + } + } elseif {[regexp {^([^\n]+)$} $line line name]} { + # no value given, but interpreting them as + # boolean will be handled as true + set arr($name) {} + } + } + } + default { + upvar $arr_name arr + array unset arr + catch { + set fd_rc [eval [list git_read config --list] $args] + while {[gets $fd_rc line] >= 0} { + if {[regexp {^([^=]+)=(.*)$} $line line name value]} { + if {[is_many_config $name]} { + lappend arr($name) $value + } else { + set arr($name) $value + } + } elseif {[regexp {^([^=]+)$} $line line name]} { + # no value given, but interpreting them as + # boolean will be handled as true + set arr($name) {} + } + } + close $fd_rc + } + } +} + +proc load_config {include_global} { + global repo_config global_config system_config default_config + + if {$include_global} { + _parse_config system_config --system + _parse_config global_config --global + } + _parse_config repo_config + + foreach name [array names default_config] { + if {[catch {set v $system_config($name)}]} { + set system_config($name) $default_config($name) + } + } + foreach name [array names system_config] { + if {[catch {set v $global_config($name)}]} { + set global_config($name) $system_config($name) + } + if {[catch {set v $repo_config($name)}]} { + set repo_config($name) $system_config($name) + } + } +} + +###################################################################### +## +## feature option selection + +if {[regexp {^git-(.+)$} [file tail $argv0] _junk subcommand]} { + unset _junk +} else { + set subcommand gui +} +if {$subcommand eq {gui.sh}} { + set subcommand gui +} +if {$subcommand eq {gui} && [llength $argv] > 0} { + set subcommand [lindex $argv 0] + set argv [lrange $argv 1 end] +} + +enable_option multicommit +enable_option branch +enable_option transport +disable_option bare + +switch -- $subcommand { +browser - +blame { + enable_option bare + + disable_option multicommit + disable_option branch + disable_option transport +} +citool { + enable_option singlecommit + enable_option retcode + + disable_option multicommit + disable_option branch + disable_option transport + + while {[llength $argv] > 0} { + set a [lindex $argv 0] + switch -- $a { + --amend { + enable_option initialamend + } + --nocommit { + enable_option nocommit + enable_option nocommitmsg + } + --commitmsg { + disable_option nocommitmsg + } + default { + break + } + } + + set argv [lrange $argv 1 end] + } +} +} + +###################################################################### +## +## execution environment + +set have_tk85 [expr {[package vcompare $tk_version "8.5"] >= 0}] + +# Suggest our implementation of askpass, if none is set +if {![info exists env(SSH_ASKPASS)]} { + set env(SSH_ASKPASS) [gitexec git-gui--askpass] +} + +###################################################################### +## +## repository setup + +set picked 0 +if {[catch { + set _gitdir $env(GIT_DIR) + set _prefix {} + }] + && [catch { + # beware that from the .git dir this sets _gitdir to . + # and _prefix to the empty string + set _gitdir [git rev-parse --git-dir] + set _prefix [git rev-parse --show-prefix] + } err]} { + load_config 1 + apply_config + choose_repository::pick + set picked 1 +} + +# we expand the _gitdir when it's just a single dot (i.e. when we're being +# run from the .git dir itself) lest the routines to find the worktree +# get confused +if {$_gitdir eq "."} { + set _gitdir [pwd] +} + +if {![file isdirectory $_gitdir] && [is_Cygwin]} { + catch {set _gitdir [exec cygpath --windows $_gitdir]} +} +if {![file isdirectory $_gitdir]} { + catch {wm withdraw .} + error_popup [strcat [mc "Git directory not found:"] "\n\n$_gitdir"] + exit 1 +} +# _gitdir exists, so try loading the config +load_config 0 +apply_config + +# v1.7.0 introduced --show-toplevel to return the canonical work-tree - if {[package vsatisfies $_git_version 1.7.0-]} { ++if {[package vcompare $_git_version 1.7.0] >= 0} { + if { [is_Cygwin] } { + catch {set _gitworktree [exec cygpath --windows [git rev-parse --show-toplevel]]} + } else { + set _gitworktree [git rev-parse --show-toplevel] + } +} else { + # try to set work tree from environment, core.worktree or use + # cdup to obtain a relative path to the top of the worktree. If + # run from the top, the ./ prefix ensures normalize expands pwd. + if {[catch { set _gitworktree $env(GIT_WORK_TREE) }]} { + set _gitworktree [get_config core.worktree] + if {$_gitworktree eq ""} { + set _gitworktree [file normalize ./[git rev-parse --show-cdup]] + } + } +} + +if {$_prefix ne {}} { + if {$_gitworktree eq {}} { + regsub -all {[^/]+/} $_prefix ../ cdup + } else { + set cdup $_gitworktree + } + if {[catch {cd $cdup} err]} { + catch {wm withdraw .} + error_popup [strcat [mc "Cannot move to top of working directory:"] "\n\n$err"] + exit 1 + } + set _gitworktree [pwd] + unset cdup +} elseif {![is_enabled bare]} { + if {[is_bare]} { + catch {wm withdraw .} + error_popup [strcat [mc "Cannot use bare repository:"] "\n\n$_gitdir"] + exit 1 + } + if {$_gitworktree eq {}} { + set _gitworktree [file dirname $_gitdir] + } + if {[catch {cd $_gitworktree} err]} { + catch {wm withdraw .} + error_popup [strcat [mc "No working directory"] " $_gitworktree:\n\n$err"] + exit 1 + } + set _gitworktree [pwd] +} +set _reponame [file split [file normalize $_gitdir]] +if {[lindex $_reponame end] eq {.git}} { + set _reponame [lindex $_reponame end-1] +} else { + set _reponame [lindex $_reponame end] +} + +set env(GIT_DIR) $_gitdir +set env(GIT_WORK_TREE) $_gitworktree + +###################################################################### +## +## global init + +set current_diff_path {} +set current_diff_side {} +set diff_actions [list] + +set HEAD {} +set PARENT {} +set MERGE_HEAD [list] +set commit_type {} +set empty_tree {} +set current_branch {} +set is_detached 0 +set current_diff_path {} +set is_3way_diff 0 +set is_submodule_diff 0 +set is_conflict_diff 0 +set selected_commit_type new +set diff_empty_count 0 + +set nullid "0000000000000000000000000000000000000000" +set nullid2 "0000000000000000000000000000000000000001" + +###################################################################### +## +## task management + +set rescan_active 0 +set diff_active 0 +set last_clicked {} + +set disable_on_lock [list] +set index_lock_type none + +proc lock_index {type} { + global index_lock_type disable_on_lock + + if {$index_lock_type eq {none}} { + set index_lock_type $type + foreach w $disable_on_lock { + uplevel #0 $w disabled + } + return 1 + } elseif {$index_lock_type eq "begin-$type"} { + set index_lock_type $type + return 1 + } + return 0 +} + +proc unlock_index {} { + global index_lock_type disable_on_lock + + set index_lock_type none + foreach w $disable_on_lock { + uplevel #0 $w normal + } +} + +###################################################################### +## +## status + +proc repository_state {ctvar hdvar mhvar} { + global current_branch + upvar $ctvar ct $hdvar hd $mhvar mh + + set mh [list] + + load_current_branch + if {[catch {set hd [git rev-parse --verify HEAD]}]} { + set hd {} + set ct initial + return + } + + set merge_head [gitdir MERGE_HEAD] + if {[file exists $merge_head]} { + set ct merge + set fd_mh [open $merge_head r] + while {[gets $fd_mh line] >= 0} { + lappend mh $line + } + close $fd_mh + return + } + + set ct normal +} + +proc PARENT {} { + global PARENT empty_tree + + set p [lindex $PARENT 0] + if {$p ne {}} { + return $p + } + if {$empty_tree eq {}} { + set empty_tree [git mktree << {}] + } + return $empty_tree +} + +proc force_amend {} { + global selected_commit_type + global HEAD PARENT MERGE_HEAD commit_type + + repository_state newType newHEAD newMERGE_HEAD + set HEAD $newHEAD + set PARENT $newHEAD + set MERGE_HEAD $newMERGE_HEAD + set commit_type $newType + + set selected_commit_type amend + do_select_commit_type +} + +proc rescan {after {honor_trustmtime 1}} { + global HEAD PARENT MERGE_HEAD commit_type + global ui_index ui_workdir ui_comm + global rescan_active file_states + global repo_config + + if {$rescan_active > 0 || ![lock_index read]} return + + repository_state newType newHEAD newMERGE_HEAD + if {[string match amend* $commit_type] + && $newType eq {normal} + && $newHEAD eq $HEAD} { + } else { + set HEAD $newHEAD + set PARENT $newHEAD + set MERGE_HEAD $newMERGE_HEAD + set commit_type $newType + } + + array unset file_states + + if {!$::GITGUI_BCK_exists && + (![$ui_comm edit modified] + || [string trim [$ui_comm get 0.0 end]] eq {})} { + if {[string match amend* $commit_type]} { + } elseif {[load_message GITGUI_MSG utf-8]} { + } elseif {[run_prepare_commit_msg_hook]} { + } elseif {[load_message MERGE_MSG]} { + } elseif {[load_message SQUASH_MSG]} { + } + $ui_comm edit reset + $ui_comm edit modified false + } + + if {$honor_trustmtime && $repo_config(gui.trustmtime) eq {true}} { + rescan_stage2 {} $after + } else { + set rescan_active 1 + ui_status [mc "Refreshing file status..."] + set fd_rf [git_read update-index \ + -q \ + --unmerged \ + --ignore-missing \ + --refresh \ + ] + fconfigure $fd_rf -blocking 0 -translation binary + fileevent $fd_rf readable \ + [list rescan_stage2 $fd_rf $after] + } +} + +if {[is_Cygwin]} { + set is_git_info_exclude {} + proc have_info_exclude {} { + global is_git_info_exclude + + if {$is_git_info_exclude eq {}} { + if {[catch {exec test -f [gitdir info exclude]}]} { + set is_git_info_exclude 0 + } else { + set is_git_info_exclude 1 + } + } + return $is_git_info_exclude + } +} else { + proc have_info_exclude {} { + return [file readable [gitdir info exclude]] + } +} + +proc rescan_stage2 {fd after} { + global rescan_active buf_rdi buf_rdf buf_rlo + + if {$fd ne {}} { + read $fd + if {![eof $fd]} return + close $fd + } + - if {[package vsatisfies $::_git_version 1.6.3-]} { ++ if {[package vcompare $::_git_version 1.6.3] >= 0} { + set ls_others [list --exclude-standard] + } else { + set ls_others [list --exclude-per-directory=.gitignore] + if {[have_info_exclude]} { + lappend ls_others "--exclude-from=[gitdir info exclude]" + } + set user_exclude [get_config core.excludesfile] + if {$user_exclude ne {} && [file readable $user_exclude]} { + lappend ls_others "--exclude-from=[file normalize $user_exclude]" + } + } + + set buf_rdi {} + set buf_rdf {} + set buf_rlo {} + + set rescan_active 2 + ui_status [mc "Scanning for modified files ..."] + if {[git-version >= "1.7.2"]} { + set fd_di [git_read diff-index --cached --ignore-submodules=dirty -z [PARENT]] + } else { + set fd_di [git_read diff-index --cached -z [PARENT]] + } + set fd_df [git_read diff-files -z] + + fconfigure $fd_di -blocking 0 -translation binary -encoding binary + fconfigure $fd_df -blocking 0 -translation binary -encoding binary + + fileevent $fd_di readable [list read_diff_index $fd_di $after] + fileevent $fd_df readable [list read_diff_files $fd_df $after] + + if {[is_config_true gui.displayuntracked]} { + set fd_lo [eval git_read ls-files --others -z $ls_others] + fconfigure $fd_lo -blocking 0 -translation binary -encoding binary + fileevent $fd_lo readable [list read_ls_others $fd_lo $after] + incr rescan_active + } +} + +proc load_message {file {encoding {}}} { + global ui_comm + + set f [gitdir $file] + if {[file isfile $f]} { + if {[catch {set fd [open $f r]}]} { + return 0 + } + fconfigure $fd -eofchar {} + if {$encoding ne {}} { + fconfigure $fd -encoding $encoding + } + set content [string trim [read $fd]] + close $fd + regsub -all -line {[ \r\t]+$} $content {} content + $ui_comm delete 0.0 end + $ui_comm insert end $content + return 1 + } + return 0 +} + +proc run_prepare_commit_msg_hook {} { + global pch_error + + # prepare-commit-msg requires PREPARE_COMMIT_MSG exist. From git-gui + # it will be .git/MERGE_MSG (merge), .git/SQUASH_MSG (squash), or an + # empty file but existent file. + + set fd_pcm [open [gitdir PREPARE_COMMIT_MSG] a] + + if {[file isfile [gitdir MERGE_MSG]]} { + set pcm_source "merge" + set fd_mm [open [gitdir MERGE_MSG] r] + puts -nonewline $fd_pcm [read $fd_mm] + close $fd_mm + } elseif {[file isfile [gitdir SQUASH_MSG]]} { + set pcm_source "squash" + set fd_sm [open [gitdir SQUASH_MSG] r] + puts -nonewline $fd_pcm [read $fd_sm] + close $fd_sm + } else { + set pcm_source "" + } + + close $fd_pcm + + set fd_ph [githook_read prepare-commit-msg \ + [gitdir PREPARE_COMMIT_MSG] $pcm_source] + if {$fd_ph eq {}} { + catch {file delete [gitdir PREPARE_COMMIT_MSG]} + return 0; + } + + ui_status [mc "Calling prepare-commit-msg hook..."] + set pch_error {} + + fconfigure $fd_ph -blocking 0 -translation binary -eofchar {} + fileevent $fd_ph readable \ + [list prepare_commit_msg_hook_wait $fd_ph] + + return 1; +} + +proc prepare_commit_msg_hook_wait {fd_ph} { + global pch_error + + append pch_error [read $fd_ph] + fconfigure $fd_ph -blocking 1 + if {[eof $fd_ph]} { + if {[catch {close $fd_ph}]} { + ui_status [mc "Commit declined by prepare-commit-msg hook."] + hook_failed_popup prepare-commit-msg $pch_error + catch {file delete [gitdir PREPARE_COMMIT_MSG]} + exit 1 + } else { + load_message PREPARE_COMMIT_MSG + } + set pch_error {} + catch {file delete [gitdir PREPARE_COMMIT_MSG]} + return + } + fconfigure $fd_ph -blocking 0 + catch {file delete [gitdir PREPARE_COMMIT_MSG]} +} + +proc read_diff_index {fd after} { + global buf_rdi + + append buf_rdi [read $fd] + set c 0 + set n [string length $buf_rdi] + while {$c < $n} { + set z1 [string first "\0" $buf_rdi $c] + if {$z1 == -1} break + incr z1 + set z2 [string first "\0" $buf_rdi $z1] + if {$z2 == -1} break + + incr c + set i [split [string range $buf_rdi $c [expr {$z1 - 2}]] { }] + set p [string range $buf_rdi $z1 [expr {$z2 - 1}]] + merge_state \ + [encoding convertfrom $p] \ + [lindex $i 4]? \ + [list [lindex $i 0] [lindex $i 2]] \ + [list] + set c $z2 + incr c + } + if {$c < $n} { + set buf_rdi [string range $buf_rdi $c end] + } else { + set buf_rdi {} + } + + rescan_done $fd buf_rdi $after +} + +proc read_diff_files {fd after} { + global buf_rdf + + append buf_rdf [read $fd] + set c 0 + set n [string length $buf_rdf] + while {$c < $n} { + set z1 [string first "\0" $buf_rdf $c] + if {$z1 == -1} break + incr z1 + set z2 [string first "\0" $buf_rdf $z1] + if {$z2 == -1} break + + incr c + set i [split [string range $buf_rdf $c [expr {$z1 - 2}]] { }] + set p [string range $buf_rdf $z1 [expr {$z2 - 1}]] + merge_state \ + [encoding convertfrom $p] \ + ?[lindex $i 4] \ + [list] \ + [list [lindex $i 0] [lindex $i 2]] + set c $z2 + incr c + } + if {$c < $n} { + set buf_rdf [string range $buf_rdf $c end] + } else { + set buf_rdf {} + } + + rescan_done $fd buf_rdf $after +} + +proc read_ls_others {fd after} { + global buf_rlo + + append buf_rlo [read $fd] + set pck [split $buf_rlo "\0"] + set buf_rlo [lindex $pck end] + foreach p [lrange $pck 0 end-1] { + set p [encoding convertfrom $p] + if {[string index $p end] eq {/}} { + set p [string range $p 0 end-1] + } + merge_state $p ?O + } + rescan_done $fd buf_rlo $after +} + +proc rescan_done {fd buf after} { + global rescan_active current_diff_path + global file_states repo_config + upvar $buf to_clear + + if {![eof $fd]} return + set to_clear {} + close $fd + if {[incr rescan_active -1] > 0} return + + prune_selection + unlock_index + display_all_files + if {$current_diff_path ne {}} { reshow_diff $after } + if {$current_diff_path eq {}} { select_first_diff $after } +} + +proc prune_selection {} { + global file_states selected_paths + + foreach path [array names selected_paths] { + if {[catch {set still_here $file_states($path)}]} { + unset selected_paths($path) + } + } +} + +###################################################################### +## +## ui helpers + +proc mapicon {w state path} { + global all_icons + + if {[catch {set r $all_icons($state$w)}]} { + puts "error: no icon for $w state={$state} $path" + return file_plain + } + return $r +} + +proc mapdesc {state path} { + global all_descs + + if {[catch {set r $all_descs($state)}]} { + puts "error: no desc for state={$state} $path" + return $state + } + return $r +} + +proc ui_status {msg} { + global main_status + if {[info exists main_status]} { + $main_status show $msg + } +} + +proc ui_ready {{test {}}} { + global main_status + if {[info exists main_status]} { + $main_status show [mc "Ready."] $test + } +} + +proc escape_path {path} { + regsub -all {\\} $path "\\\\" path + regsub -all "\n" $path "\\n" path + return $path +} + +proc short_path {path} { + return [escape_path [lindex [file split $path] end]] +} + +set next_icon_id 0 +set null_sha1 [string repeat 0 40] + +proc merge_state {path new_state {head_info {}} {index_info {}}} { + global file_states next_icon_id null_sha1 + + set s0 [string index $new_state 0] + set s1 [string index $new_state 1] + + if {[catch {set info $file_states($path)}]} { + set state __ + set icon n[incr next_icon_id] + } else { + set state [lindex $info 0] + set icon [lindex $info 1] + if {$head_info eq {}} {set head_info [lindex $info 2]} + if {$index_info eq {}} {set index_info [lindex $info 3]} + } + + if {$s0 eq {?}} {set s0 [string index $state 0]} \ + elseif {$s0 eq {_}} {set s0 _} + + if {$s1 eq {?}} {set s1 [string index $state 1]} \ + elseif {$s1 eq {_}} {set s1 _} + + if {$s0 eq {A} && $s1 eq {_} && $head_info eq {}} { + set head_info [list 0 $null_sha1] + } elseif {$s0 ne {_} && [string index $state 0] eq {_} + && $head_info eq {}} { + set head_info $index_info + } elseif {$s0 eq {_} && [string index $state 0] ne {_}} { + set index_info $head_info + set head_info {} + } + + set file_states($path) [list $s0$s1 $icon \ + $head_info $index_info \ + ] + return $state +} + +proc display_file_helper {w path icon_name old_m new_m} { + global file_lists + + if {$new_m eq {_}} { + set lno [lsearch -sorted -exact $file_lists($w) $path] + if {$lno >= 0} { + set file_lists($w) [lreplace $file_lists($w) $lno $lno] + incr lno + $w conf -state normal + $w delete $lno.0 [expr {$lno + 1}].0 + $w conf -state disabled + } + } elseif {$old_m eq {_} && $new_m ne {_}} { + lappend file_lists($w) $path + set file_lists($w) [lsort -unique $file_lists($w)] + set lno [lsearch -sorted -exact $file_lists($w) $path] + incr lno + $w conf -state normal + $w image create $lno.0 \ + -align center -padx 5 -pady 1 \ + -name $icon_name \ + -image [mapicon $w $new_m $path] + $w insert $lno.1 "[escape_path $path]\n" + $w conf -state disabled + } elseif {$old_m ne $new_m} { + $w conf -state normal + $w image conf $icon_name -image [mapicon $w $new_m $path] + $w conf -state disabled + } +} + +proc display_file {path state} { + global file_states selected_paths + global ui_index ui_workdir + + set old_m [merge_state $path $state] + set s $file_states($path) + set new_m [lindex $s 0] + set icon_name [lindex $s 1] + + set o [string index $old_m 0] + set n [string index $new_m 0] + if {$o eq {U}} { + set o _ + } + if {$n eq {U}} { + set n _ + } + display_file_helper $ui_index $path $icon_name $o $n + + if {[string index $old_m 0] eq {U}} { + set o U + } else { + set o [string index $old_m 1] + } + if {[string index $new_m 0] eq {U}} { + set n U + } else { + set n [string index $new_m 1] + } + display_file_helper $ui_workdir $path $icon_name $o $n + + if {$new_m eq {__}} { + unset file_states($path) + catch {unset selected_paths($path)} + } +} + +proc display_all_files_helper {w path icon_name m} { + global file_lists + + lappend file_lists($w) $path + set lno [expr {[lindex [split [$w index end] .] 0] - 1}] + $w image create end \ + -align center -padx 5 -pady 1 \ + -name $icon_name \ + -image [mapicon $w $m $path] + $w insert end "[escape_path $path]\n" +} + +set files_warning 0 +proc display_all_files {} { + global ui_index ui_workdir + global file_states file_lists + global last_clicked + global files_warning + + $ui_index conf -state normal + $ui_workdir conf -state normal + + $ui_index delete 0.0 end + $ui_workdir delete 0.0 end + set last_clicked {} + + set file_lists($ui_index) [list] + set file_lists($ui_workdir) [list] + + set to_display [lsort [array names file_states]] + set display_limit [get_config gui.maxfilesdisplayed] - if {[llength $to_display] > $display_limit} { - if {!$files_warning} { - # do not repeatedly warn: - set files_warning 1 - info_popup [mc "Displaying only %s of %s files." \ - $display_limit [llength $to_display]] - } - set to_display [lrange $to_display 0 [expr {$display_limit-1}]] - } ++ set displayed 0 + foreach path $to_display { + set s $file_states($path) + set m [lindex $s 0] + set icon_name [lindex $s 1] + ++ if {$displayed > $display_limit && [string index $m 1] eq {O} } { ++ if {!$files_warning} { ++ # do not repeatedly warn: ++ set files_warning 1 ++ info_popup [mc "Display limit (gui.maxfilesdisplayed = %s) reached, not showing all %s files." \ ++ $display_limit [llength $to_display]] ++ } ++ continue ++ } ++ + set s [string index $m 0] + if {$s ne {U} && $s ne {_}} { + display_all_files_helper $ui_index $path \ + $icon_name $s + } + + if {[string index $m 0] eq {U}} { + set s U + } else { + set s [string index $m 1] + } + if {$s ne {_}} { + display_all_files_helper $ui_workdir $path \ + $icon_name $s ++ incr displayed + } + } + + $ui_index conf -state disabled + $ui_workdir conf -state disabled +} + +###################################################################### +## +## icons + +set filemask { +#define mask_width 14 +#define mask_height 15 +static unsigned char mask_bits[] = { + 0xfe, 0x1f, 0xfe, 0x1f, 0xfe, 0x1f, 0xfe, 0x1f, 0xfe, 0x1f, 0xfe, 0x1f, + 0xfe, 0x1f, 0xfe, 0x1f, 0xfe, 0x1f, 0xfe, 0x1f, 0xfe, 0x1f, 0xfe, 0x1f, + 0xfe, 0x1f, 0xfe, 0x1f, 0xfe, 0x1f}; +} + +image create bitmap file_plain -background white -foreground black -data { +#define plain_width 14 +#define plain_height 15 +static unsigned char plain_bits[] = { + 0xfe, 0x01, 0x02, 0x03, 0x02, 0x05, 0x02, 0x09, 0x02, 0x1f, 0x02, 0x10, + 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, + 0x02, 0x10, 0x02, 0x10, 0xfe, 0x1f}; +} -maskdata $filemask + +image create bitmap file_mod -background white -foreground blue -data { +#define mod_width 14 +#define mod_height 15 +static unsigned char mod_bits[] = { + 0xfe, 0x01, 0x02, 0x03, 0x7a, 0x05, 0x02, 0x09, 0x7a, 0x1f, 0x02, 0x10, + 0xfa, 0x17, 0x02, 0x10, 0xfa, 0x17, 0x02, 0x10, 0xfa, 0x17, 0x02, 0x10, + 0xfa, 0x17, 0x02, 0x10, 0xfe, 0x1f}; +} -maskdata $filemask + +image create bitmap file_fulltick -background white -foreground "#007000" -data { +#define file_fulltick_width 14 +#define file_fulltick_height 15 +static unsigned char file_fulltick_bits[] = { + 0xfe, 0x01, 0x02, 0x1a, 0x02, 0x0c, 0x02, 0x0c, 0x02, 0x16, 0x02, 0x16, + 0x02, 0x13, 0x00, 0x13, 0x86, 0x11, 0x8c, 0x11, 0xd8, 0x10, 0xf2, 0x10, + 0x62, 0x10, 0x02, 0x10, 0xfe, 0x1f}; +} -maskdata $filemask + +image create bitmap file_question -background white -foreground black -data { +#define file_question_width 14 +#define file_question_height 15 +static unsigned char file_question_bits[] = { + 0xfe, 0x01, 0x02, 0x02, 0xe2, 0x04, 0xf2, 0x09, 0x1a, 0x1b, 0x0a, 0x13, + 0x82, 0x11, 0xc2, 0x10, 0x62, 0x10, 0x62, 0x10, 0x02, 0x10, 0x62, 0x10, + 0x62, 0x10, 0x02, 0x10, 0xfe, 0x1f}; +} -maskdata $filemask + +image create bitmap file_removed -background white -foreground red -data { +#define file_removed_width 14 +#define file_removed_height 15 +static unsigned char file_removed_bits[] = { + 0xfe, 0x01, 0x02, 0x03, 0x02, 0x05, 0x02, 0x09, 0x02, 0x1f, 0x02, 0x10, + 0x1a, 0x16, 0x32, 0x13, 0xe2, 0x11, 0xc2, 0x10, 0xe2, 0x11, 0x32, 0x13, + 0x1a, 0x16, 0x02, 0x10, 0xfe, 0x1f}; +} -maskdata $filemask + +image create bitmap file_merge -background white -foreground blue -data { +#define file_merge_width 14 +#define file_merge_height 15 +static unsigned char file_merge_bits[] = { + 0xfe, 0x01, 0x02, 0x03, 0x62, 0x05, 0x62, 0x09, 0x62, 0x1f, 0x62, 0x10, + 0xfa, 0x11, 0xf2, 0x10, 0x62, 0x10, 0x02, 0x10, 0xfa, 0x17, 0x02, 0x10, + 0xfa, 0x17, 0x02, 0x10, 0xfe, 0x1f}; +} -maskdata $filemask + +image create bitmap file_statechange -background white -foreground green -data { +#define file_statechange_width 14 +#define file_statechange_height 15 +static unsigned char file_statechange_bits[] = { + 0xfe, 0x01, 0x02, 0x03, 0x02, 0x05, 0x02, 0x09, 0x02, 0x1f, 0x62, 0x10, + 0x62, 0x10, 0xba, 0x11, 0xba, 0x11, 0x62, 0x10, 0x62, 0x10, 0x02, 0x10, + 0x02, 0x10, 0x02, 0x10, 0xfe, 0x1f}; +} -maskdata $filemask + +set ui_index .vpane.files.index.list +set ui_workdir .vpane.files.workdir.list + +set all_icons(_$ui_index) file_plain +set all_icons(A$ui_index) file_plain +set all_icons(M$ui_index) file_fulltick +set all_icons(D$ui_index) file_removed +set all_icons(U$ui_index) file_merge +set all_icons(T$ui_index) file_statechange + +set all_icons(_$ui_workdir) file_plain +set all_icons(M$ui_workdir) file_mod +set all_icons(D$ui_workdir) file_question +set all_icons(U$ui_workdir) file_merge +set all_icons(O$ui_workdir) file_plain +set all_icons(T$ui_workdir) file_statechange + +set max_status_desc 0 +foreach i { + {__ {mc "Unmodified"}} + + {_M {mc "Modified, not staged"}} + {M_ {mc "Staged for commit"}} + {MM {mc "Portions staged for commit"}} + {MD {mc "Staged for commit, missing"}} + + {_T {mc "File type changed, not staged"}} + {MT {mc "File type changed, old type staged for commit"}} + {AT {mc "File type changed, old type staged for commit"}} + {T_ {mc "File type changed, staged"}} + {TM {mc "File type change staged, modification not staged"}} + {TD {mc "File type change staged, file missing"}} + + {_O {mc "Untracked, not staged"}} + {A_ {mc "Staged for commit"}} + {AM {mc "Portions staged for commit"}} + {AD {mc "Staged for commit, missing"}} + + {_D {mc "Missing"}} + {D_ {mc "Staged for removal"}} + {DO {mc "Staged for removal, still present"}} + + {_U {mc "Requires merge resolution"}} + {U_ {mc "Requires merge resolution"}} + {UU {mc "Requires merge resolution"}} + {UM {mc "Requires merge resolution"}} + {UD {mc "Requires merge resolution"}} + {UT {mc "Requires merge resolution"}} + } { + set text [eval [lindex $i 1]] + if {$max_status_desc < [string length $text]} { + set max_status_desc [string length $text] + } + set all_descs([lindex $i 0]) $text +} +unset i + +###################################################################### +## +## util + +proc scrollbar2many {list mode args} { + foreach w $list {eval $w $mode $args} +} + +proc many2scrollbar {list mode sb top bottom} { + $sb set $top $bottom + foreach w $list {$w $mode moveto $top} +} + +proc incr_font_size {font {amt 1}} { + set sz [font configure $font -size] + incr sz $amt + font configure $font -size $sz + font configure ${font}bold -size $sz + font configure ${font}italic -size $sz +} + +###################################################################### +## +## ui commands + +set starting_gitk_msg [mc "Starting gitk... please wait..."] + +proc do_gitk {revs {is_submodule false}} { + global current_diff_path file_states current_diff_side ui_index + global _gitdir _gitworktree + + # -- Always start gitk through whatever we were loaded with. This + # lets us bypass using shell process on Windows systems. + # + set exe [_which gitk -script] + set cmd [list [info nameofexecutable] $exe] + if {$exe eq {}} { + error_popup [mc "Couldn't find gitk in PATH"] + } else { + global env + + set pwd [pwd] + + if {!$is_submodule} { + if {![is_bare]} { + cd $_gitworktree + } + } else { + cd $current_diff_path + if {$revs eq {--}} { + set s $file_states($current_diff_path) + set old_sha1 {} + set new_sha1 {} + switch -glob -- [lindex $s 0] { + M_ { set old_sha1 [lindex [lindex $s 2] 1] } + _M { set old_sha1 [lindex [lindex $s 3] 1] } + MM { + if {$current_diff_side eq $ui_index} { + set old_sha1 [lindex [lindex $s 2] 1] + set new_sha1 [lindex [lindex $s 3] 1] + } else { + set old_sha1 [lindex [lindex $s 3] 1] + } + } + } + set revs $old_sha1...$new_sha1 + } + # GIT_DIR and GIT_WORK_TREE for the submodule are not the ones + # we've been using for the main repository, so unset them. + # TODO we could make life easier (start up faster?) for gitk + # by setting these to the appropriate values to allow gitk + # to skip the heuristics to find their proper value + unset env(GIT_DIR) + unset env(GIT_WORK_TREE) + } + eval exec $cmd $revs "--" "--" & + + set env(GIT_DIR) $_gitdir + set env(GIT_WORK_TREE) $_gitworktree + cd $pwd + + ui_status $::starting_gitk_msg + after 10000 { + ui_ready $starting_gitk_msg + } + } +} + +proc do_git_gui {} { + global current_diff_path + + # -- Always start git gui through whatever we were loaded with. This + # lets us bypass using shell process on Windows systems. + # + set exe [list [_which git]] + if {$exe eq {}} { + error_popup [mc "Couldn't find git gui in PATH"] + } else { + global env + global _gitdir _gitworktree + + # see note in do_gitk about unsetting these vars when + # running tools in a submodule + unset env(GIT_DIR) + unset env(GIT_WORK_TREE) + + set pwd [pwd] + cd $current_diff_path + + eval exec $exe gui & + + set env(GIT_DIR) $_gitdir + set env(GIT_WORK_TREE) $_gitworktree + cd $pwd + + ui_status $::starting_gitk_msg + after 10000 { + ui_ready $starting_gitk_msg + } + } +} + +proc do_explore {} { + global _gitworktree + set explorer {} + if {[is_Cygwin] || [is_Windows]} { + set explorer "explorer.exe" + } elseif {[is_MacOSX]} { + set explorer "open" + } else { + # freedesktop.org-conforming system is our best shot + set explorer "xdg-open" + } + eval exec $explorer [list [file nativename $_gitworktree]] & +} + +set is_quitting 0 +set ret_code 1 + +proc terminate_me {win} { + global ret_code + if {$win ne {.}} return + exit $ret_code +} + +proc do_quit {{rc {1}}} { + global ui_comm is_quitting repo_config commit_type + global GITGUI_BCK_exists GITGUI_BCK_i + global ui_comm_spell + global ret_code use_ttk + + if {$is_quitting} return + set is_quitting 1 + + if {[winfo exists $ui_comm]} { + # -- Stash our current commit buffer. + # + set save [gitdir GITGUI_MSG] + if {$GITGUI_BCK_exists && ![$ui_comm edit modified]} { + file rename -force [gitdir GITGUI_BCK] $save + set GITGUI_BCK_exists 0 + } else { + set msg [string trim [$ui_comm get 0.0 end]] + regsub -all -line {[ \r\t]+$} $msg {} msg + if {(![string match amend* $commit_type] + || [$ui_comm edit modified]) + && $msg ne {}} { + catch { + set fd [open $save w] + fconfigure $fd -encoding utf-8 + puts -nonewline $fd $msg + close $fd + } + } else { + catch {file delete $save} + } + } + + # -- Cancel our spellchecker if its running. + # + if {[info exists ui_comm_spell]} { + $ui_comm_spell stop + } + + # -- Remove our editor backup, its not needed. + # + after cancel $GITGUI_BCK_i + if {$GITGUI_BCK_exists} { + catch {file delete [gitdir GITGUI_BCK]} + } + + # -- Stash our current window geometry into this repository. + # + set cfg_wmstate [wm state .] + if {[catch {set rc_wmstate $repo_config(gui.wmstate)}]} { + set rc_wmstate {} + } + if {$cfg_wmstate ne $rc_wmstate} { + catch {git config gui.wmstate $cfg_wmstate} + } + if {$cfg_wmstate eq {zoomed}} { + # on Windows wm geometry will lie about window + # position (but not size) when window is zoomed + # restore the window before querying wm geometry + wm state . normal + } + set cfg_geometry [list] + lappend cfg_geometry [wm geometry .] + if {$use_ttk} { + lappend cfg_geometry [.vpane sashpos 0] + lappend cfg_geometry [.vpane.files sashpos 0] + } else { + lappend cfg_geometry [lindex [.vpane sash coord 0] 0] + lappend cfg_geometry [lindex [.vpane.files sash coord 0] 1] + } + if {[catch {set rc_geometry $repo_config(gui.geometry)}]} { + set rc_geometry {} + } + if {$cfg_geometry ne $rc_geometry} { + catch {git config gui.geometry $cfg_geometry} + } + } + + set ret_code $rc + + # Briefly enable send again, working around Tk bug + # http://sourceforge.net/tracker/?func=detail&atid=112997&aid=1821174&group_id=12997 + tk appname [appname] + + destroy . +} + +proc do_rescan {} { + rescan ui_ready +} + +proc ui_do_rescan {} { + rescan {force_first_diff ui_ready} +} + +proc do_commit {} { + commit_tree +} + +proc next_diff {{after {}}} { + global next_diff_p next_diff_w next_diff_i + show_diff $next_diff_p $next_diff_w {} {} $after +} + +proc find_anchor_pos {lst name} { + set lid [lsearch -sorted -exact $lst $name] + + if {$lid == -1} { + set lid 0 + foreach lname $lst { + if {$lname >= $name} break + incr lid + } + } + + return $lid +} + +proc find_file_from {flist idx delta path mmask} { + global file_states + + set len [llength $flist] + while {$idx >= 0 && $idx < $len} { + set name [lindex $flist $idx] + + if {$name ne $path && [info exists file_states($name)]} { + set state [lindex $file_states($name) 0] + + if {$mmask eq {} || [regexp $mmask $state]} { + return $idx + } + } + + incr idx $delta + } + + return {} +} + +proc find_next_diff {w path {lno {}} {mmask {}}} { + global next_diff_p next_diff_w next_diff_i + global file_lists ui_index ui_workdir + + set flist $file_lists($w) + if {$lno eq {}} { + set lno [find_anchor_pos $flist $path] + } else { + incr lno -1 + } + + if {$mmask ne {} && ![regexp {(^\^)|(\$$)} $mmask]} { + if {$w eq $ui_index} { + set mmask "^$mmask" + } else { + set mmask "$mmask\$" + } + } + + set idx [find_file_from $flist $lno 1 $path $mmask] + if {$idx eq {}} { + incr lno -1 + set idx [find_file_from $flist $lno -1 $path $mmask] + } + + if {$idx ne {}} { + set next_diff_w $w + set next_diff_p [lindex $flist $idx] + set next_diff_i [expr {$idx+1}] + return 1 + } else { + return 0 + } +} + +proc next_diff_after_action {w path {lno {}} {mmask {}}} { + global current_diff_path + + if {$path ne $current_diff_path} { + return {} + } elseif {[find_next_diff $w $path $lno $mmask]} { + return {next_diff;} + } else { + return {reshow_diff;} + } +} + +proc select_first_diff {after} { + global ui_workdir + + if {[find_next_diff $ui_workdir {} 1 {^_?U}] || + [find_next_diff $ui_workdir {} 1 {[^O]$}]} { + next_diff $after + } else { + uplevel #0 $after + } +} + +proc force_first_diff {after} { + global ui_workdir current_diff_path file_states + + if {[info exists file_states($current_diff_path)]} { + set state [lindex $file_states($current_diff_path) 0] + } else { + set state {OO} + } + + set reselect 0 + if {[string first {U} $state] >= 0} { + # Already a conflict, do nothing + } elseif {[find_next_diff $ui_workdir $current_diff_path {} {^_?U}]} { + set reselect 1 + } elseif {[string index $state 1] ne {O}} { + # Already a diff & no conflicts, do nothing + } elseif {[find_next_diff $ui_workdir $current_diff_path {} {[^O]$}]} { + set reselect 1 + } + + if {$reselect} { + next_diff $after + } else { + uplevel #0 $after + } +} + +proc toggle_or_diff {w x y} { + global file_states file_lists current_diff_path ui_index ui_workdir + global last_clicked selected_paths + + set pos [split [$w index @$x,$y] .] + set lno [lindex $pos 0] + set col [lindex $pos 1] + set path [lindex $file_lists($w) [expr {$lno - 1}]] + if {$path eq {}} { + set last_clicked {} + return + } + + set last_clicked [list $w $lno] + array unset selected_paths + $ui_index tag remove in_sel 0.0 end + $ui_workdir tag remove in_sel 0.0 end + + # Determine the state of the file + if {[info exists file_states($path)]} { + set state [lindex $file_states($path) 0] + } else { + set state {__} + } + + # Restage the file, or simply show the diff + if {$col == 0 && $y > 1} { + # Conflicts need special handling + if {[string first {U} $state] >= 0} { + # $w must always be $ui_workdir, but... + if {$w ne $ui_workdir} { set lno {} } + merge_stage_workdir $path $lno + return + } + + if {[string index $state 1] eq {O}} { + set mmask {} + } else { + set mmask {[^O]} + } + + set after [next_diff_after_action $w $path $lno $mmask] + + if {$w eq $ui_index} { + update_indexinfo \ + "Unstaging [short_path $path] from commit" \ + [list $path] \ + [concat $after [list ui_ready]] + } elseif {$w eq $ui_workdir} { + update_index \ + "Adding [short_path $path]" \ + [list $path] \ + [concat $after [list ui_ready]] + } + } else { + set selected_paths($path) 1 + show_diff $path $w $lno + } +} + +proc add_one_to_selection {w x y} { + global file_lists last_clicked selected_paths + + set lno [lindex [split [$w index @$x,$y] .] 0] + set path [lindex $file_lists($w) [expr {$lno - 1}]] + if {$path eq {}} { + set last_clicked {} + return + } + + if {$last_clicked ne {} + && [lindex $last_clicked 0] ne $w} { + array unset selected_paths + [lindex $last_clicked 0] tag remove in_sel 0.0 end + } + + set last_clicked [list $w $lno] + if {[catch {set in_sel $selected_paths($path)}]} { + set in_sel 0 + } + if {$in_sel} { + unset selected_paths($path) + $w tag remove in_sel $lno.0 [expr {$lno + 1}].0 + } else { + set selected_paths($path) 1 + $w tag add in_sel $lno.0 [expr {$lno + 1}].0 + } +} + +proc add_range_to_selection {w x y} { + global file_lists last_clicked selected_paths + + if {[lindex $last_clicked 0] ne $w} { + toggle_or_diff $w $x $y + return + } + + set lno [lindex [split [$w index @$x,$y] .] 0] + set lc [lindex $last_clicked 1] + if {$lc < $lno} { + set begin $lc + set end $lno + } else { + set begin $lno + set end $lc + } + + foreach path [lrange $file_lists($w) \ + [expr {$begin - 1}] \ + [expr {$end - 1}]] { + set selected_paths($path) 1 + } + $w tag add in_sel $begin.0 [expr {$end + 1}].0 +} + +proc show_more_context {} { + global repo_config + if {$repo_config(gui.diffcontext) < 99} { + incr repo_config(gui.diffcontext) + reshow_diff + } +} + +proc show_less_context {} { + global repo_config + if {$repo_config(gui.diffcontext) > 1} { + incr repo_config(gui.diffcontext) -1 + reshow_diff + } +} + +###################################################################### +## +## ui construction + +set ui_comm {} + +# -- Menu Bar +# +menu .mbar -tearoff 0 +if {[is_MacOSX]} { + # -- Apple Menu (Mac OS X only) + # + .mbar add cascade -label Apple -menu .mbar.apple + menu .mbar.apple +} +.mbar add cascade -label [mc Repository] -menu .mbar.repository +.mbar add cascade -label [mc Edit] -menu .mbar.edit +if {[is_enabled branch]} { + .mbar add cascade -label [mc Branch] -menu .mbar.branch +} +if {[is_enabled multicommit] || [is_enabled singlecommit]} { + .mbar add cascade -label [mc Commit@@noun] -menu .mbar.commit +} +if {[is_enabled transport]} { + .mbar add cascade -label [mc Merge] -menu .mbar.merge + .mbar add cascade -label [mc Remote] -menu .mbar.remote +} +if {[is_enabled multicommit] || [is_enabled singlecommit]} { + .mbar add cascade -label [mc Tools] -menu .mbar.tools +} + +# -- Repository Menu +# +menu .mbar.repository + +if {![is_bare]} { + .mbar.repository add command \ + -label [mc "Explore Working Copy"] \ + -command {do_explore} +} + +if {[is_Windows]} { + .mbar.repository add command \ + -label [mc "Git Bash"] \ + -command {eval exec [auto_execok start] \ + [list "Git Bash" bash --login -l &]} +} + +if {[is_Windows] || ![is_bare]} { + .mbar.repository add separator +} + +.mbar.repository add command \ + -label [mc "Browse Current Branch's Files"] \ + -command {browser::new $current_branch} +set ui_browse_current [.mbar.repository index last] +.mbar.repository add command \ + -label [mc "Browse Branch Files..."] \ + -command browser_open::dialog +.mbar.repository add separator + +.mbar.repository add command \ + -label [mc "Visualize Current Branch's History"] \ + -command {do_gitk $current_branch} +set ui_visualize_current [.mbar.repository index last] +.mbar.repository add command \ + -label [mc "Visualize All Branch History"] \ + -command {do_gitk --all} +.mbar.repository add separator + +proc current_branch_write {args} { + global current_branch + .mbar.repository entryconf $::ui_browse_current \ + -label [mc "Browse %s's Files" $current_branch] + .mbar.repository entryconf $::ui_visualize_current \ + -label [mc "Visualize %s's History" $current_branch] +} +trace add variable current_branch write current_branch_write + +if {[is_enabled multicommit]} { + .mbar.repository add command -label [mc "Database Statistics"] \ + -command do_stats + + .mbar.repository add command -label [mc "Compress Database"] \ + -command do_gc + + .mbar.repository add command -label [mc "Verify Database"] \ + -command do_fsck_objects + + .mbar.repository add separator + + if {[is_Cygwin]} { + .mbar.repository add command \ + -label [mc "Create Desktop Icon"] \ + -command do_cygwin_shortcut + } elseif {[is_Windows]} { + .mbar.repository add command \ + -label [mc "Create Desktop Icon"] \ + -command do_windows_shortcut + } elseif {[is_MacOSX]} { + .mbar.repository add command \ + -label [mc "Create Desktop Icon"] \ + -command do_macosx_app + } +} + +if {[is_MacOSX]} { + proc ::tk::mac::Quit {args} { do_quit } +} else { + .mbar.repository add command -label [mc Quit] \ + -command do_quit \ + -accelerator $M1T-Q +} + +# -- Edit Menu +# +menu .mbar.edit +.mbar.edit add command -label [mc Undo] \ + -command {catch {[focus] edit undo}} \ + -accelerator $M1T-Z +.mbar.edit add command -label [mc Redo] \ + -command {catch {[focus] edit redo}} \ + -accelerator $M1T-Y +.mbar.edit add separator +.mbar.edit add command -label [mc Cut] \ + -command {catch {tk_textCut [focus]}} \ + -accelerator $M1T-X +.mbar.edit add command -label [mc Copy] \ + -command {catch {tk_textCopy [focus]}} \ + -accelerator $M1T-C +.mbar.edit add command -label [mc Paste] \ + -command {catch {tk_textPaste [focus]; [focus] see insert}} \ + -accelerator $M1T-V +.mbar.edit add command -label [mc Delete] \ + -command {catch {[focus] delete sel.first sel.last}} \ + -accelerator Del +.mbar.edit add separator +.mbar.edit add command -label [mc "Select All"] \ + -command {catch {[focus] tag add sel 0.0 end}} \ + -accelerator $M1T-A + +# -- Branch Menu +# +if {[is_enabled branch]} { + menu .mbar.branch + + .mbar.branch add command -label [mc "Create..."] \ + -command branch_create::dialog \ + -accelerator $M1T-N + lappend disable_on_lock [list .mbar.branch entryconf \ + [.mbar.branch index last] -state] + + .mbar.branch add command -label [mc "Checkout..."] \ + -command branch_checkout::dialog \ + -accelerator $M1T-O + lappend disable_on_lock [list .mbar.branch entryconf \ + [.mbar.branch index last] -state] + + .mbar.branch add command -label [mc "Rename..."] \ + -command branch_rename::dialog + lappend disable_on_lock [list .mbar.branch entryconf \ + [.mbar.branch index last] -state] + + .mbar.branch add command -label [mc "Delete..."] \ + -command branch_delete::dialog + lappend disable_on_lock [list .mbar.branch entryconf \ + [.mbar.branch index last] -state] + + .mbar.branch add command -label [mc "Reset..."] \ + -command merge::reset_hard + lappend disable_on_lock [list .mbar.branch entryconf \ + [.mbar.branch index last] -state] +} + +# -- Commit Menu +# +proc commit_btn_caption {} { + if {[is_enabled nocommit]} { + return [mc "Done"] + } else { + return [mc Commit@@verb] + } +} + +if {[is_enabled multicommit] || [is_enabled singlecommit]} { + menu .mbar.commit + + if {![is_enabled nocommit]} { + .mbar.commit add radiobutton \ + -label [mc "New Commit"] \ + -command do_select_commit_type \ + -variable selected_commit_type \ + -value new + lappend disable_on_lock \ + [list .mbar.commit entryconf [.mbar.commit index last] -state] + + .mbar.commit add radiobutton \ + -label [mc "Amend Last Commit"] \ + -command do_select_commit_type \ + -variable selected_commit_type \ + -value amend + lappend disable_on_lock \ + [list .mbar.commit entryconf [.mbar.commit index last] -state] + + .mbar.commit add separator + } + + .mbar.commit add command -label [mc Rescan] \ + -command ui_do_rescan \ + -accelerator F5 + lappend disable_on_lock \ + [list .mbar.commit entryconf [.mbar.commit index last] -state] + + .mbar.commit add command -label [mc "Stage To Commit"] \ + -command do_add_selection \ + -accelerator $M1T-T + lappend disable_on_lock \ + [list .mbar.commit entryconf [.mbar.commit index last] -state] + + .mbar.commit add command -label [mc "Stage Changed Files To Commit"] \ + -command do_add_all \ + -accelerator $M1T-I + lappend disable_on_lock \ + [list .mbar.commit entryconf [.mbar.commit index last] -state] + + .mbar.commit add command -label [mc "Unstage From Commit"] \ + -command do_unstage_selection \ + -accelerator $M1T-U + lappend disable_on_lock \ + [list .mbar.commit entryconf [.mbar.commit index last] -state] + + .mbar.commit add command -label [mc "Revert Changes"] \ + -command do_revert_selection \ + -accelerator $M1T-J + lappend disable_on_lock \ + [list .mbar.commit entryconf [.mbar.commit index last] -state] + + .mbar.commit add separator + + .mbar.commit add command -label [mc "Show Less Context"] \ + -command show_less_context \ + -accelerator $M1T-\- + + .mbar.commit add command -label [mc "Show More Context"] \ + -command show_more_context \ + -accelerator $M1T-= + + .mbar.commit add separator + + if {![is_enabled nocommitmsg]} { + .mbar.commit add command -label [mc "Sign Off"] \ + -command do_signoff \ + -accelerator $M1T-S + } + + .mbar.commit add command -label [commit_btn_caption] \ + -command do_commit \ + -accelerator $M1T-Return + lappend disable_on_lock \ + [list .mbar.commit entryconf [.mbar.commit index last] -state] +} + +# -- Merge Menu +# +if {[is_enabled branch]} { + menu .mbar.merge + .mbar.merge add command -label [mc "Local Merge..."] \ + -command merge::dialog \ + -accelerator $M1T-M + lappend disable_on_lock \ + [list .mbar.merge entryconf [.mbar.merge index last] -state] + .mbar.merge add command -label [mc "Abort Merge..."] \ + -command merge::reset_hard + lappend disable_on_lock \ + [list .mbar.merge entryconf [.mbar.merge index last] -state] +} + +# -- Transport Menu +# +if {[is_enabled transport]} { + menu .mbar.remote + + .mbar.remote add command \ + -label [mc "Add..."] \ + -command remote_add::dialog \ + -accelerator $M1T-A + .mbar.remote add command \ + -label [mc "Push..."] \ + -command do_push_anywhere \ + -accelerator $M1T-P + .mbar.remote add command \ + -label [mc "Delete Branch..."] \ + -command remote_branch_delete::dialog +} + +if {[is_MacOSX]} { + proc ::tk::mac::ShowPreferences {} {do_options} +} else { + # -- Edit Menu + # + .mbar.edit add separator + .mbar.edit add command -label [mc "Options..."] \ + -command do_options +} + +# -- Tools Menu +# +if {[is_enabled multicommit] || [is_enabled singlecommit]} { + set tools_menubar .mbar.tools + menu $tools_menubar + $tools_menubar add separator + $tools_menubar add command -label [mc "Add..."] -command tools_add::dialog + $tools_menubar add command -label [mc "Remove..."] -command tools_remove::dialog + set tools_tailcnt 3 + if {[array names repo_config guitool.*.cmd] ne {}} { + tools_populate_all + } +} + +# -- Help Menu +# +.mbar add cascade -label [mc Help] -menu .mbar.help +menu .mbar.help + +if {[is_MacOSX]} { + .mbar.apple add command -label [mc "About %s" [appname]] \ + -command do_about + .mbar.apple add separator +} else { + .mbar.help add command -label [mc "About %s" [appname]] \ + -command do_about +} +. configure -menu .mbar + +set doc_path [githtmldir] +if {$doc_path ne {}} { + set doc_path [file join $doc_path index.html] + + if {[is_Cygwin]} { + set doc_path [exec cygpath --mixed $doc_path] + } +} + +if {[file isfile $doc_path]} { + set doc_url "file:$doc_path" +} else { + set doc_url {http://www.kernel.org/pub/software/scm/git/docs/} +} + +proc start_browser {url} { + git "web--browse" $url +} + +.mbar.help add command -label [mc "Online Documentation"] \ + -command [list start_browser $doc_url] + +.mbar.help add command -label [mc "Show SSH Key"] \ + -command do_ssh_key + +unset doc_path doc_url + +# -- Standard bindings +# +wm protocol . WM_DELETE_WINDOW do_quit +bind all <$M1B-Key-q> do_quit +bind all <$M1B-Key-Q> do_quit +bind all <$M1B-Key-w> {destroy [winfo toplevel %W]} +bind all <$M1B-Key-W> {destroy [winfo toplevel %W]} + +set subcommand_args {} +proc usage {} { + set s "usage: $::argv0 $::subcommand $::subcommand_args" + if {[tk windowingsystem] eq "win32"} { + wm withdraw . + tk_messageBox -icon info -message $s \ + -title [mc "Usage"] + } else { + puts stderr $s + } + exit 1 +} + +proc normalize_relpath {path} { + set elements {} + foreach item [file split $path] { + if {$item eq {.}} continue + if {$item eq {..} && [llength $elements] > 0 + && [lindex $elements end] ne {..}} { + set elements [lrange $elements 0 end-1] + continue + } + lappend elements $item + } + return [eval file join $elements] +} + +# -- Not a normal commit type invocation? Do that instead! +# +switch -- $subcommand { +browser - +blame { + if {$subcommand eq "blame"} { + set subcommand_args {[--line=] rev? path} + } else { + set subcommand_args {rev? path} + } + if {$argv eq {}} usage + set head {} + set path {} + set jump_spec {} + set is_path 0 + foreach a $argv { + set p [file join $_prefix $a] + + if {$is_path || [file exists $p]} { + if {$path ne {}} usage + set path [normalize_relpath $p] + break + } elseif {$a eq {--}} { + if {$path ne {}} { + if {$head ne {}} usage + set head $path + set path {} + } + set is_path 1 + } elseif {[regexp {^--line=(\d+)$} $a a lnum]} { + if {$jump_spec ne {} || $head ne {}} usage + set jump_spec [list $lnum] + } elseif {$head eq {}} { + if {$head ne {}} usage + set head $a + set is_path 1 + } else { + usage + } + } + unset is_path + + if {$head ne {} && $path eq {}} { + if {[string index $head 0] eq {/}} { + set path [normalize_relpath $head] + set head {} + } else { + set path [normalize_relpath $_prefix$head] + set head {} + } + } + + if {$head eq {}} { + load_current_branch + } else { + if {[regexp {^[0-9a-f]{1,39}$} $head]} { + if {[catch { + set head [git rev-parse --verify $head] + } err]} { + if {[tk windowingsystem] eq "win32"} { + tk_messageBox -icon error -title [mc Error] -message $err + } else { + puts stderr $err + } + exit 1 + } + } + set current_branch $head + } + + wm deiconify . + switch -- $subcommand { + browser { + if {$jump_spec ne {}} usage + if {$head eq {}} { + if {$path ne {} && [file isdirectory $path]} { + set head $current_branch + } else { + set head $path + set path {} + } + } + browser::new $head $path + } + blame { + if {$head eq {} && ![file exists $path]} { + catch {wm withdraw .} + tk_messageBox \ + -icon error \ + -type ok \ + -title [mc "git-gui: fatal error"] \ + -message [mc "fatal: cannot stat path %s: No such file or directory" $path] + exit 1 + } + blame::new $head $path $jump_spec + } + } + return +} +citool - +gui { + if {[llength $argv] != 0} { + usage + } + # fall through to setup UI for commits +} +default { + set err "usage: $argv0 \[{blame|browser|citool}\]" + if {[tk windowingsystem] eq "win32"} { + wm withdraw . + tk_messageBox -icon error -message $err \ + -title [mc "Usage"] + } else { + puts stderr $err + } + exit 1 +} +} + +# -- Branch Control +# +${NS}::frame .branch +if {!$use_ttk} {.branch configure -borderwidth 1 -relief sunken} +${NS}::label .branch.l1 \ + -text [mc "Current Branch:"] \ + -anchor w \ + -justify left +${NS}::label .branch.cb \ + -textvariable current_branch \ + -anchor w \ + -justify left +pack .branch.l1 -side left +pack .branch.cb -side left -fill x +pack .branch -side top -fill x + +# -- Main Window Layout +# +${NS}::panedwindow .vpane -orient horizontal +${NS}::panedwindow .vpane.files -orient vertical +if {$use_ttk} { + .vpane add .vpane.files +} else { + .vpane add .vpane.files -sticky nsew -height 100 -width 200 +} +pack .vpane -anchor n -side top -fill both -expand 1 + +# -- Index File List +# +${NS}::frame .vpane.files.index -height 100 -width 200 +tlabel .vpane.files.index.title \ + -text [mc "Staged Changes (Will Commit)"] \ + -background lightgreen -foreground black +text $ui_index -background white -foreground black \ + -borderwidth 0 \ + -width 20 -height 10 \ + -wrap none \ + -cursor $cursor_ptr \ + -xscrollcommand {.vpane.files.index.sx set} \ + -yscrollcommand {.vpane.files.index.sy set} \ + -state disabled +${NS}::scrollbar .vpane.files.index.sx -orient h -command [list $ui_index xview] +${NS}::scrollbar .vpane.files.index.sy -orient v -command [list $ui_index yview] +pack .vpane.files.index.title -side top -fill x +pack .vpane.files.index.sx -side bottom -fill x +pack .vpane.files.index.sy -side right -fill y +pack $ui_index -side left -fill both -expand 1 + +# -- Working Directory File List +# +${NS}::frame .vpane.files.workdir -height 100 -width 200 +tlabel .vpane.files.workdir.title -text [mc "Unstaged Changes"] \ + -background lightsalmon -foreground black +text $ui_workdir -background white -foreground black \ + -borderwidth 0 \ + -width 20 -height 10 \ + -wrap none \ + -cursor $cursor_ptr \ + -xscrollcommand {.vpane.files.workdir.sx set} \ + -yscrollcommand {.vpane.files.workdir.sy set} \ + -state disabled +${NS}::scrollbar .vpane.files.workdir.sx -orient h -command [list $ui_workdir xview] +${NS}::scrollbar .vpane.files.workdir.sy -orient v -command [list $ui_workdir yview] +pack .vpane.files.workdir.title -side top -fill x +pack .vpane.files.workdir.sx -side bottom -fill x +pack .vpane.files.workdir.sy -side right -fill y +pack $ui_workdir -side left -fill both -expand 1 + +.vpane.files add .vpane.files.workdir +.vpane.files add .vpane.files.index +if {!$use_ttk} { + .vpane.files paneconfigure .vpane.files.workdir -sticky news + .vpane.files paneconfigure .vpane.files.index -sticky news +} + +foreach i [list $ui_index $ui_workdir] { + rmsel_tag $i + $i tag conf in_diff -background [$i tag cget in_sel -background] +} +unset i + +# -- Diff and Commit Area +# +if {$have_tk85} { + ${NS}::panedwindow .vpane.lower -orient vertical + ${NS}::frame .vpane.lower.commarea + ${NS}::frame .vpane.lower.diff -relief sunken -borderwidth 1 -height 500 + .vpane.lower add .vpane.lower.diff + .vpane.lower add .vpane.lower.commarea + .vpane add .vpane.lower + if {$use_ttk} { + .vpane.lower pane .vpane.lower.diff -weight 1 + .vpane.lower pane .vpane.lower.commarea -weight 0 + } else { + .vpane.lower paneconfigure .vpane.lower.diff -stretch always + .vpane.lower paneconfigure .vpane.lower.commarea -stretch never + } +} else { + frame .vpane.lower -height 300 -width 400 + frame .vpane.lower.commarea + frame .vpane.lower.diff -relief sunken -borderwidth 1 + pack .vpane.lower.diff -fill both -expand 1 + pack .vpane.lower.commarea -side bottom -fill x + .vpane add .vpane.lower + .vpane paneconfigure .vpane.lower -sticky nsew +} + +# -- Commit Area Buttons +# +${NS}::frame .vpane.lower.commarea.buttons +${NS}::label .vpane.lower.commarea.buttons.l -text {} \ + -anchor w \ + -justify left +pack .vpane.lower.commarea.buttons.l -side top -fill x +pack .vpane.lower.commarea.buttons -side left -fill y + +${NS}::button .vpane.lower.commarea.buttons.rescan -text [mc Rescan] \ + -command ui_do_rescan +pack .vpane.lower.commarea.buttons.rescan -side top -fill x +lappend disable_on_lock \ + {.vpane.lower.commarea.buttons.rescan conf -state} + +${NS}::button .vpane.lower.commarea.buttons.incall -text [mc "Stage Changed"] \ + -command do_add_all +pack .vpane.lower.commarea.buttons.incall -side top -fill x +lappend disable_on_lock \ + {.vpane.lower.commarea.buttons.incall conf -state} + +if {![is_enabled nocommitmsg]} { + ${NS}::button .vpane.lower.commarea.buttons.signoff -text [mc "Sign Off"] \ + -command do_signoff + pack .vpane.lower.commarea.buttons.signoff -side top -fill x +} + +${NS}::button .vpane.lower.commarea.buttons.commit -text [commit_btn_caption] \ + -command do_commit +pack .vpane.lower.commarea.buttons.commit -side top -fill x +lappend disable_on_lock \ + {.vpane.lower.commarea.buttons.commit conf -state} + +if {![is_enabled nocommit]} { + ${NS}::button .vpane.lower.commarea.buttons.push -text [mc Push] \ + -command do_push_anywhere + pack .vpane.lower.commarea.buttons.push -side top -fill x +} + +# -- Commit Message Buffer +# +${NS}::frame .vpane.lower.commarea.buffer +${NS}::frame .vpane.lower.commarea.buffer.header +set ui_comm .vpane.lower.commarea.buffer.t +set ui_coml .vpane.lower.commarea.buffer.header.l + +if {![is_enabled nocommit]} { + ${NS}::radiobutton .vpane.lower.commarea.buffer.header.new \ + -text [mc "New Commit"] \ + -command do_select_commit_type \ + -variable selected_commit_type \ + -value new + lappend disable_on_lock \ + [list .vpane.lower.commarea.buffer.header.new conf -state] + ${NS}::radiobutton .vpane.lower.commarea.buffer.header.amend \ + -text [mc "Amend Last Commit"] \ + -command do_select_commit_type \ + -variable selected_commit_type \ + -value amend + lappend disable_on_lock \ + [list .vpane.lower.commarea.buffer.header.amend conf -state] +} + +${NS}::label $ui_coml \ + -anchor w \ + -justify left +proc trace_commit_type {varname args} { + global ui_coml commit_type + switch -glob -- $commit_type { + initial {set txt [mc "Initial Commit Message:"]} + amend {set txt [mc "Amended Commit Message:"]} + amend-initial {set txt [mc "Amended Initial Commit Message:"]} + amend-merge {set txt [mc "Amended Merge Commit Message:"]} + merge {set txt [mc "Merge Commit Message:"]} + * {set txt [mc "Commit Message:"]} + } + $ui_coml conf -text $txt +} +trace add variable commit_type write trace_commit_type +pack $ui_coml -side left -fill x + +if {![is_enabled nocommit]} { + pack .vpane.lower.commarea.buffer.header.amend -side right + pack .vpane.lower.commarea.buffer.header.new -side right +} + +text $ui_comm -background white -foreground black \ + -borderwidth 1 \ + -undo true \ + -maxundo 20 \ + -autoseparators true \ + -relief sunken \ + -width $repo_config(gui.commitmsgwidth) -height 9 -wrap none \ + -font font_diff \ + -yscrollcommand {.vpane.lower.commarea.buffer.sby set} +${NS}::scrollbar .vpane.lower.commarea.buffer.sby \ + -command [list $ui_comm yview] +pack .vpane.lower.commarea.buffer.header -side top -fill x +pack .vpane.lower.commarea.buffer.sby -side right -fill y +pack $ui_comm -side left -fill y +pack .vpane.lower.commarea.buffer -side left -fill y + +# -- Commit Message Buffer Context Menu +# +set ctxm .vpane.lower.commarea.buffer.ctxm +menu $ctxm -tearoff 0 +$ctxm add command \ + -label [mc Cut] \ + -command {tk_textCut $ui_comm} +$ctxm add command \ + -label [mc Copy] \ + -command {tk_textCopy $ui_comm} +$ctxm add command \ + -label [mc Paste] \ + -command {tk_textPaste $ui_comm} +$ctxm add command \ + -label [mc Delete] \ + -command {catch {$ui_comm delete sel.first sel.last}} +$ctxm add separator +$ctxm add command \ + -label [mc "Select All"] \ + -command {focus $ui_comm;$ui_comm tag add sel 0.0 end} +$ctxm add command \ + -label [mc "Copy All"] \ + -command { + $ui_comm tag add sel 0.0 end + tk_textCopy $ui_comm + $ui_comm tag remove sel 0.0 end + } +$ctxm add separator +$ctxm add command \ + -label [mc "Sign Off"] \ + -command do_signoff +set ui_comm_ctxm $ctxm + +# -- Diff Header +# +proc trace_current_diff_path {varname args} { + global current_diff_path diff_actions file_states + if {$current_diff_path eq {}} { + set s {} + set f {} + set p {} + set o disabled + } else { + set p $current_diff_path + set s [mapdesc [lindex $file_states($p) 0] $p] + set f [mc "File:"] + set p [escape_path $p] + set o normal + } + + .vpane.lower.diff.header.status configure -text $s + .vpane.lower.diff.header.file configure -text $f + .vpane.lower.diff.header.path configure -text $p + foreach w $diff_actions { + uplevel #0 $w $o + } +} +trace add variable current_diff_path write trace_current_diff_path + +gold_frame .vpane.lower.diff.header +tlabel .vpane.lower.diff.header.status \ + -background gold \ + -foreground black \ + -width $max_status_desc \ + -anchor w \ + -justify left +tlabel .vpane.lower.diff.header.file \ + -background gold \ + -foreground black \ + -anchor w \ + -justify left +tlabel .vpane.lower.diff.header.path \ + -background gold \ + -foreground black \ + -anchor w \ + -justify left +pack .vpane.lower.diff.header.status -side left +pack .vpane.lower.diff.header.file -side left +pack .vpane.lower.diff.header.path -fill x +set ctxm .vpane.lower.diff.header.ctxm +menu $ctxm -tearoff 0 +$ctxm add command \ + -label [mc Copy] \ + -command { + clipboard clear + clipboard append \ + -format STRING \ + -type STRING \ + -- $current_diff_path + } +lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] +bind_button3 .vpane.lower.diff.header.path "tk_popup $ctxm %X %Y" + +# -- Diff Body +# +${NS}::frame .vpane.lower.diff.body +set ui_diff .vpane.lower.diff.body.t +text $ui_diff -background white -foreground black \ + -borderwidth 0 \ + -width 80 -height 5 -wrap none \ + -font font_diff \ + -xscrollcommand {.vpane.lower.diff.body.sbx set} \ + -yscrollcommand {.vpane.lower.diff.body.sby set} \ + -state disabled +catch {$ui_diff configure -tabstyle wordprocessor} +${NS}::scrollbar .vpane.lower.diff.body.sbx -orient horizontal \ + -command [list $ui_diff xview] +${NS}::scrollbar .vpane.lower.diff.body.sby -orient vertical \ + -command [list $ui_diff yview] +pack .vpane.lower.diff.body.sbx -side bottom -fill x +pack .vpane.lower.diff.body.sby -side right -fill y +pack $ui_diff -side left -fill both -expand 1 +pack .vpane.lower.diff.header -side top -fill x +pack .vpane.lower.diff.body -side bottom -fill both -expand 1 + +foreach {n c} {0 black 1 red4 2 green4 3 yellow4 4 blue4 5 magenta4 6 cyan4 7 grey60} { + $ui_diff tag configure clr4$n -background $c + $ui_diff tag configure clri4$n -foreground $c + $ui_diff tag configure clr3$n -foreground $c + $ui_diff tag configure clri3$n -background $c +} +$ui_diff tag configure clr1 -font font_diffbold +$ui_diff tag configure clr4 -underline 1 + +$ui_diff tag conf d_info -foreground blue -font font_diffbold + +$ui_diff tag conf d_cr -elide true +$ui_diff tag conf d_@ -font font_diffbold +$ui_diff tag conf d_+ -foreground {#00a000} +$ui_diff tag conf d_- -foreground red + +$ui_diff tag conf d_++ -foreground {#00a000} +$ui_diff tag conf d_-- -foreground red +$ui_diff tag conf d_+s \ + -foreground {#00a000} \ + -background {#e2effa} +$ui_diff tag conf d_-s \ + -foreground red \ + -background {#e2effa} +$ui_diff tag conf d_s+ \ + -foreground {#00a000} \ + -background ivory1 +$ui_diff tag conf d_s- \ + -foreground red \ + -background ivory1 + +$ui_diff tag conf d< \ + -foreground orange \ + -font font_diffbold +$ui_diff tag conf d= \ + -foreground orange \ + -font font_diffbold +$ui_diff tag conf d> \ + -foreground orange \ + -font font_diffbold + +$ui_diff tag raise sel + +# -- Diff Body Context Menu +# + +proc create_common_diff_popup {ctxm} { + $ctxm add command \ + -label [mc Refresh] \ + -command reshow_diff + lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] + $ctxm add command \ + -label [mc Copy] \ + -command {tk_textCopy $ui_diff} + lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] + $ctxm add command \ + -label [mc "Select All"] \ + -command {focus $ui_diff;$ui_diff tag add sel 0.0 end} + lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] + $ctxm add command \ + -label [mc "Copy All"] \ + -command { + $ui_diff tag add sel 0.0 end + tk_textCopy $ui_diff + $ui_diff tag remove sel 0.0 end + } + lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] + $ctxm add separator + $ctxm add command \ + -label [mc "Decrease Font Size"] \ + -command {incr_font_size font_diff -1} + lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] + $ctxm add command \ + -label [mc "Increase Font Size"] \ + -command {incr_font_size font_diff 1} + lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] + $ctxm add separator + set emenu $ctxm.enc + menu $emenu + build_encoding_menu $emenu [list force_diff_encoding] + $ctxm add cascade \ + -label [mc "Encoding"] \ + -menu $emenu + lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] + $ctxm add separator + $ctxm add command -label [mc "Options..."] \ + -command do_options +} + +set ctxm .vpane.lower.diff.body.ctxm +menu $ctxm -tearoff 0 +$ctxm add command \ + -label [mc "Apply/Reverse Hunk"] \ + -command {apply_hunk $cursorX $cursorY} +set ui_diff_applyhunk [$ctxm index last] +lappend diff_actions [list $ctxm entryconf $ui_diff_applyhunk -state] +$ctxm add command \ + -label [mc "Apply/Reverse Line"] \ + -command {apply_range_or_line $cursorX $cursorY; do_rescan} +set ui_diff_applyline [$ctxm index last] +lappend diff_actions [list $ctxm entryconf $ui_diff_applyline -state] +$ctxm add separator +$ctxm add command \ + -label [mc "Show Less Context"] \ + -command show_less_context +lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] +$ctxm add command \ + -label [mc "Show More Context"] \ + -command show_more_context +lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] +$ctxm add separator +create_common_diff_popup $ctxm + +set ctxmmg .vpane.lower.diff.body.ctxmmg +menu $ctxmmg -tearoff 0 +$ctxmmg add command \ + -label [mc "Run Merge Tool"] \ + -command {merge_resolve_tool} +lappend diff_actions [list $ctxmmg entryconf [$ctxmmg index last] -state] +$ctxmmg add separator +$ctxmmg add command \ + -label [mc "Use Remote Version"] \ + -command {merge_resolve_one 3} +lappend diff_actions [list $ctxmmg entryconf [$ctxmmg index last] -state] +$ctxmmg add command \ + -label [mc "Use Local Version"] \ + -command {merge_resolve_one 2} +lappend diff_actions [list $ctxmmg entryconf [$ctxmmg index last] -state] +$ctxmmg add command \ + -label [mc "Revert To Base"] \ + -command {merge_resolve_one 1} +lappend diff_actions [list $ctxmmg entryconf [$ctxmmg index last] -state] +$ctxmmg add separator +$ctxmmg add command \ + -label [mc "Show Less Context"] \ + -command show_less_context +lappend diff_actions [list $ctxmmg entryconf [$ctxmmg index last] -state] +$ctxmmg add command \ + -label [mc "Show More Context"] \ + -command show_more_context +lappend diff_actions [list $ctxmmg entryconf [$ctxmmg index last] -state] +$ctxmmg add separator +create_common_diff_popup $ctxmmg + +set ctxmsm .vpane.lower.diff.body.ctxmsm +menu $ctxmsm -tearoff 0 +$ctxmsm add command \ + -label [mc "Visualize These Changes In The Submodule"] \ + -command {do_gitk -- true} +lappend diff_actions [list $ctxmsm entryconf [$ctxmsm index last] -state] +$ctxmsm add command \ + -label [mc "Visualize Current Branch History In The Submodule"] \ + -command {do_gitk {} true} +lappend diff_actions [list $ctxmsm entryconf [$ctxmsm index last] -state] +$ctxmsm add command \ + -label [mc "Visualize All Branch History In The Submodule"] \ + -command {do_gitk --all true} +lappend diff_actions [list $ctxmsm entryconf [$ctxmsm index last] -state] +$ctxmsm add separator +$ctxmsm add command \ + -label [mc "Start git gui In The Submodule"] \ + -command {do_git_gui} +lappend diff_actions [list $ctxmsm entryconf [$ctxmsm index last] -state] +$ctxmsm add separator +create_common_diff_popup $ctxmsm + +proc has_textconv {path} { + if {[is_config_false gui.textconv]} { + return 0 + } + set filter [gitattr $path diff set] + set textconv [get_config [join [list diff $filter textconv] .]] + if {$filter ne {set} && $textconv ne {}} { + return 1 + } else { + return 0 + } +} + +proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} { + global current_diff_path file_states + set ::cursorX $x + set ::cursorY $y + if {[info exists file_states($current_diff_path)]} { + set state [lindex $file_states($current_diff_path) 0] + } else { + set state {__} + } + if {[string first {U} $state] >= 0} { + tk_popup $ctxmmg $X $Y + } elseif {$::is_submodule_diff} { + tk_popup $ctxmsm $X $Y + } else { + set has_range [expr {[$::ui_diff tag nextrange sel 0.0] != {}}] + if {$::ui_index eq $::current_diff_side} { + set l [mc "Unstage Hunk From Commit"] + if {$has_range} { + set t [mc "Unstage Lines From Commit"] + } else { + set t [mc "Unstage Line From Commit"] + } + } else { + set l [mc "Stage Hunk For Commit"] + if {$has_range} { + set t [mc "Stage Lines For Commit"] + } else { + set t [mc "Stage Line For Commit"] + } + } + if {$::is_3way_diff + || $current_diff_path eq {} + || {__} eq $state + || {_O} eq $state + || [string match {?T} $state] + || [string match {T?} $state] + || [has_textconv $current_diff_path]} { + set s disabled + } else { + set s normal + } + $ctxm entryconf $::ui_diff_applyhunk -state $s -label $l + $ctxm entryconf $::ui_diff_applyline -state $s -label $t + tk_popup $ctxm $X $Y + } +} +bind_button3 $ui_diff [list popup_diff_menu $ctxm $ctxmmg $ctxmsm %x %y %X %Y] + +# -- Status Bar +# +set main_status [::status_bar::new .status] +pack .status -anchor w -side bottom -fill x +$main_status show [mc "Initializing..."] + +# -- Load geometry +# +proc on_ttk_pane_mapped {w pane pos} { + bind $w {} + after 0 [list after idle [list $w sashpos $pane $pos]] +} +proc on_tk_pane_mapped {w pane x y} { + bind $w {} + after 0 [list after idle [list $w sash place $pane $x $y]] +} +proc on_application_mapped {} { + global repo_config use_ttk + bind . {} + set gm $repo_config(gui.geometry) + if {$use_ttk} { + bind .vpane \ + [list on_ttk_pane_mapped %W 0 [lindex $gm 1]] + bind .vpane.files \ + [list on_ttk_pane_mapped %W 0 [lindex $gm 2]] + } else { + bind .vpane \ + [list on_tk_pane_mapped %W 0 \ + [lindex $gm 1] \ + [lindex [.vpane sash coord 0] 1]] + bind .vpane.files \ + [list on_tk_pane_mapped %W 0 \ + [lindex [.vpane.files sash coord 0] 0] \ + [lindex $gm 2]] + } + wm geometry . [lindex $gm 0] +} +if {[info exists repo_config(gui.geometry)]} { + bind . [list on_application_mapped] + wm geometry . [lindex $repo_config(gui.geometry) 0] +} + +# -- Load window state +# +if {[info exists repo_config(gui.wmstate)]} { + catch {wm state . $repo_config(gui.wmstate)} +} + +# -- Key Bindings +# +bind $ui_comm <$M1B-Key-Return> {do_commit;break} +bind $ui_comm <$M1B-Key-t> {do_add_selection;break} +bind $ui_comm <$M1B-Key-T> {do_add_selection;break} +bind $ui_comm <$M1B-Key-u> {do_unstage_selection;break} +bind $ui_comm <$M1B-Key-U> {do_unstage_selection;break} +bind $ui_comm <$M1B-Key-j> {do_revert_selection;break} +bind $ui_comm <$M1B-Key-J> {do_revert_selection;break} +bind $ui_comm <$M1B-Key-i> {do_add_all;break} +bind $ui_comm <$M1B-Key-I> {do_add_all;break} +bind $ui_comm <$M1B-Key-x> {tk_textCut %W;break} +bind $ui_comm <$M1B-Key-X> {tk_textCut %W;break} +bind $ui_comm <$M1B-Key-c> {tk_textCopy %W;break} +bind $ui_comm <$M1B-Key-C> {tk_textCopy %W;break} +bind $ui_comm <$M1B-Key-v> {tk_textPaste %W; %W see insert; break} +bind $ui_comm <$M1B-Key-V> {tk_textPaste %W; %W see insert; break} +bind $ui_comm <$M1B-Key-a> {%W tag add sel 0.0 end;break} +bind $ui_comm <$M1B-Key-A> {%W tag add sel 0.0 end;break} +bind $ui_comm <$M1B-Key-minus> {show_less_context;break} +bind $ui_comm <$M1B-Key-KP_Subtract> {show_less_context;break} +bind $ui_comm <$M1B-Key-equal> {show_more_context;break} +bind $ui_comm <$M1B-Key-plus> {show_more_context;break} +bind $ui_comm <$M1B-Key-KP_Add> {show_more_context;break} + +bind $ui_diff <$M1B-Key-x> {tk_textCopy %W;break} +bind $ui_diff <$M1B-Key-X> {tk_textCopy %W;break} +bind $ui_diff <$M1B-Key-c> {tk_textCopy %W;break} +bind $ui_diff <$M1B-Key-C> {tk_textCopy %W;break} +bind $ui_diff <$M1B-Key-v> {break} +bind $ui_diff <$M1B-Key-V> {break} +bind $ui_diff <$M1B-Key-a> {%W tag add sel 0.0 end;break} +bind $ui_diff <$M1B-Key-A> {%W tag add sel 0.0 end;break} +bind $ui_diff <$M1B-Key-j> {do_revert_selection;break} +bind $ui_diff <$M1B-Key-J> {do_revert_selection;break} +bind $ui_diff {catch {%W yview scroll -1 units};break} +bind $ui_diff {catch {%W yview scroll 1 units};break} +bind $ui_diff {catch {%W xview scroll -1 units};break} +bind $ui_diff {catch {%W xview scroll 1 units};break} +bind $ui_diff {catch {%W yview scroll -1 units};break} +bind $ui_diff {catch {%W yview scroll 1 units};break} +bind $ui_diff {catch {%W xview scroll -1 units};break} +bind $ui_diff {catch {%W xview scroll 1 units};break} +bind $ui_diff {catch {%W yview scroll -1 pages};break} +bind $ui_diff {catch {%W yview scroll 1 pages};break} +bind $ui_diff {focus %W} + +if {[is_enabled branch]} { + bind . <$M1B-Key-n> branch_create::dialog + bind . <$M1B-Key-N> branch_create::dialog + bind . <$M1B-Key-o> branch_checkout::dialog + bind . <$M1B-Key-O> branch_checkout::dialog + bind . <$M1B-Key-m> merge::dialog + bind . <$M1B-Key-M> merge::dialog +} +if {[is_enabled transport]} { + bind . <$M1B-Key-p> do_push_anywhere + bind . <$M1B-Key-P> do_push_anywhere +} + +bind . ui_do_rescan +bind . <$M1B-Key-r> ui_do_rescan +bind . <$M1B-Key-R> ui_do_rescan +bind . <$M1B-Key-s> do_signoff +bind . <$M1B-Key-S> do_signoff +bind . <$M1B-Key-t> do_add_selection +bind . <$M1B-Key-T> do_add_selection +bind . <$M1B-Key-u> do_unstage_selection +bind . <$M1B-Key-U> do_unstage_selection +bind . <$M1B-Key-j> do_revert_selection +bind . <$M1B-Key-J> do_revert_selection +bind . <$M1B-Key-i> do_add_all +bind . <$M1B-Key-I> do_add_all +bind . <$M1B-Key-minus> {show_less_context;break} +bind . <$M1B-Key-KP_Subtract> {show_less_context;break} +bind . <$M1B-Key-equal> {show_more_context;break} +bind . <$M1B-Key-plus> {show_more_context;break} +bind . <$M1B-Key-KP_Add> {show_more_context;break} +bind . <$M1B-Key-Return> do_commit +foreach i [list $ui_index $ui_workdir] { + bind $i "toggle_or_diff $i %x %y; break" + bind $i <$M1B-Button-1> "add_one_to_selection $i %x %y; break" + bind $i "add_range_to_selection $i %x %y; break" +} +unset i + +set file_lists($ui_index) [list] +set file_lists($ui_workdir) [list] + +wm title . "[appname] ([reponame]) [file normalize $_gitworktree]" +focus -force $ui_comm + +# -- Warn the user about environmental problems. Cygwin's Tcl +# does *not* pass its env array onto any processes it spawns. +# This means that git processes get none of our environment. +# +if {[is_Cygwin]} { + set ignored_env 0 + set suggest_user {} + set msg [mc "Possible environment issues exist. + +The following environment variables are probably +going to be ignored by any Git subprocess run +by %s: + +" [appname]] + foreach name [array names env] { + switch -regexp -- $name { + {^GIT_INDEX_FILE$} - + {^GIT_OBJECT_DIRECTORY$} - + {^GIT_ALTERNATE_OBJECT_DIRECTORIES$} - + {^GIT_DIFF_OPTS$} - + {^GIT_EXTERNAL_DIFF$} - + {^GIT_PAGER$} - + {^GIT_TRACE$} - + {^GIT_CONFIG$} - + {^GIT_(AUTHOR|COMMITTER)_DATE$} { + append msg " - $name\n" + incr ignored_env + } + {^GIT_(AUTHOR|COMMITTER)_(NAME|EMAIL)$} { + append msg " - $name\n" + incr ignored_env + set suggest_user $name + } + } + } + if {$ignored_env > 0} { + append msg [mc " +This is due to a known issue with the +Tcl binary distributed by Cygwin."] + + if {$suggest_user ne {}} { + append msg [mc " + +A good replacement for %s +is placing values for the user.name and +user.email settings into your personal +~/.gitconfig file. +" $suggest_user] + } + warn_popup $msg + } + unset ignored_env msg suggest_user name +} + +# -- Only initialize complex UI if we are going to stay running. +# +if {[is_enabled transport]} { + load_all_remotes + + set n [.mbar.remote index end] + populate_remotes_menu + set n [expr {[.mbar.remote index end] - $n}] + if {$n > 0} { + if {[.mbar.remote type 0] eq "tearoff"} { incr n } + .mbar.remote insert $n separator + } + unset n +} + +if {[winfo exists $ui_comm]} { + set GITGUI_BCK_exists [load_message GITGUI_BCK utf-8] + + # -- If both our backup and message files exist use the + # newer of the two files to initialize the buffer. + # + if {$GITGUI_BCK_exists} { + set m [gitdir GITGUI_MSG] + if {[file isfile $m]} { + if {[file mtime [gitdir GITGUI_BCK]] > [file mtime $m]} { + catch {file delete [gitdir GITGUI_MSG]} + } else { + $ui_comm delete 0.0 end + $ui_comm edit reset + $ui_comm edit modified false + catch {file delete [gitdir GITGUI_BCK]} + set GITGUI_BCK_exists 0 + } + } + unset m + } + + proc backup_commit_buffer {} { + global ui_comm GITGUI_BCK_exists + + set m [$ui_comm edit modified] + if {$m || $GITGUI_BCK_exists} { + set msg [string trim [$ui_comm get 0.0 end]] + regsub -all -line {[ \r\t]+$} $msg {} msg + + if {$msg eq {}} { + if {$GITGUI_BCK_exists} { + catch {file delete [gitdir GITGUI_BCK]} + set GITGUI_BCK_exists 0 + } + } elseif {$m} { + catch { + set fd [open [gitdir GITGUI_BCK] w] + fconfigure $fd -encoding utf-8 + puts -nonewline $fd $msg + close $fd + set GITGUI_BCK_exists 1 + } + } + + $ui_comm edit modified false + } + + set ::GITGUI_BCK_i [after 2000 backup_commit_buffer] + } + + backup_commit_buffer + + # -- If the user has aspell available we can drive it + # in pipe mode to spellcheck the commit message. + # + set spell_cmd [list |] + set spell_dict [get_config gui.spellingdictionary] + lappend spell_cmd aspell + if {$spell_dict ne {}} { + lappend spell_cmd --master=$spell_dict + } + lappend spell_cmd --mode=none + lappend spell_cmd --encoding=utf-8 + lappend spell_cmd pipe + if {$spell_dict eq {none} + || [catch {set spell_fd [open $spell_cmd r+]} spell_err]} { + bind_button3 $ui_comm [list tk_popup $ui_comm_ctxm %X %Y] + } else { + set ui_comm_spell [spellcheck::init \ + $spell_fd \ + $ui_comm \ + $ui_comm_ctxm \ + ] + } + unset -nocomplain spell_cmd spell_fd spell_err spell_dict +} + +lock_index begin-read +if {![winfo ismapped .]} { + wm deiconify . +} +after 1 { + if {[is_enabled initialamend]} { + force_amend + } else { + do_rescan + } + + if {[is_enabled nocommitmsg]} { + $ui_comm configure -state disabled -background gray + } +} +if {[is_enabled multicommit] && ![is_config_false gui.gcwarning]} { + after 1000 hint_gc +} +if {[is_enabled retcode]} { + bind . {+terminate_me %W} +} +if {$picked && [is_config_true gui.autoexplore]} { + do_explore +} + +# Local variables: +# mode: tcl +# indent-tabs-mode: t +# tab-width: 4 +# End: diff --cc git-gui/lib/choose_repository.tcl index 3c10bc656d,0000000000..75d1da8d31 mode 100644,000000..100644 --- a/git-gui/lib/choose_repository.tcl +++ b/git-gui/lib/choose_repository.tcl @@@ -1,1084 -1,0 +1,1129 @@@ +# git-gui Git repository chooser +# Copyright (C) 2007 Shawn Pearce + +class choose_repository { + +field top +field w +field w_body ; # Widget holding the center content +field w_next ; # Next button +field w_quit ; # Quit button +field o_cons ; # Console object (if active) +field w_types ; # List of type buttons in clone +field w_recentlist ; # Listbox containing recent repositories +field w_localpath ; # Entry widget bound to local_path + +field done 0 ; # Finished picking the repository? +field local_path {} ; # Where this repository is locally +field origin_url {} ; # Where we are cloning from +field origin_name origin ; # What we shall call 'origin' +field clone_type hardlink ; # Type of clone to construct ++field recursive true ; # Recursive cloning flag +field readtree_err ; # Error output from read-tree (if any) +field sorted_recent ; # recent repositories (sorted) + +constructor pick {} { + global M1T M1B use_ttk NS + + if {[set maxrecent [get_config gui.maxrecentrepo]] eq {}} { + set maxrecent 10 + } + + make_dialog top w + wm title $top [mc "Git Gui"] + + if {$top eq {.}} { + menu $w.mbar -tearoff 0 + $top configure -menu $w.mbar + + set m_repo $w.mbar.repository + $w.mbar add cascade \ + -label [mc Repository] \ + -menu $m_repo + menu $m_repo + + if {[is_MacOSX]} { + $w.mbar add cascade -label Apple -menu .mbar.apple + menu $w.mbar.apple + $w.mbar.apple add command \ + -label [mc "About %s" [appname]] \ + -command do_about + $w.mbar.apple add command \ + -label [mc "Show SSH Key"] \ + -command do_ssh_key + } else { + $w.mbar add cascade -label [mc Help] -menu $w.mbar.help + menu $w.mbar.help + $w.mbar.help add command \ + -label [mc "About %s" [appname]] \ + -command do_about + $w.mbar.help add command \ + -label [mc "Show SSH Key"] \ + -command do_ssh_key + } + + wm protocol $top WM_DELETE_WINDOW exit + bind $top <$M1B-q> exit + bind $top <$M1B-Q> exit + bind $top exit + } else { + wm geometry $top "+[winfo rootx .]+[winfo rooty .]" + bind $top [list destroy $top] + set m_repo {} + } + + pack [git_logo $w.git_logo] -side left -fill y -padx 10 -pady 10 + + set w_body $w.body + set opts $w_body.options + ${NS}::frame $w_body + text $opts \ + -cursor $::cursor_ptr \ + -relief flat \ + -background [get_bg_color $w_body] \ + -wrap none \ + -spacing1 5 \ + -width 50 \ + -height 3 + pack $opts -anchor w -fill x + + $opts tag conf link_new -foreground blue -underline 1 + $opts tag bind link_new <1> [cb _next new] + $opts insert end [mc "Create New Repository"] link_new + $opts insert end "\n" + if {$m_repo ne {}} { + $m_repo add command \ + -command [cb _next new] \ + -accelerator $M1T-N \ + -label [mc "New..."] + bind $top <$M1B-n> [cb _next new] + bind $top <$M1B-N> [cb _next new] + } + + $opts tag conf link_clone -foreground blue -underline 1 + $opts tag bind link_clone <1> [cb _next clone] + $opts insert end [mc "Clone Existing Repository"] link_clone + $opts insert end "\n" + if {$m_repo ne {}} { + if {[tk windowingsystem] eq "win32"} { + set key L + } else { + set key C + } + $m_repo add command \ + -command [cb _next clone] \ + -accelerator $M1T-$key \ + -label [mc "Clone..."] + bind $top <$M1B-[string tolower $key]> [cb _next clone] + bind $top <$M1B-[string toupper $key]> [cb _next clone] + } + + $opts tag conf link_open -foreground blue -underline 1 + $opts tag bind link_open <1> [cb _next open] + $opts insert end [mc "Open Existing Repository"] link_open + $opts insert end "\n" + if {$m_repo ne {}} { + $m_repo add command \ + -command [cb _next open] \ + -accelerator $M1T-O \ + -label [mc "Open..."] + bind $top <$M1B-o> [cb _next open] + bind $top <$M1B-O> [cb _next open] + } + + $opts conf -state disabled + + set sorted_recent [_get_recentrepos] + if {[llength $sorted_recent] > 0} { + if {$m_repo ne {}} { + $m_repo add separator + $m_repo add command \ + -state disabled \ + -label [mc "Recent Repositories"] + } + + ${NS}::label $w_body.space + ${NS}::label $w_body.recentlabel \ + -anchor w \ + -text [mc "Open Recent Repository:"] + set w_recentlist $w_body.recentlist + text $w_recentlist \ + -cursor $::cursor_ptr \ + -relief flat \ + -background [get_bg_color $w_body.recentlabel] \ + -wrap none \ + -width 50 \ + -height $maxrecent + $w_recentlist tag conf link \ + -foreground blue \ + -underline 1 + set home $::env(HOME) + if {[is_Cygwin]} { + set home [exec cygpath --windows --absolute $home] + } + set home "[file normalize $home]/" + set hlen [string length $home] + foreach p $sorted_recent { + set path $p + if {[string equal -length $hlen $home $p]} { + set p "~/[string range $p $hlen end]" + } + regsub -all "\n" $p "\\n" p + $w_recentlist insert end $p link + $w_recentlist insert end "\n" + + if {$m_repo ne {}} { + $m_repo add command \ + -command [cb _open_recent_path $path] \ + -label " $p" + } + } + $w_recentlist conf -state disabled + $w_recentlist tag bind link <1> [cb _open_recent %x,%y] + pack $w_body.space -anchor w -fill x + pack $w_body.recentlabel -anchor w -fill x + pack $w_recentlist -anchor w -fill x + } + pack $w_body -fill x -padx 10 -pady 10 + + ${NS}::frame $w.buttons + set w_next $w.buttons.next + set w_quit $w.buttons.quit + ${NS}::button $w_quit \ + -text [mc "Quit"] \ + -command exit + pack $w_quit -side right -padx 5 + pack $w.buttons -side bottom -fill x -padx 10 -pady 10 + + if {$m_repo ne {}} { + $m_repo add separator + $m_repo add command \ + -label [mc Quit] \ + -command exit \ + -accelerator $M1T-Q + } + + bind $top [cb _invoke_next] + bind $top " + [cb _center] + grab $top + focus $top + bind $top {} + " + wm deiconify $top + tkwait variable @done + + grab release $top + if {$top eq {.}} { + eval destroy [winfo children $top] + } +} + +method _center {} { + set nx [winfo reqwidth $top] + set ny [winfo reqheight $top] + set rx [expr {([winfo screenwidth $top] - $nx) / 3}] + set ry [expr {([winfo screenheight $top] - $ny) / 3}] + wm geometry $top [format {+%d+%d} $rx $ry] +} + +method _invoke_next {} { + if {[winfo exists $w_next]} { + uplevel #0 [$w_next cget -command] + } +} + +proc _get_recentrepos {} { + set recent [list] + foreach p [get_config gui.recentrepo] { + if {[_is_git [file join $p .git]]} { + lappend recent $p + } else { + _unset_recentrepo $p + } + } + return [lsort $recent] +} + +proc _unset_recentrepo {p} { + regsub -all -- {([()\[\]{}\.^$+*?\\])} $p {\\\1} p + git config --global --unset gui.recentrepo "^$p\$" + load_config 1 +} + +proc _append_recentrepos {path} { + set path [file normalize $path] + set recent [get_config gui.recentrepo] + + if {[lindex $recent end] eq $path} { + return + } + + set i [lsearch $recent $path] + if {$i >= 0} { + _unset_recentrepo $path + set recent [lreplace $recent $i $i] + } + + lappend recent $path + git config --global --add gui.recentrepo $path + load_config 1 + + if {[set maxrecent [get_config gui.maxrecentrepo]] eq {}} { + set maxrecent 10 + } + + while {[llength $recent] > $maxrecent} { + _unset_recentrepo [lindex $recent 0] + set recent [lrange $recent 1 end] + } +} + +method _open_recent {xy} { + set id [lindex [split [$w_recentlist index @$xy] .] 0] + set local_path [lindex $sorted_recent [expr {$id - 1}]] + _do_open2 $this +} + +method _open_recent_path {p} { + set local_path $p + _do_open2 $this +} + +method _next {action} { + global NS + destroy $w_body + if {![winfo exists $w_next]} { + ${NS}::button $w_next -default active + set pos -before + if {[tk windowingsystem] eq "win32"} { set pos -after } + pack $w_next -side right -padx 5 $pos $w_quit + } + _do_$action $this +} + +method _write_local_path {args} { + if {$local_path eq {}} { + $w_next conf -state disabled + } else { + $w_next conf -state normal + } +} + +method _git_init {} { + if {[catch {file mkdir $local_path} err]} { + error_popup [strcat \ + [mc "Failed to create repository %s:" $local_path] \ + "\n\n$err"] + return 0 + } + + if {[catch {cd $local_path} err]} { + error_popup [strcat \ + [mc "Failed to create repository %s:" $local_path] \ + "\n\n$err"] + return 0 + } + + if {[catch {git init} err]} { + error_popup [strcat \ + [mc "Failed to create repository %s:" $local_path] \ + "\n\n$err"] + return 0 + } + + _append_recentrepos [pwd] + set ::_gitdir .git + set ::_prefix {} + return 1 +} + - proc _is_git {path} { ++proc _is_git {path {outdir_var ""}} { ++ if {$outdir_var ne ""} { ++ upvar 1 $outdir_var outdir ++ } ++ if {[file isfile $path]} { ++ set fp [open $path r] ++ gets $fp line ++ close $fp ++ if {[regexp "^gitdir: (.+)$" $line line link_target]} { ++ set path [file join [file dirname $path] $link_target] ++ set path [file normalize $path] ++ } ++ } ++ + if {[file exists [file join $path HEAD]] + && [file exists [file join $path objects]] + && [file exists [file join $path config]]} { ++ set outdir $path + return 1 + } + if {[is_Cygwin]} { + if {[file exists [file join $path HEAD]] + && [file exists [file join $path objects.lnk]] + && [file exists [file join $path config.lnk]]} { ++ set outdir $path + return 1 + } + } + return 0 +} + +proc _objdir {path} { + set objdir [file join $path .git objects] + if {[file isdirectory $objdir]} { + return $objdir + } + + set objdir [file join $path objects] + if {[file isdirectory $objdir]} { + return $objdir + } + + if {[is_Cygwin]} { + set objdir [file join $path .git objects.lnk] + if {[file isfile $objdir]} { + return [win32_read_lnk $objdir] + } + + set objdir [file join $path objects.lnk] + if {[file isfile $objdir]} { + return [win32_read_lnk $objdir] + } + } + + return {} +} + +###################################################################### +## +## Create New Repository + +method _do_new {} { + global use_ttk NS + $w_next conf \ + -state disabled \ + -command [cb _do_new2] \ + -text [mc "Create"] + + ${NS}::frame $w_body + ${NS}::label $w_body.h \ + -font font_uibold -anchor center \ + -text [mc "Create New Repository"] + pack $w_body.h -side top -fill x -pady 10 + pack $w_body -fill x -padx 10 + + ${NS}::frame $w_body.where + ${NS}::label $w_body.where.l -text [mc "Directory:"] + ${NS}::entry $w_body.where.t \ + -textvariable @local_path \ + -width 50 + ${NS}::button $w_body.where.b \ + -text [mc "Browse"] \ + -command [cb _new_local_path] + set w_localpath $w_body.where.t + + grid $w_body.where.l $w_body.where.t $w_body.where.b -sticky ew + pack $w_body.where -fill x + + grid columnconfigure $w_body.where 1 -weight 1 + + trace add variable @local_path write [cb _write_local_path] + bind $w_body.h [list trace remove variable @local_path write [cb _write_local_path]] + update + focus $w_body.where.t +} + +method _new_local_path {} { + if {$local_path ne {}} { + set p [file dirname $local_path] + } else { + set p [pwd] + } + + set p [tk_chooseDirectory \ + -initialdir $p \ + -parent $top \ + -title [mc "Git Repository"] \ + -mustexist false] + if {$p eq {}} return + + set p [file normalize $p] + if {![_new_ok $p]} { + return + } + set local_path $p + $w_localpath icursor end +} + +method _do_new2 {} { + if {![_new_ok $local_path]} { + return + } + if {![_git_init $this]} { + return + } + set done 1 +} + +proc _new_ok {p} { + if {[file isdirectory $p]} { + if {[_is_git [file join $p .git]]} { + error_popup [mc "Directory %s already exists." $p] + return 0 + } + } elseif {[file exists $p]} { + error_popup [mc "File %s already exists." $p] + return 0 + } + return 1 +} + +###################################################################### +## +## Clone Existing Repository + +method _do_clone {} { + global use_ttk NS + $w_next conf \ + -state disabled \ + -command [cb _do_clone2] \ + -text [mc "Clone"] + + ${NS}::frame $w_body + ${NS}::label $w_body.h \ + -font font_uibold -anchor center \ + -text [mc "Clone Existing Repository"] + pack $w_body.h -side top -fill x -pady 10 + pack $w_body -fill x -padx 10 + + set args $w_body.args + ${NS}::frame $w_body.args + pack $args -fill both + + ${NS}::label $args.origin_l -text [mc "Source Location:"] + ${NS}::entry $args.origin_t \ + -textvariable @origin_url \ + -width 50 + ${NS}::button $args.origin_b \ + -text [mc "Browse"] \ + -command [cb _open_origin] + grid $args.origin_l $args.origin_t $args.origin_b -sticky ew + + ${NS}::label $args.where_l -text [mc "Target Directory:"] + ${NS}::entry $args.where_t \ + -textvariable @local_path \ + -width 50 + ${NS}::button $args.where_b \ + -text [mc "Browse"] \ + -command [cb _new_local_path] + grid $args.where_l $args.where_t $args.where_b -sticky ew + set w_localpath $args.where_t + + ${NS}::label $args.type_l -text [mc "Clone Type:"] + ${NS}::frame $args.type_f + set w_types [list] + lappend w_types [${NS}::radiobutton $args.type_f.hardlink \ + -state disabled \ + -text [mc "Standard (Fast, Semi-Redundant, Hardlinks)"] \ + -variable @clone_type \ + -value hardlink] + lappend w_types [${NS}::radiobutton $args.type_f.full \ + -state disabled \ + -text [mc "Full Copy (Slower, Redundant Backup)"] \ + -variable @clone_type \ + -value full] + lappend w_types [${NS}::radiobutton $args.type_f.shared \ + -state disabled \ + -text [mc "Shared (Fastest, Not Recommended, No Backup)"] \ + -variable @clone_type \ + -value shared] + foreach r $w_types { + pack $r -anchor w + } ++ ${NS}::checkbutton $args.type_f.recursive \ ++ -text [mc "Recursively clone submodules too"] \ ++ -variable @recursive \ ++ -onvalue true -offvalue false ++ pack $args.type_f.recursive -anchor w + grid $args.type_l $args.type_f -sticky new + + grid columnconfigure $args 1 -weight 1 + + trace add variable @local_path write [cb _update_clone] + trace add variable @origin_url write [cb _update_clone] + bind $w_body.h " + [list trace remove variable @local_path write [cb _update_clone]] + [list trace remove variable @origin_url write [cb _update_clone]] + " + update + focus $args.origin_t +} + +method _open_origin {} { + if {$origin_url ne {} && [file isdirectory $origin_url]} { + set p $origin_url + } else { + set p [pwd] + } + + set p [tk_chooseDirectory \ + -initialdir $p \ + -parent $top \ + -title [mc "Git Repository"] \ + -mustexist true] + if {$p eq {}} return + + set p [file normalize $p] + if {![_is_git [file join $p .git]] && ![_is_git $p]} { + error_popup [mc "Not a Git repository: %s" [file tail $p]] + return + } + set origin_url $p +} + +method _update_clone {args} { + if {$local_path ne {} && $origin_url ne {}} { + $w_next conf -state normal + } else { + $w_next conf -state disabled + } + + if {$origin_url ne {} && + ( [_is_git [file join $origin_url .git]] + || [_is_git $origin_url])} { + set e normal + if {[[lindex $w_types 0] cget -state] eq {disabled}} { + set clone_type hardlink + } + } else { + set e disabled + set clone_type full + } + + foreach r $w_types { + $r conf -state $e + } +} + +method _do_clone2 {} { + if {[file isdirectory $origin_url]} { + set origin_url [file normalize $origin_url] + } + + if {$clone_type eq {hardlink} && ![file isdirectory $origin_url]} { + error_popup [mc "Standard only available for local repository."] + return + } + if {$clone_type eq {shared} && ![file isdirectory $origin_url]} { + error_popup [mc "Shared only available for local repository."] + return + } + + if {$clone_type eq {hardlink} || $clone_type eq {shared}} { + set objdir [_objdir $origin_url] + if {$objdir eq {}} { + error_popup [mc "Not a Git repository: %s" [file tail $origin_url]] + return + } + } + + set giturl $origin_url + if {[is_Cygwin] && [file isdirectory $giturl]} { + set giturl [exec cygpath --unix --absolute $giturl] + if {$clone_type eq {shared}} { + set objdir [exec cygpath --unix --absolute $objdir] + } + } + + if {[file exists $local_path]} { + error_popup [mc "Location %s already exists." $local_path] + return + } + + if {![_git_init $this]} return + set local_path [pwd] + + if {[catch { + git config remote.$origin_name.url $giturl + git config remote.$origin_name.fetch +refs/heads/*:refs/remotes/$origin_name/* + } err]} { + error_popup [strcat [mc "Failed to configure origin"] "\n\n$err"] + return + } + + destroy $w_body $w_next + + switch -exact -- $clone_type { + hardlink { + set o_cons [status_bar::two_line $w_body] + pack $w_body -fill x -padx 10 -pady 10 + + $o_cons start \ + [mc "Counting objects"] \ + [mc "buckets"] + update + + if {[file exists [file join $objdir info alternates]]} { + set pwd [pwd] + if {[catch { + file mkdir [gitdir objects info] + set f_in [open [file join $objdir info alternates] r] + set f_cp [open [gitdir objects info alternates] w] + fconfigure $f_in -translation binary -encoding binary + fconfigure $f_cp -translation binary -encoding binary + cd $objdir + while {[gets $f_in line] >= 0} { + if {[is_Cygwin]} { + puts $f_cp [exec cygpath --unix --absolute $line] + } else { + puts $f_cp [file normalize $line] + } + } + close $f_in + close $f_cp + cd $pwd + } err]} { + catch {cd $pwd} + _clone_failed $this [mc "Unable to copy objects/info/alternates: %s" $err] + return + } + } + + set tolink [list] + set buckets [glob \ + -tails \ + -nocomplain \ + -directory [file join $objdir] ??] + set bcnt [expr {[llength $buckets] + 2}] + set bcur 1 + $o_cons update $bcur $bcnt + update + + file mkdir [file join .git objects pack] + foreach i [glob -tails -nocomplain \ + -directory [file join $objdir pack] *] { + lappend tolink [file join pack $i] + } + $o_cons update [incr bcur] $bcnt + update + + foreach i $buckets { + file mkdir [file join .git objects $i] + foreach j [glob -tails -nocomplain \ + -directory [file join $objdir $i] *] { + lappend tolink [file join $i $j] + } + $o_cons update [incr bcur] $bcnt + update + } + $o_cons stop + + if {$tolink eq {}} { + info_popup [strcat \ + [mc "Nothing to clone from %s." $origin_url] \ + "\n" \ + [mc "The 'master' branch has not been initialized."] \ + ] + destroy $w_body + set done 1 + return + } + + set i [lindex $tolink 0] + if {[catch { + file link -hard \ + [file join .git objects $i] \ + [file join $objdir $i] + } err]} { + info_popup [mc "Hardlinks are unavailable. Falling back to copying."] + set i [_copy_files $this $objdir $tolink] + } else { + set i [_link_files $this $objdir [lrange $tolink 1 end]] + } + if {!$i} return + + destroy $w_body + } + full { + set o_cons [console::embed \ + $w_body \ + [mc "Cloning from %s" $origin_url]] + pack $w_body -fill both -expand 1 -padx 10 + $o_cons exec \ + [list git fetch --no-tags -k $origin_name] \ + [cb _do_clone_tags] + } + shared { + set fd [open [gitdir objects info alternates] w] + fconfigure $fd -translation binary + puts $fd $objdir + close $fd + } + } + + if {$clone_type eq {hardlink} || $clone_type eq {shared}} { + if {![_clone_refs $this]} return + set pwd [pwd] + if {[catch { + cd $origin_url + set HEAD [git rev-parse --verify HEAD^0] + } err]} { + _clone_failed $this [mc "Not a Git repository: %s" [file tail $origin_url]] + return 0 + } + cd $pwd + _do_clone_checkout $this $HEAD + } +} + +method _copy_files {objdir tocopy} { + $o_cons start \ + [mc "Copying objects"] \ + [mc "KiB"] + set tot 0 + set cmp 0 + foreach p $tocopy { + incr tot [file size [file join $objdir $p]] + } + foreach p $tocopy { + if {[catch { + set f_in [open [file join $objdir $p] r] + set f_cp [open [file join .git objects $p] w] + fconfigure $f_in -translation binary -encoding binary + fconfigure $f_cp -translation binary -encoding binary + + while {![eof $f_in]} { + incr cmp [fcopy $f_in $f_cp -size 16384] + $o_cons update \ + [expr {$cmp / 1024}] \ + [expr {$tot / 1024}] + update + } + + close $f_in + close $f_cp + } err]} { + _clone_failed $this [mc "Unable to copy object: %s" $err] + return 0 + } + } + return 1 +} + +method _link_files {objdir tolink} { + set total [llength $tolink] + $o_cons start \ + [mc "Linking objects"] \ + [mc "objects"] + for {set i 0} {$i < $total} {} { + set p [lindex $tolink $i] + if {[catch { + file link -hard \ + [file join .git objects $p] \ + [file join $objdir $p] + } err]} { + _clone_failed $this [mc "Unable to hardlink object: %s" $err] + return 0 + } + + incr i + if {$i % 5 == 0} { + $o_cons update $i $total + update + } + } + return 1 +} + +method _clone_refs {} { + set pwd [pwd] + if {[catch {cd $origin_url} err]} { + error_popup [mc "Not a Git repository: %s" [file tail $origin_url]] + return 0 + } + set fd_in [git_read for-each-ref \ + --tcl \ + {--format=list %(refname) %(objectname) %(*objectname)}] + cd $pwd + + set fd [open [gitdir packed-refs] w] + fconfigure $fd -translation binary + puts $fd "# pack-refs with: peeled" + while {[gets $fd_in line] >= 0} { + set line [eval $line] + set refn [lindex $line 0] + set robj [lindex $line 1] + set tobj [lindex $line 2] + + if {[regsub ^refs/heads/ $refn \ + "refs/remotes/$origin_name/" refn]} { + puts $fd "$robj $refn" + } elseif {[string match refs/tags/* $refn]} { + puts $fd "$robj $refn" + if {$tobj ne {}} { + puts $fd "^$tobj" + } + } + } + close $fd_in + close $fd + return 1 +} + +method _do_clone_tags {ok} { + if {$ok} { + $o_cons exec \ + [list git fetch --tags -k $origin_name] \ + [cb _do_clone_HEAD] + } else { + $o_cons done $ok + _clone_failed $this [mc "Cannot fetch branches and objects. See console output for details."] + } +} + +method _do_clone_HEAD {ok} { + if {$ok} { + $o_cons exec \ + [list git fetch $origin_name HEAD] \ + [cb _do_clone_full_end] + } else { + $o_cons done $ok + _clone_failed $this [mc "Cannot fetch tags. See console output for details."] + } +} + +method _do_clone_full_end {ok} { + $o_cons done $ok + + if {$ok} { + destroy $w_body + + set HEAD {} + if {[file exists [gitdir FETCH_HEAD]]} { + set fd [open [gitdir FETCH_HEAD] r] + while {[gets $fd line] >= 0} { + if {[regexp "^(.{40})\t\t" $line line HEAD]} { + break + } + } + close $fd + } + + catch {git pack-refs} + _do_clone_checkout $this $HEAD + } else { + _clone_failed $this [mc "Cannot determine HEAD. See console output for details."] + } +} + +method _clone_failed {{why {}}} { + if {[catch {file delete -force $local_path} err]} { + set why [strcat \ + $why \ + "\n\n" \ + [mc "Unable to cleanup %s" $local_path] \ + "\n\n" \ + $err] + } + if {$why ne {}} { + update + error_popup [strcat [mc "Clone failed."] "\n" $why] + } +} + +method _do_clone_checkout {HEAD} { + if {$HEAD eq {}} { + info_popup [strcat \ + [mc "No default branch obtained."] \ + "\n" \ + [mc "The 'master' branch has not been initialized."] \ + ] + set done 1 + return + } + if {[catch { + git update-ref HEAD $HEAD^0 + } err]} { + info_popup [strcat \ + [mc "Cannot resolve %s as a commit." $HEAD^0] \ + "\n $err" \ + "\n" \ + [mc "The 'master' branch has not been initialized."] \ + ] + set done 1 + return + } + + set o_cons [status_bar::two_line $w_body] + pack $w_body -fill x -padx 10 -pady 10 + $o_cons start \ + [mc "Creating working directory"] \ + [mc "files"] + + set readtree_err {} + set fd [git_read --stderr read-tree \ + -m \ + -u \ + -v \ + HEAD \ + HEAD \ + ] + fconfigure $fd -blocking 0 -translation binary + fileevent $fd readable [cb _readtree_wait $fd] +} + ++method _do_validate_submodule_cloning {ok} { ++ if {$ok} { ++ $o_cons done $ok ++ set done 1 ++ } else { ++ _clone_failed $this [mc "Cannot clone submodules."] ++ } ++} ++ ++method _do_clone_submodules {} { ++ if {$recursive eq {true}} { ++ destroy $w_body ++ set o_cons [console::embed \ ++ $w_body \ ++ [mc "Cloning submodules"]] ++ pack $w_body -fill both -expand 1 -padx 10 ++ $o_cons exec \ ++ [list git submodule update --init --recursive] \ ++ [cb _do_validate_submodule_cloning] ++ } else { ++ set done 1 ++ } ++} ++ +method _readtree_wait {fd} { + set buf [read $fd] + $o_cons update_meter $buf + append readtree_err $buf + + fconfigure $fd -blocking 1 + if {![eof $fd]} { + fconfigure $fd -blocking 0 + return + } + + if {[catch {close $fd}]} { + set err $readtree_err + regsub {^fatal: } $err {} err + error_popup [strcat \ + [mc "Initial file checkout failed."] \ + "\n\n$err"] + return + } + + # -- Run the post-checkout hook. + # + set fd_ph [githook_read post-checkout [string repeat 0 40] \ + [git rev-parse HEAD] 1] + if {$fd_ph ne {}} { + global pch_error + set pch_error {} + fconfigure $fd_ph -blocking 0 -translation binary -eofchar {} + fileevent $fd_ph readable [cb _postcheckout_wait $fd_ph] + } else { - set done 1 ++ _do_clone_submodules $this + } +} + +method _postcheckout_wait {fd_ph} { + global pch_error + + append pch_error [read $fd_ph] + fconfigure $fd_ph -blocking 1 + if {[eof $fd_ph]} { + if {[catch {close $fd_ph}]} { + hook_failed_popup post-checkout $pch_error 0 + } + unset pch_error - set done 1 ++ _do_clone_submodules $this + return + } + fconfigure $fd_ph -blocking 0 +} + +###################################################################### +## +## Open Existing Repository + +method _do_open {} { + global NS + $w_next conf \ + -state disabled \ + -command [cb _do_open2] \ + -text [mc "Open"] + + ${NS}::frame $w_body + ${NS}::label $w_body.h \ + -font font_uibold -anchor center \ + -text [mc "Open Existing Repository"] + pack $w_body.h -side top -fill x -pady 10 + pack $w_body -fill x -padx 10 + + ${NS}::frame $w_body.where + ${NS}::label $w_body.where.l -text [mc "Repository:"] + ${NS}::entry $w_body.where.t \ + -textvariable @local_path \ + -width 50 + ${NS}::button $w_body.where.b \ + -text [mc "Browse"] \ + -command [cb _open_local_path] + + grid $w_body.where.l $w_body.where.t $w_body.where.b -sticky ew + pack $w_body.where -fill x + + grid columnconfigure $w_body.where 1 -weight 1 + + trace add variable @local_path write [cb _write_local_path] + bind $w_body.h [list trace remove variable @local_path write [cb _write_local_path]] + update + focus $w_body.where.t +} + +method _open_local_path {} { + if {$local_path ne {}} { + set p $local_path + } else { + set p [pwd] + } + + set p [tk_chooseDirectory \ + -initialdir $p \ + -parent $top \ + -title [mc "Git Repository"] \ + -mustexist true] + if {$p eq {}} return + + set p [file normalize $p] + if {![_is_git [file join $p .git]]} { + error_popup [mc "Not a Git repository: %s" [file tail $p]] + return + } + set local_path $p +} + +method _do_open2 {} { - if {![_is_git [file join $local_path .git]]} { ++ if {![_is_git [file join $local_path .git] actualgit]} { + error_popup [mc "Not a Git repository: %s" [file tail $local_path]] + return + } + + if {[catch {cd $local_path} err]} { + error_popup [strcat \ + [mc "Failed to open repository %s:" $local_path] \ + "\n\n$err"] + return + } + + _append_recentrepos [pwd] - set ::_gitdir .git ++ set ::_gitdir $actualgit + set ::_prefix {} + set done 1 +} + +} diff --cc git-gui/lib/diff.tcl index b0a5180af7,0000000000..0d56986215 mode 100644,000000..100644 --- a/git-gui/lib/diff.tcl +++ b/git-gui/lib/diff.tcl @@@ -1,815 -1,0 +1,833 @@@ +# git-gui diff viewer +# Copyright (C) 2006, 2007 Shawn Pearce + ++proc apply_tab_size {{firsttab {}}} { ++ global have_tk85 repo_config ui_diff ++ ++ set w [font measure font_diff "0"] ++ if {$have_tk85 && $firsttab != 0} { ++ $ui_diff configure -tabs [list [expr {$firsttab * $w}] [expr {($firsttab + $repo_config(gui.tabsize)) * $w}]] ++ } elseif {$have_tk85 || $repo_config(gui.tabsize) != 8} { ++ $ui_diff configure -tabs [expr {$repo_config(gui.tabsize) * $w}] ++ } else { ++ $ui_diff configure -tabs {} ++ } ++} ++ +proc clear_diff {} { + global ui_diff current_diff_path current_diff_header + global ui_index ui_workdir + + $ui_diff conf -state normal + $ui_diff delete 0.0 end + $ui_diff conf -state disabled + + set current_diff_path {} + set current_diff_header {} + + $ui_index tag remove in_diff 0.0 end + $ui_workdir tag remove in_diff 0.0 end +} + +proc reshow_diff {{after {}}} { + global file_states file_lists + global current_diff_path current_diff_side + global ui_diff + + set p $current_diff_path + if {$p eq {}} { + # No diff is being shown. + } elseif {$current_diff_side eq {}} { + clear_diff + } elseif {[catch {set s $file_states($p)}] + || [lsearch -sorted -exact $file_lists($current_diff_side) $p] == -1} { + + if {[find_next_diff $current_diff_side $p {} {[^O]}]} { + next_diff $after + } else { + clear_diff + } + } else { + set save_pos [lindex [$ui_diff yview] 0] + show_diff $p $current_diff_side {} $save_pos $after + } +} + +proc force_diff_encoding {enc} { + global current_diff_path + + if {$current_diff_path ne {}} { + force_path_encoding $current_diff_path $enc + reshow_diff + } +} + +proc handle_empty_diff {} { + global current_diff_path file_states file_lists + global diff_empty_count + + set path $current_diff_path + set s $file_states($path) + if {[lindex $s 0] ne {_M} || [has_textconv $path]} return + + # Prevent infinite rescan loops + incr diff_empty_count + if {$diff_empty_count > 1} return + + info_popup [mc "No differences detected. + +%s has no changes. + +The modification date of this file was updated by another application, but the content within the file was not changed. + +A rescan will be automatically started to find other files which may have the same state." [short_path $path]] + + clear_diff + display_file $path __ + rescan ui_ready 0 +} + +proc show_diff {path w {lno {}} {scroll_pos {}} {callback {}}} { + global file_states file_lists + global is_3way_diff is_conflict_diff diff_active repo_config + global ui_diff ui_index ui_workdir + global current_diff_path current_diff_side current_diff_header + global current_diff_queue + + if {$diff_active || ![lock_index read]} return + + clear_diff + if {$lno == {}} { + set lno [lsearch -sorted -exact $file_lists($w) $path] + if {$lno >= 0} { + incr lno + } + } + if {$lno >= 1} { + $w tag add in_diff $lno.0 [expr {$lno + 1}].0 + $w see $lno.0 + } + + set s $file_states($path) + set m [lindex $s 0] + set is_conflict_diff 0 + set current_diff_path $path + set current_diff_side $w + set current_diff_queue {} + ui_status [mc "Loading diff of %s..." [escape_path $path]] + + set cont_info [list $scroll_pos $callback] + ++ apply_tab_size 0 ++ + if {[string first {U} $m] >= 0} { + merge_load_stages $path [list show_unmerged_diff $cont_info] + } elseif {$m eq {_O}} { + show_other_diff $path $w $m $cont_info + } else { + start_show_diff $cont_info + } +} + +proc show_unmerged_diff {cont_info} { + global current_diff_path current_diff_side + global merge_stages ui_diff is_conflict_diff + global current_diff_queue + + if {$merge_stages(2) eq {}} { + set is_conflict_diff 1 + lappend current_diff_queue \ + [list [mc "LOCAL: deleted\nREMOTE:\n"] d= \ + [list ":1:$current_diff_path" ":3:$current_diff_path"]] + } elseif {$merge_stages(3) eq {}} { + set is_conflict_diff 1 + lappend current_diff_queue \ + [list [mc "REMOTE: deleted\nLOCAL:\n"] d= \ + [list ":1:$current_diff_path" ":2:$current_diff_path"]] + } elseif {[lindex $merge_stages(1) 0] eq {120000} + || [lindex $merge_stages(2) 0] eq {120000} + || [lindex $merge_stages(3) 0] eq {120000}} { + set is_conflict_diff 1 + lappend current_diff_queue \ + [list [mc "LOCAL:\n"] d= \ + [list ":1:$current_diff_path" ":2:$current_diff_path"]] + lappend current_diff_queue \ + [list [mc "REMOTE:\n"] d= \ + [list ":1:$current_diff_path" ":3:$current_diff_path"]] + } else { + start_show_diff $cont_info + return + } + + advance_diff_queue $cont_info +} + +proc advance_diff_queue {cont_info} { + global current_diff_queue ui_diff + + set item [lindex $current_diff_queue 0] + set current_diff_queue [lrange $current_diff_queue 1 end] + + $ui_diff conf -state normal + $ui_diff insert end [lindex $item 0] [lindex $item 1] + $ui_diff conf -state disabled + + start_show_diff $cont_info [lindex $item 2] +} + +proc show_other_diff {path w m cont_info} { + global file_states file_lists + global is_3way_diff diff_active repo_config + global ui_diff ui_index ui_workdir + global current_diff_path current_diff_side current_diff_header + + # - Git won't give us the diff, there's nothing to compare to! + # + if {$m eq {_O}} { + set max_sz 100000 + set type unknown + if {[catch { + set type [file type $path] + switch -- $type { + directory { + set type submodule + set content {} + set sz 0 + } + link { + set content [file readlink $path] + set sz [string length $content] + } + file { + set fd [open $path r] + fconfigure $fd \ + -eofchar {} \ + -encoding [get_path_encoding $path] + set content [read $fd $max_sz] + close $fd + set sz [file size $path] + } + default { + error "'$type' not supported" + } + } + } err ]} { + set diff_active 0 + unlock_index + ui_status [mc "Unable to display %s" [escape_path $path]] + error_popup [strcat [mc "Error loading file:"] "\n\n$err"] + return + } + $ui_diff conf -state normal + if {$type eq {submodule}} { + $ui_diff insert end [append \ + "* " \ + [mc "Git Repository (subproject)"] \ + "\n"] d_info + } elseif {![catch {set type [exec file $path]}]} { + set n [string length $path] + if {[string equal -length $n $path $type]} { + set type [string range $type $n end] + regsub {^:?\s*} $type {} type + } + $ui_diff insert end "* $type\n" d_info + } + if {[string first "\0" $content] != -1} { + $ui_diff insert end \ + [mc "* Binary file (not showing content)."] \ + d_info + } else { + if {$sz > $max_sz} { + $ui_diff insert end [mc \ +"* Untracked file is %d bytes. +* Showing only first %d bytes. +" $sz $max_sz] d_info + } + $ui_diff insert end $content + if {$sz > $max_sz} { + $ui_diff insert end [mc " +* Untracked file clipped here by %s. +* To see the entire file, use an external editor. +" [appname]] d_info + } + } + $ui_diff conf -state disabled + set diff_active 0 + unlock_index + set scroll_pos [lindex $cont_info 0] + if {$scroll_pos ne {}} { + update + $ui_diff yview moveto $scroll_pos + } + ui_ready + set callback [lindex $cont_info 1] + if {$callback ne {}} { + eval $callback + } + return + } +} + +proc get_conflict_marker_size {path} { + set size 7 + catch { + set fd_rc [eval [list git_read check-attr "conflict-marker-size" -- $path]] + set ret [gets $fd_rc line] + close $fd_rc + if {$ret > 0} { + regexp {.*: conflict-marker-size: (\d+)$} $line line size + } + } + return $size +} + +proc start_show_diff {cont_info {add_opts {}}} { + global file_states file_lists + global is_3way_diff is_submodule_diff diff_active repo_config + global ui_diff ui_index ui_workdir + global current_diff_path current_diff_side current_diff_header + + set path $current_diff_path + set w $current_diff_side + + set s $file_states($path) + set m [lindex $s 0] + set is_3way_diff 0 + set is_submodule_diff 0 + set diff_active 1 + set current_diff_header {} + set conflict_size [get_conflict_marker_size $path] + + set cmd [list] + if {$w eq $ui_index} { + lappend cmd diff-index + lappend cmd --cached + if {[git-version >= "1.7.2"]} { + lappend cmd --ignore-submodules=dirty + } + } elseif {$w eq $ui_workdir} { + if {[string first {U} $m] >= 0} { + lappend cmd diff + } else { + lappend cmd diff-files + } + } + if {![is_config_false gui.textconv] && [git-version >= 1.6.1]} { + lappend cmd --textconv + } + + if {[string match {160000 *} [lindex $s 2]] + || [string match {160000 *} [lindex $s 3]]} { + set is_submodule_diff 1 + + if {[git-version >= "1.6.6"]} { + lappend cmd --submodule + } + } + + lappend cmd -p + lappend cmd --color + set cmd [concat $cmd $repo_config(gui.diffopts)] + if {$repo_config(gui.diffcontext) >= 1} { + lappend cmd "-U$repo_config(gui.diffcontext)" + } + if {$w eq $ui_index} { + lappend cmd [PARENT] + } + if {$add_opts ne {}} { + eval lappend cmd $add_opts + } else { + lappend cmd -- + lappend cmd $path + } + + if {$is_submodule_diff && [git-version < "1.6.6"]} { + if {$w eq $ui_index} { + set cmd [list submodule summary --cached -- $path] + } else { + set cmd [list submodule summary --files -- $path] + } + } + + if {[catch {set fd [eval git_read --nice $cmd]} err]} { + set diff_active 0 + unlock_index + ui_status [mc "Unable to display %s" [escape_path $path]] + error_popup [strcat [mc "Error loading diff:"] "\n\n$err"] + return + } + + set ::current_diff_inheader 1 + fconfigure $fd \ + -blocking 0 \ + -encoding [get_path_encoding $path] \ + -translation lf + fileevent $fd readable [list read_diff $fd $conflict_size $cont_info] +} + +proc parse_color_line {line} { + set start 0 + set result "" + set markup [list] + set regexp {\033\[((?:\d+;)*\d+)?m} + set need_reset 0 + while {[regexp -indices -start $start $regexp $line match code]} { + foreach {begin end} $match break + append result [string range $line $start [expr {$begin - 1}]] + set pos [string length $result] + set col [eval [linsert $code 0 string range $line]] + set start [incr end] + if {$col eq "0" || $col eq ""} { + if {!$need_reset} continue + set need_reset 0 + } else { + set need_reset 1 + } + lappend markup $pos $col + } + append result [string range $line $start end] + if {[llength $markup] < 4} {set markup {}} + return [list $result $markup] +} + +proc read_diff {fd conflict_size cont_info} { + global ui_diff diff_active is_submodule_diff + global is_3way_diff is_conflict_diff current_diff_header + global current_diff_queue + global diff_empty_count + + $ui_diff conf -state normal + while {[gets $fd line] >= 0} { + foreach {line markup} [parse_color_line $line] break + set line [string map {\033 ^} $line] + + set tags {} + + # -- Check for start of diff header. + if { [string match {diff --git *} $line] + || [string match {diff --cc *} $line] + || [string match {diff --combined *} $line]} { + set ::current_diff_inheader 1 + } + + # -- Check for end of diff header (any hunk line will do this). + # + if {[regexp {^@@+ } $line]} {set ::current_diff_inheader 0} + + # -- Automatically detect if this is a 3 way diff. + # - if {[string match {@@@ *} $line]} {set is_3way_diff 1} ++ if {[string match {@@@ *} $line]} { ++ set is_3way_diff 1 ++ apply_tab_size 1 ++ } + + if {$::current_diff_inheader} { + + # -- These two lines stop a diff header and shouldn't be in there + if { [string match {Binary files * and * differ} $line] + || [regexp {^\* Unmerged path } $line]} { + set ::current_diff_inheader 0 + } else { + append current_diff_header $line "\n" + } + + # -- Cleanup uninteresting diff header lines. + # + if { [string match {diff --git *} $line] + || [string match {diff --cc *} $line] + || [string match {diff --combined *} $line] + || [string match {--- *} $line] + || [string match {+++ *} $line] + || [string match {index *} $line]} { + continue + } + + # -- Name it symlink, not 120000 + # Note, that the original line is in $current_diff_header + regsub {^(deleted|new) file mode 120000} $line {\1 symlink} line + + } elseif { $line eq {\ No newline at end of file}} { + # -- Handle some special lines + } elseif {$is_3way_diff} { + set op [string range $line 0 1] + switch -- $op { + { } {set tags {}} + {@@} {set tags d_@} + { +} {set tags d_s+} + { -} {set tags d_s-} + {+ } {set tags d_+s} + {- } {set tags d_-s} + {--} {set tags d_--} + {++} { + set regexp [string map [list %conflict_size $conflict_size]\ + {^\+\+([<>=]){%conflict_size}(?: |$)}] + if {[regexp $regexp $line _g op]} { + set is_conflict_diff 1 + set line [string replace $line 0 1 { }] + set tags d$op + } else { + set tags d_++ + } + } + default { + puts "error: Unhandled 3 way diff marker: {$op}" + set tags {} + } + } + } elseif {$is_submodule_diff} { + if {$line == ""} continue + if {[regexp {^Submodule } $line]} { + set tags d_info + } elseif {[regexp {^\* } $line]} { + set line [string replace $line 0 1 {Submodule }] + set tags d_info + } else { + set op [string range $line 0 2] + switch -- $op { + { <} {set tags d_-} + { >} {set tags d_+} + { W} {set tags {}} + default { + puts "error: Unhandled submodule diff marker: {$op}" + set tags {} + } + } + } + } else { + set op [string index $line 0] + switch -- $op { + { } {set tags {}} + {@} {set tags d_@} + {-} {set tags d_-} + {+} { + set regexp [string map [list %conflict_size $conflict_size]\ + {^\+([<>=]){%conflict_size}(?: |$)}] + if {[regexp $regexp $line _g op]} { + set is_conflict_diff 1 + set tags d$op + } else { + set tags d_+ + } + } + default { + puts "error: Unhandled 2 way diff marker: {$op}" + set tags {} + } + } + } + set mark [$ui_diff index "end - 1 line linestart"] + $ui_diff insert end $line $tags + if {[string index $line end] eq "\r"} { + $ui_diff tag add d_cr {end - 2c} + } + $ui_diff insert end "\n" $tags + + foreach {posbegin colbegin posend colend} $markup { + set prefix clr + foreach style [lsort -integer [split $colbegin ";"]] { + if {$style eq "7"} {append prefix i; continue} + if {$style != 4 && ($style < 30 || $style > 47)} {continue} + set a "$mark linestart + $posbegin chars" + set b "$mark linestart + $posend chars" + catch {$ui_diff tag add $prefix$style $a $b} + } + } + } + $ui_diff conf -state disabled + + if {[eof $fd]} { + close $fd + + if {$current_diff_queue ne {}} { + advance_diff_queue $cont_info + return + } + + set diff_active 0 + unlock_index + set scroll_pos [lindex $cont_info 0] + if {$scroll_pos ne {}} { + update + $ui_diff yview moveto $scroll_pos + } + ui_ready + + if {[$ui_diff index end] eq {2.0}} { + handle_empty_diff + } else { + set diff_empty_count 0 + } + + set callback [lindex $cont_info 1] + if {$callback ne {}} { + eval $callback + } + } +} + +proc apply_hunk {x y} { + global current_diff_path current_diff_header current_diff_side + global ui_diff ui_index file_states + + if {$current_diff_path eq {} || $current_diff_header eq {}} return + if {![lock_index apply_hunk]} return + + set apply_cmd {apply --cached --whitespace=nowarn} + set mi [lindex $file_states($current_diff_path) 0] + if {$current_diff_side eq $ui_index} { + set failed_msg [mc "Failed to unstage selected hunk."] + lappend apply_cmd --reverse + if {[string index $mi 0] ne {M}} { + unlock_index + return + } + } else { + set failed_msg [mc "Failed to stage selected hunk."] + if {[string index $mi 1] ne {M}} { + unlock_index + return + } + } + + set s_lno [lindex [split [$ui_diff index @$x,$y] .] 0] + set s_lno [$ui_diff search -backwards -regexp ^@@ $s_lno.0 0.0] + if {$s_lno eq {}} { + unlock_index + return + } + + set e_lno [$ui_diff search -forwards -regexp ^@@ "$s_lno + 1 lines" end] + if {$e_lno eq {}} { + set e_lno end + } + + if {[catch { + set enc [get_path_encoding $current_diff_path] + set p [eval git_write $apply_cmd] + fconfigure $p -translation binary -encoding $enc + puts -nonewline $p $current_diff_header + puts -nonewline $p [$ui_diff get $s_lno $e_lno] + close $p} err]} { + error_popup [append $failed_msg "\n\n$err"] + unlock_index + return + } + + $ui_diff conf -state normal + $ui_diff delete $s_lno $e_lno + $ui_diff conf -state disabled + + if {[$ui_diff get 1.0 end] eq "\n"} { + set o _ + } else { + set o ? + } + + if {$current_diff_side eq $ui_index} { + set mi ${o}M + } elseif {[string index $mi 0] eq {_}} { + set mi M$o + } else { + set mi ?$o + } + unlock_index + display_file $current_diff_path $mi + # This should trigger shift to the next changed file + if {$o eq {_}} { + reshow_diff + } +} + +proc apply_range_or_line {x y} { + global current_diff_path current_diff_header current_diff_side + global ui_diff ui_index file_states + + set selected [$ui_diff tag nextrange sel 0.0] + + if {$selected == {}} { + set first [$ui_diff index "@$x,$y"] + set last $first + } else { + set first [lindex $selected 0] + set last [lindex $selected 1] + } + + set first_l [$ui_diff index "$first linestart"] + set last_l [$ui_diff index "$last lineend"] + + if {$current_diff_path eq {} || $current_diff_header eq {}} return + if {![lock_index apply_hunk]} return + + set apply_cmd {apply --cached --whitespace=nowarn} + set mi [lindex $file_states($current_diff_path) 0] + if {$current_diff_side eq $ui_index} { + set failed_msg [mc "Failed to unstage selected line."] + set to_context {+} + lappend apply_cmd --reverse + if {[string index $mi 0] ne {M}} { + unlock_index + return + } + } else { + set failed_msg [mc "Failed to stage selected line."] + set to_context {-} + if {[string index $mi 1] ne {M}} { + unlock_index + return + } + } + + set wholepatch {} + + while {$first_l < $last_l} { + set i_l [$ui_diff search -backwards -regexp ^@@ $first_l 0.0] + if {$i_l eq {}} { + # If there's not a @@ above, then the selected range + # must have come before the first_l @@ + set i_l [$ui_diff search -regexp ^@@ $first_l $last_l] + } + if {$i_l eq {}} { + unlock_index + return + } + # $i_l is now at the beginning of a line + + # pick start line number from hunk header + set hh [$ui_diff get $i_l "$i_l + 1 lines"] + set hh [lindex [split $hh ,] 0] + set hln [lindex [split $hh -] 1] + + # There is a special situation to take care of. Consider this + # hunk: + # + # @@ -10,4 +10,4 @@ + # context before + # -old 1 + # -old 2 + # +new 1 + # +new 2 + # context after + # + # We used to keep the context lines in the order they appear in + # the hunk. But then it is not possible to correctly stage only + # "-old 1" and "+new 1" - it would result in this staged text: + # + # context before + # old 2 + # new 1 + # context after + # + # (By symmetry it is not possible to *un*stage "old 2" and "new + # 2".) + # + # We resolve the problem by introducing an asymmetry, namely, + # when a "+" line is *staged*, it is moved in front of the + # context lines that are generated from the "-" lines that are + # immediately before the "+" block. That is, we construct this + # patch: + # + # @@ -10,4 +10,5 @@ + # context before + # +new 1 + # old 1 + # old 2 + # context after + # + # But we do *not* treat "-" lines that are *un*staged in a + # special way. + # + # With this asymmetry it is possible to stage the change "old + # 1" -> "new 1" directly, and to stage the change "old 2" -> + # "new 2" by first staging the entire hunk and then unstaging + # the change "old 1" -> "new 1". + # + # Applying multiple lines adds complexity to the special + # situation. The pre_context must be moved after the entire + # first block of consecutive staged "+" lines, so that + # staging both additions gives the following patch: + # + # @@ -10,4 +10,6 @@ + # context before + # +new 1 + # +new 2 + # old 1 + # old 2 + # context after + + # This is non-empty if and only if we are _staging_ changes; + # then it accumulates the consecutive "-" lines (after + # converting them to context lines) in order to be moved after + # "+" change lines. + set pre_context {} + + set n 0 + set m 0 + set i_l [$ui_diff index "$i_l + 1 lines"] + set patch {} + while {[$ui_diff compare $i_l < "end - 1 chars"] && + [$ui_diff get $i_l "$i_l + 2 chars"] ne {@@}} { + set next_l [$ui_diff index "$i_l + 1 lines"] + set c1 [$ui_diff get $i_l] + if {[$ui_diff compare $first_l <= $i_l] && + [$ui_diff compare $i_l < $last_l] && + ($c1 eq {-} || $c1 eq {+})} { + # a line to stage/unstage + set ln [$ui_diff get $i_l $next_l] + if {$c1 eq {-}} { + set n [expr $n+1] + set patch "$patch$pre_context$ln" + set pre_context {} + } else { + set m [expr $m+1] + set patch "$patch$ln" + } + } elseif {$c1 ne {-} && $c1 ne {+}} { + # context line + set ln [$ui_diff get $i_l $next_l] + set patch "$patch$pre_context$ln" + # Skip the "\ No newline at end of + # file". Depending on the locale setting + # we don't know what this line looks + # like exactly. The only thing we do + # know is that it starts with "\ " + if {![string match {\\ *} $ln]} { + set n [expr $n+1] + set m [expr $m+1] + } + set pre_context {} + } elseif {$c1 eq $to_context} { + # turn change line into context line + set ln [$ui_diff get "$i_l + 1 chars" $next_l] + if {$c1 eq {-}} { + set pre_context "$pre_context $ln" + } else { + set patch "$patch $ln" + } + set n [expr $n+1] + set m [expr $m+1] + } else { + # a change in the opposite direction of + # to_context which is outside the range of + # lines to apply. + set patch "$patch$pre_context" + set pre_context {} + } + set i_l $next_l + } + set patch "$patch$pre_context" + set wholepatch "$wholepatch@@ -$hln,$n +$hln,$m @@\n$patch" + set first_l [$ui_diff index "$next_l + 1 lines"] + } + + if {[catch { + set enc [get_path_encoding $current_diff_path] + set p [eval git_write $apply_cmd] + fconfigure $p -translation binary -encoding $enc + puts -nonewline $p $current_diff_header + puts -nonewline $p $wholepatch + close $p} err]} { + error_popup [append $failed_msg "\n\n$err"] + } + + unlock_index +} diff --cc git-gui/lib/option.tcl index 23c9ae72a4,0000000000..b5b6b2fea6 mode 100644,000000..100644 --- a/git-gui/lib/option.tcl +++ b/git-gui/lib/option.tcl @@@ -1,348 -1,0 +1,349 @@@ +# git-gui options editor +# Copyright (C) 2006, 2007 Shawn Pearce + +proc config_check_encodings {} { + global repo_config_new global_config_new + + set enc $global_config_new(gui.encoding) + if {$enc eq {}} { + set global_config_new(gui.encoding) [encoding system] + } elseif {[tcl_encoding $enc] eq {}} { + error_popup [mc "Invalid global encoding '%s'" $enc] + return 0 + } + + set enc $repo_config_new(gui.encoding) + if {$enc eq {}} { + set repo_config_new(gui.encoding) [encoding system] + } elseif {[tcl_encoding $enc] eq {}} { + error_popup [mc "Invalid repo encoding '%s'" $enc] + return 0 + } + + return 1 +} + +proc save_config {} { + global default_config font_descs + global repo_config global_config system_config + global repo_config_new global_config_new + global ui_comm_spell + + foreach option $font_descs { + set name [lindex $option 0] + set font [lindex $option 1] + font configure $font \ + -family $global_config_new(gui.$font^^family) \ + -size $global_config_new(gui.$font^^size) + font configure ${font}bold \ + -family $global_config_new(gui.$font^^family) \ + -size $global_config_new(gui.$font^^size) + font configure ${font}italic \ + -family $global_config_new(gui.$font^^family) \ + -size $global_config_new(gui.$font^^size) + set global_config_new(gui.$name) [font configure $font] + unset global_config_new(gui.$font^^family) + unset global_config_new(gui.$font^^size) + } + + foreach name [array names default_config] { + set value $global_config_new($name) + if {$value ne $global_config($name)} { + if {$value eq $system_config($name)} { + catch {git config --global --unset $name} + } else { + regsub -all "\[{}\]" $value {"} value + git config --global $name $value + } + set global_config($name) $value + if {$value eq $repo_config($name)} { + catch {git config --unset $name} + set repo_config($name) $value + } + } + } + + foreach name [array names default_config] { + set value $repo_config_new($name) + if {$value ne $repo_config($name)} { + if {$value eq $global_config($name)} { + catch {git config --unset $name} + } else { + regsub -all "\[{}\]" $value {"} value + git config $name $value + } + set repo_config($name) $value + } + } + + if {[info exists repo_config(gui.spellingdictionary)]} { + set value $repo_config(gui.spellingdictionary) + if {$value eq {none}} { + if {[info exists ui_comm_spell]} { + $ui_comm_spell stop + } + } elseif {[info exists ui_comm_spell]} { + $ui_comm_spell lang $value + } + } +} + +proc do_options {} { + global repo_config global_config font_descs + global repo_config_new global_config_new + global ui_comm_spell use_ttk NS + + array unset repo_config_new + array unset global_config_new + foreach name [array names repo_config] { + set repo_config_new($name) $repo_config($name) + } + load_config 1 + foreach name [array names repo_config] { + switch -- $name { + gui.diffcontext {continue} + } + set repo_config_new($name) $repo_config($name) + } + foreach name [array names global_config] { + set global_config_new($name) $global_config($name) + } + + set w .options_editor + Dialog $w + wm withdraw $w + wm transient $w [winfo parent $w] + wm geometry $w "+[winfo rootx .]+[winfo rooty .]" + + ${NS}::frame $w.buttons + ${NS}::button $w.buttons.restore -text [mc "Restore Defaults"] \ + -default normal \ + -command do_restore_defaults + pack $w.buttons.restore -side left + ${NS}::button $w.buttons.save -text [mc Save] \ + -default active \ + -command [list do_save_config $w] + pack $w.buttons.save -side right + ${NS}::button $w.buttons.cancel -text [mc "Cancel"] \ + -default normal \ + -command [list destroy $w] + pack $w.buttons.cancel -side right -padx 5 + pack $w.buttons -side bottom -fill x -pady 10 -padx 10 + + ${NS}::labelframe $w.repo -text [mc "%s Repository" [reponame]] + ${NS}::labelframe $w.global -text [mc "Global (All Repositories)"] + pack $w.repo -side left -fill both -expand 1 -pady 5 -padx 5 + pack $w.global -side right -fill both -expand 1 -pady 5 -padx 5 + + set optid 0 + foreach option { + {t user.name {mc "User Name"}} + {t user.email {mc "Email Address"}} + + {b merge.summary {mc "Summarize Merge Commits"}} + {i-1..5 merge.verbosity {mc "Merge Verbosity"}} + {b merge.diffstat {mc "Show Diffstat After Merge"}} + {t merge.tool {mc "Use Merge Tool"}} + + {b gui.trustmtime {mc "Trust File Modification Timestamps"}} + {b gui.pruneduringfetch {mc "Prune Tracking Branches During Fetch"}} + {b gui.matchtrackingbranch {mc "Match Tracking Branches"}} + {b gui.textconv {mc "Use Textconv For Diffs and Blames"}} + {b gui.fastcopyblame {mc "Blame Copy Only On Changed Files"}} + {i-0..100 gui.maxrecentrepo {mc "Maximum Length of Recent Repositories List"}} + {i-20..200 gui.copyblamethreshold {mc "Minimum Letters To Blame Copy On"}} + {i-0..300 gui.blamehistoryctx {mc "Blame History Context Radius (days)"}} + {i-1..99 gui.diffcontext {mc "Number of Diff Context Lines"}} + {t gui.diffopts {mc "Additional Diff Parameters"}} + {i-0..99 gui.commitmsgwidth {mc "Commit Message Text Width"}} + {t gui.newbranchtemplate {mc "New Branch Name Template"}} + {c gui.encoding {mc "Default File Contents Encoding"}} + {b gui.warndetachedcommit {mc "Warn before committing to a detached head"}} + {s gui.stageuntracked {mc "Staging of untracked files"} {list "yes" "no" "ask"}} + {b gui.displayuntracked {mc "Show untracked files"}} ++ {i-1..99 gui.tabsize {mc "Tab spacing"}} + } { + set type [lindex $option 0] + set name [lindex $option 1] + set text [eval [lindex $option 2]] + incr optid + foreach f {repo global} { + switch -glob -- $type { + b { + ${NS}::checkbutton $w.$f.$optid -text $text \ + -variable ${f}_config_new($name) \ + -onvalue true \ + -offvalue false + pack $w.$f.$optid -side top -anchor w + } + i-* { + regexp -- {-(\d+)\.\.(\d+)$} $type _junk min max + ${NS}::frame $w.$f.$optid + ${NS}::label $w.$f.$optid.l -text "$text:" + pack $w.$f.$optid.l -side left -anchor w -fill x + tspinbox $w.$f.$optid.v \ + -textvariable ${f}_config_new($name) \ + -from $min \ + -to $max \ + -increment 1 \ + -width [expr {1 + [string length $max]}] + bind $w.$f.$optid.v {%W selection range 0 end} + pack $w.$f.$optid.v -side right -anchor e -padx 5 + pack $w.$f.$optid -side top -anchor w -fill x + } + c - + t { + ${NS}::frame $w.$f.$optid + ${NS}::label $w.$f.$optid.l -text "$text:" + ${NS}::entry $w.$f.$optid.v \ + -width 20 \ + -textvariable ${f}_config_new($name) + pack $w.$f.$optid.l -side left -anchor w + pack $w.$f.$optid.v -side left -anchor w \ + -fill x -expand 1 \ + -padx 5 + if {$type eq {c}} { + menu $w.$f.$optid.m + build_encoding_menu $w.$f.$optid.m \ + [list set ${f}_config_new($name)] 1 + ${NS}::button $w.$f.$optid.b \ + -text [mc "Change"] \ + -command [list popup_btn_menu \ + $w.$f.$optid.m $w.$f.$optid.b] + pack $w.$f.$optid.b -side left -anchor w + } + pack $w.$f.$optid -side top -anchor w -fill x + } + s { + set opts [eval [lindex $option 3]] + ${NS}::frame $w.$f.$optid + ${NS}::label $w.$f.$optid.l -text "$text:" + if {$use_ttk} { + ttk::combobox $w.$f.$optid.v \ + -textvariable ${f}_config_new($name) \ + -values $opts -state readonly + } else { + eval tk_optionMenu $w.$f.$optid.v \ + ${f}_config_new($name) \ + $opts + } + pack $w.$f.$optid.l -side left -anchor w -fill x + pack $w.$f.$optid.v -side right -anchor e -padx 5 + pack $w.$f.$optid -side top -anchor w -fill x + } + } + } + } + + set all_dicts [linsert \ + [spellcheck::available_langs] \ + 0 \ + none] + incr optid + foreach f {repo global} { + if {![info exists ${f}_config_new(gui.spellingdictionary)]} { + if {[info exists ui_comm_spell]} { + set value [$ui_comm_spell lang] + } else { + set value none + } + set ${f}_config_new(gui.spellingdictionary) $value + } + + ${NS}::frame $w.$f.$optid + ${NS}::label $w.$f.$optid.l -text [mc "Spelling Dictionary:"] + if {$use_ttk} { + ttk::combobox $w.$f.$optid.v \ + -textvariable ${f}_config_new(gui.spellingdictionary) \ + -values $all_dicts -state readonly + } else { + eval tk_optionMenu $w.$f.$optid.v \ + ${f}_config_new(gui.spellingdictionary) \ + $all_dicts + } + pack $w.$f.$optid.l -side left -anchor w -fill x + pack $w.$f.$optid.v -side right -anchor e -padx 5 + pack $w.$f.$optid -side top -anchor w -fill x + } + unset all_dicts + + set all_fonts [lsort [font families]] + foreach option $font_descs { + set name [lindex $option 0] + set font [lindex $option 1] + set text [eval [lindex $option 2]] + + set global_config_new(gui.$font^^family) \ + [font configure $font -family] + set global_config_new(gui.$font^^size) \ + [font configure $font -size] + + ${NS}::frame $w.global.$name + ${NS}::label $w.global.$name.l -text "$text:" + ${NS}::button $w.global.$name.b \ + -text [mc "Change Font"] \ + -command [list \ + tchoosefont \ + $w \ + [mc "Choose %s" $text] \ + global_config_new(gui.$font^^family) \ + global_config_new(gui.$font^^size) \ + ] + ${NS}::label $w.global.$name.f -textvariable global_config_new(gui.$font^^family) + ${NS}::label $w.global.$name.s -textvariable global_config_new(gui.$font^^size) + ${NS}::label $w.global.$name.pt -text [mc "pt."] + pack $w.global.$name.l -side left -anchor w + pack $w.global.$name.b -side right -anchor e + pack $w.global.$name.pt -side right -anchor w + pack $w.global.$name.s -side right -anchor w + pack $w.global.$name.f -side right -anchor w + pack $w.global.$name -side top -anchor w -fill x + } + + bind $w "grab $w; focus $w.buttons.save" + bind $w "destroy $w" + bind $w [list do_save_config $w] + + if {[is_MacOSX]} { + set t [mc "Preferences"] + } else { + set t [mc "Options"] + } + wm title $w "[appname] ([reponame]): $t" + wm deiconify $w + tkwait window $w +} + +proc do_restore_defaults {} { + global font_descs default_config repo_config system_config + global repo_config_new global_config_new + + foreach name [array names default_config] { + set repo_config_new($name) $system_config($name) + set global_config_new($name) $system_config($name) + } + + foreach option $font_descs { + set name [lindex $option 0] + set repo_config(gui.$name) $system_config(gui.$name) + } + apply_config + + foreach option $font_descs { + set name [lindex $option 0] + set font [lindex $option 1] + set global_config_new(gui.$font^^family) \ + [font configure $font -family] + set global_config_new(gui.$font^^size) \ + [font configure $font -size] + } +} + +proc do_save_config {w} { + if {![config_check_encodings]} return + if {[catch {save_config} err]} { + error_popup [strcat [mc "Failed to completely save options:"] "\n\n$err"] + } + reshow_diff + destroy $w +} diff --cc git-gui/macosx/AppMain.tcl index 738bdd03ed,0000000000..b6c6dc3500 mode 100644,000000..100644 --- a/git-gui/macosx/AppMain.tcl +++ b/git-gui/macosx/AppMain.tcl @@@ -1,24 -1,0 +1,29 @@@ +set gitexecdir {@@gitexecdir@@} - set gitguilib {@@GITGUI_LIBDIR@@} ++if { [info exists ::env(GIT_GUI_LIB_DIR) ] } { ++ set gitguilib $::env(GIT_GUI_LIB_DIR) ++} else { ++ set gitguilib {@@GITGUI_LIBDIR@@} ++} ++ +set env(PATH) "$gitexecdir:$env(PATH)" + +if {[string first -psn [lindex $argv 0]] == 0} { + lset argv 0 [file join $gitexecdir git-gui] +} + +if {[file tail [lindex $argv 0]] eq {gitk}} { + set argv0 [lindex $argv 0] + set AppMain_source $argv0 +} else { + set argv0 [file join $gitexecdir [file tail [lindex $argv 0]]] + set AppMain_source [file join $gitguilib git-gui.tcl] + if {[info exists env(PWD)]} { + cd $env(PWD) + } elseif {[pwd] eq {/}} { + cd $env(HOME) + } +} + +unset gitexecdir gitguilib +set argv [lrange $argv 1 end] +source $AppMain_source diff --cc git-gui/po/bg.po index 89b3a4e53d,0000000000..4d9b039dc2 mode 100644,000000..100644 --- a/git-gui/po/bg.po +++ b/git-gui/po/bg.po @@@ -1,2694 -1,0 +1,2714 @@@ +# Bulgarian translation of git-gui po-file. - # Copyright (C) 2012, 2013, 2014 Alexander Shopov . ++# Copyright (C) 2012, 2013, 2014, 2015 Alexander Shopov . +# This file is distributed under the same license as the git package. - # Alexander Shopov , 2012, 2013, 2014. ++# Alexander Shopov , 2012, 2013, 2014, 2015. +# +# +msgid "" +msgstr "" +"Project-Id-Version: git-gui master\n" +"Report-Msgid-Bugs-To: \n" - "POT-Creation-Date: 2014-01-13 20:45+0200\n" - "PO-Revision-Date: 2014-01-13 21:31+0200\n" ++"POT-Creation-Date: 2015-04-07 07:37+0300\n" ++"PO-Revision-Date: 2015-04-07 07:46+0300\n" +"Last-Translator: Alexander Shopov \n" +"Language-Team: Bulgarian \n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + - #: git-gui.sh:859 ++#: git-gui.sh:861 +#, tcl-format +msgid "Invalid font specified in %s:" - msgstr "Указан е неправилен шрифт в %s:" ++msgstr "Указан е неправилен шрифт в „%s“:" + - #: git-gui.sh:912 ++#: git-gui.sh:915 +msgid "Main Font" +msgstr "Основен шрифт" + - #: git-gui.sh:913 ++#: git-gui.sh:916 +msgid "Diff/Console Font" +msgstr "Шрифт за разликите/конзолата" + - #: git-gui.sh:928 git-gui.sh:942 git-gui.sh:955 git-gui.sh:1045 - #: git-gui.sh:1064 git-gui.sh:3115 ++#: git-gui.sh:931 git-gui.sh:945 git-gui.sh:958 git-gui.sh:1048 ++#: git-gui.sh:1067 git-gui.sh:3125 +msgid "git-gui: fatal error" +msgstr "git-gui: фатална грешка" + - #: git-gui.sh:929 ++#: git-gui.sh:932 +msgid "Cannot find git in PATH." +msgstr "Командата git липсва в пътя (PATH)." + - #: git-gui.sh:956 ++#: git-gui.sh:959 +msgid "Cannot parse Git version string:" +msgstr "Низът с версията на Git не може да бъде интерпретиран:" + - #: git-gui.sh:981 ++#: git-gui.sh:984 +#, tcl-format +msgid "" +"Git version cannot be determined.\n" +"\n" +"%s claims it is version '%s'.\n" +"\n" +"%s requires at least Git 1.5.0 or later.\n" +"\n" +"Assume '%s' is version 1.5.0?\n" +msgstr "" +"Версията на Git не може да бъде определена.\n" +"\n" - "Версията на %s изглежда, че е „%s“.\n" ++"Версията на „%s“ изглежда, че е „%s“.\n" +"\n" - "%s изисква Git, версия поне 1.5.0.\n" ++"„%s“ изисква Git, версия поне 1.5.0.\n" +"\n" - "Да се приеме ли, че „%s“ е версия 1.5.0?\n" ++"Да се приеме ли, че „%s“ е версия „1.5.0“?\n" + - #: git-gui.sh:1278 ++#: git-gui.sh:1281 +msgid "Git directory not found:" +msgstr "Директорията на Git не е открита:" + - #: git-gui.sh:1312 ++#: git-gui.sh:1315 +msgid "Cannot move to top of working directory:" +msgstr "Не може да се премине към родителската директория." + - #: git-gui.sh:1320 ++#: git-gui.sh:1323 +msgid "Cannot use bare repository:" +msgstr "Голо хранилище не може да се използва:" + - #: git-gui.sh:1328 ++#: git-gui.sh:1331 +msgid "No working directory" +msgstr "Работната директория липсва" + - #: git-gui.sh:1500 lib/checkout_op.tcl:306 ++#: git-gui.sh:1503 lib/checkout_op.tcl:306 +msgid "Refreshing file status..." +msgstr "Обновяване на състоянието на файла…" + - #: git-gui.sh:1560 ++#: git-gui.sh:1563 +msgid "Scanning for modified files ..." +msgstr "Проверка за променени файлове…" + - #: git-gui.sh:1632 ++#: git-gui.sh:1639 +msgid "Calling prepare-commit-msg hook..." - msgstr "Куката prepare-commit-msg се изпълнява в момента…" ++msgstr "Куката „prepare-commit-msg“ се изпълнява в момента…" + - #: git-gui.sh:1649 ++#: git-gui.sh:1656 +msgid "Commit declined by prepare-commit-msg hook." - msgstr "Подаването е отхвърлено от куката prepare-commit-msg." ++msgstr "Подаването е отхвърлено от куката „prepare-commit-msg“." + - #: git-gui.sh:1807 lib/browser.tcl:252 ++#: git-gui.sh:1814 lib/browser.tcl:252 +msgid "Ready." +msgstr "Готово." + - #: git-gui.sh:1965 ++#: git-gui.sh:1978 +#, tcl-format - msgid "Displaying only %s of %s files." - msgstr "Показване на само %s от %s файла." ++msgid "" ++"Display limit (gui.maxfilesdisplayed = %s) reached, not showing all %s files." ++msgstr "" ++"Достигнат е максималният брой файлове за показване (gui.maxfilesdisplayed = " ++"%s). Файловете са общо %s." + - #: git-gui.sh:2091 ++#: git-gui.sh:2101 +msgid "Unmodified" +msgstr "Непроменен" + - #: git-gui.sh:2093 ++#: git-gui.sh:2103 +msgid "Modified, not staged" +msgstr "Променен, но не е в индекса" + - #: git-gui.sh:2094 git-gui.sh:2106 ++#: git-gui.sh:2104 git-gui.sh:2116 +msgid "Staged for commit" +msgstr "В индекса за подаване" + - #: git-gui.sh:2095 git-gui.sh:2107 ++#: git-gui.sh:2105 git-gui.sh:2117 +msgid "Portions staged for commit" +msgstr "Части са в индекса за подаване" + - #: git-gui.sh:2096 git-gui.sh:2108 ++#: git-gui.sh:2106 git-gui.sh:2118 +msgid "Staged for commit, missing" +msgstr "В индекса за подаване, но липсва" + - #: git-gui.sh:2098 ++#: git-gui.sh:2108 +msgid "File type changed, not staged" +msgstr "Видът на файла е сменен, но не е в индекса" + - #: git-gui.sh:2099 git-gui.sh:2100 ++#: git-gui.sh:2109 git-gui.sh:2110 +msgid "File type changed, old type staged for commit" - msgstr "Видът на файла е сменен, в индекса е старият" ++msgstr "Видът на файла е сменен, но в индекса е все още старият" + - #: git-gui.sh:2101 ++#: git-gui.sh:2111 +msgid "File type changed, staged" +msgstr "Видът на файла е сменен и е в индекса" + - #: git-gui.sh:2102 ++#: git-gui.sh:2112 +msgid "File type change staged, modification not staged" - msgstr "Видът на файла е сменен, промяната не е в индекса" ++msgstr "Видът на файла е сменен, но промяната не е в индекса" + - #: git-gui.sh:2103 ++#: git-gui.sh:2113 +msgid "File type change staged, file missing" +msgstr "Видът на файла е сменен, файлът липсва" + - #: git-gui.sh:2105 ++#: git-gui.sh:2115 +msgid "Untracked, not staged" +msgstr "Неследен" + - #: git-gui.sh:2110 ++#: git-gui.sh:2120 +msgid "Missing" +msgstr "Липсващ" + - #: git-gui.sh:2111 ++#: git-gui.sh:2121 +msgid "Staged for removal" +msgstr "В индекса за изтриване" + - #: git-gui.sh:2112 ++#: git-gui.sh:2122 +msgid "Staged for removal, still present" +msgstr "В индекса за изтриване, но още го има" + - #: git-gui.sh:2114 git-gui.sh:2115 git-gui.sh:2116 git-gui.sh:2117 - #: git-gui.sh:2118 git-gui.sh:2119 ++#: git-gui.sh:2124 git-gui.sh:2125 git-gui.sh:2126 git-gui.sh:2127 ++#: git-gui.sh:2128 git-gui.sh:2129 +msgid "Requires merge resolution" +msgstr "Изисква коригиране при сливане" + - #: git-gui.sh:2154 ++#: git-gui.sh:2164 +msgid "Starting gitk... please wait..." - msgstr "Стартиране на gitk…, изчакайте…" ++msgstr "Стартиране на „gitk“…, изчакайте…" + - #: git-gui.sh:2166 ++#: git-gui.sh:2176 +msgid "Couldn't find gitk in PATH" - msgstr "В пътищата, определени от променливата PATH, липсва изпълним gitk" ++msgstr "Командата „gitk“ липсва в пътищата, определени от променливата PATH." + - #: git-gui.sh:2225 ++#: git-gui.sh:2235 +msgid "Couldn't find git gui in PATH" - msgstr "В пътищата, определени от променливата PATH, липсва изпълним git gui" ++msgstr "" ++"Командата „git gui“ липсва в пътищата, определени от променливата PATH." + - #: git-gui.sh:2644 lib/choose_repository.tcl:40 ++#: git-gui.sh:2654 lib/choose_repository.tcl:41 +msgid "Repository" +msgstr "Хранилище" + - #: git-gui.sh:2645 ++#: git-gui.sh:2655 +msgid "Edit" +msgstr "Редактиране" + - #: git-gui.sh:2647 lib/choose_rev.tcl:567 ++#: git-gui.sh:2657 lib/choose_rev.tcl:567 +msgid "Branch" +msgstr "Клон" + - #: git-gui.sh:2650 lib/choose_rev.tcl:554 ++#: git-gui.sh:2660 lib/choose_rev.tcl:554 +msgid "Commit@@noun" +msgstr "Подаване" + - #: git-gui.sh:2653 lib/merge.tcl:123 lib/merge.tcl:152 lib/merge.tcl:170 ++#: git-gui.sh:2663 lib/merge.tcl:123 lib/merge.tcl:152 lib/merge.tcl:170 +msgid "Merge" +msgstr "Сливане" + - #: git-gui.sh:2654 lib/choose_rev.tcl:563 ++#: git-gui.sh:2664 lib/choose_rev.tcl:563 +msgid "Remote" +msgstr "Отдалечено хранилище" + - #: git-gui.sh:2657 ++#: git-gui.sh:2667 +msgid "Tools" +msgstr "Команди" + - #: git-gui.sh:2666 ++#: git-gui.sh:2676 +msgid "Explore Working Copy" +msgstr "Разглеждане на работното копие" + - #: git-gui.sh:2672 ++#: git-gui.sh:2682 +msgid "Git Bash" - msgstr "Bash на Git" ++msgstr "Bash за Git" + - #: git-gui.sh:2682 ++#: git-gui.sh:2692 +msgid "Browse Current Branch's Files" +msgstr "Разглеждане на файловете в текущия клон" + - #: git-gui.sh:2686 ++#: git-gui.sh:2696 +msgid "Browse Branch Files..." - msgstr "Разглеждане на текущия клон" ++msgstr "Разглеждане на текущия клон…" + - #: git-gui.sh:2691 ++#: git-gui.sh:2701 +msgid "Visualize Current Branch's History" +msgstr "Визуализация на историята на текущия клон" + - #: git-gui.sh:2695 ++#: git-gui.sh:2705 +msgid "Visualize All Branch History" +msgstr "Визуализация на историята на всички клонове" + - #: git-gui.sh:2702 ++#: git-gui.sh:2712 +#, tcl-format +msgid "Browse %s's Files" +msgstr "Разглеждане на файловете в %s" + - #: git-gui.sh:2704 ++#: git-gui.sh:2714 +#, tcl-format +msgid "Visualize %s's History" +msgstr "Визуализация на историята на %s" + - #: git-gui.sh:2709 lib/database.tcl:40 lib/database.tcl:66 ++#: git-gui.sh:2719 lib/database.tcl:40 lib/database.tcl:66 +msgid "Database Statistics" +msgstr "Статистика на базата от данни" + - #: git-gui.sh:2712 lib/database.tcl:33 ++#: git-gui.sh:2722 lib/database.tcl:33 +msgid "Compress Database" +msgstr "Компресиране на базата от данни" + - #: git-gui.sh:2715 ++#: git-gui.sh:2725 +msgid "Verify Database" +msgstr "Проверка на базата от данни" + - #: git-gui.sh:2722 git-gui.sh:2726 git-gui.sh:2730 lib/shortcut.tcl:8 ++#: git-gui.sh:2732 git-gui.sh:2736 git-gui.sh:2740 lib/shortcut.tcl:8 +#: lib/shortcut.tcl:40 lib/shortcut.tcl:72 +msgid "Create Desktop Icon" +msgstr "Добавяне на икона на работния плот" + - #: git-gui.sh:2738 lib/choose_repository.tcl:192 lib/choose_repository.tcl:200 ++#: git-gui.sh:2748 lib/choose_repository.tcl:193 lib/choose_repository.tcl:201 +msgid "Quit" +msgstr "Спиране на програмата" + - #: git-gui.sh:2746 ++#: git-gui.sh:2756 +msgid "Undo" +msgstr "Отмяна" + - #: git-gui.sh:2749 ++#: git-gui.sh:2759 +msgid "Redo" +msgstr "Повторение" + - #: git-gui.sh:2753 git-gui.sh:3348 ++#: git-gui.sh:2763 git-gui.sh:3368 +msgid "Cut" +msgstr "Отрязване" + - #: git-gui.sh:2756 git-gui.sh:3351 git-gui.sh:3425 git-gui.sh:3510 ++#: git-gui.sh:2766 git-gui.sh:3371 git-gui.sh:3445 git-gui.sh:3530 +#: lib/console.tcl:69 +msgid "Copy" +msgstr "Копиране" + - #: git-gui.sh:2759 git-gui.sh:3354 ++#: git-gui.sh:2769 git-gui.sh:3374 +msgid "Paste" +msgstr "Поставяне" + - #: git-gui.sh:2762 git-gui.sh:3357 lib/remote_branch_delete.tcl:39 ++#: git-gui.sh:2772 git-gui.sh:3377 lib/remote_branch_delete.tcl:39 +#: lib/branch_delete.tcl:28 +msgid "Delete" +msgstr "Изтриване" + - #: git-gui.sh:2766 git-gui.sh:3361 git-gui.sh:3514 lib/console.tcl:71 ++#: git-gui.sh:2776 git-gui.sh:3381 git-gui.sh:3534 lib/console.tcl:71 +msgid "Select All" +msgstr "Избиране на всичко" + - #: git-gui.sh:2775 ++#: git-gui.sh:2785 +msgid "Create..." +msgstr "Създаване…" + - #: git-gui.sh:2781 ++#: git-gui.sh:2791 +msgid "Checkout..." +msgstr "Изтегляне…" + - #: git-gui.sh:2787 ++#: git-gui.sh:2797 +msgid "Rename..." +msgstr "Преименуване…" + - #: git-gui.sh:2792 ++#: git-gui.sh:2802 +msgid "Delete..." +msgstr "Изтриване…" + - #: git-gui.sh:2797 ++#: git-gui.sh:2807 +msgid "Reset..." +msgstr "Отмяна на промените…" + - #: git-gui.sh:2807 ++#: git-gui.sh:2817 +msgid "Done" +msgstr "Готово" + - #: git-gui.sh:2809 ++#: git-gui.sh:2819 +msgid "Commit@@verb" +msgstr "Подаване" + - #: git-gui.sh:2818 git-gui.sh:3289 ++#: git-gui.sh:2828 git-gui.sh:3309 +msgid "New Commit" - msgstr "Подаване" ++msgstr "Ново подаване" + - #: git-gui.sh:2826 git-gui.sh:3296 ++#: git-gui.sh:2836 git-gui.sh:3316 +msgid "Amend Last Commit" +msgstr "Поправяне на последното подаване" + - #: git-gui.sh:2836 git-gui.sh:3250 lib/remote_branch_delete.tcl:101 ++#: git-gui.sh:2846 git-gui.sh:3270 lib/remote_branch_delete.tcl:101 +msgid "Rescan" +msgstr "Обновяване" + - #: git-gui.sh:2842 ++#: git-gui.sh:2852 +msgid "Stage To Commit" +msgstr "Към индекса за подаване" + - #: git-gui.sh:2848 ++#: git-gui.sh:2858 +msgid "Stage Changed Files To Commit" +msgstr "Всички променени файлове към индекса за подаване" + - #: git-gui.sh:2854 ++#: git-gui.sh:2864 +msgid "Unstage From Commit" +msgstr "Изваждане от индекса за подаване" + - #: git-gui.sh:2860 lib/index.tcl:442 ++#: git-gui.sh:2870 lib/index.tcl:442 +msgid "Revert Changes" +msgstr "Връщане на оригинала" + - #: git-gui.sh:2868 git-gui.sh:3561 git-gui.sh:3592 ++#: git-gui.sh:2878 git-gui.sh:3581 git-gui.sh:3612 +msgid "Show Less Context" +msgstr "По-малко контекст" + - #: git-gui.sh:2872 git-gui.sh:3565 git-gui.sh:3596 ++#: git-gui.sh:2882 git-gui.sh:3585 git-gui.sh:3616 +msgid "Show More Context" +msgstr "Повече контекст" + - #: git-gui.sh:2879 git-gui.sh:3263 git-gui.sh:3372 ++#: git-gui.sh:2889 git-gui.sh:3283 git-gui.sh:3392 +msgid "Sign Off" +msgstr "Подписване" + - #: git-gui.sh:2895 ++#: git-gui.sh:2905 +msgid "Local Merge..." +msgstr "Локално сливане…" + - #: git-gui.sh:2900 ++#: git-gui.sh:2910 +msgid "Abort Merge..." +msgstr "Преустановяване на сливане…" + - #: git-gui.sh:2912 git-gui.sh:2940 ++#: git-gui.sh:2922 git-gui.sh:2950 +msgid "Add..." +msgstr "Добавяне…" + - #: git-gui.sh:2916 ++#: git-gui.sh:2926 +msgid "Push..." +msgstr "Избутване…" + - #: git-gui.sh:2920 ++#: git-gui.sh:2930 +msgid "Delete Branch..." +msgstr "Изтриване на клон…" + - #: git-gui.sh:2930 git-gui.sh:3543 ++#: git-gui.sh:2940 git-gui.sh:3563 +msgid "Options..." +msgstr "Опции…" + - #: git-gui.sh:2941 ++#: git-gui.sh:2951 +msgid "Remove..." +msgstr "Премахване…" + - #: git-gui.sh:2950 lib/choose_repository.tcl:54 ++#: git-gui.sh:2960 lib/choose_repository.tcl:55 +msgid "Help" +msgstr "Помощ" + - #: git-gui.sh:2954 git-gui.sh:2958 lib/choose_repository.tcl:48 - #: lib/choose_repository.tcl:57 lib/about.tcl:14 ++#: git-gui.sh:2964 git-gui.sh:2968 lib/choose_repository.tcl:49 ++#: lib/choose_repository.tcl:58 lib/about.tcl:14 +#, tcl-format +msgid "About %s" +msgstr "Относно %s" + - #: git-gui.sh:2982 ++#: git-gui.sh:2992 +msgid "Online Documentation" +msgstr "Документация в Интернет" + - #: git-gui.sh:2985 lib/choose_repository.tcl:51 lib/choose_repository.tcl:60 ++#: git-gui.sh:2995 lib/choose_repository.tcl:52 lib/choose_repository.tcl:61 +msgid "Show SSH Key" +msgstr "Показване на ключа за SSH" + - #: git-gui.sh:3004 git-gui.sh:3136 ++#: git-gui.sh:3014 git-gui.sh:3146 +msgid "Usage" +msgstr "Употреба" + - #: git-gui.sh:3085 lib/blame.tcl:573 ++#: git-gui.sh:3095 lib/blame.tcl:573 +msgid "Error" +msgstr "Грешка" + - #: git-gui.sh:3116 ++#: git-gui.sh:3126 +#, tcl-format +msgid "fatal: cannot stat path %s: No such file or directory" +msgstr "" - "фатално: пътят %s не може да бъде открит: такъв файл или директория няма" ++"ФАТАЛНА ГРЕШКА: пътят %s не може да бъде открит: такъв файл или директория " ++"няма" + - #: git-gui.sh:3149 ++#: git-gui.sh:3159 +msgid "Current Branch:" +msgstr "Текущ клон:" + - #: git-gui.sh:3175 ++#: git-gui.sh:3185 +msgid "Staged Changes (Will Commit)" +msgstr "Промени в индекса (за подаване)" + - #: git-gui.sh:3195 ++#: git-gui.sh:3205 +msgid "Unstaged Changes" +msgstr "Промени извън индекса" + - #: git-gui.sh:3256 ++#: git-gui.sh:3276 +msgid "Stage Changed" +msgstr "Индексът е променен" + - #: git-gui.sh:3275 lib/transport.tcl:137 lib/transport.tcl:229 ++#: git-gui.sh:3295 lib/transport.tcl:137 lib/transport.tcl:229 +msgid "Push" +msgstr "Изтласкване" + - #: git-gui.sh:3310 ++#: git-gui.sh:3330 +msgid "Initial Commit Message:" +msgstr "Първоначално съобщение при подаване:" + - #: git-gui.sh:3311 ++#: git-gui.sh:3331 +msgid "Amended Commit Message:" +msgstr "Поправено съобщение при подаване:" + - #: git-gui.sh:3312 ++#: git-gui.sh:3332 +msgid "Amended Initial Commit Message:" +msgstr "Поправено първоначално съобщение при подаване:" + - #: git-gui.sh:3313 ++#: git-gui.sh:3333 +msgid "Amended Merge Commit Message:" +msgstr "Поправено съобщение при подаване със сливане:" + - #: git-gui.sh:3314 ++#: git-gui.sh:3334 +msgid "Merge Commit Message:" +msgstr "Съобщение при подаване със сливане:" + - #: git-gui.sh:3315 ++#: git-gui.sh:3335 +msgid "Commit Message:" +msgstr "Съобщение при подаване:" + - #: git-gui.sh:3364 git-gui.sh:3518 lib/console.tcl:73 ++#: git-gui.sh:3384 git-gui.sh:3538 lib/console.tcl:73 +msgid "Copy All" +msgstr "Копиране на всичко" + - #: git-gui.sh:3388 lib/blame.tcl:105 ++#: git-gui.sh:3408 lib/blame.tcl:105 +msgid "File:" +msgstr "Файл:" + - #: git-gui.sh:3506 ++#: git-gui.sh:3526 +msgid "Refresh" +msgstr "Обновяване" + - #: git-gui.sh:3527 ++#: git-gui.sh:3547 +msgid "Decrease Font Size" +msgstr "По-едър шрифт" + - #: git-gui.sh:3531 ++#: git-gui.sh:3551 +msgid "Increase Font Size" +msgstr "По-дребен шрифт" + - #: git-gui.sh:3539 lib/blame.tcl:294 ++#: git-gui.sh:3559 lib/blame.tcl:294 +msgid "Encoding" +msgstr "Кодиране" + - #: git-gui.sh:3550 ++#: git-gui.sh:3570 +msgid "Apply/Reverse Hunk" +msgstr "Прилагане/връщане на парче" + - #: git-gui.sh:3555 ++#: git-gui.sh:3575 +msgid "Apply/Reverse Line" +msgstr "Прилагане/връщане на ред" + - #: git-gui.sh:3574 ++#: git-gui.sh:3594 +msgid "Run Merge Tool" +msgstr "Изпълнение на програмата за сливане" + - #: git-gui.sh:3579 ++#: git-gui.sh:3599 +msgid "Use Remote Version" +msgstr "Версия от отдалеченото хранилище" + - #: git-gui.sh:3583 ++#: git-gui.sh:3603 +msgid "Use Local Version" +msgstr "Локална версия" + - #: git-gui.sh:3587 ++#: git-gui.sh:3607 +msgid "Revert To Base" +msgstr "Връщане към родителската версия" + - #: git-gui.sh:3605 ++#: git-gui.sh:3625 +msgid "Visualize These Changes In The Submodule" +msgstr "Визуализиране на промените в подмодула" + - #: git-gui.sh:3609 ++#: git-gui.sh:3629 +msgid "Visualize Current Branch History In The Submodule" +msgstr "Визуализация на историята на текущия клон в историята за подмодула" + - #: git-gui.sh:3613 ++#: git-gui.sh:3633 +msgid "Visualize All Branch History In The Submodule" +msgstr "Визуализация на историята на всички клони в историята за подмодула" + - #: git-gui.sh:3618 ++#: git-gui.sh:3638 +msgid "Start git gui In The Submodule" +msgstr "Стартиране на „git gui“ за подмодула" + - #: git-gui.sh:3653 ++#: git-gui.sh:3673 +msgid "Unstage Hunk From Commit" +msgstr "Изваждане на парчето от подаването" + - #: git-gui.sh:3655 ++#: git-gui.sh:3675 +msgid "Unstage Lines From Commit" +msgstr "Изваждане на редовете от подаването" + - #: git-gui.sh:3657 ++#: git-gui.sh:3677 +msgid "Unstage Line From Commit" +msgstr "Изваждане на реда от подаването" + - #: git-gui.sh:3660 ++#: git-gui.sh:3680 +msgid "Stage Hunk For Commit" +msgstr "Добавяне на парчето за подаване" + - #: git-gui.sh:3662 ++#: git-gui.sh:3682 +msgid "Stage Lines For Commit" +msgstr "Добавяне на редовете за подаване" + - #: git-gui.sh:3664 ++#: git-gui.sh:3684 +msgid "Stage Line For Commit" +msgstr "Добавяне на реда за подаване" + - #: git-gui.sh:3689 ++#: git-gui.sh:3709 +msgid "Initializing..." +msgstr "Инициализиране…" + - #: git-gui.sh:3832 ++#: git-gui.sh:3852 +#, tcl-format +msgid "" +"Possible environment issues exist.\n" +"\n" +"The following environment variables are probably\n" +"going to be ignored by any Git subprocess run\n" +"by %s:\n" +"\n" +msgstr "" +"Възможно е да има проблем със средата.\n" +"\n" +"Най-вероятно следните променливи няма да бъдат\n" - "взети под внимание от подпроцесите Git изпълнени\n" ++"взети под внимание от подпроцесите на Git\n" +"от %s:\n" +"\n" + - #: git-gui.sh:3861 ++#: git-gui.sh:3881 +msgid "" +"\n" +"This is due to a known issue with the\n" +"Tcl binary distributed by Cygwin." +msgstr "" +"\n" +"Това е познат проблем и се дължи на\n" +"версията на Tcl включена в Cygwin." + - #: git-gui.sh:3866 ++#: git-gui.sh:3886 +#, tcl-format +msgid "" +"\n" +"\n" +"A good replacement for %s\n" +"is placing values for the user.name and\n" +"user.email settings into your personal\n" +"~/.gitconfig file.\n" +msgstr "" +"\n" +"\n" - "Добър заместител на %s\n" - "е да поставите настройките user.name и\n" - "user.email в личния си файл ~/.gitconfig.\n" ++"Добър заместител на „%s“\n" ++"е да поставите настройките „user.name“ и\n" ++"„user.email“ в личния си файл „~/.gitconfig“.\n" + +#: lib/spellcheck.tcl:57 +msgid "Unsupported spell checker" +msgstr "Тази програма за проверка на правописа не се поддържа" + +#: lib/spellcheck.tcl:65 +msgid "Spell checking is unavailable" +msgstr "Липсва програма за проверка на правописа" + +#: lib/spellcheck.tcl:68 +msgid "Invalid spell checking configuration" +msgstr "Неправилни настройки на проверката на правописа" + +#: lib/spellcheck.tcl:70 +#, tcl-format +msgid "Reverting dictionary to %s." +msgstr "Ползване на речник за език „%s“." + +#: lib/spellcheck.tcl:73 +msgid "Spell checker silently failed on startup" +msgstr "Програмата за правопис даже не стартира успешно." + +#: lib/spellcheck.tcl:80 +msgid "Unrecognized spell checker" +msgstr "Непозната програма за проверка на правописа" + +#: lib/spellcheck.tcl:186 +msgid "No Suggestions" +msgstr "Няма предложения" + +#: lib/spellcheck.tcl:388 +msgid "Unexpected EOF from spell checker" +msgstr "Неочакван край на файл от програмата за проверка на правописа" + +#: lib/spellcheck.tcl:392 +msgid "Spell Checker Failed" +msgstr "Грешка в програмата за проверка на правописа" + +#: lib/remote_add.tcl:20 +msgid "Add Remote" +msgstr "Добавяне на отдалечено хранилище" + +#: lib/remote_add.tcl:25 +msgid "Add New Remote" +msgstr "Добавяне на отдалечено хранилище" + +#: lib/remote_add.tcl:30 lib/tools_dlg.tcl:37 +msgid "Add" +msgstr "Добавяне" + +#: lib/remote_add.tcl:34 lib/browser.tcl:292 lib/branch_checkout.tcl:30 +#: lib/transport.tcl:141 lib/branch_rename.tcl:32 lib/choose_font.tcl:45 +#: lib/option.tcl:127 lib/tools_dlg.tcl:41 lib/tools_dlg.tcl:202 +#: lib/tools_dlg.tcl:345 lib/remote_branch_delete.tcl:43 +#: lib/checkout_op.tcl:579 lib/branch_create.tcl:37 lib/branch_delete.tcl:34 +#: lib/merge.tcl:174 +msgid "Cancel" +msgstr "Отказване" + +#: lib/remote_add.tcl:39 +msgid "Remote Details" +msgstr "Данни за отдалеченото хранилище" + +#: lib/remote_add.tcl:41 lib/tools_dlg.tcl:51 lib/branch_create.tcl:44 +msgid "Name:" +msgstr "Име:" + +#: lib/remote_add.tcl:50 +msgid "Location:" +msgstr "Местоположение:" + +#: lib/remote_add.tcl:60 +msgid "Further Action" +msgstr "Следващо действие" + +#: lib/remote_add.tcl:63 +msgid "Fetch Immediately" +msgstr "Незабавно доставяне" + +#: lib/remote_add.tcl:69 +msgid "Initialize Remote Repository and Push" +msgstr "Инициализиране на отдалеченото хранилище и изтласкване на промените" + +#: lib/remote_add.tcl:75 +msgid "Do Nothing Else Now" +msgstr "Да не се прави нищо" + +#: lib/remote_add.tcl:100 +msgid "Please supply a remote name." +msgstr "Задайте име за отдалеченото хранилище." + +#: lib/remote_add.tcl:113 +#, tcl-format +msgid "'%s' is not an acceptable remote name." +msgstr "Отдалечено хранилище не може да се казва „%s“." + +#: lib/remote_add.tcl:124 +#, tcl-format +msgid "Failed to add remote '%s' of location '%s'." +msgstr "Неуспешно добавяне на отдалеченото хранилище „%s“ от адрес „%s“." + +#: lib/remote_add.tcl:132 lib/transport.tcl:6 +#, tcl-format +msgid "fetch %s" +msgstr "доставяне на „%s“" + +#: lib/remote_add.tcl:133 +#, tcl-format +msgid "Fetching the %s" +msgstr "Доставяне на „%s“" + +#: lib/remote_add.tcl:156 +#, tcl-format +msgid "Do not know how to initialize repository at location '%s'." +msgstr "Хранилището с местоположение „%s“ не може да бъде инициализирано." + +#: lib/remote_add.tcl:162 lib/transport.tcl:54 lib/transport.tcl:92 +#: lib/transport.tcl:110 +#, tcl-format +msgid "push %s" +msgstr "изтласкване на „%s“" + +#: lib/remote_add.tcl:163 +#, tcl-format +msgid "Setting up the %s (at %s)" +msgstr "Добавяне на хранилище „%s“ (с адрес „%s“)" + +#: lib/browser.tcl:17 +msgid "Starting..." +msgstr "Стартиране…" + +#: lib/browser.tcl:27 +msgid "File Browser" +msgstr "Файлов браузър" + +#: lib/browser.tcl:132 lib/browser.tcl:149 +#, tcl-format +msgid "Loading %s..." +msgstr "Зареждане на „%s“…" + +#: lib/browser.tcl:193 +msgid "[Up To Parent]" +msgstr "[Към родителя]" + +#: lib/browser.tcl:275 lib/browser.tcl:282 +msgid "Browse Branch Files" +msgstr "Разглеждане на файловете в клона" + - #: lib/browser.tcl:288 lib/choose_repository.tcl:406 - #: lib/choose_repository.tcl:493 lib/choose_repository.tcl:502 - #: lib/choose_repository.tcl:1029 ++#: lib/browser.tcl:288 lib/choose_repository.tcl:422 ++#: lib/choose_repository.tcl:509 lib/choose_repository.tcl:518 ++#: lib/choose_repository.tcl:1074 +msgid "Browse" +msgstr "Разглеждане" + +#: lib/browser.tcl:297 lib/branch_checkout.tcl:35 lib/tools_dlg.tcl:321 +msgid "Revision" +msgstr "Версия" + +#: lib/tools.tcl:75 +#, tcl-format +msgid "Running %s requires a selected file." +msgstr "За изпълнението на „%s“ трябва да изберете файл." + +#: lib/tools.tcl:91 +#, tcl-format +msgid "Are you sure you want to run %1$s on file \"%2$s\"?" - msgstr "Сигурни ли сте, че искате да стартирате „%1$s“ върху „%2$s“?" ++msgstr "Сигурни ли сте, че искате да изпълните „%1$s“ върху файла „%2$s“?" + +#: lib/tools.tcl:95 +#, tcl-format +msgid "Are you sure you want to run %s?" - msgstr "Сигурни ли сте, че искате да стартирате „%s“?" ++msgstr "Сигурни ли сте, че искате да изпълните „%s“?" + +#: lib/tools.tcl:116 +#, tcl-format +msgid "Tool: %s" +msgstr "Команда: %s" + +#: lib/tools.tcl:117 +#, tcl-format +msgid "Running: %s" +msgstr "Изпълнение: %s" + +#: lib/tools.tcl:155 +#, tcl-format +msgid "Tool completed successfully: %s" +msgstr "Командата завърши успешно: %s" + +#: lib/tools.tcl:157 +#, tcl-format +msgid "Tool failed: %s" +msgstr "Командата върна грешка: %s" + +#: lib/branch_checkout.tcl:16 lib/branch_checkout.tcl:21 +msgid "Checkout Branch" +msgstr "Клон за изтегляне" + +#: lib/branch_checkout.tcl:26 +msgid "Checkout" +msgstr "Изтегляне" + - #: lib/branch_checkout.tcl:39 lib/option.tcl:309 lib/branch_create.tcl:69 ++#: lib/branch_checkout.tcl:39 lib/option.tcl:310 lib/branch_create.tcl:69 +msgid "Options" +msgstr "Опции" + +#: lib/branch_checkout.tcl:42 lib/branch_create.tcl:92 +msgid "Fetch Tracking Branch" +msgstr "Изтегляне на промените от следения клон" + +#: lib/branch_checkout.tcl:47 +msgid "Detach From Local Branch" +msgstr "Изтриване от локалния клон" + +#: lib/transport.tcl:7 +#, tcl-format +msgid "Fetching new changes from %s" - msgstr "Доставяне на промените от %s" ++msgstr "Доставяне на промените от „%s“" + +#: lib/transport.tcl:18 +#, tcl-format +msgid "remote prune %s" +msgstr "окастряне на следящите клони към „%s“" + +#: lib/transport.tcl:19 +#, tcl-format +msgid "Pruning tracking branches deleted from %s" +msgstr "Окастряне на следящите клони на изтритите клони от „%s“" + +#: lib/transport.tcl:25 +msgid "fetch all remotes" - msgstr "доставяне на всички хранилища" ++msgstr "доставяне на всички отдалечени хранилища" + +#: lib/transport.tcl:26 +msgid "Fetching new changes from all remotes" - msgstr "Доставяне на промените от всички отдалечени хранилища" ++msgstr "Доставяне на новите промени от всички отдалечени хранилища" + +#: lib/transport.tcl:40 +msgid "remote prune all remotes" - msgstr "окастряне на всички клони следящи изтрити клони" ++msgstr "окастряне на всички следящи клони" + +#: lib/transport.tcl:41 +msgid "Pruning tracking branches deleted from all remotes" +msgstr "" - "Окастряне на следящите клони на изтритите клони от всички отдалечени " - "хранилища" ++"Окастряне на всички клони, които следят изтрити клони от отдалечени хранилища" + +#: lib/transport.tcl:55 +#, tcl-format +msgid "Pushing changes to %s" - msgstr "Изтласкване на промените към %s" ++msgstr "Изтласкване на промените към „%s“" + +#: lib/transport.tcl:93 +#, tcl-format +msgid "Mirroring to %s" +msgstr "Изтласкване на всичко към „%s“" + +#: lib/transport.tcl:111 +#, tcl-format +msgid "Pushing %s %s to %s" - msgstr "Изтласкване на %s %s към %s" ++msgstr "Изтласкване на %s „%s“ към „%s“" + +#: lib/transport.tcl:132 +msgid "Push Branches" +msgstr "Клони за изтласкване" + +#: lib/transport.tcl:147 +msgid "Source Branches" +msgstr "Клони-източници" + +#: lib/transport.tcl:162 +msgid "Destination Repository" +msgstr "Целево хранилище" + +#: lib/transport.tcl:165 lib/remote_branch_delete.tcl:51 +msgid "Remote:" +msgstr "Отдалечено хранилище:" + +#: lib/transport.tcl:187 lib/remote_branch_delete.tcl:72 +msgid "Arbitrary Location:" +msgstr "Произволно местоположение:" + +#: lib/transport.tcl:205 +msgid "Transfer Options" +msgstr "Настройки при пренасянето" + +#: lib/transport.tcl:207 +msgid "Force overwrite existing branch (may discard changes)" +msgstr "" +"Изрично презаписване на съществуващ клон (някои промени може да бъдат " +"загубени)" + +#: lib/transport.tcl:211 +msgid "Use thin pack (for slow network connections)" +msgstr "Максимална компресия (за бавни мрежови връзки)" + +#: lib/transport.tcl:215 +msgid "Include tags" +msgstr "Включване на етикетите" + +#: lib/status_bar.tcl:87 +#, tcl-format +msgid "%s ... %*i of %*i %s (%3i%%)" +msgstr "%s… %*i от общо %*i %s (%3i%%)" + +#: lib/remote.tcl:200 +msgid "Push to" +msgstr "Изтласкване към" + +#: lib/remote.tcl:218 +msgid "Remove Remote" +msgstr "Премахване на отдалечено хранилище" + +#: lib/remote.tcl:223 +msgid "Prune from" +msgstr "Окастряне от" + +#: lib/remote.tcl:228 +msgid "Fetch from" +msgstr "Доставяне от" + +#: lib/sshkey.tcl:31 +msgid "No keys found." +msgstr "Не са открити ключове." + +#: lib/sshkey.tcl:34 +#, tcl-format +msgid "Found a public key in: %s" +msgstr "Открит е публичен ключ в „%s“" + +#: lib/sshkey.tcl:40 +msgid "Generate Key" +msgstr "Генериране на ключ" + +#: lib/sshkey.tcl:55 lib/checkout_op.tcl:146 lib/console.tcl:81 +#: lib/database.tcl:30 +msgid "Close" +msgstr "Затваряне" + +#: lib/sshkey.tcl:58 +msgid "Copy To Clipboard" +msgstr "Копиране към системния буфер" + +#: lib/sshkey.tcl:72 +msgid "Your OpenSSH Public Key" +msgstr "Публичният ви ключ за OpenSSH" + +#: lib/sshkey.tcl:80 +msgid "Generating..." +msgstr "Генериране…" + +#: lib/sshkey.tcl:86 +#, tcl-format +msgid "" +"Could not start ssh-keygen:\n" +"\n" +"%s" +msgstr "" +"Програмата „ssh-keygen“ не може да бъде стартирана:\n" +"\n" +"%s" + +#: lib/sshkey.tcl:113 +msgid "Generation failed." +msgstr "Неуспешно генериране." + +#: lib/sshkey.tcl:120 +msgid "Generation succeeded, but no keys found." +msgstr "Генерирането завърши успешно, а не са намерени ключове." + +#: lib/sshkey.tcl:123 +#, tcl-format +msgid "Your key is in: %s" +msgstr "Ключът ви е в „%s“" + +#: lib/branch_rename.tcl:15 lib/branch_rename.tcl:23 +msgid "Rename Branch" +msgstr "Преименуване на клон" + +#: lib/branch_rename.tcl:28 +msgid "Rename" +msgstr "Преименуване" + +#: lib/branch_rename.tcl:38 +msgid "Branch:" +msgstr "Клон:" + +#: lib/branch_rename.tcl:46 +msgid "New Name:" +msgstr "Ново име:" + +#: lib/branch_rename.tcl:81 +msgid "Please select a branch to rename." +msgstr "Изберете клон за преименуване." + +#: lib/branch_rename.tcl:92 lib/branch_create.tcl:154 +msgid "Please supply a branch name." +msgstr "Дайте име на клона." + +#: lib/branch_rename.tcl:102 lib/checkout_op.tcl:202 +#, tcl-format +msgid "Branch '%s' already exists." +msgstr "Клонът „%s“ вече съществува." + +#: lib/branch_rename.tcl:112 lib/branch_create.tcl:165 +#, tcl-format +msgid "'%s' is not an acceptable branch name." +msgstr "„%s“ не може да се използва за име на клон." + +#: lib/branch_rename.tcl:123 +#, tcl-format +msgid "Failed to rename '%s'." +msgstr "Неуспешно преименуване на „%s“." + +#: lib/choose_font.tcl:41 +msgid "Select" +msgstr "Избор" + +#: lib/choose_font.tcl:55 +msgid "Font Family" +msgstr "Шрифт" + +#: lib/choose_font.tcl:76 +msgid "Font Size" +msgstr "Размер" + +#: lib/choose_font.tcl:93 +msgid "Font Example" +msgstr "Мостра" + +#: lib/choose_font.tcl:105 +msgid "" +"This is example text.\n" +"If you like this text, it can be your font." +msgstr "" +"Това е примерен текст.\n" - "Ако ви харесва как изглежда, изберете този шрифт." ++"Ако ви харесва как изглежда, изберете шрифта." + +#: lib/option.tcl:11 +#, tcl-format +msgid "Invalid global encoding '%s'" +msgstr "Неправилно глобално кодиране „%s“" + +#: lib/option.tcl:19 +#, tcl-format +msgid "Invalid repo encoding '%s'" +msgstr "Неправилно кодиране „%s“ на хранилището" + +#: lib/option.tcl:119 +msgid "Restore Defaults" +msgstr "Стандартни настройки" + +#: lib/option.tcl:123 +msgid "Save" +msgstr "Запазване" + +#: lib/option.tcl:133 +#, tcl-format +msgid "%s Repository" +msgstr "Хранилище „%s“" + +#: lib/option.tcl:134 +msgid "Global (All Repositories)" +msgstr "Глобално (за всички хранилища)" + +#: lib/option.tcl:140 +msgid "User Name" +msgstr "Потребителско име" + +#: lib/option.tcl:141 +msgid "Email Address" +msgstr "Адрес на е-поща" + +#: lib/option.tcl:143 +msgid "Summarize Merge Commits" +msgstr "Обобщаване на подаванията при сливане" + +#: lib/option.tcl:144 +msgid "Merge Verbosity" +msgstr "Подробности при сливанията" + +#: lib/option.tcl:145 +msgid "Show Diffstat After Merge" +msgstr "Извеждане на статистика след сливанията" + +#: lib/option.tcl:146 +msgid "Use Merge Tool" +msgstr "Използване на програма за сливане" + +#: lib/option.tcl:148 +msgid "Trust File Modification Timestamps" +msgstr "Доверие във времето на промяна на файловете" + +#: lib/option.tcl:149 +msgid "Prune Tracking Branches During Fetch" +msgstr "Окастряне на следящите клонове при доставяне" + +#: lib/option.tcl:150 +msgid "Match Tracking Branches" +msgstr "Напасване на следящите клонове" + +#: lib/option.tcl:151 +msgid "Use Textconv For Diffs and Blames" - msgstr "Използване на „textconv“ за разликите и анотациите" ++msgstr "" ++"Преобразуване на текста с „textconv“ при анотиране и извеждане на разлики" + +#: lib/option.tcl:152 +msgid "Blame Copy Only On Changed Files" +msgstr "Анотиране на копието само по променените файлове" + +#: lib/option.tcl:153 +msgid "Maximum Length of Recent Repositories List" - msgstr "Максимален брой скоро ползвани хранилища" ++msgstr "Максимална дължина на списъка със скоро ползвани хранилища" + +#: lib/option.tcl:154 +msgid "Minimum Letters To Blame Copy On" +msgstr "Минимален брой знаци за анотиране на копието" + +#: lib/option.tcl:155 +msgid "Blame History Context Radius (days)" +msgstr "Исторически обхват за анотиране в дни" + +#: lib/option.tcl:156 +msgid "Number of Diff Context Lines" +msgstr "Брой редове за контекста при извеждане на разликите" + +#: lib/option.tcl:157 +msgid "Additional Diff Parameters" - msgstr "Допълнителни параметри за разликите" ++msgstr "Допълнителни аргументи към „git diff“" + +#: lib/option.tcl:158 +msgid "Commit Message Text Width" +msgstr "Широчина на текста на съобщението при подаване" + +#: lib/option.tcl:159 +msgid "New Branch Name Template" +msgstr "Шаблон за името на новите клони" + +#: lib/option.tcl:160 +msgid "Default File Contents Encoding" +msgstr "Стандартно кодиране на файловете" + +#: lib/option.tcl:161 +msgid "Warn before committing to a detached head" - msgstr "Предупреждение при подаване към несвързан връх" ++msgstr "Предупреждаване при подаването при несвързан връх" + +#: lib/option.tcl:162 +msgid "Staging of untracked files" - msgstr "Добавяне на неследените файлове към индекса" ++msgstr "Вкарване на неследени файлове в индекса" + +#: lib/option.tcl:163 +msgid "Show untracked files" +msgstr "Показване на неследените файлове" + - #: lib/option.tcl:209 ++#: lib/option.tcl:164 ++msgid "Tab spacing" ++msgstr "Размер на табулацията в интервали" ++ ++#: lib/option.tcl:210 +msgid "Change" +msgstr "Смяна" + - #: lib/option.tcl:253 ++#: lib/option.tcl:254 +msgid "Spelling Dictionary:" +msgstr "Правописен речник:" + - #: lib/option.tcl:283 ++#: lib/option.tcl:284 +msgid "Change Font" +msgstr "Смяна на шрифта" + - #: lib/option.tcl:287 ++#: lib/option.tcl:288 +#, tcl-format +msgid "Choose %s" +msgstr "Избор на „%s“" + - #: lib/option.tcl:293 ++#: lib/option.tcl:294 +msgid "pt." +msgstr "тчк." + - #: lib/option.tcl:307 ++#: lib/option.tcl:308 +msgid "Preferences" +msgstr "Настройки" + - #: lib/option.tcl:344 ++#: lib/option.tcl:345 +msgid "Failed to completely save options:" +msgstr "Неуспешно запазване на настройките:" + ++#: lib/encoding.tcl:443 ++msgid "Default" ++msgstr "Стандартното" ++ ++#: lib/encoding.tcl:448 ++#, tcl-format ++msgid "System (%s)" ++msgstr "Системното (%s)" ++ ++#: lib/encoding.tcl:459 lib/encoding.tcl:465 ++msgid "Other" ++msgstr "Друго" ++ +#: lib/mergetool.tcl:8 +msgid "Force resolution to the base version?" +msgstr "Да се използва базовата версия" + +#: lib/mergetool.tcl:9 +msgid "Force resolution to this branch?" +msgstr "Да се използва версията от този клон" + +#: lib/mergetool.tcl:10 +msgid "Force resolution to the other branch?" +msgstr "Да се използва версията от другия клон" + +#: lib/mergetool.tcl:14 +#, tcl-format +msgid "" +"Note that the diff shows only conflicting changes.\n" +"\n" +"%s will be overwritten.\n" +"\n" +"This operation can be undone only by restarting the merge." +msgstr "" +"Разликата показва само разликите с конфликт.\n" +"\n" +"Файлът „%s“ ще бъде презаписан.\n" +"\n" +"Тази операция може да бъде отменена само чрез започване на сливането наново." + +#: lib/mergetool.tcl:45 +#, tcl-format +msgid "File %s seems to have unresolved conflicts, still stage?" +msgstr "" - "Изглежда, че във файла „%s“ все още има некоригирани конфликти. Да се добави " ++"Изглежда, че все още има некоригирани конфликти във файла „%s“. Да се добави " +"ли файлът към индекса?" + +#: lib/mergetool.tcl:60 +#, tcl-format +msgid "Adding resolution for %s" +msgstr "Добавяне на корекция на конфликтите в „%s“" + +#: lib/mergetool.tcl:141 +msgid "Cannot resolve deletion or link conflicts using a tool" +msgstr "" +"Конфликтите при символни връзки или изтриване не могат да бъдат коригирани с " +"външна програма." + +#: lib/mergetool.tcl:146 +msgid "Conflict file does not exist" +msgstr "Файлът, в който е конфликтът, не съществува" + +#: lib/mergetool.tcl:246 +#, tcl-format +msgid "Not a GUI merge tool: '%s'" +msgstr "Това не е графична програма за сливане: „%s“" + +#: lib/mergetool.tcl:275 +#, tcl-format +msgid "Unsupported merge tool '%s'" +msgstr "Неподдържана програма за сливане: „%s“" + +#: lib/mergetool.tcl:310 +msgid "Merge tool is already running, terminate it?" +msgstr "Програмата за сливане вече е стартирана. Да бъде ли изключена?" + +#: lib/mergetool.tcl:330 +#, tcl-format +msgid "" +"Error retrieving versions:\n" +"%s" +msgstr "" +"Грешка при изтеглянето на версии:\n" +"%s" + +#: lib/mergetool.tcl:350 +#, tcl-format +msgid "" +"Could not start the merge tool:\n" +"\n" +"%s" +msgstr "" +"Програмата за сливане не може да бъде стартирана:\n" +"\n" +"%s" + +#: lib/mergetool.tcl:354 +msgid "Running merge tool..." +msgstr "Стартиране на програмата за сливане…" + +#: lib/mergetool.tcl:382 lib/mergetool.tcl:390 +msgid "Merge tool failed." +msgstr "Грешка в програмата за сливане." + +#: lib/tools_dlg.tcl:22 +msgid "Add Tool" +msgstr "Добавяне на команда" + +#: lib/tools_dlg.tcl:28 +msgid "Add New Tool Command" +msgstr "Добавяне на команда" + +#: lib/tools_dlg.tcl:34 +msgid "Add globally" +msgstr "Глобално добавяне" + +#: lib/tools_dlg.tcl:46 +msgid "Tool Details" +msgstr "Подробности за командата" + +#: lib/tools_dlg.tcl:49 +msgid "Use '/' separators to create a submenu tree:" - msgstr "За създаване на подменюта използвайте за разделител знака „/“:" ++msgstr "За създаване на подменюта използвайте знака „/“ за разделител:" + +#: lib/tools_dlg.tcl:60 +msgid "Command:" +msgstr "Команда:" + +#: lib/tools_dlg.tcl:71 +msgid "Show a dialog before running" +msgstr "Преди изпълнение да се извежда диалогов прозорец" + +#: lib/tools_dlg.tcl:77 +msgid "Ask the user to select a revision (sets $REVISION)" +msgstr "Потребителят да укаже версия (задаване на променливата $REVISION)" + +#: lib/tools_dlg.tcl:82 +msgid "Ask the user for additional arguments (sets $ARGS)" +msgstr "" +"Потребителят да укаже допълнителни аргументи (задаване на променливата $ARGS)" + +#: lib/tools_dlg.tcl:89 +msgid "Don't show the command output window" +msgstr "Без показване на прозорец с изхода от командата" + +#: lib/tools_dlg.tcl:94 +msgid "Run only if a diff is selected ($FILENAME not empty)" +msgstr "" +"Стартиране само след избор на разлика (променливата $FILENAME не е празна)" + +#: lib/tools_dlg.tcl:118 +msgid "Please supply a name for the tool." +msgstr "Задайте име за командата." + +#: lib/tools_dlg.tcl:126 +#, tcl-format +msgid "Tool '%s' already exists." +msgstr "Командата „%s“ вече съществува." + +#: lib/tools_dlg.tcl:148 +#, tcl-format +msgid "" +"Could not add tool:\n" +"%s" +msgstr "" +"Командата не може да бъде добавена:\n" +"%s" + +#: lib/tools_dlg.tcl:187 +msgid "Remove Tool" +msgstr "Премахване на команда" + +#: lib/tools_dlg.tcl:193 +msgid "Remove Tool Commands" +msgstr "Премахване на команди" + +#: lib/tools_dlg.tcl:198 +msgid "Remove" +msgstr "Премахване" + +#: lib/tools_dlg.tcl:231 +msgid "(Blue denotes repository-local tools)" - msgstr "(команди към локалното хранилище са обозначени в синьо)" ++msgstr "(командите към локалното хранилище са обозначени в синьо)" + +#: lib/tools_dlg.tcl:292 +#, tcl-format +msgid "Run Command: %s" +msgstr "Изпълнение на командата „%s“" + +#: lib/tools_dlg.tcl:306 +msgid "Arguments" +msgstr "Аргументи" + +#: lib/tools_dlg.tcl:336 lib/checkout_op.tcl:567 lib/merge.tcl:166 +msgid "Visualize" +msgstr "Визуализация" + +#: lib/tools_dlg.tcl:341 +msgid "OK" +msgstr "Добре" + +#: lib/search.tcl:48 +msgid "Find:" +msgstr "Търсене:" + +#: lib/search.tcl:50 +msgid "Next" +msgstr "Следваща поява" + +#: lib/search.tcl:51 +msgid "Prev" +msgstr "Предишна поява" + +#: lib/search.tcl:52 +msgid "RegExp" - msgstr "Рег. изр." ++msgstr "Рег. израз" + +#: lib/search.tcl:54 +msgid "Case" +msgstr "Регистър" + +#: lib/shortcut.tcl:21 lib/shortcut.tcl:62 +msgid "Cannot write shortcut:" +msgstr "Клавишната комбинация не може да бъде запазена:" + +#: lib/shortcut.tcl:137 +msgid "Cannot write icon:" +msgstr "Иконата не може да бъде запазена:" + - #: lib/diff.tcl:64 ++#: lib/diff.tcl:77 +#, tcl-format +msgid "" +"No differences detected.\n" +"\n" +"%s has no changes.\n" +"\n" +"The modification date of this file was updated by another application, but " +"the content within the file was not changed.\n" +"\n" +"A rescan will be automatically started to find other files which may have " +"the same state." +msgstr "" +"Не са открити разлики.\n" +"\n" +"Няма промени в „%s“.\n" +"\n" +"Времето на промяна на файла е бил зададен от друга програма, но съдържанието " +"му не е променено.\n" +"\n" +"Автоматично ще започне нова проверка дали няма други файлове в това " +"състояние." + - #: lib/diff.tcl:104 ++#: lib/diff.tcl:117 +#, tcl-format +msgid "Loading diff of %s..." +msgstr "Зареждане на разликите в „%s“…" + - #: lib/diff.tcl:125 ++#: lib/diff.tcl:140 +msgid "" +"LOCAL: deleted\n" +"REMOTE:\n" +msgstr "" +"ЛОКАЛНО: изтрит\n" +"ОТДАЛЕЧЕНО:\n" + - #: lib/diff.tcl:130 ++#: lib/diff.tcl:145 +msgid "" +"REMOTE: deleted\n" +"LOCAL:\n" +msgstr "" +"ОТДАЛЕЧЕНО: изтрит\n" +"ЛОКАЛНО:\n" + - #: lib/diff.tcl:137 ++#: lib/diff.tcl:152 +msgid "LOCAL:\n" +msgstr "ЛОКАЛНО:\n" + - #: lib/diff.tcl:140 ++#: lib/diff.tcl:155 +msgid "REMOTE:\n" +msgstr "ОТДАЛЕЧЕНО:\n" + - #: lib/diff.tcl:202 lib/diff.tcl:337 ++#: lib/diff.tcl:217 lib/diff.tcl:355 +#, tcl-format +msgid "Unable to display %s" - msgstr "Не може да бъде показан файлът „%s“" ++msgstr "Файлът „%s“ не може да бъде показан" + - #: lib/diff.tcl:203 ++#: lib/diff.tcl:218 +msgid "Error loading file:" +msgstr "Грешка при зареждане на файл:" + - #: lib/diff.tcl:210 ++#: lib/diff.tcl:225 +msgid "Git Repository (subproject)" - msgstr "Хранилище на Git (подпроект)" ++msgstr "Хранилище на Git (подмодул)" + - #: lib/diff.tcl:222 ++#: lib/diff.tcl:237 +msgid "* Binary file (not showing content)." - msgstr "⁃ Двоичен файл (съдържанието не се показва)." ++msgstr "● Двоичен файл (съдържанието не се показва)." + - #: lib/diff.tcl:227 ++#: lib/diff.tcl:242 +#, tcl-format +msgid "" +"* Untracked file is %d bytes.\n" +"* Showing only first %d bytes.\n" +msgstr "" - "⁃ Неследеният файл е %d байта.\n" - "⁃ Показват се само първите %d байта.\n" ++"● Неследеният файл е %d байта.\n" ++"● Показват се само първите %d байта.\n" + - #: lib/diff.tcl:233 ++#: lib/diff.tcl:248 +#, tcl-format +msgid "" +"\n" +"* Untracked file clipped here by %s.\n" +"* To see the entire file, use an external editor.\n" +msgstr "" +"\n" - "⁃ Неследеният файл е отрязан дотук %s.\n" - "⁃ Използвайте външен редактор, за да видите целия файл.\n" ++"● Неследеният файл е отрязан дотук от програмата „%s“.\n" ++"● Използвайте външен редактор, за да видите целия файл.\n" + - #: lib/diff.tcl:338 lib/blame.tcl:1128 ++#: lib/diff.tcl:356 lib/blame.tcl:1128 +msgid "Error loading diff:" +msgstr "Грешка при зареждане на разлика:" + - #: lib/diff.tcl:557 ++#: lib/diff.tcl:578 +msgid "Failed to unstage selected hunk." +msgstr "Избраното парче не може да бъде извадено от индекса." + - #: lib/diff.tcl:564 ++#: lib/diff.tcl:585 +msgid "Failed to stage selected hunk." - msgstr "Избраното парче не може да бъде добавен към индекса." ++msgstr "Избраното парче не може да бъде добавено към индекса." + - #: lib/diff.tcl:643 ++#: lib/diff.tcl:664 +msgid "Failed to unstage selected line." +msgstr "Избраният ред не може да бъде изваден от индекса." + - #: lib/diff.tcl:651 ++#: lib/diff.tcl:672 +msgid "Failed to stage selected line." +msgstr "Избраният ред не може да бъде добавен към индекса." + +#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 +msgid "Delete Branch Remotely" +msgstr "Изтриване на отдалечения клон" + +#: lib/remote_branch_delete.tcl:48 +msgid "From Repository" +msgstr "От хранилище" + +#: lib/remote_branch_delete.tcl:88 +msgid "Branches" - msgstr "Клонове" ++msgstr "Клони" + +#: lib/remote_branch_delete.tcl:110 +msgid "Delete Only If" +msgstr "Изтриване, само ако" + +#: lib/remote_branch_delete.tcl:112 +msgid "Merged Into:" +msgstr "Слят в:" + +#: lib/remote_branch_delete.tcl:120 lib/branch_delete.tcl:53 +msgid "Always (Do not perform merge checks)" +msgstr "Винаги (без проверка за сливане)" + +#: lib/remote_branch_delete.tcl:153 +msgid "A branch is required for 'Merged Into'." +msgstr "За данните „Слят в“ е необходимо да зададете клон." + +#: lib/remote_branch_delete.tcl:185 +#, tcl-format +msgid "" +"The following branches are not completely merged into %s:\n" +"\n" +" - %s" +msgstr "" +"Следните клони не са слети напълно в „%s“:\n" +"\n" - " ⁃ %s" ++" ● %s" + +#: lib/remote_branch_delete.tcl:190 +#, tcl-format +msgid "" +"One or more of the merge tests failed because you have not fetched the " +"necessary commits. Try fetching from %s first." +msgstr "" +"Поне една от пробите за сливане е неуспешна, защото не сте доставили всички " +"необходими подавания. Пробвайте първо да доставите подаванията от „%s“." + +#: lib/remote_branch_delete.tcl:208 +msgid "Please select one or more branches to delete." +msgstr "Изберете поне един клон за изтриване." + +#: lib/remote_branch_delete.tcl:218 lib/branch_delete.tcl:115 +msgid "" +"Recovering deleted branches is difficult.\n" +"\n" +"Delete the selected branches?" +msgstr "" +"Възстановяването на изтрити клони може да е трудно.\n" +"\n" +"Сигурни ли сте, че искате да триете?" + +#: lib/remote_branch_delete.tcl:227 +#, tcl-format +msgid "Deleting branches from %s" +msgstr "Изтриване на клони от „%s“" + +#: lib/remote_branch_delete.tcl:300 +msgid "No repository selected." +msgstr "Не е избрано хранилище." + +#: lib/remote_branch_delete.tcl:305 +#, tcl-format +msgid "Scanning %s..." +msgstr "Претърсване на „%s“…" + - #: lib/choose_repository.tcl:32 ++#: lib/choose_repository.tcl:33 +msgid "Git Gui" +msgstr "ГПИ на Git" + - #: lib/choose_repository.tcl:91 lib/choose_repository.tcl:396 ++#: lib/choose_repository.tcl:92 lib/choose_repository.tcl:412 +msgid "Create New Repository" +msgstr "Създаване на ново хранилище" + - #: lib/choose_repository.tcl:97 ++#: lib/choose_repository.tcl:98 +msgid "New..." +msgstr "Ново…" + - #: lib/choose_repository.tcl:104 lib/choose_repository.tcl:480 ++#: lib/choose_repository.tcl:105 lib/choose_repository.tcl:496 +msgid "Clone Existing Repository" +msgstr "Клониране на съществуващо хранилище" + - #: lib/choose_repository.tcl:115 ++#: lib/choose_repository.tcl:116 +msgid "Clone..." +msgstr "Клониране…" + - #: lib/choose_repository.tcl:122 lib/choose_repository.tcl:1019 ++#: lib/choose_repository.tcl:123 lib/choose_repository.tcl:1064 +msgid "Open Existing Repository" +msgstr "Отваряне на съществуващо хранилище" + - #: lib/choose_repository.tcl:128 ++#: lib/choose_repository.tcl:129 +msgid "Open..." +msgstr "Отваряне…" + - #: lib/choose_repository.tcl:141 ++#: lib/choose_repository.tcl:142 +msgid "Recent Repositories" +msgstr "Скоро ползвани" + - #: lib/choose_repository.tcl:147 ++#: lib/choose_repository.tcl:148 +msgid "Open Recent Repository:" +msgstr "Отваряне на хранилище ползвано наскоро:" + - #: lib/choose_repository.tcl:315 lib/choose_repository.tcl:322 - #: lib/choose_repository.tcl:329 ++#: lib/choose_repository.tcl:316 lib/choose_repository.tcl:323 ++#: lib/choose_repository.tcl:330 +#, tcl-format +msgid "Failed to create repository %s:" +msgstr "Неуспешно създаване на хранилището „%s“:" + - #: lib/choose_repository.tcl:391 lib/branch_create.tcl:33 ++#: lib/choose_repository.tcl:407 lib/branch_create.tcl:33 +msgid "Create" +msgstr "Създаване" + - #: lib/choose_repository.tcl:401 ++#: lib/choose_repository.tcl:417 +msgid "Directory:" +msgstr "Директория:" + - #: lib/choose_repository.tcl:431 lib/choose_repository.tcl:552 - #: lib/choose_repository.tcl:1053 ++#: lib/choose_repository.tcl:447 lib/choose_repository.tcl:573 ++#: lib/choose_repository.tcl:1098 +msgid "Git Repository" +msgstr "Хранилище на Git" + - #: lib/choose_repository.tcl:456 ++#: lib/choose_repository.tcl:472 +#, tcl-format +msgid "Directory %s already exists." +msgstr "Вече съществува директория „%s“." + - #: lib/choose_repository.tcl:460 ++#: lib/choose_repository.tcl:476 +#, tcl-format +msgid "File %s already exists." +msgstr "Вече съществува файл „%s“." + - #: lib/choose_repository.tcl:475 ++#: lib/choose_repository.tcl:491 +msgid "Clone" +msgstr "Клониране" + - #: lib/choose_repository.tcl:488 ++#: lib/choose_repository.tcl:504 +msgid "Source Location:" +msgstr "Адрес на източника:" + - #: lib/choose_repository.tcl:497 ++#: lib/choose_repository.tcl:513 +msgid "Target Directory:" +msgstr "Целева директория:" + - #: lib/choose_repository.tcl:507 ++#: lib/choose_repository.tcl:523 +msgid "Clone Type:" +msgstr "Вид клониране:" + - #: lib/choose_repository.tcl:512 ++#: lib/choose_repository.tcl:528 +msgid "Standard (Fast, Semi-Redundant, Hardlinks)" +msgstr "Стандартно (бързо, частично споделяне на файлове, твърди връзки)" + - #: lib/choose_repository.tcl:517 ++#: lib/choose_repository.tcl:533 +msgid "Full Copy (Slower, Redundant Backup)" +msgstr "Пълно (бавно, пълноценно резервно копие)" + - #: lib/choose_repository.tcl:522 ++#: lib/choose_repository.tcl:538 +msgid "Shared (Fastest, Not Recommended, No Backup)" +msgstr "Споделено (най-бързо, не се препоръчва, не прави резервно копие)" + - #: lib/choose_repository.tcl:558 lib/choose_repository.tcl:605 - #: lib/choose_repository.tcl:751 lib/choose_repository.tcl:821 - #: lib/choose_repository.tcl:1059 lib/choose_repository.tcl:1067 ++#: lib/choose_repository.tcl:545 ++msgid "Recursively clone submodules too" ++msgstr "Рекурсивно клониране и на подмодулите" ++ ++#: lib/choose_repository.tcl:579 lib/choose_repository.tcl:626 ++#: lib/choose_repository.tcl:772 lib/choose_repository.tcl:842 ++#: lib/choose_repository.tcl:1104 lib/choose_repository.tcl:1112 +#, tcl-format +msgid "Not a Git repository: %s" +msgstr "Това не е хранилище на Git: %s" + - #: lib/choose_repository.tcl:594 ++#: lib/choose_repository.tcl:615 +msgid "Standard only available for local repository." +msgstr "Само локални хранилища могат да се клонират стандартно" + - #: lib/choose_repository.tcl:598 ++#: lib/choose_repository.tcl:619 +msgid "Shared only available for local repository." +msgstr "Само локални хранилища могат да се клонират споделено" + - #: lib/choose_repository.tcl:619 ++#: lib/choose_repository.tcl:640 +#, tcl-format +msgid "Location %s already exists." - msgstr "Вече съществува местоположението „%s“." ++msgstr "Местоположението „%s“ вече съществува." + - #: lib/choose_repository.tcl:630 ++#: lib/choose_repository.tcl:651 +msgid "Failed to configure origin" +msgstr "Неуспешно настройване на хранилището-източник" + - #: lib/choose_repository.tcl:642 ++#: lib/choose_repository.tcl:663 +msgid "Counting objects" +msgstr "Преброяване на обекти" + - #: lib/choose_repository.tcl:643 ++#: lib/choose_repository.tcl:664 +msgid "buckets" +msgstr "клетки" + - #: lib/choose_repository.tcl:667 ++#: lib/choose_repository.tcl:688 +#, tcl-format +msgid "Unable to copy objects/info/alternates: %s" +msgstr "Обектите/информацията/синонимите не могат да бъдат копирани: %s" + - #: lib/choose_repository.tcl:703 ++#: lib/choose_repository.tcl:724 +#, tcl-format +msgid "Nothing to clone from %s." +msgstr "Няма какво да се клонира от „%s“." + - #: lib/choose_repository.tcl:705 lib/choose_repository.tcl:919 - #: lib/choose_repository.tcl:931 ++#: lib/choose_repository.tcl:726 lib/choose_repository.tcl:940 ++#: lib/choose_repository.tcl:952 +msgid "The 'master' branch has not been initialized." +msgstr "Основният клон — „master“ не е инициализиран." + - #: lib/choose_repository.tcl:718 ++#: lib/choose_repository.tcl:739 +msgid "Hardlinks are unavailable. Falling back to copying." +msgstr "Не се поддържат твърди връзки. Преминава се към копиране." + - #: lib/choose_repository.tcl:730 ++#: lib/choose_repository.tcl:751 +#, tcl-format +msgid "Cloning from %s" +msgstr "Клониране на „%s“" + - #: lib/choose_repository.tcl:761 ++#: lib/choose_repository.tcl:782 +msgid "Copying objects" +msgstr "Копиране на обекти" + - #: lib/choose_repository.tcl:762 ++#: lib/choose_repository.tcl:783 +msgid "KiB" +msgstr "KiB" + - #: lib/choose_repository.tcl:786 ++#: lib/choose_repository.tcl:807 +#, tcl-format +msgid "Unable to copy object: %s" +msgstr "Неуспешно копиране на обект: %s" + - #: lib/choose_repository.tcl:796 ++#: lib/choose_repository.tcl:817 +msgid "Linking objects" +msgstr "Създаване на връзки към обектите" + - #: lib/choose_repository.tcl:797 ++#: lib/choose_repository.tcl:818 +msgid "objects" +msgstr "обекти" + - #: lib/choose_repository.tcl:805 ++#: lib/choose_repository.tcl:826 +#, tcl-format +msgid "Unable to hardlink object: %s" +msgstr "Неуспешно създаване на твърда връзка към обект: %s" + - #: lib/choose_repository.tcl:860 ++#: lib/choose_repository.tcl:881 +msgid "Cannot fetch branches and objects. See console output for details." +msgstr "" +"Клоните и обектите не могат да бъдат изтеглени. За повече информация " +"погледнете изхода на конзолата." + - #: lib/choose_repository.tcl:871 ++#: lib/choose_repository.tcl:892 +msgid "Cannot fetch tags. See console output for details." +msgstr "" +"Етикетите не могат да бъдат изтеглени. За повече информация погледнете " +"изхода на конзолата." + - #: lib/choose_repository.tcl:895 ++#: lib/choose_repository.tcl:916 +msgid "Cannot determine HEAD. See console output for details." +msgstr "" - "Върхът HEAD не може да бъде определен. За повече информация погледнете " ++"Върхът „HEAD“ не може да бъде определен. За повече информация погледнете " +"изхода на конзолата." + - #: lib/choose_repository.tcl:904 ++#: lib/choose_repository.tcl:925 +#, tcl-format +msgid "Unable to cleanup %s" - msgstr "Не може да се зачисти „%s“" ++msgstr "„%s“ не може да се зачисти" + - #: lib/choose_repository.tcl:910 ++#: lib/choose_repository.tcl:931 +msgid "Clone failed." +msgstr "Неуспешно клониране." + - #: lib/choose_repository.tcl:917 ++#: lib/choose_repository.tcl:938 +msgid "No default branch obtained." +msgstr "Не е получен клон по подразбиране." + - #: lib/choose_repository.tcl:928 ++#: lib/choose_repository.tcl:949 +#, tcl-format +msgid "Cannot resolve %s as a commit." +msgstr "Няма подаване отговарящо на „%s“." + - #: lib/choose_repository.tcl:940 ++#: lib/choose_repository.tcl:961 +msgid "Creating working directory" +msgstr "Създаване на работната директория" + - #: lib/choose_repository.tcl:941 lib/index.tcl:70 lib/index.tcl:136 ++#: lib/choose_repository.tcl:962 lib/index.tcl:70 lib/index.tcl:136 +#: lib/index.tcl:207 +msgid "files" +msgstr "файлове" + - #: lib/choose_repository.tcl:970 ++#: lib/choose_repository.tcl:981 ++msgid "Cannot clone submodules." ++msgstr "Подмодулите не могат да се клонират." ++ ++#: lib/choose_repository.tcl:990 ++msgid "Cloning submodules" ++msgstr "Клониране на подмодулите" ++ ++#: lib/choose_repository.tcl:1015 +msgid "Initial file checkout failed." +msgstr "Неуспешно първоначално изтегляне." + - #: lib/choose_repository.tcl:1014 ++#: lib/choose_repository.tcl:1059 +msgid "Open" +msgstr "Отваряне" + - #: lib/choose_repository.tcl:1024 ++#: lib/choose_repository.tcl:1069 +msgid "Repository:" +msgstr "Хранилище:" + - #: lib/choose_repository.tcl:1073 ++#: lib/choose_repository.tcl:1118 +#, tcl-format +msgid "Failed to open repository %s:" +msgstr "Неуспешно отваряне на хранилището „%s“:" + +#: lib/about.tcl:26 +msgid "git-gui - a graphical user interface for Git." +msgstr "git-gui — графичен интерфейс за Git." + +#: lib/checkout_op.tcl:85 +#, tcl-format +msgid "Fetching %s from %s" +msgstr "Доставяне на „%s“ от „%s“" + +#: lib/checkout_op.tcl:133 +#, tcl-format +msgid "fatal: Cannot resolve %s" +msgstr "фатална грешка: „%s“ не може да се открие" + +#: lib/checkout_op.tcl:175 +#, tcl-format +msgid "Branch '%s' does not exist." +msgstr "Клонът „%s“ не съществува." + +#: lib/checkout_op.tcl:194 +#, tcl-format +msgid "Failed to configure simplified git-pull for '%s'." +msgstr "Неуспешно настройване на опростен git-pull за „%s“." + +#: lib/checkout_op.tcl:229 +#, tcl-format +msgid "" +"Branch '%s' already exists.\n" +"\n" +"It cannot fast-forward to %s.\n" +"A merge is required." +msgstr "" +"Клонът „%s“ съществува.\n" +"\n" - "Той не може да бъде тривиално превъртян до %s.\n" ++"Той не може да бъде тривиално слят до „%s“.\n" +"Необходимо е сливане." + +#: lib/checkout_op.tcl:243 +#, tcl-format +msgid "Merge strategy '%s' not supported." +msgstr "Стратегия за сливане „%s“ не се поддържа." + +#: lib/checkout_op.tcl:262 +#, tcl-format +msgid "Failed to update '%s'." +msgstr "Неуспешно обновяване на „%s“." + +#: lib/checkout_op.tcl:274 +msgid "Staging area (index) is already locked." +msgstr "Индексът вече е заключен." + +#: lib/checkout_op.tcl:289 +msgid "" +"Last scanned state does not match repository state.\n" +"\n" +"Another Git program has modified this repository since the last scan. A " +"rescan must be performed before the current branch can be changed.\n" +"\n" +"The rescan will be automatically started now.\n" +msgstr "" +"Състоянието при последната проверка не отговаря на състоянието на " +"хранилището.\n" +"\n" +"Някой друг процес за Git е променил хранилището междувременно. Състоянието " +"трябва да бъде проверено, преди да се премине към нов клон.\n" +"\n" +"Автоматично ще започне нова проверка.\n" + +#: lib/checkout_op.tcl:345 +#, tcl-format +msgid "Updating working directory to '%s'..." +msgstr "Работната директория се привежда към „%s“…" + +#: lib/checkout_op.tcl:346 +msgid "files checked out" +msgstr "файла са изтеглени" + +#: lib/checkout_op.tcl:376 +#, tcl-format +msgid "Aborted checkout of '%s' (file level merging is required)." +msgstr "" +"Преустановяване на изтеглянето на „%s“ (необходимо е пофайлово сливане)." + +#: lib/checkout_op.tcl:377 +msgid "File level merge required." +msgstr "Необходимо е пофайлово сливане." + +#: lib/checkout_op.tcl:381 +#, tcl-format +msgid "Staying on branch '%s'." +msgstr "Оставане върху клона „%s“." + +#: lib/checkout_op.tcl:452 +msgid "" +"You are no longer on a local branch.\n" +"\n" +"If you wanted to be on a branch, create one now starting from 'This Detached " +"Checkout'." +msgstr "" +"Вече не сте на локален клон.\n" +"\n" +"Ако искате да сте на клон, създайте базиран на „Това несвързано изтегляне“." + +#: lib/checkout_op.tcl:503 lib/checkout_op.tcl:507 +#, tcl-format +msgid "Checked out '%s'." +msgstr "„%s“ е изтеглен." + +#: lib/checkout_op.tcl:535 +#, tcl-format +msgid "Resetting '%s' to '%s' will lose the following commits:" +msgstr "" +"Зануляването на „%s“ към „%s“ ще доведе до загубването на следните подавания:" + +#: lib/checkout_op.tcl:557 +msgid "Recovering lost commits may not be easy." +msgstr "Възстановяването на загубените подавания може да е трудно." + +#: lib/checkout_op.tcl:562 +#, tcl-format +msgid "Reset '%s'?" +msgstr "Зануляване на „%s“?" + +#: lib/checkout_op.tcl:571 lib/branch_create.tcl:85 +msgid "Reset" +msgstr "Отначало" + +#: lib/checkout_op.tcl:635 +#, tcl-format +msgid "" +"Failed to set current branch.\n" +"\n" +"This working directory is only partially switched. We successfully updated " +"your files, but failed to update an internal Git file.\n" +"\n" +"This should not have occurred. %s will now close and give up." +msgstr "" +"Неуспешно задаване на текущия клон.\n" +"\n" +"Работната директория е само частично обновена: файловете са обновени " +"успешно, но някой от вътрешните, служебни файлове на Git не е бил.\n" +"\n" +"Това състояние е аварийно и не трябва да се случва. Програмата „%s“ ще " +"преустанови работа." + +#: lib/branch_create.tcl:23 +msgid "Create Branch" +msgstr "Създаване на клон" + +#: lib/branch_create.tcl:28 +msgid "Create New Branch" +msgstr "Създаване на нов клон" + +#: lib/branch_create.tcl:42 +msgid "Branch Name" +msgstr "Име на клона" + +#: lib/branch_create.tcl:57 +msgid "Match Tracking Branch Name" +msgstr "Съвпадане по името на следения клон" + +#: lib/branch_create.tcl:66 +msgid "Starting Revision" +msgstr "Начална версия" + +#: lib/branch_create.tcl:72 +msgid "Update Existing Branch:" +msgstr "Обновяване на съществуващ клон:" + +#: lib/branch_create.tcl:75 +msgid "No" +msgstr "Не" + +#: lib/branch_create.tcl:80 +msgid "Fast Forward Only" +msgstr "Само тривиално превъртащо сливане" + +#: lib/branch_create.tcl:97 +msgid "Checkout After Creation" +msgstr "Преминаване към клона след създаването му" + +#: lib/branch_create.tcl:132 +msgid "Please select a tracking branch." +msgstr "Изберете клон за следени." + +#: lib/branch_create.tcl:141 +#, tcl-format +msgid "Tracking branch %s is not a branch in the remote repository." - msgstr "Клонът, който се следи „%s“ не съществува в отдалеченото хранилище." ++msgstr "Следящият клон — „%s“, не съществува в отдалеченото хранилище." + +#: lib/console.tcl:59 +msgid "Working... please wait..." +msgstr "В момента се извършва действие, изчакайте…" + +#: lib/console.tcl:186 +msgid "Success" +msgstr "Успех" + +#: lib/console.tcl:200 +msgid "Error: Command Failed" +msgstr "Грешка: неуспешно изпълнение на команда" + +#: lib/choose_rev.tcl:52 +msgid "This Detached Checkout" +msgstr "Това несвързано изтегляне" + +#: lib/choose_rev.tcl:60 +msgid "Revision Expression:" - msgstr "Израз за версия" ++msgstr "Израз за версия:" + +#: lib/choose_rev.tcl:72 +msgid "Local Branch" +msgstr "Локален клон" + +#: lib/choose_rev.tcl:77 +msgid "Tracking Branch" +msgstr "Следящ клон" + +#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:544 +msgid "Tag" +msgstr "Етикет" + +#: lib/choose_rev.tcl:321 +#, tcl-format +msgid "Invalid revision: %s" +msgstr "Неправилна версия: %s" + +#: lib/choose_rev.tcl:342 +msgid "No revision selected." +msgstr "Не е избрана версия." + +#: lib/choose_rev.tcl:350 +msgid "Revision expression is empty." +msgstr "Изразът за версия е празен." + +#: lib/choose_rev.tcl:537 +msgid "Updated" +msgstr "Обновен" + +#: lib/choose_rev.tcl:565 +msgid "URL" +msgstr "Адрес" + +#: lib/line.tcl:17 +msgid "Goto Line:" +msgstr "Към ред:" + +#: lib/line.tcl:23 +msgid "Go" +msgstr "Придвижване" + +#: lib/commit.tcl:9 +msgid "" +"There is nothing to amend.\n" +"\n" +"You are about to create the initial commit. There is no commit before this " +"to amend.\n" +msgstr "" +"Няма какво да се поправи.\n" +"\n" +"Ще създадете първоначалното подаване. Преди него няма други подавания, които " +"да поправите.\n" + +#: lib/commit.tcl:18 +msgid "" +"Cannot amend while merging.\n" +"\n" +"You are currently in the middle of a merge that has not been fully " +"completed. You cannot amend the prior commit unless you first abort the " +"current merge activity.\n" +msgstr "" +"По време на сливане не може да поправяте.\n" +"\n" +"В момента все още не сте завършили операция по сливане. Не може да поправите " +"предишното подаване, освен ако първо не преустановите текущото сливане.\n" + +#: lib/commit.tcl:48 +msgid "Error loading commit data for amend:" +msgstr "Грешка при зареждане на данните от подаване, които да се поправят:" + +#: lib/commit.tcl:75 +msgid "Unable to obtain your identity:" +msgstr "Идентификацията ви не може да бъде определена:" + +#: lib/commit.tcl:80 +msgid "Invalid GIT_COMMITTER_IDENT:" - msgstr "Неправилно поле GIT_COMMITTER_IDENT:" ++msgstr "Неправилно поле „GIT_COMMITTER_IDENT“:" + +#: lib/commit.tcl:129 +#, tcl-format +msgid "warning: Tcl does not support encoding '%s'." +msgstr "предупреждение: Tcl не поддържа кодирането „%s“." + +#: lib/commit.tcl:149 +msgid "" +"Last scanned state does not match repository state.\n" +"\n" +"Another Git program has modified this repository since the last scan. A " +"rescan must be performed before another commit can be created.\n" +"\n" +"The rescan will be automatically started now.\n" +msgstr "" +"Състоянието при последната проверка не отговаря на състоянието на " +"хранилището.\n" +"\n" +"Някой друг процес за Git е променил хранилището междувременно. Състоянието " +"трябва да бъде проверено преди ново подаване.\n" +"\n" +"Автоматично ще започне нова проверка.\n" + +#: lib/commit.tcl:173 +#, tcl-format +msgid "" +"Unmerged files cannot be committed.\n" +"\n" +"File %s has merge conflicts. You must resolve them and stage the file " +"before committing.\n" +msgstr "" +"Неслетите файлове не могат да бъдат подавани.\n" +"\n" +"Във файла „%s“ има конфликти при сливане. За да го подадете, трябва първо да " +"коригирате конфликтите и да добавите файла към индекса за подаване.\n" + +#: lib/commit.tcl:181 +#, tcl-format +msgid "" +"Unknown file state %s detected.\n" +"\n" +"File %s cannot be committed by this program.\n" +msgstr "" +"Непознато състояние на файл „%s“.\n" +"\n" +"Файлът „%s“ не може да бъде подаден чрез текущата програма.\n" + +#: lib/commit.tcl:189 +msgid "" +"No changes to commit.\n" +"\n" +"You must stage at least 1 file before you can commit.\n" +msgstr "" +"Няма промени за подаване.\n" +"\n" - "Трябва да добавите поне 1 файл към индекса, преди да подадете.\n" ++"Трябва да добавите поне един файл към индекса, за да подадете.\n" + +#: lib/commit.tcl:204 +msgid "" +"Please supply a commit message.\n" +"\n" +"A good commit message has the following format:\n" +"\n" +"- First line: Describe in one sentence what you did.\n" +"- Second line: Blank\n" +"- Remaining lines: Describe why this change is good.\n" +msgstr "" +"Задайте добро съобщение при подаване.\n" +"\n" +"Използвайте следния формат:\n" +"\n" - "⁃ Първи ред: описание в едно изречение на промяната.\n" - "⁃ Втори ред: празен.\n" - "⁃ Останалите редове: опишете защо се налага тази промяна.\n" ++"● Първи ред: описание в едно изречение на промяната.\n" ++"● Втори ред: празен.\n" ++"● Останалите редове: опишете защо се налага тази промяна.\n" + +#: lib/commit.tcl:235 +msgid "Calling pre-commit hook..." +msgstr "Изпълняване на куката преди подаване…" + +#: lib/commit.tcl:250 +msgid "Commit declined by pre-commit hook." +msgstr "Подаването е отхвърлено от куката преди подаване." + +#: lib/commit.tcl:269 +msgid "" +"You are about to commit on a detached head. This is a potentially dangerous " +"thing to do because if you switch to another branch you will lose your " +"changes and it can be difficult to retrieve them later from the reflog. You " +"should probably cancel this commit and create a new branch to continue.\n" +" \n" +" Do you really want to proceed with your Commit?" +msgstr "" - "Ще подадете към несвързан връх. Това действие е опасно, защото при " - "преминаването към който и да е клон ще загубите промените си и не е сигурно, " - "че ще можете по-късно да ги възстановите чрез журнала на указателите. Най-" - "вероятно трябва първо да създадете клон базиран на текущото състояние и да " - "подадете към него.\n" ++"Ще подавате към несвързан връх. Това е опасно — при изтеглянето на друг клон " ++"ще изгубите промените си. След това може да е невъзможно да ги възстановите " ++"от журнала на указателите „reflog“. Най-вероятно трябва да отмените това " ++"подаване и да създадете клон, в който да подадете.\n" +" \n" - "Сигурни ли сте, че искате да подадете точно сега?" ++"Сигурни ли сте, че искате да подадете към несвързан връх?" + +#: lib/commit.tcl:290 +msgid "Calling commit-msg hook..." +msgstr "Изпълняване на куката за съобщението при подаване…" + +#: lib/commit.tcl:305 +msgid "Commit declined by commit-msg hook." +msgstr "Подаването е отхвърлено от куката за съобщението при подаване." + +#: lib/commit.tcl:318 +msgid "Committing changes..." - msgstr "Подаване на промените." ++msgstr "Подаване на промените…" + +#: lib/commit.tcl:334 +msgid "write-tree failed:" +msgstr "неуспешно запазване на дървото (write-tree):" + +#: lib/commit.tcl:335 lib/commit.tcl:379 lib/commit.tcl:400 +msgid "Commit failed." +msgstr "Неуспешно подаване." + +#: lib/commit.tcl:352 +#, tcl-format +msgid "Commit %s appears to be corrupt" +msgstr "Подаването „%s“ изглежда повредено" + +#: lib/commit.tcl:357 +msgid "" +"No changes to commit.\n" +"\n" +"No files were modified by this commit and it was not a merge commit.\n" +"\n" +"A rescan will be automatically started now.\n" +msgstr "" +"Няма промени за подаване.\n" +"\n" +"В това подаване не са променяни никакви файлове, а и не е подаване със " +"сливане.\n" +"\n" +"Автоматично ще започне нова проверка.\n" + +#: lib/commit.tcl:364 +msgid "No changes to commit." +msgstr "Няма промени за подаване." + +#: lib/commit.tcl:378 +msgid "commit-tree failed:" +msgstr "неуспешно подаване на дървото (commit-tree):" + +#: lib/commit.tcl:399 +msgid "update-ref failed:" +msgstr "неуспешно обновяване на указателите (update-ref):" + +#: lib/commit.tcl:492 +#, tcl-format +msgid "Created commit %s: %s" +msgstr "Успешно подаване %s: %s" + +#: lib/branch_delete.tcl:16 +msgid "Delete Branch" +msgstr "Изтриване на клон" + +#: lib/branch_delete.tcl:21 +msgid "Delete Local Branch" +msgstr "Изтриване на локален клон" + +#: lib/branch_delete.tcl:39 +msgid "Local Branches" +msgstr "Локални клони" + +#: lib/branch_delete.tcl:51 +msgid "Delete Only If Merged Into" +msgstr "Изтриване, само ако промените са слети и другаде" + +#: lib/branch_delete.tcl:103 +#, tcl-format +msgid "The following branches are not completely merged into %s:" - msgstr "Не всички промени в клоните са слети в %s:" ++msgstr "Не всички промени в клоните са слети в „%s“:" + +#: lib/branch_delete.tcl:141 +#, tcl-format +msgid "" +"Failed to delete branches:\n" +"%s" +msgstr "" +"Неуспешно триене на клони:\n" +"%s" + +#: lib/blame.tcl:73 +msgid "File Viewer" +msgstr "Преглед на файлове" + +#: lib/blame.tcl:79 +msgid "Commit:" +msgstr "Подаване:" + +#: lib/blame.tcl:280 +msgid "Copy Commit" +msgstr "Копиране на подаване" + +#: lib/blame.tcl:284 +msgid "Find Text..." +msgstr "Търсене на текст…" + +#: lib/blame.tcl:288 +msgid "Goto Line..." +msgstr "Към ред…" + +#: lib/blame.tcl:297 +msgid "Do Full Copy Detection" +msgstr "Пълно търсене на копиране" + +#: lib/blame.tcl:301 +msgid "Show History Context" +msgstr "Показване на контекста от историята" + +#: lib/blame.tcl:304 +msgid "Blame Parent Commit" +msgstr "Анотиране на родителското подаване" + +#: lib/blame.tcl:466 +#, tcl-format +msgid "Reading %s..." - msgstr "%s се чете…" ++msgstr "Чете се „%s“…" + +#: lib/blame.tcl:594 +msgid "Loading copy/move tracking annotations..." +msgstr "Зареждане на анотациите за проследяване на копирането/преместването…" + +#: lib/blame.tcl:614 +msgid "lines annotated" +msgstr "реда анотирани" + +#: lib/blame.tcl:806 +msgid "Loading original location annotations..." +msgstr "Зареждане на анотациите за първоначалното местоположение…" + +#: lib/blame.tcl:809 +msgid "Annotation complete." +msgstr "Анотирането завърши." + +#: lib/blame.tcl:839 +msgid "Busy" +msgstr "Операцията не е завършила" + +#: lib/blame.tcl:840 +msgid "Annotation process is already running." +msgstr "В момента тече процес на анотиране." + +#: lib/blame.tcl:879 +msgid "Running thorough copy detection..." +msgstr "Изпълнява се цялостен процес на откриване на копиране…" + +#: lib/blame.tcl:947 +msgid "Loading annotation..." +msgstr "Зареждане на анотации…" + +#: lib/blame.tcl:1000 +msgid "Author:" +msgstr "Автор:" + +#: lib/blame.tcl:1004 +msgid "Committer:" +msgstr "Подал:" + +#: lib/blame.tcl:1009 +msgid "Original File:" +msgstr "Първоначален файл:" + +#: lib/blame.tcl:1057 +msgid "Cannot find HEAD commit:" - msgstr "Подаването за връх HEAD не може да се открие:" ++msgstr "Подаването за връх „HEAD“ не може да се открие:" + +#: lib/blame.tcl:1112 +msgid "Cannot find parent commit:" +msgstr "Родителското подаване не може да бъде открито" + +#: lib/blame.tcl:1127 +msgid "Unable to display parent" +msgstr "Родителят не може да бъде показан" + +#: lib/blame.tcl:1269 +msgid "Originally By:" +msgstr "Първоначално от:" + +#: lib/blame.tcl:1275 +msgid "In File:" +msgstr "Във файл:" + +#: lib/blame.tcl:1280 +msgid "Copied Or Moved Here By:" +msgstr "Копирано или преместено тук от:" + +#: lib/index.tcl:6 +msgid "Unable to unlock the index." +msgstr "Индексът не може да бъде отключен." + +#: lib/index.tcl:17 +msgid "Index Error" +msgstr "Грешка в индекса" + +#: lib/index.tcl:19 +msgid "" +"Updating the Git index failed. A rescan will be automatically started to " +"resynchronize git-gui." +msgstr "" +"Неуспешно обновяване на индекса на Git. Автоматично ще започне нова проверка " +"за синхронизирането на git-gui." + +#: lib/index.tcl:30 +msgid "Continue" +msgstr "Продължаване" + +#: lib/index.tcl:33 +msgid "Unlock Index" +msgstr "Отключване на индекса" + +#: lib/index.tcl:298 +#, tcl-format +msgid "Unstaging %s from commit" - msgstr "Изваждане на %s от подаването" ++msgstr "Изваждане на „%s“ от подаването" + +#: lib/index.tcl:337 +msgid "Ready to commit." +msgstr "Готовност за подаване." + +#: lib/index.tcl:350 +#, tcl-format +msgid "Adding %s" +msgstr "Добавяне на „%s“" + +#: lib/index.tcl:380 +#, tcl-format +msgid "Stage %d untracked files?" - msgstr "Да се добавят ли %d на брой неследени файла към индекса?" ++msgstr "Да се вкарат ли %d неследени файла в индекса?" + +#: lib/index.tcl:428 +#, tcl-format +msgid "Revert changes in file %s?" +msgstr "Да се махнат ли промените във файла „%s“?" + +#: lib/index.tcl:430 +#, tcl-format +msgid "Revert changes in these %i files?" +msgstr "Да се махнат ли промените в тези %i файла?" + +#: lib/index.tcl:438 +msgid "Any unstaged changes will be permanently lost by the revert." +msgstr "" +"Всички промени, които не са били вкарани в индекса, ще бъдат безвъзвратно " +"загубени." + +#: lib/index.tcl:441 +msgid "Do Nothing" +msgstr "Нищо да не се прави" + +#: lib/index.tcl:459 +msgid "Reverting selected files" +msgstr "Махане на промените в избраните файлове" + +#: lib/index.tcl:463 +#, tcl-format +msgid "Reverting %s" +msgstr "Махане на промените в „%s“" + - #: lib/encoding.tcl:443 - msgid "Default" - msgstr "Стандартното" - - #: lib/encoding.tcl:448 - #, tcl-format - msgid "System (%s)" - msgstr "Системното (%s)" - - #: lib/encoding.tcl:459 lib/encoding.tcl:465 - msgid "Other" - msgstr "Друго" - +#: lib/date.tcl:25 +#, tcl-format +msgid "Invalid date from Git: %s" +msgstr "Неправилни данни от Git: %s" + +#: lib/database.tcl:42 +msgid "Number of loose objects" +msgstr "Брой непакетирани обекти" + +#: lib/database.tcl:43 +msgid "Disk space used by loose objects" +msgstr "Дисково пространство заето от непакетирани обекти" + +#: lib/database.tcl:44 +msgid "Number of packed objects" +msgstr "Брой пакетирани обекти" + +#: lib/database.tcl:45 +msgid "Number of packs" +msgstr "Брой пакети" + +#: lib/database.tcl:46 +msgid "Disk space used by packed objects" +msgstr "Дисково пространство заето от пакетирани обекти" + +#: lib/database.tcl:47 +msgid "Packed objects waiting for pruning" +msgstr "Пакетирани обекти за окастряне" + +#: lib/database.tcl:48 +msgid "Garbage files" +msgstr "Файлове за боклука" + +#: lib/database.tcl:72 +msgid "Compressing the object database" +msgstr "Компресиране на базата с данни за обектите" + +#: lib/database.tcl:83 +msgid "Verifying the object database with fsck-objects" - msgstr "Проверка на базата с данни за обектите с програмата fsck-objects" ++msgstr "Проверка на базата с данни за обектите с програмата „fsck-objects“" + +#: lib/database.tcl:107 +#, tcl-format +msgid "" +"This repository currently has approximately %i loose objects.\n" +"\n" +"To maintain optimal performance it is strongly recommended that you compress " +"the database.\n" +"\n" +"Compress the database now?" +msgstr "" +"В това хранилище в момента има към %i непакетирани обекти.\n" +"\n" - "Зd добра производителност се препоръчва да компресирате базата с данни за " ++"За добра производителност се препоръчва да компресирате базата с данни за " +"обектите.\n" +"\n" +"Да се започне ли компресирането?" + +#: lib/error.tcl:20 lib/error.tcl:116 +msgid "error" +msgstr "грешка" + +#: lib/error.tcl:36 +msgid "warning" +msgstr "предупреждение" + +#: lib/error.tcl:96 +msgid "You must correct the above errors before committing." - msgstr "Преди да можете да подадете, оправете горните грешки." ++msgstr "Преди да можете да подадете, коригирайте горните грешки." + +#: lib/merge.tcl:13 +msgid "" +"Cannot merge while amending.\n" +"\n" +"You must finish amending this commit before starting any type of merge.\n" +msgstr "" +"По време на поправяне не може да сливане.\n" +"\n" +"Трябва да завършите поправянето на текущото подаване, преди да започнете " +"сливане.\n" + +#: lib/merge.tcl:27 +msgid "" +"Last scanned state does not match repository state.\n" +"\n" +"Another Git program has modified this repository since the last scan. A " +"rescan must be performed before a merge can be performed.\n" +"\n" +"The rescan will be automatically started now.\n" +msgstr "" +"Последно установеното състояние не отговаря на това в хранилището.\n" +"\n" +"Някой друг процес за Git е променил хранилището междувременно. Състоянието " +"трябва да бъде проверено, преди да се извърши сливане.\n" +"\n" +"Автоматично ще започне нова проверка.\n" +"\n" + +#: lib/merge.tcl:45 +#, tcl-format +msgid "" +"You are in the middle of a conflicted merge.\n" +"\n" +"File %s has merge conflicts.\n" +"\n" +"You must resolve them, stage the file, and commit to complete the current " +"merge. Only then can you begin another merge.\n" +msgstr "" +"В момента тече сливане, но има конфликти.\n" +"\n" +"Погледнете файла „%s“.\n" +"\n" +"Трябва да коригирате конфликтите в него, да го добавите към индекса и да " +"завършите текущото сливане чрез подаване. Чак тогава може да започнете ново " +"сливане.\n" + +#: lib/merge.tcl:55 +#, tcl-format +msgid "" +"You are in the middle of a change.\n" +"\n" +"File %s is modified.\n" +"\n" +"You should complete the current commit before starting a merge. Doing so " +"will help you abort a failed merge, should the need arise.\n" +msgstr "" +"В момента тече подаване.\n" +"\n" +"Файлът „%s“ е променен.\n" +"\n" +"Трябва да завършите текущото подаване, преди да започнете сливане. Така ще " +"можете лесно да преустановите сливането, ако възникне нужда.\n" + +#: lib/merge.tcl:108 +#, tcl-format +msgid "%s of %s" +msgstr "%s от общо %s" + +#: lib/merge.tcl:122 +#, tcl-format +msgid "Merging %s and %s..." +msgstr "Сливане на „%s“ и „%s“…" + +#: lib/merge.tcl:133 +msgid "Merge completed successfully." +msgstr "Сливането завърши успешно." + +#: lib/merge.tcl:135 +msgid "Merge failed. Conflict resolution is required." +msgstr "Неуспешно сливане — има конфликти за коригиране." + +#: lib/merge.tcl:160 +#, tcl-format +msgid "Merge Into %s" +msgstr "Сливане в „%s“" + +#: lib/merge.tcl:179 +msgid "Revision To Merge" +msgstr "Версия за сливане" + +#: lib/merge.tcl:214 +msgid "" +"Cannot abort while amending.\n" +"\n" +"You must finish amending this commit.\n" +msgstr "" +"Поправянето не може да бъде преустановено.\n" +"\n" +"Трябва да завършите поправката на това подаване.\n" + +#: lib/merge.tcl:224 +msgid "" +"Abort merge?\n" +"\n" +"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n" +"\n" +"Continue with aborting the current merge?" +msgstr "" +"Да се преустанови ли сливането?\n" +"\n" - "В такъв случай *ВСИЧКИ* неподадени промени ще бъдат безвъзвратно загубени.\n" ++"В такъв случай ●ВСИЧКИ● неподадени промени ще бъдат безвъзвратно загубени.\n" +"\n" +"Наистина ли да се преустанови сливането?" + +#: lib/merge.tcl:230 +msgid "" +"Reset changes?\n" +"\n" +"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n" +"\n" +"Continue with resetting the current changes?" +msgstr "" +"Да се занулят ли промените?\n" +"\n" - "В такъв случай *ВСИЧКИ* неподадени промени ще бъдат безвъзвратно загубени.\n" ++"В такъв случай ●ВСИЧКИ● неподадени промени ще бъдат безвъзвратно загубени.\n" +"\n" +"Наистина ли да се занулят промените?" + +#: lib/merge.tcl:241 +msgid "Aborting" +msgstr "Преустановяване" + +#: lib/merge.tcl:241 +msgid "files reset" +msgstr "файла със занулени промени" + +#: lib/merge.tcl:269 +msgid "Abort failed." +msgstr "Неуспешно преустановяване." + +#: lib/merge.tcl:271 +msgid "Abort completed. Ready." +msgstr "Успешно преустановяване. Готовност за следващо действие." diff --cc git-gui/po/sv.po index fcb063ffa6,0000000000..1b4ad8368e mode 100644,000000..100644 --- a/git-gui/po/sv.po +++ b/git-gui/po/sv.po @@@ -1,2605 -1,0 +1,2736 @@@ +# Swedish translation of git-gui. +# Copyright (C) 2007-2008 Shawn Pearce, et al. +# This file is distributed under the same license as the git-gui package. +# - # Peter Krefting , 2007-2008. +# Mikael Magnusson , 2008. ++# Peter Krefting , 2007-2008, 2015. ++# +msgid "" +msgstr "" +"Project-Id-Version: sv\n" +"Report-Msgid-Bugs-To: \n" - "POT-Creation-Date: 2010-09-12 21:11+0100\n" - "PO-Revision-Date: 2010-09-12 21:12+0100\n" ++"POT-Creation-Date: 2015-03-27 10:15+0100\n" ++"PO-Revision-Date: 2015-03-27 10:24+0100\n" +"Last-Translator: Peter Krefting \n" +"Language-Team: Swedish \n" ++"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Gtranslator 2.91.6\n" + - #: git-gui.sh:781 ++#: git-gui.sh:861 +#, tcl-format +msgid "Invalid font specified in %s:" +msgstr "Ogiltigt teckensnitt angivet i %s:" + - #: git-gui.sh:831 ++#: git-gui.sh:915 +msgid "Main Font" +msgstr "Huvudteckensnitt" + - #: git-gui.sh:832 ++#: git-gui.sh:916 +msgid "Diff/Console Font" +msgstr "Diff/konsolteckensnitt" + - #: git-gui.sh:845 git-gui.sh:859 git-gui.sh:872 git-gui.sh:955 git-gui.sh:974 - #: git-gui.sh:2964 ++#: git-gui.sh:931 git-gui.sh:945 git-gui.sh:958 git-gui.sh:1048 ++#: git-gui.sh:1067 git-gui.sh:3125 +msgid "git-gui: fatal error" +msgstr "git-gui: ödesdigert fel" + - #: git-gui.sh:846 ++#: git-gui.sh:932 +msgid "Cannot find git in PATH." +msgstr "Hittar inte git i PATH." + - #: git-gui.sh:873 ++#: git-gui.sh:959 +msgid "Cannot parse Git version string:" +msgstr "Kan inte tolka versionssträng från Git:" + - #: git-gui.sh:891 ++#: git-gui.sh:984 +#, tcl-format +msgid "" +"Git version cannot be determined.\n" +"\n" +"%s claims it is version '%s'.\n" +"\n" +"%s requires at least Git 1.5.0 or later.\n" +"\n" +"Assume '%s' is version 1.5.0?\n" +msgstr "" +"Kan inte avgöra Gits version.\n" +"\n" +"%s säger att dess version är \"%s\".\n" +"\n" +"%s kräver minst Git 1.5.0 eller senare.\n" +"\n" +"Anta att \"%s\" är version 1.5.0?\n" + - #: git-gui.sh:1180 ++#: git-gui.sh:1281 +msgid "Git directory not found:" +msgstr "Git-katalogen hittades inte:" + - #: git-gui.sh:1201 ++#: git-gui.sh:1315 +msgid "Cannot move to top of working directory:" +msgstr "Kan inte gå till början på arbetskatalogen:" + - #: git-gui.sh:1209 ++#: git-gui.sh:1323 +msgid "Cannot use bare repository:" +msgstr "Kan inte använda naket arkiv:" + - #: git-gui.sh:1217 ++#: git-gui.sh:1331 +msgid "No working directory" +msgstr "Ingen arbetskatalog" + - #: git-gui.sh:1389 lib/checkout_op.tcl:306 ++#: git-gui.sh:1503 lib/checkout_op.tcl:306 +msgid "Refreshing file status..." +msgstr "Uppdaterar filstatus..." + - #: git-gui.sh:1445 ++#: git-gui.sh:1563 +msgid "Scanning for modified files ..." +msgstr "Söker efter ändrade filer..." + - #: git-gui.sh:1509 ++#: git-gui.sh:1639 +msgid "Calling prepare-commit-msg hook..." +msgstr "" +"Anropar kroken för förberedelse av incheckningsmeddelande (prepare-commit-" +"msg)..." + - #: git-gui.sh:1526 ++#: git-gui.sh:1656 +msgid "Commit declined by prepare-commit-msg hook." +msgstr "" +"Incheckningen avvisades av kroken för förberedelse av incheckningsmeddelande " +"(prepare-commit-msg)." + - #: git-gui.sh:1684 lib/browser.tcl:246 ++#: git-gui.sh:1814 lib/browser.tcl:252 +msgid "Ready." +msgstr "Klar." + - #: git-gui.sh:1842 ++#: git-gui.sh:1978 +#, tcl-format - msgid "Displaying only %s of %s files." - msgstr "Visar endast %s av %s filer." ++msgid "" ++"Display limit (gui.maxfilesdisplayed = %s) reached, not showing all %s files." ++msgstr "" ++"Visningsgräns (gui.maxfilesdisplayed = %s) nådd, visare inte samtliga %s " ++"filer." + - #: git-gui.sh:1968 ++#: git-gui.sh:2101 +msgid "Unmodified" +msgstr "Oförändrade" + - #: git-gui.sh:1970 ++#: git-gui.sh:2103 +msgid "Modified, not staged" +msgstr "Förändrade, ej köade" + - #: git-gui.sh:1971 git-gui.sh:1979 ++#: git-gui.sh:2104 git-gui.sh:2116 +msgid "Staged for commit" +msgstr "Köade för incheckning" + - #: git-gui.sh:1972 git-gui.sh:1980 ++#: git-gui.sh:2105 git-gui.sh:2117 +msgid "Portions staged for commit" +msgstr "Delar köade för incheckning" + - #: git-gui.sh:1973 git-gui.sh:1981 ++#: git-gui.sh:2106 git-gui.sh:2118 +msgid "Staged for commit, missing" +msgstr "Köade för incheckning, saknade" + - #: git-gui.sh:1975 ++#: git-gui.sh:2108 +msgid "File type changed, not staged" +msgstr "Filtyp ändrad, ej köade" + - #: git-gui.sh:1976 ++#: git-gui.sh:2109 git-gui.sh:2110 ++msgid "File type changed, old type staged for commit" ++msgstr "Filtyp ändrad, gammal typ köade för incheckning" ++ ++#: git-gui.sh:2111 +msgid "File type changed, staged" +msgstr "Filtyp ändrad, köade" + - #: git-gui.sh:1978 ++#: git-gui.sh:2112 ++msgid "File type change staged, modification not staged" ++msgstr "Filtypsändringar köade, innehållsändringar ej köade" ++ ++#: git-gui.sh:2113 ++msgid "File type change staged, file missing" ++msgstr "Filtypsändringar köade, fil saknas" ++ ++#: git-gui.sh:2115 +msgid "Untracked, not staged" +msgstr "Ej spårade, ej köade" + - #: git-gui.sh:1983 ++#: git-gui.sh:2120 +msgid "Missing" +msgstr "Saknade" + - #: git-gui.sh:1984 ++#: git-gui.sh:2121 +msgid "Staged for removal" +msgstr "Köade för borttagning" + - #: git-gui.sh:1985 ++#: git-gui.sh:2122 +msgid "Staged for removal, still present" +msgstr "Köade för borttagning, fortfarande närvarande" + - #: git-gui.sh:1987 git-gui.sh:1988 git-gui.sh:1989 git-gui.sh:1990 - #: git-gui.sh:1991 git-gui.sh:1992 ++#: git-gui.sh:2124 git-gui.sh:2125 git-gui.sh:2126 git-gui.sh:2127 ++#: git-gui.sh:2128 git-gui.sh:2129 +msgid "Requires merge resolution" +msgstr "Kräver konflikthantering efter sammanslagning" + - #: git-gui.sh:2027 ++#: git-gui.sh:2164 +msgid "Starting gitk... please wait..." +msgstr "Startar gitk... vänta..." + - #: git-gui.sh:2039 ++#: git-gui.sh:2176 +msgid "Couldn't find gitk in PATH" +msgstr "Hittade inte gitk i PATH." + - #: git-gui.sh:2098 ++#: git-gui.sh:2235 +msgid "Couldn't find git gui in PATH" +msgstr "Hittade inte git gui i PATH." + - #: git-gui.sh:2515 lib/choose_repository.tcl:36 ++#: git-gui.sh:2654 lib/choose_repository.tcl:41 +msgid "Repository" +msgstr "Arkiv" + - #: git-gui.sh:2516 ++#: git-gui.sh:2655 +msgid "Edit" +msgstr "Redigera" + - #: git-gui.sh:2518 lib/choose_rev.tcl:566 ++#: git-gui.sh:2657 lib/choose_rev.tcl:567 +msgid "Branch" +msgstr "Gren" + - #: git-gui.sh:2521 lib/choose_rev.tcl:553 ++#: git-gui.sh:2660 lib/choose_rev.tcl:554 +msgid "Commit@@noun" +msgstr "Incheckning" + - #: git-gui.sh:2524 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168 ++#: git-gui.sh:2663 lib/merge.tcl:123 lib/merge.tcl:152 lib/merge.tcl:170 +msgid "Merge" +msgstr "Slå ihop" + - #: git-gui.sh:2525 lib/choose_rev.tcl:562 ++#: git-gui.sh:2664 lib/choose_rev.tcl:563 +msgid "Remote" +msgstr "Fjärrarkiv" + - #: git-gui.sh:2528 ++#: git-gui.sh:2667 +msgid "Tools" +msgstr "Verktyg" + - #: git-gui.sh:2537 ++#: git-gui.sh:2676 +msgid "Explore Working Copy" +msgstr "Utforska arbetskopia" + - #: git-gui.sh:2543 ++#: git-gui.sh:2682 ++msgid "Git Bash" ++msgstr "Git Bash" ++ ++#: git-gui.sh:2692 +msgid "Browse Current Branch's Files" +msgstr "Bläddra i grenens filer" + - #: git-gui.sh:2547 ++#: git-gui.sh:2696 +msgid "Browse Branch Files..." +msgstr "Bläddra filer på gren..." + - #: git-gui.sh:2552 ++#: git-gui.sh:2701 +msgid "Visualize Current Branch's History" +msgstr "Visualisera grenens historik" + - #: git-gui.sh:2556 ++#: git-gui.sh:2705 +msgid "Visualize All Branch History" +msgstr "Visualisera alla grenars historik" + - #: git-gui.sh:2563 ++#: git-gui.sh:2712 +#, tcl-format +msgid "Browse %s's Files" +msgstr "Bläddra i filer för %s" + - #: git-gui.sh:2565 ++#: git-gui.sh:2714 +#, tcl-format +msgid "Visualize %s's History" +msgstr "Visualisera historik för %s" + - #: git-gui.sh:2570 lib/database.tcl:40 lib/database.tcl:66 ++#: git-gui.sh:2719 lib/database.tcl:40 lib/database.tcl:66 +msgid "Database Statistics" +msgstr "Databasstatistik" + - #: git-gui.sh:2573 lib/database.tcl:33 ++#: git-gui.sh:2722 lib/database.tcl:33 +msgid "Compress Database" +msgstr "Komprimera databas" + - #: git-gui.sh:2576 ++#: git-gui.sh:2725 +msgid "Verify Database" +msgstr "Verifiera databas" + - #: git-gui.sh:2583 git-gui.sh:2587 git-gui.sh:2591 lib/shortcut.tcl:8 ++#: git-gui.sh:2732 git-gui.sh:2736 git-gui.sh:2740 lib/shortcut.tcl:8 +#: lib/shortcut.tcl:40 lib/shortcut.tcl:72 +msgid "Create Desktop Icon" +msgstr "Skapa skrivbordsikon" + - #: git-gui.sh:2599 lib/choose_repository.tcl:188 lib/choose_repository.tcl:196 ++#: git-gui.sh:2748 lib/choose_repository.tcl:193 lib/choose_repository.tcl:201 +msgid "Quit" +msgstr "Avsluta" + - #: git-gui.sh:2607 ++#: git-gui.sh:2756 +msgid "Undo" +msgstr "Ångra" + - #: git-gui.sh:2610 ++#: git-gui.sh:2759 +msgid "Redo" +msgstr "Gör om" + - #: git-gui.sh:2614 git-gui.sh:3190 ++#: git-gui.sh:2763 git-gui.sh:3368 +msgid "Cut" +msgstr "Klipp ut" + - #: git-gui.sh:2617 git-gui.sh:3193 git-gui.sh:3267 git-gui.sh:3340 ++#: git-gui.sh:2766 git-gui.sh:3371 git-gui.sh:3445 git-gui.sh:3530 +#: lib/console.tcl:69 +msgid "Copy" +msgstr "Kopiera" + - #: git-gui.sh:2620 git-gui.sh:3196 ++#: git-gui.sh:2769 git-gui.sh:3374 +msgid "Paste" +msgstr "Klistra in" + - #: git-gui.sh:2623 git-gui.sh:3199 lib/branch_delete.tcl:28 - #: lib/remote_branch_delete.tcl:39 ++#: git-gui.sh:2772 git-gui.sh:3377 lib/remote_branch_delete.tcl:39 ++#: lib/branch_delete.tcl:28 +msgid "Delete" +msgstr "Ta bort" + - #: git-gui.sh:2627 git-gui.sh:3203 git-gui.sh:3344 lib/console.tcl:71 ++#: git-gui.sh:2776 git-gui.sh:3381 git-gui.sh:3534 lib/console.tcl:71 +msgid "Select All" +msgstr "Markera alla" + - #: git-gui.sh:2636 ++#: git-gui.sh:2785 +msgid "Create..." +msgstr "Skapa..." + - #: git-gui.sh:2642 ++#: git-gui.sh:2791 +msgid "Checkout..." +msgstr "Checka ut..." + - #: git-gui.sh:2648 ++#: git-gui.sh:2797 +msgid "Rename..." +msgstr "Byt namn..." + - #: git-gui.sh:2653 ++#: git-gui.sh:2802 +msgid "Delete..." +msgstr "Ta bort..." + - #: git-gui.sh:2658 ++#: git-gui.sh:2807 +msgid "Reset..." +msgstr "Återställ..." + - #: git-gui.sh:2668 ++#: git-gui.sh:2817 +msgid "Done" +msgstr "Färdig" + - #: git-gui.sh:2670 ++#: git-gui.sh:2819 +msgid "Commit@@verb" +msgstr "Checka in" + - #: git-gui.sh:2679 git-gui.sh:3131 ++#: git-gui.sh:2828 git-gui.sh:3309 +msgid "New Commit" +msgstr "Ny incheckning" + - #: git-gui.sh:2687 git-gui.sh:3138 ++#: git-gui.sh:2836 git-gui.sh:3316 +msgid "Amend Last Commit" +msgstr "Lägg till föregående incheckning" + - #: git-gui.sh:2697 git-gui.sh:3092 lib/remote_branch_delete.tcl:101 ++#: git-gui.sh:2846 git-gui.sh:3270 lib/remote_branch_delete.tcl:101 +msgid "Rescan" +msgstr "Sök på nytt" + - #: git-gui.sh:2703 ++#: git-gui.sh:2852 +msgid "Stage To Commit" +msgstr "Köa för incheckning" + - #: git-gui.sh:2709 ++#: git-gui.sh:2858 +msgid "Stage Changed Files To Commit" +msgstr "Köa ändrade filer för incheckning" + - #: git-gui.sh:2715 ++#: git-gui.sh:2864 +msgid "Unstage From Commit" +msgstr "Ta bort från incheckningskö" + - #: git-gui.sh:2721 lib/index.tcl:415 ++#: git-gui.sh:2870 lib/index.tcl:442 +msgid "Revert Changes" +msgstr "Återställ ändringar" + - #: git-gui.sh:2729 git-gui.sh:3391 git-gui.sh:3422 ++#: git-gui.sh:2878 git-gui.sh:3581 git-gui.sh:3612 +msgid "Show Less Context" +msgstr "Visa mindre sammanhang" + - #: git-gui.sh:2733 git-gui.sh:3395 git-gui.sh:3426 ++#: git-gui.sh:2882 git-gui.sh:3585 git-gui.sh:3616 +msgid "Show More Context" +msgstr "Visa mer sammanhang" + - #: git-gui.sh:2740 git-gui.sh:3105 git-gui.sh:3214 ++#: git-gui.sh:2889 git-gui.sh:3283 git-gui.sh:3392 +msgid "Sign Off" +msgstr "Skriv under" + - #: git-gui.sh:2756 ++#: git-gui.sh:2905 +msgid "Local Merge..." +msgstr "Lokal sammanslagning..." + - #: git-gui.sh:2761 ++#: git-gui.sh:2910 +msgid "Abort Merge..." +msgstr "Avbryt sammanslagning..." + - #: git-gui.sh:2773 git-gui.sh:2801 ++#: git-gui.sh:2922 git-gui.sh:2950 +msgid "Add..." +msgstr "Lägg till..." + - #: git-gui.sh:2777 ++#: git-gui.sh:2926 +msgid "Push..." +msgstr "Sänd..." + - #: git-gui.sh:2781 ++#: git-gui.sh:2930 +msgid "Delete Branch..." +msgstr "Ta bort gren..." + - #: git-gui.sh:2791 git-gui.sh:3373 ++#: git-gui.sh:2940 git-gui.sh:3563 +msgid "Options..." +msgstr "Alternativ..." + - #: git-gui.sh:2802 ++#: git-gui.sh:2951 +msgid "Remove..." +msgstr "Ta bort..." + - #: git-gui.sh:2811 lib/choose_repository.tcl:50 ++#: git-gui.sh:2960 lib/choose_repository.tcl:55 +msgid "Help" +msgstr "Hjälp" + - #: git-gui.sh:2815 git-gui.sh:2819 lib/about.tcl:14 - #: lib/choose_repository.tcl:44 lib/choose_repository.tcl:53 ++#: git-gui.sh:2964 git-gui.sh:2968 lib/choose_repository.tcl:49 ++#: lib/choose_repository.tcl:58 lib/about.tcl:14 +#, tcl-format +msgid "About %s" +msgstr "Om %s" + - #: git-gui.sh:2843 ++#: git-gui.sh:2992 +msgid "Online Documentation" +msgstr "Webbdokumentation" + - #: git-gui.sh:2846 lib/choose_repository.tcl:47 lib/choose_repository.tcl:56 ++#: git-gui.sh:2995 lib/choose_repository.tcl:52 lib/choose_repository.tcl:61 +msgid "Show SSH Key" +msgstr "Visa SSH-nyckel" + - #: git-gui.sh:2965 ++#: git-gui.sh:3014 git-gui.sh:3146 ++msgid "Usage" ++msgstr "Användning" ++ ++#: git-gui.sh:3095 lib/blame.tcl:573 ++msgid "Error" ++msgstr "Fel" ++ ++#: git-gui.sh:3126 +#, tcl-format +msgid "fatal: cannot stat path %s: No such file or directory" +msgstr "" +"ödesdigert: kunde inte ta status på sökvägen %s: Fil eller katalog saknas" + - #: git-gui.sh:2997 ++#: git-gui.sh:3159 +msgid "Current Branch:" +msgstr "Aktuell gren:" + - #: git-gui.sh:3023 ++#: git-gui.sh:3185 +msgid "Staged Changes (Will Commit)" +msgstr "Köade ändringar (kommer att checkas in)" + - #: git-gui.sh:3043 ++#: git-gui.sh:3205 +msgid "Unstaged Changes" +msgstr "Oköade ändringar" + - #: git-gui.sh:3098 ++#: git-gui.sh:3276 +msgid "Stage Changed" +msgstr "Köa ändrade" + - #: git-gui.sh:3117 lib/transport.tcl:107 lib/transport.tcl:196 ++#: git-gui.sh:3295 lib/transport.tcl:137 lib/transport.tcl:229 +msgid "Push" +msgstr "Sänd" + - #: git-gui.sh:3152 ++#: git-gui.sh:3330 +msgid "Initial Commit Message:" +msgstr "Inledande incheckningsmeddelande:" + - #: git-gui.sh:3153 ++#: git-gui.sh:3331 +msgid "Amended Commit Message:" +msgstr "Utökat incheckningsmeddelande:" + - #: git-gui.sh:3154 ++#: git-gui.sh:3332 +msgid "Amended Initial Commit Message:" +msgstr "Utökat inledande incheckningsmeddelande:" + - #: git-gui.sh:3155 ++#: git-gui.sh:3333 +msgid "Amended Merge Commit Message:" +msgstr "Utökat incheckningsmeddelande för sammanslagning:" + - #: git-gui.sh:3156 ++#: git-gui.sh:3334 +msgid "Merge Commit Message:" +msgstr "Incheckningsmeddelande för sammanslagning:" + - #: git-gui.sh:3157 ++#: git-gui.sh:3335 +msgid "Commit Message:" +msgstr "Incheckningsmeddelande:" + - #: git-gui.sh:3206 git-gui.sh:3348 lib/console.tcl:73 ++#: git-gui.sh:3384 git-gui.sh:3538 lib/console.tcl:73 +msgid "Copy All" +msgstr "Kopiera alla" + - #: git-gui.sh:3230 lib/blame.tcl:104 ++#: git-gui.sh:3408 lib/blame.tcl:105 +msgid "File:" +msgstr "Fil:" + - #: git-gui.sh:3336 ++#: git-gui.sh:3526 +msgid "Refresh" +msgstr "Uppdatera" + - #: git-gui.sh:3357 ++#: git-gui.sh:3547 +msgid "Decrease Font Size" +msgstr "Minska teckensnittsstorlek" + - #: git-gui.sh:3361 ++#: git-gui.sh:3551 +msgid "Increase Font Size" +msgstr "Öka teckensnittsstorlek" + - #: git-gui.sh:3369 lib/blame.tcl:281 ++#: git-gui.sh:3559 lib/blame.tcl:294 +msgid "Encoding" +msgstr "Teckenkodning" + - #: git-gui.sh:3380 ++#: git-gui.sh:3570 +msgid "Apply/Reverse Hunk" +msgstr "Använd/återställ del" + - #: git-gui.sh:3385 ++#: git-gui.sh:3575 +msgid "Apply/Reverse Line" +msgstr "Använd/återställ rad" + - #: git-gui.sh:3404 ++#: git-gui.sh:3594 +msgid "Run Merge Tool" +msgstr "Starta verktyg för sammanslagning" + - #: git-gui.sh:3409 ++#: git-gui.sh:3599 +msgid "Use Remote Version" +msgstr "Använd versionen från fjärrarkivet" + - #: git-gui.sh:3413 ++#: git-gui.sh:3603 +msgid "Use Local Version" +msgstr "Använd lokala versionen" + - #: git-gui.sh:3417 ++#: git-gui.sh:3607 +msgid "Revert To Base" +msgstr "Återställ till basversionen" + - #: git-gui.sh:3435 ++#: git-gui.sh:3625 +msgid "Visualize These Changes In The Submodule" +msgstr "Visualisera ändringarna i undermodulen" + - #: git-gui.sh:3439 ++#: git-gui.sh:3629 +msgid "Visualize Current Branch History In The Submodule" +msgstr "Visualisera grenens historik i undermodulen" + - #: git-gui.sh:3443 ++#: git-gui.sh:3633 +msgid "Visualize All Branch History In The Submodule" +msgstr "Visualisera alla grenars historik i undermodulen" + - #: git-gui.sh:3448 ++#: git-gui.sh:3638 +msgid "Start git gui In The Submodule" +msgstr "Starta git gui i undermodulen" + - #: git-gui.sh:3483 ++#: git-gui.sh:3673 +msgid "Unstage Hunk From Commit" +msgstr "Ta bort del ur incheckningskö" + - #: git-gui.sh:3485 ++#: git-gui.sh:3675 +msgid "Unstage Lines From Commit" +msgstr "Ta bort rader ur incheckningskö" + - #: git-gui.sh:3487 ++#: git-gui.sh:3677 +msgid "Unstage Line From Commit" +msgstr "Ta bort rad ur incheckningskö" + - #: git-gui.sh:3490 ++#: git-gui.sh:3680 +msgid "Stage Hunk For Commit" +msgstr "Ställ del i incheckningskö" + - #: git-gui.sh:3492 ++#: git-gui.sh:3682 +msgid "Stage Lines For Commit" +msgstr "Ställ rader i incheckningskö" + - #: git-gui.sh:3494 ++#: git-gui.sh:3684 +msgid "Stage Line For Commit" +msgstr "Ställ rad i incheckningskö" + - #: git-gui.sh:3519 ++#: git-gui.sh:3709 +msgid "Initializing..." +msgstr "Initierar..." + - #: git-gui.sh:3658 ++#: git-gui.sh:3852 +#, tcl-format +msgid "" +"Possible environment issues exist.\n" +"\n" +"The following environment variables are probably\n" +"going to be ignored by any Git subprocess run\n" +"by %s:\n" +"\n" +msgstr "" +"Det finns möjliga problem med miljövariabler.\n" +"\n" +"Följande miljövariabler kommer troligen att\n" +"ignoreras av alla Git-underprocesser som körs\n" +"av %s:\n" +"\n" + - #: git-gui.sh:3687 ++#: git-gui.sh:3881 +msgid "" +"\n" +"This is due to a known issue with the\n" +"Tcl binary distributed by Cygwin." +msgstr "" +"\n" +"Detta beror på ett känt problem med\n" +"Tcl-binären som följer med Cygwin." + - #: git-gui.sh:3692 ++#: git-gui.sh:3886 +#, tcl-format +msgid "" +"\n" +"\n" +"A good replacement for %s\n" +"is placing values for the user.name and\n" +"user.email settings into your personal\n" +"~/.gitconfig file.\n" +msgstr "" +"\n" +"\n" +"Du kan ersätta %s\n" +"med att lägga in värden för inställningarna\n" +"user.name och user.email i din personliga\n" +"~/.gitconfig-fil.\n" + - #: lib/about.tcl:26 - msgid "git-gui - a graphical user interface for Git." - msgstr "git-gui - ett grafiskt användargränssnitt för Git." - - #: lib/blame.tcl:72 - msgid "File Viewer" - msgstr "Filvisare" ++#: lib/line.tcl:17 ++msgid "Goto Line:" ++msgstr "Gå till rad:" + - #: lib/blame.tcl:78 - msgid "Commit:" - msgstr "Incheckning:" ++#: lib/line.tcl:23 ++msgid "Go" ++msgstr "Gå" + - #: lib/blame.tcl:271 - msgid "Copy Commit" - msgstr "Kopiera incheckning" ++#: lib/console.tcl:59 ++msgid "Working... please wait..." ++msgstr "Arbetar... vänta..." + - #: lib/blame.tcl:275 - msgid "Find Text..." - msgstr "Sök text..." ++#: lib/console.tcl:81 lib/checkout_op.tcl:146 lib/sshkey.tcl:55 ++#: lib/database.tcl:30 ++msgid "Close" ++msgstr "Stäng" + - #: lib/blame.tcl:284 - msgid "Do Full Copy Detection" - msgstr "Gör full kopieringsigenkänning" ++#: lib/console.tcl:186 ++msgid "Success" ++msgstr "Lyckades" + - #: lib/blame.tcl:288 - msgid "Show History Context" - msgstr "Visa historiksammanhang" ++#: lib/console.tcl:200 ++msgid "Error: Command Failed" ++msgstr "Fel: Kommando misslyckades" + - #: lib/blame.tcl:291 - msgid "Blame Parent Commit" - msgstr "Klandra föräldraincheckning" ++#: lib/checkout_op.tcl:85 ++#, tcl-format ++msgid "Fetching %s from %s" ++msgstr "Hämtar %s från %s" + - #: lib/blame.tcl:450 ++#: lib/checkout_op.tcl:133 +#, tcl-format - msgid "Reading %s..." - msgstr "Läser %s..." ++msgid "fatal: Cannot resolve %s" ++msgstr "ödesdigert: Kunde inte slå upp %s" + - #: lib/blame.tcl:581 - msgid "Loading copy/move tracking annotations..." - msgstr "Läser annoteringar för kopiering/flyttning..." ++#: lib/checkout_op.tcl:175 ++#, tcl-format ++msgid "Branch '%s' does not exist." ++msgstr "Grenen \"%s\" finns inte." + - #: lib/blame.tcl:601 - msgid "lines annotated" - msgstr "rader annoterade" ++#: lib/checkout_op.tcl:194 ++#, tcl-format ++msgid "Failed to configure simplified git-pull for '%s'." ++msgstr "Kunde inte konfigurera förenklad git-pull för '%s'." + - #: lib/blame.tcl:793 - msgid "Loading original location annotations..." - msgstr "Läser in annotering av originalplacering..." ++#: lib/checkout_op.tcl:202 lib/branch_rename.tcl:102 ++#, tcl-format ++msgid "Branch '%s' already exists." ++msgstr "Grenen \"%s\" finns redan." + - #: lib/blame.tcl:796 - msgid "Annotation complete." - msgstr "Annotering fullbordad." ++#: lib/checkout_op.tcl:229 ++#, tcl-format ++msgid "" ++"Branch '%s' already exists.\n" ++"\n" ++"It cannot fast-forward to %s.\n" ++"A merge is required." ++msgstr "" ++"Grenen \"%s\" finns redan.\n" ++"\n" ++"Den kan inte snabbspolas till %s.\n" ++"En sammanslagning krävs." + - #: lib/blame.tcl:826 - msgid "Busy" - msgstr "Upptagen" ++#: lib/checkout_op.tcl:243 ++#, tcl-format ++msgid "Merge strategy '%s' not supported." ++msgstr "Sammanslagningsstrategin \"%s\" stöds inte." + - #: lib/blame.tcl:827 - msgid "Annotation process is already running." - msgstr "Annoteringsprocess körs redan." ++#: lib/checkout_op.tcl:262 ++#, tcl-format ++msgid "Failed to update '%s'." ++msgstr "Misslyckades med att uppdatera \"%s\"." + - #: lib/blame.tcl:866 - msgid "Running thorough copy detection..." - msgstr "Kör grundlig kopieringsigenkänning..." ++#: lib/checkout_op.tcl:274 ++msgid "Staging area (index) is already locked." ++msgstr "Köområdet (index) är redan låst." + - #: lib/blame.tcl:934 - msgid "Loading annotation..." - msgstr "Läser in annotering..." ++#: lib/checkout_op.tcl:289 ++msgid "" ++"Last scanned state does not match repository state.\n" ++"\n" ++"Another Git program has modified this repository since the last scan. A " ++"rescan must be performed before the current branch can be changed.\n" ++"\n" ++"The rescan will be automatically started now.\n" ++msgstr "" ++"Det senaste inlästa tillståndet motsvarar inte tillståndet i arkivet.\n" ++"\n" ++"Ett annat Git-program har ändrat arkivet sedan senaste avsökningen. Du måste " ++"utföra en ny sökning innan den aktuella grenen kan ändras.\n" ++"\n" ++"Sökningen kommer att startas automatiskt nu.\n" + - #: lib/blame.tcl:987 - msgid "Author:" - msgstr "Författare:" ++#: lib/checkout_op.tcl:345 ++#, tcl-format ++msgid "Updating working directory to '%s'..." ++msgstr "Uppdaterar arbetskatalogen till \"%s\"..." + - #: lib/blame.tcl:991 - msgid "Committer:" - msgstr "Incheckare:" ++#: lib/checkout_op.tcl:346 ++msgid "files checked out" ++msgstr "filer utcheckade" + - #: lib/blame.tcl:996 - msgid "Original File:" - msgstr "Ursprunglig fil:" ++#: lib/checkout_op.tcl:376 ++#, tcl-format ++msgid "Aborted checkout of '%s' (file level merging is required)." ++msgstr "Avbryter utcheckning av \"%s\" (sammanslagning på filnivå krävs)." + - #: lib/blame.tcl:1044 - msgid "Cannot find HEAD commit:" - msgstr "Hittar inte incheckning för HEAD:" ++#: lib/checkout_op.tcl:377 ++msgid "File level merge required." ++msgstr "Sammanslagning på filnivå krävs." + - #: lib/blame.tcl:1099 - msgid "Cannot find parent commit:" - msgstr "Hittar inte föräldraincheckning:" ++#: lib/checkout_op.tcl:381 ++#, tcl-format ++msgid "Staying on branch '%s'." ++msgstr "Stannar på grenen \"%s\"." + - #: lib/blame.tcl:1114 - msgid "Unable to display parent" - msgstr "Kan inte visa förälder" ++#: lib/checkout_op.tcl:452 ++msgid "" ++"You are no longer on a local branch.\n" ++"\n" ++"If you wanted to be on a branch, create one now starting from 'This Detached " ++"Checkout'." ++msgstr "" ++"Du är inte längre på en lokal gren.\n" ++"\n" ++"Om du ville vara på en gren skapar du en nu, baserad på \"Denna frånkopplade " ++"utcheckning\"." + - #: lib/blame.tcl:1115 lib/diff.tcl:323 - msgid "Error loading diff:" - msgstr "Fel vid inläsning av differens:" ++#: lib/checkout_op.tcl:503 lib/checkout_op.tcl:507 ++#, tcl-format ++msgid "Checked out '%s'." ++msgstr "Checkade ut \"%s\"." + - #: lib/blame.tcl:1255 - msgid "Originally By:" - msgstr "Ursprungligen av:" ++#: lib/checkout_op.tcl:535 ++#, tcl-format ++msgid "Resetting '%s' to '%s' will lose the following commits:" ++msgstr "" ++"Om du återställer \"%s\" till \"%s\" går följande incheckningar förlorade:" + - #: lib/blame.tcl:1261 - msgid "In File:" - msgstr "I filen:" ++#: lib/checkout_op.tcl:557 ++msgid "Recovering lost commits may not be easy." ++msgstr "Det kanske inte är så enkelt att återskapa förlorade incheckningar." + - #: lib/blame.tcl:1266 - msgid "Copied Or Moved Here By:" - msgstr "Kopierad eller flyttad hit av:" ++#: lib/checkout_op.tcl:562 ++#, tcl-format ++msgid "Reset '%s'?" ++msgstr "Återställa \"%s\"?" + - #: lib/branch_checkout.tcl:16 lib/branch_checkout.tcl:21 - msgid "Checkout Branch" - msgstr "Checka ut gren" ++#: lib/checkout_op.tcl:567 lib/merge.tcl:166 lib/tools_dlg.tcl:336 ++msgid "Visualize" ++msgstr "Visualisera" + - #: lib/branch_checkout.tcl:26 - msgid "Checkout" - msgstr "Checka ut" ++#: lib/checkout_op.tcl:571 lib/branch_create.tcl:85 ++msgid "Reset" ++msgstr "Återställ" + - #: lib/branch_checkout.tcl:30 lib/branch_create.tcl:37 - #: lib/branch_delete.tcl:34 lib/branch_rename.tcl:32 lib/browser.tcl:286 - #: lib/checkout_op.tcl:579 lib/choose_font.tcl:45 lib/merge.tcl:172 - #: lib/option.tcl:127 lib/remote_add.tcl:34 lib/remote_branch_delete.tcl:43 - #: lib/tools_dlg.tcl:41 lib/tools_dlg.tcl:202 lib/tools_dlg.tcl:345 - #: lib/transport.tcl:111 ++#: lib/checkout_op.tcl:579 lib/transport.tcl:141 lib/remote_add.tcl:34 ++#: lib/browser.tcl:292 lib/merge.tcl:174 lib/branch_checkout.tcl:30 ++#: lib/choose_font.tcl:45 lib/option.tcl:127 lib/tools_dlg.tcl:41 ++#: lib/tools_dlg.tcl:202 lib/tools_dlg.tcl:345 lib/branch_rename.tcl:32 ++#: lib/remote_branch_delete.tcl:43 lib/branch_create.tcl:37 ++#: lib/branch_delete.tcl:34 +msgid "Cancel" +msgstr "Avbryt" + - #: lib/branch_checkout.tcl:35 lib/browser.tcl:291 lib/tools_dlg.tcl:321 - msgid "Revision" - msgstr "Revision" - - #: lib/branch_checkout.tcl:39 lib/branch_create.tcl:69 lib/option.tcl:287 - msgid "Options" - msgstr "Alternativ" ++#: lib/checkout_op.tcl:635 ++#, tcl-format ++msgid "" ++"Failed to set current branch.\n" ++"\n" ++"This working directory is only partially switched. We successfully updated " ++"your files, but failed to update an internal Git file.\n" ++"\n" ++"This should not have occurred. %s will now close and give up." ++msgstr "" ++"Kunde inte ställa in aktuell gren.\n" ++"\n" ++"Arbetskatalogen har bara växlats delvis. Vi uppdaterade filerna utan " ++"problem, men kunde inte uppdatera en intern fil i Git.\n" ++"\n" ++"Detta skulle inte ha hänt. %s kommer nu stängas och ge upp." + - #: lib/branch_checkout.tcl:42 lib/branch_create.tcl:92 - msgid "Fetch Tracking Branch" - msgstr "Hämta spårande gren" ++#: lib/transport.tcl:6 lib/remote_add.tcl:132 ++#, tcl-format ++msgid "fetch %s" ++msgstr "hämta %s" + - #: lib/branch_checkout.tcl:47 - msgid "Detach From Local Branch" - msgstr "Koppla bort från lokal gren" ++#: lib/transport.tcl:7 ++#, tcl-format ++msgid "Fetching new changes from %s" ++msgstr "Hämtar nya ändringar från %s" + - #: lib/branch_create.tcl:23 - msgid "Create Branch" - msgstr "Skapa gren" ++#: lib/transport.tcl:18 ++#, tcl-format ++msgid "remote prune %s" ++msgstr "fjärrborttagning %s" + - #: lib/branch_create.tcl:28 - msgid "Create New Branch" - msgstr "Skapa ny gren" ++#: lib/transport.tcl:19 ++#, tcl-format ++msgid "Pruning tracking branches deleted from %s" ++msgstr "Tar bort spårande grenar som tagits bort från %s" + - #: lib/branch_create.tcl:33 lib/choose_repository.tcl:389 - msgid "Create" - msgstr "Skapa" ++#: lib/transport.tcl:25 ++msgid "fetch all remotes" ++msgstr "hämta alla fjärrarkiv" + - #: lib/branch_create.tcl:42 - msgid "Branch Name" - msgstr "Namn på gren" ++#: lib/transport.tcl:26 ++msgid "Fetching new changes from all remotes" ++msgstr "Hämtar nya ändringar från alla fjärrarkiv" + - #: lib/branch_create.tcl:44 lib/remote_add.tcl:41 lib/tools_dlg.tcl:51 - msgid "Name:" - msgstr "Namn:" ++#: lib/transport.tcl:40 ++msgid "remote prune all remotes" ++msgstr "rensa alla fjärrarkiv" + - #: lib/branch_create.tcl:57 - msgid "Match Tracking Branch Name" - msgstr "Använd namn på spårad gren" ++#: lib/transport.tcl:41 ++msgid "Pruning tracking branches deleted from all remotes" ++msgstr "Rensar spårande grenar som tagits bort, från alla fjärrarkiv" + - #: lib/branch_create.tcl:66 - msgid "Starting Revision" - msgstr "Inledande revision" ++#: lib/transport.tcl:54 lib/transport.tcl:92 lib/transport.tcl:110 ++#: lib/remote_add.tcl:162 ++#, tcl-format ++msgid "push %s" ++msgstr "sänd %s" + - #: lib/branch_create.tcl:72 - msgid "Update Existing Branch:" - msgstr "Uppdatera befintlig gren:" ++#: lib/transport.tcl:55 ++#, tcl-format ++msgid "Pushing changes to %s" ++msgstr "Sänder ändringar till %s" + - #: lib/branch_create.tcl:75 - msgid "No" - msgstr "Nej" ++#: lib/transport.tcl:93 ++#, tcl-format ++msgid "Mirroring to %s" ++msgstr "Speglar till %s" + - #: lib/branch_create.tcl:80 - msgid "Fast Forward Only" - msgstr "Endast snabbspolning" ++#: lib/transport.tcl:111 ++#, tcl-format ++msgid "Pushing %s %s to %s" ++msgstr "Sänder %s %s till %s" + - #: lib/branch_create.tcl:85 lib/checkout_op.tcl:571 - msgid "Reset" - msgstr "Återställ" ++#: lib/transport.tcl:132 ++msgid "Push Branches" ++msgstr "Sänd grenar" + - #: lib/branch_create.tcl:97 - msgid "Checkout After Creation" - msgstr "Checka ut när skapad" ++#: lib/transport.tcl:147 ++msgid "Source Branches" ++msgstr "Källgrenar" + - #: lib/branch_create.tcl:132 - msgid "Please select a tracking branch." - msgstr "Välj en gren att spåra." ++#: lib/transport.tcl:162 ++msgid "Destination Repository" ++msgstr "Destinationsarkiv" + - #: lib/branch_create.tcl:141 - #, tcl-format - msgid "Tracking branch %s is not a branch in the remote repository." - msgstr "Den spårade grenen %s är inte en gren i fjärrarkivet." ++#: lib/transport.tcl:165 lib/remote_branch_delete.tcl:51 ++msgid "Remote:" ++msgstr "Fjärrarkiv:" + - #: lib/branch_create.tcl:154 lib/branch_rename.tcl:92 - msgid "Please supply a branch name." - msgstr "Ange ett namn för grenen." ++#: lib/transport.tcl:187 lib/remote_branch_delete.tcl:72 ++msgid "Arbitrary Location:" ++msgstr "Godtycklig plats:" + - #: lib/branch_create.tcl:165 lib/branch_rename.tcl:112 - #, tcl-format - msgid "'%s' is not an acceptable branch name." - msgstr "\"%s\" kan inte användas som namn på grenen." ++#: lib/transport.tcl:205 ++msgid "Transfer Options" ++msgstr "Överföringsalternativ" + - #: lib/branch_delete.tcl:16 - msgid "Delete Branch" - msgstr "Ta bort gren" ++#: lib/transport.tcl:207 ++msgid "Force overwrite existing branch (may discard changes)" ++msgstr "Tvinga överskrivning av befintlig gren (kan kasta bort ändringar)" + - #: lib/branch_delete.tcl:21 - msgid "Delete Local Branch" - msgstr "Ta bort lokal gren" ++#: lib/transport.tcl:211 ++msgid "Use thin pack (for slow network connections)" ++msgstr "Använd tunt paket (för långsamma nätverksanslutningar)" + - #: lib/branch_delete.tcl:39 - msgid "Local Branches" - msgstr "Lokala grenar" ++#: lib/transport.tcl:215 ++msgid "Include tags" ++msgstr "Ta med taggar" + - #: lib/branch_delete.tcl:51 - msgid "Delete Only If Merged Into" - msgstr "Ta bara bort om sammanslagen med" ++#: lib/remote_add.tcl:20 ++msgid "Add Remote" ++msgstr "Lägg till fjärrarkiv" + - #: lib/branch_delete.tcl:53 lib/remote_branch_delete.tcl:120 - msgid "Always (Do not perform merge checks)" - msgstr "Alltid (utför inte sammanslagningstest)" ++#: lib/remote_add.tcl:25 ++msgid "Add New Remote" ++msgstr "Lägg till nytt fjärrarkiv" + - #: lib/branch_delete.tcl:103 - #, tcl-format - msgid "The following branches are not completely merged into %s:" - msgstr "Följande grenar är inte till fullo sammanslagna med %s:" ++#: lib/remote_add.tcl:30 lib/tools_dlg.tcl:37 ++msgid "Add" ++msgstr "Lägg till" + - #: lib/branch_delete.tcl:115 lib/remote_branch_delete.tcl:218 - msgid "" - "Recovering deleted branches is difficult.\n" - "\n" - "Delete the selected branches?" - msgstr "" - "Det kan vara svårt att återställa borttagna grenar.\n" - "\n" - "Ta bort de valda grenarna?" ++#: lib/remote_add.tcl:39 ++msgid "Remote Details" ++msgstr "Detaljer för fjärrarkiv" + - #: lib/branch_delete.tcl:141 - #, tcl-format - msgid "" - "Failed to delete branches:\n" - "%s" - msgstr "" - "Kunde inte ta bort grenar:\n" - "%s" ++#: lib/remote_add.tcl:41 lib/tools_dlg.tcl:51 lib/branch_create.tcl:44 ++msgid "Name:" ++msgstr "Namn:" + - #: lib/branch_rename.tcl:15 lib/branch_rename.tcl:23 - msgid "Rename Branch" - msgstr "Byt namn på gren" ++#: lib/remote_add.tcl:50 ++msgid "Location:" ++msgstr "Plats:" + - #: lib/branch_rename.tcl:28 - msgid "Rename" - msgstr "Byt namn" ++#: lib/remote_add.tcl:60 ++msgid "Further Action" ++msgstr "Ytterligare åtgärd" + - #: lib/branch_rename.tcl:38 - msgid "Branch:" - msgstr "Gren:" ++#: lib/remote_add.tcl:63 ++msgid "Fetch Immediately" ++msgstr "Hämta omedelbart" + - #: lib/branch_rename.tcl:46 - msgid "New Name:" - msgstr "Nytt namn:" ++#: lib/remote_add.tcl:69 ++msgid "Initialize Remote Repository and Push" ++msgstr "Initiera fjärrarkiv och sänd till" + - #: lib/branch_rename.tcl:81 - msgid "Please select a branch to rename." - msgstr "Välj en gren att byta namn på." ++#: lib/remote_add.tcl:75 ++msgid "Do Nothing Else Now" ++msgstr "Gör ingent mer nu" ++ ++#: lib/remote_add.tcl:100 ++msgid "Please supply a remote name." ++msgstr "Ange ett namn för fjärrarkivet." + - #: lib/branch_rename.tcl:102 lib/checkout_op.tcl:202 ++#: lib/remote_add.tcl:113 +#, tcl-format - msgid "Branch '%s' already exists." - msgstr "Grenen \"%s\" finns redan." ++msgid "'%s' is not an acceptable remote name." ++msgstr "\"%s\" kan inte användas som namn på fjärrarkivet." + - #: lib/branch_rename.tcl:123 ++#: lib/remote_add.tcl:124 +#, tcl-format - msgid "Failed to rename '%s'." - msgstr "Kunde inte byta namn på \"%s\"." ++msgid "Failed to add remote '%s' of location '%s'." ++msgstr "Kunde inte lägga till fjärrarkivet \"%s\" på platsen \"%s\"." ++ ++#: lib/remote_add.tcl:133 ++#, tcl-format ++msgid "Fetching the %s" ++msgstr "Hämtar %s" ++ ++#: lib/remote_add.tcl:156 ++#, tcl-format ++msgid "Do not know how to initialize repository at location '%s'." ++msgstr "Vet inte hur arkivet på platsen \"%s\" skall initieras." ++ ++#: lib/remote_add.tcl:163 ++#, tcl-format ++msgid "Setting up the %s (at %s)" ++msgstr "Konfigurerar %s (på %s)" + +#: lib/browser.tcl:17 +msgid "Starting..." +msgstr "Startar..." + +#: lib/browser.tcl:27 +msgid "File Browser" +msgstr "Filbläddrare" + - #: lib/browser.tcl:126 lib/browser.tcl:143 ++#: lib/browser.tcl:132 lib/browser.tcl:149 +#, tcl-format +msgid "Loading %s..." +msgstr "Läser %s..." + - #: lib/browser.tcl:187 ++#: lib/browser.tcl:193 +msgid "[Up To Parent]" +msgstr "[Upp till förälder]" + - #: lib/browser.tcl:269 lib/browser.tcl:276 ++#: lib/browser.tcl:275 lib/browser.tcl:282 +msgid "Browse Branch Files" +msgstr "Bläddra filer på grenen" + - #: lib/browser.tcl:282 lib/choose_repository.tcl:404 - #: lib/choose_repository.tcl:491 lib/choose_repository.tcl:500 - #: lib/choose_repository.tcl:1027 ++#: lib/browser.tcl:288 lib/choose_repository.tcl:422 ++#: lib/choose_repository.tcl:509 lib/choose_repository.tcl:518 ++#: lib/choose_repository.tcl:1074 +msgid "Browse" +msgstr "Bläddra" + - #: lib/checkout_op.tcl:85 - #, tcl-format - msgid "Fetching %s from %s" - msgstr "Hämtar %s från %s" - - #: lib/checkout_op.tcl:133 - #, tcl-format - msgid "fatal: Cannot resolve %s" - msgstr "ödesdigert: Kunde inte slå upp %s" - - #: lib/checkout_op.tcl:146 lib/console.tcl:81 lib/database.tcl:30 - #: lib/sshkey.tcl:55 - msgid "Close" - msgstr "Stäng" - - #: lib/checkout_op.tcl:175 - #, tcl-format - msgid "Branch '%s' does not exist." - msgstr "Grenen \"%s\" finns inte." - - #: lib/checkout_op.tcl:194 - #, tcl-format - msgid "Failed to configure simplified git-pull for '%s'." - msgstr "Kunde inte konfigurera förenklad git-pull för '%s'." ++#: lib/browser.tcl:297 lib/branch_checkout.tcl:35 lib/tools_dlg.tcl:321 ++msgid "Revision" ++msgstr "Revision" + - #: lib/checkout_op.tcl:229 - #, tcl-format ++#: lib/merge.tcl:13 +msgid "" - "Branch '%s' already exists.\n" ++"Cannot merge while amending.\n" +"\n" - "It cannot fast-forward to %s.\n" - "A merge is required." ++"You must finish amending this commit before starting any type of merge.\n" +msgstr "" - "Grenen \"%s\" finns redan.\n" ++"Kan inte slå ihop vid utökning.\n" +"\n" - "Den kan inte snabbspolas till %s.\n" - "En sammanslagning krävs." - - #: lib/checkout_op.tcl:243 - #, tcl-format - msgid "Merge strategy '%s' not supported." - msgstr "Sammanslagningsstrategin \"%s\" stöds inte." - - #: lib/checkout_op.tcl:262 - #, tcl-format - msgid "Failed to update '%s'." - msgstr "Misslyckades med att uppdatera \"%s\"." - - #: lib/checkout_op.tcl:274 - msgid "Staging area (index) is already locked." - msgstr "Köområdet (index) är redan låst." ++"Du måste göra färdig utökningen av incheckningen innan du påbörjar någon " ++"slags sammanslagning.\n" + - #: lib/checkout_op.tcl:289 ++#: lib/merge.tcl:27 +msgid "" +"Last scanned state does not match repository state.\n" +"\n" +"Another Git program has modified this repository since the last scan. A " - "rescan must be performed before the current branch can be changed.\n" ++"rescan must be performed before a merge can be performed.\n" +"\n" +"The rescan will be automatically started now.\n" +msgstr "" +"Det senaste inlästa tillståndet motsvarar inte tillståndet i arkivet.\n" +"\n" +"Ett annat Git-program har ändrat arkivet sedan senaste avsökningen. Du måste " - "utföra en ny sökning innan den aktuella grenen kan ändras.\n" ++"utföra en ny sökning innan du kan utföra en sammanslagning.\n" +"\n" +"Sökningen kommer att startas automatiskt nu.\n" + - #: lib/checkout_op.tcl:345 - #, tcl-format - msgid "Updating working directory to '%s'..." - msgstr "Uppdaterar arbetskatalogen till \"%s\"..." - - #: lib/checkout_op.tcl:346 - msgid "files checked out" - msgstr "filer utcheckade" - - #: lib/checkout_op.tcl:376 - #, tcl-format - msgid "Aborted checkout of '%s' (file level merging is required)." - msgstr "Avbryter utcheckning av \"%s\" (sammanslagning på filnivå krävs)." - - #: lib/checkout_op.tcl:377 - msgid "File level merge required." - msgstr "Sammanslagning på filnivå krävs." - - #: lib/checkout_op.tcl:381 ++#: lib/merge.tcl:45 +#, tcl-format - msgid "Staying on branch '%s'." - msgstr "Stannar på grenen \"%s\"." - - #: lib/checkout_op.tcl:452 +msgid "" - "You are no longer on a local branch.\n" ++"You are in the middle of a conflicted merge.\n" +"\n" - "If you wanted to be on a branch, create one now starting from 'This Detached " - "Checkout'." - msgstr "" - "Du är inte längre på en lokal gren.\n" ++"File %s has merge conflicts.\n" +"\n" - "Om du ville vara på en gren skapar du en nu, baserad på \"Denna frånkopplade " - "utcheckning\"." - - #: lib/checkout_op.tcl:503 lib/checkout_op.tcl:507 - #, tcl-format - msgid "Checked out '%s'." - msgstr "Checkade ut \"%s\"." - - #: lib/checkout_op.tcl:535 - #, tcl-format - msgid "Resetting '%s' to '%s' will lose the following commits:" ++"You must resolve them, stage the file, and commit to complete the current " ++"merge. Only then can you begin another merge.\n" +msgstr "" - "Om du återställer \"%s\" till \"%s\" går följande incheckningar förlorade:" - - #: lib/checkout_op.tcl:557 - msgid "Recovering lost commits may not be easy." - msgstr "Det kanske inte är så enkelt att återskapa förlorade incheckningar." - - #: lib/checkout_op.tcl:562 - #, tcl-format - msgid "Reset '%s'?" - msgstr "Återställa \"%s\"?" - - #: lib/checkout_op.tcl:567 lib/merge.tcl:164 lib/tools_dlg.tcl:336 - msgid "Visualize" - msgstr "Visualisera" ++"Du är mitt i en sammanslagning med konflikter.\n" ++"\n" ++"Filen %s har sammanslagningskonflikter.\n" ++"\n" ++"Du måste lösa dem, köa filen och checka in för att fullborda den aktuella " ++"sammanslagningen. När du gjort det kan du påbörja en ny sammanslagning.\n" + - #: lib/checkout_op.tcl:635 ++#: lib/merge.tcl:55 +#, tcl-format +msgid "" - "Failed to set current branch.\n" ++"You are in the middle of a change.\n" +"\n" - "This working directory is only partially switched. We successfully updated " - "your files, but failed to update an internal Git file.\n" ++"File %s is modified.\n" +"\n" - "This should not have occurred. %s will now close and give up." ++"You should complete the current commit before starting a merge. Doing so " ++"will help you abort a failed merge, should the need arise.\n" +msgstr "" - "Kunde inte ställa in aktuell gren.\n" ++"Du är mitt i en ändring.\n" +"\n" - "Arbetskatalogen har bara växlats delvis. Vi uppdaterade filerna utan " - "problem, men kunde inte uppdatera en intern fil i Git.\n" ++"Filen %s har ändringar.\n" +"\n" - "Detta skulle inte ha hänt. %s kommer nu stängas och ge upp." ++"Du bör fullborda den aktuella incheckningen innan du påbörjar en " ++"sammanslagning. Om du gör det blir det enklare att avbryta en misslyckad " ++"sammanslagning, om det skulle vara nödvändigt.\n" + - #: lib/choose_font.tcl:41 - msgid "Select" - msgstr "Välj" ++#: lib/merge.tcl:108 ++#, tcl-format ++msgid "%s of %s" ++msgstr "%s av %s" + - #: lib/choose_font.tcl:55 - msgid "Font Family" - msgstr "Teckensnittsfamilj" ++#: lib/merge.tcl:122 ++#, tcl-format ++msgid "Merging %s and %s..." ++msgstr "Slår ihop %s och %s..." + - #: lib/choose_font.tcl:76 - msgid "Font Size" - msgstr "Storlek" ++#: lib/merge.tcl:133 ++msgid "Merge completed successfully." ++msgstr "Sammanslagningen avslutades framgångsrikt." + - #: lib/choose_font.tcl:93 - msgid "Font Example" - msgstr "Exempel" ++#: lib/merge.tcl:135 ++msgid "Merge failed. Conflict resolution is required." ++msgstr "Sammanslagningen misslyckades. Du måste lösa konflikterna." + - #: lib/choose_font.tcl:105 ++#: lib/merge.tcl:160 ++#, tcl-format ++msgid "Merge Into %s" ++msgstr "Slå ihop i %s" ++ ++#: lib/merge.tcl:179 ++msgid "Revision To Merge" ++msgstr "Revisioner att slå ihop" ++ ++#: lib/merge.tcl:214 +msgid "" - "This is example text.\n" - "If you like this text, it can be your font." ++"Cannot abort while amending.\n" ++"\n" ++"You must finish amending this commit.\n" +msgstr "" - "Detta är en exempeltext.\n" - "Om du tycker om den här texten kan den vara ditt teckensnitt." - - #: lib/choose_repository.tcl:28 - msgid "Git Gui" - msgstr "Git Gui" ++"Kan inte avbryta vid utökning.\n" ++"\n" ++"Du måste göra dig färdig med att utöka incheckningen.\n" + - #: lib/choose_repository.tcl:87 lib/choose_repository.tcl:394 - msgid "Create New Repository" - msgstr "Skapa nytt arkiv" ++#: lib/merge.tcl:224 ++msgid "" ++"Abort merge?\n" ++"\n" ++"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n" ++"\n" ++"Continue with aborting the current merge?" ++msgstr "" ++"Avbryt sammanslagning?\n" ++"\n" ++"Om du avbryter sammanslagningen kommer *ALLA* ej incheckade ändringar att gå " ++"förlorade.\n" ++"\n" ++"Gå vidare med att avbryta den aktuella sammanslagningen?" + - #: lib/choose_repository.tcl:93 - msgid "New..." - msgstr "Nytt..." ++#: lib/merge.tcl:230 ++msgid "" ++"Reset changes?\n" ++"\n" ++"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n" ++"\n" ++"Continue with resetting the current changes?" ++msgstr "" ++"Återställ ändringar?\n" ++"\n" ++"Om du återställer ändringarna kommer *ALLA* ej incheckade ändringar att gå " ++"förlorade.\n" ++"\n" ++"Gå vidare med att återställa de aktuella ändringarna?" + - #: lib/choose_repository.tcl:100 lib/choose_repository.tcl:478 - msgid "Clone Existing Repository" - msgstr "Klona befintligt arkiv" ++#: lib/merge.tcl:241 ++msgid "Aborting" ++msgstr "Avbryter" + - #: lib/choose_repository.tcl:111 - msgid "Clone..." - msgstr "Klona..." ++#: lib/merge.tcl:241 ++msgid "files reset" ++msgstr "filer återställda" + - #: lib/choose_repository.tcl:118 lib/choose_repository.tcl:1017 - msgid "Open Existing Repository" - msgstr "Öppna befintligt arkiv" ++#: lib/merge.tcl:269 ++msgid "Abort failed." ++msgstr "Misslyckades avbryta." + - #: lib/choose_repository.tcl:124 - msgid "Open..." - msgstr "Öppna..." ++#: lib/merge.tcl:271 ++msgid "Abort completed. Ready." ++msgstr "Avbrytning fullbordad. Redo." + - #: lib/choose_repository.tcl:137 - msgid "Recent Repositories" - msgstr "Senaste arkiven" ++#: lib/tools.tcl:75 ++#, tcl-format ++msgid "Running %s requires a selected file." ++msgstr "För att starta %s måste du välja en fil." + - #: lib/choose_repository.tcl:143 - msgid "Open Recent Repository:" - msgstr "Öppna tidigare arkiv:" ++#: lib/tools.tcl:91 ++#, tcl-format ++msgid "Are you sure you want to run %1$s on file \"%2$s\"?" ++msgstr "Är du säker på att du vill starta %1$s med filen \"%2$s\"?" + - #: lib/choose_repository.tcl:313 lib/choose_repository.tcl:320 - #: lib/choose_repository.tcl:327 ++#: lib/tools.tcl:95 +#, tcl-format - msgid "Failed to create repository %s:" - msgstr "Kunde inte skapa arkivet %s:" ++msgid "Are you sure you want to run %s?" ++msgstr "Är du säker på att du vill starta %s?" + - #: lib/choose_repository.tcl:399 - msgid "Directory:" - msgstr "Katalog:" ++#: lib/tools.tcl:116 ++#, tcl-format ++msgid "Tool: %s" ++msgstr "Verktyg: %s" + - #: lib/choose_repository.tcl:429 lib/choose_repository.tcl:550 - #: lib/choose_repository.tcl:1051 - msgid "Git Repository" - msgstr "Gitarkiv" ++#: lib/tools.tcl:117 ++#, tcl-format ++msgid "Running: %s" ++msgstr "Exekverar: %s" + - #: lib/choose_repository.tcl:454 ++#: lib/tools.tcl:155 +#, tcl-format - msgid "Directory %s already exists." - msgstr "Katalogen %s finns redan." ++msgid "Tool completed successfully: %s" ++msgstr "Verktyget avslutades framgångsrikt: %s" + - #: lib/choose_repository.tcl:458 ++#: lib/tools.tcl:157 +#, tcl-format - msgid "File %s already exists." - msgstr "Filen %s finns redan." ++msgid "Tool failed: %s" ++msgstr "Verktyget misslyckades: %s" + - #: lib/choose_repository.tcl:473 - msgid "Clone" - msgstr "Klona" ++#: lib/branch_checkout.tcl:16 lib/branch_checkout.tcl:21 ++msgid "Checkout Branch" ++msgstr "Checka ut gren" + - #: lib/choose_repository.tcl:486 - msgid "Source Location:" - msgstr "Plats för källkod:" ++#: lib/branch_checkout.tcl:26 ++msgid "Checkout" ++msgstr "Checka ut" + - #: lib/choose_repository.tcl:495 - msgid "Target Directory:" - msgstr "Målkatalog:" ++#: lib/branch_checkout.tcl:39 lib/option.tcl:310 lib/branch_create.tcl:69 ++msgid "Options" ++msgstr "Alternativ" + - #: lib/choose_repository.tcl:505 - msgid "Clone Type:" - msgstr "Typ av klon:" ++#: lib/branch_checkout.tcl:42 lib/branch_create.tcl:92 ++msgid "Fetch Tracking Branch" ++msgstr "Hämta spårande gren" + - #: lib/choose_repository.tcl:510 - msgid "Standard (Fast, Semi-Redundant, Hardlinks)" - msgstr "Standard (snabb, semiredundant, hårda länkar)" ++#: lib/branch_checkout.tcl:47 ++msgid "Detach From Local Branch" ++msgstr "Koppla bort från lokal gren" + - #: lib/choose_repository.tcl:515 - msgid "Full Copy (Slower, Redundant Backup)" - msgstr "Full kopia (långsammare, redundant säkerhetskopia)" ++#: lib/spellcheck.tcl:57 ++msgid "Unsupported spell checker" ++msgstr "Stavningskontrollprogrammet stöds inte" + - #: lib/choose_repository.tcl:520 - msgid "Shared (Fastest, Not Recommended, No Backup)" - msgstr "Delad (snabbast, rekommenderas ej, ingen säkerhetskopia)" ++#: lib/spellcheck.tcl:65 ++msgid "Spell checking is unavailable" ++msgstr "Stavningskontroll är ej tillgänglig" + - #: lib/choose_repository.tcl:556 lib/choose_repository.tcl:603 - #: lib/choose_repository.tcl:749 lib/choose_repository.tcl:819 - #: lib/choose_repository.tcl:1057 lib/choose_repository.tcl:1065 - #, tcl-format - msgid "Not a Git repository: %s" - msgstr "Inte ett Gitarkiv: %s" ++#: lib/spellcheck.tcl:68 ++msgid "Invalid spell checking configuration" ++msgstr "Ogiltig inställning för stavningskontroll" + - #: lib/choose_repository.tcl:592 - msgid "Standard only available for local repository." - msgstr "Standard är endast tillgängligt för lokala arkiv." ++#: lib/spellcheck.tcl:70 ++#, tcl-format ++msgid "Reverting dictionary to %s." ++msgstr "Återställer ordlistan till %s." + - #: lib/choose_repository.tcl:596 - msgid "Shared only available for local repository." - msgstr "Delat är endast tillgängligt för lokala arkiv." ++#: lib/spellcheck.tcl:73 ++msgid "Spell checker silently failed on startup" ++msgstr "Stavningskontroll misslyckades tyst vid start" + - #: lib/choose_repository.tcl:617 - #, tcl-format - msgid "Location %s already exists." - msgstr "Platsen %s finns redan." ++#: lib/spellcheck.tcl:80 ++msgid "Unrecognized spell checker" ++msgstr "Stavningskontrollprogrammet känns inte igen" + - #: lib/choose_repository.tcl:628 - msgid "Failed to configure origin" - msgstr "Kunde inte konfigurera ursprung" ++#: lib/spellcheck.tcl:186 ++msgid "No Suggestions" ++msgstr "Inga förslag" + - #: lib/choose_repository.tcl:640 - msgid "Counting objects" - msgstr "Räknar objekt" ++#: lib/spellcheck.tcl:388 ++msgid "Unexpected EOF from spell checker" ++msgstr "Oväntat filslut från stavningskontroll" + - #: lib/choose_repository.tcl:641 - msgid "buckets" - msgstr "hinkar" ++#: lib/spellcheck.tcl:392 ++msgid "Spell Checker Failed" ++msgstr "Stavningskontroll misslyckades" + - #: lib/choose_repository.tcl:665 ++#: lib/status_bar.tcl:87 +#, tcl-format - msgid "Unable to copy objects/info/alternates: %s" - msgstr "Kunde inte kopiera objekt/info/alternativ: %s" ++msgid "%s ... %*i of %*i %s (%3i%%)" ++msgstr "%s... %*i av %*i %s (%3i%%)" + - #: lib/choose_repository.tcl:701 ++#: lib/diff.tcl:77 +#, tcl-format - msgid "Nothing to clone from %s." - msgstr "Ingenting att klona från %s." - - #: lib/choose_repository.tcl:703 lib/choose_repository.tcl:917 - #: lib/choose_repository.tcl:929 - msgid "The 'master' branch has not been initialized." - msgstr "Grenen \"master\" har inte initierats." - - #: lib/choose_repository.tcl:716 - msgid "Hardlinks are unavailable. Falling back to copying." - msgstr "Hårda länkar är inte tillgängliga. Faller tillbaka på kopiering." ++msgid "" ++"No differences detected.\n" ++"\n" ++"%s has no changes.\n" ++"\n" ++"The modification date of this file was updated by another application, but " ++"the content within the file was not changed.\n" ++"\n" ++"A rescan will be automatically started to find other files which may have " ++"the same state." ++msgstr "" ++"Hittade inga skillnader.\n" ++"\n" ++"%s innehåller inga ändringar.\n" ++"\n" ++"Modifieringsdatum för filen uppdaterades av ett annat program, men " ++"innehållet i filen har inte ändrats.\n" ++"\n" ++"En sökning kommer automatiskt att startas för att hitta andra filer som kan " ++"vara i samma tillstånd." + - #: lib/choose_repository.tcl:728 ++#: lib/diff.tcl:117 +#, tcl-format - msgid "Cloning from %s" - msgstr "Klonar från %s" - - #: lib/choose_repository.tcl:759 - msgid "Copying objects" - msgstr "Kopierar objekt" ++msgid "Loading diff of %s..." ++msgstr "Läser differens för %s..." + - #: lib/choose_repository.tcl:760 - msgid "KiB" - msgstr "KiB" ++#: lib/diff.tcl:140 ++msgid "" ++"LOCAL: deleted\n" ++"REMOTE:\n" ++msgstr "" ++"LOKAL: borttagen\n" ++"FJÄRR:\n" + - #: lib/choose_repository.tcl:784 - #, tcl-format - msgid "Unable to copy object: %s" - msgstr "Kunde inte kopiera objekt: %s" ++#: lib/diff.tcl:145 ++msgid "" ++"REMOTE: deleted\n" ++"LOCAL:\n" ++msgstr "" ++"FJÄRR: borttagen\n" ++"LOKAL:\n" + - #: lib/choose_repository.tcl:794 - msgid "Linking objects" - msgstr "Länkar objekt" ++#: lib/diff.tcl:152 ++msgid "LOCAL:\n" ++msgstr "LOKAL:\n" + - #: lib/choose_repository.tcl:795 - msgid "objects" - msgstr "objekt" ++#: lib/diff.tcl:155 ++msgid "REMOTE:\n" ++msgstr "FJÄRR:\n" + - #: lib/choose_repository.tcl:803 ++#: lib/diff.tcl:217 lib/diff.tcl:355 +#, tcl-format - msgid "Unable to hardlink object: %s" - msgstr "Kunde inte hårdlänka objekt: %s" ++msgid "Unable to display %s" ++msgstr "Kan inte visa %s" + - #: lib/choose_repository.tcl:858 - msgid "Cannot fetch branches and objects. See console output for details." - msgstr "Kunde inte hämta grenar och objekt. Se konsolutdata för detaljer." ++#: lib/diff.tcl:218 ++msgid "Error loading file:" ++msgstr "Fel vid läsning av fil:" + - #: lib/choose_repository.tcl:869 - msgid "Cannot fetch tags. See console output for details." - msgstr "Kunde inte hämta taggar. Se konsolutdata för detaljer." ++#: lib/diff.tcl:225 ++msgid "Git Repository (subproject)" ++msgstr "Gitarkiv (underprojekt)" + - #: lib/choose_repository.tcl:893 - msgid "Cannot determine HEAD. See console output for details." - msgstr "Kunde inte avgöra HEAD. Se konsolutdata för detaljer." ++#: lib/diff.tcl:237 ++msgid "* Binary file (not showing content)." ++msgstr "* Binärfil (visar inte innehållet)." + - #: lib/choose_repository.tcl:902 ++#: lib/diff.tcl:242 +#, tcl-format - msgid "Unable to cleanup %s" - msgstr "Kunde inte städa upp %s" ++msgid "" ++"* Untracked file is %d bytes.\n" ++"* Showing only first %d bytes.\n" ++msgstr "" ++"* Den ospårade filen är %d byte.\n" ++"* Visar endast inledande %d byte.\n" + - #: lib/choose_repository.tcl:908 - msgid "Clone failed." - msgstr "Kloning misslyckades." ++#: lib/diff.tcl:248 ++#, tcl-format ++msgid "" ++"\n" ++"* Untracked file clipped here by %s.\n" ++"* To see the entire file, use an external editor.\n" ++msgstr "" ++"\n" ++"* Den ospårade filen klipptes här av %s.\n" ++"* För att se hela filen, använd ett externt redigeringsprogram.\n" + - #: lib/choose_repository.tcl:915 - msgid "No default branch obtained." - msgstr "Hämtade ingen standardgren." ++#: lib/diff.tcl:356 lib/blame.tcl:1128 ++msgid "Error loading diff:" ++msgstr "Fel vid inläsning av differens:" + - #: lib/choose_repository.tcl:926 - #, tcl-format - msgid "Cannot resolve %s as a commit." - msgstr "Kunde inte slå upp %s till någon incheckning." ++#: lib/diff.tcl:578 ++msgid "Failed to unstage selected hunk." ++msgstr "Kunde inte ta bort den valda delen från kön." + - #: lib/choose_repository.tcl:938 - msgid "Creating working directory" - msgstr "Skapar arbetskatalog" ++#: lib/diff.tcl:585 ++msgid "Failed to stage selected hunk." ++msgstr "Kunde inte lägga till den valda delen till kön." + - #: lib/choose_repository.tcl:939 lib/index.tcl:70 lib/index.tcl:133 - #: lib/index.tcl:201 - msgid "files" - msgstr "filer" ++#: lib/diff.tcl:664 ++msgid "Failed to unstage selected line." ++msgstr "Kunde inte ta bort den valda raden från kön." + - #: lib/choose_repository.tcl:968 - msgid "Initial file checkout failed." - msgstr "Inledande filutcheckning misslyckades." ++#: lib/diff.tcl:672 ++msgid "Failed to stage selected line." ++msgstr "Kunde inte lägga till den valda raden till kön." + - #: lib/choose_repository.tcl:1012 - msgid "Open" - msgstr "Öppna" ++#: lib/remote.tcl:200 ++msgid "Push to" ++msgstr "Sänd till" + - #: lib/choose_repository.tcl:1022 - msgid "Repository:" - msgstr "Arkiv:" ++#: lib/remote.tcl:218 ++msgid "Remove Remote" ++msgstr "Ta bort fjärrarkiv" + - #: lib/choose_repository.tcl:1071 - #, tcl-format - msgid "Failed to open repository %s:" - msgstr "Kunde inte öppna arkivet %s:" ++#: lib/remote.tcl:223 ++msgid "Prune from" ++msgstr "Ta bort från" + - #: lib/choose_rev.tcl:52 - msgid "This Detached Checkout" - msgstr "Denna frånkopplade utcheckning" ++#: lib/remote.tcl:228 ++msgid "Fetch from" ++msgstr "Hämta från" + - #: lib/choose_rev.tcl:60 - msgid "Revision Expression:" - msgstr "Revisionsuttryck:" ++#: lib/choose_font.tcl:41 ++msgid "Select" ++msgstr "Välj" + - #: lib/choose_rev.tcl:72 - msgid "Local Branch" - msgstr "Lokal gren" ++#: lib/choose_font.tcl:55 ++msgid "Font Family" ++msgstr "Teckensnittsfamilj" + - #: lib/choose_rev.tcl:77 - msgid "Tracking Branch" - msgstr "Spårande gren" ++#: lib/choose_font.tcl:76 ++msgid "Font Size" ++msgstr "Storlek" + - #: lib/choose_rev.tcl:82 lib/choose_rev.tcl:543 - msgid "Tag" - msgstr "Tagg" ++#: lib/choose_font.tcl:93 ++msgid "Font Example" ++msgstr "Exempel" + - #: lib/choose_rev.tcl:321 ++#: lib/choose_font.tcl:105 ++msgid "" ++"This is example text.\n" ++"If you like this text, it can be your font." ++msgstr "" ++"Detta är en exempeltext.\n" ++"Om du tycker om den här texten kan den vara ditt teckensnitt." ++ ++#: lib/option.tcl:11 +#, tcl-format - msgid "Invalid revision: %s" - msgstr "Ogiltig revision: %s" ++msgid "Invalid global encoding '%s'" ++msgstr "Den globala teckenkodningen \"%s\" är ogiltig" + - #: lib/choose_rev.tcl:342 - msgid "No revision selected." - msgstr "Ingen revision vald." ++#: lib/option.tcl:19 ++#, tcl-format ++msgid "Invalid repo encoding '%s'" ++msgstr "Arkivets teckenkodning \"%s\" är ogiltig" + - #: lib/choose_rev.tcl:350 - msgid "Revision expression is empty." - msgstr "Revisionsuttrycket är tomt." ++#: lib/option.tcl:119 ++msgid "Restore Defaults" ++msgstr "Återställ standardvärden" + - #: lib/choose_rev.tcl:536 - msgid "Updated" - msgstr "Uppdaterad" ++#: lib/option.tcl:123 ++msgid "Save" ++msgstr "Spara" + - #: lib/choose_rev.tcl:564 - msgid "URL" - msgstr "Webbadress" ++#: lib/option.tcl:133 ++#, tcl-format ++msgid "%s Repository" ++msgstr "Arkivet %s" + - #: lib/commit.tcl:9 - msgid "" - "There is nothing to amend.\n" - "\n" - "You are about to create the initial commit. There is no commit before this " - "to amend.\n" - msgstr "" - "Det finns ingenting att utöka.\n" - "\n" - "Du håller på att skapa den inledande incheckningen. Det finns ingen tidigare " - "incheckning att utöka.\n" ++#: lib/option.tcl:134 ++msgid "Global (All Repositories)" ++msgstr "Globalt (alla arkiv)" + - #: lib/commit.tcl:18 - msgid "" - "Cannot amend while merging.\n" - "\n" - "You are currently in the middle of a merge that has not been fully " - "completed. You cannot amend the prior commit unless you first abort the " - "current merge activity.\n" - msgstr "" - "Kan inte utöka vid sammanslagning.\n" - "\n" - "Du är i mitten av en sammanslagning som inte är fullbordad. Du kan inte " - "utöka tidigare incheckningar om du inte först avbryter den pågående " - "sammanslagningen.\n" ++#: lib/option.tcl:140 ++msgid "User Name" ++msgstr "Användarnamn" + - #: lib/commit.tcl:48 - msgid "Error loading commit data for amend:" - msgstr "Fel vid inläsning av incheckningsdata för utökning:" ++#: lib/option.tcl:141 ++msgid "Email Address" ++msgstr "E-postadress" + - #: lib/commit.tcl:75 - msgid "Unable to obtain your identity:" - msgstr "Kunde inte hämta din identitet:" ++#: lib/option.tcl:143 ++msgid "Summarize Merge Commits" ++msgstr "Summera sammanslagningsincheckningar" + - #: lib/commit.tcl:80 - msgid "Invalid GIT_COMMITTER_IDENT:" - msgstr "Felaktig GIT_COMMITTER_IDENT:" ++#: lib/option.tcl:144 ++msgid "Merge Verbosity" ++msgstr "Pratsamhet för sammanslagningar" + - #: lib/commit.tcl:129 - #, tcl-format - msgid "warning: Tcl does not support encoding '%s'." - msgstr "varning: Tcl stöder inte teckenkodningen \"%s\"." ++#: lib/option.tcl:145 ++msgid "Show Diffstat After Merge" ++msgstr "Visa diffstatistik efter sammanslagning" + - #: lib/commit.tcl:149 - msgid "" - "Last scanned state does not match repository state.\n" - "\n" - "Another Git program has modified this repository since the last scan. A " - "rescan must be performed before another commit can be created.\n" - "\n" - "The rescan will be automatically started now.\n" - msgstr "" - "Det senaste inlästa tillståndet motsvarar inte tillståndet i arkivet.\n" - "\n" - "Ett annat Git-program har ändrat arkivet sedan senaste avsökningen. Du måste " - "utföra en ny sökning innan du kan göra en ny incheckning.\n" - "\n" - "Sökningen kommer att startas automatiskt nu.\n" - - #: lib/commit.tcl:172 - #, tcl-format - msgid "" - "Unmerged files cannot be committed.\n" - "\n" - "File %s has merge conflicts. You must resolve them and stage the file " - "before committing.\n" - msgstr "" - "Osammanslagna filer kan inte checkas in.\n" - "\n" - "Filen %s har sammanslagningskonflikter. Du måste lösa dem och köa filen " - "innan du checkar in den.\n" - - #: lib/commit.tcl:180 - #, tcl-format - msgid "" - "Unknown file state %s detected.\n" - "\n" - "File %s cannot be committed by this program.\n" - msgstr "" - "Okänd filstatus %s upptäckt.\n" - "\n" - "Filen %s kan inte checkas in av programmet.\n" ++#: lib/option.tcl:146 ++msgid "Use Merge Tool" ++msgstr "Använd verktyg för sammanslagning" + - #: lib/commit.tcl:188 - msgid "" - "No changes to commit.\n" - "\n" - "You must stage at least 1 file before you can commit.\n" - msgstr "" - "Inga ändringar att checka in.\n" - "\n" - "Du måste köa åtminstone en fil innan du kan checka in.\n" ++#: lib/option.tcl:148 ++msgid "Trust File Modification Timestamps" ++msgstr "Lita på filändringstidsstämplar" + - #: lib/commit.tcl:203 - msgid "" - "Please supply a commit message.\n" - "\n" - "A good commit message has the following format:\n" - "\n" - "- First line: Describe in one sentence what you did.\n" - "- Second line: Blank\n" - "- Remaining lines: Describe why this change is good.\n" - msgstr "" - "Ange ett incheckningsmeddelande.\n" - "\n" - "Ett bra incheckningsmeddelande har följande format:\n" - "\n" - "- Första raden: Beskriv i en mening vad du gjorde.\n" - "- Andra raden: Tom\n" - "- Följande rader: Beskriv varför det här är en bra ändring.\n" ++#: lib/option.tcl:149 ++msgid "Prune Tracking Branches During Fetch" ++msgstr "Städa spårade grenar vid hämtning" + - #: lib/commit.tcl:234 - msgid "Calling pre-commit hook..." - msgstr "Anropar kroken före incheckning (pre-commit)..." ++#: lib/option.tcl:150 ++msgid "Match Tracking Branches" ++msgstr "Matcha spårade grenar" + - #: lib/commit.tcl:249 - msgid "Commit declined by pre-commit hook." - msgstr "Incheckningen avvisades av kroken före incheckning (pre-commit)." ++#: lib/option.tcl:151 ++msgid "Use Textconv For Diffs and Blames" ++msgstr "Använd Textconv för diff och klandring" + - #: lib/commit.tcl:272 - msgid "Calling commit-msg hook..." - msgstr "Anropar kroken för incheckningsmeddelande (commit-msg)..." ++#: lib/option.tcl:152 ++msgid "Blame Copy Only On Changed Files" ++msgstr "Klandra kopiering bara i ändrade filer" + - #: lib/commit.tcl:287 - msgid "Commit declined by commit-msg hook." - msgstr "Incheckning avvisad av kroken för incheckningsmeddelande (commit-msg)." ++#: lib/option.tcl:153 ++msgid "Maximum Length of Recent Repositories List" ++msgstr "Max längd för lista över tidigare arkiv" + - #: lib/commit.tcl:300 - msgid "Committing changes..." - msgstr "Checkar in ändringar..." ++#: lib/option.tcl:154 ++msgid "Minimum Letters To Blame Copy On" ++msgstr "Minsta antal tecken att klandra kopiering för" + - #: lib/commit.tcl:316 - msgid "write-tree failed:" - msgstr "write-tree misslyckades:" ++#: lib/option.tcl:155 ++msgid "Blame History Context Radius (days)" ++msgstr "Historikradie för klandring (dagar)" + - #: lib/commit.tcl:317 lib/commit.tcl:361 lib/commit.tcl:382 - msgid "Commit failed." - msgstr "Incheckningen misslyckades." ++#: lib/option.tcl:156 ++msgid "Number of Diff Context Lines" ++msgstr "Antal rader sammanhang i differenser" + - #: lib/commit.tcl:334 - #, tcl-format - msgid "Commit %s appears to be corrupt" - msgstr "Incheckningen %s verkar vara trasig" ++#: lib/option.tcl:157 ++msgid "Additional Diff Parameters" ++msgstr "Ytterligare diff-parametrar" + - #: lib/commit.tcl:339 - msgid "" - "No changes to commit.\n" - "\n" - "No files were modified by this commit and it was not a merge commit.\n" - "\n" - "A rescan will be automatically started now.\n" - msgstr "" - "Inga ändringar att checka in.\n" - "\n" - "Inga filer ändrades av incheckningen och det var inte en sammanslagning.\n" - "\n" - "En sökning kommer att startas automatiskt nu.\n" ++#: lib/option.tcl:158 ++msgid "Commit Message Text Width" ++msgstr "Textbredd för incheckningsmeddelande" + - #: lib/commit.tcl:346 - msgid "No changes to commit." - msgstr "Inga ändringar att checka in." ++#: lib/option.tcl:159 ++msgid "New Branch Name Template" ++msgstr "Mall för namn på nya grenar" + - #: lib/commit.tcl:360 - msgid "commit-tree failed:" - msgstr "commit-tree misslyckades:" ++#: lib/option.tcl:160 ++msgid "Default File Contents Encoding" ++msgstr "Standardteckenkodning för filinnehåll" + - #: lib/commit.tcl:381 - msgid "update-ref failed:" - msgstr "update-ref misslyckades:" ++#: lib/option.tcl:161 ++msgid "Warn before committing to a detached head" ++msgstr "Varna för incheckning på frånkopplat huvud" + - #: lib/commit.tcl:469 - #, tcl-format - msgid "Created commit %s: %s" - msgstr "Skapade incheckningen %s: %s" ++#: lib/option.tcl:162 ++msgid "Staging of untracked files" ++msgstr "Köa ospårade filer" + - #: lib/console.tcl:59 - msgid "Working... please wait..." - msgstr "Arbetar... vänta..." ++#: lib/option.tcl:163 ++msgid "Show untracked files" ++msgstr "Visa ospårade filer" + - #: lib/console.tcl:186 - msgid "Success" - msgstr "Lyckades" ++#: lib/option.tcl:164 ++msgid "Tab spacing" ++msgstr "Blanksteg för tabulatortecken" + - #: lib/console.tcl:200 - msgid "Error: Command Failed" - msgstr "Fel: Kommando misslyckades" ++#: lib/option.tcl:210 ++msgid "Change" ++msgstr "Ändra" + - #: lib/database.tcl:42 - msgid "Number of loose objects" - msgstr "Antal lösa objekt" ++#: lib/option.tcl:254 ++msgid "Spelling Dictionary:" ++msgstr "Stavningsordlista:" + - #: lib/database.tcl:43 - msgid "Disk space used by loose objects" - msgstr "Diskutrymme använt av lösa objekt" ++#: lib/option.tcl:284 ++msgid "Change Font" ++msgstr "Byt teckensnitt" + - #: lib/database.tcl:44 - msgid "Number of packed objects" - msgstr "Antal packade objekt" ++#: lib/option.tcl:288 ++#, tcl-format ++msgid "Choose %s" ++msgstr "Välj %s" + - #: lib/database.tcl:45 - msgid "Number of packs" - msgstr "Antal paket" ++#: lib/option.tcl:294 ++msgid "pt." ++msgstr "p." + - #: lib/database.tcl:46 - msgid "Disk space used by packed objects" - msgstr "Diskutrymme använt av packade objekt" ++#: lib/option.tcl:308 ++msgid "Preferences" ++msgstr "Inställningar" + - #: lib/database.tcl:47 - msgid "Packed objects waiting for pruning" - msgstr "Packade objekt som väntar på städning" ++#: lib/option.tcl:345 ++msgid "Failed to completely save options:" ++msgstr "Misslyckades med att helt spara alternativ:" + - #: lib/database.tcl:48 - msgid "Garbage files" - msgstr "Skräpfiler" ++#: lib/mergetool.tcl:8 ++msgid "Force resolution to the base version?" ++msgstr "Tvinga lösning att använda basversionen?" + - #: lib/database.tcl:72 - msgid "Compressing the object database" - msgstr "Komprimerar objektdatabasen" ++#: lib/mergetool.tcl:9 ++msgid "Force resolution to this branch?" ++msgstr "Tvinga lösning att använda den aktuella grenen?" + - #: lib/database.tcl:83 - msgid "Verifying the object database with fsck-objects" - msgstr "Verifierar objektdatabasen med fsck-objects" ++#: lib/mergetool.tcl:10 ++msgid "Force resolution to the other branch?" ++msgstr "Tvinga lösning att använda den andra grenen?" + - #: lib/database.tcl:107 ++#: lib/mergetool.tcl:14 +#, tcl-format +msgid "" - "This repository currently has approximately %i loose objects.\n" ++"Note that the diff shows only conflicting changes.\n" +"\n" - "To maintain optimal performance it is strongly recommended that you compress " - "the database.\n" ++"%s will be overwritten.\n" +"\n" - "Compress the database now?" ++"This operation can be undone only by restarting the merge." +msgstr "" - "Arkivet har för närvarande omkring %i lösa objekt.\n" ++"Observera att diffen endast visar de ändringar som står i konflikt.\n" +"\n" - "För att bibehålla optimal prestanda rekommenderas det å det bestämdaste att " - "du komprimerar databasen.\n" ++"%s kommer att skrivas över.\n" +"\n" - "Komprimera databasen nu?" ++"Du måste starta om sammanslagningen för att göra den här operationen ogjord." + - #: lib/date.tcl:25 ++#: lib/mergetool.tcl:45 +#, tcl-format - msgid "Invalid date from Git: %s" - msgstr "Ogiltigt datum från Git: %s" ++msgid "File %s seems to have unresolved conflicts, still stage?" ++msgstr "Filen %s verkar innehålla olösta konflikter. Vill du köa ändå?" + - #: lib/diff.tcl:64 ++#: lib/mergetool.tcl:60 +#, tcl-format - msgid "" - "No differences detected.\n" - "\n" - "%s has no changes.\n" - "\n" - "The modification date of this file was updated by another application, but " - "the content within the file was not changed.\n" - "\n" - "A rescan will be automatically started to find other files which may have " - "the same state." - msgstr "" - "Hittade inga skillnader.\n" - "\n" - "%s innehåller inga ändringar.\n" - "\n" - "Modifieringsdatum för filen uppdaterades av ett annat program, men " - "innehållet i filen har inte ändrats.\n" - "\n" - "En sökning kommer automatiskt att startas för att hitta andra filer som kan " - "vara i samma tillstånd." ++msgid "Adding resolution for %s" ++msgstr "Lägger till lösning för %s" ++ ++#: lib/mergetool.tcl:141 ++msgid "Cannot resolve deletion or link conflicts using a tool" ++msgstr "Kan inte lösa borttagnings- eller länkkonflikter med ett verktyg" ++ ++#: lib/mergetool.tcl:146 ++msgid "Conflict file does not exist" ++msgstr "Konfliktfil existerar inte" + - #: lib/diff.tcl:104 ++#: lib/mergetool.tcl:246 +#, tcl-format - msgid "Loading diff of %s..." - msgstr "Läser differens för %s..." ++msgid "Not a GUI merge tool: '%s'" ++msgstr "Inte ett grafiskt verktyg för sammanslagning: %s" + - #: lib/diff.tcl:125 - msgid "" - "LOCAL: deleted\n" - "REMOTE:\n" - msgstr "" - "LOKAL: borttagen\n" - "FJÄRR:\n" ++#: lib/mergetool.tcl:275 ++#, tcl-format ++msgid "Unsupported merge tool '%s'" ++msgstr "Verktyget \"%s\" för sammanslagning stöds inte" + - #: lib/diff.tcl:130 ++#: lib/mergetool.tcl:310 ++msgid "Merge tool is already running, terminate it?" ++msgstr "Verktyget för sammanslagning körs redan. Vill du avsluta det?" ++ ++#: lib/mergetool.tcl:330 ++#, tcl-format +msgid "" - "REMOTE: deleted\n" - "LOCAL:\n" - msgstr "" - "FJÄRR: borttagen\n" - "LOKAL:\n" - - #: lib/diff.tcl:137 - msgid "LOCAL:\n" - msgstr "LOKAL:\n" - - #: lib/diff.tcl:140 - msgid "REMOTE:\n" - msgstr "FJÄRR:\n" - - #: lib/diff.tcl:202 lib/diff.tcl:322 - #, tcl-format - msgid "Unable to display %s" - msgstr "Kan inte visa %s" - - #: lib/diff.tcl:203 - msgid "Error loading file:" - msgstr "Fel vid läsning av fil:" - - #: lib/diff.tcl:210 - msgid "Git Repository (subproject)" - msgstr "Gitarkiv (underprojekt)" - - #: lib/diff.tcl:222 - msgid "* Binary file (not showing content)." - msgstr "* Binärfil (visar inte innehållet)." - - #: lib/diff.tcl:227 - #, tcl-format - msgid "" - "* Untracked file is %d bytes.\n" - "* Showing only first %d bytes.\n" ++"Error retrieving versions:\n" ++"%s" +msgstr "" - "* Den ospårade filen är %d byte.\n" - "* Visar endast inledande %d byte.\n" ++"Fel vid hämtning av versioner:\n" ++"%s" + - #: lib/diff.tcl:233 ++#: lib/mergetool.tcl:350 +#, tcl-format +msgid "" ++"Could not start the merge tool:\n" +"\n" - "* Untracked file clipped here by %s.\n" - "* To see the entire file, use an external editor.\n" ++"%s" +msgstr "" ++"Kunde inte starta verktyg för sammanslagning:\n" +"\n" - "* Den ospårade filen klipptes här av %s.\n" - "* För att se hela filen, använd ett externt redigeringsprogram.\n" - - #: lib/diff.tcl:485 - msgid "Failed to unstage selected hunk." - msgstr "Kunde inte ta bort den valda delen från kön." - - #: lib/diff.tcl:492 - msgid "Failed to stage selected hunk." - msgstr "Kunde inte lägga till den valda delen till kön." - - #: lib/diff.tcl:571 - msgid "Failed to unstage selected line." - msgstr "Kunde inte ta bort den valda raden från kön." - - #: lib/diff.tcl:579 - msgid "Failed to stage selected line." - msgstr "Kunde inte lägga till den valda raden till kön." - - #: lib/encoding.tcl:443 - msgid "Default" - msgstr "Standard" ++"%s" + - #: lib/encoding.tcl:448 - #, tcl-format - msgid "System (%s)" - msgstr "Systemets (%s)" ++#: lib/mergetool.tcl:354 ++msgid "Running merge tool..." ++msgstr "Kör verktyg för sammanslagning..." + - #: lib/encoding.tcl:459 lib/encoding.tcl:465 - msgid "Other" - msgstr "Annan" ++#: lib/mergetool.tcl:382 lib/mergetool.tcl:390 ++msgid "Merge tool failed." ++msgstr "Verktyget för sammanslagning misslyckades." + - #: lib/error.tcl:20 lib/error.tcl:116 - msgid "error" - msgstr "fel" ++#: lib/tools_dlg.tcl:22 ++msgid "Add Tool" ++msgstr "Lägg till verktyg" + - #: lib/error.tcl:36 - msgid "warning" - msgstr "varning" ++#: lib/tools_dlg.tcl:28 ++msgid "Add New Tool Command" ++msgstr "Lägg till nytt verktygskommando" + - #: lib/error.tcl:96 - msgid "You must correct the above errors before committing." - msgstr "Du måste rätta till felen ovan innan du checkar in." ++#: lib/tools_dlg.tcl:34 ++msgid "Add globally" ++msgstr "Lägg till globalt" + - #: lib/index.tcl:6 - msgid "Unable to unlock the index." - msgstr "Kunde inte låsa upp indexet." ++#: lib/tools_dlg.tcl:46 ++msgid "Tool Details" ++msgstr "Detaljer för verktyg" + - #: lib/index.tcl:17 - msgid "Index Error" - msgstr "Indexfel" ++#: lib/tools_dlg.tcl:49 ++msgid "Use '/' separators to create a submenu tree:" ++msgstr "Använd \"/\"-avdelare för att skapa ett undermenyträd:" + - #: lib/index.tcl:19 - msgid "" - "Updating the Git index failed. A rescan will be automatically started to " - "resynchronize git-gui." - msgstr "" - "Misslyckades med att uppdatera Gitindexet. En omsökning kommer att startas " - "automatiskt för att synkronisera om git-gui." ++#: lib/tools_dlg.tcl:60 ++msgid "Command:" ++msgstr "Kommando:" + - #: lib/index.tcl:30 - msgid "Continue" - msgstr "Fortsätt" ++#: lib/tools_dlg.tcl:71 ++msgid "Show a dialog before running" ++msgstr "Visa dialog innan programmet startas" + - #: lib/index.tcl:33 - msgid "Unlock Index" - msgstr "Lås upp index" ++#: lib/tools_dlg.tcl:77 ++msgid "Ask the user to select a revision (sets $REVISION)" ++msgstr "Be användaren välja en version (sätter $REVISION)" + - #: lib/index.tcl:292 - #, tcl-format - msgid "Unstaging %s from commit" - msgstr "Tar bort %s för incheckningskön" ++#: lib/tools_dlg.tcl:82 ++msgid "Ask the user for additional arguments (sets $ARGS)" ++msgstr "Be användaren om ytterligare parametrar (sätter $ARGS)" + - #: lib/index.tcl:331 - msgid "Ready to commit." - msgstr "Redo att checka in." ++#: lib/tools_dlg.tcl:89 ++msgid "Don't show the command output window" ++msgstr "Visa inte kommandots utdatafönster" + - #: lib/index.tcl:344 - #, tcl-format - msgid "Adding %s" - msgstr "Lägger till %s" ++#: lib/tools_dlg.tcl:94 ++msgid "Run only if a diff is selected ($FILENAME not empty)" ++msgstr "Kör endast om en diff har markerats ($FILENAME är inte tomt)" + - #: lib/index.tcl:401 - #, tcl-format - msgid "Revert changes in file %s?" - msgstr "Återställ ändringarna i filen %s?" ++#: lib/tools_dlg.tcl:118 ++msgid "Please supply a name for the tool." ++msgstr "Ange ett namn för verktyget." + - #: lib/index.tcl:403 ++#: lib/tools_dlg.tcl:126 +#, tcl-format - msgid "Revert changes in these %i files?" - msgstr "Återställ ändringarna i dessa %i filer?" - - #: lib/index.tcl:411 - msgid "Any unstaged changes will be permanently lost by the revert." - msgstr "" - "Alla oköade ändringar kommer permanent gå förlorade vid återställningen." - - #: lib/index.tcl:414 - msgid "Do Nothing" - msgstr "Gör ingenting" - - #: lib/index.tcl:432 - msgid "Reverting selected files" - msgstr "Återställer valda filer" ++msgid "Tool '%s' already exists." ++msgstr "Verktyget \"%s\" finns redan." + - #: lib/index.tcl:436 ++#: lib/tools_dlg.tcl:148 +#, tcl-format - msgid "Reverting %s" - msgstr "Återställer %s" - - #: lib/merge.tcl:13 +msgid "" - "Cannot merge while amending.\n" - "\n" - "You must finish amending this commit before starting any type of merge.\n" ++"Could not add tool:\n" ++"%s" +msgstr "" - "Kan inte slå ihop vid utökning.\n" - "\n" - "Du måste göra färdig utökningen av incheckningen innan du påbörjar någon " - "slags sammanslagning.\n" ++"Kunde inte lägga till verktyget:\n" ++"%s" + - #: lib/merge.tcl:27 - msgid "" - "Last scanned state does not match repository state.\n" - "\n" - "Another Git program has modified this repository since the last scan. A " - "rescan must be performed before a merge can be performed.\n" - "\n" - "The rescan will be automatically started now.\n" - msgstr "" - "Det senaste inlästa tillståndet motsvarar inte tillståndet i arkivet.\n" - "\n" - "Ett annat Git-program har ändrat arkivet sedan senaste avsökningen. Du måste " - "utföra en ny sökning innan du kan utföra en sammanslagning.\n" - "\n" - "Sökningen kommer att startas automatiskt nu.\n" ++#: lib/tools_dlg.tcl:187 ++msgid "Remove Tool" ++msgstr "Ta bort verktyg" + - #: lib/merge.tcl:45 - #, tcl-format - msgid "" - "You are in the middle of a conflicted merge.\n" - "\n" - "File %s has merge conflicts.\n" - "\n" - "You must resolve them, stage the file, and commit to complete the current " - "merge. Only then can you begin another merge.\n" - msgstr "" - "Du är mitt i en sammanslagning med konflikter.\n" - "\n" - "Filen %s har sammanslagningskonflikter.\n" - "\n" - "Du måste lösa dem, köa filen och checka in för att fullborda den aktuella " - "sammanslagningen. När du gjort det kan du påbörja en ny sammanslagning.\n" ++#: lib/tools_dlg.tcl:193 ++msgid "Remove Tool Commands" ++msgstr "Ta bort verktygskommandon" + - #: lib/merge.tcl:55 - #, tcl-format - msgid "" - "You are in the middle of a change.\n" - "\n" - "File %s is modified.\n" - "\n" - "You should complete the current commit before starting a merge. Doing so " - "will help you abort a failed merge, should the need arise.\n" - msgstr "" - "Du är mitt i en ändring.\n" - "\n" - "Filen %s har ändringar.\n" - "\n" - "Du bör fullborda den aktuella incheckningen innan du påbörjar en " - "sammanslagning. Om du gör det blir det enklare att avbryta en misslyckad " - "sammanslagning, om det skulle vara nödvändigt.\n" ++#: lib/tools_dlg.tcl:198 ++msgid "Remove" ++msgstr "Ta bort" + - #: lib/merge.tcl:107 - #, tcl-format - msgid "%s of %s" - msgstr "%s av %s" ++#: lib/tools_dlg.tcl:231 ++msgid "(Blue denotes repository-local tools)" ++msgstr "(Blått anger verktyg lokala för arkivet)" + - #: lib/merge.tcl:120 ++#: lib/tools_dlg.tcl:292 +#, tcl-format - msgid "Merging %s and %s..." - msgstr "Slår ihop %s och %s..." - - #: lib/merge.tcl:131 - msgid "Merge completed successfully." - msgstr "Sammanslagningen avslutades framgångsrikt." - - #: lib/merge.tcl:133 - msgid "Merge failed. Conflict resolution is required." - msgstr "Sammanslagningen misslyckades. Du måste lösa konflikterna." ++msgid "Run Command: %s" ++msgstr "Kör kommandot: %s" + - #: lib/merge.tcl:158 - #, tcl-format - msgid "Merge Into %s" - msgstr "Slå ihop i %s" ++#: lib/tools_dlg.tcl:306 ++msgid "Arguments" ++msgstr "Argument" + - #: lib/merge.tcl:177 - msgid "Revision To Merge" - msgstr "Revisioner att slå ihop" ++#: lib/tools_dlg.tcl:341 ++msgid "OK" ++msgstr "OK" + - #: lib/merge.tcl:212 - msgid "" - "Cannot abort while amending.\n" - "\n" - "You must finish amending this commit.\n" - msgstr "" - "Kan inte avbryta vid utökning.\n" - "\n" - "Du måste göra dig färdig med att utöka incheckningen.\n" ++#: lib/search.tcl:48 ++msgid "Find:" ++msgstr "Sök:" + - #: lib/merge.tcl:222 - msgid "" - "Abort merge?\n" - "\n" - "Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n" - "\n" - "Continue with aborting the current merge?" - msgstr "" - "Avbryt sammanslagning?\n" - "\n" - "Om du avbryter sammanslagningen kommer *ALLA* ej incheckade ändringar att gå " - "förlorade.\n" - "\n" - "Gå vidare med att avbryta den aktuella sammanslagningen?" ++#: lib/search.tcl:50 ++msgid "Next" ++msgstr "Nästa" + - #: lib/merge.tcl:228 - msgid "" - "Reset changes?\n" - "\n" - "Resetting the changes will cause *ALL* uncommitted changes to be lost.\n" - "\n" - "Continue with resetting the current changes?" - msgstr "" - "Återställ ändringar?\n" - "\n" - "Om du återställer ändringarna kommer *ALLA* ej incheckade ändringar att gå " - "förlorade.\n" - "\n" - "Gå vidare med att återställa de aktuella ändringarna?" ++#: lib/search.tcl:51 ++msgid "Prev" ++msgstr "Föreg" + - #: lib/merge.tcl:239 - msgid "Aborting" - msgstr "Avbryter" ++#: lib/search.tcl:52 ++msgid "RegExp" ++msgstr "Reg.uttr." + - #: lib/merge.tcl:239 - msgid "files reset" - msgstr "filer återställda" ++#: lib/search.tcl:54 ++msgid "Case" ++msgstr "Skiftläge" + - #: lib/merge.tcl:267 - msgid "Abort failed." - msgstr "Misslyckades avbryta." ++#: lib/branch_rename.tcl:15 lib/branch_rename.tcl:23 ++msgid "Rename Branch" ++msgstr "Byt namn på gren" + - #: lib/merge.tcl:269 - msgid "Abort completed. Ready." - msgstr "Avbrytning fullbordad. Redo." ++#: lib/branch_rename.tcl:28 ++msgid "Rename" ++msgstr "Byt namn" + - #: lib/mergetool.tcl:8 - msgid "Force resolution to the base version?" - msgstr "Tvinga lösning att använda basversionen?" ++#: lib/branch_rename.tcl:38 ++msgid "Branch:" ++msgstr "Gren:" + - #: lib/mergetool.tcl:9 - msgid "Force resolution to this branch?" - msgstr "Tvinga lösning att använda den aktuella grenen?" ++#: lib/branch_rename.tcl:46 ++msgid "New Name:" ++msgstr "Nytt namn:" + - #: lib/mergetool.tcl:10 - msgid "Force resolution to the other branch?" - msgstr "Tvinga lösning att använda den andra grenen?" ++#: lib/branch_rename.tcl:81 ++msgid "Please select a branch to rename." ++msgstr "Välj en gren att byta namn på." + - #: lib/mergetool.tcl:14 - #, tcl-format - msgid "" - "Note that the diff shows only conflicting changes.\n" - "\n" - "%s will be overwritten.\n" - "\n" - "This operation can be undone only by restarting the merge." - msgstr "" - "Observera att diffen endast visar de ändringar som står i konflikt.\n" - "\n" - "%s kommer att skrivas över.\n" - "\n" - "Du måste starta om sammanslagningen för att göra den här operationen ogjord." ++#: lib/branch_rename.tcl:92 lib/branch_create.tcl:154 ++msgid "Please supply a branch name." ++msgstr "Ange ett namn för grenen." + - #: lib/mergetool.tcl:45 ++#: lib/branch_rename.tcl:112 lib/branch_create.tcl:165 +#, tcl-format - msgid "File %s seems to have unresolved conflicts, still stage?" - msgstr "Filen %s verkar innehålla olösta konflikter. Vill du köa ändå?" ++msgid "'%s' is not an acceptable branch name." ++msgstr "\"%s\" kan inte användas som namn på grenen." + - #: lib/mergetool.tcl:60 ++#: lib/branch_rename.tcl:123 +#, tcl-format - msgid "Adding resolution for %s" - msgstr "Lägger till lösning för %s" ++msgid "Failed to rename '%s'." ++msgstr "Kunde inte byta namn på \"%s\"." + - #: lib/mergetool.tcl:141 - msgid "Cannot resolve deletion or link conflicts using a tool" - msgstr "Kan inte lösa borttagnings- eller länkkonflikter med ett verktyg" ++#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 ++msgid "Delete Branch Remotely" ++msgstr "Ta bort gren från fjärrarkiv" + - #: lib/mergetool.tcl:146 - msgid "Conflict file does not exist" - msgstr "Konfliktfil existerar inte" ++#: lib/remote_branch_delete.tcl:48 ++msgid "From Repository" ++msgstr "Från arkiv" + - #: lib/mergetool.tcl:264 - #, tcl-format - msgid "Not a GUI merge tool: '%s'" - msgstr "Inte ett grafiskt verktyg för sammanslagning: %s" ++#: lib/remote_branch_delete.tcl:88 ++msgid "Branches" ++msgstr "Grenar" + - #: lib/mergetool.tcl:268 - #, tcl-format - msgid "Unsupported merge tool '%s'" - msgstr "Verktyget \"%s\" för sammanslagning stöds inte" ++#: lib/remote_branch_delete.tcl:110 ++msgid "Delete Only If" ++msgstr "Ta endast bort om" + - #: lib/mergetool.tcl:303 - msgid "Merge tool is already running, terminate it?" - msgstr "Verktyget för sammanslagning körs redan. Vill du avsluta det?" ++#: lib/remote_branch_delete.tcl:112 ++msgid "Merged Into:" ++msgstr "Sammanslagen i:" ++ ++#: lib/remote_branch_delete.tcl:120 lib/branch_delete.tcl:53 ++msgid "Always (Do not perform merge checks)" ++msgstr "Alltid (utför inte sammanslagningstest)" ++ ++#: lib/remote_branch_delete.tcl:153 ++msgid "A branch is required for 'Merged Into'." ++msgstr "En gren krävs för \"Sammanslagen i\"." + - #: lib/mergetool.tcl:323 ++#: lib/remote_branch_delete.tcl:185 +#, tcl-format +msgid "" - "Error retrieving versions:\n" - "%s" ++"The following branches are not completely merged into %s:\n" ++"\n" ++" - %s" +msgstr "" - "Fel vid hämtning av versioner:\n" - "%s" ++"Följande grenar har inte helt slagits samman i %s:\n" ++"\n" ++" - %s" + - #: lib/mergetool.tcl:343 ++#: lib/remote_branch_delete.tcl:190 +#, tcl-format +msgid "" - "Could not start the merge tool:\n" ++"One or more of the merge tests failed because you have not fetched the " ++"necessary commits. Try fetching from %s first." ++msgstr "" ++"En eller flera av sammanslagningstesterna misslyckades eftersom du inte har " ++"hämtat de nödvändiga incheckningarna. Försök hämta från %s först." ++ ++#: lib/remote_branch_delete.tcl:208 ++msgid "Please select one or more branches to delete." ++msgstr "Välj en eller flera grenar att ta bort." ++ ++#: lib/remote_branch_delete.tcl:218 lib/branch_delete.tcl:115 ++msgid "" ++"Recovering deleted branches is difficult.\n" +"\n" - "%s" ++"Delete the selected branches?" +msgstr "" - "Kunde inte starta verktyg för sammanslagning:\n" ++"Det kan vara svårt att återställa borttagna grenar.\n" +"\n" - "%s" ++"Ta bort de valda grenarna?" + - #: lib/mergetool.tcl:347 - msgid "Running merge tool..." - msgstr "Kör verktyg för sammanslagning..." ++#: lib/remote_branch_delete.tcl:227 ++#, tcl-format ++msgid "Deleting branches from %s" ++msgstr "Tar bort grenar från %s" + - #: lib/mergetool.tcl:375 lib/mergetool.tcl:383 - msgid "Merge tool failed." - msgstr "Verktyget för sammanslagning misslyckades." ++#: lib/remote_branch_delete.tcl:300 ++msgid "No repository selected." ++msgstr "Inget arkiv markerat." + - #: lib/option.tcl:11 ++#: lib/remote_branch_delete.tcl:305 +#, tcl-format - msgid "Invalid global encoding '%s'" - msgstr "Den globala teckenkodningen \"%s\" är ogiltig" ++msgid "Scanning %s..." ++msgstr "Söker %s..." + - #: lib/option.tcl:19 - #, tcl-format - msgid "Invalid repo encoding '%s'" - msgstr "Arkivets teckenkodning \"%s\" är ogiltig" ++#: lib/choose_repository.tcl:33 ++msgid "Git Gui" ++msgstr "Git Gui" + - #: lib/option.tcl:119 - msgid "Restore Defaults" - msgstr "Återställ standardvärden" ++#: lib/choose_repository.tcl:92 lib/choose_repository.tcl:412 ++msgid "Create New Repository" ++msgstr "Skapa nytt arkiv" + - #: lib/option.tcl:123 - msgid "Save" - msgstr "Spara" ++#: lib/choose_repository.tcl:98 ++msgid "New..." ++msgstr "Nytt..." + - #: lib/option.tcl:133 - #, tcl-format - msgid "%s Repository" - msgstr "Arkivet %s" ++#: lib/choose_repository.tcl:105 lib/choose_repository.tcl:496 ++msgid "Clone Existing Repository" ++msgstr "Klona befintligt arkiv" + - #: lib/option.tcl:134 - msgid "Global (All Repositories)" - msgstr "Globalt (alla arkiv)" ++#: lib/choose_repository.tcl:116 ++msgid "Clone..." ++msgstr "Klona..." + - #: lib/option.tcl:140 - msgid "User Name" - msgstr "Användarnamn" ++#: lib/choose_repository.tcl:123 lib/choose_repository.tcl:1064 ++msgid "Open Existing Repository" ++msgstr "Öppna befintligt arkiv" + - #: lib/option.tcl:141 - msgid "Email Address" - msgstr "E-postadress" ++#: lib/choose_repository.tcl:129 ++msgid "Open..." ++msgstr "Öppna..." + - #: lib/option.tcl:143 - msgid "Summarize Merge Commits" - msgstr "Summera sammanslagningsincheckningar" ++#: lib/choose_repository.tcl:142 ++msgid "Recent Repositories" ++msgstr "Senaste arkiven" + - #: lib/option.tcl:144 - msgid "Merge Verbosity" - msgstr "Pratsamhet för sammanslagningar" ++#: lib/choose_repository.tcl:148 ++msgid "Open Recent Repository:" ++msgstr "Öppna tidigare arkiv:" + - #: lib/option.tcl:145 - msgid "Show Diffstat After Merge" - msgstr "Visa diffstatistik efter sammanslagning" ++#: lib/choose_repository.tcl:316 lib/choose_repository.tcl:323 ++#: lib/choose_repository.tcl:330 ++#, tcl-format ++msgid "Failed to create repository %s:" ++msgstr "Kunde inte skapa arkivet %s:" + - #: lib/option.tcl:146 - msgid "Use Merge Tool" - msgstr "Använd verktyg för sammanslagning" ++#: lib/choose_repository.tcl:407 lib/branch_create.tcl:33 ++msgid "Create" ++msgstr "Skapa" + - #: lib/option.tcl:148 - msgid "Trust File Modification Timestamps" - msgstr "Lita på filändringstidsstämplar" ++#: lib/choose_repository.tcl:417 ++msgid "Directory:" ++msgstr "Katalog:" + - #: lib/option.tcl:149 - msgid "Prune Tracking Branches During Fetch" - msgstr "Städa spårade grenar vid hämtning" ++#: lib/choose_repository.tcl:447 lib/choose_repository.tcl:573 ++#: lib/choose_repository.tcl:1098 ++msgid "Git Repository" ++msgstr "Gitarkiv" + - #: lib/option.tcl:150 - msgid "Match Tracking Branches" - msgstr "Matcha spårade grenar" ++#: lib/choose_repository.tcl:472 ++#, tcl-format ++msgid "Directory %s already exists." ++msgstr "Katalogen %s finns redan." + - #: lib/option.tcl:151 - msgid "Use Textconv For Diffs and Blames" - msgstr "Använd Textconv för diff och klandring" ++#: lib/choose_repository.tcl:476 ++#, tcl-format ++msgid "File %s already exists." ++msgstr "Filen %s finns redan." + - #: lib/option.tcl:152 - msgid "Blame Copy Only On Changed Files" - msgstr "Klandra kopiering bara i ändrade filer" ++#: lib/choose_repository.tcl:491 ++msgid "Clone" ++msgstr "Klona" + - #: lib/option.tcl:153 - msgid "Minimum Letters To Blame Copy On" - msgstr "Minsta antal tecken att klandra kopiering för" ++#: lib/choose_repository.tcl:504 ++msgid "Source Location:" ++msgstr "Plats för källkod:" + - #: lib/option.tcl:154 - msgid "Blame History Context Radius (days)" - msgstr "Historikradie för klandring (dagar)" ++#: lib/choose_repository.tcl:513 ++msgid "Target Directory:" ++msgstr "Målkatalog:" + - #: lib/option.tcl:155 - msgid "Number of Diff Context Lines" - msgstr "Antal rader sammanhang i differenser" ++#: lib/choose_repository.tcl:523 ++msgid "Clone Type:" ++msgstr "Typ av klon:" + - #: lib/option.tcl:156 - msgid "Commit Message Text Width" - msgstr "Textbredd för incheckningsmeddelande" ++#: lib/choose_repository.tcl:528 ++msgid "Standard (Fast, Semi-Redundant, Hardlinks)" ++msgstr "Standard (snabb, semiredundant, hårda länkar)" + - #: lib/option.tcl:157 - msgid "New Branch Name Template" - msgstr "Mall för namn på nya grenar" ++#: lib/choose_repository.tcl:533 ++msgid "Full Copy (Slower, Redundant Backup)" ++msgstr "Full kopia (långsammare, redundant säkerhetskopia)" + - #: lib/option.tcl:158 - msgid "Default File Contents Encoding" - msgstr "Standardteckenkodning för filinnehåll" ++#: lib/choose_repository.tcl:538 ++msgid "Shared (Fastest, Not Recommended, No Backup)" ++msgstr "Delad (snabbast, rekommenderas ej, ingen säkerhetskopia)" + - #: lib/option.tcl:204 - msgid "Change" - msgstr "Ändra" ++#: lib/choose_repository.tcl:545 ++msgid "Recursively clone submodules too" ++msgstr "Klona även rekursivt undermoduler" + - #: lib/option.tcl:231 - msgid "Spelling Dictionary:" - msgstr "Stavningsordlista:" ++#: lib/choose_repository.tcl:579 lib/choose_repository.tcl:626 ++#: lib/choose_repository.tcl:772 lib/choose_repository.tcl:842 ++#: lib/choose_repository.tcl:1104 lib/choose_repository.tcl:1112 ++#, tcl-format ++msgid "Not a Git repository: %s" ++msgstr "Inte ett Gitarkiv: %s" + - #: lib/option.tcl:261 - msgid "Change Font" - msgstr "Byt teckensnitt" ++#: lib/choose_repository.tcl:615 ++msgid "Standard only available for local repository." ++msgstr "Standard är endast tillgängligt för lokala arkiv." ++ ++#: lib/choose_repository.tcl:619 ++msgid "Shared only available for local repository." ++msgstr "Delat är endast tillgängligt för lokala arkiv." + - #: lib/option.tcl:265 ++#: lib/choose_repository.tcl:640 +#, tcl-format - msgid "Choose %s" - msgstr "Välj %s" ++msgid "Location %s already exists." ++msgstr "Platsen %s finns redan." + - #: lib/option.tcl:271 - msgid "pt." - msgstr "p." ++#: lib/choose_repository.tcl:651 ++msgid "Failed to configure origin" ++msgstr "Kunde inte konfigurera ursprung" + - #: lib/option.tcl:285 - msgid "Preferences" - msgstr "Inställningar" ++#: lib/choose_repository.tcl:663 ++msgid "Counting objects" ++msgstr "Räknar objekt" + - #: lib/option.tcl:322 - msgid "Failed to completely save options:" - msgstr "Misslyckades med att helt spara alternativ:" ++#: lib/choose_repository.tcl:664 ++msgid "buckets" ++msgstr "hinkar" + - #: lib/remote_add.tcl:20 - msgid "Add Remote" - msgstr "Lägg till fjärrarkiv" ++#: lib/choose_repository.tcl:688 ++#, tcl-format ++msgid "Unable to copy objects/info/alternates: %s" ++msgstr "Kunde inte kopiera objekt/info/alternativ: %s" + - #: lib/remote_add.tcl:25 - msgid "Add New Remote" - msgstr "Lägg till nytt fjärrarkiv" ++#: lib/choose_repository.tcl:724 ++#, tcl-format ++msgid "Nothing to clone from %s." ++msgstr "Ingenting att klona från %s." + - #: lib/remote_add.tcl:30 lib/tools_dlg.tcl:37 - msgid "Add" - msgstr "Lägg till" ++#: lib/choose_repository.tcl:726 lib/choose_repository.tcl:940 ++#: lib/choose_repository.tcl:952 ++msgid "The 'master' branch has not been initialized." ++msgstr "Grenen \"master\" har inte initierats." + - #: lib/remote_add.tcl:39 - msgid "Remote Details" - msgstr "Detaljer för fjärrarkiv" ++#: lib/choose_repository.tcl:739 ++msgid "Hardlinks are unavailable. Falling back to copying." ++msgstr "Hårda länkar är inte tillgängliga. Faller tillbaka på kopiering." + - #: lib/remote_add.tcl:50 - msgid "Location:" - msgstr "Plats:" ++#: lib/choose_repository.tcl:751 ++#, tcl-format ++msgid "Cloning from %s" ++msgstr "Klonar från %s" + - #: lib/remote_add.tcl:60 - msgid "Further Action" - msgstr "Ytterligare åtgärd" ++#: lib/choose_repository.tcl:782 ++msgid "Copying objects" ++msgstr "Kopierar objekt" + - #: lib/remote_add.tcl:63 - msgid "Fetch Immediately" - msgstr "Hämta omedelbart" ++#: lib/choose_repository.tcl:783 ++msgid "KiB" ++msgstr "KiB" + - #: lib/remote_add.tcl:69 - msgid "Initialize Remote Repository and Push" - msgstr "Initiera fjärrarkiv och sänd till" ++#: lib/choose_repository.tcl:807 ++#, tcl-format ++msgid "Unable to copy object: %s" ++msgstr "Kunde inte kopiera objekt: %s" + - #: lib/remote_add.tcl:75 - msgid "Do Nothing Else Now" - msgstr "Gör ingent mer nu" ++#: lib/choose_repository.tcl:817 ++msgid "Linking objects" ++msgstr "Länkar objekt" + - #: lib/remote_add.tcl:100 - msgid "Please supply a remote name." - msgstr "Ange ett namn för fjärrarkivet." ++#: lib/choose_repository.tcl:818 ++msgid "objects" ++msgstr "objekt" + - #: lib/remote_add.tcl:113 ++#: lib/choose_repository.tcl:826 +#, tcl-format - msgid "'%s' is not an acceptable remote name." - msgstr "\"%s\" kan inte användas som namn på fjärrarkivet." ++msgid "Unable to hardlink object: %s" ++msgstr "Kunde inte hårdlänka objekt: %s" + - #: lib/remote_add.tcl:124 - #, tcl-format - msgid "Failed to add remote '%s' of location '%s'." - msgstr "Kunde inte lägga till fjärrarkivet \"%s\" på platsen \"%s\"." ++#: lib/choose_repository.tcl:881 ++msgid "Cannot fetch branches and objects. See console output for details." ++msgstr "Kunde inte hämta grenar och objekt. Se konsolutdata för detaljer." + - #: lib/remote_add.tcl:132 lib/transport.tcl:6 - #, tcl-format - msgid "fetch %s" - msgstr "hämta %s" ++#: lib/choose_repository.tcl:892 ++msgid "Cannot fetch tags. See console output for details." ++msgstr "Kunde inte hämta taggar. Se konsolutdata för detaljer." + - #: lib/remote_add.tcl:133 - #, tcl-format - msgid "Fetching the %s" - msgstr "Hämtar %s" ++#: lib/choose_repository.tcl:916 ++msgid "Cannot determine HEAD. See console output for details." ++msgstr "Kunde inte avgöra HEAD. Se konsolutdata för detaljer." + - #: lib/remote_add.tcl:156 ++#: lib/choose_repository.tcl:925 +#, tcl-format - msgid "Do not know how to initialize repository at location '%s'." - msgstr "Vet inte hur arkivet på platsen \"%s\" skall initieras." ++msgid "Unable to cleanup %s" ++msgstr "Kunde inte städa upp %s" + - #: lib/remote_add.tcl:162 lib/transport.tcl:25 lib/transport.tcl:63 - #: lib/transport.tcl:81 - #, tcl-format - msgid "push %s" - msgstr "sänd %s" ++#: lib/choose_repository.tcl:931 ++msgid "Clone failed." ++msgstr "Kloning misslyckades." + - #: lib/remote_add.tcl:163 - #, tcl-format - msgid "Setting up the %s (at %s)" - msgstr "Konfigurerar %s (på %s)" ++#: lib/choose_repository.tcl:938 ++msgid "No default branch obtained." ++msgstr "Hämtade ingen standardgren." + - #: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 - msgid "Delete Branch Remotely" - msgstr "Ta bort gren från fjärrarkiv" ++#: lib/choose_repository.tcl:949 ++#, tcl-format ++msgid "Cannot resolve %s as a commit." ++msgstr "Kunde inte slå upp %s till någon incheckning." + - #: lib/remote_branch_delete.tcl:48 - msgid "From Repository" - msgstr "Från arkiv" ++#: lib/choose_repository.tcl:961 ++msgid "Creating working directory" ++msgstr "Skapar arbetskatalog" + - #: lib/remote_branch_delete.tcl:51 lib/transport.tcl:134 - msgid "Remote:" - msgstr "Fjärrarkiv:" ++#: lib/choose_repository.tcl:962 lib/index.tcl:70 lib/index.tcl:136 ++#: lib/index.tcl:207 ++msgid "files" ++msgstr "filer" + - #: lib/remote_branch_delete.tcl:72 lib/transport.tcl:154 - msgid "Arbitrary Location:" - msgstr "Godtycklig plats:" ++#: lib/choose_repository.tcl:981 ++msgid "Cannot clone submodules." ++msgstr "Kan inte klona undermoduler." + - #: lib/remote_branch_delete.tcl:88 - msgid "Branches" - msgstr "Grenar" ++#: lib/choose_repository.tcl:990 ++msgid "Cloning submodules" ++msgstr "Klonar undermoduler" + - #: lib/remote_branch_delete.tcl:110 - msgid "Delete Only If" - msgstr "Ta endast bort om" ++#: lib/choose_repository.tcl:1015 ++msgid "Initial file checkout failed." ++msgstr "Inledande filutcheckning misslyckades." + - #: lib/remote_branch_delete.tcl:112 - msgid "Merged Into:" - msgstr "Sammanslagen i:" ++#: lib/choose_repository.tcl:1059 ++msgid "Open" ++msgstr "Öppna" + - #: lib/remote_branch_delete.tcl:153 - msgid "A branch is required for 'Merged Into'." - msgstr "En gren krävs för \"Sammanslagen i\"." ++#: lib/choose_repository.tcl:1069 ++msgid "Repository:" ++msgstr "Arkiv:" + - #: lib/remote_branch_delete.tcl:185 ++#: lib/choose_repository.tcl:1118 +#, tcl-format - msgid "" - "The following branches are not completely merged into %s:\n" - "\n" - " - %s" - msgstr "" - "Följande grenar har inte helt slagits samman i %s:\n" - "\n" - " - %s" ++msgid "Failed to open repository %s:" ++msgstr "Kunde inte öppna arkivet %s:" + - #: lib/remote_branch_delete.tcl:190 - #, tcl-format - msgid "" - "One or more of the merge tests failed because you have not fetched the " - "necessary commits. Try fetching from %s first." - msgstr "" - "En eller flera av sammanslagningstesterna misslyckades eftersom du inte har " - "hämtat de nödvändiga incheckningarna. Försök hämta från %s först." ++#: lib/about.tcl:26 ++msgid "git-gui - a graphical user interface for Git." ++msgstr "git-gui - ett grafiskt användargränssnitt för Git." + - #: lib/remote_branch_delete.tcl:208 - msgid "Please select one or more branches to delete." - msgstr "Välj en eller flera grenar att ta bort." ++#: lib/blame.tcl:73 ++msgid "File Viewer" ++msgstr "Filvisare" + - #: lib/remote_branch_delete.tcl:227 - #, tcl-format - msgid "Deleting branches from %s" - msgstr "Tar bort grenar från %s" ++#: lib/blame.tcl:79 ++msgid "Commit:" ++msgstr "Incheckning:" + - #: lib/remote_branch_delete.tcl:293 - msgid "No repository selected." - msgstr "Inget arkiv markerat." ++#: lib/blame.tcl:280 ++msgid "Copy Commit" ++msgstr "Kopiera incheckning" + - #: lib/remote_branch_delete.tcl:298 - #, tcl-format - msgid "Scanning %s..." - msgstr "Söker %s..." ++#: lib/blame.tcl:284 ++msgid "Find Text..." ++msgstr "Sök text..." + - #: lib/remote.tcl:163 - msgid "Remove Remote" - msgstr "Ta bort fjärrarkiv" ++#: lib/blame.tcl:288 ++msgid "Goto Line..." ++msgstr "Gå till rad..." + - #: lib/remote.tcl:168 - msgid "Prune from" - msgstr "Ta bort från" ++#: lib/blame.tcl:297 ++msgid "Do Full Copy Detection" ++msgstr "Gör full kopieringsigenkänning" + - #: lib/remote.tcl:173 - msgid "Fetch from" - msgstr "Hämta från" ++#: lib/blame.tcl:301 ++msgid "Show History Context" ++msgstr "Visa historiksammanhang" + - #: lib/remote.tcl:215 - msgid "Push to" - msgstr "Sänd till" ++#: lib/blame.tcl:304 ++msgid "Blame Parent Commit" ++msgstr "Klandra föräldraincheckning" + - #: lib/search.tcl:22 - msgid "Find:" - msgstr "Sök:" ++#: lib/blame.tcl:466 ++#, tcl-format ++msgid "Reading %s..." ++msgstr "Läser %s..." + - #: lib/search.tcl:24 - msgid "Next" - msgstr "Nästa" ++#: lib/blame.tcl:594 ++msgid "Loading copy/move tracking annotations..." ++msgstr "Läser annoteringar för kopiering/flyttning..." + - #: lib/search.tcl:25 - msgid "Prev" - msgstr "Föreg" ++#: lib/blame.tcl:614 ++msgid "lines annotated" ++msgstr "rader annoterade" + - #: lib/search.tcl:26 - msgid "Case-Sensitive" - msgstr "Skilj på VERSALER/gemener" ++#: lib/blame.tcl:806 ++msgid "Loading original location annotations..." ++msgstr "Läser in annotering av originalplacering..." + - #: lib/shortcut.tcl:21 lib/shortcut.tcl:62 - msgid "Cannot write shortcut:" - msgstr "Kan inte skriva genväg:" ++#: lib/blame.tcl:809 ++msgid "Annotation complete." ++msgstr "Annotering fullbordad." + - #: lib/shortcut.tcl:137 - msgid "Cannot write icon:" - msgstr "Kan inte skriva ikon:" ++#: lib/blame.tcl:839 ++msgid "Busy" ++msgstr "Upptagen" + - #: lib/spellcheck.tcl:57 - msgid "Unsupported spell checker" - msgstr "Stavningskontrollprogrammet stöds inte" ++#: lib/blame.tcl:840 ++msgid "Annotation process is already running." ++msgstr "Annoteringsprocess körs redan." + - #: lib/spellcheck.tcl:65 - msgid "Spell checking is unavailable" - msgstr "Stavningskontroll är ej tillgänglig" ++#: lib/blame.tcl:879 ++msgid "Running thorough copy detection..." ++msgstr "Kör grundlig kopieringsigenkänning..." + - #: lib/spellcheck.tcl:68 - msgid "Invalid spell checking configuration" - msgstr "Ogiltig inställning för stavningskontroll" ++#: lib/blame.tcl:947 ++msgid "Loading annotation..." ++msgstr "Läser in annotering..." + - #: lib/spellcheck.tcl:70 - #, tcl-format - msgid "Reverting dictionary to %s." - msgstr "Återställer ordlistan till %s." ++#: lib/blame.tcl:1000 ++msgid "Author:" ++msgstr "Författare:" ++ ++#: lib/blame.tcl:1004 ++msgid "Committer:" ++msgstr "Incheckare:" ++ ++#: lib/blame.tcl:1009 ++msgid "Original File:" ++msgstr "Ursprunglig fil:" ++ ++#: lib/blame.tcl:1057 ++msgid "Cannot find HEAD commit:" ++msgstr "Hittar inte incheckning för HEAD:" + - #: lib/spellcheck.tcl:73 - msgid "Spell checker silently failed on startup" - msgstr "Stavningskontroll misslyckades tyst vid start" ++#: lib/blame.tcl:1112 ++msgid "Cannot find parent commit:" ++msgstr "Hittar inte föräldraincheckning:" + - #: lib/spellcheck.tcl:80 - msgid "Unrecognized spell checker" - msgstr "Stavningskontrollprogrammet känns inte igen" ++#: lib/blame.tcl:1127 ++msgid "Unable to display parent" ++msgstr "Kan inte visa förälder" + - #: lib/spellcheck.tcl:186 - msgid "No Suggestions" - msgstr "Inga förslag" ++#: lib/blame.tcl:1269 ++msgid "Originally By:" ++msgstr "Ursprungligen av:" + - #: lib/spellcheck.tcl:388 - msgid "Unexpected EOF from spell checker" - msgstr "Oväntat filslut från stavningskontroll" ++#: lib/blame.tcl:1275 ++msgid "In File:" ++msgstr "I filen:" + - #: lib/spellcheck.tcl:392 - msgid "Spell Checker Failed" - msgstr "Stavningskontroll misslyckades" ++#: lib/blame.tcl:1280 ++msgid "Copied Or Moved Here By:" ++msgstr "Kopierad eller flyttad hit av:" + +#: lib/sshkey.tcl:31 +msgid "No keys found." +msgstr "Inga nycklar hittades." + +#: lib/sshkey.tcl:34 +#, tcl-format +msgid "Found a public key in: %s" +msgstr "Hittade öppen nyckel i: %s" + +#: lib/sshkey.tcl:40 +msgid "Generate Key" +msgstr "Skapa nyckel" + +#: lib/sshkey.tcl:58 +msgid "Copy To Clipboard" +msgstr "Kopiera till Urklipp" + +#: lib/sshkey.tcl:72 +msgid "Your OpenSSH Public Key" +msgstr "Din öppna OpenSSH-nyckel" + +#: lib/sshkey.tcl:80 +msgid "Generating..." +msgstr "Skapar..." + +#: lib/sshkey.tcl:86 +#, tcl-format +msgid "" +"Could not start ssh-keygen:\n" +"\n" +"%s" +msgstr "" +"Kunde inte starta ssh-keygen:\n" +"\n" +"%s" + +#: lib/sshkey.tcl:113 +msgid "Generation failed." +msgstr "Misslyckades med att skapa." + +#: lib/sshkey.tcl:120 +msgid "Generation succeeded, but no keys found." +msgstr "Lyckades skapa nyckeln, men hittar inte någon nyckel." + +#: lib/sshkey.tcl:123 +#, tcl-format +msgid "Your key is in: %s" +msgstr "Din nyckel finns i: %s" + - #: lib/status_bar.tcl:86 ++#: lib/branch_create.tcl:23 ++msgid "Create Branch" ++msgstr "Skapa gren" ++ ++#: lib/branch_create.tcl:28 ++msgid "Create New Branch" ++msgstr "Skapa ny gren" ++ ++#: lib/branch_create.tcl:42 ++msgid "Branch Name" ++msgstr "Namn på gren" ++ ++#: lib/branch_create.tcl:57 ++msgid "Match Tracking Branch Name" ++msgstr "Använd namn på spårad gren" ++ ++#: lib/branch_create.tcl:66 ++msgid "Starting Revision" ++msgstr "Inledande revision" ++ ++#: lib/branch_create.tcl:72 ++msgid "Update Existing Branch:" ++msgstr "Uppdatera befintlig gren:" ++ ++#: lib/branch_create.tcl:75 ++msgid "No" ++msgstr "Nej" ++ ++#: lib/branch_create.tcl:80 ++msgid "Fast Forward Only" ++msgstr "Endast snabbspolning" ++ ++#: lib/branch_create.tcl:97 ++msgid "Checkout After Creation" ++msgstr "Checka ut när skapad" ++ ++#: lib/branch_create.tcl:132 ++msgid "Please select a tracking branch." ++msgstr "Välj en gren att spåra." ++ ++#: lib/branch_create.tcl:141 +#, tcl-format - msgid "%s ... %*i of %*i %s (%3i%%)" - msgstr "%s... %*i av %*i %s (%3i%%)" ++msgid "Tracking branch %s is not a branch in the remote repository." ++msgstr "Den spårade grenen %s är inte en gren i fjärrarkivet." + - #: lib/tools_dlg.tcl:22 - msgid "Add Tool" - msgstr "Lägg till verktyg" ++#: lib/shortcut.tcl:21 lib/shortcut.tcl:62 ++msgid "Cannot write shortcut:" ++msgstr "Kan inte skriva genväg:" + - #: lib/tools_dlg.tcl:28 - msgid "Add New Tool Command" - msgstr "Lägg till nytt verktygskommando" ++#: lib/shortcut.tcl:137 ++msgid "Cannot write icon:" ++msgstr "Kan inte skriva ikon:" + - #: lib/tools_dlg.tcl:34 - msgid "Add globally" - msgstr "Lägg till globalt" ++#: lib/choose_rev.tcl:52 ++msgid "This Detached Checkout" ++msgstr "Denna frånkopplade utcheckning" ++ ++#: lib/choose_rev.tcl:60 ++msgid "Revision Expression:" ++msgstr "Revisionsuttryck:" ++ ++#: lib/choose_rev.tcl:72 ++msgid "Local Branch" ++msgstr "Lokal gren" ++ ++#: lib/choose_rev.tcl:77 ++msgid "Tracking Branch" ++msgstr "Spårande gren" ++ ++#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:544 ++msgid "Tag" ++msgstr "Tagg" ++ ++#: lib/choose_rev.tcl:321 ++#, tcl-format ++msgid "Invalid revision: %s" ++msgstr "Ogiltig revision: %s" ++ ++#: lib/choose_rev.tcl:342 ++msgid "No revision selected." ++msgstr "Ingen revision vald." ++ ++#: lib/choose_rev.tcl:350 ++msgid "Revision expression is empty." ++msgstr "Revisionsuttrycket är tomt." ++ ++#: lib/choose_rev.tcl:537 ++msgid "Updated" ++msgstr "Uppdaterad" ++ ++#: lib/choose_rev.tcl:565 ++msgid "URL" ++msgstr "Webbadress" ++ ++#: lib/commit.tcl:9 ++msgid "" ++"There is nothing to amend.\n" ++"\n" ++"You are about to create the initial commit. There is no commit before this " ++"to amend.\n" ++msgstr "" ++"Det finns ingenting att utöka.\n" ++"\n" ++"Du håller på att skapa den inledande incheckningen. Det finns ingen tidigare " ++"incheckning att utöka.\n" ++ ++#: lib/commit.tcl:18 ++msgid "" ++"Cannot amend while merging.\n" ++"\n" ++"You are currently in the middle of a merge that has not been fully " ++"completed. You cannot amend the prior commit unless you first abort the " ++"current merge activity.\n" ++msgstr "" ++"Kan inte utöka vid sammanslagning.\n" ++"\n" ++"Du är i mitten av en sammanslagning som inte är fullbordad. Du kan inte " ++"utöka tidigare incheckningar om du inte först avbryter den pågående " ++"sammanslagningen.\n" ++ ++#: lib/commit.tcl:48 ++msgid "Error loading commit data for amend:" ++msgstr "Fel vid inläsning av incheckningsdata för utökning:" ++ ++#: lib/commit.tcl:75 ++msgid "Unable to obtain your identity:" ++msgstr "Kunde inte hämta din identitet:" ++ ++#: lib/commit.tcl:80 ++msgid "Invalid GIT_COMMITTER_IDENT:" ++msgstr "Felaktig GIT_COMMITTER_IDENT:" ++ ++#: lib/commit.tcl:129 ++#, tcl-format ++msgid "warning: Tcl does not support encoding '%s'." ++msgstr "varning: Tcl stöder inte teckenkodningen \"%s\"." ++ ++#: lib/commit.tcl:149 ++msgid "" ++"Last scanned state does not match repository state.\n" ++"\n" ++"Another Git program has modified this repository since the last scan. A " ++"rescan must be performed before another commit can be created.\n" ++"\n" ++"The rescan will be automatically started now.\n" ++msgstr "" ++"Det senaste inlästa tillståndet motsvarar inte tillståndet i arkivet.\n" ++"\n" ++"Ett annat Git-program har ändrat arkivet sedan senaste avsökningen. Du måste " ++"utföra en ny sökning innan du kan göra en ny incheckning.\n" ++"\n" ++"Sökningen kommer att startas automatiskt nu.\n" ++ ++#: lib/commit.tcl:173 ++#, tcl-format ++msgid "" ++"Unmerged files cannot be committed.\n" ++"\n" ++"File %s has merge conflicts. You must resolve them and stage the file " ++"before committing.\n" ++msgstr "" ++"Osammanslagna filer kan inte checkas in.\n" ++"\n" ++"Filen %s har sammanslagningskonflikter. Du måste lösa dem och köa filen " ++"innan du checkar in den.\n" ++ ++#: lib/commit.tcl:181 ++#, tcl-format ++msgid "" ++"Unknown file state %s detected.\n" ++"\n" ++"File %s cannot be committed by this program.\n" ++msgstr "" ++"Okänd filstatus %s upptäckt.\n" ++"\n" ++"Filen %s kan inte checkas in av programmet.\n" ++ ++#: lib/commit.tcl:189 ++msgid "" ++"No changes to commit.\n" ++"\n" ++"You must stage at least 1 file before you can commit.\n" ++msgstr "" ++"Inga ändringar att checka in.\n" ++"\n" ++"Du måste köa åtminstone en fil innan du kan checka in.\n" ++ ++#: lib/commit.tcl:204 ++msgid "" ++"Please supply a commit message.\n" ++"\n" ++"A good commit message has the following format:\n" ++"\n" ++"- First line: Describe in one sentence what you did.\n" ++"- Second line: Blank\n" ++"- Remaining lines: Describe why this change is good.\n" ++msgstr "" ++"Ange ett incheckningsmeddelande.\n" ++"\n" ++"Ett bra incheckningsmeddelande har följande format:\n" ++"\n" ++"- Första raden: Beskriv i en mening vad du gjorde.\n" ++"- Andra raden: Tom\n" ++"- Följande rader: Beskriv varför det här är en bra ändring.\n" ++ ++#: lib/commit.tcl:235 ++msgid "Calling pre-commit hook..." ++msgstr "Anropar kroken före incheckning (pre-commit)..." ++ ++#: lib/commit.tcl:250 ++msgid "Commit declined by pre-commit hook." ++msgstr "Incheckningen avvisades av kroken före incheckning (pre-commit)." ++ ++#: lib/commit.tcl:269 ++msgid "" ++"You are about to commit on a detached head. This is a potentially dangerous " ++"thing to do because if you switch to another branch you will lose your " ++"changes and it can be difficult to retrieve them later from the reflog. You " ++"should probably cancel this commit and create a new branch to continue.\n" ++" \n" ++" Do you really want to proceed with your Commit?" ++msgstr "" ++"Du är på väg att checka in på ett frånkopplat huvud. Det kan potentiellt " ++"vara farligt, eftersom du kommer förlora dina ändringar om du växlar till en " ++"annan gren och det kan vara svårt att hämta dem senare från ref-loggen. Du " ++"bör troligen avbryta incheckningen och skapa en ny gren för att fortsätta.\n" ++" \n" ++" Vill du verkligen fortsätta checka in?" ++ ++#: lib/commit.tcl:290 ++msgid "Calling commit-msg hook..." ++msgstr "Anropar kroken för incheckningsmeddelande (commit-msg)..." ++ ++#: lib/commit.tcl:305 ++msgid "Commit declined by commit-msg hook." ++msgstr "Incheckning avvisad av kroken för incheckningsmeddelande (commit-msg)." ++ ++#: lib/commit.tcl:318 ++msgid "Committing changes..." ++msgstr "Checkar in ändringar..." ++ ++#: lib/commit.tcl:334 ++msgid "write-tree failed:" ++msgstr "write-tree misslyckades:" ++ ++#: lib/commit.tcl:335 lib/commit.tcl:379 lib/commit.tcl:400 ++msgid "Commit failed." ++msgstr "Incheckningen misslyckades." ++ ++#: lib/commit.tcl:352 ++#, tcl-format ++msgid "Commit %s appears to be corrupt" ++msgstr "Incheckningen %s verkar vara trasig" + - #: lib/tools_dlg.tcl:46 - msgid "Tool Details" - msgstr "Detaljer för verktyg" ++#: lib/commit.tcl:357 ++msgid "" ++"No changes to commit.\n" ++"\n" ++"No files were modified by this commit and it was not a merge commit.\n" ++"\n" ++"A rescan will be automatically started now.\n" ++msgstr "" ++"Inga ändringar att checka in.\n" ++"\n" ++"Inga filer ändrades av incheckningen och det var inte en sammanslagning.\n" ++"\n" ++"En sökning kommer att startas automatiskt nu.\n" + - #: lib/tools_dlg.tcl:49 - msgid "Use '/' separators to create a submenu tree:" - msgstr "Använd \"/\"-avdelare för att skapa ett undermenyträd:" ++#: lib/commit.tcl:364 ++msgid "No changes to commit." ++msgstr "Inga ändringar att checka in." + - #: lib/tools_dlg.tcl:60 - msgid "Command:" - msgstr "Kommando:" ++#: lib/commit.tcl:378 ++msgid "commit-tree failed:" ++msgstr "commit-tree misslyckades:" + - #: lib/tools_dlg.tcl:71 - msgid "Show a dialog before running" - msgstr "Visa dialog innan programmet startas" ++#: lib/commit.tcl:399 ++msgid "update-ref failed:" ++msgstr "update-ref misslyckades:" + - #: lib/tools_dlg.tcl:77 - msgid "Ask the user to select a revision (sets $REVISION)" - msgstr "Be användaren välja en version (sätter $REVISION)" ++#: lib/commit.tcl:492 ++#, tcl-format ++msgid "Created commit %s: %s" ++msgstr "Skapade incheckningen %s: %s" + - #: lib/tools_dlg.tcl:82 - msgid "Ask the user for additional arguments (sets $ARGS)" - msgstr "Be användaren om ytterligare parametrar (sätter $ARGS)" ++#: lib/branch_delete.tcl:16 ++msgid "Delete Branch" ++msgstr "Ta bort gren" + - #: lib/tools_dlg.tcl:89 - msgid "Don't show the command output window" - msgstr "Visa inte kommandots utdatafönster" ++#: lib/branch_delete.tcl:21 ++msgid "Delete Local Branch" ++msgstr "Ta bort lokal gren" + - #: lib/tools_dlg.tcl:94 - msgid "Run only if a diff is selected ($FILENAME not empty)" - msgstr "Kör endast om en diff har markerats ($FILENAME är inte tomt)" ++#: lib/branch_delete.tcl:39 ++msgid "Local Branches" ++msgstr "Lokala grenar" + - #: lib/tools_dlg.tcl:118 - msgid "Please supply a name for the tool." - msgstr "Ange ett namn för verktyget." ++#: lib/branch_delete.tcl:51 ++msgid "Delete Only If Merged Into" ++msgstr "Ta bara bort om sammanslagen med" + - #: lib/tools_dlg.tcl:126 ++#: lib/branch_delete.tcl:103 +#, tcl-format - msgid "Tool '%s' already exists." - msgstr "Verktyget \"%s\" finns redan." ++msgid "The following branches are not completely merged into %s:" ++msgstr "Följande grenar är inte till fullo sammanslagna med %s:" + - #: lib/tools_dlg.tcl:148 ++#: lib/branch_delete.tcl:141 +#, tcl-format +msgid "" - "Could not add tool:\n" ++"Failed to delete branches:\n" +"%s" +msgstr "" - "Kunde inte lägga till verktyget:\n" ++"Kunde inte ta bort grenar:\n" +"%s" + - #: lib/tools_dlg.tcl:187 - msgid "Remove Tool" - msgstr "Ta bort verktyg" ++#: lib/index.tcl:6 ++msgid "Unable to unlock the index." ++msgstr "Kunde inte låsa upp indexet." + - #: lib/tools_dlg.tcl:193 - msgid "Remove Tool Commands" - msgstr "Ta bort verktygskommandon" ++#: lib/index.tcl:17 ++msgid "Index Error" ++msgstr "Indexfel" + - #: lib/tools_dlg.tcl:198 - msgid "Remove" - msgstr "Ta bort" ++#: lib/index.tcl:19 ++msgid "" ++"Updating the Git index failed. A rescan will be automatically started to " ++"resynchronize git-gui." ++msgstr "" ++"Misslyckades med att uppdatera Gitindexet. En omsökning kommer att startas " ++"automatiskt för att synkronisera om git-gui." + - #: lib/tools_dlg.tcl:231 - msgid "(Blue denotes repository-local tools)" - msgstr "(Blått anger verktyg lokala för arkivet)" ++#: lib/index.tcl:30 ++msgid "Continue" ++msgstr "Fortsätt" + - #: lib/tools_dlg.tcl:292 - #, tcl-format - msgid "Run Command: %s" - msgstr "Kör kommandot: %s" ++#: lib/index.tcl:33 ++msgid "Unlock Index" ++msgstr "Lås upp index" + - #: lib/tools_dlg.tcl:306 - msgid "Arguments" - msgstr "Argument" ++#: lib/index.tcl:298 ++#, tcl-format ++msgid "Unstaging %s from commit" ++msgstr "Tar bort %s för incheckningskön" + - #: lib/tools_dlg.tcl:341 - msgid "OK" - msgstr "OK" ++#: lib/index.tcl:337 ++msgid "Ready to commit." ++msgstr "Redo att checka in." + - #: lib/tools.tcl:75 ++#: lib/index.tcl:350 +#, tcl-format - msgid "Running %s requires a selected file." - msgstr "För att starta %s måste du välja en fil." ++msgid "Adding %s" ++msgstr "Lägger till %s" + - #: lib/tools.tcl:90 ++#: lib/index.tcl:380 +#, tcl-format - msgid "Are you sure you want to run %s?" - msgstr "Är du säker på att du vill starta %s?" ++msgid "Stage %d untracked files?" ++msgstr "Köa %d ospårade filer?" + - #: lib/tools.tcl:110 ++#: lib/index.tcl:428 +#, tcl-format - msgid "Tool: %s" - msgstr "Verktyg: %s" ++msgid "Revert changes in file %s?" ++msgstr "Återställ ändringarna i filen %s?" + - #: lib/tools.tcl:111 ++#: lib/index.tcl:430 +#, tcl-format - msgid "Running: %s" - msgstr "Exekverar: %s" ++msgid "Revert changes in these %i files?" ++msgstr "Återställ ändringarna i dessa %i filer?" + - #: lib/tools.tcl:149 - #, tcl-format - msgid "Tool completed successfully: %s" - msgstr "Verktyget avslutades framgångsrikt: %s" ++#: lib/index.tcl:438 ++msgid "Any unstaged changes will be permanently lost by the revert." ++msgstr "" ++"Alla oköade ändringar kommer permanent gå förlorade vid återställningen." + - #: lib/tools.tcl:151 - #, tcl-format - msgid "Tool failed: %s" - msgstr "Verktyget misslyckades: %s" ++#: lib/index.tcl:441 ++msgid "Do Nothing" ++msgstr "Gör ingenting" + - #: lib/transport.tcl:7 - #, tcl-format - msgid "Fetching new changes from %s" - msgstr "Hämtar nya ändringar från %s" ++#: lib/index.tcl:459 ++msgid "Reverting selected files" ++msgstr "Återställer valda filer" + - #: lib/transport.tcl:18 ++#: lib/index.tcl:463 +#, tcl-format - msgid "remote prune %s" - msgstr "fjärrborttagning %s" ++msgid "Reverting %s" ++msgstr "Återställer %s" + - #: lib/transport.tcl:19 - #, tcl-format - msgid "Pruning tracking branches deleted from %s" - msgstr "Tar bort spårande grenar som tagits bort från %s" ++#: lib/encoding.tcl:443 ++msgid "Default" ++msgstr "Standard" + - #: lib/transport.tcl:26 ++#: lib/encoding.tcl:448 +#, tcl-format - msgid "Pushing changes to %s" - msgstr "Sänder ändringar till %s" ++msgid "System (%s)" ++msgstr "Systemets (%s)" + - #: lib/transport.tcl:64 - #, tcl-format - msgid "Mirroring to %s" - msgstr "Speglar till %s" ++#: lib/encoding.tcl:459 lib/encoding.tcl:465 ++msgid "Other" ++msgstr "Annan" + - #: lib/transport.tcl:82 ++#: lib/date.tcl:25 +#, tcl-format - msgid "Pushing %s %s to %s" - msgstr "Sänder %s %s till %s" ++msgid "Invalid date from Git: %s" ++msgstr "Ogiltigt datum från Git: %s" + - #: lib/transport.tcl:102 - msgid "Push Branches" - msgstr "Sänd grenar" ++#: lib/database.tcl:42 ++msgid "Number of loose objects" ++msgstr "Antal lösa objekt" + - #: lib/transport.tcl:117 - msgid "Source Branches" - msgstr "Källgrenar" ++#: lib/database.tcl:43 ++msgid "Disk space used by loose objects" ++msgstr "Diskutrymme använt av lösa objekt" + - #: lib/transport.tcl:131 - msgid "Destination Repository" - msgstr "Destinationsarkiv" ++#: lib/database.tcl:44 ++msgid "Number of packed objects" ++msgstr "Antal packade objekt" + - #: lib/transport.tcl:172 - msgid "Transfer Options" - msgstr "Överföringsalternativ" ++#: lib/database.tcl:45 ++msgid "Number of packs" ++msgstr "Antal paket" + - #: lib/transport.tcl:174 - msgid "Force overwrite existing branch (may discard changes)" - msgstr "Tvinga överskrivning av befintlig gren (kan kasta bort ändringar)" ++#: lib/database.tcl:46 ++msgid "Disk space used by packed objects" ++msgstr "Diskutrymme använt av packade objekt" + - #: lib/transport.tcl:178 - msgid "Use thin pack (for slow network connections)" - msgstr "Använd tunt paket (för långsamma nätverksanslutningar)" ++#: lib/database.tcl:47 ++msgid "Packed objects waiting for pruning" ++msgstr "Packade objekt som väntar på städning" + - #: lib/transport.tcl:182 - msgid "Include tags" - msgstr "Ta med taggar" ++#: lib/database.tcl:48 ++msgid "Garbage files" ++msgstr "Skräpfiler" ++ ++#: lib/database.tcl:72 ++msgid "Compressing the object database" ++msgstr "Komprimerar objektdatabasen" ++ ++#: lib/database.tcl:83 ++msgid "Verifying the object database with fsck-objects" ++msgstr "Verifierar objektdatabasen med fsck-objects" ++ ++#: lib/database.tcl:107 ++#, tcl-format ++msgid "" ++"This repository currently has approximately %i loose objects.\n" ++"\n" ++"To maintain optimal performance it is strongly recommended that you compress " ++"the database.\n" ++"\n" ++"Compress the database now?" ++msgstr "" ++"Arkivet har för närvarande omkring %i lösa objekt.\n" ++"\n" ++"För att bibehålla optimal prestanda rekommenderas det å det bestämdaste att " ++"du komprimerar databasen.\n" ++"\n" ++"Komprimera databasen nu?" ++ ++#: lib/error.tcl:20 lib/error.tcl:116 ++msgid "error" ++msgstr "fel" ++ ++#: lib/error.tcl:36 ++msgid "warning" ++msgstr "varning" ++ ++#: lib/error.tcl:96 ++msgid "You must correct the above errors before committing." ++msgstr "Du måste rätta till felen ovan innan du checkar in." ++ ++#~ msgid "Displaying only %s of %s files." ++#~ msgstr "Visar endast %s av %s filer." ++ ++#~ msgid "Case-Sensitive" ++#~ msgstr "Skilj på VERSALER/gemener" + +#~ msgid "Cannot use funny .git directory:" +#~ msgstr "Kan inte använda underlig .git-katalog:" + +#~ msgid "Preferences..." +#~ msgstr "Inställningar..." + +#~ msgid "Always (Do not perform merge test.)" +#~ msgstr "Alltid (utför inte sammanslagningstest)." + +#~ msgid "URL:" +#~ msgstr "Webbadress:" + +#~ msgid "Delete Remote Branch" +#~ msgstr "Ta bort fjärrgren" + +#~ msgid "" +#~ "Unable to start gitk:\n" +#~ "\n" +#~ "%s does not exist" +#~ msgstr "" +#~ "Kan inte starta gitk:\n" +#~ "\n" +#~ "%s finns inte" + +#~ msgid "Apple" +#~ msgstr "Äpple" + +#~ msgid "Not connected to aspell" +#~ msgstr "Inte ansluten till aspell" diff --cc git-gui/po/vi.po index 0000000000,0000000000..d956b59a9e new file mode 100644 --- /dev/null +++ b/git-gui/po/vi.po @@@ -1,0 -1,0 +1,2690 @@@ ++# Vietnamese translation for GIT-GUI ++# Bản dịch Tiếng Việt dành cho gói Git-gui. ++# This file is distributed under the same license as the git-core package. ++# First translated by Trần Ngọc Quân , 2014. ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: git-gui 0.19.0\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2014-06-26 13:42+0700\n" ++"PO-Revision-Date: 2014-06-27 07:48+0700\n" ++"Last-Translator: Trần Ngọc Quân \n" ++"Language-Team: Vietnamese \n" ++"Language: vi\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Poedit-Language: Vietnamese\n" ++"X-Poedit-Country: VIET NAM\n" ++"X-Poedit-SourceCharset: utf-8\n" ++"X-Poedit-Basepath: ../\n" ++ ++#: git-gui.sh:859 ++#, tcl-format ++msgid "Invalid font specified in %s:" ++msgstr "Phông chữ không hợp lệ được đặc tả trong %s:" ++ ++#: git-gui.sh:912 ++msgid "Main Font" ++msgstr "Phông chữ chính" ++ ++#: git-gui.sh:913 ++msgid "Diff/Console Font" ++msgstr "Phông chữ cho Bảng điều khiển hay Diff" ++ ++#: git-gui.sh:928 git-gui.sh:942 git-gui.sh:955 git-gui.sh:1045 ++#: git-gui.sh:1064 git-gui.sh:3119 ++msgid "git-gui: fatal error" ++msgstr "git-gui: lỗi nghiêm trọng" ++ ++#: git-gui.sh:929 ++msgid "Cannot find git in PATH." ++msgstr "Không tìm thấy git trong biến PATH." ++ ++#: git-gui.sh:956 ++msgid "Cannot parse Git version string:" ++msgstr "Không thể phân tích chuỗi phiên bản Git:" ++ ++#: git-gui.sh:981 ++#, tcl-format ++msgid "" ++"Git version cannot be determined.\n" ++"\n" ++"%s claims it is version '%s'.\n" ++"\n" ++"%s requires at least Git 1.5.0 or later.\n" ++"\n" ++"Assume '%s' is version 1.5.0?\n" ++msgstr "" ++"Không thể nhận ra phiên bản của Git.\n" ++"\n" ++"%s nói đây là phiên bản '%s'.\n" ++"\n" ++"%s yêu cầu Git phiên bản từ 1.5.0 hay mới hơn.\n" ++"\n" ++"Cọi '%s' có phiên bản là 1.5.0?\n" ++ ++#: git-gui.sh:1278 ++msgid "Git directory not found:" ++msgstr "Không tìm thấy thư mục git:" ++ ++#: git-gui.sh:1312 ++msgid "Cannot move to top of working directory:" ++msgstr "Không thể di chuyển đến đỉnh của thư mục làm việc:" ++ ++#: git-gui.sh:1320 ++msgid "Cannot use bare repository:" ++msgstr "Không thể dùng kho trần:" ++ ++#: git-gui.sh:1328 ++msgid "No working directory" ++msgstr "Không có thư mục làm việc" ++ ++#: git-gui.sh:1500 lib/checkout_op.tcl:306 ++msgid "Refreshing file status..." ++msgstr "Cập nhật lại trạng thái tập tin..." ++ ++#: git-gui.sh:1560 ++msgid "Scanning for modified files ..." ++msgstr "Đang quét đĩa tìm tập tin thay đổi..." ++ ++#: git-gui.sh:1636 ++msgid "Calling prepare-commit-msg hook..." ++msgstr "Đang gọi móc prepare-commit-msg..." ++ ++#: git-gui.sh:1653 ++msgid "Commit declined by prepare-commit-msg hook." ++msgstr "Lần chuyển giao bị chối từ do móc prepare-commit-msg." ++ ++#: git-gui.sh:1811 lib/browser.tcl:252 ++msgid "Ready." ++msgstr "Sẵn sàng." ++ ++#: git-gui.sh:1969 ++#, tcl-format ++msgid "Displaying only %s of %s files." ++msgstr "Chỉ hiển thị %s trong số %s tập tin." ++ ++#: git-gui.sh:2095 ++msgid "Unmodified" ++msgstr "Không thay đổi gì" ++ ++#: git-gui.sh:2097 ++msgid "Modified, not staged" ++msgstr "Đã sửa nhưng chưa đánh dấu để chuyển giao" ++ ++#: git-gui.sh:2098 git-gui.sh:2110 ++msgid "Staged for commit" ++msgstr "Đánh dấu để chuyển giao" ++ ++#: git-gui.sh:2099 git-gui.sh:2111 ++msgid "Portions staged for commit" ++msgstr "Các phần được đánh dấu là cần chuyển giao" ++ ++#: git-gui.sh:2100 git-gui.sh:2112 ++msgid "Staged for commit, missing" ++msgstr "Đã đánh dấu là cần chuyển giao, thiếu" ++ ++#: git-gui.sh:2102 ++msgid "File type changed, not staged" ++msgstr "Đã đổi kiểu tập tin nhưng chưa được đánh dấu cần chuyển giao" ++ ++#: git-gui.sh:2103 git-gui.sh:2104 ++msgid "File type changed, old type staged for commit" ++msgstr "Đã đổi kiểu tập tin, kiểu cũ đã được đánh dấu cần chuyển giao" ++ ++#: git-gui.sh:2105 ++msgid "File type changed, staged" ++msgstr "Đã đổi kiểu tập tin, đã được đánh dấu cần chuyển giao" ++ ++#: git-gui.sh:2106 ++msgid "File type change staged, modification not staged" ++msgstr "" ++"Thay đổi kiểu tập tin đã được đánh dấu cần chuyển giao, nhưng các thay đổi " ++"thì chưa" ++ ++#: git-gui.sh:2107 ++msgid "File type change staged, file missing" ++msgstr "" ++"Thay đổi kiểu tập tin đã được đánh dấu cần chuyển giao, tập tin bị thiếu" ++ ++#: git-gui.sh:2109 ++msgid "Untracked, not staged" ++msgstr "Chưa được theo dõi, chưa đánh dấu là cần chuyển giao" ++ ++#: git-gui.sh:2114 ++msgid "Missing" ++msgstr "Thiếu" ++ ++#: git-gui.sh:2115 ++msgid "Staged for removal" ++msgstr "Đã đánh dấu là cần gỡ bỏ" ++ ++#: git-gui.sh:2116 ++msgid "Staged for removal, still present" ++msgstr "Đã đánh dấu là cần gỡ bỏ, nhưng vẫn hiện diện" ++ ++#: git-gui.sh:2118 git-gui.sh:2119 git-gui.sh:2120 git-gui.sh:2121 ++#: git-gui.sh:2122 git-gui.sh:2123 ++msgid "Requires merge resolution" ++msgstr "Các yêu cầu phân giải hòa trộn" ++ ++#: git-gui.sh:2158 ++msgid "Starting gitk... please wait..." ++msgstr "Đang khởi động gitk... vui lòng chờ..." ++ ++#: git-gui.sh:2170 ++msgid "Couldn't find gitk in PATH" ++msgstr "Không thể tìm thấy gitk trong PATH" ++ ++#: git-gui.sh:2229 ++msgid "Couldn't find git gui in PATH" ++msgstr "Không thể tìm thấy git gui trong PATH" ++ ++#: git-gui.sh:2648 lib/choose_repository.tcl:40 ++msgid "Repository" ++msgstr "Kho" ++ ++#: git-gui.sh:2649 ++msgid "Edit" ++msgstr "Chỉnh sửa" ++ ++#: git-gui.sh:2651 lib/choose_rev.tcl:567 ++msgid "Branch" ++msgstr "Nhánh" ++ ++#: git-gui.sh:2654 lib/choose_rev.tcl:554 ++msgid "Commit@@noun" ++msgstr "Chuyển giao@@noun" ++ ++#: git-gui.sh:2657 lib/merge.tcl:123 lib/merge.tcl:152 lib/merge.tcl:170 ++msgid "Merge" ++msgstr "Trộn" ++ ++#: git-gui.sh:2658 lib/choose_rev.tcl:563 ++msgid "Remote" ++msgstr "Máy chủ" ++ ++#: git-gui.sh:2661 ++msgid "Tools" ++msgstr "Công cụ" ++ ++#: git-gui.sh:2670 ++msgid "Explore Working Copy" ++msgstr "Quét dò thư mục làm việc" ++ ++#: git-gui.sh:2676 ++msgid "Git Bash" ++msgstr "Git Bash" ++ ++#: git-gui.sh:2686 ++msgid "Browse Current Branch's Files" ++msgstr "Duyệt các Tập tin ở nhánh hiện nay" ++ ++#: git-gui.sh:2690 ++msgid "Browse Branch Files..." ++msgstr "Duyệt các tập tin nhánh..." ++ ++#: git-gui.sh:2695 ++msgid "Visualize Current Branch's History" ++msgstr "Hiển thị trực quan lịch sử nhánh hiện nay" ++ ++#: git-gui.sh:2699 ++msgid "Visualize All Branch History" ++msgstr "Hiển thị trực quan lịch sử mọi nhánh" ++ ++#: git-gui.sh:2706 ++#, tcl-format ++msgid "Browse %s's Files" ++msgstr "Duyệt tập tin của %s..." ++ ++#: git-gui.sh:2708 ++#, tcl-format ++msgid "Visualize %s's History" ++msgstr "Duyệt lịch sử của %s trực quan" ++ ++#: git-gui.sh:2713 lib/database.tcl:40 lib/database.tcl:66 ++msgid "Database Statistics" ++msgstr "Thống kê cơ sở dữ liệu" ++ ++#: git-gui.sh:2716 lib/database.tcl:33 ++msgid "Compress Database" ++msgstr "Nén cơ sở dữ liệu" ++ ++#: git-gui.sh:2719 ++msgid "Verify Database" ++msgstr "Thẩm tra cơ sở dữ liệu" ++ ++#: git-gui.sh:2726 git-gui.sh:2730 git-gui.sh:2734 lib/shortcut.tcl:8 ++#: lib/shortcut.tcl:40 lib/shortcut.tcl:72 ++msgid "Create Desktop Icon" ++msgstr "Tạo lối tắt ở màn hình nền" ++ ++#: git-gui.sh:2742 lib/choose_repository.tcl:192 lib/choose_repository.tcl:200 ++msgid "Quit" ++msgstr "Thoát" ++ ++#: git-gui.sh:2750 ++msgid "Undo" ++msgstr "Hủy lệnh vừa rồi" ++ ++#: git-gui.sh:2753 ++msgid "Redo" ++msgstr "Làm lại" ++ ++#: git-gui.sh:2757 git-gui.sh:3362 ++msgid "Cut" ++msgstr "Cắt" ++ ++#: git-gui.sh:2760 git-gui.sh:3365 git-gui.sh:3439 git-gui.sh:3524 ++#: lib/console.tcl:69 ++msgid "Copy" ++msgstr "Chép" ++ ++#: git-gui.sh:2763 git-gui.sh:3368 ++msgid "Paste" ++msgstr "Dán" ++ ++#: git-gui.sh:2766 git-gui.sh:3371 lib/branch_delete.tcl:28 ++#: lib/remote_branch_delete.tcl:39 ++msgid "Delete" ++msgstr "Xóa bỏ" ++ ++#: git-gui.sh:2770 git-gui.sh:3375 git-gui.sh:3528 lib/console.tcl:71 ++msgid "Select All" ++msgstr "Chọn tất cả" ++ ++#: git-gui.sh:2779 ++msgid "Create..." ++msgstr "Tạo..." ++ ++#: git-gui.sh:2785 ++msgid "Checkout..." ++msgstr "Lấy ra..." ++ ++#: git-gui.sh:2791 ++msgid "Rename..." ++msgstr "Đổi tên..." ++ ++#: git-gui.sh:2796 ++msgid "Delete..." ++msgstr "Xóa..." ++ ++#: git-gui.sh:2801 ++msgid "Reset..." ++msgstr "Đặt lại.." ++ ++#: git-gui.sh:2811 ++msgid "Done" ++msgstr "Xong" ++ ++#: git-gui.sh:2813 ++msgid "Commit@@verb" ++msgstr "Chuyển giao@@verb" ++ ++#: git-gui.sh:2822 git-gui.sh:3303 ++msgid "New Commit" ++msgstr "Lần chuyển giao mới" ++ ++#: git-gui.sh:2830 git-gui.sh:3310 ++msgid "Amend Last Commit" ++msgstr "Tu bổ lần chuyển giao cuối" ++ ++#: git-gui.sh:2840 git-gui.sh:3264 lib/remote_branch_delete.tcl:101 ++msgid "Rescan" ++msgstr "Quét lại" ++ ++#: git-gui.sh:2846 ++msgid "Stage To Commit" ++msgstr "Đưa lên bệ phóng để chuyển giao" ++ ++#: git-gui.sh:2852 ++msgid "Stage Changed Files To Commit" ++msgstr "Đánh dấu các tập tin đã thay đổi cần chuyển giao" ++ ++#: git-gui.sh:2858 ++msgid "Unstage From Commit" ++msgstr "Đưa ra khỏi bệ phóng để không chuyển giao" ++ ++#: git-gui.sh:2864 lib/index.tcl:442 ++msgid "Revert Changes" ++msgstr "Hoàn nguyên các thay đổi" ++ ++#: git-gui.sh:2872 git-gui.sh:3575 git-gui.sh:3606 ++msgid "Show Less Context" ++msgstr "Hiện ít nội dung hơn" ++ ++#: git-gui.sh:2876 git-gui.sh:3579 git-gui.sh:3610 ++msgid "Show More Context" ++msgstr "Hiện chi tiết hơn" ++ ++#: git-gui.sh:2883 git-gui.sh:3277 git-gui.sh:3386 ++msgid "Sign Off" ++msgstr "Ký tên" ++ ++#: git-gui.sh:2899 ++msgid "Local Merge..." ++msgstr "Trộn nội bộ..." ++ ++#: git-gui.sh:2904 ++msgid "Abort Merge..." ++msgstr "Hủy bỏ hòa trộn..." ++ ++#: git-gui.sh:2916 git-gui.sh:2944 ++msgid "Add..." ++msgstr "Thêm..." ++ ++#: git-gui.sh:2920 ++msgid "Push..." ++msgstr "Đẩy lên..." ++ ++#: git-gui.sh:2924 ++msgid "Delete Branch..." ++msgstr "Xoá nhánh..." ++ ++#: git-gui.sh:2934 git-gui.sh:3557 ++msgid "Options..." ++msgstr "Tùy chọn..." ++ ++#: git-gui.sh:2945 ++msgid "Remove..." ++msgstr "Gỡ bỏ..." ++ ++#: git-gui.sh:2954 lib/choose_repository.tcl:54 ++msgid "Help" ++msgstr "Trợ giúp" ++ ++#: git-gui.sh:2958 git-gui.sh:2962 lib/about.tcl:14 ++#: lib/choose_repository.tcl:48 lib/choose_repository.tcl:57 ++#, tcl-format ++msgid "About %s" ++msgstr "Giới thiệu về %s" ++ ++#: git-gui.sh:2986 ++msgid "Online Documentation" ++msgstr "Đọc tài liệu trực tuyến" ++ ++#: git-gui.sh:2989 lib/choose_repository.tcl:51 lib/choose_repository.tcl:60 ++msgid "Show SSH Key" ++msgstr "Hiện khoá SSH" ++ ++#: git-gui.sh:3008 git-gui.sh:3140 ++msgid "Usage" ++msgstr "Cách dùng" ++ ++#: git-gui.sh:3089 lib/blame.tcl:573 ++msgid "Error" ++msgstr "Lỗi" ++ ++#: git-gui.sh:3120 ++#, tcl-format ++msgid "fatal: cannot stat path %s: No such file or directory" ++msgstr "" ++"lỗi nghiêm trọng: không thể lấy thông tin về đường dẫn %s: Không có tập tin " ++"hoặc thư mục như vậy" ++ ++#: git-gui.sh:3153 ++msgid "Current Branch:" ++msgstr "Nhánh hiện hành:" ++ ++#: git-gui.sh:3179 ++msgid "Staged Changes (Will Commit)" ++msgstr "Đánh dấu các thay đổi (Sẽ chuyển giao)" ++ ++#: git-gui.sh:3199 ++msgid "Unstaged Changes" ++msgstr "Bỏ ra khỏi bệ phóng các thay đổi" ++ ++#: git-gui.sh:3270 ++msgid "Stage Changed" ++msgstr "Đặt lên bệ phóng các thay đổi" ++ ++#: git-gui.sh:3289 lib/transport.tcl:137 lib/transport.tcl:229 ++msgid "Push" ++msgstr "Đẩy lên" ++ ++#: git-gui.sh:3324 ++msgid "Initial Commit Message:" ++msgstr "Phần chú thích cho lần chuyển giao khởi tạo:" ++ ++#: git-gui.sh:3325 ++msgid "Amended Commit Message:" ++msgstr "Phần chú giải cho lần chuyển giao tu bổ:" ++ ++#: git-gui.sh:3326 ++msgid "Amended Initial Commit Message:" ++msgstr "Phần chú giải cho lần chuyển giao tu bổ lần khởi tạo:" ++ ++#: git-gui.sh:3327 ++msgid "Amended Merge Commit Message:" ++msgstr "Phần chú giải cho lần chuyển giao tu bổ lần hòa trộn" ++ ++#: git-gui.sh:3328 ++msgid "Merge Commit Message:" ++msgstr "Ghi chú của lần chuyển giao hòa trộn:" ++ ++#: git-gui.sh:3329 ++msgid "Commit Message:" ++msgstr "Chú thích của lần chuyển giao:" ++ ++#: git-gui.sh:3378 git-gui.sh:3532 lib/console.tcl:73 ++msgid "Copy All" ++msgstr "Chép tất cả" ++ ++#: git-gui.sh:3402 lib/blame.tcl:105 ++msgid "File:" ++msgstr "Tập tin:" ++ ++#: git-gui.sh:3520 ++msgid "Refresh" ++msgstr "Làm tươi lại" ++ ++#: git-gui.sh:3541 ++msgid "Decrease Font Size" ++msgstr "Giảm kích cỡ phông" ++ ++#: git-gui.sh:3545 ++msgid "Increase Font Size" ++msgstr "Tăng kích cỡ phông" ++ ++#: git-gui.sh:3553 lib/blame.tcl:294 ++msgid "Encoding" ++msgstr "Bảng mã" ++ ++#: git-gui.sh:3564 ++msgid "Apply/Reverse Hunk" ++msgstr "Áp dụng hay đảo ngược cả khối" ++ ++#: git-gui.sh:3569 ++msgid "Apply/Reverse Line" ++msgstr "Áp dụng hay đảo ngược dòng" ++ ++#: git-gui.sh:3588 ++msgid "Run Merge Tool" ++msgstr "Chạy công cụ hòa trộn" ++ ++#: git-gui.sh:3593 ++msgid "Use Remote Version" ++msgstr "Dùng phiên bản ở máy chủ" ++ ++#: git-gui.sh:3597 ++msgid "Use Local Version" ++msgstr "Dùng phiên bản ở máy nội bộ" ++ ++#: git-gui.sh:3601 ++msgid "Revert To Base" ++msgstr "Trở lại cơ bản" ++ ++#: git-gui.sh:3619 ++msgid "Visualize These Changes In The Submodule" ++msgstr "Hiển thị trực quan các thay đổi trong mô-đun con" ++ ++#: git-gui.sh:3623 ++msgid "Visualize Current Branch History In The Submodule" ++msgstr "Hiển thị trực quan lịch sử nhánh hiện tại trong mô-đun con" ++ ++#: git-gui.sh:3627 ++msgid "Visualize All Branch History In The Submodule" ++msgstr "Hiển thị trực quan lịch sử mọi nhánh trong mô-đun con" ++ ++#: git-gui.sh:3632 ++msgid "Start git gui In The Submodule" ++msgstr "Khởi chạy git gui trong mô-đun-con" ++ ++#: git-gui.sh:3667 ++msgid "Unstage Hunk From Commit" ++msgstr "Bỏ đánh dấu đoạn cần chuyển giao" ++ ++#: git-gui.sh:3669 ++msgid "Unstage Lines From Commit" ++msgstr "Bỏ đánh dấu các dòng cần chuyển giao" ++ ++#: git-gui.sh:3671 ++msgid "Unstage Line From Commit" ++msgstr "Bỏ đánh dấu dòng cần chuyển giao" ++ ++#: git-gui.sh:3674 ++msgid "Stage Hunk For Commit" ++msgstr "Đánh dấu đoạn cần chuyển giao" ++ ++#: git-gui.sh:3676 ++msgid "Stage Lines For Commit" ++msgstr "Đánh dấu các dòng cần chuyển giao" ++ ++#: git-gui.sh:3678 ++msgid "Stage Line For Commit" ++msgstr "Đánh dấu dòng cần chuyển giao" ++ ++#: git-gui.sh:3703 ++msgid "Initializing..." ++msgstr "Đang khởi tạo..." ++ ++#: git-gui.sh:3846 ++#, tcl-format ++msgid "" ++"Possible environment issues exist.\n" ++"\n" ++"The following environment variables are probably\n" ++"going to be ignored by any Git subprocess run\n" ++"by %s:\n" ++"\n" ++msgstr "" ++"Gần như chắc chắn là môi trường tồn tại.\n" ++"\n" ++"Các biến môi trường sau đây có lẽ sẽ bị bỏ qua bởi các tiến trình con git\n" ++"chạy bởi %s:\n" ++"\n" ++ ++#: git-gui.sh:3875 ++msgid "" ++"\n" ++"This is due to a known issue with the\n" ++"Tcl binary distributed by Cygwin." ++msgstr "" ++"\n" ++"Cái này có nguyên nhân bởi một lỗi phát ra từ\n" ++"Tcl phân phối bởi Cygwin." ++ ++#: git-gui.sh:3880 ++#, tcl-format ++msgid "" ++"\n" ++"\n" ++"A good replacement for %s\n" ++"is placing values for the user.name and\n" ++"user.email settings into your personal\n" ++"~/.gitconfig file.\n" ++msgstr "" ++"\n" ++"\n" ++"Thay thế tốt cho %s\n" ++"là thay thế các giá trị cài đặt cho user.name và\n" ++"user.email thành tập tin cá nhân của bạn\n" ++"~/.gitconfig.\n" ++ ++#: lib/about.tcl:26 ++msgid "git-gui - a graphical user interface for Git." ++msgstr "git-gui - công cụ đồ họa dành cho Git." ++ ++#: lib/blame.tcl:73 ++msgid "File Viewer" ++msgstr "Bộ Xem Tập Tin" ++ ++#: lib/blame.tcl:79 ++msgid "Commit:" ++msgstr "Lần chuyển giao:" ++ ++#: lib/blame.tcl:280 ++msgid "Copy Commit" ++msgstr "Chép lần chuyển giao" ++ ++#: lib/blame.tcl:284 ++msgid "Find Text..." ++msgstr "Tìm chữ..." ++ ++#: lib/blame.tcl:288 ++msgid "Goto Line..." ++msgstr "Nhảy đến dòng..." ++ ++#: lib/blame.tcl:297 ++msgid "Do Full Copy Detection" ++msgstr "Thực hiện dò tìm chép toàn bộ" ++ ++#: lib/blame.tcl:301 ++msgid "Show History Context" ++msgstr "Hiển thị nội dung của lịch sử" ++ ++#: lib/blame.tcl:304 ++msgid "Blame Parent Commit" ++msgstr "Xem công trạng của lần chuyển giao cha mẹ" ++ ++#: lib/blame.tcl:466 ++#, tcl-format ++msgid "Reading %s..." ++msgstr "Đang đọc %s..." ++ ++#: lib/blame.tcl:594 ++msgid "Loading copy/move tracking annotations..." ++msgstr "Đang tải phần chú giải theo dõi chép/chuyển..." ++ ++#: lib/blame.tcl:614 ++msgid "lines annotated" ++msgstr "dòng chú giải" ++ ++#: lib/blame.tcl:806 ++msgid "Loading original location annotations..." ++msgstr "Đang tải các chú giải vị trí nguyên gốc..." ++ ++#: lib/blame.tcl:809 ++msgid "Annotation complete." ++msgstr "Chú giải hoàn tất." ++ ++#: lib/blame.tcl:839 ++msgid "Busy" ++msgstr "Bận" ++ ++#: lib/blame.tcl:840 ++msgid "Annotation process is already running." ++msgstr "Tiến trình chú giải đang diễn ra." ++ ++#: lib/blame.tcl:879 ++msgid "Running thorough copy detection..." ++msgstr "Đang chạy dò tìm sao chép toàn diện..." ++ ++#: lib/blame.tcl:947 ++msgid "Loading annotation..." ++msgstr "Đang tải phần chú giải..." ++ ++#: lib/blame.tcl:1000 ++msgid "Author:" ++msgstr "Tác giả:" ++ ++#: lib/blame.tcl:1004 ++msgid "Committer:" ++msgstr "Người chuyển giao:" ++ ++#: lib/blame.tcl:1009 ++msgid "Original File:" ++msgstr "Tập tin gốc:" ++ ++#: lib/blame.tcl:1057 ++msgid "Cannot find HEAD commit:" ++msgstr "Không thể tìm thấy HEAD của lần chuyển giao:" ++ ++#: lib/blame.tcl:1112 ++msgid "Cannot find parent commit:" ++msgstr "Không thể tìm thấy lần chuyển giao mẹ:" ++ ++#: lib/blame.tcl:1127 ++msgid "Unable to display parent" ++msgstr "Không thể hiển thị cha mẹ" ++ ++#: lib/blame.tcl:1128 lib/diff.tcl:341 ++msgid "Error loading diff:" ++msgstr "Gặp lỗi khi tải diff:" ++ ++#: lib/blame.tcl:1269 ++msgid "Originally By:" ++msgstr "Nguyên gốc bởi:" ++ ++#: lib/blame.tcl:1275 ++msgid "In File:" ++msgstr "Trong tập tin:" ++ ++#: lib/blame.tcl:1280 ++msgid "Copied Or Moved Here By:" ++msgstr "Đã chép hoặc Di chuyển đến đây bởi:" ++ ++#: lib/branch_checkout.tcl:16 lib/branch_checkout.tcl:21 ++msgid "Checkout Branch" ++msgstr "Lấy ra nhánh" ++ ++#: lib/branch_checkout.tcl:26 ++msgid "Checkout" ++msgstr "Lấy ra" ++ ++#: lib/branch_checkout.tcl:30 lib/branch_create.tcl:37 ++#: lib/branch_delete.tcl:34 lib/branch_rename.tcl:32 lib/browser.tcl:292 ++#: lib/checkout_op.tcl:579 lib/choose_font.tcl:45 lib/merge.tcl:174 ++#: lib/option.tcl:127 lib/remote_add.tcl:34 lib/remote_branch_delete.tcl:43 ++#: lib/tools_dlg.tcl:41 lib/tools_dlg.tcl:202 lib/tools_dlg.tcl:345 ++#: lib/transport.tcl:141 ++msgid "Cancel" ++msgstr "Thôi" ++ ++#: lib/branch_checkout.tcl:35 lib/browser.tcl:297 lib/tools_dlg.tcl:321 ++msgid "Revision" ++msgstr "Điểm sửa đổi" ++ ++#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:69 lib/option.tcl:309 ++msgid "Options" ++msgstr "Tùy chọn" ++ ++#: lib/branch_checkout.tcl:42 lib/branch_create.tcl:92 ++msgid "Fetch Tracking Branch" ++msgstr "Lấy về nhánh được theo dõi" ++ ++#: lib/branch_checkout.tcl:47 ++msgid "Detach From Local Branch" ++msgstr "Tách rời từ Nhánh nội bộ" ++ ++#: lib/branch_create.tcl:23 ++msgid "Create Branch" ++msgstr "Tạo nhánh" ++ ++#: lib/branch_create.tcl:28 ++msgid "Create New Branch" ++msgstr "Tạo nhánh mới" ++ ++#: lib/branch_create.tcl:33 lib/choose_repository.tcl:391 ++msgid "Create" ++msgstr "Tạo" ++ ++#: lib/branch_create.tcl:42 ++msgid "Branch Name" ++msgstr "Tên nhánh" ++ ++#: lib/branch_create.tcl:44 lib/remote_add.tcl:41 lib/tools_dlg.tcl:51 ++msgid "Name:" ++msgstr "Tên:" ++ ++#: lib/branch_create.tcl:57 ++msgid "Match Tracking Branch Name" ++msgstr "Khớp với tên nhánh được theo dõi" ++ ++#: lib/branch_create.tcl:66 ++msgid "Starting Revision" ++msgstr "Điểm đầu" ++ ++#: lib/branch_create.tcl:72 ++msgid "Update Existing Branch:" ++msgstr "Cập nhật nhánh sẵn có:" ++ ++#: lib/branch_create.tcl:75 ++msgid "No" ++msgstr "Không" ++ ++#: lib/branch_create.tcl:80 ++msgid "Fast Forward Only" ++msgstr "Chỉ fast-forward" ++ ++#: lib/branch_create.tcl:85 lib/checkout_op.tcl:571 ++msgid "Reset" ++msgstr "Đặt lại" ++ ++#: lib/branch_create.tcl:97 ++msgid "Checkout After Creation" ++msgstr "Lấy ra sau khi tạo" ++ ++#: lib/branch_create.tcl:132 ++msgid "Please select a tracking branch." ++msgstr "Vui lòng chọn nhánh theo dõi." ++ ++#: lib/branch_create.tcl:141 ++#, tcl-format ++msgid "Tracking branch %s is not a branch in the remote repository." ++msgstr "Nhánh theo dõi %s không phải là một nhánh trên kho chứa máy chủ." ++ ++#: lib/branch_create.tcl:154 lib/branch_rename.tcl:92 ++msgid "Please supply a branch name." ++msgstr "Hãy cung cấp tên nhánh." ++ ++#: lib/branch_create.tcl:165 lib/branch_rename.tcl:112 ++#, tcl-format ++msgid "'%s' is not an acceptable branch name." ++msgstr "'%s' không phải là một tên nhánh được chấp nhận." ++ ++#: lib/branch_delete.tcl:16 ++msgid "Delete Branch" ++msgstr "Xoá nhánh" ++ ++#: lib/branch_delete.tcl:21 ++msgid "Delete Local Branch" ++msgstr "Xóa nhánh nội bộ" ++ ++#: lib/branch_delete.tcl:39 ++msgid "Local Branches" ++msgstr "Nhánh nội bộ" ++ ++#: lib/branch_delete.tcl:51 ++msgid "Delete Only If Merged Into" ++msgstr "Chỉ xóa nếu đã hòa trộn vào" ++ ++#: lib/branch_delete.tcl:53 lib/remote_branch_delete.tcl:120 ++msgid "Always (Do not perform merge checks)" ++msgstr "Luôn (Không thực hiện kiểm tra hòa trộn)" ++ ++#: lib/branch_delete.tcl:103 ++#, tcl-format ++msgid "The following branches are not completely merged into %s:" ++msgstr "Các nhánh sau đây không được hòa trộn hoàn toàn vào %s:" ++ ++#: lib/branch_delete.tcl:115 lib/remote_branch_delete.tcl:218 ++msgid "" ++"Recovering deleted branches is difficult.\n" ++"\n" ++"Delete the selected branches?" ++msgstr "" ++"Khôi phục các nhánh đã bị xóa là việc khó khăn.\n" ++"\n" ++"Xóa nhánh đã chọn chứ?" ++ ++#: lib/branch_delete.tcl:141 ++#, tcl-format ++msgid "" ++"Failed to delete branches:\n" ++"%s" ++msgstr "" ++"Gặp lỗi khi xóa các nhánh:\n" ++"%s" ++ ++#: lib/branch_rename.tcl:15 lib/branch_rename.tcl:23 ++msgid "Rename Branch" ++msgstr "Đổi tên nhánh" ++ ++#: lib/branch_rename.tcl:28 ++msgid "Rename" ++msgstr "Đổi tên" ++ ++#: lib/branch_rename.tcl:38 ++msgid "Branch:" ++msgstr "Nhánh:" ++ ++#: lib/branch_rename.tcl:46 ++msgid "New Name:" ++msgstr "Tên mới:" ++ ++#: lib/branch_rename.tcl:81 ++msgid "Please select a branch to rename." ++msgstr "Hãy chọn nhánh cần đổi tên." ++ ++#: lib/branch_rename.tcl:102 lib/checkout_op.tcl:202 ++#, tcl-format ++msgid "Branch '%s' already exists." ++msgstr "Nhánh '%s' đã có rồi." ++ ++#: lib/branch_rename.tcl:123 ++#, tcl-format ++msgid "Failed to rename '%s'." ++msgstr "Gặp lỗi khi đổi tên '%s'." ++ ++#: lib/browser.tcl:17 ++msgid "Starting..." ++msgstr "Đang khởi động..." ++ ++#: lib/browser.tcl:27 ++msgid "File Browser" ++msgstr "Bộ duyệt tập tin" ++ ++#: lib/browser.tcl:132 lib/browser.tcl:149 ++#, tcl-format ++msgid "Loading %s..." ++msgstr "Đang tải %s..." ++ ++#: lib/browser.tcl:193 ++msgid "[Up To Parent]" ++msgstr "[Tới cha mẹ]" ++ ++#: lib/browser.tcl:275 lib/browser.tcl:282 ++msgid "Browse Branch Files" ++msgstr "Duyệt các tập tin nhánh" ++ ++#: lib/browser.tcl:288 lib/choose_repository.tcl:406 ++#: lib/choose_repository.tcl:493 lib/choose_repository.tcl:502 ++#: lib/choose_repository.tcl:1029 ++msgid "Browse" ++msgstr "Tìm duyệt" ++ ++#: lib/checkout_op.tcl:85 ++#, tcl-format ++msgid "Fetching %s from %s" ++msgstr "Đang lấy về %s từ %s" ++ ++#: lib/checkout_op.tcl:133 ++#, tcl-format ++msgid "fatal: Cannot resolve %s" ++msgstr "gặp lỗi nghiêm trọng: Không thể phân giải %s" ++ ++#: lib/checkout_op.tcl:146 lib/console.tcl:81 lib/database.tcl:30 ++#: lib/sshkey.tcl:55 ++msgid "Close" ++msgstr "Đóng" ++ ++#: lib/checkout_op.tcl:175 ++#, tcl-format ++msgid "Branch '%s' does not exist." ++msgstr "Chưa có nhánh '%s'" ++ ++#: lib/checkout_op.tcl:194 ++#, tcl-format ++msgid "Failed to configure simplified git-pull for '%s'." ++msgstr "Gặp lỗi khi cấu hình git-pull đơn giản dành cho '%s'." ++ ++#: lib/checkout_op.tcl:229 ++#, tcl-format ++msgid "" ++"Branch '%s' already exists.\n" ++"\n" ++"It cannot fast-forward to %s.\n" ++"A merge is required." ++msgstr "" ++"Nhánh '%s' đã sẵn có.\n" ++"\n" ++"Không thể fast-forward thành %s.\n" ++"Bạn cần phải hòa trộn." ++ ++#: lib/checkout_op.tcl:243 ++#, tcl-format ++msgid "Merge strategy '%s' not supported." ++msgstr "Không hỗ trợ chiến lược hòa trộn '%s'." ++ ++#: lib/checkout_op.tcl:262 ++#, tcl-format ++msgid "Failed to update '%s'." ++msgstr "Gặp lỗi khi cập nhật '%s'." ++ ++#: lib/checkout_op.tcl:274 ++msgid "Staging area (index) is already locked." ++msgstr "Vùng bệ phóng (chỉ mục) đã bị khóa rồi." ++ ++#: lib/checkout_op.tcl:289 ++msgid "" ++"Last scanned state does not match repository state.\n" ++"\n" ++"Another Git program has modified this repository since the last scan. A " ++"rescan must be performed before the current branch can be changed.\n" ++"\n" ++"The rescan will be automatically started now.\n" ++msgstr "" ++"Trạng thái quét không khớp với trạng thái kho.\n" ++"\n" ++"Có Git khác đã sửa kho này kể từ lần quét cuối. Cần quét lại trước khi thực " ++"hiện việc chuyển nhánh.\n" ++"\n" ++"Sẽ thực hiện việc quét lại ngay bây giời.\n" ++ ++#: lib/checkout_op.tcl:345 ++#, tcl-format ++msgid "Updating working directory to '%s'..." ++msgstr "Cập nhật thư mục làm việc thành '%s'..." ++ ++#: lib/checkout_op.tcl:346 ++msgid "files checked out" ++msgstr "các tập tin cần lấy ra" ++ ++#: lib/checkout_op.tcl:376 ++#, tcl-format ++msgid "Aborted checkout of '%s' (file level merging is required)." ++msgstr "Hủy bỏ lấy ra '%s' (cần hòa trộn mức tập tin)." ++ ++#: lib/checkout_op.tcl:377 ++msgid "File level merge required." ++msgstr "Cần mức hòa trộn tập tin." ++ ++#: lib/checkout_op.tcl:381 ++#, tcl-format ++msgid "Staying on branch '%s'." ++msgstr "Đang ở trên nhánh '%s'." ++ ++#: lib/checkout_op.tcl:452 ++msgid "" ++"You are no longer on a local branch.\n" ++"\n" ++"If you wanted to be on a branch, create one now starting from 'This Detached " ++"Checkout'." ++msgstr "" ++"Bạn hiện không còn ở nhánh nội bộ.\n" ++"\n" ++"Nếu bạn muốn trên một nhánh, hãy tạo một cái từ 'Đây là lấy ra tách rời'." ++ ++#: lib/checkout_op.tcl:503 lib/checkout_op.tcl:507 ++#, tcl-format ++msgid "Checked out '%s'." ++msgstr "Đã lấy ra '%s'." ++ ++#: lib/checkout_op.tcl:535 ++#, tcl-format ++msgid "Resetting '%s' to '%s' will lose the following commits:" ++msgstr "Đặt lại '%s' thành '%s' sẽ làm mất những lần chuyển giao sau đây:" ++ ++#: lib/checkout_op.tcl:557 ++msgid "Recovering lost commits may not be easy." ++msgstr "Lấy lại những lần chuyển giao đã mất là không dễ." ++ ++#: lib/checkout_op.tcl:562 ++#, tcl-format ++msgid "Reset '%s'?" ++msgstr "Đặt lại '%s'?" ++ ++#: lib/checkout_op.tcl:567 lib/merge.tcl:166 lib/tools_dlg.tcl:336 ++msgid "Visualize" ++msgstr "Trực quan" ++ ++#: lib/checkout_op.tcl:635 ++#, tcl-format ++msgid "" ++"Failed to set current branch.\n" ++"\n" ++"This working directory is only partially switched. We successfully updated " ++"your files, but failed to update an internal Git file.\n" ++"\n" ++"This should not have occurred. %s will now close and give up." ++msgstr "" ++"Gặp lỗi khi đặt nhánh hiện hành.\n" ++"\n" ++"Thư mục làm việc chỉ chuyển không hoàn toàn. Chúng tôi cập nhật thành công " ++"các tập tin của bạn, nhưng lại gặp lỗi khi cập nhật một tập tin của Git.\n" ++"\n" ++"Điều này đáng lẽ không thể xảy ra. %s giờ sẽ đóng lại và đầu hàng." ++ ++#: lib/choose_font.tcl:41 ++msgid "Select" ++msgstr "Chọn" ++ ++#: lib/choose_font.tcl:55 ++msgid "Font Family" ++msgstr "Họ phông chữ" ++ ++#: lib/choose_font.tcl:76 ++msgid "Font Size" ++msgstr "Cỡ phông chữ" ++ ++#: lib/choose_font.tcl:93 ++msgid "Font Example" ++msgstr "Phông chữ ví dụ" ++ ++#: lib/choose_font.tcl:105 ++msgid "" ++"This is example text.\n" ++"If you like this text, it can be your font." ++msgstr "" ++"Đây là chữ mẫu.\n" ++"Nếu bạn thích chữ như thế này thì chọn phông chữ này." ++ ++#: lib/choose_repository.tcl:32 ++msgid "Git Gui" ++msgstr "Git Gui" ++ ++#: lib/choose_repository.tcl:91 lib/choose_repository.tcl:396 ++msgid "Create New Repository" ++msgstr "Tạo kho mới" ++ ++#: lib/choose_repository.tcl:97 ++msgid "New..." ++msgstr "Mới..." ++ ++#: lib/choose_repository.tcl:104 lib/choose_repository.tcl:480 ++msgid "Clone Existing Repository" ++msgstr "Nhân bản một kho sẵn có" ++ ++#: lib/choose_repository.tcl:115 ++msgid "Clone..." ++msgstr "Nhân bản..." ++ ++#: lib/choose_repository.tcl:122 lib/choose_repository.tcl:1019 ++msgid "Open Existing Repository" ++msgstr "Mở một kho đã có." ++ ++#: lib/choose_repository.tcl:128 ++msgid "Open..." ++msgstr "Mở..." ++ ++#: lib/choose_repository.tcl:141 ++msgid "Recent Repositories" ++msgstr "Các kho mới dùng" ++ ++#: lib/choose_repository.tcl:147 ++msgid "Open Recent Repository:" ++msgstr "Mở kho mới dùng:" ++ ++#: lib/choose_repository.tcl:315 lib/choose_repository.tcl:322 ++#: lib/choose_repository.tcl:329 ++#, tcl-format ++msgid "Failed to create repository %s:" ++msgstr "Gặp lỗi khi tạo kho %s:" ++ ++#: lib/choose_repository.tcl:401 ++msgid "Directory:" ++msgstr "Thư mục:" ++ ++#: lib/choose_repository.tcl:431 lib/choose_repository.tcl:552 ++#: lib/choose_repository.tcl:1053 ++msgid "Git Repository" ++msgstr "Kho Git" ++ ++#: lib/choose_repository.tcl:456 ++#, tcl-format ++msgid "Directory %s already exists." ++msgstr "Thư mục %s đã sẵn có." ++ ++#: lib/choose_repository.tcl:460 ++#, tcl-format ++msgid "File %s already exists." ++msgstr "Tập tin %s đã có sẵn." ++ ++#: lib/choose_repository.tcl:475 ++msgid "Clone" ++msgstr "Nhân bản" ++ ++#: lib/choose_repository.tcl:488 ++msgid "Source Location:" ++msgstr "Vị trí nguồn:" ++ ++#: lib/choose_repository.tcl:497 ++msgid "Target Directory:" ++msgstr "Thư mục đích:" ++ ++#: lib/choose_repository.tcl:507 ++msgid "Clone Type:" ++msgstr "Kiểu nhân bản:" ++ ++#: lib/choose_repository.tcl:512 ++msgid "Standard (Fast, Semi-Redundant, Hardlinks)" ++msgstr "Tiêu chuẩn (Nhanh, Semi-Redundant, Hardlinks)" ++ ++#: lib/choose_repository.tcl:517 ++msgid "Full Copy (Slower, Redundant Backup)" ++msgstr "Sao chép toàn bộ (Chậm hơn, Redundant Backup)" ++ ++#: lib/choose_repository.tcl:522 ++msgid "Shared (Fastest, Not Recommended, No Backup)" ++msgstr "Chia sẻ (Nhanh nhất, Không nên dùng, No Backup)" ++ ++#: lib/choose_repository.tcl:558 lib/choose_repository.tcl:605 ++#: lib/choose_repository.tcl:751 lib/choose_repository.tcl:821 ++#: lib/choose_repository.tcl:1059 lib/choose_repository.tcl:1067 ++#, tcl-format ++msgid "Not a Git repository: %s" ++msgstr "Không phải là kho git: %s" ++ ++#: lib/choose_repository.tcl:594 ++msgid "Standard only available for local repository." ++msgstr "Tiêu chuẩn chỉ sẵn sàng với kho nội bộ." ++ ++#: lib/choose_repository.tcl:598 ++msgid "Shared only available for local repository." ++msgstr "'Chia sẻ' chỉ sẵn sàng với kho nội bộ." ++ ++#: lib/choose_repository.tcl:619 ++#, tcl-format ++msgid "Location %s already exists." ++msgstr "Miền địa phương %s đã sẵn có." ++ ++#: lib/choose_repository.tcl:630 ++msgid "Failed to configure origin" ++msgstr "Gặp lỗi khi cấu hình bản gốc" ++ ++#: lib/choose_repository.tcl:642 ++msgid "Counting objects" ++msgstr "Đang đếm số đối tượng" ++ ++#: lib/choose_repository.tcl:643 ++msgid "buckets" ++msgstr "xô" ++ ++#: lib/choose_repository.tcl:667 ++#, tcl-format ++msgid "Unable to copy objects/info/alternates: %s" ++msgstr "Không thể sao chép objects/info/alternates: %s" ++ ++#: lib/choose_repository.tcl:703 ++#, tcl-format ++msgid "Nothing to clone from %s." ++msgstr "Không có gì để nhân bản từ %s" ++ ++#: lib/choose_repository.tcl:705 lib/choose_repository.tcl:919 ++#: lib/choose_repository.tcl:931 ++msgid "The 'master' branch has not been initialized." ++msgstr "Nhánh 'master' chưa được khởi tạo." ++ ++#: lib/choose_repository.tcl:718 ++msgid "Hardlinks are unavailable. Falling back to copying." ++msgstr "Liên kết cứng không sẵn sàng. Trở lại chế độ sao chép." ++ ++#: lib/choose_repository.tcl:730 ++#, tcl-format ++msgid "Cloning from %s" ++msgstr "Đang nhân bản từ %s" ++ ++#: lib/choose_repository.tcl:761 ++msgid "Copying objects" ++msgstr "Đang chép các đối tượng" ++ ++#: lib/choose_repository.tcl:762 ++msgid "KiB" ++msgstr "KiB" ++ ++#: lib/choose_repository.tcl:786 ++#, tcl-format ++msgid "Unable to copy object: %s" ++msgstr "Không thể chép đối tượng: %s" ++ ++#: lib/choose_repository.tcl:796 ++msgid "Linking objects" ++msgstr "Đang liên kết các đối tượng" ++ ++#: lib/choose_repository.tcl:797 ++msgid "objects" ++msgstr "đối tượng" ++ ++#: lib/choose_repository.tcl:805 ++#, tcl-format ++msgid "Unable to hardlink object: %s" ++msgstr "Không thể tạo liên kết cứng đối tượng: %s" ++ ++#: lib/choose_repository.tcl:860 ++msgid "Cannot fetch branches and objects. See console output for details." ++msgstr "" ++"Không thể lấy các nhánh và đối tượng. Xem kết xuất từ bảng điều khiển để có " ++"thêm thông tin." ++ ++#: lib/choose_repository.tcl:871 ++msgid "Cannot fetch tags. See console output for details." ++msgstr "" ++"Không thể lấy về các thẻ. Hãy xem kết xuất từ bảng điều khiển để có thêm " ++"thông tin chi tiết." ++ ++#: lib/choose_repository.tcl:895 ++msgid "Cannot determine HEAD. See console output for details." ++msgstr "" ++"Không thể dò tìm HEAD. Hãy xem kết xuất từ bảng điều khiển để có thêm thông " ++"tin chi tiết." ++ ++#: lib/choose_repository.tcl:904 ++#, tcl-format ++msgid "Unable to cleanup %s" ++msgstr "Không thể dọn sạch %s" ++ ++#: lib/choose_repository.tcl:910 ++msgid "Clone failed." ++msgstr "Gặp lỗi khi nhân bản." ++ ++#: lib/choose_repository.tcl:917 ++msgid "No default branch obtained." ++msgstr "Không tìm thấy nhánh mặc định." ++ ++#: lib/choose_repository.tcl:928 ++#, tcl-format ++msgid "Cannot resolve %s as a commit." ++msgstr "Không thể phân giải %s như là một lần chuyển giao." ++ ++#: lib/choose_repository.tcl:940 ++msgid "Creating working directory" ++msgstr "Đang tạo thư mục làm việc" ++ ++#: lib/choose_repository.tcl:941 lib/index.tcl:70 lib/index.tcl:136 ++#: lib/index.tcl:207 ++msgid "files" ++msgstr "tập tin" ++ ++#: lib/choose_repository.tcl:970 ++msgid "Initial file checkout failed." ++msgstr "Lấy ra tập tin khởi tạo gặp lỗi." ++ ++#: lib/choose_repository.tcl:1014 ++msgid "Open" ++msgstr "Mở" ++ ++#: lib/choose_repository.tcl:1024 ++msgid "Repository:" ++msgstr "Kho:" ++ ++#: lib/choose_repository.tcl:1073 ++#, tcl-format ++msgid "Failed to open repository %s:" ++msgstr "Gặp lỗi khi mở kho %s:" ++ ++#: lib/choose_rev.tcl:52 ++msgid "This Detached Checkout" ++msgstr "Đây là việc lấy ra bị tách rời" ++ ++#: lib/choose_rev.tcl:60 ++msgid "Revision Expression:" ++msgstr "Biểu thức điểm xét:" ++ ++#: lib/choose_rev.tcl:72 ++msgid "Local Branch" ++msgstr "Nhánh nội bộ" ++ ++#: lib/choose_rev.tcl:77 ++msgid "Tracking Branch" ++msgstr "Nhánh Theo dõi" ++ ++#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:544 ++msgid "Tag" ++msgstr "Thẻ" ++ ++#: lib/choose_rev.tcl:321 ++#, tcl-format ++msgid "Invalid revision: %s" ++msgstr "Điểm xét duyệt không hợp lệ: %s" ++ ++#: lib/choose_rev.tcl:342 ++msgid "No revision selected." ++msgstr "Chưa chọn điểm xét duyệt." ++ ++#: lib/choose_rev.tcl:350 ++msgid "Revision expression is empty." ++msgstr "Biểu thức chính quy rỗng." ++ ++#: lib/choose_rev.tcl:537 ++msgid "Updated" ++msgstr "Đã cập nhật" ++ ++#: lib/choose_rev.tcl:565 ++msgid "URL" ++msgstr "URL" ++ ++#: lib/commit.tcl:9 ++msgid "" ++"There is nothing to amend.\n" ++"\n" ++"You are about to create the initial commit. There is no commit before this " ++"to amend.\n" ++msgstr "" ++"Ở đây chẳng có gì để tu bổ cả.\n" ++"\n" ++"Bạn đang tạo lần chuyển giao khởi tạo. Ở đây không có lần chuyển giao trước " ++"nào để mà tu bổ.\n" ++ ++#: lib/commit.tcl:18 ++msgid "" ++"Cannot amend while merging.\n" ++"\n" ++"You are currently in the middle of a merge that has not been fully " ++"completed. You cannot amend the prior commit unless you first abort the " ++"current merge activity.\n" ++msgstr "" ++"Không thể tu bổ trong khi hòa trộn.\n" ++"\n" ++"Bạn hiện đang ở giữa quá trình hòa trôn, mà nó chưa hoàn tất. Bạn không thể " ++"tu bổ lần chuyển giao tiền nhiệm trừ phi bạn bãi bỏ lần hòa trộn hiện đang " ++"kích hoạt.\n" ++ ++#: lib/commit.tcl:48 ++msgid "Error loading commit data for amend:" ++msgstr "Gặp lỗi khi tải dữ liệu chuyển giao cho lệnh tu bổ:" ++ ++#: lib/commit.tcl:75 ++msgid "Unable to obtain your identity:" ++msgstr "Không thể lấy được định danh của bạn:" ++ ++#: lib/commit.tcl:80 ++msgid "Invalid GIT_COMMITTER_IDENT:" ++msgstr "GIT_COMMITTER_IDENT không hợp lệ:" ++ ++#: lib/commit.tcl:129 ++#, tcl-format ++msgid "warning: Tcl does not support encoding '%s'." ++msgstr "cảnh báo: Tcl không hỗ trợ bảng mã '%s'." ++ ++#: lib/commit.tcl:149 ++msgid "" ++"Last scanned state does not match repository state.\n" ++"\n" ++"Another Git program has modified this repository since the last scan. A " ++"rescan must be performed before another commit can be created.\n" ++"\n" ++"The rescan will be automatically started now.\n" ++msgstr "" ++"Trạng thái quét không khớp với trạng thái kho.\n" ++"\n" ++"Có Git khác đã sửa kho này kể từ lần quét cuối. Cần quét lại trước khi thực " ++"hiện việc chuyển giao khác.\n" ++"\n" ++"Sẽ thực hiện việc quét lại ngay bây giời.\n" ++ ++#: lib/commit.tcl:173 ++#, tcl-format ++msgid "" ++"Unmerged files cannot be committed.\n" ++"\n" ++"File %s has merge conflicts. You must resolve them and stage the file " ++"before committing.\n" ++msgstr "" ++"Các tập tin chưa hòa trộn không thể được chuyển giao.\n" ++"\n" ++"Tập tin %s có xung đột hòa trộn. Bạn phải giải quyết chúng và đưa lên bệ " ++"phóng trước khi chuyển giao.\n" ++ ++#: lib/commit.tcl:181 ++#, tcl-format ++msgid "" ++"Unknown file state %s detected.\n" ++"\n" ++"File %s cannot be committed by this program.\n" ++msgstr "" ++"Tìm thấy trạng thái tập tim không hiểu %s.\n" ++"\n" ++"Tập tin %s không thể được chuyển giao bởi chương trình này.\n" ++ ++#: lib/commit.tcl:189 ++msgid "" ++"No changes to commit.\n" ++"\n" ++"You must stage at least 1 file before you can commit.\n" ++msgstr "" ++"Không có thay đổi nào cần chuyển giao.\n" ++"\n" ++"Bạn phải đưa lên bệ phóng ít nhất là một tập tin trước khi có thể chuyển " ++"giao.\n" ++ ++#: lib/commit.tcl:204 ++msgid "" ++"Please supply a commit message.\n" ++"\n" ++"A good commit message has the following format:\n" ++"\n" ++"- First line: Describe in one sentence what you did.\n" ++"- Second line: Blank\n" ++"- Remaining lines: Describe why this change is good.\n" ++msgstr "" ++"Hãy cung cấp lời chú giải cho lần chuyển giao.\n" ++"\n" ++"Lời chú giải tốt nhất nên có định dạng sau:\n" ++"\n" ++"- Dòng đầu tiên: Mô tả những gì bạn đã làm.\n" ++"- Dòng thứ hai: Để trống\n" ++"- Các dòng còn lại: Mô tả xem vì sao những thay đổi này là cần thiết.\n" ++ ++#: lib/commit.tcl:235 ++msgid "Calling pre-commit hook..." ++msgstr "Đang gọi móc (hook) pre-commit..." ++ ++#: lib/commit.tcl:250 ++msgid "Commit declined by pre-commit hook." ++msgstr "Lần chuyển giao bị khước từ do móc pre-commit." ++ ++#: lib/commit.tcl:269 ++msgid "" ++"You are about to commit on a detached head. This is a potentially dangerous " ++"thing to do because if you switch to another branch you will lose your " ++"changes and it can be difficult to retrieve them later from the reflog. You " ++"should probably cancel this commit and create a new branch to continue.\n" ++" \n" ++" Do you really want to proceed with your Commit?" ++msgstr "" ++"Bạn thực hiện chuyển giao ở chỗ đã tách rời khỏi các đầu. Điều này là nguy " ++"hiểm bởi nếu bạn chuyển sang nhánh khác thì bạn sẽ mất những thay đổi này và " ++"việc lấy lại chúng từ reflog cũng khó khăn. Bạn gần như chắc chắn là nên hủy " ++"bỏ lần chuyển giao này và tạo một nhánh mới trước khi tiếp tục.\n" ++" \n" ++" Bạn có thực sự muốn tiếp tục chuyển giao?" ++ ++#: lib/commit.tcl:290 ++msgid "Calling commit-msg hook..." ++msgstr "Đang gọi móc commit-msg..." ++ ++#: lib/commit.tcl:305 ++msgid "Commit declined by commit-msg hook." ++msgstr "Lần chuyển giao bị khước từ do móc commit-msg." ++ ++#: lib/commit.tcl:318 ++msgid "Committing changes..." ++msgstr "Chuyển giao các thay đổi..." ++ ++#: lib/commit.tcl:334 ++msgid "write-tree failed:" ++msgstr "gặp lỗi khi write-tree:" ++ ++#: lib/commit.tcl:335 lib/commit.tcl:379 lib/commit.tcl:400 ++msgid "Commit failed." ++msgstr "Gặp lỗi khi chuyển giao." ++ ++#: lib/commit.tcl:352 ++#, tcl-format ++msgid "Commit %s appears to be corrupt" ++msgstr "Lần chuyển giao %s có vẻ đã hư hỏng" ++ ++#: lib/commit.tcl:357 ++msgid "" ++"No changes to commit.\n" ++"\n" ++"No files were modified by this commit and it was not a merge commit.\n" ++"\n" ++"A rescan will be automatically started now.\n" ++msgstr "" ++"Không có thay đổi nào để chuyển giao.\n" ++"\n" ++"Không có tập tin nào được sửa bởi lần chuyển giao này và nó không phải là " ++"lần chuyển giao hòa trộn.\n" ++"\n" ++"Sẽ thực hiện việc quét lại ngay bây giờ.\n" ++ ++#: lib/commit.tcl:364 ++msgid "No changes to commit." ++msgstr "Không có thay đổi nào để chuyển giao." ++ ++#: lib/commit.tcl:378 ++msgid "commit-tree failed:" ++msgstr "commit-tree gặp lỗi:" ++ ++#: lib/commit.tcl:399 ++msgid "update-ref failed:" ++msgstr "cập nhật tham chiếu thất bại:" ++ ++#: lib/commit.tcl:492 ++#, tcl-format ++msgid "Created commit %s: %s" ++msgstr "Lần chuyển giao đã tạo %s: %s" ++ ++#: lib/console.tcl:59 ++msgid "Working... please wait..." ++msgstr "Đang chạy.. vui lòng đợi..." ++ ++#: lib/console.tcl:186 ++msgid "Success" ++msgstr "Thành công" ++ ++#: lib/console.tcl:200 ++msgid "Error: Command Failed" ++msgstr "Lỗi: Câu lệnh gặp lỗi" ++ ++#: lib/database.tcl:42 ++msgid "Number of loose objects" ++msgstr "Số lượng đối tượng bị mất" ++ ++#: lib/database.tcl:43 ++msgid "Disk space used by loose objects" ++msgstr "Dung lượng đĩa được dùng bởi các đối tượng bị mất" ++ ++#: lib/database.tcl:44 ++msgid "Number of packed objects" ++msgstr "Số lượng đối tượng được đóng gói" ++ ++#: lib/database.tcl:45 ++msgid "Number of packs" ++msgstr "Số lượng gói" ++ ++#: lib/database.tcl:46 ++msgid "Disk space used by packed objects" ++msgstr "Dung lượng đĩa được dùng bởi các đối tượng gói" ++ ++#: lib/database.tcl:47 ++msgid "Packed objects waiting for pruning" ++msgstr "Các đối tượng gói chờ xén bớt" ++ ++#: lib/database.tcl:48 ++msgid "Garbage files" ++msgstr "Các tập tin rác" ++ ++#: lib/database.tcl:72 ++msgid "Compressing the object database" ++msgstr "Nén cơ sở dữ liệu đối tượng" ++ ++#: lib/database.tcl:83 ++msgid "Verifying the object database with fsck-objects" ++msgstr "Đang kiểm tra cơ sở dữ liệu đối tượng bằng lệnh fsck" ++ ++#: lib/database.tcl:107 ++#, tcl-format ++msgid "" ++"This repository currently has approximately %i loose objects.\n" ++"\n" ++"To maintain optimal performance it is strongly recommended that you compress " ++"the database.\n" ++"\n" ++"Compress the database now?" ++msgstr "" ++"Hiện kho này mất ước chừng khoảng %i đối tượng.\n" ++"\n" ++"Để tối ưu hóa hiệu suất, khuyến nghị bạn nên nén cơ sở dữ liệu của mình " ++"lại.\n" ++"\n" ++"Nén cơ sở dữ liệu chứ?" ++ ++#: lib/date.tcl:25 ++#, tcl-format ++msgid "Invalid date from Git: %s" ++msgstr "Ngày tháng không hợp lệ từ Git: %s" ++ ++#: lib/diff.tcl:64 ++#, tcl-format ++msgid "" ++"No differences detected.\n" ++"\n" ++"%s has no changes.\n" ++"\n" ++"The modification date of this file was updated by another application, but " ++"the content within the file was not changed.\n" ++"\n" ++"A rescan will be automatically started to find other files which may have " ++"the same state." ++msgstr "" ++"Không tìm thấy khác biệt gì.\n" ++"\n" ++"%s không thay đổi.\n" ++"\n" ++"Thời gian sửa đổi của tập tin này được cập nhật bởi ứng dụng khác, nhưng nội " ++"dung bên trong tập tin thì không thay đổi.\n" ++"\n" ++"Sẽ thực hiện quét lại một cách tự động để tìm các tập tin khác cái mà có thể " ++"có cùng tình trạng." ++ ++#: lib/diff.tcl:104 ++#, tcl-format ++msgid "Loading diff of %s..." ++msgstr "Đang tải diff của %s..." ++ ++#: lib/diff.tcl:125 ++msgid "" ++"LOCAL: deleted\n" ++"REMOTE:\n" ++msgstr "" ++"NỘIBỘ: đã xoá\n" ++"MÁYCHỦ:\n" ++ ++#: lib/diff.tcl:130 ++msgid "" ++"REMOTE: deleted\n" ++"LOCAL:\n" ++msgstr "" ++"MÁYCHỦ: đã xoá\n" ++"NỘIBỘ:\n" ++ ++#: lib/diff.tcl:137 ++msgid "LOCAL:\n" ++msgstr "NỘI-BỘ:\n" ++ ++#: lib/diff.tcl:140 ++msgid "REMOTE:\n" ++msgstr "MÁY-CHỦ:\n" ++ ++#: lib/diff.tcl:202 lib/diff.tcl:340 ++#, tcl-format ++msgid "Unable to display %s" ++msgstr "Không thể hiển thị %s" ++ ++#: lib/diff.tcl:203 ++msgid "Error loading file:" ++msgstr "Lỗi khi tải tập tin:" ++ ++#: lib/diff.tcl:210 ++msgid "Git Repository (subproject)" ++msgstr "Kho Git (dự án con)" ++ ++#: lib/diff.tcl:222 ++msgid "* Binary file (not showing content)." ++msgstr "* Tập tin nhị phân (không hiển thị nội dung)." ++ ++#: lib/diff.tcl:227 ++#, tcl-format ++msgid "" ++"* Untracked file is %d bytes.\n" ++"* Showing only first %d bytes.\n" ++msgstr "" ++"* Tập tin chưa theo dõi là %d byte.\n" ++"* Chỉ hiển thị %d byte đầu .\n" ++ ++#: lib/diff.tcl:233 ++#, tcl-format ++msgid "" ++"\n" ++"* Untracked file clipped here by %s.\n" ++"* To see the entire file, use an external editor.\n" ++msgstr "" ++"\n" ++"* Tập tin chưa theo dõi được cắt tại đây bởi %s.\n" ++"* Để xem toàn bộ tập tin, hãy dùng ứng dụng biên soạn bên ngoài.\n" ++ ++#: lib/diff.tcl:560 ++msgid "Failed to unstage selected hunk." ++msgstr "Gặp lỗi khi bỏ ra khỏi bệ phóng khối đã chọn" ++ ++#: lib/diff.tcl:567 ++msgid "Failed to stage selected hunk." ++msgstr "Gặp lỗi khi đưa lên bệ phóng khối đã chọn" ++ ++#: lib/diff.tcl:646 ++msgid "Failed to unstage selected line." ++msgstr "Gặp lỗi khi bỏ ra khỏi bệ phóng dòng đã chọn" ++ ++#: lib/diff.tcl:654 ++msgid "Failed to stage selected line." ++msgstr "Gặp lỗi khi đưa lên bệ phóng dòng đã chọn" ++ ++#: lib/encoding.tcl:443 ++msgid "Default" ++msgstr "Mặc định" ++ ++#: lib/encoding.tcl:448 ++#, tcl-format ++msgid "System (%s)" ++msgstr "Hệ thống (%s)" ++ ++#: lib/encoding.tcl:459 lib/encoding.tcl:465 ++msgid "Other" ++msgstr "Khác" ++ ++#: lib/error.tcl:20 lib/error.tcl:116 ++msgid "error" ++msgstr "lỗi" ++ ++#: lib/error.tcl:36 ++msgid "warning" ++msgstr "cảnh báo" ++ ++#: lib/error.tcl:96 ++msgid "You must correct the above errors before committing." ++msgstr "Bạn phải sửa các lỗi trên trước khi chuyển giao." ++ ++#: lib/index.tcl:6 ++msgid "Unable to unlock the index." ++msgstr "Không thể bỏ khóa bảng mục lục" ++ ++#: lib/index.tcl:17 ++msgid "Index Error" ++msgstr "Lỗi mục lục" ++ ++#: lib/index.tcl:19 ++msgid "" ++"Updating the Git index failed. A rescan will be automatically started to " ++"resynchronize git-gui." ++msgstr "" ++"Cập nhật mục lục cho Git gặp lỗi. Việc quét lại sẽ tự động được khởi chạy để " ++"đồng hóa lại với git-gui." ++ ++#: lib/index.tcl:30 ++msgid "Continue" ++msgstr "Tiếp tục" ++ ++#: lib/index.tcl:33 ++msgid "Unlock Index" ++msgstr "Bỏ khóa mục lục" ++ ++#: lib/index.tcl:298 ++#, tcl-format ++msgid "Unstaging %s from commit" ++msgstr "Bỏ %s ra khỏi việc chuyển giao" ++ ++#: lib/index.tcl:337 ++msgid "Ready to commit." ++msgstr "Đã chuyển giao rồi." ++ ++#: lib/index.tcl:350 ++#, tcl-format ++msgid "Adding %s" ++msgstr "Đang thêm %s" ++ ++#: lib/index.tcl:380 ++#, tcl-format ++msgid "Stage %d untracked files?" ++msgstr "Đưa %d tập tin chưa theo dõi lên bệ phóng để chuyển giao?" ++ ++#: lib/index.tcl:428 ++#, tcl-format ++msgid "Revert changes in file %s?" ++msgstr "Hoàn nguyên các thay đổi trong tập tin %s?" ++ ++#: lib/index.tcl:430 ++#, tcl-format ++msgid "Revert changes in these %i files?" ++msgstr "Hoàn nguyên các thay đổi trong %i tập tin?" ++ ++#: lib/index.tcl:438 ++msgid "Any unstaged changes will be permanently lost by the revert." ++msgstr "" ++"Mọi thay đổi chưa được đưa lên bệ phóng sẽ mất vĩnh viễn do lệnh revert." ++ ++#: lib/index.tcl:441 ++msgid "Do Nothing" ++msgstr "Không làm gì" ++ ++#: lib/index.tcl:459 ++msgid "Reverting selected files" ++msgstr "Đang hoàn nguyên các tập tin đã chọn" ++ ++#: lib/index.tcl:463 ++#, tcl-format ++msgid "Reverting %s" ++msgstr "Đang hoàn nguyên %s" ++ ++#: lib/line.tcl:17 ++msgid "Goto Line:" ++msgstr "Nhảy đến dòng:" ++ ++#: lib/line.tcl:23 ++msgid "Go" ++msgstr "Nhảy" ++ ++#: lib/merge.tcl:13 ++msgid "" ++"Cannot merge while amending.\n" ++"\n" ++"You must finish amending this commit before starting any type of merge.\n" ++msgstr "" ++"Không thể hòa trộn trong khi tu bổ.\n" ++"\n" ++"Bạn phải hoàn tất việc tu bổ lần chuyển giao trước khi bắt đầu bất kỳ kiểu " ++"hòa trộn nào.\n" ++ ++#: lib/merge.tcl:27 ++msgid "" ++"Last scanned state does not match repository state.\n" ++"\n" ++"Another Git program has modified this repository since the last scan. A " ++"rescan must be performed before a merge can be performed.\n" ++"\n" ++"The rescan will be automatically started now.\n" ++msgstr "" ++"Trạng thái quét không khớp với trạng thái kho.\n" ++"\n" ++"Có Git khác đã sửa kho này kể từ lần quét cuối. Cần quét lại trước khi thực " ++"hiện việc hòa trộn.\n" ++"\n" ++"Sẽ thực hiện việc quét lại ngay bây giời.\n" ++ ++#: lib/merge.tcl:45 ++#, tcl-format ++msgid "" ++"You are in the middle of a conflicted merge.\n" ++"\n" ++"File %s has merge conflicts.\n" ++"\n" ++"You must resolve them, stage the file, and commit to complete the current " ++"merge. Only then can you begin another merge.\n" ++msgstr "" ++"Bạn đang ở giữa việc thay đổi.\n" ++"\n" ++"Tập tin %s đã bị sửa đổi.\n" ++"\n" ++"Bạn nên hoàn thiện lần chuyển giao hiện nay trước khi hòa trộn. Chỉ có thế " ++"bạn mới có thể bắt đầu hòa trộn cái .\n" ++ ++#: lib/merge.tcl:55 ++#, tcl-format ++msgid "" ++"You are in the middle of a change.\n" ++"\n" ++"File %s is modified.\n" ++"\n" ++"You should complete the current commit before starting a merge. Doing so " ++"will help you abort a failed merge, should the need arise.\n" ++msgstr "" ++"Bạn đang ở giữa việc thay đổi.\n" ++"\n" ++"Tập tin %s đã bị sửa đổi.\n" ++"\n" ++"Bạn nên hoàn thiện lần chuyển giao hiện nay trước khi hòa trộn. Làm như vậy " ++"giúp bạn có thể loại bỏ việc lỗi trong hòa trộn.\n" ++ ++#: lib/merge.tcl:108 ++#, tcl-format ++msgid "%s of %s" ++msgstr "%s trên %s" ++ ++#: lib/merge.tcl:122 ++#, tcl-format ++msgid "Merging %s and %s..." ++msgstr "Đang hòa trộn %s và %s..." ++ ++#: lib/merge.tcl:133 ++msgid "Merge completed successfully." ++msgstr "Hòa trộn đã thực hiện thành công." ++ ++#: lib/merge.tcl:135 ++msgid "Merge failed. Conflict resolution is required." ++msgstr "Hòa trộn gặp lỗi. Cần giải quyết các xung đột trước." ++ ++#: lib/merge.tcl:160 ++#, tcl-format ++msgid "Merge Into %s" ++msgstr "Hòa trộn vào %s" ++ ++#: lib/merge.tcl:179 ++msgid "Revision To Merge" ++msgstr "Điểm cần hòa trộn" ++ ++#: lib/merge.tcl:214 ++msgid "" ++"Cannot abort while amending.\n" ++"\n" ++"You must finish amending this commit.\n" ++msgstr "" ++"Không thể hủy bỏ trong khi đang tu bổ.\n" ++"\n" ++"Bạn cần phải hoàn tất việc tu bổ lần chuyển giao này.\n" ++ ++#: lib/merge.tcl:224 ++msgid "" ++"Abort merge?\n" ++"\n" ++"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n" ++"\n" ++"Continue with aborting the current merge?" ++msgstr "" ++"Bãi bỏ hòa trộn?\n" ++"\n" ++"Bãi bỏ hòa trộn hiện nay sẽ làm *TẤT CẢ* các thay đổi chưa được chuyển giao " ++"bị mất.\n" ++"\n" ++"Tiếp tục bãi bỏ việc hòa trộn hiện tại?" ++ ++#: lib/merge.tcl:230 ++msgid "" ++"Reset changes?\n" ++"\n" ++"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n" ++"\n" ++"Continue with resetting the current changes?" ++msgstr "" ++"Đặt lại mọi thay đổi?\n" ++"\n" ++"Việc đặt lại các thay đổi sẽ làm *MỌI* thay đổi chưa chuyển giao biến mất.\n" ++"\n" ++"Vẫn tiếp tục đặt lại các thay đổi hiện tại?" ++ ++#: lib/merge.tcl:241 ++msgid "Aborting" ++msgstr "Bãi bỏ" ++ ++#: lib/merge.tcl:241 ++msgid "files reset" ++msgstr "đặt lại các tập tin" ++ ++#: lib/merge.tcl:269 ++msgid "Abort failed." ++msgstr "Gặp lỗi khi bãi bỏ." ++ ++#: lib/merge.tcl:271 ++msgid "Abort completed. Ready." ++msgstr "Đã bãi bỏ xong. Sẵn sàng." ++ ++#: lib/mergetool.tcl:8 ++msgid "Force resolution to the base version?" ++msgstr "Buộc phân giải thành nhánh cơ sở?" ++ ++#: lib/mergetool.tcl:9 ++msgid "Force resolution to this branch?" ++msgstr "Buộc phân giải thành nhánh này?" ++ ++#: lib/mergetool.tcl:10 ++msgid "Force resolution to the other branch?" ++msgstr "Buộc phân giải thành nhánh khác?" ++ ++#: lib/mergetool.tcl:14 ++#, tcl-format ++msgid "" ++"Note that the diff shows only conflicting changes.\n" ++"\n" ++"%s will be overwritten.\n" ++"\n" ++"This operation can be undone only by restarting the merge." ++msgstr "" ++"Chú ý là diff chỉ hiển thị những thay đổi xung đột.\n" ++"\n" ++"%s sẽ bị ghi đè.\n" ++"\n" ++"Thao tác này chỉ có thể bỏ dở bằng cách khởi động lại việc hòa trộn." ++ ++#: lib/mergetool.tcl:45 ++#, tcl-format ++msgid "File %s seems to have unresolved conflicts, still stage?" ++msgstr "" ++"Tập tin %s có vẻ chưa được giải quyết xung đột, vẫn đánh dấu là cần chuyển " ++"giao?" ++ ++#: lib/mergetool.tcl:60 ++#, tcl-format ++msgid "Adding resolution for %s" ++msgstr "Đang phân giải cho %s" ++ ++#: lib/mergetool.tcl:141 ++msgid "Cannot resolve deletion or link conflicts using a tool" ++msgstr "Không thể phân giải xung đột xóa hay liên kết dùng một công cụ" ++ ++#: lib/mergetool.tcl:146 ++msgid "Conflict file does not exist" ++msgstr "Tập tin xung đột không tồn tại" ++ ++#: lib/mergetool.tcl:246 ++#, tcl-format ++msgid "Not a GUI merge tool: '%s'" ++msgstr "Không phải là một công cụ hòa trộn GUI: '%s'" ++ ++#: lib/mergetool.tcl:275 ++#, tcl-format ++msgid "Unsupported merge tool '%s'" ++msgstr "Không hỗ trợ công cụ trộn '%s'" ++ ++#: lib/mergetool.tcl:310 ++msgid "Merge tool is already running, terminate it?" ++msgstr "Công cụ hòa trộn đang chạy rồi, chấm dứt nó?" ++ ++#: lib/mergetool.tcl:330 ++#, tcl-format ++msgid "" ++"Error retrieving versions:\n" ++"%s" ++msgstr "" ++"Gặp lỗi khi truy lại phiên bản:\n" ++"%s" ++ ++#: lib/mergetool.tcl:350 ++#, tcl-format ++msgid "" ++"Could not start the merge tool:\n" ++"\n" ++"%s" ++msgstr "" ++"Không thể khởi chạy công cụ hòa trộn:\n" ++"\n" ++"%s" ++ ++#: lib/mergetool.tcl:354 ++msgid "Running merge tool..." ++msgstr "Đang chạy công cụ trộn..." ++ ++#: lib/mergetool.tcl:382 lib/mergetool.tcl:390 ++msgid "Merge tool failed." ++msgstr "Công cụ trộn gặp lỗi." ++ ++#: lib/option.tcl:11 ++#, tcl-format ++msgid "Invalid global encoding '%s'" ++msgstr "Bảng mã toàn cục không hợp lệ '%s'" ++ ++#: lib/option.tcl:19 ++#, tcl-format ++msgid "Invalid repo encoding '%s'" ++msgstr "Bảng mã kho chứa không hợp lệ '%s'" ++ ++#: lib/option.tcl:119 ++msgid "Restore Defaults" ++msgstr "Phục hồi thành mặc định" ++ ++#: lib/option.tcl:123 ++msgid "Save" ++msgstr "Ghi lại" ++ ++#: lib/option.tcl:133 ++#, tcl-format ++msgid "%s Repository" ++msgstr "%s kho" ++ ++#: lib/option.tcl:134 ++msgid "Global (All Repositories)" ++msgstr "Toàn cục (Mọi kho)" ++ ++#: lib/option.tcl:140 ++msgid "User Name" ++msgstr "Tên người dùng" ++ ++#: lib/option.tcl:141 ++msgid "Email Address" ++msgstr "Địa chỉ thư điện tử" ++ ++#: lib/option.tcl:143 ++msgid "Summarize Merge Commits" ++msgstr "Tổng hợp về hòa trộn các lần chuyển giao" ++ ++#: lib/option.tcl:144 ++msgid "Merge Verbosity" ++msgstr "Chi tiết việc hòa trộn" ++ ++#: lib/option.tcl:145 ++msgid "Show Diffstat After Merge" ++msgstr "Hiển thị thống kê khác biệt sau hòa trộn" ++ ++#: lib/option.tcl:146 ++msgid "Use Merge Tool" ++msgstr "Dùng Công cụ trộn" ++ ++#: lib/option.tcl:148 ++msgid "Trust File Modification Timestamps" ++msgstr "Tin dấu vết thời gian sửa đổi tập tin" ++ ++#: lib/option.tcl:149 ++msgid "Prune Tracking Branches During Fetch" ++msgstr "Xén các nhánh theo dõi trong khi lấy về" ++ ++#: lib/option.tcl:150 ++msgid "Match Tracking Branches" ++msgstr "Khớp nhánh theo dõi" ++ ++#: lib/option.tcl:151 ++msgid "Use Textconv For Diffs and Blames" ++msgstr "Dùng Textconv Cho Diffs và Blames" ++ ++#: lib/option.tcl:152 ++msgid "Blame Copy Only On Changed Files" ++msgstr "Chỉ chép blame trên các tập tin thay đổi" ++ ++#: lib/option.tcl:153 ++msgid "Maximum Length of Recent Repositories List" ++msgstr "Số lượng kho mới dùng tối đa được lưu trữ" ++ ++#: lib/option.tcl:154 ++msgid "Minimum Letters To Blame Copy On" ++msgstr "Chữ tối thiểu để blame chép vào" ++ ++#: lib/option.tcl:155 ++msgid "Blame History Context Radius (days)" ++msgstr "Bán kính ngữ cảnh lịch sử blame (ngày)" ++ ++#: lib/option.tcl:156 ++msgid "Number of Diff Context Lines" ++msgstr "Số dòng nội dung Diff" ++ ++#: lib/option.tcl:157 ++msgid "Additional Diff Parameters" ++msgstr "Đối số bổ xung cho Diff" ++ ++#: lib/option.tcl:158 ++msgid "Commit Message Text Width" ++msgstr "Chiều rộng của phần chú thích" ++ ++#: lib/option.tcl:159 ++msgid "New Branch Name Template" ++msgstr "Mẫu tên nhánh mới" ++ ++#: lib/option.tcl:160 ++msgid "Default File Contents Encoding" ++msgstr "Bảng mã dành cho nội dung tập tin mặc định" ++ ++#: lib/option.tcl:161 ++msgid "Warn before committing to a detached head" ++msgstr "Cảnh báo trước khi chuyển giao một đầu bị tách rời" ++ ++#: lib/option.tcl:162 ++msgid "Staging of untracked files" ++msgstr "Đánh dấu những tập tin chưa được theo dõi là cần chuyển giao" ++ ++#: lib/option.tcl:163 ++msgid "Show untracked files" ++msgstr "Hiện các tập tin chưa được theo dõi" ++ ++#: lib/option.tcl:209 ++msgid "Change" ++msgstr "Thay đổi" ++ ++#: lib/option.tcl:253 ++msgid "Spelling Dictionary:" ++msgstr "Từ điển chính tả:" ++ ++#: lib/option.tcl:283 ++msgid "Change Font" ++msgstr "Đổi phông chữ" ++ ++#: lib/option.tcl:287 ++#, tcl-format ++msgid "Choose %s" ++msgstr "Chọn %s" ++ ++#: lib/option.tcl:293 ++msgid "pt." ++msgstr "pt." ++ ++#: lib/option.tcl:307 ++msgid "Preferences" ++msgstr "Cá nhân hóa" ++ ++#: lib/option.tcl:344 ++msgid "Failed to completely save options:" ++msgstr "Gặp lỗi khi hoàn tất ghi lại các tùy chọn:" ++ ++#: lib/remote_add.tcl:20 ++msgid "Add Remote" ++msgstr "Thêm máy chủ" ++ ++#: lib/remote_add.tcl:25 ++msgid "Add New Remote" ++msgstr "Thêm máy chủ mới" ++ ++#: lib/remote_add.tcl:30 lib/tools_dlg.tcl:37 ++msgid "Add" ++msgstr "Thêm vào" ++ ++#: lib/remote_add.tcl:39 ++msgid "Remote Details" ++msgstr "Chi tiết về máy chủ" ++ ++#: lib/remote_add.tcl:50 ++msgid "Location:" ++msgstr "Vị trí:" ++ ++#: lib/remote_add.tcl:60 ++msgid "Further Action" ++msgstr "Hành động thêm" ++ ++#: lib/remote_add.tcl:63 ++msgid "Fetch Immediately" ++msgstr "Lấy về ngay lập tức" ++ ++#: lib/remote_add.tcl:69 ++msgid "Initialize Remote Repository and Push" ++msgstr "Khởi tạo Kho máy chủ và đẩy dữ liệu lên" ++ ++#: lib/remote_add.tcl:75 ++msgid "Do Nothing Else Now" ++msgstr "Không làm gì cả" ++ ++#: lib/remote_add.tcl:100 ++msgid "Please supply a remote name." ++msgstr "Hãy cung cấp tên máy chủ." ++ ++#: lib/remote_add.tcl:113 ++#, tcl-format ++msgid "'%s' is not an acceptable remote name." ++msgstr "'%s' không phải là tên máy chủ được chấp nhận." ++ ++#: lib/remote_add.tcl:124 ++#, tcl-format ++msgid "Failed to add remote '%s' of location '%s'." ++msgstr "Gặp lỗi khi thêm máy chủ '%s' của vị trí '%s'." ++ ++#: lib/remote_add.tcl:132 lib/transport.tcl:6 ++#, tcl-format ++msgid "fetch %s" ++msgstr "lấy về %s" ++ ++#: lib/remote_add.tcl:133 ++#, tcl-format ++msgid "Fetching the %s" ++msgstr "Đang lấy về %s" ++ ++#: lib/remote_add.tcl:156 ++#, tcl-format ++msgid "Do not know how to initialize repository at location '%s'." ++msgstr "Không hiểu làm thế nào để khởi tạo kho chứa tại vị trí '%s'." ++ ++#: lib/remote_add.tcl:162 lib/transport.tcl:54 lib/transport.tcl:92 ++#: lib/transport.tcl:110 ++#, tcl-format ++msgid "push %s" ++msgstr "đẩy %s lên máy chủ" ++ ++#: lib/remote_add.tcl:163 ++#, tcl-format ++msgid "Setting up the %s (at %s)" ++msgstr "Cài đặt '%s' (tại %s)" ++ ++#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 ++msgid "Delete Branch Remotely" ++msgstr "Xóa nhánh trên máy chủ" ++ ++#: lib/remote_branch_delete.tcl:48 ++msgid "From Repository" ++msgstr "Từ Kho" ++ ++#: lib/remote_branch_delete.tcl:51 lib/transport.tcl:165 ++msgid "Remote:" ++msgstr "Máy chủ:" ++ ++#: lib/remote_branch_delete.tcl:72 lib/transport.tcl:187 ++msgid "Arbitrary Location:" ++msgstr "Địa điểm tùy ý:" ++ ++#: lib/remote_branch_delete.tcl:88 ++msgid "Branches" ++msgstr "Nhánh" ++ ++#: lib/remote_branch_delete.tcl:110 ++msgid "Delete Only If" ++msgstr "Chỉ xoá Nếu" ++ ++#: lib/remote_branch_delete.tcl:112 ++msgid "Merged Into:" ++msgstr "Đã trộn vào:" ++ ++#: lib/remote_branch_delete.tcl:153 ++msgid "A branch is required for 'Merged Into'." ++msgstr "Cần một nhánh cho 'Hòa trộn vào'." ++ ++#: lib/remote_branch_delete.tcl:185 ++#, tcl-format ++msgid "" ++"The following branches are not completely merged into %s:\n" ++"\n" ++" - %s" ++msgstr "" ++"Các nhánh sau đây không được hòa trộn hoàn toàn vào %s:\n" ++"\n" ++" - %s" ++ ++#: lib/remote_branch_delete.tcl:190 ++#, tcl-format ++msgid "" ++"One or more of the merge tests failed because you have not fetched the " ++"necessary commits. Try fetching from %s first." ++msgstr "" ++"Một hay nhiều hơn kiểm tra hòa trộn không đạt bởi vì bạn đã không lấy về " ++"những lần chuyển giao cần thiết. Hãy lấy về từ %s trước đã." ++ ++#: lib/remote_branch_delete.tcl:208 ++msgid "Please select one or more branches to delete." ++msgstr "Xin hãy chọn một hay nhiều nhánh cần xóa." ++ ++#: lib/remote_branch_delete.tcl:227 ++#, tcl-format ++msgid "Deleting branches from %s" ++msgstr "Đang xoá các nhánh từ %s" ++ ++#: lib/remote_branch_delete.tcl:300 ++msgid "No repository selected." ++msgstr "Chưa chọn kho." ++ ++#: lib/remote_branch_delete.tcl:305 ++#, tcl-format ++msgid "Scanning %s..." ++msgstr "Đang quét: %s..." ++ ++#: lib/remote.tcl:200 ++msgid "Push to" ++msgstr "Đẩy lên" ++ ++#: lib/remote.tcl:218 ++msgid "Remove Remote" ++msgstr "Gỡ bỏ Máy chủ" ++ ++#: lib/remote.tcl:223 ++msgid "Prune from" ++msgstr "Xén từ" ++ ++#: lib/remote.tcl:228 ++msgid "Fetch from" ++msgstr "Lấy về từ" ++ ++#: lib/search.tcl:48 ++msgid "Find:" ++msgstr "Tìm:" ++ ++#: lib/search.tcl:50 ++msgid "Next" ++msgstr "Tiếp" ++ ++#: lib/search.tcl:51 ++msgid "Prev" ++msgstr "Trước" ++ ++#: lib/search.tcl:52 ++msgid "RegExp" ++msgstr "BTCQ" ++ ++#: lib/search.tcl:54 ++msgid "Case" ++msgstr "Hoa" ++ ++#: lib/shortcut.tcl:21 lib/shortcut.tcl:62 ++msgid "Cannot write shortcut:" ++msgstr "Không thể ghi lối tắt:" ++ ++#: lib/shortcut.tcl:137 ++msgid "Cannot write icon:" ++msgstr "Không thể ghi biểu tượng:" ++ ++#: lib/spellcheck.tcl:57 ++msgid "Unsupported spell checker" ++msgstr "Không hỗ trợ kiểm tra chính tả" ++ ++#: lib/spellcheck.tcl:65 ++msgid "Spell checking is unavailable" ++msgstr "Kiểm tra chính tả không sẵn sàng" ++ ++#: lib/spellcheck.tcl:68 ++msgid "Invalid spell checking configuration" ++msgstr "Cấu hình bộ soát chính tả không hợp lệ" ++ ++#: lib/spellcheck.tcl:70 ++#, tcl-format ++msgid "Reverting dictionary to %s." ++msgstr "Đang hoàn nguyên từ điển thành %s." ++ ++#: lib/spellcheck.tcl:73 ++msgid "Spell checker silently failed on startup" ++msgstr "Phần kiểm tra chính tả đã gặp lỗi khi khởi động" ++ ++#: lib/spellcheck.tcl:80 ++msgid "Unrecognized spell checker" ++msgstr "Không chấp nhận bộ kiểm tra chính tả" ++ ++#: lib/spellcheck.tcl:186 ++msgid "No Suggestions" ++msgstr "Không có gợi ý" ++ ++#: lib/spellcheck.tcl:388 ++msgid "Unexpected EOF from spell checker" ++msgstr "Gặp kết thúc bất ngờ từ bộ kiểm tra chính tả" ++ ++#: lib/spellcheck.tcl:392 ++msgid "Spell Checker Failed" ++msgstr "Kiểm tra chính tả không thành công" ++ ++#: lib/sshkey.tcl:31 ++msgid "No keys found." ++msgstr "Không tìm thấy khóa nào." ++ ++#: lib/sshkey.tcl:34 ++#, tcl-format ++msgid "Found a public key in: %s" ++msgstr "Tìm thấy khoá công khai trong: %s" ++ ++#: lib/sshkey.tcl:40 ++msgid "Generate Key" ++msgstr "Tạo khoá" ++ ++#: lib/sshkey.tcl:58 ++msgid "Copy To Clipboard" ++msgstr "Chép vào clipboard" ++ ++#: lib/sshkey.tcl:72 ++msgid "Your OpenSSH Public Key" ++msgstr "Khóa công OpenSSH của bạn" ++ ++#: lib/sshkey.tcl:80 ++msgid "Generating..." ++msgstr "Đang tạo..." ++ ++#: lib/sshkey.tcl:86 ++#, tcl-format ++msgid "" ++"Could not start ssh-keygen:\n" ++"\n" ++"%s" ++msgstr "" ++"Không thể chạy ssh-keygen:\n" ++"\n" ++"%s" ++ ++#: lib/sshkey.tcl:113 ++msgid "Generation failed." ++msgstr "Việc tạo khoá đã thất bại." ++ ++#: lib/sshkey.tcl:120 ++msgid "Generation succeeded, but no keys found." ++msgstr "Việc tạo thành công nhưng lại không tìm thấy khóa." ++ ++#: lib/sshkey.tcl:123 ++#, tcl-format ++msgid "Your key is in: %s" ++msgstr "Khóa của bạn trong: %s" ++ ++#: lib/status_bar.tcl:87 ++#, tcl-format ++msgid "%s ... %*i of %*i %s (%3i%%)" ++msgstr "%s ... %*i trong %*i %s (%3i%%)" ++ ++#: lib/tools_dlg.tcl:22 ++msgid "Add Tool" ++msgstr "Thêm công cụ" ++ ++#: lib/tools_dlg.tcl:28 ++msgid "Add New Tool Command" ++msgstr "Thêm lệnh công cụ mới" ++ ++#: lib/tools_dlg.tcl:34 ++msgid "Add globally" ++msgstr "Thêm toàn cục" ++ ++#: lib/tools_dlg.tcl:46 ++msgid "Tool Details" ++msgstr "Chi tiết công cụ" ++ ++#: lib/tools_dlg.tcl:49 ++msgid "Use '/' separators to create a submenu tree:" ++msgstr "Dùng dấu ngăn cách '/' để tạo cây trình đơn con:" ++ ++#: lib/tools_dlg.tcl:60 ++msgid "Command:" ++msgstr "Lệnh:" ++ ++#: lib/tools_dlg.tcl:71 ++msgid "Show a dialog before running" ++msgstr "Hiển thị hộp thoại trước khi chạy" ++ ++#: lib/tools_dlg.tcl:77 ++msgid "Ask the user to select a revision (sets $REVISION)" ++msgstr "Hỏi người dùng chọn điểm xem xét (đặt biến $REVISION)" ++ ++#: lib/tools_dlg.tcl:82 ++msgid "Ask the user for additional arguments (sets $ARGS)" ++msgstr "Hỏi người dùng các đối số bổ xung thêm (đặt biến $ARGS)" ++ ++#: lib/tools_dlg.tcl:89 ++msgid "Don't show the command output window" ++msgstr "Không hiển thị cửa sổ kết xuất câu lệnh" ++ ++#: lib/tools_dlg.tcl:94 ++msgid "Run only if a diff is selected ($FILENAME not empty)" ++msgstr "Chỉ chạy nếu diff được chọn (biến $FILENAME không rỗng)" ++ ++#: lib/tools_dlg.tcl:118 ++msgid "Please supply a name for the tool." ++msgstr "Hãy cung cấp tên cho công cụ." ++ ++#: lib/tools_dlg.tcl:126 ++#, tcl-format ++msgid "Tool '%s' already exists." ++msgstr "Công cụ '%s' đã sẵn có." ++ ++#: lib/tools_dlg.tcl:148 ++#, tcl-format ++msgid "" ++"Could not add tool:\n" ++"%s" ++msgstr "" ++"Không thể thêm công cụ:\n" ++"%s" ++ ++#: lib/tools_dlg.tcl:187 ++msgid "Remove Tool" ++msgstr "Gỡ bỏ công cụ" ++ ++#: lib/tools_dlg.tcl:193 ++msgid "Remove Tool Commands" ++msgstr "Gỡ bỏ công cụ lệnh" ++ ++#: lib/tools_dlg.tcl:198 ++msgid "Remove" ++msgstr "Gỡ bỏ" ++ ++#: lib/tools_dlg.tcl:231 ++msgid "(Blue denotes repository-local tools)" ++msgstr "(Các công cụ chỉ thị kho-nội-bộ xanh)" ++ ++#: lib/tools_dlg.tcl:292 ++#, tcl-format ++msgid "Run Command: %s" ++msgstr "Chạy lệnh: %s" ++ ++#: lib/tools_dlg.tcl:306 ++msgid "Arguments" ++msgstr "Đối số" ++ ++#: lib/tools_dlg.tcl:341 ++msgid "OK" ++msgstr "Đồng ý" ++ ++#: lib/tools.tcl:75 ++#, tcl-format ++msgid "Running %s requires a selected file." ++msgstr "Chạy %s yêu cầu cần phải chọn một tập tin." ++ ++#: lib/tools.tcl:91 ++#, tcl-format ++msgid "Are you sure you want to run %1$s on file \"%2$s\"?" ++msgstr "Bạn có chắc là muốn chạy %1$s trên tập tin \"%2$s\" không?" ++ ++#: lib/tools.tcl:95 ++#, tcl-format ++msgid "Are you sure you want to run %s?" ++msgstr "Bạn có chắc là muốn chạy %s không?" ++ ++#: lib/tools.tcl:116 ++#, tcl-format ++msgid "Tool: %s" ++msgstr "Công cụ: %s" ++ ++#: lib/tools.tcl:117 ++#, tcl-format ++msgid "Running: %s" ++msgstr "Đang chạy: %s" ++ ++#: lib/tools.tcl:155 ++#, tcl-format ++msgid "Tool completed successfully: %s" ++msgstr "Công cụ được biên dịch thành công: %s" ++ ++#: lib/tools.tcl:157 ++#, tcl-format ++msgid "Tool failed: %s" ++msgstr "Công cụ gặp lỗi: %s" ++ ++#: lib/transport.tcl:7 ++#, tcl-format ++msgid "Fetching new changes from %s" ++msgstr "Lấy các thay đổi mới từ %s" ++ ++#: lib/transport.tcl:18 ++#, tcl-format ++msgid "remote prune %s" ++msgstr "xén bớt trên máy chủ %s" ++ ++#: lib/transport.tcl:19 ++#, tcl-format ++msgid "Pruning tracking branches deleted from %s" ++msgstr "Xén bớt các nhánh theo dõi bị xóa từ %s" ++ ++#: lib/transport.tcl:25 ++msgid "fetch all remotes" ++msgstr "lấy về từ tất cả các máy chủ" ++ ++#: lib/transport.tcl:26 ++msgid "Fetching new changes from all remotes" ++msgstr "Đang lấy các thay đổi mới từ mọi máy chủ" ++ ++#: lib/transport.tcl:40 ++msgid "remote prune all remotes" ++msgstr "xén bớt mọi máy chủ" ++ ++#: lib/transport.tcl:41 ++msgid "Pruning tracking branches deleted from all remotes" ++msgstr "Xén tỉa các nhánh đã theo dõi bị xóa từ mọi máy chủ" ++ ++#: lib/transport.tcl:55 ++#, tcl-format ++msgid "Pushing changes to %s" ++msgstr "Đang đẩy các nhánh lên %s" ++ ++#: lib/transport.tcl:93 ++#, tcl-format ++msgid "Mirroring to %s" ++msgstr "Bản sao đến %s" ++ ++#: lib/transport.tcl:111 ++#, tcl-format ++msgid "Pushing %s %s to %s" ++msgstr "Đang (đẩy) %s %s lên %s" ++ ++#: lib/transport.tcl:132 ++msgid "Push Branches" ++msgstr "Đẩy lên các nhánh" ++ ++#: lib/transport.tcl:147 ++msgid "Source Branches" ++msgstr "Nhánh nguồn" ++ ++#: lib/transport.tcl:162 ++msgid "Destination Repository" ++msgstr "Kho chứa đích" ++ ++#: lib/transport.tcl:205 ++msgid "Transfer Options" ++msgstr "Tùy chọn truyền" ++ ++#: lib/transport.tcl:207 ++msgid "Force overwrite existing branch (may discard changes)" ++msgstr "Ép buộc ghi đè nhánh sẵn có (có thể sẽ loại bỏ các thay đổi)" ++ ++#: lib/transport.tcl:211 ++msgid "Use thin pack (for slow network connections)" ++msgstr "Dùng gói mỏng (dành cho kết nối mạng chậm)" ++ ++#: lib/transport.tcl:215 ++msgid "Include tags" ++msgstr "Bao gồm các thẻ" ++ ++#~ msgid "Case-Sensitive" ++#~ msgstr "Có phân biệt HOA/thường"