From: Junio C Hamano Date: Wed, 21 Nov 2007 08:00:56 +0000 (-0800) Subject: Merge git://repo.or.cz/git-gui X-Git-Tag: v1.5.4-rc0~167 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=d794d9e70ebb8c767b04f25c03290ef305cd31ab;p=git.git Merge git://repo.or.cz/git-gui * git://repo.or.cz/git-gui: (96 commits) git-gui 0.9.0 git-gui: Bind Meta-T for "Stage To Commit" menu action git-gui: Allow users to set font weights to bold git-gui: Update Japanese strings (part 2) git-gui: Update Japanese strings Updated russian translation of git-gui po2msg: actually output statistics po2msg: ignore untranslated messages po2msg: ignore entries marked with "fuzzy" git-gui: Protect against bad translation strings git-gui: Make sure we get errors from git-update-index More updates and corrections to the russian translation of git-gui Updated Russian translation. git-gui: Update German translation git-gui: Add more terms to glossary. git-gui: Paper bag fix the global config parsing git-gui: Honor a config.mak in git-gui's top level git-gui: Collapse $env(HOME) to ~/ in recent repositories on Windows git-gui: Support cloning Cygwin based work-dirs git-gui: Use proper Windows shortcuts instead of bat files ... --- d794d9e70ebb8c767b04f25c03290ef305cd31ab diff --cc git-gui/.gitignore index 020b86dea,000000000..6483b21cb mode 100644,000000..100644 --- a/git-gui/.gitignore +++ b/git-gui/.gitignore @@@ -1,5 -1,0 +1,8 @@@ ++.DS_Store ++config.mak ++Git Gui.app* ++git-gui.tcl +GIT-VERSION-FILE +GIT-GUI-VARS - git-citool +git-gui +lib/tclIndex diff --cc git-gui/GIT-VERSION-GEN index 9770b0bc2,000000000..cfe46a857 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.8.GITGUI ++DEF_VER=0.9.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 18e675013,000000000..e86031927 mode 100644,000000..100644 --- a/git-gui/Makefile +++ b/git-gui/Makefile @@@ -1,185 -1,0 +1,309 @@@ +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 vaild for this to work. ++# + +GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE + @$(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') + +SCRIPT_SH = git-gui.sh ++GITGUI_MAIN := git-gui +GITGUI_BUILT_INS = git-citool - ALL_PROGRAMS = $(GITGUI_BUILT_INS) $(patsubst %.sh,%,$(SCRIPT_SH)) +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 + sharedir := $(dir $(gitexecdir))share +endif + +ifndef INSTALL + INSTALL = install +endif + - RM_F ?= rm -f ++RM_RF ?= rm -rf +RMDIR ?= rmdir + +INSTALL_D0 = $(INSTALL) -d -m755 # space is required here +INSTALL_D1 = +INSTALL_R0 = $(INSTALL) -m644 # space is required here +INSTALL_R1 = +INSTALL_X0 = $(INSTALL) -m755 # 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_F) # space is required here ++REMOVE_F0 = $(RM_RF) # space is required here +REMOVE_F1 = +CLEAN_DST = true + +ifndef V + QUIET = @ - QUIET_GEN = $(QUIET)echo ' ' GEN $@ && - QUIET_BUILT_IN = $(QUIET)echo ' ' BUILTIN $@ && ++ 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 -m755 "$$dir" + INSTALL_R0 = src= + INSTALL_R1 = && echo ' ' INSTALL 644 `basename $$src` && $(INSTALL) -m644 $$src + INSTALL_X0 = src= + INSTALL_X1 = && echo ' ' INSTALL 755 `basename $$src` && $(INSTALL) -m755 $$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_F) "$$dst" ++ REMOVE_F1 = && echo ' ' REMOVE `basename "$$dst"` && $(RM_RF) "$$dst" +endif + +TCL_PATH ?= tclsh +TCLTK_PATH ?= wish ++TKFRAMEWORK = /Library/Frameworks/Tk.framework/Resources/Wish.app + +ifeq ($(findstring $(MAKEFLAGS),s),s) +QUIET_GEN = - QUIET_BUILT_IN = +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))) ++exedir = $(dir $(gitexecdir))share/git-gui/lib ++ ++GITGUI_SCRIPT := $$0 ++GITGUI_RELATIVE := ++GITGUI_MACOSXAPP := ++ ++ifeq ($(exedir),$(gg_libdir)) ++ GITGUI_RELATIVE := 1 ++endif ++ ++ifeq ($(uname_O),Cygwin) ++ GITGUI_SCRIPT := `cygpath --windows --absolute "$(GITGUI_SCRIPT)"` ++ ifeq ($(GITGUI_RELATIVE),) ++ gg_libdir := $(shell cygpath --windows --absolute "$(gg_libdir)") ++ endif ++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 ++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/Wish'\' \ ++ '"$$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/Wish ++ $(QUIET_GEN)rm -rf '$@' '$@'+ && \ ++ mkdir -p '$@'+/Contents/MacOS && \ ++ mkdir -p '$@'+/Contents/Resources/Scripts && \ ++ cp '$(subst ','\'',$(TKFRAMEWORK))/Contents/MacOS/Wish' \ ++ '$@'+/Contents/MacOS && \ ++ cp macosx/git-gui.icns '$@'+/Contents/Resources && \ ++ sed -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/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 + - exedir = $(dir $(gitexecdir))share/git-gui/lib - exedir_SQ = $(subst ','\'',$(exedir)) ++git-gui: windows/git-gui.sh ++ cp $< $@ ++endif + - $(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh ++$(GITGUI_MAIN): git-gui.sh GIT-VERSION-FILE GIT-GUI-VARS + $(QUIET_GEN)rm -f $@ $@+ && \ - GITGUI_RELATIVE= && \ - if test '$(exedir_SQ)' = '$(libdir_SQ)'; then \ - if test "$(uname_O)" = Cygwin; \ - then GITGUI_RELATIVE= ; \ - else GITGUI_RELATIVE=1; \ - fi; \ - fi && \ + sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ - -e 's|^ exec wish "$$0"| exec $(subst |,'\|',$(TCLTK_PATH_SQ)) "$$0"|' \ ++ -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_SQ)|' \ - $@.sh >$@+ && \ ++ -e 's|@@GITGUI_RELATIVE@@|$(GITGUI_RELATIVE)|' \ ++ -e '$(GITGUI_RELATIVE)s|@@GITGUI_LIBDIR@@|$(libdir_SED)|' \ ++ git-gui.sh >$@+ && \ + chmod +x $@+ && \ + mv $@+ $@ + - $(GITGUI_BUILT_INS): git-gui - $(QUIET_BUILT_IN)rm -f $@ && ln git-gui $@ ++XGETTEXT ?= xgettext ++ifdef NO_MSGFMT ++ MSGFMT ?= $(TCL_PATH) po/po2msg.sh ++else ++ MSGFMT ?= msgfmt ++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) ++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 1>&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 + - # These can record GITGUI_VERSION - $(patsubst %.sh,%,$(SCRIPT_SH)): GIT-VERSION-FILE GIT-GUI-VARS - lib/tclIndex: GIT-GUI-VARS - +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-GIT-GUI-VARS + @VARS='$(TRACK_VARS)'; \ + if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \ + echo 1>&2 " * new locations or Tcl/Tk interpreter"; \ + echo 1>$@ "$$VARS"; \ + fi + - all:: $(ALL_PROGRAMS) lib/tclIndex ++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)$(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)' - $(QUIET)$(foreach p,$(ALL_LIBFILES), $(INSTALL_R0)$p $(INSTALL_R1) '$(DESTDIR_SQ)$(libdir_SQ)' &&) true ++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)$(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) - $(QUIET)$(foreach p,$(ALL_LIBFILES), $(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/$(notdir $p) $(REMOVE_F1) &&) true ++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 -f $(ALL_PROGRAMS) lib/tclIndex - rm -f GIT-VERSION-FILE GIT-GUI-VARS ++ $(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-GIT-VERSION-FILE +.PHONY: .FORCE-GIT-GUI-VARS diff --cc git-gui/git-gui.sh index 9335a9761,000000000..1fca11f27 mode 100755,000000..100755 --- a/git-gui/git-gui.sh +++ b/git-gui/git-gui.sh @@@ -1,2760 -1,0 +1,2841 @@@ +#!/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; \ - exec wish "$0" -- "$@" ++ argv0=$0; \ ++ exec wish "$argv0" -- "$@" + +set appvers {@@GITGUI_VERSION@@} - set copyright { - Copyright © 2006, 2007 Shawn Pearce, et. al. ++set copyright [encoding convertfrom utf-8 { ++Copyright © 2006, 2007 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} ++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" \ ++ -title [mc "git-gui: fatal error"] \ + -message $err + exit 1 +} + +catch {rename send {}} ; # What an evil concept... + ++###################################################################### ++## ++## locate our library ++ ++set oguilib {@@GITGUI_LIBDIR@@} ++set oguirel {@@GITGUI_RELATIVE@@} ++if {$oguirel eq {1}} { ++ set oguilib [file dirname [file dirname [file normalize $argv0]]] ++ 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 + } +} + +###################################################################### +## - ## Fake internationalization to ease backporting of changes. ++## Internationalization (i18n) through msgcat and gettext. See ++## http://www.gnu.org/software/gettext/manual/html_node/Tcl.html ++ ++package require msgcat + - proc mc {fmt args} { ++proc _mc_trim {fmt} { + set cmk [string first @@ $fmt] + if {$cmk > 0} { - set fmt [string range $fmt 0 [expr {$cmk - 1}]] ++ return [string range $fmt 0 [expr {$cmk - 1}]] + } - return [eval [list format $fmt] $args] ++ 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 ++ +###################################################################### +## +## read only globals + - set _appname [lindex [file split $argv0] end] ++set _appname {Git Gui} +set _gitdir {} +set _gitexec {} +set _reponame {} +set _iscygwin {} +set _search_path {} + +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 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 + } elseif {$v eq {true} || $v eq {1} || $v eq {yes}} { + return 1 + } else { + return 0 + } +} + +proc get_config {name} { + global repo_config + if {[catch {set v $repo_config($name)}]} { + return {} + } else { + return $v + } +} + - proc load_config {include_global} { - global repo_config global_config default_config - - array unset global_config - if {$include_global} { - catch { - set fd_rc [git_read config --global --list] - while {[gets $fd_rc line] >= 0} { - if {[regexp {^([^=]+)=(.*)$} $line line name value]} { - if {[is_many_config $name]} { - lappend global_config($name) $value - } else { - set global_config($name) $value - } - } - } - close $fd_rc - } - } - - array unset repo_config - catch { - set fd_rc [git_read config --list] - while {[gets $fd_rc line] >= 0} { - if {[regexp {^([^=]+)=(.*)$} $line line name value]} { - if {[is_many_config $name]} { - lappend repo_config($name) $value - } else { - set repo_config($name) $value - } - } - } - close $fd_rc - } - - foreach name [array names default_config] { - if {[catch {set v $global_config($name)}]} { - set global_config($name) $default_config($name) - } - if {[catch {set v $repo_config($name)}]} { - set repo_config($name) $default_config($name) - } - } - } - +###################################################################### +## +## handy utils + +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} { + 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 {} + } + } + + foreach p $_search_path { + set p [file join $p $what$_search_exe] + if {[file exists $p]} { + return [file normalize $p] + } + } + return {} +} + +proc _lappend_nice {cmd_var} { + global _nice + upvar $cmd_var cmd + + if {![info exists _nice]} { + set _nice [_which nice] + } + if {$_nice ne {}} { + lappend cmd $_nice + } +} + +proc git {args} { + set opt [list exec] + + 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] + + return [eval $opt $cmdp $args] +} + +proc _open_stdout_stderr {cmd} { + if {[catch { + set fd [open $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 \ + [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] + + return [open [concat $opt $cmdp $args] w] +} + +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 +} + ++set root_exists 0 ++bind . { ++ bind . {} ++ set root_exists 1 ++} ++ ++if {[is_Windows]} { ++ wm iconbitmap . -default $oguilib/git-gui.ico ++} ++ ++###################################################################### ++## ++## config defaults ++ ++set cursor_ptr arrow ++font create font_diff -family Courier -size 10 ++font create font_ui ++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 Menu Message ++ Radiobutton Spinbox Text} { ++ option add *$class.font font_ui ++} ++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 ++ } ++} ++ ++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.matchtrackingbranch) false ++set default_config(gui.pruneduringfetch) false ++set default_config(gui.trustmtime) false ++set default_config(gui.diffcontext) 5 ++set default_config(gui.newbranchtemplate) {} ++set default_config(gui.fontui) [font configure font_ui] ++set default_config(gui.fontdiff) [font configure font_diff] ++set font_descs { ++ {fontui font_ui {mc "Main Font"}} ++ {fontdiff font_diff {mc "Diff/Console Font"}} ++} ++ +###################################################################### +## +## 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 "git-gui: fatal error" \ ++ -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 "git-gui: fatal error" \ - -message "Cannot parse Git version string:\n\n$_git_version" ++ -title [mc "git-gui: fatal error"] \ ++ -message [strcat [mc "Cannot parse Git version string:"] "\n\n$_git_version"] + exit 1 +} + +set _real_git_version $_git_version +regsub -- {-dirty$} $_git_version {} _git_version +regsub {\.[0-9]+\.g[0-9a-f]+$} $_git_version {} _git_version +regsub {\.rc[0-9]+$} $_git_version {} _git_version +regsub {\.GIT$} $_git_version {} _git_version +regsub {\.[a-zA-Z]+\.[0-9]+$} $_git_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 "Git version cannot be determined. ++ -message [mc "Git version cannot be determined. + - $_git claims it is version '$_real_git_version'. ++%s claims it is version '%s'. + - [appname] requires at least Git 1.5.0 or later. ++%s requires at least Git 1.5.0 or later. + - Assume '$_real_git_version' is version 1.5.0? - "] eq {yes}} { ++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 "git-gui: fatal error" \ ++ -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 oguilib {@@GITGUI_LIBDIR@@} - set oguirel {@@GITGUI_RELATIVE@@} - if {$oguirel eq {1}} { - set oguilib [file dirname [file dirname [file normalize $argv0]]] - set oguilib [file join $oguilib share git-gui lib] - } elseif {[string match @@* $oguirel]} { - set oguilib [file join [file dirname [file normalize $argv0]] lib] - } - +set idx [file join $oguilib tclIndex] +if {[catch {set fd [open $idx r]} err]} { + catch {wm withdraw .} + tk_messageBox \ + -icon error \ + -type ok \ - -title "git-gui: fatal error" \ ++ -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 oguirel idx fd ++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 ++ } ++ } ++ } ++ } ++ 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 ++ } ++ } ++ } ++ close $fd_rc ++ } ++ } ++} ++ ++proc load_config {include_global} { ++ global repo_config global_config default_config ++ ++ if {$include_global} { ++ _parse_config global_config --global ++ } ++ _parse_config repo_config ++ ++ foreach name [array names default_config] { ++ if {[catch {set v $global_config($name)}]} { ++ set global_config($name) $default_config($name) ++ } ++ if {[catch {set v $repo_config($name)}]} { ++ set repo_config($name) $default_config($name) ++ } ++ } ++} + +###################################################################### +## +## feature option selection + - if {[regexp {^git-(.+)$} [appname] _junk subcommand]} { ++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 + + disable_option multicommit + disable_option branch + disable_option transport +} +} + +###################################################################### +## +## repository setup + +if {[catch { + set _gitdir $env(GIT_DIR) + set _prefix {} + }] + && [catch { + set _gitdir [git rev-parse --git-dir] + set _prefix [git rev-parse --show-prefix] + } err]} { - catch {wm withdraw .} - error_popup "Cannot find the git directory:\n\n$err" - exit 1 ++ load_config 1 ++ apply_config ++ choose_repository::pick +} +if {![file isdirectory $_gitdir] && [is_Cygwin]} { - catch {set _gitdir [exec cygpath --unix $_gitdir]} ++ catch {set _gitdir [exec cygpath --windows $_gitdir]} +} +if {![file isdirectory $_gitdir]} { + catch {wm withdraw .} - error_popup "Git directory not found:\n\n$_gitdir" ++ error_popup [strcat [mc "Git directory not found:"] "\n\n$_gitdir"] + exit 1 +} +if {$_prefix ne {}} { + regsub -all {[^/]+/} $_prefix ../ cdup + if {[catch {cd $cdup} err]} { + catch {wm withdraw .} - error_popup "Cannot move to top of working directory:\n\n$err" ++ error_popup [strcat [mc "Cannot move to top of working directory:"] "\n\n$err"] + exit 1 + } + unset cdup +} elseif {![is_enabled bare]} { + if {[lindex [file split $_gitdir] end] ne {.git}} { + catch {wm withdraw .} - error_popup "Cannot use funny .git directory:\n\n$_gitdir" ++ error_popup [strcat [mc "Cannot use funny .git directory:"] "\n\n$_gitdir"] + exit 1 + } + if {[catch {cd [file dirname $_gitdir]} err]} { + catch {wm withdraw .} - error_popup "No working directory [file dirname $_gitdir]:\n\n$err" ++ error_popup [strcat [mc "No working directory"] " [file dirname $_gitdir]:\n\n$err"] + exit 1 + } +} +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] +} + +###################################################################### +## +## 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 selected_commit_type new + +###################################################################### +## +## 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 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]} { + } 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 {Refreshing file status...} ++ 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_link {} + set is_git_info_exclude {} + proc have_info_exclude {} { + global is_git_info_link is_git_info_exclude + + if {$is_git_info_link eq {}} { + set is_git_info_link [file isfile [gitdir info.lnk]] + } + + if {$is_git_info_link} { + 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 { + return [file readable [gitdir 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 + } + + 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=$user_exclude" + } + + set buf_rdi {} + set buf_rdf {} + set buf_rlo {} + + set rescan_active 3 - ui_status {Scanning for modified files ...} ++ ui_status [mc "Scanning for modified files ..."] + set fd_di [git_read diff-index --cached -z [PARENT]] + set fd_df [git_read diff-files -z] + set fd_lo [eval git_read ls-files --others -z $ls_others] + + fconfigure $fd_di -blocking 0 -translation binary -encoding binary + fconfigure $fd_df -blocking 0 -translation binary -encoding binary + fconfigure $fd_lo -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] + fileevent $fd_lo readable [list read_ls_others $fd_lo $after] +} + +proc load_message {file} { + global ui_comm + + set f [gitdir $file] + if {[file isfile $f]} { + if {[catch {set fd [open $f r]}]} { + return 0 + } + fconfigure $fd -eofchar {} + 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 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 + uplevel #0 $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 + } + + 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" +} + +proc display_all_files {} { + global ui_index ui_workdir + global file_states file_lists + global last_clicked + + $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] + + foreach path [lsort [array names file_states]] { + set s $file_states($path) + set m [lindex $s 0] + set icon_name [lindex $s 1] + + 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 + } + } + + $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_parttick -background white -foreground "#005050" -data { +#define parttick_width 14 +#define parttick_height 15 +static unsigned char parttick_bits[] = { + 0xfe, 0x01, 0x02, 0x03, 0x7a, 0x05, 0x02, 0x09, 0x7a, 0x1f, 0x02, 0x10, + 0x7a, 0x14, 0x02, 0x16, 0x02, 0x13, 0x8a, 0x11, 0xda, 0x10, 0x72, 0x10, + 0x22, 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 + +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_fulltick +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(_$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 max_status_desc 0 +foreach i { - {__ "Unmodified"} - - {_M "Modified, not staged"} - {M_ "Staged for commit"} - {MM "Portions staged for commit"} - {MD "Staged for commit, missing"} - - {_O "Untracked, not staged"} - {A_ "Staged for commit"} - {AM "Portions staged for commit"} - {AD "Staged for commit, missing"} - - {_D "Missing"} - {D_ "Staged for removal"} - {DO "Staged for removal, still present"} - - {U_ "Requires merge resolution"} - {UU "Requires merge resolution"} - {UM "Requires merge resolution"} - {UD "Requires merge resolution"} ++ {__ {mc "Unmodified"}} ++ ++ {_M {mc "Modified, not staged"}} ++ {M_ {mc "Staged for commit"}} ++ {MM {mc "Portions staged for commit"}} ++ {MD {mc "Staged for commit, 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"}} ++ {UU {mc "Requires merge resolution"}} ++ {UM {mc "Requires merge resolution"}} ++ {UD {mc "Requires merge resolution"}} + } { - if {$max_status_desc < [string length [lindex $i 1]]} { - set max_status_desc [string length [lindex $i 1]] ++ 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]) [lindex $i 1] ++ set all_descs([lindex $i 0]) $text +} +unset i + +###################################################################### +## +## util + - 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 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 {Starting gitk... please wait...} ++set starting_gitk_msg [mc "Starting gitk... please wait..."] + +proc do_gitk {revs} { + # -- Always start gitk through whatever we were loaded with. This + # lets us bypass using shell process on Windows systems. + # + set exe [file join [file dirname $::_git] gitk] + set cmd [list [info nameofexecutable] $exe] + if {! [file exists $exe]} { - error_popup "Unable to start gitk:\n\n$exe does not exist" ++ error_popup [mc "Unable to start gitk:\n\n%s does not exist" $exe] + } else { + global env + + if {[info exists env(GIT_DIR)]} { + set old_GIT_DIR $env(GIT_DIR) + } else { + set old_GIT_DIR {} + } + + set pwd [pwd] + cd [file dirname [gitdir]] + set env(GIT_DIR) [file tail [gitdir]] + + eval exec $cmd $revs & + + if {$old_GIT_DIR eq {}} { + unset env(GIT_DIR) + } else { + set env(GIT_DIR) $old_GIT_DIR + } + cd $pwd + + ui_status $::starting_gitk_msg + after 10000 { + ui_ready $starting_gitk_msg + } + } +} + +set is_quitting 0 + +proc do_quit {} { + global ui_comm is_quitting repo_config commit_type + global GITGUI_BCK_exists GITGUI_BCK_i + + 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] + puts -nonewline $fd $msg + close $fd + } + } else { + catch {file delete $save} + } + } + + # -- 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_geometry [list] + lappend cfg_geometry [wm geometry .] - lappend cfg_geometry [lindex [.vpane sash coord 0] 1] - lappend cfg_geometry [lindex [.vpane.files sash coord 0] 0] ++ 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} + } + } + + destroy . +} + +proc do_rescan {} { + rescan ui_ready +} + +proc do_commit {} { + commit_tree +} + +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 + + if {$col == 0} { + if {$current_diff_path eq $path} { + set after {reshow_diff;} + } else { + set after {} + } + 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 { + 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 +} + +###################################################################### +## - ## config defaults - - set cursor_ptr arrow - font create font_diff -family Courier -size 10 - font create font_ui - 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 Menu Message - Radiobutton Spinbox Text} { - option add *$class.font font_ui - } - 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 apply_config {} { - global repo_config font_descs - - foreach option $font_descs { - set name [lindex $option 0] - set font [lindex $option 1] - if {[catch { - foreach {cn cv} $repo_config(gui.$name) { - font configure $font $cn $cv -weight normal - } - } err]} { - error_popup "Invalid font specified in 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 - } - } - - 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) {} ++## ui construction + - set default_config(gui.matchtrackingbranch) false - set default_config(gui.pruneduringfetch) false - set default_config(gui.trustmtime) false - set default_config(gui.diffcontext) 5 - set default_config(gui.newbranchtemplate) {} - set default_config(gui.fontui) [font configure font_ui] - set default_config(gui.fontdiff) [font configure font_diff] - set font_descs { - {fontui font_ui {Main Font}} - {fontdiff font_diff {Diff/Console Font}} - } +load_config 0 +apply_config - - ###################################################################### - ## - ## ui construction - +set ui_comm {} + +# -- Menu Bar +# +menu .mbar -tearoff 0 - .mbar add cascade -label Repository -menu .mbar.repository - .mbar add cascade -label Edit -menu .mbar.edit ++.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 Branch -menu .mbar.branch ++ .mbar add cascade -label [mc Branch] -menu .mbar.branch +} +if {[is_enabled multicommit] || [is_enabled singlecommit]} { - .mbar add cascade -label Commit -menu .mbar.commit ++ .mbar add cascade -label [mc Commit@@noun] -menu .mbar.commit +} +if {[is_enabled transport]} { - .mbar add cascade -label Merge -menu .mbar.merge - .mbar add cascade -label Fetch -menu .mbar.fetch - .mbar add cascade -label Push -menu .mbar.push ++ .mbar add cascade -label [mc Merge] -menu .mbar.merge ++ .mbar add cascade -label [mc Remote] -menu .mbar.remote +} +. configure -menu .mbar + +# -- Repository Menu +# +menu .mbar.repository + +.mbar.repository add command \ - -label {Browse Current Branch's Files} \ ++ -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 {Browse Branch Files...} \ ++ -label [mc "Browse Branch Files..."] \ + -command browser_open::dialog +.mbar.repository add separator + +.mbar.repository add command \ - -label {Visualize Current Branch's History} \ ++ -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 {Visualize All Branch History} \ ++ -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 "Browse $current_branch's Files" ++ -label [mc "Browse %s's Files" $current_branch] + .mbar.repository entryconf $::ui_visualize_current \ - -label "Visualize $current_branch's History" ++ -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 {Database Statistics} \ ++ .mbar.repository add command -label [mc "Database Statistics"] \ + -command do_stats + - .mbar.repository add command -label {Compress Database} \ ++ .mbar.repository add command -label [mc "Compress Database"] \ + -command do_gc + - .mbar.repository add command -label {Verify Database} \ ++ .mbar.repository add command -label [mc "Verify Database"] \ + -command do_fsck_objects + + .mbar.repository add separator + + if {[is_Cygwin]} { + .mbar.repository add command \ - -label {Create Desktop Icon} \ ++ -label [mc "Create Desktop Icon"] \ + -command do_cygwin_shortcut + } elseif {[is_Windows]} { + .mbar.repository add command \ - -label {Create Desktop Icon} \ ++ -label [mc "Create Desktop Icon"] \ + -command do_windows_shortcut + } elseif {[is_MacOSX]} { + .mbar.repository add command \ - -label {Create Desktop Icon} \ ++ -label [mc "Create Desktop Icon"] \ + -command do_macosx_app + } +} + - .mbar.repository add command -label Quit \ ++.mbar.repository add command -label [mc Quit] \ + -command do_quit \ + -accelerator $M1T-Q + +# -- Edit Menu +# +menu .mbar.edit - .mbar.edit add command -label Undo \ ++.mbar.edit add command -label [mc Undo] \ + -command {catch {[focus] edit undo}} \ + -accelerator $M1T-Z - .mbar.edit add command -label Redo \ ++.mbar.edit add command -label [mc Redo] \ + -command {catch {[focus] edit redo}} \ + -accelerator $M1T-Y +.mbar.edit add separator - .mbar.edit add command -label Cut \ ++.mbar.edit add command -label [mc Cut] \ + -command {catch {tk_textCut [focus]}} \ + -accelerator $M1T-X - .mbar.edit add command -label Copy \ ++.mbar.edit add command -label [mc Copy] \ + -command {catch {tk_textCopy [focus]}} \ + -accelerator $M1T-C - .mbar.edit add command -label Paste \ ++.mbar.edit add command -label [mc Paste] \ + -command {catch {tk_textPaste [focus]; [focus] see insert}} \ + -accelerator $M1T-V - .mbar.edit add command -label Delete \ ++.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 {Select All} \ ++.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 {Create...} \ ++ .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 {Checkout...} \ ++ .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 {Rename...} \ ++ .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 {Delete...} \ ++ .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 {Reset...} \ ++ .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 +# +if {[is_enabled multicommit] || [is_enabled singlecommit]} { + menu .mbar.commit + + .mbar.commit add radiobutton \ - -label {New Commit} \ ++ -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 {Amend Last Commit} \ ++ -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 Rescan \ ++ .mbar.commit add command -label [mc Rescan] \ + -command do_rescan \ + -accelerator F5 + lappend disable_on_lock \ + [list .mbar.commit entryconf [.mbar.commit index last] -state] + - .mbar.commit add command -label {Stage To Commit} \ - -command do_add_selection ++ .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 {Stage Changed Files To Commit} \ ++ .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 {Unstage From Commit} \ ++ .mbar.commit add command -label [mc "Unstage From Commit"] \ + -command do_unstage_selection + lappend disable_on_lock \ + [list .mbar.commit entryconf [.mbar.commit index last] -state] + - .mbar.commit add command -label {Revert Changes} \ ++ .mbar.commit add command -label [mc "Revert Changes"] \ + -command do_revert_selection + lappend disable_on_lock \ + [list .mbar.commit entryconf [.mbar.commit index last] -state] + + .mbar.commit add separator + - .mbar.commit add command -label {Sign Off} \ ++ .mbar.commit add command -label [mc "Sign Off"] \ + -command do_signoff \ + -accelerator $M1T-S + - .mbar.commit add command -label Commit \ ++ .mbar.commit add command -label [mc Commit@@verb] \ + -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 {Local 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 {Abort Merge...} \ ++ .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.fetch ++ menu .mbar.remote + - menu .mbar.push - .mbar.push add command -label {Push...} \ ++ .mbar.remote add command \ ++ -label [mc "Push..."] \ + -command do_push_anywhere \ + -accelerator $M1T-P - .mbar.push add command -label {Delete...} \ ++ .mbar.remote add command \ ++ -label [mc "Delete..."] \ + -command remote_branch_delete::dialog +} + +if {[is_MacOSX]} { + # -- Apple Menu (Mac OS X only) + # - .mbar add cascade -label Apple -menu .mbar.apple ++ .mbar add cascade -label [mc Apple] -menu .mbar.apple + menu .mbar.apple + - .mbar.apple add command -label "About [appname]" \ ++ .mbar.apple add command -label [mc "About %s" [appname]] \ + -command do_about - .mbar.apple add command -label "Options..." \ - -command do_options ++ .mbar.apple add separator ++ .mbar.apple add command \ ++ -label [mc "Preferences..."] \ ++ -command do_options \ ++ -accelerator $M1T-, ++ bind . <$M1B-,> do_options +} else { + # -- Edit Menu + # + .mbar.edit add separator - .mbar.edit add command -label {Options...} \ ++ .mbar.edit add command -label [mc "Options..."] \ + -command do_options +} + +# -- Help Menu +# - .mbar add cascade -label Help -menu .mbar.help ++.mbar add cascade -label [mc Help] -menu .mbar.help +menu .mbar.help + +if {![is_MacOSX]} { - .mbar.help add command -label "About [appname]" \ ++ .mbar.help add command -label [mc "About %s" [appname]] \ + -command do_about +} + +set browser {} +catch {set browser $repo_config(instaweb.browser)} +set doc_path [file dirname [gitexec]] +set doc_path [file join $doc_path Documentation index.html] + +if {[is_Cygwin]} { + set doc_path [exec cygpath --mixed $doc_path] +} + +if {$browser eq {}} { + if {[is_MacOSX]} { + set browser open + } elseif {[is_Cygwin]} { + set program_files [file dirname [exec cygpath --windir]] + set program_files [file join $program_files {Program Files}] + set firefox [file join $program_files {Mozilla Firefox} firefox.exe] + set ie [file join $program_files {Internet Explorer} IEXPLORE.EXE] + if {[file exists $firefox]} { + set browser $firefox + } elseif {[file exists $ie]} { + set browser $ie + } + unset program_files firefox ie + } +} + +if {[file isfile $doc_path]} { + set doc_url "file:$doc_path" +} else { + set doc_url {http://www.kernel.org/pub/software/scm/git/docs/} +} + +if {$browser ne {}} { - .mbar.help add command -label {Online Documentation} \ ++ .mbar.help add command -label [mc "Online Documentation"] \ + -command [list exec $browser $doc_url &] +} +unset browser doc_path doc_url + - set root_exists 0 - bind . { - bind . {} - set root_exists 1 - } - +# -- 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 {} { + puts stderr "usage: $::argv0 $::subcommand $::subcommand_args" + exit 1 +} + +# -- Not a normal commit type invocation? Do that instead! +# +switch -- $subcommand { +browser - +blame { + set subcommand_args {rev? path} + if {$argv eq {}} usage + set head {} + set path {} + set is_path 0 + foreach a $argv { + if {$is_path || [file exists $_prefix$a]} { + if {$path ne {}} usage + set path $_prefix$a + break + } elseif {$a eq {--}} { + if {$path ne {}} { + if {$head ne {}} usage + set head $path + set path {} + } + set is_path 1 + } elseif {$head eq {}} { + if {$head ne {}} usage + set head $a + set is_path 1 + } else { + usage + } + } + unset is_path + + if {$head ne {} && $path eq {}} { + set path $_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]} { + puts stderr $err + exit 1 + } + } + set current_branch $head + } + + switch -- $subcommand { + browser { + 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]} { - puts stderr "fatal: cannot stat path $path: No such file or directory" ++ puts stderr [mc "fatal: cannot stat path %s: No such file or directory" $path] + exit 1 + } + blame::new $head $path + } + } + return +} +citool - +gui { + if {[llength $argv] != 0} { + puts -nonewline stderr "usage: $argv0" - if {$subcommand ne {gui} && [appname] ne "git-$subcommand"} { ++ if {$subcommand ne {gui} ++ && [file tail $argv0] ne "git-$subcommand"} { + puts -nonewline stderr " $subcommand" + } + puts stderr {} + exit 1 + } + # fall through to setup UI for commits +} +default { + puts stderr "usage: $argv0 \[{blame|browser|citool}\]" + exit 1 +} +} + +# -- Branch Control +# +frame .branch \ + -borderwidth 1 \ + -relief sunken +label .branch.l1 \ - -text {Current Branch:} \ ++ -text [mc "Current Branch:"] \ + -anchor w \ + -justify left +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 +# - panedwindow .vpane -orient vertical - panedwindow .vpane.files -orient horizontal ++panedwindow .vpane -orient horizontal ++panedwindow .vpane.files -orient vertical +.vpane add .vpane.files -sticky nsew -height 100 -width 200 +pack .vpane -anchor n -side top -fill both -expand 1 + +# -- Index File List +# +frame .vpane.files.index -height 100 -width 200 - label .vpane.files.index.title -text {Staged Changes (Will Be Committed)} \ ++label .vpane.files.index.title -text [mc "Staged Changes (Will Commit)"] \ + -background lightgreen +text $ui_index -background white -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 +scrollbar .vpane.files.index.sx -orient h -command [list $ui_index xview] +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 - .vpane.files add .vpane.files.index -sticky nsew + +# -- Working Directory File List +# +frame .vpane.files.workdir -height 100 -width 200 - label .vpane.files.workdir.title -text {Unstaged Changes (Will Not Be Committed)} \ ++label .vpane.files.workdir.title -text [mc "Unstaged Changes"] \ + -background lightsalmon +text $ui_workdir -background white -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 +scrollbar .vpane.files.workdir.sx -orient h -command [list $ui_workdir xview] +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 -sticky nsew ++.vpane.files add .vpane.files.index -sticky nsew + +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 +# +frame .vpane.lower -height 300 -width 400 +frame .vpane.lower.commarea +frame .vpane.lower.diff -relief sunken -borderwidth 1 - pack .vpane.lower.commarea -side top -fill x - pack .vpane.lower.diff -side bottom -fill both -expand 1 ++pack .vpane.lower.diff -fill both -expand 1 ++pack .vpane.lower.commarea -side bottom -fill x +.vpane add .vpane.lower -sticky nsew + +# -- Commit Area Buttons +# +frame .vpane.lower.commarea.buttons +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 + - button .vpane.lower.commarea.buttons.rescan -text {Rescan} \ ++button .vpane.lower.commarea.buttons.rescan -text [mc Rescan] \ + -command do_rescan +pack .vpane.lower.commarea.buttons.rescan -side top -fill x +lappend disable_on_lock \ + {.vpane.lower.commarea.buttons.rescan conf -state} + - button .vpane.lower.commarea.buttons.incall -text {Stage Changed} \ ++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} + - button .vpane.lower.commarea.buttons.signoff -text {Sign Off} \ ++button .vpane.lower.commarea.buttons.signoff -text [mc "Sign Off"] \ + -command do_signoff +pack .vpane.lower.commarea.buttons.signoff -side top -fill x + - button .vpane.lower.commarea.buttons.commit -text {Commit} \ ++button .vpane.lower.commarea.buttons.commit -text [mc Commit@@verb] \ + -command do_commit +pack .vpane.lower.commarea.buttons.commit -side top -fill x +lappend disable_on_lock \ + {.vpane.lower.commarea.buttons.commit conf -state} + - button .vpane.lower.commarea.buttons.push -text {Push} \ ++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 +# +frame .vpane.lower.commarea.buffer +frame .vpane.lower.commarea.buffer.header +set ui_comm .vpane.lower.commarea.buffer.t +set ui_coml .vpane.lower.commarea.buffer.header.l +radiobutton .vpane.lower.commarea.buffer.header.new \ - -text {New Commit} \ ++ -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] +radiobutton .vpane.lower.commarea.buffer.header.amend \ - -text {Amend Last Commit} \ ++ -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] +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 {Initial Commit Message:}} - amend {set txt {Amended Commit Message:}} - amend-initial {set txt {Amended Initial Commit Message:}} - amend-merge {set txt {Amended Merge Commit Message:}} - merge {set txt {Merge Commit Message:}} - * {set txt {Commit Message:}} ++ 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 +pack .vpane.lower.commarea.buffer.header.amend -side right +pack .vpane.lower.commarea.buffer.header.new -side right + +text $ui_comm -background white -borderwidth 1 \ + -undo true \ + -maxundo 20 \ + -autoseparators true \ + -relief sunken \ + -width 75 -height 9 -wrap none \ + -font font_diff \ + -yscrollcommand {.vpane.lower.commarea.buffer.sby set} +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 {Cut} \ ++ -label [mc Cut] \ + -command {tk_textCut $ui_comm} +$ctxm add command \ - -label {Copy} \ ++ -label [mc Copy] \ + -command {tk_textCopy $ui_comm} +$ctxm add command \ - -label {Paste} \ ++ -label [mc Paste] \ + -command {tk_textPaste $ui_comm} +$ctxm add command \ - -label {Delete} \ ++ -label [mc Delete] \ + -command {$ui_comm delete sel.first sel.last} +$ctxm add separator +$ctxm add command \ - -label {Select All} \ ++ -label [mc "Select All"] \ + -command {focus $ui_comm;$ui_comm tag add sel 0.0 end} +$ctxm add command \ - -label {Copy All} \ ++ -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 {Sign Off} \ ++ -label [mc "Sign Off"] \ + -command do_signoff +bind_button3 $ui_comm "tk_popup $ctxm %X %Y" + +# -- 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 {File:} ++ 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 + +frame .vpane.lower.diff.header -background gold +label .vpane.lower.diff.header.status \ + -background gold \ + -width $max_status_desc \ + -anchor w \ + -justify left +label .vpane.lower.diff.header.file \ + -background gold \ + -anchor w \ + -justify left +label .vpane.lower.diff.header.path \ + -background gold \ + -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 {Copy} \ ++ -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 +# +frame .vpane.lower.diff.body +set ui_diff .vpane.lower.diff.body.t +text $ui_diff -background white -borderwidth 0 \ + -width 80 -height 15 -wrap none \ + -font font_diff \ + -xscrollcommand {.vpane.lower.diff.body.sbx set} \ + -yscrollcommand {.vpane.lower.diff.body.sby set} \ + -state disabled +scrollbar .vpane.lower.diff.body.sbx -orient horizontal \ + -command [list $ui_diff xview] +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 + +$ui_diff tag conf d_cr -elide true +$ui_diff tag conf d_@ -foreground blue -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 +# +set ctxm .vpane.lower.diff.body.ctxm +menu $ctxm -tearoff 0 +$ctxm add command \ - -label {Refresh} \ ++ -label [mc Refresh] \ + -command reshow_diff +lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] +$ctxm add command \ - -label {Copy} \ ++ -label [mc Copy] \ + -command {tk_textCopy $ui_diff} +lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] +$ctxm add command \ - -label {Select All} \ ++ -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 {Copy All} \ ++ -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 {Apply/Reverse Hunk} \ ++ -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 separator +$ctxm add command \ - -label {Decrease Font Size} \ ++ -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 {Increase Font Size} \ ++ -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 +$ctxm add command \ - -label {Show Less Context} \ ++ -label [mc "Show Less Context"] \ + -command {if {$repo_config(gui.diffcontext) >= 1} { + incr repo_config(gui.diffcontext) -1 + reshow_diff + }} +lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] +$ctxm add command \ - -label {Show More Context} \ ++ -label [mc "Show More Context"] \ + -command {if {$repo_config(gui.diffcontext) < 99} { + incr repo_config(gui.diffcontext) + reshow_diff + }} +lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] +$ctxm add separator - $ctxm add command -label {Options...} \ ++$ctxm add command -label [mc "Options..."] \ + -command do_options +proc popup_diff_menu {ctxm x y X Y} { + global current_diff_path file_states + set ::cursorX $x + set ::cursorY $y + if {$::ui_index eq $::current_diff_side} { - set l "Unstage Hunk From Commit" ++ set l [mc "Unstage Hunk From Commit"] + } else { - set l "Stage Hunk For Commit" ++ set l [mc "Stage Hunk For Commit"] + } + if {$::is_3way_diff + || $current_diff_path eq {} + || ![info exists file_states($current_diff_path)] + || {_O} eq [lindex $file_states($current_diff_path) 0]} { + set s disabled + } else { + set s normal + } + $ctxm entryconf $::ui_diff_applyhunk -state $s -label $l + tk_popup $ctxm $X $Y +} +bind_button3 $ui_diff [list popup_diff_menu $ctxm %x %y %X %Y] + +# -- Status Bar +# +set main_status [::status_bar::new .status] +pack .status -anchor w -side bottom -fill x - $main_status show {Initializing...} ++$main_status show [mc "Initializing..."] + +# -- Load geometry +# +catch { +set gm $repo_config(gui.geometry) +wm geometry . [lindex $gm 0] +.vpane sash place 0 \ - [lindex [.vpane sash coord 0] 0] \ - [lindex $gm 1] ++ [lindex $gm 1] \ ++ [lindex [.vpane sash coord 0] 1] +.vpane.files sash place 0 \ - [lindex $gm 2] \ - [lindex [.vpane.files sash coord 0] 1] ++ [lindex [.vpane.files sash coord 0] 0] \ ++ [lindex $gm 2] +unset gm +} + +# -- 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-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_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 {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 . do_rescan +bind . <$M1B-Key-r> do_rescan +bind . <$M1B-Key-R> 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-i> do_add_all +bind . <$M1B-Key-I> do_add_all +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 [file dirname [gitdir]]]" +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 "Possible environment issues exist. ++ set msg [mc "Possible environment issues exist. + +The following environment variables are probably +going to be ignored by any Git subprocess run - by [appname]: ++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_CONFIG_LOCAL$} - + {^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 " ++ append msg [mc " +This is due to a known issue with the - Tcl binary distributed by Cygwin." ++Tcl binary distributed by Cygwin."] + + if {$suggest_user ne {}} { - append msg " ++ append msg [mc " + - A good replacement for $suggest_user ++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 + - populate_fetch_menu ++ set n [.mbar.remote index end] + populate_push_menu ++ populate_fetch_menu ++ set n [expr {[.mbar.remote index end] - $n}] ++ if {$n > 0} { ++ .mbar.remote insert $n separator ++ } ++ unset n +} + +if {[winfo exists $ui_comm]} { + set GITGUI_BCK_exists [load_message GITGUI_BCK] + + # -- 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] + 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 +} + +lock_index begin-read +if {![winfo ismapped .]} { + wm deiconify . +} +after 1 do_rescan +if {[is_enabled multicommit]} { + after 1000 hint_gc +} diff --cc git-gui/lib/about.tcl index 000000000,000000000..719fc547b new file mode 100644 --- /dev/null +++ b/git-gui/lib/about.tcl @@@ -1,0 -1,0 +1,81 @@@ ++# git-gui about git-gui dialog ++# Copyright (C) 2006, 2007 Shawn Pearce ++ ++proc do_about {} { ++ global appvers copyright oguilib ++ global tcl_patchLevel tk_patchLevel ++ ++ set w .about_dialog ++ toplevel $w ++ wm geometry $w "+[winfo rootx .]+[winfo rooty .]" ++ ++ pack [git_logo $w.git_logo] -side left -fill y -padx 10 -pady 10 ++ label $w.header -text [mc "About %s" [appname]] \ ++ -font font_uibold ++ pack $w.header -side top -fill x ++ ++ frame $w.buttons ++ button $w.buttons.close -text {Close} \ ++ -default active \ ++ -command [list destroy $w] ++ pack $w.buttons.close -side right ++ pack $w.buttons -side bottom -fill x -pady 10 -padx 10 ++ ++ label $w.desc \ ++ -text "[mc "git-gui - a graphical user interface for Git."]\n$copyright" \ ++ -padx 5 -pady 5 \ ++ -justify left \ ++ -anchor w \ ++ -borderwidth 1 \ ++ -relief solid ++ pack $w.desc -side top -fill x -padx 5 -pady 5 ++ ++ set v {} ++ append v "git-gui version $appvers\n" ++ append v "[git version]\n" ++ append v "\n" ++ if {$tcl_patchLevel eq $tk_patchLevel} { ++ append v "Tcl/Tk version $tcl_patchLevel" ++ } else { ++ append v "Tcl version $tcl_patchLevel" ++ append v ", Tk version $tk_patchLevel" ++ } ++ ++ set d {} ++ append d "git wrapper: $::_git\n" ++ append d "git exec dir: [gitexec]\n" ++ append d "git-gui lib: $oguilib" ++ ++ label $w.vers \ ++ -text $v \ ++ -padx 5 -pady 5 \ ++ -justify left \ ++ -anchor w \ ++ -borderwidth 1 \ ++ -relief solid ++ pack $w.vers -side top -fill x -padx 5 -pady 5 ++ ++ label $w.dirs \ ++ -text $d \ ++ -padx 5 -pady 5 \ ++ -justify left \ ++ -anchor w \ ++ -borderwidth 1 \ ++ -relief solid ++ pack $w.dirs -side top -fill x -padx 5 -pady 5 ++ ++ menu $w.ctxm -tearoff 0 ++ $w.ctxm add command \ ++ -label {Copy} \ ++ -command " ++ clipboard clear ++ clipboard append -format STRING -type STRING -- \[$w.vers cget -text\] ++ " ++ ++ bind $w "grab $w; focus $w.buttons.close" ++ bind $w "destroy $w" ++ bind $w "destroy $w" ++ bind_button3 $w.vers "tk_popup $w.ctxm %X %Y; grab $w; focus $w" ++ wm title $w "About [appname]" ++ tkwait window $w ++} diff --cc git-gui/lib/blame.tcl index 96072847a,000000000..00ecf2133 mode 100644,000000..100644 --- a/git-gui/lib/blame.tcl +++ b/git-gui/lib/blame.tcl @@@ -1,992 -1,0 +1,980 @@@ +# git-gui blame viewer +# Copyright (C) 2006, 2007 Shawn Pearce + +class blame { + +image create photo ::blame::img_back_arrow -data {R0lGODlhGAAYAIUAAPwCBEzKXFTSZIz+nGzmhGzqfGTidIT+nEzGXHTqhGzmfGzifFzadETCVES+VARWDFzWbHzyjAReDGTadFTOZDSyRDyyTCymPARaFGTedFzSbDy2TCyqRCyqPARaDAyCHES6VDy6VCyiPAR6HCSeNByWLARyFARiDARqFGTifARiFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAYABgAAAajQIBwSCwaj8ikcsk0BppJwRPqHEypQwHBis0WDAdEFyBIKBaMAKLBdjQeSkFBYTBAIvgEoS6JmhUTEwIUDQ4VFhcMGEhyCgoZExoUaxsWHB0THkgfAXUGAhoBDSAVFR0XBnCbDRmgog0hpSIiDJpJIyEQhBUcJCIlwA22SSYVogknEg8eD82qSigdDSknY0IqJQXPYxIl1dZCGNvWw+Dm510GQQAh/mhDcmVhdGVkIGJ5IEJNUFRvR0lGIFBybyB2ZXJzaW9uIDIuNQ0KqSBEZXZlbENvciAxOTk3LDE5OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQpodHRwOi8vd3d3LmRldmVsY29yLmNvbQA7} + +# Persistant data (survives loads) +# +field history {}; # viewer history: {commit path} +field header ; # array commit,key -> header field + +# Tk UI control paths +# +field w ; # top window in this viewer +field w_back ; # our back button +field w_path ; # label showing the current file path +field w_columns ; # list of all column widgets in the viewer +field w_line ; # text column: all line numbers +field w_amov ; # text column: annotations + move tracking +field w_asim ; # text column: annotations (simple computation) +field w_file ; # text column: actual file data +field w_cviewer ; # pane showing commit message +field status ; # status mega-widget instance +field old_height ; # last known height of $w.file_pane + +# Tk UI colors +# +variable active_color #c0edc5 +variable group_colors { + #d6d6d6 + #e1e1e1 + #ececec +} + +# Switches for original location detection +# +variable original_options [list -C -C] +if {[git-version >= 1.5.3]} { + lappend original_options -w ; # ignore indentation changes +} + +# Current blame data; cleared/reset on each load +# +field commit ; # input commit to blame +field path ; # input filename to view in $commit + +field current_fd {} ; # background process running +field highlight_line -1 ; # current line selected +field highlight_column {} ; # current commit column selected +field highlight_commit {} ; # sha1 of commit selected + +field total_lines 0 ; # total length of file +field blame_lines 0 ; # number of lines computed +field amov_data ; # list of {commit origfile origline} +field asim_data ; # list of {commit origfile origline} + +field r_commit ; # commit currently being parsed +field r_orig_line ; # original line number +field r_final_line ; # final line number +field r_line_count ; # lines in this region + +field tooltip_wm {} ; # Current tooltip toplevel, if open +field tooltip_t {} ; # Text widget in $tooltip_wm +field tooltip_timer {} ; # Current timer event for our tooltip +field tooltip_commit {} ; # Commit(s) in tooltip + +constructor new {i_commit i_path} { + global cursor_ptr + variable active_color + variable group_colors + + set commit $i_commit + set path $i_path + + make_toplevel top w - wm title $top "[appname] ([reponame]): File Viewer" ++ wm title $top [append "[appname] ([reponame]): " [mc "File Viewer"]] + + frame $w.header -background gold + label $w.header.commit_l \ - -text {Commit:} \ ++ -text [mc "Commit:"] \ + -background gold \ + -anchor w \ + -justify left + set w_back $w.header.commit_b + label $w_back \ + -image ::blame::img_back_arrow \ + -borderwidth 0 \ + -relief flat \ + -state disabled \ + -background gold \ + -activebackground gold + bind $w_back " + if {\[$w_back cget -state\] eq {normal}} { + [cb _history_menu] + } + " + label $w.header.commit \ + -textvariable @commit \ + -background gold \ + -anchor w \ + -justify left + label $w.header.path_l \ - -text {File:} \ ++ -text [mc "File:"] \ + -background gold \ + -anchor w \ + -justify left + set w_path $w.header.path + label $w_path \ + -background gold \ + -anchor w \ + -justify left + pack $w.header.commit_l -side left + pack $w_back -side left + pack $w.header.commit -side left + pack $w_path -fill x -side right + pack $w.header.path_l -side right + + panedwindow $w.file_pane -orient vertical + frame $w.file_pane.out + frame $w.file_pane.cm + $w.file_pane add $w.file_pane.out \ + -sticky nsew \ + -minsize 100 \ + -height 100 \ + -width 100 + $w.file_pane add $w.file_pane.cm \ + -sticky nsew \ + -minsize 25 \ + -height 25 \ + -width 100 + + set w_line $w.file_pane.out.linenumber_t + text $w_line \ + -takefocus 0 \ + -highlightthickness 0 \ + -padx 0 -pady 0 \ + -background white -borderwidth 0 \ + -state disabled \ + -wrap none \ + -height 40 \ + -width 6 \ + -font font_diff + $w_line tag conf linenumber -justify right -rmargin 5 + + set w_amov $w.file_pane.out.amove_t + text $w_amov \ + -takefocus 0 \ + -highlightthickness 0 \ + -padx 0 -pady 0 \ + -background white -borderwidth 0 \ + -state disabled \ + -wrap none \ + -height 40 \ + -width 5 \ + -font font_diff + $w_amov tag conf author_abbr -justify right -rmargin 5 + $w_amov tag conf curr_commit + $w_amov tag conf prior_commit -foreground blue -underline 1 + $w_amov tag bind prior_commit \ + \ + "[cb _load_commit $w_amov @amov_data @%x,%y];break" + + set w_asim $w.file_pane.out.asimple_t + text $w_asim \ + -takefocus 0 \ + -highlightthickness 0 \ + -padx 0 -pady 0 \ + -background white -borderwidth 0 \ + -state disabled \ + -wrap none \ + -height 40 \ + -width 4 \ + -font font_diff + $w_asim tag conf author_abbr -justify right + $w_asim tag conf curr_commit + $w_asim tag conf prior_commit -foreground blue -underline 1 + $w_asim tag bind prior_commit \ + \ + "[cb _load_commit $w_asim @asim_data @%x,%y];break" + + set w_file $w.file_pane.out.file_t + text $w_file \ + -takefocus 0 \ + -highlightthickness 0 \ + -padx 0 -pady 0 \ + -background white -borderwidth 0 \ + -state disabled \ + -wrap none \ + -height 40 \ + -width 80 \ + -xscrollcommand [list $w.file_pane.out.sbx set] \ + -font font_diff + + set w_columns [list $w_amov $w_asim $w_line $w_file] + + scrollbar $w.file_pane.out.sbx \ + -orient h \ + -command [list $w_file xview] + scrollbar $w.file_pane.out.sby \ + -orient v \ + -command [list scrollbar2many $w_columns yview] + eval grid $w_columns $w.file_pane.out.sby -sticky nsew + grid conf \ + $w.file_pane.out.sbx \ + -column [expr {[llength $w_columns] - 1}] \ + -sticky we + grid columnconfigure \ + $w.file_pane.out \ + [expr {[llength $w_columns] - 1}] \ + -weight 1 + grid rowconfigure $w.file_pane.out 0 -weight 1 + + set w_cviewer $w.file_pane.cm.t + text $w_cviewer \ + -background white -borderwidth 0 \ + -state disabled \ + -wrap none \ + -height 10 \ + -width 80 \ + -xscrollcommand [list $w.file_pane.cm.sbx set] \ + -yscrollcommand [list $w.file_pane.cm.sby set] \ + -font font_diff + $w_cviewer tag conf still_loading \ + -font font_uiitalic \ + -justify center + $w_cviewer tag conf header_key \ + -tabs {3c} \ + -background $active_color \ + -font font_uibold + $w_cviewer tag conf header_val \ + -background $active_color \ + -font font_ui + $w_cviewer tag raise sel + scrollbar $w.file_pane.cm.sbx \ + -orient h \ + -command [list $w_cviewer xview] + scrollbar $w.file_pane.cm.sby \ + -orient v \ + -command [list $w_cviewer yview] + pack $w.file_pane.cm.sby -side right -fill y + pack $w.file_pane.cm.sbx -side bottom -fill x + pack $w_cviewer -expand 1 -fill both + + set status [::status_bar::new $w.status] + + menu $w.ctxm -tearoff 0 + $w.ctxm add command \ - -label "Copy Commit" \ ++ -label [mc "Copy Commit"] \ + -command [cb _copycommit] + + foreach i $w_columns { + for {set g 0} {$g < [llength $group_colors]} {incr g} { + $i tag conf color$g -background [lindex $group_colors $g] + } + + $i conf -cursor $cursor_ptr + $i conf -yscrollcommand [list many2scrollbar \ + $w_columns yview $w.file_pane.out.sby] + bind $i " + [cb _hide_tooltip] + [cb _click $i @%x,%y] + focus $i + " + bind $i [cb _show_tooltip $i @%x,%y] + bind $i [cb _hide_tooltip] + bind $i [cb _hide_tooltip] + bind_button3 $i " + [cb _hide_tooltip] + set cursorX %x + set cursorY %y + set cursorW %W + tk_popup $w.ctxm %X %Y + " + bind $i "[list focus $w_cviewer];break" + bind $i "[list focus $w_cviewer];break" + } + + foreach i [concat $w_columns $w_cviewer] { + bind $i {catch {%W yview scroll -1 units};break} + bind $i {catch {%W yview scroll 1 units};break} + bind $i {catch {%W xview scroll -1 units};break} + bind $i {catch {%W xview scroll 1 units};break} + bind $i {catch {%W yview scroll -1 units};break} + bind $i {catch {%W yview scroll 1 units};break} + bind $i {catch {%W xview scroll -1 units};break} + bind $i {catch {%W xview scroll 1 units};break} + bind $i {catch {%W yview scroll -1 pages};break} + bind $i {catch {%W yview scroll 1 pages};break} + } + + bind $w_cviewer "[list focus $w_file];break" + bind $w_cviewer "[list focus $w_file];break" + bind $w_cviewer [list focus $w_cviewer] + bind $w_file [list focus $w_file] + + grid configure $w.header -sticky ew + grid configure $w.file_pane -sticky nsew + grid configure $w.status -sticky ew + grid columnconfigure $top 0 -weight 1 + grid rowconfigure $top 0 -weight 0 + grid rowconfigure $top 1 -weight 1 + grid rowconfigure $top 2 -weight 0 + + set req_w [winfo reqwidth $top] + set req_h [winfo reqheight $top] + set scr_h [expr {[winfo screenheight $top] - 100}] + if {$req_w < 600} {set req_w 600} + if {$req_h < $scr_h} {set req_h $scr_h} + set g "${req_w}x${req_h}" + wm geometry $top $g + update + + set old_height [winfo height $w.file_pane] + $w.file_pane sash place 0 \ + [lindex [$w.file_pane sash coord 0] 0] \ + [expr {int($old_height * 0.70)}] + bind $w.file_pane \ + "if {{$w.file_pane} eq {%W}} {[cb _resize %h]}" + + _load $this {} +} + +method _load {jump} { + variable group_colors + + _hide_tooltip $this + + if {$total_lines != 0 || $current_fd ne {}} { + if {$current_fd ne {}} { + catch {close $current_fd} + set current_fd {} + } + + foreach i $w_columns { + $i conf -state normal + $i delete 0.0 end + foreach g [$i tag names] { + if {[regexp {^g[0-9a-f]{40}$} $g]} { + $i tag delete $g + } + } + $i conf -state disabled + } + + $w_cviewer conf -state normal + $w_cviewer delete 0.0 end + $w_cviewer conf -state disabled + + set highlight_line -1 + set highlight_column {} + set highlight_commit {} + set total_lines 0 + } + + if {$history eq {}} { + $w_back conf -state disabled + } else { + $w_back conf -state normal + } + + # Index 0 is always empty. There is never line 0 as + # we use only 1 based lines, as that matches both with + # git-blame output and with Tk's text widget. + # + set amov_data [list [list]] + set asim_data [list [list]] + - $status show "Reading $commit:[escape_path $path]..." ++ $status show [mc "Reading %s..." "$commit:[escape_path $path]"] + $w_path conf -text [escape_path $path] + if {$commit eq {}} { + set fd [open $path r] + fconfigure $fd -eofchar {} + } else { + set fd [git_read cat-file blob "$commit:$path"] + } + fconfigure $fd -blocking 0 -translation lf -encoding binary + fileevent $fd readable [cb _read_file $fd $jump] + set current_fd $fd +} + +method _history_menu {} { + set m $w.backmenu + if {[winfo exists $m]} { + $m delete 0 end + } else { + menu $m -tearoff 0 + } + + for {set i [expr {[llength $history] - 1}] + } {$i >= 0} {incr i -1} { + set e [lindex $history $i] + set c [lindex $e 0] + set f [lindex $e 1] + + if {[regexp {^[0-9a-f]{40}$} $c]} { + set t [string range $c 0 8]... + } elseif {$c eq {}} { + set t {Working Directory} + } else { + set t $c + } + if {![catch {set summary $header($c,summary)}]} { + append t " $summary" + if {[string length $t] > 70} { + set t [string range $t 0 66]... + } + } + + $m add command -label $t -command [cb _goback $i] + } + set X [winfo rootx $w_back] + set Y [expr {[winfo rooty $w_back] + [winfo height $w_back]}] + tk_popup $m $X $Y +} + +method _goback {i} { + set dat [lindex $history $i] + set history [lrange $history 0 [expr {$i - 1}]] + set commit [lindex $dat 0] + set path [lindex $dat 1] + _load $this [lrange $dat 2 5] +} + +method _read_file {fd jump} { + if {$fd ne $current_fd} { + catch {close $fd} + return + } + + foreach i $w_columns {$i conf -state normal} + while {[gets $fd line] >= 0} { + regsub "\r\$" $line {} line + incr total_lines + lappend amov_data {} + lappend asim_data {} + + if {$total_lines > 1} { + foreach i $w_columns {$i insert end "\n"} + } + + $w_line insert end "$total_lines" linenumber + $w_file insert end "$line" + } + + set ln_wc [expr {[string length $total_lines] + 2}] + if {[$w_line cget -width] < $ln_wc} { + $w_line conf -width $ln_wc + } + + foreach i $w_columns {$i conf -state disabled} + + if {[eof $fd]} { + close $fd + + # If we don't force Tk to update the widgets *right now* + # none of our jump commands will cause a change in the UI. + # + update + + if {[llength $jump] == 1} { + set highlight_line [lindex $jump 0] + $w_file see "$highlight_line.0" + } elseif {[llength $jump] == 4} { + set highlight_column [lindex $jump 0] + set highlight_line [lindex $jump 1] + $w_file xview moveto [lindex $jump 2] + $w_file yview moveto [lindex $jump 3] + } + + _exec_blame $this $w_asim @asim_data \ + [list] \ - { copy/move tracking} ++ [mc "Loading copy/move tracking annotations..."] + } +} ifdeleted { catch {close $fd} } + +method _exec_blame {cur_w cur_d options cur_s} { + lappend options --incremental + if {$commit eq {}} { + lappend options --contents $path + } else { + lappend options $commit + } + lappend options -- $path + set fd [eval git_read --nice blame $options] + fconfigure $fd -blocking 0 -translation lf -encoding binary + fileevent $fd readable [cb _read_blame $fd $cur_w $cur_d] + set current_fd $fd + set blame_lines 0 + + $status start \ - "Loading$cur_s annotations..." \ - {lines annotated} ++ $cur_s \ ++ [mc "lines annotated"] +} + +method _read_blame {fd cur_w cur_d} { + upvar #0 $cur_d line_data + variable group_colors + variable original_options + + if {$fd ne $current_fd} { + catch {close $fd} + return + } + + $cur_w conf -state normal + while {[gets $fd line] >= 0} { + if {[regexp {^([a-z0-9]{40}) (\d+) (\d+) (\d+)$} $line line \ + cmit original_line final_line line_count]} { + set r_commit $cmit + set r_orig_line $original_line + set r_final_line $final_line + set r_line_count $line_count + } elseif {[string match {filename *} $line]} { + set file [string range $line 9 end] + set n $r_line_count + set lno $r_final_line + set oln $r_orig_line + set cmit $r_commit + + if {[regexp {^0{40}$} $cmit]} { + set commit_abbr work + set commit_type curr_commit + } elseif {$cmit eq $commit} { + set commit_abbr this + set commit_type curr_commit + } else { + set commit_type prior_commit + set commit_abbr [string range $cmit 0 3] + } + + set author_abbr {} + set a_name {} + catch {set a_name $header($cmit,author)} + while {$a_name ne {}} { + if {$author_abbr ne {} + && [string index $a_name 0] eq {'}} { + regsub {^'[^']+'\s+} $a_name {} a_name + } + if {![regexp {^([[:upper:]])} $a_name _a]} break + append author_abbr $_a + unset _a + if {![regsub \ + {^[[:upper:]][^\s]*\s+} \ + $a_name {} a_name ]} break + } + if {$author_abbr eq {}} { + set author_abbr { |} + } else { + set author_abbr [string range $author_abbr 0 3] + } + unset a_name + + set first_lno $lno + while { + $first_lno > 1 + && $cmit eq [lindex $line_data [expr {$first_lno - 1}] 0] + && $file eq [lindex $line_data [expr {$first_lno - 1}] 1] + } { + incr first_lno -1 + } + + set color {} + if {$first_lno < $lno} { + foreach g [$w_file tag names $first_lno.0] { + if {[regexp {^color[0-9]+$} $g]} { + set color $g + break + } + } + } else { + set i [lsort [concat \ + [$w_file tag names "[expr {$first_lno - 1}].0"] \ + [$w_file tag names "[expr {$lno + $n}].0"] \ + ]] + for {set g 0} {$g < [llength $group_colors]} {incr g} { + if {[lsearch -sorted -exact $i color$g] == -1} { + set color color$g + break + } + } + } + if {$color eq {}} { + set color color0 + } + + while {$n > 0} { + set lno_e "$lno.0 lineend + 1c" + if {[lindex $line_data $lno] ne {}} { + set g [lindex $line_data $lno 0] + foreach i $w_columns { + $i tag remove g$g $lno.0 $lno_e + } + } + lset line_data $lno [list $cmit $file $oln] + + $cur_w delete $lno.0 "$lno.0 lineend" + if {$lno == $first_lno} { + $cur_w insert $lno.0 $commit_abbr $commit_type + } elseif {$lno == [expr {$first_lno + 1}]} { + $cur_w insert $lno.0 $author_abbr author_abbr + } else { + $cur_w insert $lno.0 { |} + } + + foreach i $w_columns { + if {$cur_w eq $w_amov} { + for {set g 0} \ + {$g < [llength $group_colors]} \ + {incr g} { + $i tag remove color$g $lno.0 $lno_e + } + $i tag add $color $lno.0 $lno_e + } + $i tag add g$cmit $lno.0 $lno_e + } + + if {$highlight_column eq $cur_w} { + if {$highlight_line == -1 + && [lindex [$w_file yview] 0] == 0} { + $w_file see $lno.0 + set highlight_line $lno + } + if {$highlight_line == $lno} { + _showcommit $this $cur_w $lno + } + } + + incr n -1 + incr lno + incr oln + incr blame_lines + } + + while { + $cmit eq [lindex $line_data $lno 0] + && $file eq [lindex $line_data $lno 1] + } { + $cur_w delete $lno.0 "$lno.0 lineend" + + if {$lno == $first_lno} { + $cur_w insert $lno.0 $commit_abbr $commit_type + } elseif {$lno == [expr {$first_lno + 1}]} { + $cur_w insert $lno.0 $author_abbr author_abbr + } else { + $cur_w insert $lno.0 { |} + } + + if {$cur_w eq $w_amov} { + foreach i $w_columns { + for {set g 0} \ + {$g < [llength $group_colors]} \ + {incr g} { + $i tag remove color$g $lno.0 $lno_e + } + $i tag add $color $lno.0 $lno_e + } + } + + incr lno + } + + } elseif {[regexp {^([a-z-]+) (.*)$} $line line key data]} { + set header($r_commit,$key) $data + } + } + $cur_w conf -state disabled + + if {[eof $fd]} { + close $fd + if {$cur_w eq $w_asim} { + _exec_blame $this $w_amov @amov_data \ + $original_options \ - { original location} ++ [mc "Loading original location annotations..."] + } else { + set current_fd {} - $status stop {Annotation complete.} ++ $status stop [mc "Annotation complete."] + } + } else { + $status update $blame_lines $total_lines + } +} ifdeleted { catch {close $fd} } + +method _click {cur_w pos} { + set lno [lindex [split [$cur_w index $pos] .] 0] + _showcommit $this $cur_w $lno +} + +method _load_commit {cur_w cur_d pos} { + upvar #0 $cur_d line_data + set lno [lindex [split [$cur_w index $pos] .] 0] + set dat [lindex $line_data $lno] + if {$dat ne {}} { + lappend history [list \ + $commit $path \ + $highlight_column \ + $highlight_line \ + [lindex [$w_file xview] 0] \ + [lindex [$w_file yview] 0] \ + ] + set commit [lindex $dat 0] + set path [lindex $dat 1] + _load $this [list [lindex $dat 2]] + } +} + +method _showcommit {cur_w lno} { + global repo_config + variable active_color + + if {$highlight_commit ne {}} { + foreach i $w_columns { + $i tag conf g$highlight_commit -background {} + $i tag lower g$highlight_commit + } + } + + if {$cur_w eq $w_asim} { + set dat [lindex $asim_data $lno] + set highlight_column $w_asim + } else { + set dat [lindex $amov_data $lno] + set highlight_column $w_amov + } + + $w_cviewer conf -state normal + $w_cviewer delete 0.0 end + + if {$dat eq {}} { + set cmit {} - $w_cviewer insert end "Loading annotation..." still_loading ++ $w_cviewer insert end [mc "Loading annotation..."] still_loading + } else { + set cmit [lindex $dat 0] + set file [lindex $dat 1] + + foreach i $w_columns { + $i tag conf g$cmit -background $active_color + $i tag raise g$cmit + } + + set author_name {} + set author_email {} + set author_time {} + catch {set author_name $header($cmit,author)} + catch {set author_email $header($cmit,author-mail)} - catch {set author_time [clock format \ - $header($cmit,author-time) \ - -format {%Y-%m-%d %H:%M:%S} - ]} ++ catch {set author_time [format_date $header($cmit,author-time)]} + + set committer_name {} + set committer_email {} + set committer_time {} + catch {set committer_name $header($cmit,committer)} + catch {set committer_email $header($cmit,committer-mail)} - catch {set committer_time [clock format \ - $header($cmit,committer-time) \ - -format {%Y-%m-%d %H:%M:%S} - ]} ++ catch {set committer_time [format_date $header($cmit,committer-time)]} + + if {[catch {set msg $header($cmit,message)}]} { + set msg {} + catch { + set fd [git_read cat-file commit $cmit] + fconfigure $fd -encoding binary -translation lf + if {[catch {set enc $repo_config(i18n.commitencoding)}]} { + set enc utf-8 + } + while {[gets $fd line] > 0} { + if {[string match {encoding *} $line]} { + set enc [string tolower [string range $line 9 end]] + } + } + set msg [read $fd] + close $fd + + set enc [tcl_encoding $enc] + if {$enc ne {}} { + set msg [encoding convertfrom $enc $msg] + set author_name [encoding convertfrom $enc $author_name] + set committer_name [encoding convertfrom $enc $committer_name] + set header($cmit,author) $author_name + set header($cmit,committer) $committer_name + set header($cmit,summary) \ + [encoding convertfrom $enc $header($cmit,summary)] + } + set msg [string trim $msg] + } + set header($cmit,message) $msg + } + + $w_cviewer insert end "commit $cmit\n" header_key - $w_cviewer insert end "Author:\t" header_key ++ $w_cviewer insert end [strcat [mc "Author:"] "\t"] header_key + $w_cviewer insert end "$author_name $author_email" header_val + $w_cviewer insert end " $author_time\n" header_val + - $w_cviewer insert end "Committer:\t" header_key ++ $w_cviewer insert end [strcat [mc "Committer:"] "\t"] header_key + $w_cviewer insert end "$committer_name $committer_email" header_val + $w_cviewer insert end " $committer_time\n" header_val + + if {$file ne $path} { - $w_cviewer insert end "Original File:\t" header_key ++ $w_cviewer insert end [strcat [mc "Original File:"] "\t"] header_key + $w_cviewer insert end "[escape_path $file]\n" header_val + } + + $w_cviewer insert end "\n$msg" + } + $w_cviewer conf -state disabled + + set highlight_line $lno + set highlight_commit $cmit + + if {[lsearch -exact $tooltip_commit $highlight_commit] != -1} { + _hide_tooltip $this + } +} + +method _copycommit {} { + set pos @$::cursorX,$::cursorY + set lno [lindex [split [$::cursorW index $pos] .] 0] + set dat [lindex $amov_data $lno] + if {$dat ne {}} { + clipboard clear + clipboard append \ + -format STRING \ + -type STRING \ + -- [lindex $dat 0] + } +} + +method _show_tooltip {cur_w pos} { + if {$tooltip_wm ne {}} { + _open_tooltip $this $cur_w + } elseif {$tooltip_timer eq {}} { + set tooltip_timer [after 1000 [cb _open_tooltip $cur_w]] + } +} + +method _open_tooltip {cur_w} { + set tooltip_timer {} + set pos_x [winfo pointerx $cur_w] + set pos_y [winfo pointery $cur_w] + if {[winfo containing $pos_x $pos_y] ne $cur_w} { + _hide_tooltip $this + return + } + + if {$tooltip_wm ne "$cur_w.tooltip"} { + _hide_tooltip $this + + set tooltip_wm [toplevel $cur_w.tooltip -borderwidth 1] + wm overrideredirect $tooltip_wm 1 + wm transient $tooltip_wm [winfo toplevel $cur_w] + set tooltip_t $tooltip_wm.label + text $tooltip_t \ + -takefocus 0 \ + -highlightthickness 0 \ + -relief flat \ + -borderwidth 0 \ + -wrap none \ + -background lightyellow \ + -foreground black + $tooltip_t tag conf section_header -font font_uibold + pack $tooltip_t + } else { + $tooltip_t conf -state normal + $tooltip_t delete 0.0 end + } + + set pos @[join [list \ + [expr {$pos_x - [winfo rootx $cur_w]}] \ + [expr {$pos_y - [winfo rooty $cur_w]}]] ,] + set lno [lindex [split [$cur_w index $pos] .] 0] + if {$cur_w eq $w_amov} { + set dat [lindex $amov_data $lno] + set org {} + } else { + set dat [lindex $asim_data $lno] + set org [lindex $amov_data $lno] + } + + if {$dat eq {}} { + _hide_tooltip $this + return + } + + set cmit [lindex $dat 0] + set tooltip_commit [list $cmit] + + set author_name {} + set summary {} + set author_time {} + catch {set author_name $header($cmit,author)} + catch {set summary $header($cmit,summary)} - catch {set author_time [clock format \ - $header($cmit,author-time) \ - -format {%Y-%m-%d %H:%M:%S} - ]} ++ catch {set author_time [format_date $header($cmit,author-time)]} + + $tooltip_t insert end "commit $cmit\n" + $tooltip_t insert end "$author_name $author_time\n" + $tooltip_t insert end "$summary" + + if {$org ne {} && [lindex $org 0] ne $cmit} { + set save [$tooltip_t get 0.0 end] + $tooltip_t delete 0.0 end + + set cmit [lindex $org 0] + set file [lindex $org 1] + lappend tooltip_commit $cmit + + set author_name {} + set summary {} + set author_time {} + catch {set author_name $header($cmit,author)} + catch {set summary $header($cmit,summary)} - catch {set author_time [clock format \ - $header($cmit,author-time) \ - -format {%Y-%m-%d %H:%M:%S} - ]} ++ catch {set author_time [format_date $header($cmit,author-time)]} + - $tooltip_t insert end "Originally By:\n" section_header ++ $tooltip_t insert end [strcat [mc "Originally By:"] "\n"] section_header + $tooltip_t insert end "commit $cmit\n" + $tooltip_t insert end "$author_name $author_time\n" + $tooltip_t insert end "$summary\n" + + if {$file ne $path} { - $tooltip_t insert end "In File: " section_header ++ $tooltip_t insert end [strcat [mc "In File:"] " "] section_header + $tooltip_t insert end "$file\n" + } + + $tooltip_t insert end "\n" - $tooltip_t insert end "Copied Or Moved Here By:\n" section_header ++ $tooltip_t insert end [strcat [mc "Copied Or Moved Here By:"] "\n"] section_header + $tooltip_t insert end $save + } + + $tooltip_t conf -state disabled + _position_tooltip $this +} + +method _position_tooltip {} { + set max_h [lindex [split [$tooltip_t index end] .] 0] + set max_w 0 + for {set i 1} {$i <= $max_h} {incr i} { + set c [lindex [split [$tooltip_t index "$i.0 lineend"] .] 1] + if {$c > $max_w} {set max_w $c} + } + $tooltip_t conf -width $max_w -height $max_h + + set req_w [winfo reqwidth $tooltip_t] + set req_h [winfo reqheight $tooltip_t] + set pos_x [expr {[winfo pointerx .] + 5}] + set pos_y [expr {[winfo pointery .] + 10}] + + set g "${req_w}x${req_h}" + if {$pos_x >= 0} {append g +} + append g $pos_x + if {$pos_y >= 0} {append g +} + append g $pos_y + + wm geometry $tooltip_wm $g + raise $tooltip_wm +} + +method _hide_tooltip {} { + if {$tooltip_wm ne {}} { + destroy $tooltip_wm + set tooltip_wm {} + set tooltip_commit {} + } + if {$tooltip_timer ne {}} { + after cancel $tooltip_timer + set tooltip_timer {} + } +} + +method _resize {new_height} { + set diff [expr {$new_height - $old_height}] + if {$diff == 0} return + + set my [expr {[winfo height $w.file_pane] - 25}] + set o [$w.file_pane sash coord 0] + set ox [lindex $o 0] + set oy [expr {[lindex $o 1] + $diff}] + if {$oy < 0} {set oy 0} + if {$oy > $my} {set oy $my} + $w.file_pane sash place 0 $ox $oy + + set old_height $new_height +} + +} diff --cc git-gui/lib/branch_checkout.tcl index 72c45b455,000000000..6603703ea mode 100644,000000..100644 --- a/git-gui/lib/branch_checkout.tcl +++ b/git-gui/lib/branch_checkout.tcl @@@ -1,89 -1,0 +1,89 @@@ +# git-gui branch checkout support +# Copyright (C) 2007 Shawn Pearce + +class branch_checkout { + +field w ; # widget path +field w_rev ; # mega-widget to pick the initial revision + +field opt_fetch 1; # refetch tracking branch if used? +field opt_detach 0; # force a detached head case? + +constructor dialog {} { + make_toplevel top w - wm title $top "[appname] ([reponame]): Checkout Branch" ++ wm title $top [append "[appname] ([reponame]): " [mc "Checkout Branch"]] + if {$top ne {.}} { + wm geometry $top "+[winfo rootx .]+[winfo rooty .]" + } + - label $w.header -text {Checkout Branch} -font font_uibold ++ label $w.header -text [mc "Checkout Branch"] -font font_uibold + pack $w.header -side top -fill x + + frame $w.buttons - button $w.buttons.create -text Checkout \ ++ button $w.buttons.create -text [mc Checkout] \ + -default active \ + -command [cb _checkout] + pack $w.buttons.create -side right - button $w.buttons.cancel -text {Cancel} \ ++ button $w.buttons.cancel -text [mc Cancel] \ + -command [list destroy $w] + pack $w.buttons.cancel -side right -padx 5 + pack $w.buttons -side bottom -fill x -pady 10 -padx 10 + - set w_rev [::choose_rev::new $w.rev {Revision}] ++ set w_rev [::choose_rev::new $w.rev [mc Revision]] + $w_rev bind_listbox [cb _checkout] + pack $w.rev -anchor nw -fill both -expand 1 -pady 5 -padx 5 + - labelframe $w.options -text {Options} ++ labelframe $w.options -text [mc Options] + + checkbutton $w.options.fetch \ - -text {Fetch Tracking Branch} \ ++ -text [mc "Fetch Tracking Branch"] \ + -variable @opt_fetch + pack $w.options.fetch -anchor nw + + checkbutton $w.options.detach \ - -text {Detach From Local Branch} \ ++ -text [mc "Detach From Local Branch"] \ + -variable @opt_detach + pack $w.options.detach -anchor nw + + pack $w.options -anchor nw -fill x -pady 5 -padx 5 + + bind $w [cb _visible] + bind $w [list destroy $w] + bind $w [cb _checkout]\;break + tkwait window $w +} + +method _checkout {} { + set spec [$w_rev get_tracking_branch] + if {$spec ne {} && $opt_fetch} { + set new {} + } elseif {[catch {set new [$w_rev commit_or_die]}]} { + return + } + + if {$opt_detach} { + set ref {} + } else { + set ref [$w_rev get_local_branch] + } + + set co [::checkout_op::new [$w_rev get] $new $ref] + $co parent $w + $co enable_checkout 1 + if {$spec ne {} && $opt_fetch} { + $co enable_fetch $spec + } + + if {[$co run]} { + destroy $w + } else { + $w_rev focus_filter + } +} + +method _visible {} { + grab $w + $w_rev focus_filter +} + +} diff --cc git-gui/lib/branch_create.tcl index def615d19,000000000..53dfb4ce6 mode 100644,000000..100644 --- a/git-gui/lib/branch_create.tcl +++ b/git-gui/lib/branch_create.tcl @@@ -1,220 -1,0 +1,220 @@@ +# git-gui branch create support +# Copyright (C) 2006, 2007 Shawn Pearce + +class branch_create { + +field w ; # widget path +field w_rev ; # mega-widget to pick the initial revision +field w_name ; # new branch name widget + +field name {}; # name of the branch the user has chosen +field name_type user; # type of branch name to use + +field opt_merge ff; # type of merge to apply to existing branch +field opt_checkout 1; # automatically checkout the new branch? +field opt_fetch 1; # refetch tracking branch if used? +field reset_ok 0; # did the user agree to reset? + +constructor dialog {} { + global repo_config + + make_toplevel top w - wm title $top "[appname] ([reponame]): Create Branch" ++ wm title $top [append "[appname] ([reponame]): " [mc "Create Branch"]] + if {$top ne {.}} { + wm geometry $top "+[winfo rootx .]+[winfo rooty .]" + } + - label $w.header -text {Create New Branch} -font font_uibold ++ label $w.header -text [mc "Create New Branch"] -font font_uibold + pack $w.header -side top -fill x + + frame $w.buttons - button $w.buttons.create -text Create \ ++ button $w.buttons.create -text [mc Create] \ + -default active \ + -command [cb _create] + pack $w.buttons.create -side right - button $w.buttons.cancel -text {Cancel} \ ++ button $w.buttons.cancel -text [mc Cancel] \ + -command [list destroy $w] + pack $w.buttons.cancel -side right -padx 5 + pack $w.buttons -side bottom -fill x -pady 10 -padx 10 + - labelframe $w.desc -text {Branch Name} ++ labelframe $w.desc -text [mc "Branch Name"] + radiobutton $w.desc.name_r \ + -anchor w \ - -text {Name:} \ ++ -text [mc "Name:"] \ + -value user \ + -variable @name_type + set w_name $w.desc.name_t + entry $w_name \ + -borderwidth 1 \ + -relief sunken \ + -width 40 \ + -textvariable @name \ + -validate key \ + -validatecommand [cb _validate %d %S] + grid $w.desc.name_r $w_name -sticky we -padx {0 5} + + radiobutton $w.desc.match_r \ + -anchor w \ - -text {Match Tracking Branch Name} \ ++ -text [mc "Match Tracking Branch Name"] \ + -value match \ + -variable @name_type + grid $w.desc.match_r -sticky we -padx {0 5} -columnspan 2 + + grid columnconfigure $w.desc 1 -weight 1 + pack $w.desc -anchor nw -fill x -pady 5 -padx 5 + - set w_rev [::choose_rev::new $w.rev {Starting Revision}] ++ set w_rev [::choose_rev::new $w.rev [mc "Starting Revision"]] + pack $w.rev -anchor nw -fill both -expand 1 -pady 5 -padx 5 + - labelframe $w.options -text {Options} ++ labelframe $w.options -text [mc Options] + + frame $w.options.merge - label $w.options.merge.l -text {Update Existing Branch:} ++ label $w.options.merge.l -text [mc "Update Existing Branch:"] + pack $w.options.merge.l -side left + radiobutton $w.options.merge.no \ - -text No \ ++ -text [mc No] \ + -value none \ + -variable @opt_merge + pack $w.options.merge.no -side left + radiobutton $w.options.merge.ff \ - -text {Fast Forward Only} \ ++ -text [mc "Fast Forward Only"] \ + -value ff \ + -variable @opt_merge + pack $w.options.merge.ff -side left + radiobutton $w.options.merge.reset \ - -text {Reset} \ ++ -text [mc Reset] \ + -value reset \ + -variable @opt_merge + pack $w.options.merge.reset -side left + pack $w.options.merge -anchor nw + + checkbutton $w.options.fetch \ - -text {Fetch Tracking Branch} \ ++ -text [mc "Fetch Tracking Branch"] \ + -variable @opt_fetch + pack $w.options.fetch -anchor nw + + checkbutton $w.options.checkout \ - -text {Checkout After Creation} \ ++ -text [mc "Checkout After Creation"] \ + -variable @opt_checkout + pack $w.options.checkout -anchor nw + pack $w.options -anchor nw -fill x -pady 5 -padx 5 + + trace add variable @name_type write [cb _select] + + set name $repo_config(gui.newbranchtemplate) + if {[is_config_true gui.matchtrackingbranch]} { + set name_type match + } + + bind $w [cb _visible] + bind $w [list destroy $w] + bind $w [cb _create]\;break + tkwait window $w +} + +method _create {} { + global repo_config + global M1B + + set spec [$w_rev get_tracking_branch] + switch -- $name_type { + user { + set newbranch $name + } + match { + if {$spec eq {}} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ - -message "Please select a tracking branch." ++ -message [mc "Please select a tracking branch."] + return + } + if {![regsub ^refs/heads/ [lindex $spec 2] {} newbranch]} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ - -message "Tracking branch [$w get] is not a branch in the remote repository." ++ -message [mc "Tracking branch %s is not a branch in the remote repository." [$w get]] + return + } + } + } + + if {$newbranch eq {} + || $newbranch eq $repo_config(gui.newbranchtemplate)} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ - -message "Please supply a branch name." ++ -message [mc "Please supply a branch name."] + focus $w_name + return + } + + if {[catch {git check-ref-format "heads/$newbranch"}]} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ - -message "'$newbranch' is not an acceptable branch name." ++ -message [mc "'%s' is not an acceptable branch name." $newbranch] + focus $w_name + return + } + + if {$spec ne {} && $opt_fetch} { + set new {} + } elseif {[catch {set new [$w_rev commit_or_die]}]} { + return + } + + set co [::checkout_op::new \ + [$w_rev get] \ + $new \ + refs/heads/$newbranch] + $co parent $w + $co enable_create 1 + $co enable_merge $opt_merge + $co enable_checkout $opt_checkout + if {$spec ne {} && $opt_fetch} { + $co enable_fetch $spec + } + + if {[$co run]} { + destroy $w + } else { + focus $w_name + } +} + +method _validate {d S} { + if {$d == 1} { + if {[regexp {[~^:?*\[\0- ]} $S]} { + return 0 + } + if {[string length $S] > 0} { + set name_type user + } + } + return 1 +} + +method _select {args} { + if {$name_type eq {match}} { + $w_rev pick_tracking_branch + } +} + +method _visible {} { + grab $w + if {$name_type eq {user}} { + $w_name icursor end + focus $w_name + } +} + +} diff --cc git-gui/lib/branch_delete.tcl index c7573c6c7,000000000..86c4f7337 mode 100644,000000..100644 --- a/git-gui/lib/branch_delete.tcl +++ b/git-gui/lib/branch_delete.tcl @@@ -1,149 -1,0 +1,147 @@@ +# git-gui branch delete support +# Copyright (C) 2007 Shawn Pearce + +class branch_delete { + +field w ; # widget path +field w_heads ; # listbox of local head names +field w_check ; # revision picker for merge test +field w_delete ; # delete button + +constructor dialog {} { + global current_branch + + make_toplevel top w - wm title $top "[appname] ([reponame]): Delete Branch" ++ wm title $top [append "[appname] ([reponame]): " [mc "Delete Branch"]] + if {$top ne {.}} { + wm geometry $top "+[winfo rootx .]+[winfo rooty .]" + } + - label $w.header -text {Delete Local Branch} -font font_uibold ++ label $w.header -text [mc "Delete Local Branch"] -font font_uibold + pack $w.header -side top -fill x + + frame $w.buttons + set w_delete $w.buttons.delete + button $w_delete \ - -text Delete \ ++ -text [mc Delete] \ + -default active \ + -state disabled \ + -command [cb _delete] + pack $w_delete -side right + button $w.buttons.cancel \ - -text {Cancel} \ ++ -text [mc Cancel] \ + -command [list destroy $w] + pack $w.buttons.cancel -side right -padx 5 + pack $w.buttons -side bottom -fill x -pady 10 -padx 10 + - labelframe $w.list -text {Local Branches} ++ labelframe $w.list -text [mc "Local Branches"] + set w_heads $w.list.l + listbox $w_heads \ + -height 10 \ + -width 70 \ + -selectmode extended \ + -exportselection false \ + -yscrollcommand [list $w.list.sby set] + scrollbar $w.list.sby -command [list $w.list.l yview] + pack $w.list.sby -side right -fill y + pack $w.list.l -side left -fill both -expand 1 + pack $w.list -fill both -expand 1 -pady 5 -padx 5 + + set w_check [choose_rev::new \ + $w.check \ - {Delete Only If Merged Into} \ ++ [mc "Delete Only If Merged Into"] \ + ] - $w_check none {Always (Do not perform merge test.)} ++ $w_check none [mc "Always (Do not perform merge test.)"] + pack $w.check -anchor nw -fill x -pady 5 -padx 5 + + foreach h [load_all_heads] { + if {$h ne $current_branch} { + $w_heads insert end $h + } + } + + bind $w_heads <> [cb _select] + bind $w " + grab $w + focus $w + " + bind $w [list destroy $w] + bind $w [cb _delete]\;break + tkwait window $w +} + +method _select {} { + if {[$w_heads curselection] eq {}} { + $w_delete configure -state disabled + } else { + $w_delete configure -state normal + } +} + +method _delete {} { + if {[catch {set check_cmt [$w_check commit_or_die]}]} { + return + } + + set to_delete [list] + set not_merged [list] + foreach i [$w_heads curselection] { + set b [$w_heads get $i] + if {[catch { + set o [git rev-parse --verify "refs/heads/$b"] + }]} continue + if {$check_cmt ne {}} { + if {[catch {set m [git merge-base $o $check_cmt]}]} continue + if {$o ne $m} { + lappend not_merged $b + continue + } + } + lappend to_delete [list $b $o] + } + if {$not_merged ne {}} { - set msg "The following branches are not completely merged into [$w_check get]: ++ set msg "[mc "The following branches are not completely merged into %s:" [$w_check get]] + + - [join $not_merged "\n - "]" + tk_messageBox \ + -icon info \ + -type ok \ + -title [wm title $w] \ + -parent $w \ + -message $msg + } + if {$to_delete eq {}} return + if {$check_cmt eq {}} { - set msg {Recovering deleted branches is difficult. - - Delete the selected branches?} ++ set msg [mc "Recovering deleted branches is difficult. \n\n Delete the selected branches?"] + if {[tk_messageBox \ + -icon warning \ + -type yesno \ + -title [wm title $w] \ + -parent $w \ + -message $msg] ne yes} { + return + } + } + + set failed {} + foreach i $to_delete { + set b [lindex $i 0] + set o [lindex $i 1] + if {[catch {git update-ref -d "refs/heads/$b" $o} err]} { + append failed " - $b: $err\n" + } + } + + if {$failed ne {}} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ - -message "Failed to delete branches:\n$failed" ++ -message [mc "Failed to delete branches:\n%s" $failed] + } + + destroy $w +} + +} diff --cc git-gui/lib/branch_rename.tcl index 1cadc31d2,000000000..166538808 mode 100644,000000..100644 --- a/git-gui/lib/branch_rename.tcl +++ b/git-gui/lib/branch_rename.tcl @@@ -1,128 -1,0 +1,128 @@@ +# git-gui branch rename support +# Copyright (C) 2007 Shawn Pearce + +class branch_rename { + +field w +field oldname +field newname + +constructor dialog {} { + global current_branch + + make_toplevel top w - wm title $top "[appname] ([reponame]): Rename Branch" ++ wm title $top [append "[appname] ([reponame]): " [mc "Rename Branch"]] + if {$top ne {.}} { + wm geometry $top "+[winfo rootx .]+[winfo rooty .]" + } + + set oldname $current_branch + set newname [get_config gui.newbranchtemplate] + - label $w.header -text {Rename Branch} -font font_uibold ++ label $w.header -text [mc "Rename Branch"] -font font_uibold + pack $w.header -side top -fill x + + frame $w.buttons - button $w.buttons.rename -text Rename \ ++ button $w.buttons.rename -text [mc Rename] \ + -default active \ + -command [cb _rename] + pack $w.buttons.rename -side right - button $w.buttons.cancel -text {Cancel} \ ++ button $w.buttons.cancel -text [mc Cancel] \ + -command [list destroy $w] + pack $w.buttons.cancel -side right -padx 5 + pack $w.buttons -side bottom -fill x -pady 10 -padx 10 + + frame $w.rename - label $w.rename.oldname_l -text {Branch:} ++ label $w.rename.oldname_l -text [mc "Branch:"] + eval tk_optionMenu $w.rename.oldname_m @oldname [load_all_heads] + - label $w.rename.newname_l -text {New Name:} ++ label $w.rename.newname_l -text [mc "New Name:"] + entry $w.rename.newname_t \ + -borderwidth 1 \ + -relief sunken \ + -width 40 \ + -textvariable @newname \ + -validate key \ + -validatecommand { + if {%d == 1 && [regexp {[~^:?*\[\0- ]} %S]} {return 0} + return 1 + } + + grid $w.rename.oldname_l $w.rename.oldname_m -sticky w -padx {0 5} + grid $w.rename.newname_l $w.rename.newname_t -sticky we -padx {0 5} + grid columnconfigure $w.rename 1 -weight 1 + pack $w.rename -anchor nw -fill x -pady 5 -padx 5 + + bind $w [cb _rename] + bind $w [list destroy $w] + bind $w " + grab $w + $w.rename.newname_t icursor end + focus $w.rename.newname_t + " + tkwait window $w +} + +method _rename {} { + global current_branch + + if {$oldname eq {}} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ - -message "Please select a branch to rename." ++ -message [mc "Please select a branch to rename."] + focus $w.rename.oldname_m + return + } + if {$newname eq {} + || $newname eq [get_config gui.newbranchtemplate]} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ - -message "Please supply a branch name." ++ -message [mc "Please supply a branch name."] + focus $w.rename.newname_t + return + } + if {![catch {git show-ref --verify -- "refs/heads/$newname"}]} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ - -message "Branch '$newname' already exists." ++ -message [mc "Branch '%s' already exists." $newname] + focus $w.rename.newname_t + return + } + if {[catch {git check-ref-format "heads/$newname"}]} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ - -message "We do not like '$newname' as a branch name." ++ -message [mc "'%s' is not an acceptable branch name." $newname] + focus $w.rename.newname_t + return + } + + if {[catch {git branch -m $oldname $newname} err]} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ - -message "Failed to rename '$oldname'.\n\n$err" ++ -message [strcat [mc "Failed to rename '%s'." $oldname] "\n\n$err"] + return + } + + if {$current_branch eq $oldname} { + set current_branch $newname + } + + destroy $w +} + +} diff --cc git-gui/lib/browser.tcl index 31349009a,000000000..53d5a6281 mode 100644,000000..100644 --- a/git-gui/lib/browser.tcl +++ b/git-gui/lib/browser.tcl @@@ -1,310 -1,0 +1,310 @@@ +# git-gui tree browser +# Copyright (C) 2006, 2007 Shawn Pearce + +class browser { + +image create photo ::browser::img_parent -data {R0lGODlhEAAQAIUAAPwCBBxSHBxOHMTSzNzu3KzCtBRGHCSKFIzCjLzSxBQ2FAxGHDzCLCyeHBQ+FHSmfAwuFBxKLDSCNMzizISyjJzOnDSyLAw+FAQSDAQeDBxWJAwmDAQOBKzWrDymNAQaDAQODAwaDDyKTFSyXFTGTEy6TAQCBAQKDAwiFBQyHAwSFAwmHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAAZ1QIBwSCwaj0hiQCBICpcDQsFgGAaIguhhi0gohIsrQEDYMhiNrRfgeAQC5fMCAolIDhD2hFI5WC4YRBkaBxsOE2l/RxsHHA4dHmkfRyAbIQ4iIyQlB5NFGCAACiakpSZEJyinTgAcKSesACorgU4mJ6uxR35BACH+aENyZWF0ZWQgYnkgQk1QVG9HSUYgUHJvIHZlcnNpb24gMi41DQqpIERldmVsQ29yIDE5OTcsMTk5OC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCmh0dHA6Ly93d3cuZGV2ZWxjb3IuY29tADs=} +image create photo ::browser::img_rblob -data {R0lGODlhEAAQAIUAAPwCBFxaXNze3Ly2rJSWjPz+/Ozq7GxqbJyanPT29HRydMzOzDQyNIyKjERCROTi3Pz69PTy7Pzy7PTu5Ozm3LyqlJyWlJSSjJSOhOzi1LyulPz27PTq3PTm1OzezLyqjIyKhJSKfOzaxPz29OzizLyidIyGdIyCdOTOpLymhOzavOTStMTCtMS+rMS6pMSynMSulLyedAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAAaQQIAQECgajcNkQMBkDgKEQFK4LFgLhkMBIVUKroWEYlEgMLxbBKLQUBwc52HgAQ4LBo049atWQyIPA3pEdFcQEhMUFYNVagQWFxgZGoxfYRsTHB0eH5UJCJAYICEinUoPIxIcHCQkIiIllQYEGCEhJicoKYwPmiQeKisrKLFKLCwtLi8wHyUlMYwM0tPUDH5BACH+aENyZWF0ZWQgYnkgQk1QVG9HSUYgUHJvIHZlcnNpb24gMi41DQqpIERldmVsQ29yIDE5OTcsMTk5OC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCmh0dHA6Ly93d3cuZGV2ZWxjb3IuY29tADs=} +image create photo ::browser::img_xblob -data {R0lGODlhEAAQAIYAAPwCBFRWVFxaXNza3OTi3Nze3Ly2tJyanPz+/Ozq7GxubNzSxMzOzMTGxHRybDQyNLy+vHRydHx6fKSipISChIyKjGxqbERCRCwuLLy6vGRiZExKTCQiJAwKDLSytLy2rJSSlHx+fDw6PKyqrBQWFPTu5Ozm3LyulLS2tCQmJAQCBPTq3Ozi1MSynCwqLAQGBOTazOzizOzezLyqjBweHNzSvOzaxKyurHRuZNzOtLymhDw+PIyCdOzWvOTOpLyidNzKtOTStLyifMTCtMS+rLyedAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAAfZgACCAAEChYeGg4oCAwQFjgYBBwGKggEECJkICQoIkwADCwwNDY2mDA4Lng8QDhESsLARExQVDhYXGBkWExIaGw8cHR4SCQQfFQ8eFgUgIQEiwiMSBMYfGB4atwEXDyQd0wQlJicPKAHoFyIpJCoeDgMrLC0YKBsX6i4kL+4OMDEyZijr5oLGNxUqUCioEcPGDAwjPNyI6MEDChQjcOSwsUDHgw07RIgI4KCkAgs8cvTw8eOBogAxQtXIASTISiEuBwUYMoRIixYnZggpUgTDywdIkWJIitRPIAAh/mhDcmVhdGVkIGJ5IEJNUFRvR0lGIFBybyB2ZXJzaW9uIDIuNQ0KqSBEZXZlbENvciAxOTk3LDE5OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQpodHRwOi8vd3d3LmRldmVsY29yLmNvbQA7} +image create photo ::browser::img_tree -data {R0lGODlhEAAQAIYAAPwCBAQCBExKTBwWHMzKzOzq7ERCRExGTCwqLARqnAQ+ZHR2dKyqrNTOzHx2fCQiJMTi9NTu9HzC3AxmnAQ+XPTm7Dy67DymzITC3IzG5AxypHRydKymrMzOzOzu7BweHByy9AyGtFyy1IzG3NTu/ARupFRSVByazBR6rAyGvFyuzJTK3MTm9BR+tAxWhHS61MTi7Pz+/IymvCxulBRelAx2rHS63Pz6/PTy9PTu9Nza3ISitBRupFSixNTS1CxqnDQyNMzGzOTi5MTCxMTGxGxubGxqbLy2vLSutGRiZLy6vLSytKyurDQuNFxaXKSipDw6PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAAfDgACCAAECg4eIAAMEBQYHCImDBgkKCwwNBQIBBw4Bhw8QERITFJYEFQUFnoIPFhcYoRkaFBscHR4Ggh8gIRciEiMQJBkltCa6JyUoKSkXKhIrLCQYuQAPLS4TEyUhKb0qLzDVAjEFMjMuNBMoNcw21QY3ODkFOjs82RM1PfDzFRU3fOggcM7Fj2pAgggRokOHDx9DhhAZUqQaISBGhjwMEvEIkiIHEgUAkgSJkiNLmFSMJChAEydPGBSBwvJQgAc0/QQCACH+aENyZWF0ZWQgYnkgQk1QVG9HSUYgUHJvIHZlcnNpb24gMi41DQqpIERldmVsQ29yIDE5OTcsMTk5OC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCmh0dHA6Ly93d3cuZGV2ZWxjb3IuY29tADs=} +image create photo ::browser::img_symlink -data {R0lGODlhEAAQAIQAAPwCBCwqLLSytLy+vERGRFRWVDQ2NKSmpAQCBKyurMTGxISChJyanHR2dIyKjGxubHRydGRmZIyOjFxeXHx6fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAAVbICACwWieY1CibCCsrBkMb0zchSEcNYskCtqBBzshFkOGQFk0IRqOxqPBODRHCMhCQKteRc9FI/KQWGOIyFYgkDC+gPR4snCcfRGKOIKIgSMQE31+f4OEYCZ+IQAh/mhDcmVhdGVkIGJ5IEJNUFRvR0lGIFBybyB2ZXJzaW9uIDIuNQ0KqSBEZXZlbENvciAxOTk3LDE5OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQpodHRwOi8vd3d3LmRldmVsY29yLmNvbQA7} +image create photo ::browser::img_unknown -data {R0lGODlhEAAQAIUAAPwCBFxaXIyKjNTW1Nze3LS2tJyanER2RGS+VPz+/PTu5GxqbPz69BQ6BCxeLFSqRPT29HRydMzOzDQyNERmPKSypCRWHIyKhERCRDyGPKz2nESiLBxGHCyCHGxubPz6/PTy7Ozi1Ly2rKSipOzm3LyqlKSWhCRyFOzizLymhNTKtNzOvOzaxOTStPz27OzWvOTOpLSupLyedMS+rMS6pMSulLyqjLymfLyifAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAAamQIAQECgajcOkYEBoDgoBQyAJOCCuiENCsWBIh9aGw9F4HCARiXciRDQoBUnlYRlcIgsMG5CxXAgMGhscBRAEBRd7AB0eBBoIgxUfICEiikSPgyMMIAokJZcBkBybJgomIaBJAZoMpyCmqkMBFCcVCrgKKAwpoSorKqchKCwtvasIFBIhLiYvLzDHsxQNMcMKLDAwMqEz3jQ1NTY3ONyrE+jp6hN+QQAh/mhDcmVhdGVkIGJ5IEJNUFRvR0lGIFBybyB2ZXJzaW9uIDIuNQ0KqSBEZXZlbENvciAxOTk3LDE5OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQpodHRwOi8vd3d3LmRldmVsY29yLmNvbQA7} + +field w +field browser_commit +field browser_path +field browser_files {} - field browser_status {Starting...} ++field browser_status [mc "Starting..."] +field browser_stack {} +field browser_busy 1 + +field ls_buf {}; # Buffered record output from ls-tree + +constructor new {commit {path {}}} { + global cursor_ptr M1B + make_toplevel top w - wm title $top "[appname] ([reponame]): File Browser" ++ wm title $top [append "[appname] ([reponame]): " [mc "File Browser"]] + + set browser_commit $commit + set browser_path $browser_commit:$path + + label $w.path \ + -textvariable @browser_path \ + -anchor w \ + -justify left \ + -borderwidth 1 \ + -relief sunken \ + -font font_uibold + pack $w.path -anchor w -side top -fill x + + frame $w.list + set w_list $w.list.l + text $w_list -background white -borderwidth 0 \ + -cursor $cursor_ptr \ + -state disabled \ + -wrap none \ + -height 20 \ + -width 70 \ + -xscrollcommand [list $w.list.sbx set] \ + -yscrollcommand [list $w.list.sby set] + rmsel_tag $w_list + scrollbar $w.list.sbx -orient h -command [list $w_list xview] + scrollbar $w.list.sby -orient v -command [list $w_list yview] + pack $w.list.sbx -side bottom -fill x + pack $w.list.sby -side right -fill y + pack $w_list -side left -fill both -expand 1 + pack $w.list -side top -fill both -expand 1 + + label $w.status \ + -textvariable @browser_status \ + -anchor w \ + -justify left \ + -borderwidth 1 \ + -relief sunken + pack $w.status -anchor w -side bottom -fill x + + bind $w_list "[cb _click 0 @%x,%y];break" + bind $w_list "[cb _click 1 @%x,%y];break" + bind $w_list <$M1B-Up> "[cb _parent] ;break" + bind $w_list <$M1B-Left> "[cb _parent] ;break" + bind $w_list "[cb _move -1] ;break" + bind $w_list "[cb _move 1] ;break" + bind $w_list <$M1B-Right> "[cb _enter] ;break" + bind $w_list "[cb _enter] ;break" + bind $w_list "[cb _page -1] ;break" + bind $w_list "[cb _page 1] ;break" + bind $w_list break + bind $w_list break + + bind $w_list [list focus $w_list] + set w $w_list + if {$path ne {}} { + _ls $this $browser_commit:$path $path + } else { + _ls $this $browser_commit $path + } + return $this +} + +method _move {dir} { + if {$browser_busy} return + set lno [lindex [split [$w index in_sel.first] .] 0] + incr lno $dir + if {[lindex $browser_files [expr {$lno - 1}]] ne {}} { + $w tag remove in_sel 0.0 end + $w tag add in_sel $lno.0 [expr {$lno + 1}].0 + $w see $lno.0 + } +} + +method _page {dir} { + if {$browser_busy} return + $w yview scroll $dir pages + set lno [expr {int( + [lindex [$w yview] 0] + * [llength $browser_files] + + 1)}] + if {[lindex $browser_files [expr {$lno - 1}]] ne {}} { + $w tag remove in_sel 0.0 end + $w tag add in_sel $lno.0 [expr {$lno + 1}].0 + $w see $lno.0 + } +} + +method _parent {} { + if {$browser_busy} return + set info [lindex $browser_files 0] + if {[lindex $info 0] eq {parent}} { + set parent [lindex $browser_stack end-1] + set browser_stack [lrange $browser_stack 0 end-2] + if {$browser_stack eq {}} { + regsub {:.*$} $browser_path {:} browser_path + } else { + regsub {/[^/]+$} $browser_path {} browser_path + } - set browser_status "Loading $browser_path..." ++ set browser_status [mc "Loading %s..." $browser_path] + _ls $this [lindex $parent 0] [lindex $parent 1] + } +} + +method _enter {} { + if {$browser_busy} return + set lno [lindex [split [$w index in_sel.first] .] 0] + set info [lindex $browser_files [expr {$lno - 1}]] + if {$info ne {}} { + switch -- [lindex $info 0] { + parent { + _parent $this + } + tree { + set name [lindex $info 2] + set escn [escape_path $name] - set browser_status "Loading $escn..." ++ set browser_status [mc "Loading %s..." $escn] + append browser_path $escn + _ls $this [lindex $info 1] $name + } + blob { + set name [lindex $info 2] + set p {} + foreach n $browser_stack { + append p [lindex $n 1] + } + append p $name + blame::new $browser_commit $p + } + } + } +} + +method _click {was_double_click pos} { + if {$browser_busy} return + set lno [lindex [split [$w index $pos] .] 0] + focus $w + + if {[lindex $browser_files [expr {$lno - 1}]] ne {}} { + $w tag remove in_sel 0.0 end + $w tag add in_sel $lno.0 [expr {$lno + 1}].0 + if {$was_double_click} { + _enter $this + } + } +} + +method _ls {tree_id {name {}}} { + set ls_buf {} + set browser_files {} + set browser_busy 1 + + $w conf -state normal + $w tag remove in_sel 0.0 end + $w delete 0.0 end + if {$browser_stack ne {}} { + $w image create end \ + -align center -padx 5 -pady 1 \ + -name icon0 \ + -image ::browser::img_parent - $w insert end {[Up To Parent]} ++ $w insert end [mc "\[Up To Parent\]"] + lappend browser_files parent + } + lappend browser_stack [list $tree_id $name] + $w conf -state disabled + + set fd [git_read ls-tree -z $tree_id] + fconfigure $fd -blocking 0 -translation binary -encoding binary + fileevent $fd readable [cb _read $fd] +} + +method _read {fd} { + append ls_buf [read $fd] + set pck [split $ls_buf "\0"] + set ls_buf [lindex $pck end] + + set n [llength $browser_files] + $w conf -state normal + foreach p [lrange $pck 0 end-1] { + set tab [string first "\t" $p] + if {$tab == -1} continue + + set info [split [string range $p 0 [expr {$tab - 1}]] { }] + set path [string range $p [expr {$tab + 1}] end] + set type [lindex $info 1] + set object [lindex $info 2] + + switch -- $type { + blob { + scan [lindex $info 0] %o mode + if {$mode == 0120000} { + set image ::browser::img_symlink + } elseif {($mode & 0100) != 0} { + set image ::browser::img_xblob + } else { + set image ::browser::img_rblob + } + } + tree { + set image ::browser::img_tree + append path / + } + default { + set image ::browser::img_unknown + } + } + + if {$n > 0} {$w insert end "\n"} + $w image create end \ + -align center -padx 5 -pady 1 \ + -name icon[incr n] \ + -image $image + $w insert end [escape_path $path] + lappend browser_files [list $type $object $path] + } + $w conf -state disabled + + if {[eof $fd]} { + close $fd - set browser_status Ready. ++ set browser_status [mc "Ready."] + set browser_busy 0 + set ls_buf {} + if {$n > 0} { + $w tag add in_sel 1.0 2.0 + focus -force $w + } + } +} ifdeleted { + catch {close $fd} +} + +} + +class browser_open { + +field w ; # widget path +field w_rev ; # mega-widget to pick the initial revision + +constructor dialog {} { + make_toplevel top w - wm title $top "[appname] ([reponame]): Browse Branch Files" ++ wm title $top [append "[appname] ([reponame]): " [mc "Browse Branch Files"]] + if {$top ne {.}} { + wm geometry $top "+[winfo rootx .]+[winfo rooty .]" + } + + label $w.header \ - -text {Browse Branch Files} \ ++ -text [mc "Browse Branch Files"] \ + -font font_uibold + pack $w.header -side top -fill x + + frame $w.buttons - button $w.buttons.browse -text Browse \ ++ button $w.buttons.browse -text [mc Browse] \ + -default active \ + -command [cb _open] + pack $w.buttons.browse -side right - button $w.buttons.cancel -text {Cancel} \ ++ button $w.buttons.cancel -text [mc Cancel] \ + -command [list destroy $w] + pack $w.buttons.cancel -side right -padx 5 + pack $w.buttons -side bottom -fill x -pady 10 -padx 10 + - set w_rev [::choose_rev::new $w.rev {Revision}] ++ set w_rev [::choose_rev::new $w.rev [mc Revision]] + $w_rev bind_listbox [cb _open] + pack $w.rev -anchor nw -fill both -expand 1 -pady 5 -padx 5 + + bind $w [cb _visible] + bind $w [list destroy $w] + bind $w [cb _open]\;break + tkwait window $w +} + +method _open {} { + if {[catch {$w_rev commit_or_die} err]} { + return + } + set name [$w_rev get] + destroy $w + browser::new $name +} + +method _visible {} { + grab $w + $w_rev focus_filter +} + +} diff --cc git-gui/lib/checkout_op.tcl index 76f04f285,000000000..f24396692 mode 100644,000000..100644 --- a/git-gui/lib/checkout_op.tcl +++ b/git-gui/lib/checkout_op.tcl @@@ -1,588 -1,0 +1,588 @@@ +# git-gui commit checkout support +# Copyright (C) 2007 Shawn Pearce + +class checkout_op { + +field w {}; # our window (if we have one) +field w_cons {}; # embedded console window object + +field new_expr ; # expression the user saw/thinks this is +field new_hash ; # commit SHA-1 we are switching to +field new_ref ; # ref we are updating/creating + +field parent_w .; # window that started us +field merge_type none; # type of merge to apply to existing branch +field merge_base {}; # merge base if we have another ref involved +field fetch_spec {}; # refetch tracking branch if used? +field checkout 1; # actually checkout the branch? +field create 0; # create the branch if it doesn't exist? + +field reset_ok 0; # did the user agree to reset? +field fetch_ok 0; # did the fetch succeed? + +field readtree_d {}; # buffered output from read-tree +field update_old {}; # was the update-ref call deferred? +field reflog_msg {}; # log message for the update-ref call + +constructor new {expr hash {ref {}}} { + set new_expr $expr + set new_hash $hash + set new_ref $ref + + return $this +} + +method parent {path} { + set parent_w [winfo toplevel $path] +} + +method enable_merge {type} { + set merge_type $type +} + +method enable_fetch {spec} { + set fetch_spec $spec +} + +method enable_checkout {co} { + set checkout $co +} + +method enable_create {co} { + set create $co +} + +method run {} { + if {$fetch_spec ne {}} { + global M1B + + # We were asked to refresh a single tracking branch + # before we get to work. We should do that before we + # consider any ref updating. + # + set fetch_ok 0 + set l_trck [lindex $fetch_spec 0] + set remote [lindex $fetch_spec 1] + set r_head [lindex $fetch_spec 2] + regsub ^refs/heads/ $r_head {} r_name + + set cmd [list git fetch $remote] + if {$l_trck ne {}} { + lappend cmd +$r_head:$l_trck + } else { + lappend cmd $r_head + } + + _toplevel $this {Refreshing Tracking Branch} + set w_cons [::console::embed \ + $w.console \ - "Fetching $r_name from $remote"] ++ [mc "Fetching %s from %s" $r_name $remote]] + pack $w.console -fill both -expand 1 + $w_cons exec $cmd [cb _finish_fetch] + + bind $w <$M1B-Key-w> break + bind $w <$M1B-Key-W> break + bind $w " + [list grab $w] + [list focus $w] + " + wm protocol $w WM_DELETE_WINDOW [cb _noop] + tkwait window $w + + if {!$fetch_ok} { + delete_this + return 0 + } + } + + if {$new_ref ne {}} { + # If we have a ref we need to update it before we can + # proceed with a checkout (if one was enabled). + # + if {![_update_ref $this]} { + delete_this + return 0 + } + } + + if {$checkout} { + _checkout $this + return 1 + } + + delete_this + return 1 +} + +method _noop {} {} + +method _finish_fetch {ok} { + if {$ok} { + set l_trck [lindex $fetch_spec 0] + if {$l_trck eq {}} { + set l_trck FETCH_HEAD + } + if {[catch {set new_hash [git rev-parse --verify "$l_trck^0"]} err]} { + set ok 0 - $w_cons insert "fatal: Cannot resolve $l_trck" ++ $w_cons insert [mc "fatal: Cannot resolve %s" $l_trck] + $w_cons insert $err + } + } + + $w_cons done $ok + set w_cons {} + wm protocol $w WM_DELETE_WINDOW {} + + if {$ok} { + destroy $w + set w {} + } else { - button $w.close -text Close -command [list destroy $w] ++ button $w.close -text [mc Close] -command [list destroy $w] + pack $w.close -side bottom -anchor e -padx 10 -pady 10 + } + + set fetch_ok $ok +} + +method _update_ref {} { + global null_sha1 current_branch + + set ref $new_ref + set new $new_hash + + set is_current 0 + set rh refs/heads/ + set rn [string length $rh] + if {[string equal -length $rn $rh $ref]} { + set newbranch [string range $ref $rn end] + if {$current_branch eq $newbranch} { + set is_current 1 + } + } else { + set newbranch $ref + } + + if {[catch {set cur [git rev-parse --verify "$ref^0"]}]} { + # Assume it does not exist, and that is what the error was. + # + if {!$create} { - _error $this "Branch '$newbranch' does not exist." ++ _error $this [mc "Branch '%s' does not exist." $newbranch] + return 0 + } + + set reflog_msg "branch: Created from $new_expr" + set cur $null_sha1 + } elseif {$create && $merge_type eq {none}} { + # We were told to create it, but not do a merge. + # Bad. Name shouldn't have existed. + # - _error $this "Branch '$newbranch' already exists." ++ _error $this [mc "Branch '%s' already exists." $newbranch] + return 0 + } elseif {!$create && $merge_type eq {none}} { + # We aren't creating, it exists and we don't merge. + # We are probably just a simple branch switch. + # Use whatever value we just read. + # + set new $cur + set new_hash $cur + } elseif {$new eq $cur} { + # No merge would be required, don't compute anything. + # + } else { + catch {set merge_base [git merge-base $new $cur]} + if {$merge_base eq $cur} { + # The current branch is older. + # + set reflog_msg "merge $new_expr: Fast-forward" + } else { + switch -- $merge_type { + ff { + if {$merge_base eq $new} { + # The current branch is actually newer. + # + set new $cur + set new_hash $cur + } else { - _error $this "Branch '$newbranch' already exists.\n\nIt cannot fast-forward to $new_expr.\nA merge is required." ++ _error $this [mc "Branch '%s' already exists.\n\nIt cannot fast-forward to %s.\nA merge is required." $newbranch $new_expr] + return 0 + } + } + reset { + # The current branch will lose things. + # + if {[_confirm_reset $this $cur]} { + set reflog_msg "reset $new_expr" + } else { + return 0 + } + } + default { - _error $this "Merge strategy '$merge_type' not supported." ++ _error $this [mc "Merge strategy '%s' not supported." $merge_type] + return 0 + } + } + } + } + + if {$new ne $cur} { + if {$is_current} { + # No so fast. We should defer this in case + # we cannot update the working directory. + # + set update_old $cur + return 1 + } + + if {[catch { + git update-ref -m $reflog_msg $ref $new $cur + } err]} { - _error $this "Failed to update '$newbranch'.\n\n$err" ++ _error $this [strcat [mc "Failed to update '%s'." $newbranch] "\n\n$err"] + return 0 + } + } + + return 1 +} + +method _checkout {} { + if {[lock_index checkout_op]} { + after idle [cb _start_checkout] + } else { - _error $this "Staging area (index) is already locked." ++ _error $this [mc "Staging area (index) is already locked."] + delete_this + } +} + +method _start_checkout {} { + global HEAD commit_type + + # -- Our in memory state should match the repository. + # + repository_state curType curHEAD curMERGE_HEAD + if {[string match amend* $commit_type] + && $curType eq {normal} + && $curHEAD eq $HEAD} { + } elseif {$commit_type ne $curType || $HEAD ne $curHEAD} { - info_popup {Last scanned state does not match repository state. ++ info_popup [mc "Last scanned state does not match repository state. + +Another Git program has modified this repository since the last scan. A rescan must be performed before the current branch can be changed. + +The rescan will be automatically started now. - } ++"] + unlock_index + rescan ui_ready + delete_this + return + } + + if {$curHEAD eq $new_hash} { + _after_readtree $this + } elseif {[is_config_true gui.trustmtime]} { + _readtree $this + } else { + ui_status {Refreshing file status...} + set fd [git_read update-index \ + -q \ + --unmerged \ + --ignore-missing \ + --refresh \ + ] + fconfigure $fd -blocking 0 -translation binary + fileevent $fd readable [cb _refresh_wait $fd] + } +} + +method _refresh_wait {fd} { + read $fd + if {[eof $fd]} { + close $fd + _readtree $this + } +} + +method _name {} { + if {$new_ref eq {}} { + return [string range $new_hash 0 7] + } + + set rh refs/heads/ + set rn [string length $rh] + if {[string equal -length $rn $rh $new_ref]} { + return [string range $new_ref $rn end] + } else { + return $new_ref + } +} + +method _readtree {} { + global HEAD + + set readtree_d {} + $::main_status start \ - "Updating working directory to '[_name $this]'..." \ ++ [mc "Updating working directory to '%s'..." [_name $this]] \ + {files checked out} + + set fd [git_read --stderr read-tree \ + -m \ + -u \ + -v \ + --exclude-per-directory=.gitignore \ + $HEAD \ + $new_hash \ + ] + fconfigure $fd -blocking 0 -translation binary + fileevent $fd readable [cb _readtree_wait $fd] +} + +method _readtree_wait {fd} { + global current_branch + + set buf [read $fd] + $::main_status update_meter $buf + append readtree_d $buf + + fconfigure $fd -blocking 1 + if {![eof $fd]} { + fconfigure $fd -blocking 0 + return + } + + if {[catch {close $fd}]} { + set err $readtree_d + regsub {^fatal: } $err {} err - $::main_status stop "Aborted checkout of '[_name $this]' (file level merging is required)." - warn_popup "File level merge required. ++ $::main_status stop [mc "Aborted checkout of '%s' (file level merging is required)." [_name $this]] ++ warn_popup [strcat [mc "File level merge required."] " + +$err + - Staying on branch '$current_branch'." ++" [mc "Staying on branch '%s'." $current_branch]] + unlock_index + delete_this + return + } + + $::main_status stop + _after_readtree $this +} + +method _after_readtree {} { + global selected_commit_type commit_type HEAD MERGE_HEAD PARENT + global current_branch is_detached + global ui_comm + + set name [_name $this] + set log "checkout: moving" + if {!$is_detached} { + append log " from $current_branch" + } + + # -- Move/create HEAD as a symbolic ref. Core git does not + # even check for failure here, it Just Works(tm). If it + # doesn't we are in some really ugly state that is difficult + # to recover from within git-gui. + # + set rh refs/heads/ + set rn [string length $rh] + if {[string equal -length $rn $rh $new_ref]} { + set new_branch [string range $new_ref $rn end] + if {$is_detached || $current_branch ne $new_branch} { + append log " to $new_branch" + if {[catch { + git symbolic-ref -m $log HEAD $new_ref + } err]} { + _fatal $this $err + } + set current_branch $new_branch + set is_detached 0 + } + } else { + if {!$is_detached || $new_hash ne $HEAD} { + append log " to $new_expr" + if {[catch { + _detach_HEAD $log $new_hash + } err]} { + _fatal $this $err + } + } + set current_branch HEAD + set is_detached 1 + } + + # -- We had to defer updating the branch itself until we + # knew the working directory would update. So now we + # need to finish that work. If it fails we're in big + # trouble. + # + if {$update_old ne {}} { + if {[catch { + git update-ref \ + -m $reflog_msg \ + $new_ref \ + $new_hash \ + $update_old + } err]} { + _fatal $this $err + } + } + + if {$is_detached} { - info_popup "You are no longer on a local branch. ++ info_popup [mc "You are no longer on a local branch. + - If you wanted to be on a branch, create one now starting from 'This Detached Checkout'." ++If you wanted to be on a branch, create one now starting from 'This Detached Checkout'."] + } + + # -- Update our repository state. If we were previously in + # amend mode we need to toss the current buffer and do a + # full rescan to update our file lists. If we weren't in + # amend mode our file lists are accurate and we can avoid + # the rescan. + # + unlock_index + set selected_commit_type new + if {[string match amend* $commit_type]} { + $ui_comm delete 0.0 end + $ui_comm edit reset + $ui_comm edit modified false - rescan [list ui_status "Checked out '$name'."] ++ rescan [list ui_status [mc "Checked out '%s'." $name]] + } else { + repository_state commit_type HEAD MERGE_HEAD + set PARENT $HEAD + ui_status "Checked out '$name'." + } + delete_this +} + +git-version proc _detach_HEAD {log new} { + >= 1.5.3 { + git update-ref --no-deref -m $log HEAD $new + } + default { + set p [gitdir HEAD] + file delete $p + set fd [open $p w] + fconfigure $fd -translation lf -encoding utf-8 + puts $fd $new + close $fd + } +} + +method _confirm_reset {cur} { + set reset_ok 0 + set name [_name $this] + set gitk [list do_gitk [list $cur ^$new_hash]] + + _toplevel $this {Confirm Branch Reset} + pack [label $w.msg1 \ + -anchor w \ + -justify left \ - -text "Resetting '$name' to $new_expr will lose the following commits:" \ ++ -text [mc "Resetting '%s' to '%s' will lose the following commits:" $name $new_expr]\ + ] -anchor w + + set list $w.list.l + frame $w.list + text $list \ + -font font_diff \ + -width 80 \ + -height 10 \ + -wrap none \ + -xscrollcommand [list $w.list.sbx set] \ + -yscrollcommand [list $w.list.sby set] + scrollbar $w.list.sbx -orient h -command [list $list xview] + scrollbar $w.list.sby -orient v -command [list $list yview] + pack $w.list.sbx -fill x -side bottom + pack $w.list.sby -fill y -side right + pack $list -fill both -expand 1 + pack $w.list -fill both -expand 1 -padx 5 -pady 5 + + pack [label $w.msg2 \ + -anchor w \ + -justify left \ - -text {Recovering lost commits may not be easy.} \ ++ -text [mc "Recovering lost commits may not be easy."] \ + ] + pack [label $w.msg3 \ + -anchor w \ + -justify left \ - -text "Reset '$name'?" \ ++ -text [mc "Reset '%s'?" $name] \ + ] + + frame $w.buttons + button $w.buttons.visualize \ - -text Visualize \ ++ -text [mc Visualize] \ + -command $gitk + pack $w.buttons.visualize -side left + button $w.buttons.reset \ - -text Reset \ ++ -text [mc Reset] \ + -command " + set @reset_ok 1 + destroy $w + " + pack $w.buttons.reset -side right + button $w.buttons.cancel \ + -default active \ - -text Cancel \ ++ -text [mc Cancel] \ + -command [list destroy $w] + pack $w.buttons.cancel -side right -padx 5 + pack $w.buttons -side bottom -fill x -pady 10 -padx 10 + + set fd [git_read rev-list --pretty=oneline $cur ^$new_hash] + while {[gets $fd line] > 0} { + set abbr [string range $line 0 7] + set subj [string range $line 41 end] + $list insert end "$abbr $subj\n" + } + close $fd + $list configure -state disabled + + bind $w $gitk + bind $w " + grab $w + focus $w.buttons.cancel + " + bind $w [list destroy $w] + bind $w [list destroy $w] + tkwait window $w + return $reset_ok +} + +method _error {msg} { + if {[winfo ismapped $parent_w]} { + set p $parent_w + } else { + set p . + } + + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $p] \ + -parent $p \ + -message $msg +} + +method _toplevel {title} { + regsub -all {::} $this {__} w + set w .$w + + if {[winfo ismapped $parent_w]} { + set p $parent_w + } else { + set p . + } + + toplevel $w + wm title $w $title + wm geometry $w "+[winfo rootx $p]+[winfo rooty $p]" +} + +method _fatal {err} { - error_popup "Failed to set current branch. ++ error_popup [strcat [mc "Failed to set current branch. + +This working directory is only partially switched. We successfully updated your files, but failed to update an internal Git file. + - This should not have occurred. [appname] will now close and give up. ++This should not have occurred. %s will now close and give up." [appname]] " + - $err" ++$err"] + exit 1 +} + +} diff --cc git-gui/lib/choose_repository.tcl index 000000000,000000000..2bac50e14 new file mode 100644 --- /dev/null +++ b/git-gui/lib/choose_repository.tcl @@@ -1,0 -1,0 +1,1044 @@@ ++# 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 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 readtree_err ; # Error output from read-tree (if any) ++field sorted_recent ; # recent repositories (sorted) ++ ++constructor pick {} { ++ global M1T M1B ++ ++ make_toplevel 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 [mc Apple] -menu .mbar.apple ++ menu $w.mbar.apple ++ $w.mbar.apple add command \ ++ -label [mc "About %s" [appname]] \ ++ -command do_about ++ } 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 ++ } ++ ++ 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 ++ frame $w_body ++ text $opts \ ++ -cursor $::cursor_ptr \ ++ -relief flat \ ++ -background [$w_body cget -background] \ ++ -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 {}} { ++ $m_repo add command \ ++ -command [cb _next clone] \ ++ -accelerator $M1T-C \ ++ -label [mc "Clone..."] ++ bind $top <$M1B-c> [cb _next clone] ++ bind $top <$M1B-C> [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"] ++ } ++ ++ label $w_body.space ++ 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 [$w_body.recentlabel cget -background] \ ++ -wrap none \ ++ -width 50 \ ++ -height 10 ++ $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 ++ ++ frame $w.buttons ++ set w_next $w.buttons.next ++ set w_quit $w.buttons.quit ++ 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 ++ ++ if {$top eq {.}} { ++ eval destroy [winfo children $top] ++ } ++} ++ ++proc _home {} { ++ if {[catch {set h $::env(HOME)}] ++ || ![file isdirectory $h]} { ++ set h . ++ } ++ return $h ++} ++ ++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 ++ } ++ } ++ return [lsort $recent] ++} ++ ++proc _unset_recentrepo {p} { ++ regsub -all -- {([()\[\]{}\.^$+*?\\])} $p {\\\1} p ++ git config --global --unset gui.recentrepo "^$p\$" ++} ++ ++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 ++ ++ while {[llength $recent] > 10} { ++ _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} { ++ destroy $w_body ++ if {![winfo exists $w_next]} { ++ button $w_next -default active ++ pack $w_next -side right -padx 5 -before $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 {[file exists $local_path]} { ++ error_popup [mc "Location %s already exists." $local_path] ++ return 0 ++ } ++ ++ 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} { ++ if {[file exists [file join $path HEAD]] ++ && [file exists [file join $path objects]] ++ && [file exists [file join $path config]]} { ++ 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]]} { ++ 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 {} { ++ $w_next conf \ ++ -state disabled \ ++ -command [cb _do_new2] \ ++ -text [mc "Create"] ++ ++ frame $w_body ++ label $w_body.h \ ++ -font font_uibold \ ++ -text [mc "Create New Repository"] ++ pack $w_body.h -side top -fill x -pady 10 ++ pack $w_body -fill x -padx 10 ++ ++ frame $w_body.where ++ label $w_body.where.l -text [mc "Directory:"] ++ entry $w_body.where.t \ ++ -textvariable @local_path \ ++ -font font_diff \ ++ -width 50 ++ button $w_body.where.b \ ++ -text [mc "Browse"] \ ++ -command [cb _new_local_path] ++ ++ pack $w_body.where.b -side right ++ pack $w_body.where.l -side left ++ pack $w_body.where.t -fill x ++ pack $w_body.where -fill x ++ ++ 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 [_home] ++ } ++ ++ set p [tk_chooseDirectory \ ++ -initialdir $p \ ++ -parent $top \ ++ -title [mc "Git Repository"] \ ++ -mustexist false] ++ if {$p eq {}} return ++ ++ set p [file normalize $p] ++ if {[file isdirectory $p]} { ++ foreach i [glob \ ++ -directory $p \ ++ -tails \ ++ -nocomplain \ ++ * .*] { ++ switch -- $i { ++ . continue ++ .. continue ++ default { ++ error_popup [mc "Directory %s already exists." $p] ++ return ++ } ++ } ++ } ++ if {[catch {file delete $p} err]} { ++ error_popup [strcat \ ++ [mc "Directory %s already exists." $p] \ ++ "\n\n$err"] ++ return ++ } ++ } elseif {[file exists $p]} { ++ error_popup [mc "File %s already exists." $p] ++ return ++ } ++ set local_path $p ++} ++ ++method _do_new2 {} { ++ if {![_git_init $this]} { ++ return ++ } ++ set done 1 ++} ++ ++###################################################################### ++## ++## Clone Existing Repository ++ ++method _do_clone {} { ++ $w_next conf \ ++ -state disabled \ ++ -command [cb _do_clone2] \ ++ -text [mc "Clone"] ++ ++ frame $w_body ++ label $w_body.h \ ++ -font font_uibold \ ++ -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 ++ frame $w_body.args ++ pack $args -fill both ++ ++ label $args.origin_l -text [mc "URL:"] ++ entry $args.origin_t \ ++ -textvariable @origin_url \ ++ -font font_diff \ ++ -width 50 ++ button $args.origin_b \ ++ -text [mc "Browse"] \ ++ -command [cb _open_origin] ++ grid $args.origin_l $args.origin_t $args.origin_b -sticky ew ++ ++ label $args.where_l -text [mc "Directory:"] ++ entry $args.where_t \ ++ -textvariable @local_path \ ++ -font font_diff \ ++ -width 50 ++ button $args.where_b \ ++ -text [mc "Browse"] \ ++ -command [cb _new_local_path] ++ grid $args.where_l $args.where_t $args.where_b -sticky ew ++ ++ label $args.type_l -text [mc "Clone Type:"] ++ frame $args.type_f ++ set w_types [list] ++ lappend w_types [radiobutton $args.type_f.hardlink \ ++ -state disabled \ ++ -anchor w \ ++ -text [mc "Standard (Fast, Semi-Redundant, Hardlinks)"] \ ++ -variable @clone_type \ ++ -value hardlink] ++ lappend w_types [radiobutton $args.type_f.full \ ++ -state disabled \ ++ -anchor w \ ++ -text [mc "Full Copy (Slower, Redundant Backup)"] \ ++ -variable @clone_type \ ++ -value full] ++ lappend w_types [radiobutton $args.type_f.shared \ ++ -state disabled \ ++ -anchor w \ ++ -text [mc "Shared (Fastest, Not Recommended, No Backup)"] \ ++ -variable @clone_type \ ++ -value shared] ++ foreach r $w_types { ++ pack $r -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 [_home] ++ } ++ ++ 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 {![_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 _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 ++ } ++ ++ set done 1 ++} ++ ++###################################################################### ++## ++## Open Existing Repository ++ ++method _do_open {} { ++ $w_next conf \ ++ -state disabled \ ++ -command [cb _do_open2] \ ++ -text [mc "Open"] ++ ++ frame $w_body ++ label $w_body.h \ ++ -font font_uibold \ ++ -text [mc "Open Existing Repository"] ++ pack $w_body.h -side top -fill x -pady 10 ++ pack $w_body -fill x -padx 10 ++ ++ frame $w_body.where ++ label $w_body.where.l -text [mc "Repository:"] ++ entry $w_body.where.t \ ++ -textvariable @local_path \ ++ -font font_diff \ ++ -width 50 ++ button $w_body.where.b \ ++ -text [mc "Browse"] \ ++ -command [cb _open_local_path] ++ ++ pack $w_body.where.b -side right ++ pack $w_body.where.l -side left ++ pack $w_body.where.t -fill x ++ pack $w_body.where -fill x ++ ++ 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 [_home] ++ } ++ ++ 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]]} { ++ 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 ::_prefix {} ++ set done 1 ++} ++ ++} diff --cc git-gui/lib/choose_rev.tcl index ec064b3e1,000000000..a063c5bc4 mode 100644,000000..100644 --- a/git-gui/lib/choose_rev.tcl +++ b/git-gui/lib/choose_rev.tcl @@@ -1,627 -1,0 +1,627 @@@ +# git-gui revision chooser +# Copyright (C) 2006, 2007 Shawn Pearce + +class choose_rev { + +image create photo ::choose_rev::img_find -data {R0lGODlhEAAQAIYAAPwCBCQmJDw+PBQSFAQCBMza3NTm5MTW1HyChOT29Ozq7MTq7Kze5Kzm7Oz6/NTy9Iza5GzGzKzS1Nzy9Nz29Kzq9HTGzHTK1Lza3AwKDLzu9JTi7HTW5GTCzITO1Mzq7Hza5FTK1ESyvHzKzKzW3DQyNDyqtDw6PIzW5HzGzAT+/Dw+RKyurNTOzMTGxMS+tJSGdATCxHRydLSqpLymnLSijBweHERCRNze3Pz69PTy9Oze1OTSxOTGrMSqlLy+vPTu5OzSvMymjNTGvNS+tMy2pMyunMSefAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAAe4gACCAAECA4OIiAIEBQYHBAKJgwIICQoLDA0IkZIECQ4PCxARCwSSAxITFA8VEBYXGBmJAQYLGhUbHB0eH7KIGRIMEBAgISIjJKaIJQQLFxERIialkieUGigpKRoIBCqJKyyLBwvJAioEyoICLS4v6QQwMQQyLuqLli8zNDU2BCf1lN3AkUPHDh49fAQAAEnGD1MCCALZEaSHkIUMBQS8wWMIkSJGhBzBmFEGgRsBUqpMiSgdAD+BAAAh/mhDcmVhdGVkIGJ5IEJNUFRvR0lGIFBybyB2ZXJzaW9uIDIuNQ0KqSBEZXZlbENvciAxOTk3LDE5OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQpodHRwOi8vd3d3LmRldmVsY29yLmNvbQA7} + +field w ; # our megawidget path +field w_list ; # list of currently filtered specs +field w_filter ; # filter entry for $w_list + +field c_expr {}; # current revision expression +field filter ; # current filter string +field revtype head; # type of revision chosen +field cur_specs [list]; # list of specs for $revtype +field spec_head ; # list of all head specs +field spec_trck ; # list of all tracking branch specs +field spec_tag ; # list of all tag specs +field tip_data ; # array of tip commit info by refname +field log_last ; # array of reflog date by refname + +field tooltip_wm {} ; # Current tooltip toplevel, if open +field tooltip_t {} ; # Text widget in $tooltip_wm +field tooltip_timer {} ; # Current timer event for our tooltip + +proc new {path {title {}}} { + return [_new $path 0 $title] +} + +proc new_unmerged {path {title {}}} { + return [_new $path 1 $title] +} + +constructor _new {path unmerged_only title} { + global current_branch is_detached + + if {![info exists ::all_remotes]} { + load_all_remotes + } + + set w $path + + if {$title ne {}} { + labelframe $w -text $title + } else { + frame $w + } + bind $w [cb _delete %W] + + if {$is_detached} { + radiobutton $w.detachedhead_r \ + -anchor w \ - -text {This Detached Checkout} \ ++ -text [mc "This Detached Checkout"] \ + -value HEAD \ + -variable @revtype + grid $w.detachedhead_r -sticky we -padx {0 5} -columnspan 2 + } + + radiobutton $w.expr_r \ - -text {Revision Expression:} \ ++ -text [mc "Revision Expression:"] \ + -value expr \ + -variable @revtype + entry $w.expr_t \ + -borderwidth 1 \ + -relief sunken \ + -width 50 \ + -textvariable @c_expr \ + -validate key \ + -validatecommand [cb _validate %d %S] + grid $w.expr_r $w.expr_t -sticky we -padx {0 5} + + frame $w.types + radiobutton $w.types.head_r \ - -text {Local Branch} \ ++ -text [mc "Local Branch"] \ + -value head \ + -variable @revtype + pack $w.types.head_r -side left + radiobutton $w.types.trck_r \ - -text {Tracking Branch} \ ++ -text [mc "Tracking Branch"] \ + -value trck \ + -variable @revtype + pack $w.types.trck_r -side left + radiobutton $w.types.tag_r \ - -text {Tag} \ ++ -text [mc "Tag"] \ + -value tag \ + -variable @revtype + pack $w.types.tag_r -side left + set w_filter $w.types.filter + entry $w_filter \ + -borderwidth 1 \ + -relief sunken \ + -width 12 \ + -textvariable @filter \ + -validate key \ + -validatecommand [cb _filter %P] + pack $w_filter -side right + pack [label $w.types.filter_icon \ + -image ::choose_rev::img_find \ + ] -side right + grid $w.types -sticky we -padx {0 5} -columnspan 2 + + frame $w.list + set w_list $w.list.l + listbox $w_list \ + -font font_diff \ + -width 50 \ + -height 10 \ + -selectmode browse \ + -exportselection false \ + -xscrollcommand [cb _sb_set $w.list.sbx h] \ + -yscrollcommand [cb _sb_set $w.list.sby v] + pack $w_list -fill both -expand 1 + grid $w.list -sticky nswe -padx {20 5} -columnspan 2 + bind $w_list [cb _show_tooltip @%x,%y] + bind $w_list [cb _hide_tooltip] + bind $w_list [cb _hide_tooltip] + bind $w_list [cb _hide_tooltip] + + grid columnconfigure $w 1 -weight 1 + if {$is_detached} { + grid rowconfigure $w 3 -weight 1 + } else { + grid rowconfigure $w 2 -weight 1 + } + + trace add variable @revtype write [cb _select] + bind $w_filter [list focus $w_list]\;break + bind $w_filter [list focus $w_list] + + set fmt list + append fmt { %(refname)} + append fmt { [list} + append fmt { %(objecttype)} + append fmt { %(objectname)} + append fmt { [concat %(taggername) %(authorname)]} - append fmt { [concat %(taggerdate) %(authordate)]} ++ append fmt { [reformat_date [concat %(taggerdate) %(authordate)]]} + append fmt { %(subject)} + append fmt {] [list} + append fmt { %(*objecttype)} + append fmt { %(*objectname)} + append fmt { %(*authorname)} - append fmt { %(*authordate)} ++ append fmt { [reformat_date %(*authordate)]} + append fmt { %(*subject)} + append fmt {]} + set all_refn [list] + set fr_fd [git_read for-each-ref \ + --tcl \ + --sort=-taggerdate \ + --format=$fmt \ + refs/heads \ + refs/remotes \ + refs/tags \ + ] + fconfigure $fr_fd -translation lf -encoding utf-8 + while {[gets $fr_fd line] > 0} { + set line [eval $line] + if {[lindex $line 1 0] eq {tag}} { + if {[lindex $line 2 0] eq {commit}} { + set sha1 [lindex $line 2 1] + } else { + continue + } + } elseif {[lindex $line 1 0] eq {commit}} { + set sha1 [lindex $line 1 1] + } else { + continue + } + set refn [lindex $line 0] + set tip_data($refn) [lrange $line 1 end] + lappend cmt_refn($sha1) $refn + lappend all_refn $refn + } + close $fr_fd + + if {$unmerged_only} { + set fr_fd [git_read rev-list --all ^$::HEAD] + while {[gets $fr_fd sha1] > 0} { + if {[catch {set rlst $cmt_refn($sha1)}]} continue + foreach refn $rlst { + set inc($refn) 1 + } + } + close $fr_fd + } else { + foreach refn $all_refn { + set inc($refn) 1 + } + } + + set spec_head [list] + foreach name [load_all_heads] { + set refn refs/heads/$name + if {[info exists inc($refn)]} { + lappend spec_head [list $name $refn] + } + } + + set spec_trck [list] + foreach spec [all_tracking_branches] { + set refn [lindex $spec 0] + if {[info exists inc($refn)]} { + regsub ^refs/(heads|remotes)/ $refn {} name + lappend spec_trck [concat $name $spec] + } + } + + set spec_tag [list] + foreach name [load_all_tags] { + set refn refs/tags/$name + if {[info exists inc($refn)]} { + lappend spec_tag [list $name $refn] + } + } + + if {$is_detached} { set revtype HEAD + } elseif {[llength $spec_head] > 0} { set revtype head + } elseif {[llength $spec_trck] > 0} { set revtype trck + } elseif {[llength $spec_tag ] > 0} { set revtype tag + } else { set revtype expr + } + + if {$revtype eq {head} && $current_branch ne {}} { + set i 0 + foreach spec $spec_head { + if {[lindex $spec 0] eq $current_branch} { + $w_list selection clear 0 end + $w_list selection set $i + break + } + incr i + } + } + + return $this +} + +method none {text} { + if {![winfo exists $w.none_r]} { + radiobutton $w.none_r \ + -anchor w \ + -value none \ + -variable @revtype + grid $w.none_r -sticky we -padx {0 5} -columnspan 2 + } + $w.none_r configure -text $text +} + +method get {} { + switch -- $revtype { + head - + trck - + tag { + set i [$w_list curselection] + if {$i ne {}} { + return [lindex $cur_specs $i 0] + } else { + return {} + } + } + + HEAD { return HEAD } + expr { return $c_expr } + none { return {} } + default { error "unknown type of revision" } + } +} + +method pick_tracking_branch {} { + set revtype trck +} + +method focus_filter {} { + if {[$w_filter cget -state] eq {normal}} { + focus $w_filter + } +} + +method bind_listbox {event script} { + bind $w_list $event $script +} + +method get_local_branch {} { + if {$revtype eq {head}} { + return [_expr $this] + } else { + return {} + } +} + +method get_tracking_branch {} { + set i [$w_list curselection] + if {$i eq {} || $revtype ne {trck}} { + return {} + } + return [lrange [lindex $cur_specs $i] 1 end] +} + +method get_commit {} { + set e [_expr $this] + if {$e eq {}} { + return {} + } + return [git rev-parse --verify "$e^0"] +} + +method commit_or_die {} { + if {[catch {set new [get_commit $this]} err]} { + + # Cleanup the not-so-friendly error from rev-parse. + # + regsub {^fatal:\s*} $err {} err + if {$err eq {Needed a single revision}} { + set err {} + } + + set top [winfo toplevel $w] - set msg "Invalid revision: [get $this]\n\n$err" ++ set msg [strcat [mc "Invalid revision: %s" [get $this]] "\n\n$err"] + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $top] \ + -parent $top \ + -message $msg + error $msg + } + return $new +} + +method _expr {} { + switch -- $revtype { + head - + trck - + tag { + set i [$w_list curselection] + if {$i ne {}} { + return [lindex $cur_specs $i 1] + } else { - error "No revision selected." ++ error [mc "No revision selected."] + } + } + + expr { + if {$c_expr ne {}} { + return $c_expr + } else { - error "Revision expression is empty." ++ error [mc "Revision expression is empty."] + } + } + HEAD { return HEAD } + none { return {} } + default { error "unknown type of revision" } + } +} + +method _validate {d S} { + if {$d == 1} { + if {[regexp {\s} $S]} { + return 0 + } + if {[string length $S] > 0} { + set revtype expr + } + } + return 1 +} + +method _filter {P} { + if {[regexp {\s} $P]} { + return 0 + } + _rebuild $this $P + return 1 +} + +method _select {args} { + _rebuild $this $filter + focus_filter $this +} + +method _rebuild {pat} { + set ste normal + switch -- $revtype { + head { set new $spec_head } + trck { set new $spec_trck } + tag { set new $spec_tag } + expr - + HEAD - + none { + set new [list] + set ste disabled + } + } + + if {[$w_list cget -state] eq {disabled}} { + $w_list configure -state normal + } + $w_list delete 0 end + + if {$pat ne {}} { + set pat *${pat}* + } + set cur_specs [list] + foreach spec $new { + set txt [lindex $spec 0] + if {$pat eq {} || [string match $pat $txt]} { + lappend cur_specs $spec + $w_list insert end $txt + } + } + if {$cur_specs ne {}} { + $w_list selection clear 0 end + $w_list selection set 0 + } + + if {[$w_filter cget -state] ne $ste} { + $w_list configure -state $ste + $w_filter configure -state $ste + } +} + +method _delete {current} { + if {$current eq $w} { + delete_this + } +} + +method _sb_set {sb orient first last} { + set old_focus [focus -lastfor $w] + + if {$first == 0 && $last == 1} { + if {[winfo exists $sb]} { + destroy $sb + if {$old_focus ne {}} { + update + focus $old_focus + } + } + return + } + + if {![winfo exists $sb]} { + if {$orient eq {h}} { + scrollbar $sb -orient h -command [list $w_list xview] + pack $sb -fill x -side bottom -before $w_list + } else { + scrollbar $sb -orient v -command [list $w_list yview] + pack $sb -fill y -side right -before $w_list + } + if {$old_focus ne {}} { + update + focus $old_focus + } + } + $sb set $first $last +} + +method _show_tooltip {pos} { + if {$tooltip_wm ne {}} { + _open_tooltip $this + } elseif {$tooltip_timer eq {}} { + set tooltip_timer [after 1000 [cb _open_tooltip]] + } +} + +method _open_tooltip {} { + global remote_url + + set tooltip_timer {} + set pos_x [winfo pointerx $w_list] + set pos_y [winfo pointery $w_list] + if {[winfo containing $pos_x $pos_y] ne $w_list} { + _hide_tooltip $this + return + } + + set pos @[join [list \ + [expr {$pos_x - [winfo rootx $w_list]}] \ + [expr {$pos_y - [winfo rooty $w_list]}]] ,] + set lno [$w_list index $pos] + if {$lno eq {}} { + _hide_tooltip $this + return + } + + set spec [lindex $cur_specs $lno] + set refn [lindex $spec 1] + if {$refn eq {}} { + _hide_tooltip $this + return + } + + if {$tooltip_wm eq {}} { + set tooltip_wm [toplevel $w_list.tooltip -borderwidth 1] + wm overrideredirect $tooltip_wm 1 + wm transient $tooltip_wm [winfo toplevel $w_list] + set tooltip_t $tooltip_wm.label + text $tooltip_t \ + -takefocus 0 \ + -highlightthickness 0 \ + -relief flat \ + -borderwidth 0 \ + -wrap none \ + -background lightyellow \ + -foreground black + $tooltip_t tag conf section_header -font font_uibold + bind $tooltip_wm [cb _hide_tooltip] + pack $tooltip_t + } else { + $tooltip_t conf -state normal + $tooltip_t delete 0.0 end + } + + set data $tip_data($refn) + if {[lindex $data 0 0] eq {tag}} { + set tag [lindex $data 0] + if {[lindex $data 1 0] eq {commit}} { + set cmit [lindex $data 1] + } else { + set cmit {} + } + } elseif {[lindex $data 0 0] eq {commit}} { + set tag {} + set cmit [lindex $data 0] + } + + $tooltip_t insert end [lindex $spec 0] + set last [_reflog_last $this [lindex $spec 1]] + if {$last ne {}} { + $tooltip_t insert end "\n" - $tooltip_t insert end "updated" ++ $tooltip_t insert end [mc "Updated"] + $tooltip_t insert end " $last" + } + $tooltip_t insert end "\n" + + if {$tag ne {}} { + $tooltip_t insert end "\n" - $tooltip_t insert end "tag" section_header ++ $tooltip_t insert end [mc "Tag"] section_header + $tooltip_t insert end " [lindex $tag 1]\n" + $tooltip_t insert end [lindex $tag 2] + $tooltip_t insert end " ([lindex $tag 3])\n" + $tooltip_t insert end [lindex $tag 4] + $tooltip_t insert end "\n" + } + + if {$cmit ne {}} { + $tooltip_t insert end "\n" - $tooltip_t insert end "commit" section_header ++ $tooltip_t insert end [mc "Commit@@noun"] section_header + $tooltip_t insert end " [lindex $cmit 1]\n" + $tooltip_t insert end [lindex $cmit 2] + $tooltip_t insert end " ([lindex $cmit 3])\n" + $tooltip_t insert end [lindex $cmit 4] + } + + if {[llength $spec] > 2} { + $tooltip_t insert end "\n" - $tooltip_t insert end "remote" section_header ++ $tooltip_t insert end [mc "Remote"] section_header + $tooltip_t insert end " [lindex $spec 2]\n" - $tooltip_t insert end "url" ++ $tooltip_t insert end [mc "URL"] + $tooltip_t insert end " $remote_url([lindex $spec 2])\n" - $tooltip_t insert end "branch" ++ $tooltip_t insert end [mc "Branch"] + $tooltip_t insert end " [lindex $spec 3]" + } + + $tooltip_t conf -state disabled + _position_tooltip $this +} + +method _reflog_last {name} { + if {[info exists reflog_last($name)]} { + return reflog_last($name) + } + + set last {} + if {[catch {set last [file mtime [gitdir $name]]}] + && ![catch {set g [open [gitdir logs $name] r]}]} { + fconfigure $g -translation binary + while {[gets $g line] >= 0} { + if {[regexp {> ([1-9][0-9]*) } $line line when]} { + set last $when + } + } + close $g + } + + if {$last ne {}} { - set last [clock format $last -format {%a %b %e %H:%M:%S %Y}] ++ set last [format_date $last] + } + set reflog_last($name) $last + return $last +} + +method _position_tooltip {} { + set max_h [lindex [split [$tooltip_t index end] .] 0] + set max_w 0 + for {set i 1} {$i <= $max_h} {incr i} { + set c [lindex [split [$tooltip_t index "$i.0 lineend"] .] 1] + if {$c > $max_w} {set max_w $c} + } + $tooltip_t conf -width $max_w -height $max_h + + set req_w [winfo reqwidth $tooltip_t] + set req_h [winfo reqheight $tooltip_t] + set pos_x [expr {[winfo pointerx .] + 5}] + set pos_y [expr {[winfo pointery .] + 10}] + + set g "${req_w}x${req_h}" + if {$pos_x >= 0} {append g +} + append g $pos_x + if {$pos_y >= 0} {append g +} + append g $pos_y + + wm geometry $tooltip_wm $g + raise $tooltip_wm +} + +method _hide_tooltip {} { + if {$tooltip_wm ne {}} { + destroy $tooltip_wm + set tooltip_wm {} + } + if {$tooltip_timer ne {}} { + after cancel $tooltip_timer + set tooltip_timer {} + } +} + +} diff --cc git-gui/lib/commit.tcl index 57238129e,000000000..10b0430f5 mode 100644,000000..100644 --- a/git-gui/lib/commit.tcl +++ b/git-gui/lib/commit.tcl @@@ -1,431 -1,0 +1,431 @@@ +# git-gui misc. commit reading/writing support +# Copyright (C) 2006, 2007 Shawn Pearce + +proc load_last_commit {} { + global HEAD PARENT MERGE_HEAD commit_type ui_comm + global repo_config + + if {[llength $PARENT] == 0} { - error_popup {There is nothing to amend. ++ error_popup [mc "There is nothing to amend. + +You are about to create the initial commit. There is no commit before this to amend. - } ++"] + return + } + + repository_state curType curHEAD curMERGE_HEAD + if {$curType eq {merge}} { - error_popup {Cannot amend while merging. ++ error_popup [mc "Cannot amend while merging. + +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. - } ++"] + return + } + + set msg {} + set parents [list] + if {[catch { + set fd [git_read cat-file commit $curHEAD] + fconfigure $fd -encoding binary -translation lf + if {[catch {set enc $repo_config(i18n.commitencoding)}]} { + set enc utf-8 + } + while {[gets $fd line] > 0} { + if {[string match {parent *} $line]} { + lappend parents [string range $line 7 end] + } elseif {[string match {encoding *} $line]} { + set enc [string tolower [string range $line 9 end]] + } + } + set msg [read $fd] + close $fd + + set enc [tcl_encoding $enc] + if {$enc ne {}} { + set msg [encoding convertfrom $enc $msg] + } + set msg [string trim $msg] + } err]} { - error_popup "Error loading commit data for amend:\n\n$err" ++ error_popup [strcat [mc "Error loading commit data for amend:"] "\n\n$err"] + return + } + + set HEAD $curHEAD + set PARENT $parents + set MERGE_HEAD [list] + switch -- [llength $parents] { + 0 {set commit_type amend-initial} + 1 {set commit_type amend} + default {set commit_type amend-merge} + } + + $ui_comm delete 0.0 end + $ui_comm insert end $msg + $ui_comm edit reset + $ui_comm edit modified false + rescan ui_ready +} + +set GIT_COMMITTER_IDENT {} + +proc committer_ident {} { + global GIT_COMMITTER_IDENT + + if {$GIT_COMMITTER_IDENT eq {}} { + if {[catch {set me [git var GIT_COMMITTER_IDENT]} err]} { - error_popup "Unable to obtain your identity:\n\n$err" ++ error_popup [strcat [mc "Unable to obtain your identity:"] "\n\n$err"] + return {} + } + if {![regexp {^(.*) [0-9]+ [-+0-9]+$} \ + $me me GIT_COMMITTER_IDENT]} { - error_popup "Invalid GIT_COMMITTER_IDENT:\n\n$me" ++ error_popup [strcat [mc "Invalid GIT_COMMITTER_IDENT:"] "\n\n$me"] + return {} + } + } + + return $GIT_COMMITTER_IDENT +} + +proc do_signoff {} { + global ui_comm + + set me [committer_ident] + if {$me eq {}} return + + set sob "Signed-off-by: $me" + set last [$ui_comm get {end -1c linestart} {end -1c}] + if {$last ne $sob} { + $ui_comm edit separator + if {$last ne {} + && ![regexp {^[A-Z][A-Za-z]*-[A-Za-z-]+: *} $last]} { + $ui_comm insert end "\n" + } + $ui_comm insert end "\n$sob" + $ui_comm edit separator + $ui_comm see end + } +} + +proc create_new_commit {} { + global commit_type ui_comm + + set commit_type normal + $ui_comm delete 0.0 end + $ui_comm edit reset + $ui_comm edit modified false + rescan ui_ready +} + +proc commit_tree {} { + global HEAD commit_type file_states ui_comm repo_config + global pch_error + + if {[committer_ident] eq {}} return + if {![lock_index update]} return + + # -- Our in memory state should match the repository. + # + repository_state curType curHEAD curMERGE_HEAD + if {[string match amend* $commit_type] + && $curType eq {normal} + && $curHEAD eq $HEAD} { + } elseif {$commit_type ne $curType || $HEAD ne $curHEAD} { - info_popup {Last scanned state does not match repository state. ++ info_popup [mc "Last scanned state does not match repository state. + +Another Git program has modified this repository since the last scan. A rescan must be performed before another commit can be created. + +The rescan will be automatically started now. - } ++"] + unlock_index + rescan ui_ready + return + } + + # -- At least one file should differ in the index. + # + set files_ready 0 + foreach path [array names file_states] { + switch -glob -- [lindex $file_states($path) 0] { + _? {continue} + A? - + D? - + M? {set files_ready 1} + U? { - error_popup "Unmerged files cannot be committed. ++ error_popup [mc "Unmerged files cannot be committed. + - File [short_path $path] has merge conflicts. You must resolve them and stage the file before committing. - " ++File %s has merge conflicts. You must resolve them and stage the file before committing. ++" [short_path $path]] + unlock_index + return + } + default { - error_popup "Unknown file state [lindex $s 0] detected. ++ error_popup [mc "Unknown file state %s detected. + - File [short_path $path] cannot be committed by this program. - " ++File %s cannot be committed by this program. ++" [lindex $s 0] [short_path $path]] + } + } + } + if {!$files_ready && ![string match *merge $curType]} { - info_popup {No changes to commit. ++ info_popup [mc "No changes to commit. + +You must stage at least 1 file before you can commit. - } ++"] + unlock_index + return + } + + # -- A message is required. + # + set msg [string trim [$ui_comm get 1.0 end]] + regsub -all -line {[ \t\r]+$} $msg {} msg + if {$msg eq {}} { - error_popup {Please supply a commit message. ++ error_popup [mc "Please supply a commit message. + +A good commit message has the following format: + +- First line: Describe in one sentance what you did. +- Second line: Blank +- Remaining lines: Describe why this change is good. - } ++"] + unlock_index + return + } + + # -- Run the pre-commit hook. + # + set pchook [gitdir hooks pre-commit] + + # On Cygwin [file executable] might lie so we need to ask + # the shell if the hook is executable. Yes that's annoying. + # + if {[is_Cygwin] && [file isfile $pchook]} { + set pchook [list sh -c [concat \ + "if test -x \"$pchook\";" \ + "then exec \"$pchook\" 2>&1;" \ + "fi"]] + } elseif {[file executable $pchook]} { + set pchook [list $pchook |& cat] + } else { + commit_writetree $curHEAD $msg + return + } + + ui_status {Calling pre-commit hook...} + set pch_error {} + set fd_ph [open "| $pchook" r] + fconfigure $fd_ph -blocking 0 -translation binary -eofchar {} + fileevent $fd_ph readable \ + [list commit_prehook_wait $fd_ph $curHEAD $msg] +} + +proc commit_prehook_wait {fd_ph curHEAD msg} { + 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 {Commit declined by pre-commit hook.} + hook_failed_popup pre-commit $pch_error + unlock_index + } else { + commit_writetree $curHEAD $msg + } + set pch_error {} + return + } + fconfigure $fd_ph -blocking 0 +} + +proc commit_writetree {curHEAD msg} { + ui_status {Committing changes...} + set fd_wt [git_read write-tree] + fileevent $fd_wt readable \ + [list commit_committree $fd_wt $curHEAD $msg] +} + +proc commit_committree {fd_wt curHEAD msg} { + global HEAD PARENT MERGE_HEAD commit_type + global current_branch + global ui_comm selected_commit_type + global file_states selected_paths rescan_active + global repo_config + + gets $fd_wt tree_id + if {[catch {close $fd_wt} err]} { - error_popup "write-tree failed:\n\n$err" ++ error_popup [strcat [mc "write-tree failed:"] "\n\n$err"] + ui_status {Commit failed.} + unlock_index + return + } + + # -- Verify this wasn't an empty change. + # + if {$commit_type eq {normal}} { + set fd_ot [git_read cat-file commit $PARENT] + fconfigure $fd_ot -encoding binary -translation lf + set old_tree [gets $fd_ot] + close $fd_ot + + if {[string equal -length 5 {tree } $old_tree] + && [string length $old_tree] == 45} { + set old_tree [string range $old_tree 5 end] + } else { - error "Commit $PARENT appears to be corrupt" ++ error [mc "Commit %s appears to be corrupt" $PARENT] + } + + if {$tree_id eq $old_tree} { - info_popup {No changes to commit. ++ info_popup [mc "No changes to commit. + +No files were modified by this commit and it was not a merge commit. + +A rescan will be automatically started now. - } ++"] + unlock_index - rescan {ui_status {No changes to commit.}} ++ rescan {ui_status [mc "No changes to commit."]} + return + } + } + + # -- Build the message. + # + set msg_p [gitdir COMMIT_EDITMSG] + set msg_wt [open $msg_p w] + fconfigure $msg_wt -translation lf + if {[catch {set enc $repo_config(i18n.commitencoding)}]} { + set enc utf-8 + } + set use_enc [tcl_encoding $enc] + if {$use_enc ne {}} { + fconfigure $msg_wt -encoding $use_enc + } else { - puts stderr "warning: Tcl does not support encoding '$enc'." ++ puts stderr [mc "warning: Tcl does not support encoding '%s'." $enc] + fconfigure $msg_wt -encoding utf-8 + } + puts -nonewline $msg_wt $msg + close $msg_wt + + # -- Create the commit. + # + set cmd [list commit-tree $tree_id] + foreach p [concat $PARENT $MERGE_HEAD] { + lappend cmd -p $p + } + lappend cmd <$msg_p + if {[catch {set cmt_id [eval git $cmd]} err]} { - error_popup "commit-tree failed:\n\n$err" ++ error_popup [strcat [mc "commit-tree failed:"] "\n\n$err"] + ui_status {Commit failed.} + unlock_index + return + } + + # -- Update the HEAD ref. + # + set reflogm commit + if {$commit_type ne {normal}} { + append reflogm " ($commit_type)" + } + set i [string first "\n" $msg] + if {$i >= 0} { + set subject [string range $msg 0 [expr {$i - 1}]] + } else { + set subject $msg + } + append reflogm {: } $subject + if {[catch { + git update-ref -m $reflogm HEAD $cmt_id $curHEAD + } err]} { - error_popup "update-ref failed:\n\n$err" ++ error_popup [strcat [mc "update-ref failed:"] "\n\n$err"] + ui_status {Commit failed.} + unlock_index + return + } + + # -- Cleanup after ourselves. + # + catch {file delete $msg_p} + catch {file delete [gitdir MERGE_HEAD]} + catch {file delete [gitdir MERGE_MSG]} + catch {file delete [gitdir SQUASH_MSG]} + catch {file delete [gitdir GITGUI_MSG]} + + # -- Let rerere do its thing. + # + if {[get_config rerere.enabled] eq {}} { + set rerere [file isdirectory [gitdir rr-cache]] + } else { + set rerere [is_config_true rerere.enabled] + } + if {$rerere} { + catch {git rerere} + } + + # -- Run the post-commit hook. + # + set pchook [gitdir hooks post-commit] + if {[is_Cygwin] && [file isfile $pchook]} { + set pchook [list sh -c [concat \ + "if test -x \"$pchook\";" \ + "then exec \"$pchook\";" \ + "fi"]] + } elseif {![file executable $pchook]} { + set pchook {} + } + if {$pchook ne {}} { + catch {exec $pchook &} + } + + $ui_comm delete 0.0 end + $ui_comm edit reset + $ui_comm edit modified false + if {$::GITGUI_BCK_exists} { + catch {file delete [gitdir GITGUI_BCK]} + set ::GITGUI_BCK_exists 0 + } + + if {[is_enabled singlecommit]} do_quit + + # -- Update in memory status + # + set selected_commit_type new + set commit_type normal + set HEAD $cmt_id + set PARENT $cmt_id + set MERGE_HEAD [list] + + foreach path [array names file_states] { + set s $file_states($path) + set m [lindex $s 0] + switch -glob -- $m { + _O - + _M - + _D {continue} + __ - + A_ - + M_ - + D_ { + unset file_states($path) + catch {unset selected_paths($path)} + } + DO { + set file_states($path) [list _O [lindex $s 1] {} {}] + } + AM - + AD - + MM - + MD { + set file_states($path) [list \ + _[string index $m 1] \ + [lindex $s 1] \ + [lindex $s 3] \ + {}] + } + } + } + + display_all_files + unlock_index + reshow_diff - ui_status "Created commit [string range $cmt_id 0 7]: $subject" ++ ui_status [mc "Created commit %s: %s" [string range $cmt_id 0 7] $subject] +} diff --cc git-gui/lib/console.tcl index b038a7835,000000000..5597188d8 mode 100644,000000..100644 --- a/git-gui/lib/console.tcl +++ b/git-gui/lib/console.tcl @@@ -1,203 -1,0 +1,218 @@@ +# git-gui console support +# Copyright (C) 2006, 2007 Shawn Pearce + +class console { + +field t_short +field t_long +field w ++field w_t +field console_cr +field is_toplevel 1; # are we our own window? + +constructor new {short_title long_title} { + set t_short $short_title + set t_long $long_title + _init $this + return $this +} + +constructor embed {path title} { + set t_short {} + set t_long $title + set w $path + set is_toplevel 0 + _init $this + return $this +} + +method _init {} { + global M1B + + if {$is_toplevel} { + make_toplevel top w -autodelete 0 + wm title $top "[appname] ([reponame]): $t_short" + } else { + frame $w + } + + set console_cr 1.0 ++ set w_t $w.m.t + + frame $w.m + label $w.m.l1 \ + -textvariable @t_long \ + -anchor w \ + -justify left \ + -font font_uibold - text $w.m.t \ ++ text $w_t \ + -background white -borderwidth 1 \ + -relief sunken \ + -width 80 -height 10 \ + -wrap none \ + -font font_diff \ + -state disabled \ - -xscrollcommand [list $w.m.sbx set] \ - -yscrollcommand [list $w.m.sby set] - label $w.m.s -text {Working... please wait...} \ ++ -xscrollcommand [cb _sb_set $w.m.sbx h] \ ++ -yscrollcommand [cb _sb_set $w.m.sby v] ++ label $w.m.s -text [mc "Working... please wait..."] \ + -anchor w \ + -justify left \ + -font font_uibold - scrollbar $w.m.sbx -command [list $w.m.t xview] -orient h - scrollbar $w.m.sby -command [list $w.m.t yview] + pack $w.m.l1 -side top -fill x + pack $w.m.s -side bottom -fill x - pack $w.m.sbx -side bottom -fill x - pack $w.m.sby -side right -fill y - pack $w.m.t -side left -fill both -expand 1 ++ pack $w_t -side left -fill both -expand 1 + pack $w.m -side top -fill both -expand 1 -padx 5 -pady 10 + + menu $w.ctxm -tearoff 0 - $w.ctxm add command -label "Copy" \ - -command "tk_textCopy $w.m.t" - $w.ctxm add command -label "Select All" \ - -command "focus $w.m.t;$w.m.t tag add sel 0.0 end" - $w.ctxm add command -label "Copy All" \ ++ $w.ctxm add command -label [mc "Copy"] \ ++ -command "tk_textCopy $w_t" ++ $w.ctxm add command -label [mc "Select All"] \ ++ -command "focus $w_t;$w_t tag add sel 0.0 end" ++ $w.ctxm add command -label [mc "Copy All"] \ + -command " - $w.m.t tag add sel 0.0 end - tk_textCopy $w.m.t - $w.m.t tag remove sel 0.0 end ++ $w_t tag add sel 0.0 end ++ tk_textCopy $w_t ++ $w_t tag remove sel 0.0 end + " + + if {$is_toplevel} { - button $w.ok -text {Close} \ ++ button $w.ok -text [mc "Close"] \ + -state disabled \ + -command [list destroy $w] + pack $w.ok -side bottom -anchor e -pady 10 -padx 10 + bind $w [list focus $w] + } + - bind_button3 $w.m.t "tk_popup $w.ctxm %X %Y" - bind $w.m.t <$M1B-Key-a> "$w.m.t tag add sel 0.0 end;break" - bind $w.m.t <$M1B-Key-A> "$w.m.t tag add sel 0.0 end;break" ++ bind_button3 $w_t "tk_popup $w.ctxm %X %Y" ++ bind $w_t <$M1B-Key-a> "$w_t tag add sel 0.0 end;break" ++ bind $w_t <$M1B-Key-A> "$w_t tag add sel 0.0 end;break" +} + +method exec {cmd {after {}}} { + if {[lindex $cmd 0] eq {git}} { + set fd_f [eval git_read --stderr [lrange $cmd 1 end]] + } else { + lappend cmd 2>@1 + set fd_f [_open_stdout_stderr $cmd] + } + fconfigure $fd_f -blocking 0 -translation binary + fileevent $fd_f readable [cb _read $fd_f $after] +} + +method _read {fd after} { + set buf [read $fd] + if {$buf ne {}} { - if {![winfo exists $w.m.t]} {_init $this} - $w.m.t conf -state normal ++ if {![winfo exists $w_t]} {_init $this} ++ $w_t conf -state normal + set c 0 + set n [string length $buf] + while {$c < $n} { + set cr [string first "\r" $buf $c] + set lf [string first "\n" $buf $c] + if {$cr < 0} {set cr [expr {$n + 1}]} + if {$lf < 0} {set lf [expr {$n + 1}]} + + if {$lf < $cr} { - $w.m.t insert end [string range $buf $c $lf] - set console_cr [$w.m.t index {end -1c}] ++ $w_t insert end [string range $buf $c $lf] ++ set console_cr [$w_t index {end -1c}] + set c $lf + incr c + } else { - $w.m.t delete $console_cr end - $w.m.t insert end "\n" - $w.m.t insert end [string range $buf $c [expr {$cr - 1}]] ++ $w_t delete $console_cr end ++ $w_t insert end "\n" ++ $w_t insert end [string range $buf $c [expr {$cr - 1}]] + set c $cr + incr c + } + } - $w.m.t conf -state disabled - $w.m.t see end ++ $w_t conf -state disabled ++ $w_t see end + } + + fconfigure $fd -blocking 1 + if {[eof $fd]} { + if {[catch {close $fd}]} { + set ok 0 + } else { + set ok 1 + } + if {$after ne {}} { + uplevel #0 $after $ok + } else { + done $this $ok + } + return + } + fconfigure $fd -blocking 0 +} + +method chain {cmdlist {ok 1}} { + if {$ok} { + if {[llength $cmdlist] == 0} { + done $this $ok + return + } + + set cmd [lindex $cmdlist 0] + set cmdlist [lrange $cmdlist 1 end] + + if {[lindex $cmd 0] eq {exec}} { + exec $this \ + [lrange $cmd 1 end] \ + [cb chain $cmdlist] + } else { + uplevel #0 $cmd [cb chain $cmdlist] + } + } else { + done $this $ok + } +} + +method insert {txt} { - if {![winfo exists $w.m.t]} {_init $this} - $w.m.t conf -state normal - $w.m.t insert end "$txt\n" - set console_cr [$w.m.t index {end -1c}] - $w.m.t conf -state disabled ++ if {![winfo exists $w_t]} {_init $this} ++ $w_t conf -state normal ++ $w_t insert end "$txt\n" ++ set console_cr [$w_t index {end -1c}] ++ $w_t conf -state disabled +} + +method done {ok} { + if {$ok} { + if {[winfo exists $w.m.s]} { - $w.m.s conf -background green -text {Success} ++ bind $w.m.s [list delete_this $this] ++ $w.m.s conf -background green -text [mc "Success"] + if {$is_toplevel} { + $w.ok conf -state normal + focus $w.ok + } ++ } else { ++ delete_this + } + } else { + if {![winfo exists $w.m.s]} { + _init $this + } - $w.m.s conf -background red -text {Error: Command Failed} ++ bind $w.m.s [list delete_this $this] ++ $w.m.s conf -background red -text [mc "Error: Command Failed"] + if {$is_toplevel} { + $w.ok conf -state normal + focus $w.ok + } + } - delete_this ++} ++ ++method _sb_set {sb orient first last} { ++ if {![winfo exists $sb]} { ++ if {$first == $last || ($first == 0 && $last == 1)} return ++ if {$orient eq {h}} { ++ scrollbar $sb -orient h -command [list $w_t xview] ++ pack $sb -fill x -side bottom -before $w_t ++ } else { ++ scrollbar $sb -orient v -command [list $w_t yview] ++ pack $sb -fill y -side right -before $w_t ++ } ++ } ++ $sb set $first $last +} + +} diff --cc git-gui/lib/database.tcl index 0657cc224,000000000..d66aa3fe3 mode 100644,000000..100644 --- a/git-gui/lib/database.tcl +++ b/git-gui/lib/database.tcl @@@ -1,116 -1,0 +1,116 @@@ +# git-gui object database management support +# Copyright (C) 2006, 2007 Shawn Pearce + +proc do_stats {} { + set fd [git_read count-objects -v] + while {[gets $fd line] > 0} { + if {[regexp {^([^:]+): (\d+)$} $line _ name value]} { + set stats($name) $value + } + } + close $fd + + set packed_sz 0 + foreach p [glob -directory [gitdir objects pack] \ + -type f \ + -nocomplain -- *] { + incr packed_sz [file size $p] + } + if {$packed_sz > 0} { + set stats(size-pack) [expr {$packed_sz / 1024}] + } + + set w .stats_view + toplevel $w + wm geometry $w "+[winfo rootx .]+[winfo rooty .]" + - label $w.header -text {Database Statistics} ++ label $w.header -text [mc "Database Statistics"] + pack $w.header -side top -fill x + + frame $w.buttons -border 1 - button $w.buttons.close -text Close \ ++ button $w.buttons.close -text [mc Close] \ + -default active \ + -command [list destroy $w] - button $w.buttons.gc -text {Compress Database} \ ++ button $w.buttons.gc -text [mc "Compress Database"] \ + -default normal \ + -command "destroy $w;do_gc" + pack $w.buttons.close -side right + pack $w.buttons.gc -side left + pack $w.buttons -side bottom -fill x -pady 10 -padx 10 + + frame $w.stat -borderwidth 1 -relief solid + foreach s { - {count {Number of loose objects}} - {size {Disk space used by loose objects} { KiB}} - {in-pack {Number of packed objects}} - {packs {Number of packs}} - {size-pack {Disk space used by packed objects} { KiB}} - {prune-packable {Packed objects waiting for pruning}} - {garbage {Garbage files}} ++ {count {mc "Number of loose objects"}} ++ {size {mc "Disk space used by loose objects"} { KiB}} ++ {in-pack {mc "Number of packed objects"}} ++ {packs {mc "Number of packs"}} ++ {size-pack {mc "Disk space used by packed objects"} { KiB}} ++ {prune-packable {mc "Packed objects waiting for pruning"}} ++ {garbage {mc "Garbage files"}} + } { + set name [lindex $s 0] - set label [lindex $s 1] ++ set label [eval [lindex $s 1]] + if {[catch {set value $stats($name)}]} continue + if {[llength $s] > 2} { + set value "$value[lindex $s 2]" + } + + label $w.stat.l_$name -text "$label:" -anchor w + label $w.stat.v_$name -text $value -anchor w + grid $w.stat.l_$name $w.stat.v_$name -sticky we -padx {0 5} + } + pack $w.stat -pady 10 -padx 10 + + bind $w "grab $w; focus $w.buttons.close" + bind $w [list destroy $w] + bind $w [list destroy $w] - wm title $w "[appname] ([reponame]): Database Statistics" ++ wm title $w [append "[appname] ([reponame]): " [mc "Database Statistics"]] + tkwait window $w +} + +proc do_gc {} { - set w [console::new {gc} {Compressing the object database}] ++ set w [console::new {gc} [mc "Compressing the object database"]] + console::chain $w { + {exec git pack-refs --prune} + {exec git reflog expire --all} + {exec git repack -a -d -l} + {exec git rerere gc} + } +} + +proc do_fsck_objects {} { + set w [console::new {fsck-objects} \ - {Verifying the object database with fsck-objects}] ++ [mc "Verifying the object database with fsck-objects"]] + set cmd [list git fsck-objects] + lappend cmd --full + lappend cmd --cache + lappend cmd --strict + console::exec $w $cmd +} + +proc hint_gc {} { + set object_limit 8 + if {[is_Windows]} { + set object_limit 1 + } + + set objects_current [llength [glob \ + -directory [gitdir objects 42] \ + -nocomplain \ + -tails \ + -- \ + *]] + + if {$objects_current >= $object_limit} { + set objects_current [expr {$objects_current * 256}] + set object_limit [expr {$object_limit * 256}] + if {[ask_popup \ - "This repository currently has approximately $objects_current loose objects. ++ [mc "This repository currently has approximately %i loose objects. + - To maintain optimal performance it is strongly recommended that you compress the database when more than $object_limit loose objects exist. ++To maintain optimal performance it is strongly recommended that you compress the database when more than %i loose objects exist. + - Compress the database now?"] eq yes} { ++Compress the database now?" $objects_current $object_limit]] eq yes} { + do_gc + } + } +} diff --cc git-gui/lib/date.tcl index 000000000,000000000..abe82992b new file mode 100644 --- /dev/null +++ b/git-gui/lib/date.tcl @@@ -1,0 -1,0 +1,53 @@@ ++# git-gui date processing support ++# Copyright (C) 2007 Shawn Pearce ++ ++set git_month(Jan) 1 ++set git_month(Feb) 2 ++set git_month(Mar) 3 ++set git_month(Apr) 4 ++set git_month(May) 5 ++set git_month(Jun) 6 ++set git_month(Jul) 7 ++set git_month(Aug) 8 ++set git_month(Sep) 9 ++set git_month(Oct) 10 ++set git_month(Nov) 11 ++set git_month(Dec) 12 ++ ++proc parse_git_date {s} { ++ if {$s eq {}} { ++ return {} ++ } ++ ++ if {![regexp \ ++ {^... (...) (\d{1,2}) (\d\d):(\d\d):(\d\d) (\d{4}) ([+-]?)(\d\d)(\d\d)$} $s s \ ++ month day hr mm ss yr ew tz_h tz_m]} { ++ error [mc "Invalid date from Git: %s" $s] ++ } ++ ++ set s [clock scan [format {%4.4i%2.2i%2.2iT%2s%2s%2s} \ ++ $yr $::git_month($month) $day \ ++ $hr $mm $ss] \ ++ -gmt 1] ++ ++ regsub ^0 $tz_h {} tz_h ++ regsub ^0 $tz_m {} tz_m ++ switch -- $ew { ++ - {set ew +} ++ + {set ew -} ++ {} {set ew -} ++ } ++ ++ return [expr "$s $ew ($tz_h * 3600 + $tz_m * 60)"] ++} ++ ++proc format_date {s} { ++ if {$s eq {}} { ++ return {} ++ } ++ return [clock format $s -format {%a %b %e %H:%M:%S %Y}] ++} ++ ++proc reformat_date {s} { ++ return [format_date [parse_git_date $s]] ++} diff --cc git-gui/lib/diff.tcl index 694834ab7,000000000..43565e412 mode 100644,000000..100644 --- a/git-gui/lib/diff.tcl +++ b/git-gui/lib/diff.tcl @@@ -1,358 -1,0 +1,361 @@@ +# git-gui diff viewer +# Copyright (C) 2006, 2007 Shawn Pearce + +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 {} { + global file_states file_lists + global current_diff_path current_diff_side + + set p $current_diff_path + if {$p eq {}} { + # No diff is being shown. + } elseif {$current_diff_side eq {} + || [catch {set s $file_states($p)}] + || [lsearch -sorted -exact $file_lists($current_diff_side) $p] == -1} { + clear_diff + } else { + show_diff $p $current_diff_side + } +} + +proc handle_empty_diff {} { + global current_diff_path file_states file_lists + + set path $current_diff_path + set s $file_states($path) + if {[lindex $s 0] ne {_M}} return + - info_popup "No differences detected. ++ info_popup [mc "No differences detected. + - [short_path $path] has no changes. ++%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." ++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 {}}} { + 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 + + 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 + } + + set s $file_states($path) + set m [lindex $s 0] + set is_3way_diff 0 + set diff_active 1 + set current_diff_path $path + set current_diff_side $w + set current_diff_header {} - ui_status "Loading diff of [escape_path $path]..." ++ ui_status [mc "Loading diff of %s..." [escape_path $path]] + + # - Git won't give us the diff, there's nothing to compare to! + # + if {$m eq {_O}} { + set max_sz [expr {128 * 1024}] + 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 {} + 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 "Unable to display [escape_path $path]" - error_popup "Error loading file:\n\n$err" ++ 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 "* Git Repository (subproject)\n" d_@ ++ $ui_diff insert end [append \ ++ "* " \ ++ [mc "Git Repository (subproject)"] \ ++ "\n"] d_@ + } 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_@ + } + if {[string first "\0" $content] != -1} { + $ui_diff insert end \ - "* Binary file (not showing content)." \ ++ [mc "* Binary file (not showing content)."] \ + d_@ + } else { + if {$sz > $max_sz} { + $ui_diff insert end \ +"* Untracked file is $sz bytes. +* Showing only first $max_sz bytes. +" d_@ + } + $ui_diff insert end $content + if {$sz > $max_sz} { + $ui_diff insert end " +* Untracked file clipped here by [appname]. +* To see the entire file, use an external editor. +" d_@ + } + } + $ui_diff conf -state disabled + set diff_active 0 + unlock_index + ui_ready + return + } + + set cmd [list] + if {$w eq $ui_index} { + lappend cmd diff-index + lappend cmd --cached + } elseif {$w eq $ui_workdir} { + if {[string index $m 0] eq {U}} { + lappend cmd diff + } else { + lappend cmd diff-files + } + } + + lappend cmd -p + lappend cmd --no-color + if {$repo_config(gui.diffcontext) >= 0} { + lappend cmd "-U$repo_config(gui.diffcontext)" + } + if {$w eq $ui_index} { + lappend cmd [PARENT] + } + lappend cmd -- + lappend cmd $path + + if {[catch {set fd [eval git_read --nice $cmd]} err]} { + set diff_active 0 + unlock_index - ui_status "Unable to display [escape_path $path]" - error_popup "Error loading diff:\n\n$err" ++ ui_status [mc "Unable to display %s" [escape_path $path]] ++ error_popup [strcat [mc "Error loading diff:"] "\n\n$err"] + return + } + + fconfigure $fd \ + -blocking 0 \ + -encoding binary \ + -translation binary + fileevent $fd readable [list read_diff $fd] +} + +proc read_diff {fd} { + global ui_diff diff_active + global is_3way_diff current_diff_header + + $ui_diff conf -state normal + while {[gets $fd line] >= 0} { + # -- 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]} { + append current_diff_header $line "\n" + continue + } + if {[string match {index *} $line]} continue + if {$line eq {deleted file mode 120000}} { + set line "deleted symlink" + } + + # -- Automatically detect if this is a 3 way diff. + # + if {[string match {@@@ *} $line]} {set is_3way_diff 1} + + if {[string match {mode *} $line] + || [string match {new file *} $line] + || [string match {deleted file *} $line] + || [string match {deleted symlink} $line] + || [string match {Binary files * and * differ} $line] + || $line eq {\ No newline at end of file} + || [regexp {^\* Unmerged path } $line]} { + set tags {} + } 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_--} + {++} { + if {[regexp {^\+\+([<>]{7} |={7})} $line _g op]} { + 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 {} + } + } + } else { + set op [string index $line 0] + switch -- $op { + { } {set tags {}} + {@} {set tags d_@} + {-} {set tags d_-} + {+} { + if {[regexp {^\+([<>]{7} |={7})} $line _g op]} { + set line [string replace $line 0 0 { }] + set tags d$op + } else { + set tags d_+ + } + } + default { + puts "error: Unhandled 2 way diff marker: {$op}" + set tags {} + } + } + } + $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 + } + $ui_diff conf -state disabled + + if {[eof $fd]} { + close $fd + set diff_active 0 + unlock_index + ui_ready + + if {[$ui_diff index end] eq {2.0}} { + handle_empty_diff + } + } +} + +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 mode unstage ++ 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 mode stage ++ 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 p [eval git_write $apply_cmd] + fconfigure $p -translation binary -encoding binary + puts -nonewline $p $current_diff_header + puts -nonewline $p [$ui_diff get $s_lno $e_lno] + close $p} err]} { - error_popup "Failed to $mode selected hunk.\n\n$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 + if {$o eq {_}} { + clear_diff + } +} diff --cc git-gui/lib/error.tcl index 16a22187b,000000000..13565b7ab mode 100644,000000..100644 --- a/git-gui/lib/error.tcl +++ b/git-gui/lib/error.tcl @@@ -1,104 -1,0 +1,104 @@@ +# git-gui branch (create/delete) support +# Copyright (C) 2006, 2007 Shawn Pearce + +proc error_popup {msg} { + set title [appname] + if {[reponame] ne {}} { + append title " ([reponame])" + } + set cmd [list tk_messageBox \ + -icon error \ + -type ok \ - -title "$title: error" \ ++ -title [append "$title: " [mc "error"]] \ + -message $msg] + if {[winfo ismapped .]} { + lappend cmd -parent . + } + eval $cmd +} + +proc warn_popup {msg} { + set title [appname] + if {[reponame] ne {}} { + append title " ([reponame])" + } + set cmd [list tk_messageBox \ + -icon warning \ + -type ok \ - -title "$title: warning" \ ++ -title [append "$title: " [mc "warning"]] \ + -message $msg] + if {[winfo ismapped .]} { + lappend cmd -parent . + } + eval $cmd +} + +proc info_popup {msg {parent .}} { + set title [appname] + if {[reponame] ne {}} { + append title " ([reponame])" + } + tk_messageBox \ + -parent $parent \ + -icon info \ + -type ok \ + -title $title \ + -message $msg +} + +proc ask_popup {msg} { + set title [appname] + if {[reponame] ne {}} { + append title " ([reponame])" + } + set cmd [list tk_messageBox \ + -icon question \ + -type yesno \ + -title $title \ + -message $msg] + if {[winfo ismapped .]} { + lappend cmd -parent . + } + eval $cmd +} + +proc hook_failed_popup {hook msg} { + set w .hookfail + toplevel $w + + frame $w.m + label $w.m.l1 -text "$hook hook failed:" \ + -anchor w \ + -justify left \ + -font font_uibold + text $w.m.t \ + -background white -borderwidth 1 \ + -relief sunken \ + -width 80 -height 10 \ + -font font_diff \ + -yscrollcommand [list $w.m.sby set] + label $w.m.l2 \ - -text {You must correct the above errors before committing.} \ ++ -text [mc "You must correct the above errors before committing."] \ + -anchor w \ + -justify left \ + -font font_uibold + scrollbar $w.m.sby -command [list $w.m.t yview] + pack $w.m.l1 -side top -fill x + pack $w.m.l2 -side bottom -fill x + pack $w.m.sby -side right -fill y + pack $w.m.t -side left -fill both -expand 1 + pack $w.m -side top -fill both -expand 1 -padx 5 -pady 10 + + $w.m.t insert 1.0 $msg + $w.m.t conf -state disabled + + button $w.ok -text OK \ + -width 15 \ + -command "destroy $w" + pack $w.ok -side bottom -anchor e -pady 10 -padx 10 + + bind $w "grab $w; focus $w" + bind $w "destroy $w" - wm title $w "[appname] ([reponame]): error" ++ wm title $w [append "[appname] ([reponame]): " [mc "error"]] + tkwait window $w +} diff --cc git-gui/lib/git-gui.ico index 000000000,000000000..563dd6623 new file mode 100644 Binary files differ diff --cc git-gui/lib/index.tcl index 44689ab63,000000000..a0b22f294 mode 100644,000000..100644 --- a/git-gui/lib/index.tcl +++ b/git-gui/lib/index.tcl @@@ -1,415 -1,0 +1,435 @@@ +# git-gui index (add/remove) support +# Copyright (C) 2006, 2007 Shawn Pearce + ++proc _delete_indexlock {} { ++ if {[catch {file delete -- [gitdir index.lock]} err]} { ++ error_popup [strcat [mc "Unable to unlock the index."] "\n\n$err"] ++ } ++} ++ ++proc _close_updateindex {fd after} { ++ fconfigure $fd -blocking 1 ++ if {[catch {close $fd} err]} { ++ set w .indexfried ++ toplevel $w ++ wm title $w [strcat "[appname] ([reponame]): " [mc "Index Error"]] ++ wm geometry $w "+[winfo rootx .]+[winfo rooty .]" ++ pack [label $w.msg \ ++ -justify left \ ++ -anchor w \ ++ -text [strcat \ ++ [mc "Updating the Git index failed. A rescan will be automatically started to resynchronize git-gui."] \ ++ "\n\n$err"] \ ++ ] -anchor w ++ ++ frame $w.buttons ++ button $w.buttons.continue \ ++ -text [mc "Continue"] \ ++ -command [list destroy $w] ++ pack $w.buttons.continue -side right -padx 5 ++ button $w.buttons.unlock \ ++ -text [mc "Unlock Index"] \ ++ -command "destroy $w; _delete_indexlock" ++ pack $w.buttons.unlock -side right ++ pack $w.buttons -side bottom -fill x -pady 10 -padx 10 ++ ++ wm protocol $w WM_DELETE_WINDOW update ++ bind $w.buttons.continue " ++ grab $w ++ focus $w.buttons.continue ++ " ++ tkwait window $w ++ ++ $::main_status stop ++ unlock_index ++ rescan $after 0 ++ return ++ } ++ ++ $::main_status stop ++ unlock_index ++ uplevel #0 $after ++} ++ +proc update_indexinfo {msg pathList after} { + global update_index_cp + + if {![lock_index update]} return + + set update_index_cp 0 + set pathList [lsort $pathList] + set totalCnt [llength $pathList] + set batch [expr {int($totalCnt * .01) + 1}] + if {$batch > 25} {set batch 25} + - ui_status [format \ - "%s... %i/%i files (%.2f%%)" \ - $msg \ - $update_index_cp \ - $totalCnt \ - 0.0] ++ $::main_status start $msg [mc "files"] + set fd [git_write update-index -z --index-info] + fconfigure $fd \ + -blocking 0 \ + -buffering full \ + -buffersize 512 \ + -encoding binary \ + -translation binary + fileevent $fd writable [list \ + write_update_indexinfo \ + $fd \ + $pathList \ + $totalCnt \ + $batch \ - $msg \ + $after \ + ] +} + - proc write_update_indexinfo {fd pathList totalCnt batch msg after} { ++proc write_update_indexinfo {fd pathList totalCnt batch after} { + global update_index_cp + global file_states current_diff_path + + if {$update_index_cp >= $totalCnt} { - close $fd - unlock_index - uplevel #0 $after ++ _close_updateindex $fd $after + return + } + + for {set i $batch} \ + {$update_index_cp < $totalCnt && $i > 0} \ + {incr i -1} { + set path [lindex $pathList $update_index_cp] + incr update_index_cp + + set s $file_states($path) + switch -glob -- [lindex $s 0] { + A? {set new _O} + M? {set new _M} + D_ {set new _D} + D? {set new _?} + ?? {continue} + } + set info [lindex $s 2] + if {$info eq {}} continue + + puts -nonewline $fd "$info\t[encoding convertto $path]\0" + display_file $path $new + } + - ui_status [format \ - "%s... %i/%i files (%.2f%%)" \ - $msg \ - $update_index_cp \ - $totalCnt \ - [expr {100.0 * $update_index_cp / $totalCnt}]] ++ $::main_status update $update_index_cp $totalCnt +} + +proc update_index {msg pathList after} { + global update_index_cp + + if {![lock_index update]} return + + set update_index_cp 0 + set pathList [lsort $pathList] + set totalCnt [llength $pathList] + set batch [expr {int($totalCnt * .01) + 1}] + if {$batch > 25} {set batch 25} + - ui_status [format \ - "%s... %i/%i files (%.2f%%)" \ - $msg \ - $update_index_cp \ - $totalCnt \ - 0.0] ++ $::main_status start $msg [mc "files"] + set fd [git_write update-index --add --remove -z --stdin] + fconfigure $fd \ + -blocking 0 \ + -buffering full \ + -buffersize 512 \ + -encoding binary \ + -translation binary + fileevent $fd writable [list \ + write_update_index \ + $fd \ + $pathList \ + $totalCnt \ + $batch \ - $msg \ + $after \ + ] +} + - proc write_update_index {fd pathList totalCnt batch msg after} { ++proc write_update_index {fd pathList totalCnt batch after} { + global update_index_cp + global file_states current_diff_path + + if {$update_index_cp >= $totalCnt} { - close $fd - unlock_index - uplevel #0 $after ++ _close_updateindex $fd $after + return + } + + for {set i $batch} \ + {$update_index_cp < $totalCnt && $i > 0} \ + {incr i -1} { + set path [lindex $pathList $update_index_cp] + incr update_index_cp + + switch -glob -- [lindex $file_states($path) 0] { + AD {set new __} + ?D {set new D_} + _O - + AM {set new A_} + U? { + if {[file exists $path]} { + set new M_ + } else { + set new D_ + } + } + ?M {set new M_} + ?? {continue} + } + puts -nonewline $fd "[encoding convertto $path]\0" + display_file $path $new + } + - ui_status [format \ - "%s... %i/%i files (%.2f%%)" \ - $msg \ - $update_index_cp \ - $totalCnt \ - [expr {100.0 * $update_index_cp / $totalCnt}]] ++ $::main_status update $update_index_cp $totalCnt +} + +proc checkout_index {msg pathList after} { + global update_index_cp + + if {![lock_index update]} return + + set update_index_cp 0 + set pathList [lsort $pathList] + set totalCnt [llength $pathList] + set batch [expr {int($totalCnt * .01) + 1}] + if {$batch > 25} {set batch 25} + - ui_status [format \ - "%s... %i/%i files (%.2f%%)" \ - $msg \ - $update_index_cp \ - $totalCnt \ - 0.0] ++ $::main_status start $msg [mc "files"] + set fd [git_write checkout-index \ + --index \ + --quiet \ + --force \ + -z \ + --stdin \ + ] + fconfigure $fd \ + -blocking 0 \ + -buffering full \ + -buffersize 512 \ + -encoding binary \ + -translation binary + fileevent $fd writable [list \ + write_checkout_index \ + $fd \ + $pathList \ + $totalCnt \ + $batch \ - $msg \ + $after \ + ] +} + - proc write_checkout_index {fd pathList totalCnt batch msg after} { ++proc write_checkout_index {fd pathList totalCnt batch after} { + global update_index_cp + global file_states current_diff_path + + if {$update_index_cp >= $totalCnt} { - close $fd - unlock_index - uplevel #0 $after ++ _close_updateindex $fd $after + return + } + + for {set i $batch} \ + {$update_index_cp < $totalCnt && $i > 0} \ + {incr i -1} { + set path [lindex $pathList $update_index_cp] + incr update_index_cp + switch -glob -- [lindex $file_states($path) 0] { + U? {continue} + ?M - + ?D { + puts -nonewline $fd "[encoding convertto $path]\0" + display_file $path ?_ + } + } + } + - ui_status [format \ - "%s... %i/%i files (%.2f%%)" \ - $msg \ - $update_index_cp \ - $totalCnt \ - [expr {100.0 * $update_index_cp / $totalCnt}]] ++ $::main_status update $update_index_cp $totalCnt +} + +proc unstage_helper {txt paths} { + global file_states current_diff_path + + if {![lock_index begin-update]} return + + set pathList [list] + set after {} + foreach path $paths { + switch -glob -- [lindex $file_states($path) 0] { + A? - + M? - + D? { + lappend pathList $path + if {$path eq $current_diff_path} { + set after {reshow_diff;} + } + } + } + } + if {$pathList eq {}} { + unlock_index + } else { + update_indexinfo \ + $txt \ + $pathList \ + [concat $after [list ui_ready]] + } +} + +proc do_unstage_selection {} { + global current_diff_path selected_paths + + if {[array size selected_paths] > 0} { + unstage_helper \ + {Unstaging selected files from commit} \ + [array names selected_paths] + } elseif {$current_diff_path ne {}} { + unstage_helper \ - "Unstaging [short_path $current_diff_path] from commit" \ ++ [mc "Unstaging %s from commit" [short_path $current_diff_path]] \ + [list $current_diff_path] + } +} + +proc add_helper {txt paths} { + global file_states current_diff_path + + if {![lock_index begin-update]} return + + set pathList [list] + set after {} + foreach path $paths { + switch -glob -- [lindex $file_states($path) 0] { + _O - + ?M - + ?D - + U? { + lappend pathList $path + if {$path eq $current_diff_path} { + set after {reshow_diff;} + } + } + } + } + if {$pathList eq {}} { + unlock_index + } else { + update_index \ + $txt \ + $pathList \ + [concat $after {ui_status {Ready to commit.}}] + } +} + +proc do_add_selection {} { + global current_diff_path selected_paths + + if {[array size selected_paths] > 0} { + add_helper \ + {Adding selected files} \ + [array names selected_paths] + } elseif {$current_diff_path ne {}} { + add_helper \ - "Adding [short_path $current_diff_path]" \ ++ [mc "Adding %s" [short_path $current_diff_path]] \ + [list $current_diff_path] + } +} + +proc do_add_all {} { + global file_states + + set paths [list] + foreach path [array names file_states] { + switch -glob -- [lindex $file_states($path) 0] { + U? {continue} + ?M - + ?D {lappend paths $path} + } + } + add_helper {Adding all changed files} $paths +} + +proc revert_helper {txt paths} { + global file_states current_diff_path + + if {![lock_index begin-update]} return + + set pathList [list] + set after {} + foreach path $paths { + switch -glob -- [lindex $file_states($path) 0] { + U? {continue} + ?M - + ?D { + lappend pathList $path + if {$path eq $current_diff_path} { + set after {reshow_diff;} + } + } + } + } + ++ ++ # Split question between singular and plural cases, because ++ # such distinction is needed in some languages. Previously, the ++ # code used "Revert changes in" for both, but that can't work ++ # in languages where 'in' must be combined with word from ++ # rest of string (in diffrent way for both cases of course). ++ # ++ # FIXME: Unfortunately, even that isn't enough in some languages ++ # as they have quite complex plural-form rules. Unfortunately, ++ # msgcat doesn't seem to support that kind of string translation. ++ # + set n [llength $pathList] + if {$n == 0} { + unlock_index + return + } elseif {$n == 1} { - set s "[short_path [lindex $pathList]]" ++ set query [mc "Revert changes in file %s?" [short_path [lindex $pathList]]] + } else { - set s "these $n files" ++ set query [mc "Revert changes in these %i files?" $n] + } + + set reply [tk_dialog \ + .confirm_revert \ + "[appname] ([reponame])" \ - "Revert changes in $s? - - Any unstaged changes will be permanently lost by the revert." \ ++ [mc "Any unstaged changes will be permanently lost by the revert."] \ + question \ + 1 \ - {Do Nothing} \ - {Revert Changes} \ ++ [mc "Do Nothing"] \ ++ [mc "Revert Changes"] \ + ] + if {$reply == 1} { + checkout_index \ + $txt \ + $pathList \ + [concat $after [list ui_ready]] + } else { + unlock_index + } +} + +proc do_revert_selection {} { + global current_diff_path selected_paths + + if {[array size selected_paths] > 0} { + revert_helper \ + {Reverting selected files} \ + [array names selected_paths] + } elseif {$current_diff_path ne {}} { + revert_helper \ + "Reverting [short_path $current_diff_path]" \ + [list $current_diff_path] + } +} + +proc do_select_commit_type {} { + global commit_type selected_commit_type + + if {$selected_commit_type eq {new} + && [string match amend* $commit_type]} { + create_new_commit + } elseif {$selected_commit_type eq {amend} + && ![string match amend* $commit_type]} { + load_last_commit + + # The amend request was rejected... + # + if {![string match amend* $commit_type]} { + set selected_commit_type new + } + } +} diff --cc git-gui/lib/logo.tcl index 000000000,000000000..5ff76692f new file mode 100644 --- /dev/null +++ b/git-gui/lib/logo.tcl @@@ -1,0 -1,0 +1,43 @@@ ++# git-gui Git Gui logo ++# Copyright (C) 2007 Shawn Pearce ++ ++# Henrik Nyh's alternative Git logo, from his blog post ++# http://henrik.nyh.se/2007/06/alternative-git-logo-and-favicon ++# ++image create photo ::git_logo_data -data { ++R0lGODdhYQC8AIQbAGZmZtg4LW9vb3l5eYKCgoyMjEC/TOJpYZWVlZ+fn2/PeKmpqbKysry8vMXF ++xZ/fpc/Pz7fnvPXNytnZ2eLi4s/v0vja1+zs7Of36fX19f3z8v///////////////////ywAAAAA ++YQC8AAAF/uAmjmRpnmiqrmzrvq4hz3RtGw+s7zx5/7dcb0hUAY8zYXHJRCKVzGjPeYRKry8q0Irt ++GrVBr3gFDo/PprKNix6ra+y2902Ly7H05L2dl9n3UX04gGeCf4RFhohiiotdjY5XkJGBfYeUOpOY ++iZablXmXURgPpKWmp6ipqYIKqq6vqREjFYK1trUKs7e7vFq5IrS9wsM0vxvBxMm8xsjKzqy6z9J5 ++zNPWatXX2k7Z29433d/iMuHj3+Xm2+jp1+vs0+7vz/HyyvT1xPf4wvr7y9H+pBkbBasgLFYGE8ba ++o8nTlE4OOYGKKJFOKIopGmLMAnHjDo0eWYAM+WUiSRgj/k+eSKmyBMuWI17C3CATZs2WN1XmPLmT ++ZM+QPz0G3VihqNGjSJNWwDCzqdOnUKPu0SChqtWrWLNq3cq1q9evYCVYGCEhgNmzaNOqXcu2rdu3 ++cOMGOEBWrt27ePPCpSuirN6/gAO35bvBr+DDiPMSNpy4sWO2ix9Lnmw2MuXLiS1j3gxYM+fPdz2D ++Hv1WNOnTak2jXj23LuvXlV3DZq16Nujatjnjzo15N2/Kvn9LDi7cMfHimaUqX868ufPn0KPPpOCA ++AQMWCQBo3869u/fv4MNrd3DlQoMC3QlkSJFdvPv38LVDWJLBAYHwE1LE38+/+/UhGTAggHv5odDf ++gfv9/seDgPAVeAKCELqnIAwU3BefgyZEqOF3E7rAQH8YlrDhiNt1uEIG6IGoH4kjmpjCBRaqaCCL ++G7p4AgUDIhgiCTTW2AKOEe44Qo8a2khCBgNoKKQIREZopAgZxAjhkhs0CeGTG7Sn5IpW9vekAyRS ++2eWBRl6Q44ZijhlfAQlQmeKIaarpHZsMTHABCxDQGKec3JH3QpIs7snndn6yAKaeXA7aZwuABppo ++fAws0GiEhaKQJ40F3DkjfwVC8CaCAlCgAgIkJjDfCgdiOMGn/Q2w3gkZtPgqC6ma0ECECaBwa4QE ++aOpCrSYAqeMJpEKYqw7ABnsmfwQ8aCwPySqLYKUb/kwAYbPQyoiCtQcOUMKHBwrgK7LaogBuuaxC ++OkS0KEwa37EiLBufALPuwO4Jh/InwAixkknEvSe4C9+p3PY3rr3lpnDufguIcCmzRQAc7IHYLhxf ++w/8mnILA74lg8cARa4xCsZxusMCBomZccgsfv0deuh2HvLKh/sLs3hJSvieuCwUzvIHN4tGXc3ih ++vtDzmj8fSNLR8BWQdH9LH+g00OFF3d/UBx4cUcvuOc21eFRiouV+Xvvr0dDvlX21R/2uzTR89TqU ++L3+5UoBgAxtRHd5/CHpLkd13i4D2e3hHRLKMY+9Hr0Nvx/fq3Pw57cng7/m9wQVObnIyhAiQwHF8 ++/tQS8nDgI2wOYeh3CAvhuIBHiDEgqvdtwudkaz3GBPKaTcKuGgqAJRMZmK6h1hnk3ncDcUvhgPFS ++o5B476ZKQcECzCN4qgmYN4lAncmzcAEEkhJp+QlfkyhAAdtbN8H67FvHQAF6b4g6v9UryqfkKkBu ++v/0prxD//kR63YnqB8AeqcdoBRxU/1zAuwRaaX4reJ4DSSRAHUhwgrgqwgUx2B94EWGDHISPBzUY ++QgSNcAn6K6F4fscDCtBOhdoRwPW6kIHDwZA7vWoDBF44Qd/tIUAEBCACbIeG4AXxfmFrQ4B4OCYE ++JBEQELChmgbAACJioj4JOCKCCLCABZ6EAg1IHwDlyLYAB1gRJhSYgHUQAD9WnQ9+CWBAA+wknTpC ++JwQAOw== ++} ++ ++proc git_logo {w} { ++ label $w \ ++ -borderwidth 1 \ ++ -relief sunken \ ++ -background white \ ++ -image ::git_logo_data ++ return $w ++} diff --cc git-gui/lib/merge.tcl index 0e50919d4,000000000..63e14279c mode 100644,000000..100644 --- a/git-gui/lib/merge.tcl +++ b/git-gui/lib/merge.tcl @@@ -1,274 -1,0 +1,274 @@@ +# git-gui branch merge support +# Copyright (C) 2006, 2007 Shawn Pearce + +class merge { + +field w ; # top level window +field w_rev ; # mega-widget to pick the revision to merge + +method _can_merge {} { + global HEAD commit_type file_states + + if {[string match amend* $commit_type]} { - info_popup {Cannot merge while amending. ++ info_popup [mc "Cannot merge while amending. + +You must finish amending this commit before starting any type of merge. - } ++"] + return 0 + } + + if {[committer_ident] eq {}} {return 0} + if {![lock_index merge]} {return 0} + + # -- Our in memory state should match the repository. + # + repository_state curType curHEAD curMERGE_HEAD + if {$commit_type ne $curType || $HEAD ne $curHEAD} { - info_popup {Last scanned state does not match repository state. ++ info_popup [mc "Last scanned state does not match repository state. + +Another Git program has modified this repository since the last scan. A rescan must be performed before a merge can be performed. + +The rescan will be automatically started now. - } ++"] + unlock_index + rescan ui_ready + return 0 + } + + foreach path [array names file_states] { + switch -glob -- [lindex $file_states($path) 0] { + _O { + continue; # and pray it works! + } + U? { - error_popup "You are in the middle of a conflicted merge. ++ error_popup [mc "You are in the middle of a conflicted merge. + - File [short_path $path] has merge conflicts. ++File %s has merge conflicts. + +You must resolve them, stage the file, and commit to complete the current merge. Only then can you begin another merge. - " ++" [short_path $path]] + unlock_index + return 0 + } + ?? { - error_popup "You are in the middle of a change. ++ error_popup [mc "You are in the middle of a change. + - File [short_path $path] is modified. ++File %s is modified. + +You should complete the current commit before starting a merge. Doing so will help you abort a failed merge, should the need arise. - " ++" [short_path $path]] + unlock_index + return 0 + } + } + } + + return 1 +} + +method _rev {} { + if {[catch {$w_rev commit_or_die}]} { + return {} + } + return [$w_rev get] +} + +method _visualize {} { + set rev [_rev $this] + if {$rev ne {}} { + do_gitk [list $rev --not HEAD] + } +} + +method _start {} { + global HEAD current_branch remote_url + + set name [_rev $this] + if {$name eq {}} { + return + } + + set spec [$w_rev get_tracking_branch] + set cmit [$w_rev get_commit] + + set fh [open [gitdir FETCH_HEAD] w] + fconfigure $fh -translation lf + if {$spec eq {}} { + set remote . + set branch $name + set stitle $branch + } else { + set remote $remote_url([lindex $spec 1]) + if {[regexp {^[^:@]*@[^:]*:/} $remote]} { + regsub {^[^:@]*@} $remote {} remote + } + set branch [lindex $spec 2] - set stitle "$branch of $remote" ++ set stitle [mc "%s of %s" $branch $remote] + } + regsub ^refs/heads/ $branch {} branch + puts $fh "$cmit\t\tbranch '$branch' of $remote" + close $fh + + set cmd [list git] + lappend cmd merge + lappend cmd --strategy=recursive + lappend cmd [git fmt-merge-msg <[gitdir FETCH_HEAD]] + lappend cmd HEAD + lappend cmd $name + - set msg "Merging $current_branch and $stitle" ++ set msg [mc "Merging %s and %s" $current_branch $stitle] + ui_status "$msg..." - set cons [console::new "Merge" "merge $stitle"] ++ set cons [console::new [mc "Merge"] "merge $stitle"] + console::exec $cons $cmd [cb _finish $cons] + + wm protocol $w WM_DELETE_WINDOW {} + destroy $w +} + +method _finish {cons ok} { + console::done $cons $ok + if {$ok} { - set msg {Merge completed successfully.} ++ set msg [mc "Merge completed successfully."] + } else { - set msg {Merge failed. Conflict resolution is required.} ++ set msg [mc "Merge failed. Conflict resolution is required."] + } + unlock_index + rescan [list ui_status $msg] + delete_this +} + +constructor dialog {} { + global current_branch + global M1B + + if {![_can_merge $this]} { + delete_this + return + } + + make_toplevel top w - wm title $top "[appname] ([reponame]): Merge" ++ wm title $top [append "[appname] ([reponame]): " [mc "Merge"]] + if {$top ne {.}} { + wm geometry $top "+[winfo rootx .]+[winfo rooty .]" + } + + set _start [cb _start] + + label $w.header \ - -text "Merge Into $current_branch" \ ++ -text [mc "Merge Into %s" $current_branch] \ + -font font_uibold + pack $w.header -side top -fill x + + frame $w.buttons + button $w.buttons.visualize \ - -text Visualize \ ++ -text [mc Visualize] \ + -command [cb _visualize] + pack $w.buttons.visualize -side left + button $w.buttons.merge \ - -text Merge \ ++ -text [mc Merge] \ + -command $_start + pack $w.buttons.merge -side right + button $w.buttons.cancel \ - -text {Cancel} \ ++ -text [mc "Cancel"] \ + -command [cb _cancel] + pack $w.buttons.cancel -side right -padx 5 + pack $w.buttons -side bottom -fill x -pady 10 -padx 10 + - set w_rev [::choose_rev::new_unmerged $w.rev {Revision To Merge}] ++ set w_rev [::choose_rev::new_unmerged $w.rev [mc "Revision To Merge"]] + pack $w.rev -anchor nw -fill both -expand 1 -pady 5 -padx 5 + + bind $w <$M1B-Key-Return> $_start + bind $w $_start + bind $w [cb _cancel] + wm protocol $w WM_DELETE_WINDOW [cb _cancel] + + bind $w.buttons.merge [cb _visible] + tkwait window $w +} + +method _visible {} { + grab $w + if {[is_config_true gui.matchtrackingbranch]} { + $w_rev pick_tracking_branch + } + $w_rev focus_filter +} + +method _cancel {} { + wm protocol $w WM_DELETE_WINDOW {} + unlock_index + destroy $w + delete_this +} + +} + +namespace eval merge { + +proc reset_hard {} { + global HEAD commit_type file_states + + if {[string match amend* $commit_type]} { - info_popup {Cannot abort while amending. ++ info_popup [mc "Cannot abort while amending. + +You must finish amending this commit. - } ++"] + return + } + + if {![lock_index abort]} return + + if {[string match *merge* $commit_type]} { - set op_question "Abort merge? ++ set op_question [mc "Abort merge? + +Aborting the current merge will cause *ALL* uncommitted changes to be lost. + - Continue with aborting the current merge?" ++Continue with aborting the current merge?"] + } else { - set op_question "Reset changes? ++ set op_question [mc "Reset changes? + +Resetting the changes will cause *ALL* uncommitted changes to be lost. + - Continue with resetting the current changes?" ++Continue with resetting the current changes?"] + } + + if {[ask_popup $op_question] eq {yes}} { + set fd [git_read --stderr read-tree --reset -u -v HEAD] + fconfigure $fd -blocking 0 -translation binary + fileevent $fd readable [namespace code [list _reset_wait $fd]] - $::main_status start {Aborting} {files reset} ++ $::main_status start [mc "Aborting"] {files reset} + } else { + unlock_index + } +} + +proc _reset_wait {fd} { + global ui_comm + + $::main_status update_meter [read $fd] + + fconfigure $fd -blocking 1 + if {[eof $fd]} { + set fail [catch {close $fd} err] + $::main_status stop + unlock_index + + $ui_comm delete 0.0 end + $ui_comm edit modified false + + catch {file delete [gitdir MERGE_HEAD]} + catch {file delete [gitdir rr-cache MERGE_RR]} + catch {file delete [gitdir SQUASH_MSG]} + catch {file delete [gitdir MERGE_MSG]} + catch {file delete [gitdir GITGUI_MSG]} + + if {$fail} { - warn_popup "Abort failed.\n\n$err" ++ warn_popup "[mc "Abort failed."]\n\n$err" + } - rescan {ui_status {Abort completed. Ready.}} ++ rescan {ui_status [mc "Abort completed. Ready."]} + } else { + fconfigure $fd -blocking 0 + } +} + +} diff --cc git-gui/lib/option.tcl index 063f5df6f,000000000..f812e5e89 mode 100644,000000..100644 --- a/git-gui/lib/option.tcl +++ b/git-gui/lib/option.tcl @@@ -1,316 -1,0 +1,239 @@@ +# git-gui options editor +# Copyright (C) 2006, 2007 Shawn Pearce + +proc save_config {} { + global default_config font_descs + global repo_config global_config + global repo_config_new global_config_new + + 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 $default_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 + } + } +} + - proc do_about {} { - global appvers copyright oguilib - global tcl_patchLevel tk_patchLevel - - set w .about_dialog - toplevel $w - wm geometry $w "+[winfo rootx .]+[winfo rooty .]" - - label $w.header -text "About [appname]" \ - -font font_uibold - pack $w.header -side top -fill x - - frame $w.buttons - button $w.buttons.close -text {Close} \ - -default active \ - -command [list destroy $w] - pack $w.buttons.close -side right - pack $w.buttons -side bottom -fill x -pady 10 -padx 10 - - label $w.desc \ - -text "git-gui - a graphical user interface for Git. - $copyright" \ - -padx 5 -pady 5 \ - -justify left \ - -anchor w \ - -borderwidth 1 \ - -relief solid - pack $w.desc -side top -fill x -padx 5 -pady 5 - - set v {} - append v "git-gui version $appvers\n" - append v "[git version]\n" - append v "\n" - if {$tcl_patchLevel eq $tk_patchLevel} { - append v "Tcl/Tk version $tcl_patchLevel" - } else { - append v "Tcl version $tcl_patchLevel" - append v ", Tk version $tk_patchLevel" - } - - set d {} - append d "git wrapper: $::_git\n" - append d "git exec dir: [gitexec]\n" - append d "git-gui lib: $oguilib" - - label $w.vers \ - -text $v \ - -padx 5 -pady 5 \ - -justify left \ - -anchor w \ - -borderwidth 1 \ - -relief solid - pack $w.vers -side top -fill x -padx 5 -pady 5 - - label $w.dirs \ - -text $d \ - -padx 5 -pady 5 \ - -justify left \ - -anchor w \ - -borderwidth 1 \ - -relief solid - pack $w.dirs -side top -fill x -padx 5 -pady 5 - - menu $w.ctxm -tearoff 0 - $w.ctxm add command \ - -label {Copy} \ - -command " - clipboard clear - clipboard append -format STRING -type STRING -- \[$w.vers cget -text\] - " - - bind $w "grab $w; focus $w.buttons.close" - bind $w "destroy $w" - bind $w "destroy $w" - bind_button3 $w.vers "tk_popup $w.ctxm %X %Y; grab $w; focus $w" - wm title $w "About [appname]" - tkwait window $w - } - +proc do_options {} { + global repo_config global_config font_descs + global repo_config_new global_config_new + + 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 + toplevel $w + wm geometry $w "+[winfo rootx .]+[winfo rooty .]" + - label $w.header -text "Options" \ - -font font_uibold - pack $w.header -side top -fill x - + frame $w.buttons - button $w.buttons.restore -text {Restore Defaults} \ ++ button $w.buttons.restore -text [mc "Restore Defaults"] \ + -default normal \ + -command do_restore_defaults + pack $w.buttons.restore -side left - button $w.buttons.save -text Save \ ++ button $w.buttons.save -text [mc Save] \ + -default active \ + -command [list do_save_config $w] + pack $w.buttons.save -side right - button $w.buttons.cancel -text {Cancel} \ ++ 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 + - labelframe $w.repo -text "[reponame] Repository" - labelframe $w.global -text {Global (All Repositories)} ++ labelframe $w.repo -text [mc "%s Repository" [reponame]] ++ 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 {User Name}} - {t user.email {Email Address}} - - {b merge.summary {Summarize Merge Commits}} - {i-1..5 merge.verbosity {Merge Verbosity}} - {b merge.diffstat {Show Diffstat After Merge}} - - {b gui.trustmtime {Trust File Modification Timestamps}} - {b gui.pruneduringfetch {Prune Tracking Branches During Fetch}} - {b gui.matchtrackingbranch {Match Tracking Branches}} - {i-0..99 gui.diffcontext {Number of Diff Context Lines}} - {t gui.newbranchtemplate {New Branch Name Template}} ++ {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"}} ++ ++ {b gui.trustmtime {mc "Trust File Modification Timestamps"}} ++ {b gui.pruneduringfetch {mc "Prune Tracking Branches During Fetch"}} ++ {b gui.matchtrackingbranch {mc "Match Tracking Branches"}} ++ {i-0..99 gui.diffcontext {mc "Number of Diff Context Lines"}} ++ {t gui.newbranchtemplate {mc "New Branch Name Template"}} + } { + set type [lindex $option 0] + set name [lindex $option 1] - set text [lindex $option 2] ++ set text [eval [lindex $option 2]] + incr optid + foreach f {repo global} { + switch -glob -- $type { + b { + 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 + frame $w.$f.$optid + label $w.$f.$optid.l -text "$text:" + pack $w.$f.$optid.l -side left -anchor w -fill x + spinbox $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 + } + t { + frame $w.$f.$optid + label $w.$f.$optid.l -text "$text:" + entry $w.$f.$optid.v \ + -borderwidth 1 \ + -relief sunken \ + -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 + pack $w.$f.$optid -side top -anchor w -fill x + } + } + } + } + + set all_fonts [lsort [font families]] + foreach option $font_descs { + set name [lindex $option 0] + set font [lindex $option 1] - set text [lindex $option 2] ++ 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] + + frame $w.global.$name + label $w.global.$name.l -text "$text:" + button $w.global.$name.b \ + -text [mc "Change Font"] \ + -command [list \ + choose_font::pick \ + $w \ + [mc "Choose %s" $text] \ + global_config_new(gui.$font^^family) \ + global_config_new(gui.$font^^size) \ + ] + label $w.global.$name.f -textvariable global_config_new(gui.$font^^family) + label $w.global.$name.s -textvariable global_config_new(gui.$font^^size) + 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] - wm title $w "[appname] ([reponame]): Options" ++ ++ if {[is_MacOSX]} { ++ set t [mc "Preferences"] ++ } else { ++ set t [mc "Options"] ++ } ++ wm title $w "[appname] ([reponame]): $t" + tkwait window $w +} + +proc do_restore_defaults {} { + global font_descs default_config repo_config + global repo_config_new global_config_new + + foreach name [array names default_config] { + set repo_config_new($name) $default_config($name) + set global_config_new($name) $default_config($name) + } + + foreach option $font_descs { + set name [lindex $option 0] + set repo_config(gui.$name) $default_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 {[catch {save_config} err]} { - error_popup "Failed to completely save options:\n\n$err" ++ error_popup [strcat [mc "Failed to completely save options:"] "\n\n$err"] + } + reshow_diff + destroy $w +} diff --cc git-gui/lib/remote.tcl index cf9b9d582,000000000..0e86ddac0 mode 100644,000000..100644 --- a/git-gui/lib/remote.tcl +++ b/git-gui/lib/remote.tcl @@@ -1,211 -1,0 +1,222 @@@ +# git-gui remote management +# Copyright (C) 2006, 2007 Shawn Pearce + +set some_heads_tracking 0; # assume not + +proc is_tracking_branch {name} { + global tracking_branches + foreach spec $tracking_branches { + set t [lindex $spec 0] + if {$t eq $name || [string match $t $name]} { + return 1 + } + } + return 0 +} + +proc all_tracking_branches {} { + global tracking_branches + + set all [list] + set pat [list] + set cmd [list] + + foreach spec $tracking_branches { + set dst [lindex $spec 0] + if {[string range $dst end-1 end] eq {/*}} { + lappend pat $spec + lappend cmd [string range $dst 0 end-2] + } else { + lappend all $spec + } + } + + if {$pat ne {}} { + set fd [eval git_read for-each-ref --format=%(refname) $cmd] + while {[gets $fd n] > 0} { + foreach spec $pat { + set dst [string range [lindex $spec 0] 0 end-2] + set len [string length $dst] + if {[string equal -length $len $dst $n]} { + set src [string range [lindex $spec 2] 0 end-2] + set spec [list \ + $n \ + [lindex $spec 1] \ + $src[string range $n $len end] \ + ] + lappend all $spec + } + } + } + close $fd + } + + return [lsort -index 0 -unique $all] +} + +proc load_all_remotes {} { + global repo_config + global all_remotes tracking_branches some_heads_tracking + global remote_url + + set some_heads_tracking 0 + set all_remotes [list] + set trck [list] + + set rh_str refs/heads/ + set rh_len [string length $rh_str] + set rm_dir [gitdir remotes] + if {[file isdirectory $rm_dir]} { + set all_remotes [glob \ + -types f \ + -tails \ + -nocomplain \ + -directory $rm_dir *] + + foreach name $all_remotes { + catch { + set fd [open [file join $rm_dir $name] r] + while {[gets $fd line] >= 0} { + if {[regexp {^URL:[ ]*(.+)$} $line line url]} { + set remote_url($name) $url + continue + } + if {![regexp {^Pull:[ ]*([^:]+):(.+)$} \ + $line line src dst]} continue + if {[string index $src 0] eq {+}} { + set src [string range $src 1 end] + } + if {![string equal -length 5 refs/ $src]} { + set src $rh_str$src + } + if {![string equal -length 5 refs/ $dst]} { + set dst $rh_str$dst + } + if {[string equal -length $rh_len $rh_str $dst]} { + set some_heads_tracking 1 + } + lappend trck [list $dst $name $src] + } + close $fd + } + } + } + + foreach line [array names repo_config remote.*.url] { + if {![regexp ^remote\.(.*)\.url\$ $line line name]} continue + lappend all_remotes $name + set remote_url($name) $repo_config(remote.$name.url) + + if {[catch {set fl $repo_config(remote.$name.fetch)}]} { + set fl {} + } + foreach line $fl { + if {![regexp {^([^:]+):(.+)$} $line line src dst]} continue + if {[string index $src 0] eq {+}} { + set src [string range $src 1 end] + } + if {![string equal -length 5 refs/ $src]} { + set src $rh_str$src + } + if {![string equal -length 5 refs/ $dst]} { + set dst $rh_str$dst + } + if {[string equal -length $rh_len $rh_str $dst]} { + set some_heads_tracking 1 + } + lappend trck [list $dst $name $src] + } + } + + set tracking_branches [lsort -index 0 -unique $trck] + set all_remotes [lsort -unique $all_remotes] +} + +proc populate_fetch_menu {} { + global all_remotes repo_config + - set m .mbar.fetch - set prune_list [list] ++ set remote_m .mbar.remote ++ set fetch_m $remote_m.fetch ++ set prune_m $remote_m.prune ++ + foreach r $all_remotes { + set enable 0 + if {![catch {set a $repo_config(remote.$r.url)}]} { + if {![catch {set a $repo_config(remote.$r.fetch)}]} { + set enable 1 + } + } else { + catch { + set fd [open [gitdir remotes $r] r] + while {[gets $fd n] >= 0} { + if {[regexp {^Pull:[ \t]*([^:]+):} $n]} { + set enable 1 + break + } + } + close $fd + } + } + + if {$enable} { - lappend prune_list $r - $m add command \ - -label "Fetch from $r..." \ ++ if {![winfo exists $fetch_m]} { ++ menu $prune_m ++ $remote_m insert 0 cascade \ ++ -label [mc "Prune from"] \ ++ -menu $prune_m ++ ++ menu $fetch_m ++ $remote_m insert 0 cascade \ ++ -label [mc "Fetch from"] \ ++ -menu $fetch_m ++ } ++ ++ $fetch_m add command \ ++ -label $r \ + -command [list fetch_from $r] ++ $prune_m add command \ ++ -label $r \ ++ -command [list prune_from $r] + } + } - - if {$prune_list ne {}} { - $m add separator - } - foreach r $prune_list { - $m add command \ - -label "Prune from $r..." \ - -command [list prune_from $r] - } +} + +proc populate_push_menu {} { + global all_remotes repo_config + - set m .mbar.push - set fast_count 0 ++ set remote_m .mbar.remote ++ set push_m $remote_m.push ++ + foreach r $all_remotes { + set enable 0 + if {![catch {set a $repo_config(remote.$r.url)}]} { + if {![catch {set a $repo_config(remote.$r.push)}]} { + set enable 1 + } + } else { + catch { + set fd [open [gitdir remotes $r] r] + while {[gets $fd n] >= 0} { + if {[regexp {^Push:[ \t]*([^:]+):} $n]} { + set enable 1 + break + } + } + close $fd + } + } + + if {$enable} { - if {!$fast_count} { - $m add separator ++ if {![winfo exists $push_m]} { ++ menu $push_m ++ $remote_m insert 0 cascade \ ++ -label [mc "Push to"] \ ++ -menu $push_m + } - $m add command \ - -label "Push to $r..." \ ++ ++ $push_m add command \ ++ -label $r \ + -command [list push_to $r] - incr fast_count + } + } +} diff --cc git-gui/lib/remote_branch_delete.tcl index c88a360db,000000000..c7b814869 mode 100644,000000..100644 --- a/git-gui/lib/remote_branch_delete.tcl +++ b/git-gui/lib/remote_branch_delete.tcl @@@ -1,347 -1,0 +1,345 @@@ +# git-gui remote branch deleting support +# Copyright (C) 2007 Shawn Pearce + +class remote_branch_delete { + +field w +field head_m + +field urltype {url} +field remote {} +field url {} + +field checktype {head} +field check_head {} + +field status {} +field idle_id {} +field full_list {} +field head_list {} +field active_ls {} +field head_cache +field full_cache +field cached + +constructor dialog {} { + global all_remotes M1B + + make_toplevel top w - wm title $top "[appname] ([reponame]): Delete Remote Branch" ++ wm title $top [append "[appname] ([reponame]): " [mc "Delete Remote Branch"]] + if {$top ne {.}} { + wm geometry $top "+[winfo rootx .]+[winfo rooty .]" + } + - label $w.header -text {Delete Remote Branch} -font font_uibold ++ label $w.header -text [mc "Delete Remote Branch"] -font font_uibold + pack $w.header -side top -fill x + + frame $w.buttons - button $w.buttons.delete -text Delete \ ++ button $w.buttons.delete -text [mc Delete] \ + -default active \ + -command [cb _delete] + pack $w.buttons.delete -side right - button $w.buttons.cancel -text {Cancel} \ ++ button $w.buttons.cancel -text [mc "Cancel"] \ + -command [list destroy $w] + pack $w.buttons.cancel -side right -padx 5 + pack $w.buttons -side bottom -fill x -pady 10 -padx 10 + - labelframe $w.dest -text {From Repository} ++ labelframe $w.dest -text [mc "From Repository"] + if {$all_remotes ne {}} { + radiobutton $w.dest.remote_r \ - -text {Remote:} \ ++ -text [mc "Remote:"] \ + -value remote \ + -variable @urltype + eval tk_optionMenu $w.dest.remote_m @remote $all_remotes + grid $w.dest.remote_r $w.dest.remote_m -sticky w + if {[lsearch -sorted -exact $all_remotes origin] != -1} { + set remote origin + } else { + set remote [lindex $all_remotes 0] + } + set urltype remote + trace add variable @remote write [cb _write_remote] + } else { + set urltype url + } + radiobutton $w.dest.url_r \ - -text {Arbitrary URL:} \ ++ -text [mc "Arbitrary URL:"] \ + -value url \ + -variable @urltype + entry $w.dest.url_t \ + -borderwidth 1 \ + -relief sunken \ + -width 50 \ + -textvariable @url \ + -validate key \ + -validatecommand { + if {%d == 1 && [regexp {\s} %S]} {return 0} + return 1 + } + trace add variable @url write [cb _write_url] + grid $w.dest.url_r $w.dest.url_t -sticky we -padx {0 5} + grid columnconfigure $w.dest 1 -weight 1 + pack $w.dest -anchor nw -fill x -pady 5 -padx 5 + - labelframe $w.heads -text {Branches} ++ labelframe $w.heads -text [mc "Branches"] + listbox $w.heads.l \ + -height 10 \ + -width 70 \ + -listvariable @head_list \ + -selectmode extended \ + -yscrollcommand [list $w.heads.sby set] + scrollbar $w.heads.sby -command [list $w.heads.l yview] + + frame $w.heads.footer + label $w.heads.footer.status \ + -textvariable @status \ + -anchor w \ + -justify left + button $w.heads.footer.rescan \ - -text {Rescan} \ ++ -text [mc "Rescan"] \ + -command [cb _rescan] + pack $w.heads.footer.status -side left -fill x + pack $w.heads.footer.rescan -side right + + pack $w.heads.footer -side bottom -fill x + pack $w.heads.sby -side right -fill y + pack $w.heads.l -side left -fill both -expand 1 + pack $w.heads -fill both -expand 1 -pady 5 -padx 5 + - labelframe $w.validate -text {Delete Only If} ++ labelframe $w.validate -text [mc "Delete Only If"] + radiobutton $w.validate.head_r \ - -text {Merged Into:} \ ++ -text [mc "Merged Into:"] \ + -value head \ + -variable @checktype + set head_m [tk_optionMenu $w.validate.head_m @check_head {}] + trace add variable @head_list write [cb _write_head_list] + trace add variable @check_head write [cb _write_check_head] + grid $w.validate.head_r $w.validate.head_m -sticky w + radiobutton $w.validate.always_r \ - -text {Always (Do not perform merge checks)} \ ++ -text [mc "Always (Do not perform merge checks)"] \ + -value always \ + -variable @checktype + grid $w.validate.always_r -columnspan 2 -sticky w + grid columnconfigure $w.validate 1 -weight 1 + pack $w.validate -anchor nw -fill x -pady 5 -padx 5 + + trace add variable @urltype write [cb _write_urltype] + _rescan $this + + bind $w [cb _rescan] + bind $w <$M1B-Key-r> [cb _rescan] + bind $w <$M1B-Key-R> [cb _rescan] + bind $w [cb _delete] + bind $w [list destroy $w] + return $w +} + +method _delete {} { + switch $urltype { + remote {set uri $remote} + url {set uri $url} + } + + set cache $urltype:$uri + set crev {} + if {$checktype eq {head}} { + if {$check_head eq {}} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ - -message "A branch is required for 'Merged Into'." ++ -message [mc "A branch is required for 'Merged Into'."] + return + } + set crev $full_cache("$cache\nrefs/heads/$check_head") + } + + set not_merged [list] + set need_fetch 0 + set have_selection 0 + set push_cmd [list git push] + lappend push_cmd -v + lappend push_cmd $uri + + foreach i [$w.heads.l curselection] { + set ref [lindex $full_list $i] + if {$crev ne {}} { + set obj $full_cache("$cache\n$ref") + if {[catch {set m [git merge-base $obj $crev]}]} { + set need_fetch 1 + set m {} + } + if {$obj ne $m} { + lappend not_merged [lindex $head_list $i] + continue + } + } + + lappend push_cmd :$ref + set have_selection 1 + } + + if {$not_merged ne {}} { - set msg "The following branches are not completely merged into $check_head: ++ set msg [mc "The following branches are not completely merged into %s: + - - [join $not_merged "\n - "]" ++ - %s" $check_head [join $not_merged "\n - "]] + + if {$need_fetch} { - append msg " - - One or more of the merge tests failed because you have not fetched the necessary commits. Try fetching from $uri first." ++ append msg "\n\n" [mc "One or more of the merge tests failed because you have not fetched the necessary commits. Try fetching from %s first." $uri] + } + + tk_messageBox \ + -icon info \ + -type ok \ + -title [wm title $w] \ + -parent $w \ + -message $msg + if {!$have_selection} return + } + + if {!$have_selection} { + tk_messageBox \ + -icon error \ + -type ok \ + -title [wm title $w] \ + -parent $w \ - -message "Please select one or more branches to delete." ++ -message [mc "Please select one or more branches to delete."] + return + } + + if {[tk_messageBox \ + -icon warning \ + -type yesno \ + -title [wm title $w] \ + -parent $w \ - -message {Recovering deleted branches is difficult. ++ -message [mc "Recovering deleted branches is difficult. + - Delete the selected branches?}] ne yes} { ++Delete the selected branches?"]] ne yes} { + return + } + + destroy $w + + set cons [console::new \ + "push $uri" \ - "Deleting branches from $uri"] ++ [mc "Deleting branches from %s" $uri]] + console::exec $cons $push_cmd +} + +method _rescan {{force 1}} { + switch $urltype { + remote {set uri $remote} + url {set uri $url} + } + + if {$force} { + unset -nocomplain cached($urltype:$uri) + } + + if {$idle_id ne {}} { + after cancel $idle_id + set idle_id {} + } + + _load $this $urltype:$uri $uri +} + +method _write_remote {args} { set urltype remote } +method _write_url {args} { set urltype url } +method _write_check_head {args} { set checktype head } + +method _write_head_list {args} { + $head_m delete 0 end + foreach abr $head_list { + $head_m insert end radiobutton \ + -label $abr \ + -value $abr \ + -variable @check_head + } + if {[lsearch -exact -sorted $head_list $check_head] < 0} { + set check_head {} + } +} + +method _write_urltype {args} { + if {$urltype eq {url}} { + if {$idle_id ne {}} { + after cancel $idle_id + } + _load $this none: {} + set idle_id [after 1000 [cb _rescan 0]] + } else { + _rescan $this 0 + } +} + +method _load {cache uri} { + if {$active_ls ne {}} { + catch {close $active_ls} + } + + if {$uri eq {}} { + $w.heads.l conf -state disabled + set head_list [list] + set full_list [list] - set status {No repository selected.} ++ set status [mc "No repository selected."] + return + } + + if {[catch {set x $cached($cache)}]} { - set status "Scanning $uri..." ++ set status [mc "Scanning %s..." $uri] + $w.heads.l conf -state disabled + set head_list [list] + set full_list [list] + set head_cache($cache) [list] + set full_cache($cache) [list] + set active_ls [git_read ls-remote $uri] + fconfigure $active_ls \ + -blocking 0 \ + -translation lf \ + -encoding utf-8 + fileevent $active_ls readable [cb _read $cache $active_ls] + } else { + set status {} + set full_list $full_cache($cache) + set head_list $head_cache($cache) + $w.heads.l conf -state normal + } +} + +method _read {cache fd} { + if {$fd ne $active_ls} { + catch {close $fd} + return + } + + while {[gets $fd line] >= 0} { + if {[string match {*^{}} $line]} continue + if {[regexp {^([0-9a-f]{40}) (.*)$} $line _junk obj ref]} { + if {[regsub ^refs/heads/ $ref {} abr]} { + lappend head_list $abr + lappend head_cache($cache) $abr + lappend full_list $ref + lappend full_cache($cache) $ref + set full_cache("$cache\n$ref") $obj + } + } + } + + if {[eof $fd]} { + if {[catch {close $fd} err]} { + set status $err + set head_list [list] + set full_list [list] + } else { + set status {} + set cached($cache) 1 + $w.heads.l conf -state normal + } + } +} ifdeleted { + catch {close $fd} +} + +} diff --cc git-gui/lib/shortcut.tcl index c36be2f3c,000000000..38c3151b0 mode 100644,000000..100644 --- a/git-gui/lib/shortcut.tcl +++ b/git-gui/lib/shortcut.tcl @@@ -1,152 -1,0 +1,139 @@@ +# git-gui desktop icon creators +# Copyright (C) 2006, 2007 Shawn Pearce + +proc do_windows_shortcut {} { - global argv0 - + set fn [tk_getSaveFile \ + -parent . \ - -title "[appname] ([reponame]): Create Desktop Icon" \ - -initialfile "Git [reponame].bat"] ++ -title [append "[appname] ([reponame]): " [mc "Create Desktop Icon"]] \ ++ -initialfile "Git [reponame].lnk"] + if {$fn != {}} { - if {[file extension $fn] ne {.bat}} { - set fn ${fn}.bat ++ if {[file extension $fn] ne {.lnk}} { ++ set fn ${fn}.lnk + } + if {[catch { - set ge [file normalize [file dirname $::_git]] - set fd [open $fn w] - puts $fd "@ECHO Entering [reponame]" - puts $fd "@ECHO Starting git-gui... please wait..." - puts $fd "@SET PATH=$ge;%PATH%" - puts $fd "@SET GIT_DIR=[file normalize [gitdir]]" - puts -nonewline $fd "@\"[info nameofexecutable]\"" - puts $fd " \"[file normalize $argv0]\"" - close $fd ++ win32_create_lnk $fn [list \ ++ [info nameofexecutable] \ ++ [file normalize $::argv0] \ ++ ] \ ++ [file dirname [file normalize [gitdir]]] + } err]} { - error_popup "Cannot write script:\n\n$err" ++ error_popup [strcat [mc "Cannot write shortcut:"] "\n\n$err"] + } + } +} + +proc do_cygwin_shortcut {} { + global argv0 + + if {[catch { + set desktop [exec cygpath \ + --windows \ + --absolute \ + --long-name \ + --desktop] + }]} { + set desktop . + } + set fn [tk_getSaveFile \ + -parent . \ - -title "[appname] ([reponame]): Create Desktop Icon" \ ++ -title [append "[appname] ([reponame]): " [mc "Create Desktop Icon"]] \ + -initialdir $desktop \ - -initialfile "Git [reponame].bat"] ++ -initialfile "Git [reponame].lnk"] + if {$fn != {}} { - if {[file extension $fn] ne {.bat}} { - set fn ${fn}.bat ++ if {[file extension $fn] ne {.lnk}} { ++ set fn ${fn}.lnk + } + if {[catch { - set fd [open $fn w] + set sh [exec cygpath \ + --windows \ + --absolute \ + /bin/sh.exe] + set me [exec cygpath \ + --unix \ + --absolute \ + $argv0] - set gd [exec cygpath \ - --unix \ - --absolute \ - [gitdir]] - puts $fd "@ECHO Entering [reponame]" - puts $fd "@ECHO Starting git-gui... please wait..." - puts -nonewline $fd "@\"$sh\" --login -c \"" - puts -nonewline $fd "GIT_DIR=[sq $gd]" - puts -nonewline $fd " [sq $me]" - puts $fd " &\"" - close $fd ++ win32_create_lnk $fn [list \ ++ $sh -c \ ++ "CHERE_INVOKING=1 source /etc/profile;[sq $me]" \ ++ ] \ ++ [file dirname [file normalize [gitdir]]] + } err]} { - error_popup "Cannot write script:\n\n$err" ++ error_popup [strcat [mc "Cannot write shortcut:"] "\n\n$err"] + } + } +} + +proc do_macosx_app {} { + global argv0 env + + set fn [tk_getSaveFile \ + -parent . \ - -title "[appname] ([reponame]): Create Desktop Icon" \ ++ -title [append "[appname] ([reponame]): " [mc "Create Desktop Icon"]] \ + -initialdir [file join $env(HOME) Desktop] \ + -initialfile "Git [reponame].app"] + if {$fn != {}} { + if {[file extension $fn] ne {.app}} { + set fn ${fn}.app + } + if {[catch { + set Contents [file join $fn Contents] + set MacOS [file join $Contents MacOS] + set exe [file join $MacOS git-gui] + + file mkdir $MacOS + + set fd [open [file join $Contents Info.plist] w] + puts $fd { + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + git-gui + CFBundleIdentifier + org.spearce.git-gui + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + NSPrincipalClass + NSApplication + +} + close $fd + + set fd [open $exe w] + puts $fd "#!/bin/sh" + foreach name [lsort [array names env]] { + set value $env($name) + switch -- $name { + GIT_DIR { set value [file normalize [gitdir]] } + } + + switch -glob -- $name { + SSH_* - + GIT_* { + puts $fd "if test \"z\$$name\" = z; then" + puts $fd " export $name=[sq $value]" + puts $fd "fi &&" + } + } + } + puts $fd "export PATH=[sq [file dirname $::_git]]:\$PATH &&" + puts $fd "cd [sq [file normalize [pwd]]] &&" + puts $fd "exec \\" + puts $fd " [sq [info nameofexecutable]] \\" + puts $fd " [sq [file normalize $argv0]]" + close $fd + + file attributes $exe -permissions u+x,g+x,o+x + } err]} { - error_popup "Cannot write icon:\n\n$err" ++ error_popup [strcat [mc "Cannot write icon:"] "\n\n$err"] + } + } +} diff --cc git-gui/lib/status_bar.tcl index 3bf79eb6e,000000000..51d417755 mode 100644,000000..100644 --- a/git-gui/lib/status_bar.tcl +++ b/git-gui/lib/status_bar.tcl @@@ -1,99 -1,0 +1,127 @@@ +# git-gui status bar mega-widget +# Copyright (C) 2007 Shawn Pearce + +class status_bar { + +field w ; # our own window path +field w_l ; # text widget we draw messages into +field w_c ; # canvas we draw a progress bar into ++field c_pack ; # script to pack the canvas with +field status {}; # single line of text we show +field prefix {}; # text we format into status +field units {}; # unit of progress +field meter {}; # current core git progress meter (if active) + +constructor new {path} { + set w $path + set w_l $w.l + set w_c $w.c + + frame $w \ + -borderwidth 1 \ + -relief sunken + label $w_l \ + -textvariable @status \ + -anchor w \ + -justify left + pack $w_l -side left ++ set c_pack [cb _oneline_pack] ++ ++ bind $w [cb _delete %W] ++ return $this ++} ++ ++method _oneline_pack {} { ++ $w_c conf -width 100 ++ pack $w_c -side right ++} ++ ++constructor two_line {path} { ++ set w $path ++ set w_l $w.l ++ set w_c $w.c ++ ++ frame $w ++ label $w_l \ ++ -textvariable @status \ ++ -anchor w \ ++ -justify left ++ pack $w_l -anchor w -fill x ++ set c_pack [list pack $w_c -fill x] + + bind $w [cb _delete %W] + return $this +} + +method start {msg uds} { + if {[winfo exists $w_c]} { + $w_c coords bar 0 0 0 20 + } else { + canvas $w_c \ - -width 100 \ + -height [expr {int([winfo reqheight $w_l] * 0.6)}] \ + -borderwidth 1 \ + -relief groove \ + -highlightt 0 + $w_c create rectangle 0 0 0 20 -tags bar -fill navy - pack $w_c -side right ++ eval $c_pack + } + + set status $msg + set prefix $msg + set units $uds + set meter {} +} + +method update {have total} { + set pdone 0 + if {$total > 0} { + set pdone [expr {100 * $have / $total}] ++ set cdone [expr {[winfo width $w_c] * $have / $total}] + } + - set status [format "%s ... %i of %i %s (%2i%%)" \ - $prefix $have $total $units $pdone] - $w_c coords bar 0 0 $pdone 20 ++ set prec [string length [format %i $total]] ++ set status [mc "%s ... %*i of %*i %s (%3i%%)" \ ++ $prefix \ ++ $prec $have \ ++ $prec $total \ ++ $units $pdone] ++ $w_c coords bar 0 0 $cdone 20 +} + +method update_meter {buf} { + append meter $buf + set r [string last "\r" $meter] + if {$r == -1} { + return + } + + set prior [string range $meter 0 $r] + set meter [string range $meter [expr {$r + 1}] end] + set p "\\((\\d+)/(\\d+)\\)" + if {[regexp ":\\s*\\d+% $p\(?:, done.\\s*\n|\\s*\r)\$" $prior _j a b]} { + update $this $a $b + } elseif {[regexp "$p\\s+done\r\$" $prior _j a b]} { + update $this $a $b + } +} + +method stop {{msg {}}} { + destroy $w_c + if {$msg ne {}} { + set status $msg + } +} + +method show {msg {test {}}} { + if {$test eq {} || $status eq $test} { + set status $msg + } +} + +method _delete {current} { + if {$current eq $w} { + delete_this + } +} + +} diff --cc git-gui/lib/transport.tcl index 3a22bd40d,000000000..8e6a9d0a6 mode 100644,000000..100644 --- a/git-gui/lib/transport.tcl +++ b/git-gui/lib/transport.tcl @@@ -1,174 -1,0 +1,184 @@@ +# git-gui transport (fetch/push) support +# Copyright (C) 2006, 2007 Shawn Pearce + +proc fetch_from {remote} { + set w [console::new \ - "fetch $remote" \ - "Fetching new changes from $remote"] ++ [mc "fetch %s" $remote] \ ++ [mc "Fetching new changes from %s" $remote]] + set cmds [list] + lappend cmds [list exec git fetch $remote] + if {[is_config_true gui.pruneduringfetch]} { + lappend cmds [list exec git remote prune $remote] + } + console::chain $w $cmds +} + +proc prune_from {remote} { + set w [console::new \ - "remote prune $remote" \ - "Pruning tracking branches deleted from $remote"] ++ [mc "remote prune %s" $remote] \ ++ [mc "Pruning tracking branches deleted from %s" $remote]] + console::exec $w [list git remote prune $remote] +} + +proc push_to {remote} { + set w [console::new \ - "push $remote" \ - "Pushing changes to $remote"] ++ [mc "push %s" $remote] \ ++ [mc "Pushing changes to %s" $remote]] + set cmd [list git push] + lappend cmd -v + lappend cmd $remote + console::exec $w $cmd +} + +proc start_push_anywhere_action {w} { + global push_urltype push_remote push_url push_thin push_tags ++ global push_force + + set r_url {} + switch -- $push_urltype { + remote {set r_url $push_remote} + url {set r_url $push_url} + } + if {$r_url eq {}} return + + set cmd [list git push] + lappend cmd -v + if {$push_thin} { + lappend cmd --thin + } ++ if {$push_force} { ++ lappend cmd --force ++ } + if {$push_tags} { + lappend cmd --tags + } + lappend cmd $r_url + set cnt 0 + foreach i [$w.source.l curselection] { + set b [$w.source.l get $i] + lappend cmd "refs/heads/$b:refs/heads/$b" + incr cnt + } + if {$cnt == 0} { + return + } elseif {$cnt == 1} { + set unit branch + } else { + set unit branches + } + + set cons [console::new \ - "push $r_url" \ - "Pushing $cnt $unit to $r_url"] ++ [mc "push %s" $r_url] \ ++ [mc "Pushing %s %s to %s" $cnt $unit $r_url]] + console::exec $cons $cmd + destroy $w +} + +trace add variable push_remote write \ + [list radio_selector push_urltype remote] + +proc do_push_anywhere {} { + global all_remotes current_branch + global push_urltype push_remote push_url push_thin push_tags ++ global push_force + + set w .push_setup + toplevel $w + wm geometry $w "+[winfo rootx .]+[winfo rooty .]" + - label $w.header -text {Push Branches} -font font_uibold ++ label $w.header -text [mc "Push Branches"] -font font_uibold + pack $w.header -side top -fill x + + frame $w.buttons - button $w.buttons.create -text Push \ ++ button $w.buttons.create -text [mc Push] \ + -default active \ + -command [list start_push_anywhere_action $w] + pack $w.buttons.create -side right - button $w.buttons.cancel -text {Cancel} \ ++ 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 + - labelframe $w.source -text {Source Branches} ++ labelframe $w.source -text [mc "Source Branches"] + listbox $w.source.l \ + -height 10 \ + -width 70 \ + -selectmode extended \ + -yscrollcommand [list $w.source.sby set] + foreach h [load_all_heads] { + $w.source.l insert end $h + if {$h eq $current_branch} { + $w.source.l select set end + } + } + scrollbar $w.source.sby -command [list $w.source.l yview] + pack $w.source.sby -side right -fill y + pack $w.source.l -side left -fill both -expand 1 + pack $w.source -fill both -expand 1 -pady 5 -padx 5 + - labelframe $w.dest -text {Destination Repository} ++ labelframe $w.dest -text [mc "Destination Repository"] + if {$all_remotes ne {}} { + radiobutton $w.dest.remote_r \ - -text {Remote:} \ ++ -text [mc "Remote:"] \ + -value remote \ + -variable push_urltype + eval tk_optionMenu $w.dest.remote_m push_remote $all_remotes + grid $w.dest.remote_r $w.dest.remote_m -sticky w + if {[lsearch -sorted -exact $all_remotes origin] != -1} { + set push_remote origin + } else { + set push_remote [lindex $all_remotes 0] + } + set push_urltype remote + } else { + set push_urltype url + } + radiobutton $w.dest.url_r \ - -text {Arbitrary URL:} \ ++ -text [mc "Arbitrary URL:"] \ + -value url \ + -variable push_urltype + entry $w.dest.url_t \ + -borderwidth 1 \ + -relief sunken \ + -width 50 \ + -textvariable push_url \ + -validate key \ + -validatecommand { + if {%d == 1 && [regexp {\s} %S]} {return 0} + if {%d == 1 && [string length %S] > 0} { + set push_urltype url + } + return 1 + } + grid $w.dest.url_r $w.dest.url_t -sticky we -padx {0 5} + grid columnconfigure $w.dest 1 -weight 1 + pack $w.dest -anchor nw -fill x -pady 5 -padx 5 + - labelframe $w.options -text {Transfer Options} ++ labelframe $w.options -text [mc "Transfer Options"] ++ checkbutton $w.options.force \ ++ -text [mc "Force overwrite existing branch (may discard changes)"] \ ++ -variable push_force ++ grid $w.options.force -columnspan 2 -sticky w + checkbutton $w.options.thin \ - -text {Use thin pack (for slow network connections)} \ ++ -text [mc "Use thin pack (for slow network connections)"] \ + -variable push_thin + grid $w.options.thin -columnspan 2 -sticky w + checkbutton $w.options.tags \ - -text {Include tags} \ ++ -text [mc "Include tags"] \ + -variable push_tags + grid $w.options.tags -columnspan 2 -sticky w + grid columnconfigure $w.options 1 -weight 1 + pack $w.options -anchor nw -fill x -pady 5 -padx 5 + + set push_url {} ++ set push_force 0 + set push_thin 0 + set push_tags 0 + + bind $w "grab $w; focus $w.buttons.create" + bind $w "destroy $w" + bind $w [list start_push_anywhere_action $w] - wm title $w "[appname] ([reponame]): Push" ++ wm title $w [append "[appname] ([reponame]): " [mc "Push"]] + tkwait window $w +} diff --cc git-gui/lib/win32.tcl index 000000000,000000000..d7f93d045 new file mode 100644 --- /dev/null +++ b/git-gui/lib/win32.tcl @@@ -1,0 -1,0 +1,26 @@@ ++# git-gui Misc. native Windows 32 support ++# Copyright (C) 2007 Shawn Pearce ++ ++proc win32_read_lnk {lnk_path} { ++ return [exec cscript.exe \ ++ /E:jscript \ ++ /nologo \ ++ [file join $::oguilib win32_shortcut.js] \ ++ $lnk_path] ++} ++ ++proc win32_create_lnk {lnk_path lnk_exec lnk_dir} { ++ global oguilib ++ ++ set lnk_args [lrange $lnk_exec 1 end] ++ set lnk_exec [lindex $lnk_exec 0] ++ ++ eval [list exec wscript.exe \ ++ /E:jscript \ ++ /nologo \ ++ [file join $oguilib win32_shortcut.js] \ ++ $lnk_path \ ++ [file join $oguilib git-gui.ico] \ ++ $lnk_dir \ ++ $lnk_exec] $lnk_args ++} diff --cc git-gui/lib/win32_shortcut.js index 000000000,000000000..117923f88 new file mode 100644 --- /dev/null +++ b/git-gui/lib/win32_shortcut.js @@@ -1,0 -1,0 +1,34 @@@ ++// git-gui Windows shortcut support ++// Copyright (C) 2007 Shawn Pearce ++ ++var WshShell = WScript.CreateObject("WScript.Shell"); ++var argv = WScript.Arguments; ++var argi = 0; ++var lnk_path = argv.item(argi++); ++var ico_path = argi < argv.length ? argv.item(argi++) : undefined; ++var dir_path = argi < argv.length ? argv.item(argi++) : undefined; ++var lnk_exec = argi < argv.length ? argv.item(argi++) : undefined; ++var lnk_args = ''; ++while (argi < argv.length) { ++ var s = argv.item(argi++); ++ if (lnk_args != '') ++ lnk_args += ' '; ++ if (s.indexOf(' ') >= 0) { ++ lnk_args += '"'; ++ lnk_args += s; ++ lnk_args += '"'; ++ } else { ++ lnk_args += s; ++ } ++} ++ ++var lnk = WshShell.CreateShortcut(lnk_path); ++if (argv.length == 1) { ++ WScript.echo(lnk.TargetPath); ++} else { ++ lnk.TargetPath = lnk_exec; ++ lnk.Arguments = lnk_args; ++ lnk.IconLocation = ico_path + ", 0"; ++ lnk.WorkingDirectory = dir_path; ++ lnk.Save(); ++} diff --cc git-gui/macosx/AppMain.tcl index 000000000,000000000..41ca08e2b new file mode 100644 --- /dev/null +++ b/git-gui/macosx/AppMain.tcl @@@ -1,0 -1,0 +1,22 @@@ ++set gitexecdir {@@gitexecdir@@} ++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 [file join $gitexecdir gitk] ++ 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 {[pwd] eq {/}} { ++ cd $env(HOME) ++ } ++} ++ ++unset gitexecdir gitguilib ++set argv [lrange $argv 1 end] ++source $AppMain_source diff --cc git-gui/macosx/Info.plist index 000000000,000000000..99913ec57 new file mode 100644 --- /dev/null +++ b/git-gui/macosx/Info.plist @@@ -1,0 -1,0 +1,28 @@@ ++ ++ ++ ++ ++ CFBundleDevelopmentRegion ++ English ++ CFBundleExecutable ++ Wish ++ CFBundleGetInfoString ++ Git Gui @@GITGUI_VERSION@@ © 2006-2007 Shawn Pearce, et. al. ++ CFBundleIconFile ++ git-gui.icns ++ CFBundleIdentifier ++ cz.or.repo.git-gui ++ CFBundleInfoDictionaryVersion ++ 6.0 ++ CFBundleName ++ Git Gui ++ CFBundlePackageType ++ APPL ++ CFBundleShortVersionString ++ @@GITGUI_VERSION@@ ++ CFBundleSignature ++ GITg ++ CFBundleVersion ++ @@GITGUI_VERSION@@ ++ ++ diff --cc git-gui/macosx/git-gui.icns index 000000000,000000000..77d88a77a new file mode 100644 Binary files differ diff --cc git-gui/po/.gitignore index 000000000,000000000..a89cf4496 new file mode 100644 --- /dev/null +++ b/git-gui/po/.gitignore @@@ -1,0 -1,0 +1,2 @@@ ++*.msg ++*~ diff --cc git-gui/po/README index 000000000,000000000..9d8b7364f new file mode 100644 --- /dev/null +++ b/git-gui/po/README @@@ -1,0 -1,0 +1,209 @@@ ++Localizing git-gui for your language ++==================================== ++ ++This short note is to help you, who reads and writes English and your ++own language, help us getting git-gui localized for more languages. It ++does not try to be a comprehensive manual of GNU gettext, which is the ++i18n framework we use, but tries to help you get started by covering the ++basics and how it is used in this project. ++ ++1. Getting started. ++ ++You would first need to have a working "git". Your distribution may ++have it as "git-core" package (do not get "GNU Interactive Tools" -- ++that is a different "git"). You would also need GNU gettext toolchain ++to test the resulting translation out. Although you can work on message ++translation files with a regular text editor, it is a good idea to have ++specialized so-called "po file editors" (e.g. emacs po-mode, KBabel, ++poedit, GTranslator --- any of them would work well). Please install ++them. ++ ++You would then need to clone the git-gui internationalization project ++repository, so that you can work on it: ++ ++ $ git clone mob@repo.or.cz:/srv/git/git-gui/git-gui-i18n.git/ ++ $ cd git-gui-i18n ++ $ git checkout --track -b mob origin/mob ++ $ git config remote.origin.push mob ++ ++The "git checkout" command creates a 'mob' branch from upstream's ++corresponding branch and makes it your current branch. You will be ++working on this branch. ++ ++The "git config" command records in your repository configuration file ++that you would push "mob" branch to the upstream when you say "git ++push". ++ ++ ++2. Starting a new language. ++ ++In the git-gui-i18n directory is a po/ subdirectory. It has a ++handful files whose names end with ".po". Is there a file that has ++messages in your language? ++ ++If you do not know what your language should be named, you need to find ++it. This currently follows ISO 639-1 two letter codes: ++ ++ http://www.loc.gov/standards/iso639-2/php/code_list.php ++ ++For example, if you are preparing a translation for Afrikaans, the ++language code is "af". If there already is a translation for your ++language, you do not have to perform any step in this section, but keep ++reading, because we are covering the basics. ++ ++If you did not find your language, you would need to start one yourself. ++Copy po/git-gui.pot file to po/af.po (replace "af" with the code for ++your language). Edit the first several lines to match existing *.po ++files to make it clear this is a translation table for git-gui project, ++and you are the primary translator. The result of your editing would ++look something like this: ++ ++ # Translation of git-gui to Afrikaans ++ # Copyright (C) 2007 Shawn Pearce ++ # This file is distributed under the same license as the git-gui package. ++ # YOUR NAME , 2007. ++ # ++ #, fuzzy ++ msgid "" ++ msgstr "" ++ "Project-Id-Version: git-gui\n" ++ "Report-Msgid-Bugs-To: \n" ++ "POT-Creation-Date: 2007-07-24 22:19+0300\n" ++ "PO-Revision-Date: 2007-07-25 18:00+0900\n" ++ "Last-Translator: YOUR NAME \n" ++ "Language-Team: Afrikaans\n" ++ "MIME-Version: 1.0\n" ++ "Content-Type: text/plain; charset=UTF-8\n" ++ "Content-Transfer-Encoding: 8bit\n" ++ ++You will find many pairs of a "msgid" line followed by a "msgstr" line. ++These pairs define how messages in git-gui application are translated to ++your language. Your primarily job is to fill in the empty double quote ++pairs on msgstr lines with the translation of the strings on their ++matching msgid lines. A few tips: ++ ++ - Control characters, such as newlines, are written in backslash ++ sequence similar to string literals in the C programming language. ++ When the string given on a msgid line has such a backslash sequence, ++ you would typically want to have corresponding ones in the string on ++ your msgstr line. ++ ++ - Some messages contain an optional context indicator at the end, ++ for example "@@noun" or "@@verb". This indicator allows the ++ software to select the correct translation depending upon the use. ++ The indicator is not actually part of the message and will not ++ be shown to the end-user. ++ ++ If your language does not require a different translation you ++ will still need to translate both messages. ++ ++ - Often the messages being translated are format strings given to ++ "printf()"-like functions. Make sure "%s", "%d", and "%%" in your ++ translated messages match the original. ++ ++ When you have to change the order of words, you can add "\$" ++ between '%' and the conversion ('s', 'd', etc.) to say "-th ++ parameter to the format string is used at this point". For example, ++ if the original message is like this: ++ ++ "Length is %d, Weight is %d" ++ ++ and if for whatever reason your translation needs to say weight first ++ and then length, you can say something like: ++ ++ "WEIGHT IS %2\$d, LENGTH IS %1\$d" ++ ++ The reason you need a backslash before dollar sign is because ++ this is a double quoted string in Tcl language, and without ++ it the letter introduces a variable interpolation, which you ++ do not want here. ++ ++ - A long message can be split across multiple lines by ending the ++ string with a double quote, and starting another string on the next ++ line with another double quote. They will be concatenated in the ++ result. For example: ++ ++ #: lib/remote_branch_delete.tcl:189 ++ #, 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 "" ++ "HERE YOU WILL WRITE YOUR TRANSLATION OF THE ABOVE LONG " ++ "MESSAGE IN YOUR LANGUAGE." ++ ++You can test your translation by running "make install", which would ++create po/af.msg file and installs the result, and then running the ++resulting git-gui under your locale: ++ ++ $ make install ++ $ LANG=af git-gui ++ ++There is a trick to test your translation without first installing: ++ ++ $ make ++ $ LANG=af ./git-gui.sh ++ ++When you are satisfied with your translation, commit your changes, and ++push it back to the 'mob' branch: ++ ++ $ edit po/af.po ++ ... be sure to update Last-Translator: and ++ ... PO-Revision-Date: lines. ++ $ git add po/af.po ++ $ git commit -m 'Started Afrikaans translation.' ++ $ git push ++ ++ ++3. Updating your translation. ++ ++There may already be a translation for your language, and you may want ++to contribute an update. This may be because you would want to improve ++the translation of existing messages, or because the git-gui software ++itself was updated and there are new messages that need translation. ++ ++In any case, make sure you are up-to-date before starting your work: ++ ++ $ git pull ++ ++In the former case, you will edit po/af.po (again, replace "af" with ++your language code), and after testing and updating the Last-Translator: ++and PO-Revision-Date: lines, "add/commit/push" as in the previous ++section. ++ ++By comparing "POT-Creation-Date:" line in po/git-gui.pot file and ++po/af.po file, you can tell if there are new messages that need to be ++translated. You would need the GNU gettext package to perform this ++step. ++ ++ $ msgmerge -U po/af.po po/git-gui.pot ++ ++[NEEDSWORK: who is responsible for updating po/git-gui.pot file by ++running xgettext? IIRC, Christian recommended against running it ++nilly-willy because it can become a source of unnecessary merge ++conflicts. Perhaps we should mention something like " ++ ++The po/git-gui.pot file is updated by the internationalization ++coordinator from time to time. You _could_ update it yourself, but ++translators are discouraged from doing so because we would want all ++language teams to be working off of the same version of git-gui.pot. ++ ++" here?] ++ ++This updates po/af.po (again, replace "af" with your language ++code) so that it contains msgid lines (i.e. the original) that ++your translation did not have before. There are a few things to ++watch out for: ++ ++ - The original text in English of an older message you already ++ translated might have been changed. You will notice a comment line ++ that begins with "#, fuzzy" in front of such a message. msgmerge ++ tool made its best effort to match your old translation with the ++ message from the updated software, but you may find cases that it ++ matched your old translated message to a new msgid and the pairing ++ does not make any sense -- you would need to fix them, and then ++ remove the "#, fuzzy" line from the message (your fixed translation ++ of the message will not be used before you remove the marker). ++ ++ - New messages added to the software will have msgstr lines with empty ++ strings. You would need to translate them. diff --cc git-gui/po/de.po index 000000000,000000000..3df30edb8 new file mode 100644 --- /dev/null +++ b/git-gui/po/de.po @@@ -1,0 -1,0 +1,1878 @@@ ++# Translation of git-gui to German. ++# Copyright (C) 2007 Shawn Pearce, et al. ++# This file is distributed under the same license as the git package. ++# Christian Stimming , 2007 ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: git-gui\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2007-10-19 21:10+0200\n" ++"PO-Revision-Date: 2007-10-20 15:28+0200\n" ++"Last-Translator: Christian Stimming \n" ++"Language-Team: German\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++#: git-gui.sh:41 git-gui.sh:590 git-gui.sh:604 git-gui.sh:617 git-gui.sh:700 ++#: git-gui.sh:719 ++msgid "git-gui: fatal error" ++msgstr "git-gui: Programmfehler" ++ ++#: git-gui.sh:551 ++#, tcl-format ++msgid "Invalid font specified in %s:" ++msgstr "Ungültige Zeichensatz-Angabe in %s:" ++ ++#: git-gui.sh:576 ++msgid "Main Font" ++msgstr "Programmschriftart" ++ ++#: git-gui.sh:577 ++msgid "Diff/Console Font" ++msgstr "Vergleich-Schriftart" ++ ++#: git-gui.sh:591 ++msgid "Cannot find git in PATH." ++msgstr "Git kann im PATH nicht gefunden werden." ++ ++#: git-gui.sh:618 ++msgid "Cannot parse Git version string:" ++msgstr "Git Versionsangabe kann nicht erkannt werden:" ++ ++#: git-gui.sh:636 ++#, 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 "" ++"Die Version von Git kann nicht bestimmt werden.\n" ++"\n" ++"»%s« behauptet, es sei Version »%s«.\n" ++"\n" ++"%s benötigt mindestens Git 1.5.0 oder höher.\n" ++"\n" ++"Soll angenommen werden, »%s« sei Version 1.5.0?\n" ++ ++#: git-gui.sh:874 ++msgid "Git directory not found:" ++msgstr "Git-Verzeichnis nicht gefunden:" ++ ++#: git-gui.sh:881 ++msgid "Cannot move to top of working directory:" ++msgstr "" ++"Es konnte nicht in das oberste Verzeichnis der Arbeitskopie gewechselt " ++"werden:" ++ ++#: git-gui.sh:888 ++msgid "Cannot use funny .git directory:" ++msgstr "Unerwartete Struktur des .git Verzeichnis:" ++ ++#: git-gui.sh:893 ++msgid "No working directory" ++msgstr "Kein Arbeitsverzeichnis" ++ ++#: git-gui.sh:1040 ++msgid "Refreshing file status..." ++msgstr "Dateistatus aktualisieren..." ++ ++#: git-gui.sh:1105 ++msgid "Scanning for modified files ..." ++msgstr "Nach geänderten Dateien suchen..." ++ ++#: git-gui.sh:1280 lib/browser.tcl:245 ++msgid "Ready." ++msgstr "Bereit." ++ ++#: git-gui.sh:1546 ++msgid "Unmodified" ++msgstr "Unverändert" ++ ++#: git-gui.sh:1548 ++msgid "Modified, not staged" ++msgstr "Verändert, nicht bereitgestellt" ++ ++#: git-gui.sh:1549 git-gui.sh:1554 ++msgid "Staged for commit" ++msgstr "Bereitgestellt zum Eintragen" ++ ++#: git-gui.sh:1550 git-gui.sh:1555 ++msgid "Portions staged for commit" ++msgstr "Teilweise bereitgestellt zum Eintragen" ++ ++#: git-gui.sh:1551 git-gui.sh:1556 ++msgid "Staged for commit, missing" ++msgstr "Bereitgestellt zum Eintragen, fehlend" ++ ++#: git-gui.sh:1553 ++msgid "Untracked, not staged" ++msgstr "Nicht unter Versionskontrolle, nicht bereitgestellt" ++ ++#: git-gui.sh:1558 ++msgid "Missing" ++msgstr "Fehlend" ++ ++#: git-gui.sh:1559 ++msgid "Staged for removal" ++msgstr "Bereitgestellt zum Löschen" ++ ++#: git-gui.sh:1560 ++msgid "Staged for removal, still present" ++msgstr "Bereitgestellt zum Löschen, trotzdem vorhanden" ++ ++#: git-gui.sh:1562 git-gui.sh:1563 git-gui.sh:1564 git-gui.sh:1565 ++msgid "Requires merge resolution" ++msgstr "Konfliktauflösung nötig" ++ ++#: git-gui.sh:1600 ++msgid "Starting gitk... please wait..." ++msgstr "Gitk wird gestartet... bitte warten." ++ ++#: git-gui.sh:1609 ++#, tcl-format ++msgid "" ++"Unable to start gitk:\n" ++"\n" ++"%s does not exist" ++msgstr "" ++"Gitk kann nicht gestartet werden:\n" ++"\n" ++"%s existiert nicht" ++ ++#: git-gui.sh:1809 lib/choose_repository.tcl:35 ++msgid "Repository" ++msgstr "Projektarchiv" ++ ++#: git-gui.sh:1810 ++msgid "Edit" ++msgstr "Bearbeiten" ++ ++#: git-gui.sh:1812 lib/choose_rev.tcl:560 ++msgid "Branch" ++msgstr "Zweig" ++ ++#: git-gui.sh:1815 lib/choose_rev.tcl:547 ++msgid "Commit@@noun" ++msgstr "Version" ++ ++#: git-gui.sh:1818 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168 ++msgid "Merge" ++msgstr "Zusammenführen" ++ ++#: git-gui.sh:1819 lib/choose_rev.tcl:556 ++msgid "Remote" ++msgstr "Andere Archive" ++ ++#: git-gui.sh:1828 ++msgid "Browse Current Branch's Files" ++msgstr "Aktuellen Zweig durchblättern" ++ ++#: git-gui.sh:1832 ++msgid "Browse Branch Files..." ++msgstr "Einen Zweig durchblättern..." ++ ++#: git-gui.sh:1837 ++msgid "Visualize Current Branch's History" ++msgstr "Aktuellen Zweig darstellen" ++ ++#: git-gui.sh:1841 ++msgid "Visualize All Branch History" ++msgstr "Alle Zweige darstellen" ++ ++#: git-gui.sh:1848 ++#, tcl-format ++msgid "Browse %s's Files" ++msgstr "Zweig »%s« durchblättern" ++ ++#: git-gui.sh:1850 ++#, tcl-format ++msgid "Visualize %s's History" ++msgstr "Historie von »%s« darstellen" ++ ++#: git-gui.sh:1855 lib/database.tcl:27 lib/database.tcl:67 ++msgid "Database Statistics" ++msgstr "Datenbankstatistik" ++ ++#: git-gui.sh:1858 lib/database.tcl:34 ++msgid "Compress Database" ++msgstr "Datenbank komprimieren" ++ ++#: git-gui.sh:1861 ++msgid "Verify Database" ++msgstr "Datenbank überprüfen" ++ ++#: git-gui.sh:1868 git-gui.sh:1872 git-gui.sh:1876 lib/shortcut.tcl:7 ++#: lib/shortcut.tcl:39 lib/shortcut.tcl:71 ++msgid "Create Desktop Icon" ++msgstr "Desktop-Icon erstellen" ++ ++#: git-gui.sh:1881 lib/choose_repository.tcl:176 lib/choose_repository.tcl:184 ++msgid "Quit" ++msgstr "Beenden" ++ ++#: git-gui.sh:1888 ++msgid "Undo" ++msgstr "Rückgängig" ++ ++#: git-gui.sh:1891 ++msgid "Redo" ++msgstr "Wiederholen" ++ ++#: git-gui.sh:1895 git-gui.sh:2388 ++msgid "Cut" ++msgstr "Ausschneiden" ++ ++#: git-gui.sh:1898 git-gui.sh:2391 git-gui.sh:2462 git-gui.sh:2534 ++#: lib/console.tcl:67 ++msgid "Copy" ++msgstr "Kopieren" ++ ++#: git-gui.sh:1901 git-gui.sh:2394 ++msgid "Paste" ++msgstr "Einfügen" ++ ++#: git-gui.sh:1904 git-gui.sh:2397 lib/branch_delete.tcl:26 ++#: lib/remote_branch_delete.tcl:38 ++msgid "Delete" ++msgstr "Löschen" ++ ++#: git-gui.sh:1908 git-gui.sh:2401 git-gui.sh:2538 lib/console.tcl:69 ++msgid "Select All" ++msgstr "Alle auswählen" ++ ++#: git-gui.sh:1917 ++msgid "Create..." ++msgstr "Erstellen..." ++ ++#: git-gui.sh:1923 ++msgid "Checkout..." ++msgstr "Umstellen..." ++ ++#: git-gui.sh:1929 ++msgid "Rename..." ++msgstr "Umbenennen..." ++ ++#: git-gui.sh:1934 git-gui.sh:2033 ++msgid "Delete..." ++msgstr "Löschen..." ++ ++#: git-gui.sh:1939 ++msgid "Reset..." ++msgstr "Zurücksetzen..." ++ ++#: git-gui.sh:1951 git-gui.sh:2335 ++msgid "New Commit" ++msgstr "Neue Version" ++ ++#: git-gui.sh:1959 git-gui.sh:2342 ++msgid "Amend Last Commit" ++msgstr "Letzte Version nachbessern" ++ ++#: git-gui.sh:1968 git-gui.sh:2302 lib/remote_branch_delete.tcl:99 ++msgid "Rescan" ++msgstr "Neu laden" ++ ++#: git-gui.sh:1974 ++msgid "Stage To Commit" ++msgstr "Zum Eintragen bereitstellen" ++ ++#: git-gui.sh:1979 ++msgid "Stage Changed Files To Commit" ++msgstr "Geänderte Dateien zum Eintragen bereitstellen" ++ ++#: git-gui.sh:1985 ++msgid "Unstage From Commit" ++msgstr "Aus der Bereitstellung herausnehmen" ++ ++#: git-gui.sh:1990 lib/index.tcl:352 ++msgid "Revert Changes" ++msgstr "Änderungen revidieren" ++ ++#: git-gui.sh:1997 git-gui.sh:2314 git-gui.sh:2412 ++msgid "Sign Off" ++msgstr "Abzeichnen" ++ ++#: git-gui.sh:2001 git-gui.sh:2318 ++msgid "Commit@@verb" ++msgstr "Eintragen" ++ ++#: git-gui.sh:2012 ++msgid "Local Merge..." ++msgstr "Lokales Zusammenführen..." ++ ++#: git-gui.sh:2017 ++msgid "Abort Merge..." ++msgstr "Zusammenführen abbrechen..." ++ ++#: git-gui.sh:2029 ++msgid "Push..." ++msgstr "Versenden..." ++ ++#: git-gui.sh:2040 lib/choose_repository.tcl:40 ++msgid "Apple" ++msgstr "Apple" ++ ++#: git-gui.sh:2043 git-gui.sh:2065 lib/about.tcl:13 ++#: lib/choose_repository.tcl:43 lib/choose_repository.tcl:49 ++#, tcl-format ++msgid "About %s" ++msgstr "Über %s" ++ ++#: git-gui.sh:2047 ++msgid "Preferences..." ++msgstr "Einstellungen..." ++ ++#: git-gui.sh:2055 git-gui.sh:2580 ++msgid "Options..." ++msgstr "Optionen..." ++ ++#: git-gui.sh:2061 lib/choose_repository.tcl:46 ++msgid "Help" ++msgstr "Hilfe" ++ ++#: git-gui.sh:2102 ++msgid "Online Documentation" ++msgstr "Online-Dokumentation" ++ ++#: git-gui.sh:2186 ++#, tcl-format ++msgid "fatal: cannot stat path %s: No such file or directory" ++msgstr "" ++ ++#: git-gui.sh:2219 ++msgid "Current Branch:" ++msgstr "Aktueller Zweig:" ++ ++#: git-gui.sh:2240 ++msgid "Staged Changes (Will Commit)" ++msgstr "Bereitgestellte Änderungen (zum Eintragen)" ++ ++#: git-gui.sh:2259 ++msgid "Unstaged Changes" ++msgstr "Nicht bereitgestellte Änderungen" ++ ++#: git-gui.sh:2308 ++msgid "Stage Changed" ++msgstr "Alles bereitstellen" ++ ++#: git-gui.sh:2324 lib/transport.tcl:93 lib/transport.tcl:182 ++msgid "Push" ++msgstr "Versenden" ++ ++#: git-gui.sh:2354 ++msgid "Initial Commit Message:" ++msgstr "Erste Versionsbeschreibung:" ++ ++#: git-gui.sh:2355 ++msgid "Amended Commit Message:" ++msgstr "Nachgebesserte Versionsbeschreibung:" ++ ++#: git-gui.sh:2356 ++msgid "Amended Initial Commit Message:" ++msgstr "Nachgebesserte erste Versionsbeschreibung:" ++ ++#: git-gui.sh:2357 ++msgid "Amended Merge Commit Message:" ++msgstr "Nachgebesserte Zusammenführungs-Versionsbeschreibung:" ++ ++#: git-gui.sh:2358 ++msgid "Merge Commit Message:" ++msgstr "Zusammenführungs-Versionsbeschreibung:" ++ ++#: git-gui.sh:2359 ++msgid "Commit Message:" ++msgstr "Versionsbeschreibung:" ++ ++#: git-gui.sh:2404 git-gui.sh:2542 lib/console.tcl:71 ++msgid "Copy All" ++msgstr "Alle kopieren" ++ ++#: git-gui.sh:2428 lib/blame.tcl:104 ++msgid "File:" ++msgstr "Datei:" ++ ++#: git-gui.sh:2530 ++msgid "Refresh" ++msgstr "Aktualisieren" ++ ++#: git-gui.sh:2551 ++msgid "Apply/Reverse Hunk" ++msgstr "Änderung anwenden/umkehren" ++ ++#: git-gui.sh:2557 ++msgid "Decrease Font Size" ++msgstr "Schriftgröße verkleinern" ++ ++#: git-gui.sh:2561 ++msgid "Increase Font Size" ++msgstr "Schriftgröße vergrößern" ++ ++#: git-gui.sh:2566 ++msgid "Show Less Context" ++msgstr "Weniger Kontext anzeigen" ++ ++#: git-gui.sh:2573 ++msgid "Show More Context" ++msgstr "Mehr Kontext anzeigen" ++ ++#: git-gui.sh:2587 ++msgid "Unstage Hunk From Commit" ++msgstr "Aus der Bereitstellung herausnehmen" ++ ++#: git-gui.sh:2589 ++msgid "Stage Hunk For Commit" ++msgstr "In die Bereitstellung hinzufügen" ++ ++#: git-gui.sh:2608 ++msgid "Initializing..." ++msgstr "Initialisieren..." ++ ++#: git-gui.sh:2699 ++#, 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 "" ++ ++#: git-gui.sh:2729 ++msgid "" ++"\n" ++"This is due to a known issue with the\n" ++"Tcl binary distributed by Cygwin." ++msgstr "" ++ ++#: git-gui.sh:2734 ++#, 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 "" ++ ++#: lib/about.tcl:25 ++msgid "git-gui - a graphical user interface for Git." ++msgstr "git-gui - eine grafische Oberfläche für Git." ++ ++#: lib/blame.tcl:77 ++msgid "File Viewer" ++msgstr "Datei-Browser" ++ ++#: lib/blame.tcl:81 ++msgid "Commit:" ++msgstr "Version:" ++ ++#: lib/blame.tcl:249 ++msgid "Copy Commit" ++msgstr "Version kopieren" ++ ++#: lib/blame.tcl:369 ++#, tcl-format ++msgid "Reading %s..." ++msgstr "%s lesen..." ++ ++#: lib/blame.tcl:473 ++msgid "Loading copy/move tracking annotations..." ++msgstr "" ++ ++#: lib/blame.tcl:493 ++msgid "lines annotated" ++msgstr "" ++ ++#: lib/blame.tcl:674 ++msgid "Loading original location annotations..." ++msgstr "" ++ ++#: lib/blame.tcl:677 ++msgid "Annotation complete." ++msgstr "" ++ ++#: lib/blame.tcl:731 ++msgid "Loading annotation..." ++msgstr "Annotierung laden..." ++ ++#: lib/blame.tcl:787 ++msgid "Author:" ++msgstr "Autor:" ++ ++#: lib/blame.tcl:791 ++msgid "Committer:" ++msgstr "Eintragender:" ++ ++#: lib/blame.tcl:796 ++msgid "Original File:" ++msgstr "Ursprüngliche Datei:" ++ ++#: lib/blame.tcl:910 ++msgid "Originally By:" ++msgstr "Ursprünglich von:" ++ ++#: lib/blame.tcl:916 ++msgid "In File:" ++msgstr "In Datei:" ++ ++#: lib/blame.tcl:921 ++msgid "Copied Or Moved Here By:" ++msgstr "Kopiert oder verschoben durch:" ++ ++#: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19 ++msgid "Checkout Branch" ++msgstr "Zweig umstellen" ++ ++#: lib/branch_checkout.tcl:23 ++msgid "Checkout" ++msgstr "Umstellen" ++ ++#: lib/branch_checkout.tcl:27 lib/branch_create.tcl:35 ++#: lib/branch_delete.tcl:32 lib/branch_rename.tcl:30 lib/browser.tcl:281 ++#: lib/checkout_op.tcl:522 lib/choose_font.tcl:43 lib/merge.tcl:172 ++#: lib/option.tcl:90 lib/remote_branch_delete.tcl:42 lib/transport.tcl:97 ++msgid "Cancel" ++msgstr "Abbrechen" ++ ++#: lib/branch_checkout.tcl:32 lib/browser.tcl:286 ++msgid "Revision" ++msgstr "Version" ++ ++#: lib/branch_checkout.tcl:36 lib/branch_create.tcl:69 lib/option.tcl:202 ++msgid "Options" ++msgstr "Optionen" ++ ++#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92 ++msgid "Fetch Tracking Branch" ++msgstr "Übernahmezweig anfordern" ++ ++#: lib/branch_checkout.tcl:44 ++msgid "Detach From Local Branch" ++msgstr "Verbindung zu lokalem Zweig lösen" ++ ++#: lib/branch_create.tcl:22 ++msgid "Create Branch" ++msgstr "Zweig erstellen" ++ ++#: lib/branch_create.tcl:27 ++msgid "Create New Branch" ++msgstr "Neuen Zweig erstellen" ++ ++#: lib/branch_create.tcl:31 lib/choose_repository.tcl:375 ++msgid "Create" ++msgstr "Erstellen" ++ ++#: lib/branch_create.tcl:40 ++msgid "Branch Name" ++msgstr "Zweigname" ++ ++#: lib/branch_create.tcl:43 ++msgid "Name:" ++msgstr "Name:" ++ ++#: lib/branch_create.tcl:58 ++msgid "Match Tracking Branch Name" ++msgstr "Passend zu Übernahmezweig-Name" ++ ++#: lib/branch_create.tcl:66 ++msgid "Starting Revision" ++msgstr "Anfangsversion" ++ ++#: lib/branch_create.tcl:72 ++msgid "Update Existing Branch:" ++msgstr "Existierenden Zweig aktualisieren:" ++ ++#: lib/branch_create.tcl:75 ++msgid "No" ++msgstr "Nein" ++ ++#: lib/branch_create.tcl:80 ++msgid "Fast Forward Only" ++msgstr "Nur Schnellzusammenführung" ++ ++#: lib/branch_create.tcl:85 lib/checkout_op.tcl:514 ++msgid "Reset" ++msgstr "Zurücksetzen" ++ ++#: lib/branch_create.tcl:97 ++msgid "Checkout After Creation" ++msgstr "Arbeitskopie umstellen nach Erstellen" ++ ++#: lib/branch_create.tcl:131 ++msgid "Please select a tracking branch." ++msgstr "Bitte wählen Sie einen Übernahmezweig." ++ ++#: lib/branch_create.tcl:140 ++#, tcl-format ++msgid "Tracking branch %s is not a branch in the remote repository." ++msgstr "Übernahmezweig »%s« ist kein Zweig im anderen Projektarchiv." ++ ++#: lib/branch_create.tcl:153 lib/branch_rename.tcl:86 ++msgid "Please supply a branch name." ++msgstr "Bitte geben Sie einen Zweignamen an." ++ ++#: lib/branch_create.tcl:164 lib/branch_rename.tcl:106 ++#, tcl-format ++msgid "'%s' is not an acceptable branch name." ++msgstr "»%s« ist kein zulässiger Zweigname." ++ ++#: lib/branch_delete.tcl:15 ++msgid "Delete Branch" ++msgstr "Zweig löschen" ++ ++#: lib/branch_delete.tcl:20 ++msgid "Delete Local Branch" ++msgstr "Lokalen Zweig löschen" ++ ++#: lib/branch_delete.tcl:37 ++msgid "Local Branches" ++msgstr "Lokale Zweige" ++ ++#: lib/branch_delete.tcl:52 ++msgid "Delete Only If Merged Into" ++msgstr "Nur löschen, wenn darin zusammengeführt" ++ ++#: lib/branch_delete.tcl:54 ++msgid "Always (Do not perform merge test.)" ++msgstr "Immer (ohne Zusammenführungstest)" ++ ++#: lib/branch_delete.tcl:103 ++#, tcl-format ++msgid "The following branches are not completely merged into %s:" ++msgstr "Folgende Zweige sind noch nicht mit »%s« zusammengeführt:" ++ ++#: lib/branch_delete.tcl:115 ++msgid "" ++"Recovering deleted branches is difficult. \n" ++"\n" ++" Delete the selected branches?" ++msgstr "" ++"Gelöschte Zweige können nur mit größerem Aufwand wiederhergestellt werden.\n" ++"\n" ++"Gewählte Zweige jetzt löschen?" ++ ++#: lib/branch_delete.tcl:141 ++#, tcl-format ++msgid "" ++"Failed to delete branches:\n" ++"%s" ++msgstr "" ++"Fehler beim Löschen der Zweige:\n" ++"%s" ++ ++#: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22 ++msgid "Rename Branch" ++msgstr "Zweig umbenennen" ++ ++#: lib/branch_rename.tcl:26 ++msgid "Rename" ++msgstr "Umbenennen" ++ ++#: lib/branch_rename.tcl:36 ++msgid "Branch:" ++msgstr "Zweig:" ++ ++#: lib/branch_rename.tcl:39 ++msgid "New Name:" ++msgstr "Neuer Name:" ++ ++#: lib/branch_rename.tcl:75 ++msgid "Please select a branch to rename." ++msgstr "Bitte wählen Sie einen Zweig zum umbenennen." ++ ++#: lib/branch_rename.tcl:96 lib/checkout_op.tcl:179 ++#, tcl-format ++msgid "Branch '%s' already exists." ++msgstr "Zweig »%s« existiert bereits." ++ ++#: lib/branch_rename.tcl:117 ++#, tcl-format ++msgid "Failed to rename '%s'." ++msgstr "Fehler beim Umbenennen von »%s«." ++ ++#: lib/browser.tcl:17 ++msgid "Starting..." ++msgstr "Starten..." ++ ++#: lib/browser.tcl:26 ++msgid "File Browser" ++msgstr "Datei-Browser" ++ ++#: lib/browser.tcl:125 lib/browser.tcl:142 ++#, tcl-format ++msgid "Loading %s..." ++msgstr "%s laden..." ++ ++#: lib/browser.tcl:186 ++msgid "[Up To Parent]" ++msgstr "[Nach oben]" ++ ++#: lib/browser.tcl:266 lib/browser.tcl:272 ++msgid "Browse Branch Files" ++msgstr "Dateien des Zweigs durchblättern" ++ ++#: lib/browser.tcl:277 lib/choose_repository.tcl:391 ++#: lib/choose_repository.tcl:482 lib/choose_repository.tcl:492 ++#: lib/choose_repository.tcl:989 ++msgid "Browse" ++msgstr "Blättern" ++ ++#: lib/checkout_op.tcl:79 ++#, tcl-format ++msgid "Fetching %s from %s" ++msgstr "Änderungen »%s« von »%s« anfordern" ++ ++#: lib/checkout_op.tcl:127 ++#, tcl-format ++msgid "fatal: Cannot resolve %s" ++msgstr "" ++ ++#: lib/checkout_op.tcl:140 lib/console.tcl:79 lib/database.tcl:31 ++msgid "Close" ++msgstr "Schließen" ++ ++#: lib/checkout_op.tcl:169 ++#, tcl-format ++msgid "Branch '%s' does not exist." ++msgstr "Zweig »%s« existiert nicht." ++ ++#: lib/checkout_op.tcl:206 ++#, tcl-format ++msgid "" ++"Branch '%s' already exists.\n" ++"\n" ++"It cannot fast-forward to %s.\n" ++"A merge is required." ++msgstr "" ++"Zweig »%s« existiert bereits.\n" ++"\n" ++"Zweig kann nicht mit »%s« schnellzusammengeführt werden. Reguläres " ++"Zusammenführen ist notwendig." ++ ++#: lib/checkout_op.tcl:220 ++#, tcl-format ++msgid "Merge strategy '%s' not supported." ++msgstr "Zusammenführungsmethode »%s« nicht unterstützt." ++ ++#: lib/checkout_op.tcl:239 ++#, tcl-format ++msgid "Failed to update '%s'." ++msgstr "Aktualisieren von »%s« fehlgeschlagen." ++ ++#: lib/checkout_op.tcl:251 ++msgid "Staging area (index) is already locked." ++msgstr "Bereitstellung (»index«) ist zur Bearbeitung gesperrt (»locked«)." ++ ++#: lib/checkout_op.tcl:266 ++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 "" ++"Der letzte geladene Status stimmt nicht mehr mit dem Projektarchiv überein.\n" ++"\n" ++"Ein anderes Git-Programm hat das Projektarchiv seit dem letzten Laden " ++"geändert. Vor dem Wechseln des lokalen Zweigs muss neu geladen werden.\n" ++"\n" ++"Es wird gleich neu geladen.\n" ++ ++#: lib/checkout_op.tcl:322 ++#, tcl-format ++msgid "Updating working directory to '%s'..." ++msgstr "Arbeitskopie umstellen auf »%s«..." ++ ++#: lib/checkout_op.tcl:353 ++#, tcl-format ++msgid "Aborted checkout of '%s' (file level merging is required)." ++msgstr "" ++"Zweig umstellen von »%s« abgebrochen (Zusammenführen der Dateien ist " ++"notwendig)." ++ ++#: lib/checkout_op.tcl:354 ++msgid "File level merge required." ++msgstr "Zusammenführen der Dateien ist notwendig." ++ ++#: lib/checkout_op.tcl:358 ++#, tcl-format ++msgid "Staying on branch '%s'." ++msgstr "Es wird auf Zweig »%s« verblieben." ++ ++#: lib/checkout_op.tcl:429 ++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 "" ++"Die Arbeitskopie ist nicht auf einem lokalen Zweig.\n" ++"\n" ++"Wenn Sie auf einem Zweig arbeiten möchten, erstellen Sie bitte jetzt einen " ++"Zweig mit der Auswahl »Abgetrennte Arbeitskopie-Version«." ++ ++#: lib/checkout_op.tcl:446 ++#, tcl-format ++msgid "Checked out '%s'." ++msgstr "Umgestellt auf »%s«." ++ ++#: lib/checkout_op.tcl:478 ++#, tcl-format ++msgid "Resetting '%s' to '%s' will lose the following commits:" ++msgstr "Zurücksetzen von »%s« nach »%s« wird folgende Versionen verwerfen:" ++ ++#: lib/checkout_op.tcl:500 ++msgid "Recovering lost commits may not be easy." ++msgstr "" ++"Verworfene Versionen können nur mit größerem Aufwand wiederhergestellt " ++"werden." ++ ++#: lib/checkout_op.tcl:505 ++#, tcl-format ++msgid "Reset '%s'?" ++msgstr "»%s« zurücksetzen?" ++ ++#: lib/checkout_op.tcl:510 lib/merge.tcl:164 ++msgid "Visualize" ++msgstr "Darstellen" ++ ++#: lib/checkout_op.tcl:578 ++#, 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 "" ++"Lokaler Zweig kann nicht gesetzt werden.\n" ++"\n" ++"Diese Arbeitskopie ist nur teilweise umgestellt. Die Dateien sind korrekt " ++"aktualisiert, aber einige interne Git-Dateien konnten nicht geändert " ++"werden.\n" ++"\n" ++"Dies ist ein interner Programmfehler von %s. Programm wird jetzt abgebrochen." ++ ++#: lib/choose_font.tcl:39 ++msgid "Select" ++msgstr "Auswählen" ++ ++#: lib/choose_font.tcl:53 ++msgid "Font Family" ++msgstr "Schriftfamilie" ++ ++#: lib/choose_font.tcl:73 ++msgid "Font Size" ++msgstr "Schriftgröße" ++ ++#: lib/choose_font.tcl:90 ++msgid "Font Example" ++msgstr "Schriftbeispiel" ++ ++#: lib/choose_font.tcl:101 ++msgid "" ++"This is example text.\n" ++"If you like this text, it can be your font." ++msgstr "" ++"Dies ist ein Beispieltext.\n" ++"Wenn Ihnen dieser Text gefällt, sollten Sie diese Schriftart wählen." ++ ++#: lib/choose_repository.tcl:27 ++msgid "Git Gui" ++msgstr "Git Gui" ++ ++#: lib/choose_repository.tcl:80 lib/choose_repository.tcl:380 ++msgid "Create New Repository" ++msgstr "Neues Projektarchiv" ++ ++#: lib/choose_repository.tcl:86 ++msgid "New..." ++msgstr "Neu..." ++ ++#: lib/choose_repository.tcl:93 lib/choose_repository.tcl:468 ++msgid "Clone Existing Repository" ++msgstr "Projektarchiv kopieren" ++ ++#: lib/choose_repository.tcl:99 ++msgid "Clone..." ++msgstr "Kopieren..." ++ ++#: lib/choose_repository.tcl:106 lib/choose_repository.tcl:978 ++msgid "Open Existing Repository" ++msgstr "Projektarchiv öffnen" ++ ++#: lib/choose_repository.tcl:112 ++msgid "Open..." ++msgstr "Öffnen..." ++ ++#: lib/choose_repository.tcl:125 ++msgid "Recent Repositories" ++msgstr "Zuletzt benutzte Projektarchive" ++ ++#: lib/choose_repository.tcl:131 ++msgid "Open Recent Repository:" ++msgstr "Zuletzt benutztes Projektarchiv öffnen:" ++ ++#: lib/choose_repository.tcl:294 ++#, tcl-format ++msgid "Location %s already exists." ++msgstr "Projektarchiv »%s« existiert bereits." ++ ++#: lib/choose_repository.tcl:300 lib/choose_repository.tcl:307 ++#: lib/choose_repository.tcl:314 ++#, tcl-format ++msgid "Failed to create repository %s:" ++msgstr "Projektarchiv »%s« konnte nicht erstellt werden:" ++ ++#: lib/choose_repository.tcl:385 lib/choose_repository.tcl:486 ++msgid "Directory:" ++msgstr "Verzeichnis:" ++ ++#: lib/choose_repository.tcl:415 lib/choose_repository.tcl:544 ++#: lib/choose_repository.tcl:1013 ++msgid "Git Repository" ++msgstr "Git Projektarchiv" ++ ++#: lib/choose_repository.tcl:430 lib/choose_repository.tcl:437 ++#, tcl-format ++msgid "Directory %s already exists." ++msgstr "Verzeichnis »%s« existiert bereits." ++ ++#: lib/choose_repository.tcl:442 ++#, tcl-format ++msgid "File %s already exists." ++msgstr "Datei »%s« existiert bereits." ++ ++#: lib/choose_repository.tcl:463 ++msgid "Clone" ++msgstr "Kopieren" ++ ++#: lib/choose_repository.tcl:476 ++msgid "URL:" ++msgstr "URL:" ++ ++#: lib/choose_repository.tcl:496 ++msgid "Clone Type:" ++msgstr "Art der Kopie:" ++ ++#: lib/choose_repository.tcl:502 ++msgid "Standard (Fast, Semi-Redundant, Hardlinks)" ++msgstr "Standard (schnell, teilweise redundant, Hardlinks)" ++ ++#: lib/choose_repository.tcl:508 ++msgid "Full Copy (Slower, Redundant Backup)" ++msgstr "Alles kopieren (langsamer, volle Redundanz)" ++ ++#: lib/choose_repository.tcl:514 ++msgid "Shared (Fastest, Not Recommended, No Backup)" ++msgstr "Verknüpft (schnell, nicht empfohlen, kein Backup)" ++ ++#: lib/choose_repository.tcl:550 lib/choose_repository.tcl:597 ++#: lib/choose_repository.tcl:738 lib/choose_repository.tcl:808 ++#: lib/choose_repository.tcl:1019 lib/choose_repository.tcl:1027 ++#, tcl-format ++msgid "Not a Git repository: %s" ++msgstr "Kein Git-Projektarchiv in »%s« gefunden." ++ ++#: lib/choose_repository.tcl:586 ++msgid "Standard only available for local repository." ++msgstr "Standard ist nur für lokale Projektarchive verfügbar." ++ ++#: lib/choose_repository.tcl:590 ++msgid "Shared only available for local repository." ++msgstr "Verknüpft ist nur für lokale Projektarchive verfügbar." ++ ++#: lib/choose_repository.tcl:617 ++msgid "Failed to configure origin" ++msgstr "" ++ ++#: lib/choose_repository.tcl:629 ++msgid "Counting objects" ++msgstr "" ++ ++#: lib/choose_repository.tcl:630 ++msgid "buckets" ++msgstr "" ++ ++#: lib/choose_repository.tcl:654 ++#, tcl-format ++msgid "Unable to copy objects/info/alternates: %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:690 ++#, tcl-format ++msgid "Nothing to clone from %s." ++msgstr "Von »%s« konnte nichts kopiert werden." ++ ++#: lib/choose_repository.tcl:692 lib/choose_repository.tcl:906 ++#: lib/choose_repository.tcl:918 ++msgid "The 'master' branch has not been initialized." ++msgstr "" ++ ++#: lib/choose_repository.tcl:705 ++msgid "Hardlinks are unavailable. Falling back to copying." ++msgstr "" ++ ++#: lib/choose_repository.tcl:717 ++#, tcl-format ++msgid "Cloning from %s" ++msgstr "Kopieren von »%s«" ++ ++#: lib/choose_repository.tcl:748 ++msgid "Copying objects" ++msgstr "Objektdatenbank kopieren" ++ ++#: lib/choose_repository.tcl:749 ++msgid "KiB" ++msgstr "KB" ++ ++#: lib/choose_repository.tcl:773 ++#, tcl-format ++msgid "Unable to copy object: %s" ++msgstr "Objekt kann nicht kopiert werden: %s" ++ ++#: lib/choose_repository.tcl:783 ++msgid "Linking objects" ++msgstr "Objekte verlinken" ++ ++#: lib/choose_repository.tcl:784 ++msgid "objects" ++msgstr "Objekte" ++ ++#: lib/choose_repository.tcl:792 ++#, tcl-format ++msgid "Unable to hardlink object: %s" ++msgstr "Objekt kann nicht hartverlinkt werden: %s" ++ ++#: lib/choose_repository.tcl:847 ++msgid "Cannot fetch branches and objects. See console output for details." ++msgstr "" ++ ++#: lib/choose_repository.tcl:858 ++msgid "Cannot fetch tags. See console output for details." ++msgstr "" ++ ++#: lib/choose_repository.tcl:882 ++msgid "Cannot determine HEAD. See console output for details." ++msgstr "" ++ ++#: lib/choose_repository.tcl:891 ++#, tcl-format ++msgid "Unable to cleanup %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:897 ++msgid "Clone failed." ++msgstr "Kopieren fehlgeschlagen." ++ ++#: lib/choose_repository.tcl:904 ++msgid "No default branch obtained." ++msgstr "" ++ ++#: lib/choose_repository.tcl:915 ++#, tcl-format ++msgid "Cannot resolve %s as a commit." ++msgstr "" ++ ++#: lib/choose_repository.tcl:927 ++msgid "Creating working directory" ++msgstr "Arbeitskopie erstellen" ++ ++#: lib/choose_repository.tcl:928 lib/index.tcl:15 lib/index.tcl:80 ++#: lib/index.tcl:149 ++msgid "files" ++msgstr "Dateien" ++ ++#: lib/choose_repository.tcl:957 ++msgid "Initial file checkout failed." ++msgstr "" ++ ++#: lib/choose_repository.tcl:973 ++msgid "Open" ++msgstr "Öffnen" ++ ++#: lib/choose_repository.tcl:983 ++msgid "Repository:" ++msgstr "Projektarchiv:" ++ ++#: lib/choose_repository.tcl:1033 ++#, tcl-format ++msgid "Failed to open repository %s:" ++msgstr "Projektarchiv »%s« konnte nicht geöffnet werden." ++ ++#: lib/choose_rev.tcl:53 ++msgid "This Detached Checkout" ++msgstr "Abgetrennte Arbeitskopie-Version" ++ ++#: lib/choose_rev.tcl:60 ++msgid "Revision Expression:" ++msgstr "Version Regexp-Ausdruck:" ++ ++#: lib/choose_rev.tcl:74 ++msgid "Local Branch" ++msgstr "Lokaler Zweig" ++ ++#: lib/choose_rev.tcl:79 ++msgid "Tracking Branch" ++msgstr "Übernahmezweig" ++ ++#: lib/choose_rev.tcl:84 lib/choose_rev.tcl:537 ++msgid "Tag" ++msgstr "Markierung" ++ ++#: lib/choose_rev.tcl:317 ++#, tcl-format ++msgid "Invalid revision: %s" ++msgstr "Ungültige Version: %s" ++ ++#: lib/choose_rev.tcl:338 ++msgid "No revision selected." ++msgstr "Keine Version ausgewählt." ++ ++#: lib/choose_rev.tcl:346 ++msgid "Revision expression is empty." ++msgstr "Versions-Ausdruck ist leer." ++ ++#: lib/choose_rev.tcl:530 ++msgid "Updated" ++msgstr "Aktualisiert" ++ ++#: lib/choose_rev.tcl:558 ++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 "" ++"Keine Version zur Nachbesserung vorhanden.\n" ++"\n" ++"Sie sind dabei, die erste Version zu übertragen. Es gibt keine existierende " ++"Version, die Sie nachbessern könnten.\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 "" ++"Nachbesserung währen Zusammenführung nicht möglich.\n" ++"\n" ++"Sie haben das Zusammenführen von Versionen angefangen, aber noch nicht " ++"beendet. Sie können keine vorige Übertragung nachbessern, solange eine " ++"unfertige Zusammenführung existiert. Dazu müssen Sie die Zusammenführung " ++"beenden oder abbrechen.\n" ++ ++#: lib/commit.tcl:49 ++msgid "Error loading commit data for amend:" ++msgstr "Fehler beim Laden der Versionsdaten für Nachbessern:" ++ ++#: lib/commit.tcl:76 ++msgid "Unable to obtain your identity:" ++msgstr "Benutzername konnte nicht bestimmt werden:" ++ ++#: lib/commit.tcl:81 ++msgid "Invalid GIT_COMMITTER_IDENT:" ++msgstr "Ungültiger Wert von GIT_COMMITTER_INDENT:" ++ ++#: lib/commit.tcl:133 ++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 "" ++"Der letzte geladene Status stimmt nicht mehr mit dem Projektarchiv überein.\n" ++"\n" ++"Ein anderes Git-Programm hat das Projektarchiv seit dem letzten Laden " ++"geändert. Vor dem Eintragen einer neuen Version muss neu geladen werden.\n" ++"\n" ++"Es wird gleich neu geladen.\n" ++ ++#: lib/commit.tcl:154 ++#, 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 "" ++"Nicht zusammengeführte Dateien können nicht eingetragen werden.\n" ++"\n" ++"Die Datei »%s« hat noch nicht aufgelöste Zusammenführungs-Konflikte. Sie " ++"müssen diese Konflikte auflösen, bevor Sie eintragen können.\n" ++ ++#: lib/commit.tcl:162 ++#, tcl-format ++msgid "" ++"Unknown file state %s detected.\n" ++"\n" ++"File %s cannot be committed by this program.\n" ++msgstr "" ++"Unbekannter Dateizustand »%s«.\n" ++"\n" ++"Datei »%s« kann nicht eingetragen werden.\n" ++ ++#: lib/commit.tcl:170 ++msgid "" ++"No changes to commit.\n" ++"\n" ++"You must stage at least 1 file before you can commit.\n" ++msgstr "" ++"Keine Änderungen vorhanden, die eingetragen werden könnten.\n" ++"\n" ++"Sie müssen mindestens eine Datei bereitstellen, bevor Sie eintragen können.\n" ++ ++#: lib/commit.tcl:183 ++msgid "" ++"Please supply a commit message.\n" ++"\n" ++"A good commit message has the following format:\n" ++"\n" ++"- First line: Describe in one sentance what you did.\n" ++"- Second line: Blank\n" ++"- Remaining lines: Describe why this change is good.\n" ++msgstr "" ++"Bitte geben Sie eine Versionsbeschreibung ein.\n" ++"\n" ++"Eine gute Versionsbeschreibung enthält folgende Abschnitte:\n" ++"\n" ++"- Erste Zeile: Eine Zusammenfassung, was man gemacht hat.\n" ++"\n" ++"- Zweite Zeile: Leerzeile\n" ++"\n" ++"- Rest: Eine ausführliche Beschreibung, warum diese Änderung hilfreich ist.\n" ++ ++#: lib/commit.tcl:257 ++msgid "write-tree failed:" ++msgstr "write-tree fehlgeschlagen:" ++ ++#: lib/commit.tcl:275 ++#, tcl-format ++msgid "Commit %s appears to be corrupt" ++msgstr "Version »%s« scheint beschädigt zu sein" ++ ++#: lib/commit.tcl:279 ++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 "" ++"Keine Änderungen einzutragen.\n" ++"\n" ++"Es gibt keine geänderte Datei bei dieser Version und es wurde auch nichts " ++"zusammengeführt.\n" ++"\n" ++"Das Arbeitsverzeichnis wird daher jetzt neu geladen.\n" ++ ++#: lib/commit.tcl:286 ++msgid "No changes to commit." ++msgstr "Keine Änderungen, die eingetragen werden können." ++ ++#: lib/commit.tcl:303 ++#, tcl-format ++msgid "warning: Tcl does not support encoding '%s'." ++msgstr "" ++ ++#: lib/commit.tcl:317 ++msgid "commit-tree failed:" ++msgstr "commit-tree fehlgeschlagen:" ++ ++#: lib/commit.tcl:339 ++msgid "update-ref failed:" ++msgstr "update-ref fehlgeschlagen:" ++ ++#: lib/commit.tcl:430 ++#, tcl-format ++msgid "Created commit %s: %s" ++msgstr "Version %s übertragen: %s" ++ ++#: lib/console.tcl:57 ++msgid "Working... please wait..." ++msgstr "Verarbeitung. Bitte warten..." ++ ++#: lib/console.tcl:183 ++msgid "Success" ++msgstr "Erfolgreich" ++ ++#: lib/console.tcl:196 ++msgid "Error: Command Failed" ++msgstr "Fehler: Kommando fehlgeschlagen" ++ ++#: lib/database.tcl:43 ++msgid "Number of loose objects" ++msgstr "Anzahl unverknüpfter Objekte" ++ ++#: lib/database.tcl:44 ++msgid "Disk space used by loose objects" ++msgstr "Festplattenplatz von unverknüpften Objekten" ++ ++#: lib/database.tcl:45 ++msgid "Number of packed objects" ++msgstr "Anzahl komprimierter Objekte" ++ ++#: lib/database.tcl:46 ++msgid "Number of packs" ++msgstr "Anzahl Komprimierungseinheiten" ++ ++#: lib/database.tcl:47 ++msgid "Disk space used by packed objects" ++msgstr "Festplattenplatz von komprimierten Objekten" ++ ++#: lib/database.tcl:48 ++msgid "Packed objects waiting for pruning" ++msgstr "Komprimierte Objekte, die zum Entfernen vorgesehen sind" ++ ++#: lib/database.tcl:49 ++msgid "Garbage files" ++msgstr "Dateien im Mülleimer" ++ ++#: lib/database.tcl:72 ++msgid "Compressing the object database" ++msgstr "Objektdatenbank komprimieren" ++ ++#: lib/database.tcl:83 ++msgid "Verifying the object database with fsck-objects" ++msgstr "Die Objektdatenbank durch »fsck-objects« überprüfen lassen" ++ ++#: lib/database.tcl:108 ++#, 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 when more than %i loose objects exist.\n" ++"\n" ++"Compress the database now?" ++msgstr "" ++"Dieses Projektarchiv enthält ungefähr %i nicht verknüpfte Objekte.\n" ++"\n" ++"Für eine optimale Performance wird empfohlen, die Datenbank des " ++"Projektarchivs zu komprimieren, sobald mehr als %i nicht verknüpfte Objekte " ++"vorliegen.\n" ++"\n" ++"Soll die Datenbank jetzt komprimiert werden?" ++ ++#: lib/date.tcl:25 ++#, tcl-format ++msgid "Invalid date from Git: %s" ++msgstr "Ungültiges Datum von Git: %s" ++ ++#: lib/diff.tcl:42 ++#, 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 "" ++"Keine Änderungen feststellbar.\n" ++"\n" ++"»%s« enthält keine Änderungen. Zwar wurde das Änderungsdatum dieser Datei " ++"von einem anderen Programm modifiziert, aber der Inhalt der Datei ist " ++"unverändert.\n" ++"\n" ++"Das Arbeitsverzeichnis wird jetzt neu geladen, um diese Änderung bei allen " ++"Dateien zu prüfen." ++ ++#: lib/diff.tcl:81 ++#, tcl-format ++msgid "Loading diff of %s..." ++msgstr "Vergleich von »%s« laden..." ++ ++#: lib/diff.tcl:114 lib/diff.tcl:184 ++#, tcl-format ++msgid "Unable to display %s" ++msgstr "Datei »%s« kann nicht angezeigt werden" ++ ++#: lib/diff.tcl:115 ++msgid "Error loading file:" ++msgstr "Fehler beim Laden der Datei:" ++ ++#: lib/diff.tcl:122 ++msgid "Git Repository (subproject)" ++msgstr "Git-Projektarchiv (Unterprojekt)" ++ ++#: lib/diff.tcl:134 ++msgid "* Binary file (not showing content)." ++msgstr "* Binärdatei (Inhalt wird nicht angezeigt)" ++ ++#: lib/diff.tcl:185 ++msgid "Error loading diff:" ++msgstr "Fehler beim Laden des Vergleichs:" ++ ++#: lib/diff.tcl:302 ++msgid "Failed to unstage selected hunk." ++msgstr "Fehler beim Herausnehmen der gewählten Dateien aus der Bereitstellung." ++ ++#: lib/diff.tcl:309 ++msgid "Failed to stage selected hunk." ++msgstr "Fehler beim Bereitstellen der gewählten Dateien." ++ ++#: lib/error.tcl:12 lib/error.tcl:102 ++msgid "error" ++msgstr "Fehler" ++ ++#: lib/error.tcl:28 ++msgid "warning" ++msgstr "Warnung" ++ ++#: lib/error.tcl:81 ++msgid "You must correct the above errors before committing." ++msgstr "" ++"Sie müssen die obigen Fehler zuerst beheben, bevor Sie eintragen können." ++ ++#: lib/index.tcl:241 ++#, tcl-format ++msgid "Unstaging %s from commit" ++msgstr "Datei »%s« aus der Bereitstellung herausnehmen" ++ ++#: lib/index.tcl:285 ++#, tcl-format ++msgid "Adding %s" ++msgstr "»%s« hinzufügen..." ++ ++#: lib/index.tcl:340 ++#, tcl-format ++msgid "Revert changes in file %s?" ++msgstr "Änderungen in Datei »%s« revidieren?" ++ ++#: lib/index.tcl:342 ++#, tcl-format ++msgid "Revert changes in these %i files?" ++msgstr "Änderungen in den gewählten %i Dateien revidieren?" ++ ++#: lib/index.tcl:348 ++msgid "Any unstaged changes will be permanently lost by the revert." ++msgstr "" ++"Alle nicht bereitgestellten Änderungen werden beim Revidieren verloren gehen." ++ ++#: lib/index.tcl:351 ++msgid "Do Nothing" ++msgstr "Nichts tun" ++ ++#: 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 "" ++"Zusammenführen kann nicht gleichzeitig mit Nachbessern durchgeführt werden.\n" ++"\n" ++"Sie müssen zuerst die Nachbesserungs-Version abschließen, bevor Sie " ++"zusammenführen können.\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 "" ++"Der letzte geladene Status stimmt nicht mehr mit dem Projektarchiv überein.\n" ++"\n" ++"Ein anderes Git-Programm hat das Projektarchiv seit dem letzten Laden " ++"geändert. Vor einem Zusammenführen muss neu geladen werden.\n" ++"\n" ++"Es wird gleich neu geladen.\n" ++ ++#: lib/merge.tcl:44 ++#, 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 "" ++"Zusammenführung mit Konflikten.\n" ++"\n" ++"Die Datei »%s« enthält Konflikte beim Zusammenführen. Sie müssen diese " ++"Konflikte per Hand auflösen. Anschließend müssen Sie die Datei wieder " ++"bereitstellen und eintragen, um die Zusammenführung abzuschließen. Erst " ++"danach kann eine neue Zusammenführung begonnen werden.\n" ++ ++#: lib/merge.tcl:54 ++#, 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 "" ++"Es liegen Änderungen vor.\n" ++"\n" ++"Die Datei »%s« wurde geändert. Sie sollten zuerst die bereitgestellte " ++"Version abschließen, bevor Sie eine Zusammenführung beginnen. Mit dieser " ++"Reihenfolge können Sie mögliche Konflikte beim Zusammenführen wesentlich " ++"einfacher beheben oder abbrechen.\n" ++ ++#: lib/merge.tcl:106 ++#, tcl-format ++msgid "%s of %s" ++msgstr "%s von %s" ++ ++#: lib/merge.tcl:119 ++#, tcl-format ++msgid "Merging %s and %s" ++msgstr "Zusammenführen von %s und %s" ++ ++#: lib/merge.tcl:131 ++msgid "Merge completed successfully." ++msgstr "Zusammenführen erfolgreich abgeschlossen." ++ ++#: lib/merge.tcl:133 ++msgid "Merge failed. Conflict resolution is required." ++msgstr "Zusammenführen fehlgeschlagen. Konfliktauflösung ist notwendig." ++ ++#: lib/merge.tcl:158 ++#, tcl-format ++msgid "Merge Into %s" ++msgstr "Zusammenführen in %s" ++ ++#: lib/merge.tcl:177 ++msgid "Revision To Merge" ++msgstr "Zusammenzuführende Version" ++ ++#: lib/merge.tcl:212 ++msgid "" ++"Cannot abort while amending.\n" ++"\n" ++"You must finish amending this commit.\n" ++msgstr "" ++"Abbruch der Nachbesserung ist nicht möglich.\n" ++"\n" ++"Sie müssen die Nachbesserung der Version abschließen.\n" ++ ++#: 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 "" ++"Zusammenführen abbrechen?\n" ++"\n" ++"Wenn Sie abbrechen, gehen alle noch nicht eingetragenen Änderungen " ++"verloren.\n" ++"\n" ++"Zusammenführen jetzt abbrechen?" ++ ++#: 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 "" ++"Änderungen zurücksetzen?\n" ++"\n" ++"Wenn Sie zurücksetzen, gehen alle noch nicht eingetragenen Änderungen " ++"verloren.\n" ++"\n" ++"Änderungen jetzt zurücksetzen?" ++ ++#: lib/merge.tcl:239 ++msgid "Aborting" ++msgstr "Abbruch" ++ ++#: lib/merge.tcl:266 ++msgid "Abort failed." ++msgstr "Abbruch fehlgeschlagen." ++ ++#: lib/merge.tcl:268 ++msgid "Abort completed. Ready." ++msgstr "Abbruch durchgeführt. Bereit." ++ ++#: lib/option.tcl:82 ++msgid "Restore Defaults" ++msgstr "Voreinstellungen wiederherstellen" ++ ++#: lib/option.tcl:86 ++msgid "Save" ++msgstr "Speichern" ++ ++#: lib/option.tcl:96 ++#, tcl-format ++msgid "%s Repository" ++msgstr "Projektarchiv %s" ++ ++#: lib/option.tcl:97 ++msgid "Global (All Repositories)" ++msgstr "Global (Alle Projektarchive)" ++ ++#: lib/option.tcl:103 ++msgid "User Name" ++msgstr "Benutzername" ++ ++#: lib/option.tcl:104 ++msgid "Email Address" ++msgstr "E-Mail-Adresse" ++ ++#: lib/option.tcl:106 ++msgid "Summarize Merge Commits" ++msgstr "Zusammenführungs-Versionen zusammenfassen" ++ ++#: lib/option.tcl:107 ++msgid "Merge Verbosity" ++msgstr "Ausführlichkeit der Zusammenführen-Meldungen" ++ ++#: lib/option.tcl:108 ++msgid "Show Diffstat After Merge" ++msgstr "Vergleichsstatistik nach Zusammenführen anzeigen" ++ ++#: lib/option.tcl:110 ++msgid "Trust File Modification Timestamps" ++msgstr "Auf Dateiänderungsdatum verlassen" ++ ++#: lib/option.tcl:111 ++msgid "Prune Tracking Branches During Fetch" ++msgstr "Übernahmezweige entfernen während Anforderung" ++ ++#: lib/option.tcl:112 ++msgid "Match Tracking Branches" ++msgstr "Passend zu Übernahmezweig" ++ ++#: lib/option.tcl:113 ++msgid "Number of Diff Context Lines" ++msgstr "Anzahl der Kontextzeilen beim Vergleich" ++ ++#: lib/option.tcl:114 ++msgid "New Branch Name Template" ++msgstr "Namensvorschlag für neue Zweige" ++ ++#: lib/option.tcl:176 ++msgid "Change Font" ++msgstr "Schriftart ändern" ++ ++#: lib/option.tcl:180 ++#, tcl-format ++msgid "Choose %s" ++msgstr "%s wählen" ++ ++#: lib/option.tcl:186 ++msgid "pt." ++msgstr "pt." ++ ++#: lib/option.tcl:200 ++msgid "Preferences" ++msgstr "Einstellungen" ++ ++#: lib/option.tcl:235 ++msgid "Failed to completely save options:" ++msgstr "Optionen konnten nicht gespeichert werden:" ++ ++#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 ++msgid "Delete Remote Branch" ++msgstr "Zweig im anderen Projektarchiv löschen" ++ ++#: lib/remote_branch_delete.tcl:47 ++msgid "From Repository" ++msgstr "Von Projektarchiv" ++ ++#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:123 ++msgid "Remote:" ++msgstr "Anderes Archiv:" ++ ++#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:138 ++msgid "Arbitrary URL:" ++msgstr "Kommunikation mit URL:" ++ ++#: lib/remote_branch_delete.tcl:84 ++msgid "Branches" ++msgstr "Zweige" ++ ++#: lib/remote_branch_delete.tcl:109 ++msgid "Delete Only If" ++msgstr "Löschen, falls" ++ ++#: lib/remote_branch_delete.tcl:111 ++msgid "Merged Into:" ++msgstr "Zusammenführen mit:" ++ ++#: lib/remote_branch_delete.tcl:119 ++msgid "Always (Do not perform merge checks)" ++msgstr "Immer (Keine Zusammenführungsprüfung)" ++ ++#: lib/remote_branch_delete.tcl:152 ++msgid "A branch is required for 'Merged Into'." ++msgstr "Für »Zusammenführen mit« muss ein Zweig angegeben werden." ++ ++#: lib/remote_branch_delete.tcl:184 ++#, tcl-format ++msgid "" ++"The following branches are not completely merged into %s:\n" ++"\n" ++" - %s" ++msgstr "" ++"Folgende Zweige sind noch nicht mit »%s« zusammengeführt:\n" ++"\n" ++" - %s" ++ ++#: lib/remote_branch_delete.tcl:189 ++#, 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 "" ++"Ein oder mehrere Zusammenführungen sind fehlgeschlagen, da Sie nicht die " ++"notwendigen Versionen vorher angefordert haben. Sie sollten versuchen, " ++"zuerst von »%s« anzufordern." ++ ++#: lib/remote_branch_delete.tcl:207 ++msgid "Please select one or more branches to delete." ++msgstr "Bitte wählen Sie mindestens einen Zweig, der gelöscht werden soll." ++ ++#: lib/remote_branch_delete.tcl:216 ++msgid "" ++"Recovering deleted branches is difficult.\n" ++"\n" ++"Delete the selected branches?" ++msgstr "" ++"Das Wiederherstellen von gelöschten Zweigen ist nur mit größerem Aufwand " ++"möglich.\n" ++"\n" ++"Sollen die ausgewählten Zweige gelöscht werden?" ++ ++#: lib/remote_branch_delete.tcl:226 ++#, tcl-format ++msgid "Deleting branches from %s" ++msgstr "Zweige auf »%s« werden gelöscht" ++ ++#: lib/remote_branch_delete.tcl:286 ++msgid "No repository selected." ++msgstr "Kein Projektarchiv ausgewählt." ++ ++#: lib/remote_branch_delete.tcl:291 ++#, tcl-format ++msgid "Scanning %s..." ++msgstr "»%s« laden..." ++ ++#: lib/remote.tcl:165 ++msgid "Prune from" ++msgstr "Entfernen von" ++ ++#: lib/remote.tcl:170 ++msgid "Fetch from" ++msgstr "Anfordern von" ++ ++#: lib/remote.tcl:213 ++msgid "Push to" ++msgstr "Versenden nach" ++ ++#: lib/shortcut.tcl:20 lib/shortcut.tcl:61 ++msgid "Cannot write shortcut:" ++msgstr "Fehler beim Schreiben der Verknüpfung:" ++ ++#: lib/shortcut.tcl:136 ++msgid "Cannot write icon:" ++msgstr "Fehler beim Erstellen des Icons:" ++ ++#: lib/status_bar.tcl:83 ++#, tcl-format ++msgid "%s ... %*i of %*i %s (%3i%%)" ++msgstr "%s ... %*i von %*i %s (%3i%%)" ++ ++#: lib/transport.tcl:6 ++#, tcl-format ++msgid "fetch %s" ++msgstr "»%s« anfordern" ++ ++#: lib/transport.tcl:7 ++#, tcl-format ++msgid "Fetching new changes from %s" ++msgstr "Neue Änderungen von »%s« holen" ++ ++#: lib/transport.tcl:18 ++#, tcl-format ++msgid "remote prune %s" ++msgstr "Entfernen von »%s« im anderen Archiv" ++ ++#: lib/transport.tcl:19 ++#, tcl-format ++msgid "Pruning tracking branches deleted from %s" ++msgstr "Übernahmezweige entfernen, die in »%s« gelöscht wurden" ++ ++#: lib/transport.tcl:25 lib/transport.tcl:71 ++#, tcl-format ++msgid "push %s" ++msgstr "»%s« versenden..." ++ ++#: lib/transport.tcl:26 ++#, tcl-format ++msgid "Pushing changes to %s" ++msgstr "Änderungen nach »%s« versenden" ++ ++#: lib/transport.tcl:72 ++#, tcl-format ++msgid "Pushing %s %s to %s" ++msgstr "%s %s nach %s versenden" ++ ++#: lib/transport.tcl:89 ++msgid "Push Branches" ++msgstr "Zweige versenden" ++ ++#: lib/transport.tcl:103 ++msgid "Source Branches" ++msgstr "Herkunftszweige" ++ ++#: lib/transport.tcl:120 ++msgid "Destination Repository" ++msgstr "Ziel-Projektarchiv" ++ ++#: lib/transport.tcl:158 ++msgid "Transfer Options" ++msgstr "Netzwerk-Einstellungen" ++ ++#: lib/transport.tcl:160 ++msgid "Force overwrite existing branch (may discard changes)" ++msgstr "" ++"Überschreiben von existierenden Zweigen erzwingen (könnte Änderungen löschen)" ++ ++#: lib/transport.tcl:164 ++msgid "Use thin pack (for slow network connections)" ++msgstr "Kompaktes Datenformat benutzen (für langsame Netzverbindungen)" ++ ++#: lib/transport.tcl:168 ++msgid "Include tags" ++msgstr "Mit Markierungen übertragen" ++ ++#~ msgid "Next >" ++#~ msgstr "Weiter >" ++ ++#~ msgid "Fetch" ++#~ msgstr "Anfordern" ++ ++#~ msgid "Unstaged Changes (Will Not Be Committed)" ++#~ msgstr "Nicht bereitgestellte Änderungen (werden nicht eingetragen)" diff --cc git-gui/po/git-gui.pot index 000000000,000000000..00f0f5922 new file mode 100644 --- /dev/null +++ b/git-gui/po/git-gui.pot @@@ -1,0 -1,0 +1,1704 @@@ ++# SOME DESCRIPTIVE TITLE. ++# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER ++# This file is distributed under the same license as the PACKAGE package. ++# FIRST AUTHOR , YEAR. ++# ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2007-10-10 04:04-0400\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=CHARSET\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++#: git-gui.sh:41 git-gui.sh:634 git-gui.sh:648 git-gui.sh:661 git-gui.sh:744 ++#: git-gui.sh:763 ++msgid "git-gui: fatal error" ++msgstr "" ++ ++#: git-gui.sh:595 ++#, tcl-format ++msgid "Invalid font specified in %s:" ++msgstr "" ++ ++#: git-gui.sh:620 ++msgid "Main Font" ++msgstr "" ++ ++#: git-gui.sh:621 ++msgid "Diff/Console Font" ++msgstr "" ++ ++#: git-gui.sh:635 ++msgid "Cannot find git in PATH." ++msgstr "" ++ ++#: git-gui.sh:662 ++msgid "Cannot parse Git version string:" ++msgstr "" ++ ++#: git-gui.sh:680 ++#, 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-gui.sh:853 ++msgid "Git directory not found:" ++msgstr "" ++ ++#: git-gui.sh:860 ++msgid "Cannot move to top of working directory:" ++msgstr "" ++ ++#: git-gui.sh:867 ++msgid "Cannot use funny .git directory:" ++msgstr "" ++ ++#: git-gui.sh:872 ++msgid "No working directory" ++msgstr "" ++ ++#: git-gui.sh:1019 ++msgid "Refreshing file status..." ++msgstr "" ++ ++#: git-gui.sh:1084 ++msgid "Scanning for modified files ..." ++msgstr "" ++ ++#: git-gui.sh:1259 lib/browser.tcl:245 ++msgid "Ready." ++msgstr "" ++ ++#: git-gui.sh:1525 ++msgid "Unmodified" ++msgstr "" ++ ++#: git-gui.sh:1527 ++msgid "Modified, not staged" ++msgstr "" ++ ++#: git-gui.sh:1528 git-gui.sh:1533 ++msgid "Staged for commit" ++msgstr "" ++ ++#: git-gui.sh:1529 git-gui.sh:1534 ++msgid "Portions staged for commit" ++msgstr "" ++ ++#: git-gui.sh:1530 git-gui.sh:1535 ++msgid "Staged for commit, missing" ++msgstr "" ++ ++#: git-gui.sh:1532 ++msgid "Untracked, not staged" ++msgstr "" ++ ++#: git-gui.sh:1537 ++msgid "Missing" ++msgstr "" ++ ++#: git-gui.sh:1538 ++msgid "Staged for removal" ++msgstr "" ++ ++#: git-gui.sh:1539 ++msgid "Staged for removal, still present" ++msgstr "" ++ ++#: git-gui.sh:1541 git-gui.sh:1542 git-gui.sh:1543 git-gui.sh:1544 ++msgid "Requires merge resolution" ++msgstr "" ++ ++#: git-gui.sh:1579 ++msgid "Starting gitk... please wait..." ++msgstr "" ++ ++#: git-gui.sh:1588 ++#, tcl-format ++msgid "" ++"Unable to start gitk:\n" ++"\n" ++"%s does not exist" ++msgstr "" ++ ++#: git-gui.sh:1788 lib/choose_repository.tcl:32 ++msgid "Repository" ++msgstr "" ++ ++#: git-gui.sh:1789 ++msgid "Edit" ++msgstr "" ++ ++#: git-gui.sh:1791 lib/choose_rev.tcl:560 ++msgid "Branch" ++msgstr "" ++ ++#: git-gui.sh:1794 lib/choose_rev.tcl:547 ++msgid "Commit@@noun" ++msgstr "" ++ ++#: git-gui.sh:1797 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168 ++msgid "Merge" ++msgstr "" ++ ++#: git-gui.sh:1798 lib/choose_rev.tcl:556 ++msgid "Remote" ++msgstr "" ++ ++#: git-gui.sh:1807 ++msgid "Browse Current Branch's Files" ++msgstr "" ++ ++#: git-gui.sh:1811 ++msgid "Browse Branch Files..." ++msgstr "" ++ ++#: git-gui.sh:1816 ++msgid "Visualize Current Branch's History" ++msgstr "" ++ ++#: git-gui.sh:1820 ++msgid "Visualize All Branch History" ++msgstr "" ++ ++#: git-gui.sh:1827 ++#, tcl-format ++msgid "Browse %s's Files" ++msgstr "" ++ ++#: git-gui.sh:1829 ++#, tcl-format ++msgid "Visualize %s's History" ++msgstr "" ++ ++#: git-gui.sh:1834 lib/database.tcl:27 lib/database.tcl:67 ++msgid "Database Statistics" ++msgstr "" ++ ++#: git-gui.sh:1837 lib/database.tcl:34 ++msgid "Compress Database" ++msgstr "" ++ ++#: git-gui.sh:1840 ++msgid "Verify Database" ++msgstr "" ++ ++#: git-gui.sh:1847 git-gui.sh:1851 git-gui.sh:1855 lib/shortcut.tcl:9 ++#: lib/shortcut.tcl:45 lib/shortcut.tcl:84 ++msgid "Create Desktop Icon" ++msgstr "" ++ ++#: git-gui.sh:1860 lib/choose_repository.tcl:36 lib/choose_repository.tcl:95 ++msgid "Quit" ++msgstr "" ++ ++#: git-gui.sh:1867 ++msgid "Undo" ++msgstr "" ++ ++#: git-gui.sh:1870 ++msgid "Redo" ++msgstr "" ++ ++#: git-gui.sh:1874 git-gui.sh:2366 ++msgid "Cut" ++msgstr "" ++ ++#: git-gui.sh:1877 git-gui.sh:2369 git-gui.sh:2440 git-gui.sh:2512 ++#: lib/console.tcl:67 ++msgid "Copy" ++msgstr "" ++ ++#: git-gui.sh:1880 git-gui.sh:2372 ++msgid "Paste" ++msgstr "" ++ ++#: git-gui.sh:1883 git-gui.sh:2375 lib/branch_delete.tcl:26 ++#: lib/remote_branch_delete.tcl:38 ++msgid "Delete" ++msgstr "" ++ ++#: git-gui.sh:1887 git-gui.sh:2379 git-gui.sh:2516 lib/console.tcl:69 ++msgid "Select All" ++msgstr "" ++ ++#: git-gui.sh:1896 ++msgid "Create..." ++msgstr "" ++ ++#: git-gui.sh:1902 ++msgid "Checkout..." ++msgstr "" ++ ++#: git-gui.sh:1908 ++msgid "Rename..." ++msgstr "" ++ ++#: git-gui.sh:1913 git-gui.sh:2012 ++msgid "Delete..." ++msgstr "" ++ ++#: git-gui.sh:1918 ++msgid "Reset..." ++msgstr "" ++ ++#: git-gui.sh:1930 git-gui.sh:2313 ++msgid "New Commit" ++msgstr "" ++ ++#: git-gui.sh:1938 git-gui.sh:2320 ++msgid "Amend Last Commit" ++msgstr "" ++ ++#: git-gui.sh:1947 git-gui.sh:2280 lib/remote_branch_delete.tcl:99 ++msgid "Rescan" ++msgstr "" ++ ++#: git-gui.sh:1953 ++msgid "Stage To Commit" ++msgstr "" ++ ++#: git-gui.sh:1958 ++msgid "Stage Changed Files To Commit" ++msgstr "" ++ ++#: git-gui.sh:1964 ++msgid "Unstage From Commit" ++msgstr "" ++ ++#: git-gui.sh:1969 lib/index.tcl:352 ++msgid "Revert Changes" ++msgstr "" ++ ++#: git-gui.sh:1976 git-gui.sh:2292 git-gui.sh:2390 ++msgid "Sign Off" ++msgstr "" ++ ++#: git-gui.sh:1980 git-gui.sh:2296 ++msgid "Commit@@verb" ++msgstr "" ++ ++#: git-gui.sh:1991 ++msgid "Local Merge..." ++msgstr "" ++ ++#: git-gui.sh:1996 ++msgid "Abort Merge..." ++msgstr "" ++ ++#: git-gui.sh:2008 ++msgid "Push..." ++msgstr "" ++ ++#: git-gui.sh:2019 lib/choose_repository.tcl:41 ++msgid "Apple" ++msgstr "" ++ ++#: git-gui.sh:2022 git-gui.sh:2044 lib/about.tcl:13 ++#: lib/choose_repository.tcl:44 lib/choose_repository.tcl:50 ++#, tcl-format ++msgid "About %s" ++msgstr "" ++ ++#: git-gui.sh:2026 ++msgid "Preferences..." ++msgstr "" ++ ++#: git-gui.sh:2034 git-gui.sh:2558 ++msgid "Options..." ++msgstr "" ++ ++#: git-gui.sh:2040 lib/choose_repository.tcl:47 ++msgid "Help" ++msgstr "" ++ ++#: git-gui.sh:2081 ++msgid "Online Documentation" ++msgstr "" ++ ++#: git-gui.sh:2165 ++#, tcl-format ++msgid "fatal: cannot stat path %s: No such file or directory" ++msgstr "" ++ ++#: git-gui.sh:2198 ++msgid "Current Branch:" ++msgstr "" ++ ++#: git-gui.sh:2219 ++msgid "Staged Changes (Will Commit)" ++msgstr "" ++ ++#: git-gui.sh:2239 ++msgid "Unstaged Changes" ++msgstr "" ++ ++#: git-gui.sh:2286 ++msgid "Stage Changed" ++msgstr "" ++ ++#: git-gui.sh:2302 lib/transport.tcl:93 lib/transport.tcl:182 ++msgid "Push" ++msgstr "" ++ ++#: git-gui.sh:2332 ++msgid "Initial Commit Message:" ++msgstr "" ++ ++#: git-gui.sh:2333 ++msgid "Amended Commit Message:" ++msgstr "" ++ ++#: git-gui.sh:2334 ++msgid "Amended Initial Commit Message:" ++msgstr "" ++ ++#: git-gui.sh:2335 ++msgid "Amended Merge Commit Message:" ++msgstr "" ++ ++#: git-gui.sh:2336 ++msgid "Merge Commit Message:" ++msgstr "" ++ ++#: git-gui.sh:2337 ++msgid "Commit Message:" ++msgstr "" ++ ++#: git-gui.sh:2382 git-gui.sh:2520 lib/console.tcl:71 ++msgid "Copy All" ++msgstr "" ++ ++#: git-gui.sh:2406 lib/blame.tcl:104 ++msgid "File:" ++msgstr "" ++ ++#: git-gui.sh:2508 ++msgid "Refresh" ++msgstr "" ++ ++#: git-gui.sh:2529 ++msgid "Apply/Reverse Hunk" ++msgstr "" ++ ++#: git-gui.sh:2535 ++msgid "Decrease Font Size" ++msgstr "" ++ ++#: git-gui.sh:2539 ++msgid "Increase Font Size" ++msgstr "" ++ ++#: git-gui.sh:2544 ++msgid "Show Less Context" ++msgstr "" ++ ++#: git-gui.sh:2551 ++msgid "Show More Context" ++msgstr "" ++ ++#: git-gui.sh:2565 ++msgid "Unstage Hunk From Commit" ++msgstr "" ++ ++#: git-gui.sh:2567 ++msgid "Stage Hunk For Commit" ++msgstr "" ++ ++#: git-gui.sh:2586 ++msgid "Initializing..." ++msgstr "" ++ ++#: git-gui.sh:2677 ++#, 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 "" ++ ++#: git-gui.sh:2707 ++msgid "" ++"\n" ++"This is due to a known issue with the\n" ++"Tcl binary distributed by Cygwin." ++msgstr "" ++ ++#: git-gui.sh:2712 ++#, 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 "" ++ ++#: lib/about.tcl:25 ++msgid "git-gui - a graphical user interface for Git." ++msgstr "" ++ ++#: lib/blame.tcl:77 ++msgid "File Viewer" ++msgstr "" ++ ++#: lib/blame.tcl:81 ++msgid "Commit:" ++msgstr "" ++ ++#: lib/blame.tcl:249 ++msgid "Copy Commit" ++msgstr "" ++ ++#: lib/blame.tcl:369 ++#, tcl-format ++msgid "Reading %s..." ++msgstr "" ++ ++#: lib/blame.tcl:473 ++msgid "Loading copy/move tracking annotations..." ++msgstr "" ++ ++#: lib/blame.tcl:493 ++msgid "lines annotated" ++msgstr "" ++ ++#: lib/blame.tcl:674 ++msgid "Loading original location annotations..." ++msgstr "" ++ ++#: lib/blame.tcl:677 ++msgid "Annotation complete." ++msgstr "" ++ ++#: lib/blame.tcl:731 ++msgid "Loading annotation..." ++msgstr "" ++ ++#: lib/blame.tcl:787 ++msgid "Author:" ++msgstr "" ++ ++#: lib/blame.tcl:791 ++msgid "Committer:" ++msgstr "" ++ ++#: lib/blame.tcl:796 ++msgid "Original File:" ++msgstr "" ++ ++#: lib/blame.tcl:910 ++msgid "Originally By:" ++msgstr "" ++ ++#: lib/blame.tcl:916 ++msgid "In File:" ++msgstr "" ++ ++#: lib/blame.tcl:921 ++msgid "Copied Or Moved Here By:" ++msgstr "" ++ ++#: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19 ++msgid "Checkout Branch" ++msgstr "" ++ ++#: lib/branch_checkout.tcl:23 ++msgid "Checkout" ++msgstr "" ++ ++#: lib/branch_checkout.tcl:27 lib/branch_create.tcl:35 ++#: lib/branch_delete.tcl:32 lib/branch_rename.tcl:30 lib/browser.tcl:281 ++#: lib/checkout_op.tcl:522 lib/choose_font.tcl:43 lib/merge.tcl:172 ++#: lib/option.tcl:90 lib/remote_branch_delete.tcl:42 lib/transport.tcl:97 ++msgid "Cancel" ++msgstr "" ++ ++#: lib/branch_checkout.tcl:32 lib/browser.tcl:286 ++msgid "Revision" ++msgstr "" ++ ++#: lib/branch_checkout.tcl:36 lib/branch_create.tcl:69 lib/option.tcl:202 ++msgid "Options" ++msgstr "" ++ ++#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92 ++msgid "Fetch Tracking Branch" ++msgstr "" ++ ++#: lib/branch_checkout.tcl:44 ++msgid "Detach From Local Branch" ++msgstr "" ++ ++#: lib/branch_create.tcl:22 ++msgid "Create Branch" ++msgstr "" ++ ++#: lib/branch_create.tcl:27 ++msgid "Create New Branch" ++msgstr "" ++ ++#: lib/branch_create.tcl:31 lib/choose_repository.tcl:199 ++msgid "Create" ++msgstr "" ++ ++#: lib/branch_create.tcl:40 ++msgid "Branch Name" ++msgstr "" ++ ++#: lib/branch_create.tcl:43 ++msgid "Name:" ++msgstr "" ++ ++#: lib/branch_create.tcl:58 ++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:85 lib/checkout_op.tcl:514 ++msgid "Reset" ++msgstr "" ++ ++#: lib/branch_create.tcl:97 ++msgid "Checkout After Creation" ++msgstr "" ++ ++#: lib/branch_create.tcl:131 ++msgid "Please select a tracking branch." ++msgstr "" ++ ++#: lib/branch_create.tcl:140 ++#, tcl-format ++msgid "Tracking branch %s is not a branch in the remote repository." ++msgstr "" ++ ++#: lib/branch_create.tcl:153 lib/branch_rename.tcl:86 ++msgid "Please supply a branch name." ++msgstr "" ++ ++#: lib/branch_create.tcl:164 lib/branch_rename.tcl:106 ++#, tcl-format ++msgid "'%s' is not an acceptable branch name." ++msgstr "" ++ ++#: lib/branch_delete.tcl:15 ++msgid "Delete Branch" ++msgstr "" ++ ++#: lib/branch_delete.tcl:20 ++msgid "Delete Local Branch" ++msgstr "" ++ ++#: lib/branch_delete.tcl:37 ++msgid "Local Branches" ++msgstr "" ++ ++#: lib/branch_delete.tcl:52 ++msgid "Delete Only If Merged Into" ++msgstr "" ++ ++#: lib/branch_delete.tcl:54 ++msgid "Always (Do not perform merge test.)" ++msgstr "" ++ ++#: lib/branch_delete.tcl:103 ++#, tcl-format ++msgid "The following branches are not completely merged into %s:" ++msgstr "" ++ ++#: lib/branch_delete.tcl:115 ++msgid "" ++"Recovering deleted branches is difficult. \n" ++"\n" ++" Delete the selected branches?" ++msgstr "" ++ ++#: lib/branch_delete.tcl:141 ++#, tcl-format ++msgid "" ++"Failed to delete branches:\n" ++"%s" ++msgstr "" ++ ++#: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22 ++msgid "Rename Branch" ++msgstr "" ++ ++#: lib/branch_rename.tcl:26 ++msgid "Rename" ++msgstr "" ++ ++#: lib/branch_rename.tcl:36 ++msgid "Branch:" ++msgstr "" ++ ++#: lib/branch_rename.tcl:39 ++msgid "New Name:" ++msgstr "" ++ ++#: lib/branch_rename.tcl:75 ++msgid "Please select a branch to rename." ++msgstr "" ++ ++#: lib/branch_rename.tcl:96 lib/checkout_op.tcl:179 ++#, tcl-format ++msgid "Branch '%s' already exists." ++msgstr "" ++ ++#: lib/branch_rename.tcl:117 ++#, tcl-format ++msgid "Failed to rename '%s'." ++msgstr "" ++ ++#: lib/browser.tcl:17 ++msgid "Starting..." ++msgstr "" ++ ++#: lib/browser.tcl:26 ++msgid "File Browser" ++msgstr "" ++ ++#: lib/browser.tcl:125 lib/browser.tcl:142 ++#, tcl-format ++msgid "Loading %s..." ++msgstr "" ++ ++#: lib/browser.tcl:186 ++msgid "[Up To Parent]" ++msgstr "" ++ ++#: lib/browser.tcl:266 lib/browser.tcl:272 ++msgid "Browse Branch Files" ++msgstr "" ++ ++#: lib/browser.tcl:277 lib/choose_repository.tcl:215 ++#: lib/choose_repository.tcl:305 lib/choose_repository.tcl:315 ++#: lib/choose_repository.tcl:811 ++msgid "Browse" ++msgstr "" ++ ++#: lib/checkout_op.tcl:79 ++#, tcl-format ++msgid "Fetching %s from %s" ++msgstr "" ++ ++#: lib/checkout_op.tcl:127 ++#, tcl-format ++msgid "fatal: Cannot resolve %s" ++msgstr "" ++ ++#: lib/checkout_op.tcl:140 lib/console.tcl:79 lib/database.tcl:31 ++msgid "Close" ++msgstr "" ++ ++#: lib/checkout_op.tcl:169 ++#, tcl-format ++msgid "Branch '%s' does not exist." ++msgstr "" ++ ++#: lib/checkout_op.tcl:206 ++#, tcl-format ++msgid "" ++"Branch '%s' already exists.\n" ++"\n" ++"It cannot fast-forward to %s.\n" ++"A merge is required." ++msgstr "" ++ ++#: lib/checkout_op.tcl:220 ++#, tcl-format ++msgid "Merge strategy '%s' not supported." ++msgstr "" ++ ++#: lib/checkout_op.tcl:239 ++#, tcl-format ++msgid "Failed to update '%s'." ++msgstr "" ++ ++#: lib/checkout_op.tcl:251 ++msgid "Staging area (index) is already locked." ++msgstr "" ++ ++#: lib/checkout_op.tcl:266 ++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 "" ++ ++#: lib/checkout_op.tcl:322 ++#, tcl-format ++msgid "Updating working directory to '%s'..." ++msgstr "" ++ ++#: lib/checkout_op.tcl:353 ++#, tcl-format ++msgid "Aborted checkout of '%s' (file level merging is required)." ++msgstr "" ++ ++#: lib/checkout_op.tcl:354 ++msgid "File level merge required." ++msgstr "" ++ ++#: lib/checkout_op.tcl:358 ++#, tcl-format ++msgid "Staying on branch '%s'." ++msgstr "" ++ ++#: lib/checkout_op.tcl:429 ++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 "" ++ ++#: lib/checkout_op.tcl:446 ++#, tcl-format ++msgid "Checked out '%s'." ++msgstr "" ++ ++#: lib/checkout_op.tcl:478 ++#, tcl-format ++msgid "Resetting '%s' to '%s' will lose the following commits:" ++msgstr "" ++ ++#: lib/checkout_op.tcl:500 ++msgid "Recovering lost commits may not be easy." ++msgstr "" ++ ++#: lib/checkout_op.tcl:505 ++#, tcl-format ++msgid "Reset '%s'?" ++msgstr "" ++ ++#: lib/checkout_op.tcl:510 lib/merge.tcl:164 ++msgid "Visualize" ++msgstr "" ++ ++#: lib/checkout_op.tcl:578 ++#, 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 "" ++ ++#: lib/choose_font.tcl:39 ++msgid "Select" ++msgstr "" ++ ++#: lib/choose_font.tcl:53 ++msgid "Font Family" ++msgstr "" ++ ++#: lib/choose_font.tcl:73 ++msgid "Font Size" ++msgstr "" ++ ++#: lib/choose_font.tcl:90 ++msgid "Font Example" ++msgstr "" ++ ++#: lib/choose_font.tcl:101 ++msgid "" ++"This is example text.\n" ++"If you like this text, it can be your font." ++msgstr "" ++ ++#: lib/choose_repository.tcl:25 ++msgid "Git Gui" ++msgstr "" ++ ++#: lib/choose_repository.tcl:69 lib/choose_repository.tcl:204 ++msgid "Create New Repository" ++msgstr "" ++ ++#: lib/choose_repository.tcl:74 lib/choose_repository.tcl:291 ++msgid "Clone Existing Repository" ++msgstr "" ++ ++#: lib/choose_repository.tcl:79 lib/choose_repository.tcl:800 ++msgid "Open Existing Repository" ++msgstr "" ++ ++#: lib/choose_repository.tcl:91 ++msgid "Next >" ++msgstr "" ++ ++#: lib/choose_repository.tcl:152 ++#, tcl-format ++msgid "Location %s already exists." ++msgstr "" ++ ++#: lib/choose_repository.tcl:158 lib/choose_repository.tcl:165 ++#: lib/choose_repository.tcl:172 ++#, tcl-format ++msgid "Failed to create repository %s:" ++msgstr "" ++ ++#: lib/choose_repository.tcl:209 lib/choose_repository.tcl:309 ++msgid "Directory:" ++msgstr "" ++ ++#: lib/choose_repository.tcl:238 lib/choose_repository.tcl:363 ++#: lib/choose_repository.tcl:834 ++msgid "Git Repository" ++msgstr "" ++ ++#: lib/choose_repository.tcl:253 lib/choose_repository.tcl:260 ++#, tcl-format ++msgid "Directory %s already exists." ++msgstr "" ++ ++#: lib/choose_repository.tcl:265 ++#, tcl-format ++msgid "File %s already exists." ++msgstr "" ++ ++#: lib/choose_repository.tcl:286 ++msgid "Clone" ++msgstr "" ++ ++#: lib/choose_repository.tcl:299 ++msgid "URL:" ++msgstr "" ++ ++#: lib/choose_repository.tcl:319 ++msgid "Clone Type:" ++msgstr "" ++ ++#: lib/choose_repository.tcl:325 ++msgid "Standard (Fast, Semi-Redundant, Hardlinks)" ++msgstr "" ++ ++#: lib/choose_repository.tcl:331 ++msgid "Full Copy (Slower, Redundant Backup)" ++msgstr "" ++ ++#: lib/choose_repository.tcl:337 ++msgid "Shared (Fastest, Not Recommended, No Backup)" ++msgstr "" ++ ++#: lib/choose_repository.tcl:369 lib/choose_repository.tcl:418 ++#: lib/choose_repository.tcl:560 lib/choose_repository.tcl:630 ++#: lib/choose_repository.tcl:840 lib/choose_repository.tcl:848 ++#, tcl-format ++msgid "Not a Git repository: %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:405 ++msgid "Standard only available for local repository." ++msgstr "" ++ ++#: lib/choose_repository.tcl:409 ++msgid "Shared only available for local repository." ++msgstr "" ++ ++#: lib/choose_repository.tcl:439 ++msgid "Failed to configure origin" ++msgstr "" ++ ++#: lib/choose_repository.tcl:451 ++msgid "Counting objects" ++msgstr "" ++ ++#: lib/choose_repository.tcl:452 ++msgid "buckets" ++msgstr "" ++ ++#: lib/choose_repository.tcl:476 ++#, tcl-format ++msgid "Unable to copy objects/info/alternates: %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:512 ++#, tcl-format ++msgid "Nothing to clone from %s." ++msgstr "" ++ ++#: lib/choose_repository.tcl:514 lib/choose_repository.tcl:728 ++#: lib/choose_repository.tcl:740 ++msgid "The 'master' branch has not been initialized." ++msgstr "" ++ ++#: lib/choose_repository.tcl:527 ++msgid "Hardlinks are unavailable. Falling back to copying." ++msgstr "" ++ ++#: lib/choose_repository.tcl:539 ++#, tcl-format ++msgid "Cloning from %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:570 ++msgid "Copying objects" ++msgstr "" ++ ++#: lib/choose_repository.tcl:571 ++msgid "KiB" ++msgstr "" ++ ++#: lib/choose_repository.tcl:595 ++#, tcl-format ++msgid "Unable to copy object: %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:605 ++msgid "Linking objects" ++msgstr "" ++ ++#: lib/choose_repository.tcl:606 ++msgid "objects" ++msgstr "" ++ ++#: lib/choose_repository.tcl:614 ++#, tcl-format ++msgid "Unable to hardlink object: %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:669 ++msgid "Cannot fetch branches and objects. See console output for details." ++msgstr "" ++ ++#: lib/choose_repository.tcl:680 ++msgid "Cannot fetch tags. See console output for details." ++msgstr "" ++ ++#: lib/choose_repository.tcl:704 ++msgid "Cannot determine HEAD. See console output for details." ++msgstr "" ++ ++#: lib/choose_repository.tcl:713 ++#, tcl-format ++msgid "Unable to cleanup %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:719 ++msgid "Clone failed." ++msgstr "" ++ ++#: lib/choose_repository.tcl:726 ++msgid "No default branch obtained." ++msgstr "" ++ ++#: lib/choose_repository.tcl:737 ++#, tcl-format ++msgid "Cannot resolve %s as a commit." ++msgstr "" ++ ++#: lib/choose_repository.tcl:749 ++msgid "Creating working directory" ++msgstr "" ++ ++#: lib/choose_repository.tcl:750 lib/index.tcl:15 lib/index.tcl:80 ++#: lib/index.tcl:149 ++msgid "files" ++msgstr "" ++ ++#: lib/choose_repository.tcl:779 ++msgid "Initial file checkout failed." ++msgstr "" ++ ++#: lib/choose_repository.tcl:795 ++msgid "Open" ++msgstr "" ++ ++#: lib/choose_repository.tcl:805 ++msgid "Repository:" ++msgstr "" ++ ++#: lib/choose_repository.tcl:854 ++#, tcl-format ++msgid "Failed to open repository %s:" ++msgstr "" ++ ++#: lib/choose_rev.tcl:53 ++msgid "This Detached Checkout" ++msgstr "" ++ ++#: lib/choose_rev.tcl:60 ++msgid "Revision Expression:" ++msgstr "" ++ ++#: lib/choose_rev.tcl:74 ++msgid "Local Branch" ++msgstr "" ++ ++#: lib/choose_rev.tcl:79 ++msgid "Tracking Branch" ++msgstr "" ++ ++#: lib/choose_rev.tcl:84 lib/choose_rev.tcl:537 ++msgid "Tag" ++msgstr "" ++ ++#: lib/choose_rev.tcl:317 ++#, tcl-format ++msgid "Invalid revision: %s" ++msgstr "" ++ ++#: lib/choose_rev.tcl:338 ++msgid "No revision selected." ++msgstr "" ++ ++#: lib/choose_rev.tcl:346 ++msgid "Revision expression is empty." ++msgstr "" ++ ++#: lib/choose_rev.tcl:530 ++msgid "Updated" ++msgstr "" ++ ++#: lib/choose_rev.tcl:558 ++msgid "URL" ++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 "" ++ ++#: 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 "" ++ ++#: lib/commit.tcl:49 ++msgid "Error loading commit data for amend:" ++msgstr "" ++ ++#: lib/commit.tcl:76 ++msgid "Unable to obtain your identity:" ++msgstr "" ++ ++#: lib/commit.tcl:81 ++msgid "Invalid GIT_COMMITTER_IDENT:" ++msgstr "" ++ ++#: lib/commit.tcl:133 ++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 "" ++ ++#: lib/commit.tcl:154 ++#, 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 "" ++ ++#: lib/commit.tcl:162 ++#, tcl-format ++msgid "" ++"Unknown file state %s detected.\n" ++"\n" ++"File %s cannot be committed by this program.\n" ++msgstr "" ++ ++#: lib/commit.tcl:170 ++msgid "" ++"No changes to commit.\n" ++"\n" ++"You must stage at least 1 file before you can commit.\n" ++msgstr "" ++ ++#: lib/commit.tcl:183 ++msgid "" ++"Please supply a commit message.\n" ++"\n" ++"A good commit message has the following format:\n" ++"\n" ++"- First line: Describe in one sentance what you did.\n" ++"- Second line: Blank\n" ++"- Remaining lines: Describe why this change is good.\n" ++msgstr "" ++ ++#: lib/commit.tcl:257 ++msgid "write-tree failed:" ++msgstr "" ++ ++#: lib/commit.tcl:275 ++#, tcl-format ++msgid "Commit %s appears to be corrupt" ++msgstr "" ++ ++#: lib/commit.tcl:279 ++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 "" ++ ++#: lib/commit.tcl:286 ++msgid "No changes to commit." ++msgstr "" ++ ++#: lib/commit.tcl:303 ++#, tcl-format ++msgid "warning: Tcl does not support encoding '%s'." ++msgstr "" ++ ++#: lib/commit.tcl:317 ++msgid "commit-tree failed:" ++msgstr "" ++ ++#: lib/commit.tcl:339 ++msgid "update-ref failed:" ++msgstr "" ++ ++#: lib/commit.tcl:430 ++#, tcl-format ++msgid "Created commit %s: %s" ++msgstr "" ++ ++#: lib/console.tcl:57 ++msgid "Working... please wait..." ++msgstr "" ++ ++#: lib/console.tcl:183 ++msgid "Success" ++msgstr "" ++ ++#: lib/console.tcl:196 ++msgid "Error: Command Failed" ++msgstr "" ++ ++#: lib/database.tcl:43 ++msgid "Number of loose objects" ++msgstr "" ++ ++#: lib/database.tcl:44 ++msgid "Disk space used by loose objects" ++msgstr "" ++ ++#: lib/database.tcl:45 ++msgid "Number of packed objects" ++msgstr "" ++ ++#: lib/database.tcl:46 ++msgid "Number of packs" ++msgstr "" ++ ++#: lib/database.tcl:47 ++msgid "Disk space used by packed objects" ++msgstr "" ++ ++#: lib/database.tcl:48 ++msgid "Packed objects waiting for pruning" ++msgstr "" ++ ++#: lib/database.tcl:49 ++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 "" ++ ++#: lib/database.tcl:108 ++#, 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 when more than %i loose objects exist.\n" ++"\n" ++"Compress the database now?" ++msgstr "" ++ ++#: lib/date.tcl:25 ++#, tcl-format ++msgid "Invalid date from Git: %s" ++msgstr "" ++ ++#: lib/diff.tcl:42 ++#, 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 "" ++ ++#: lib/diff.tcl:81 ++#, tcl-format ++msgid "Loading diff of %s..." ++msgstr "" ++ ++#: lib/diff.tcl:114 lib/diff.tcl:184 ++#, tcl-format ++msgid "Unable to display %s" ++msgstr "" ++ ++#: lib/diff.tcl:115 ++msgid "Error loading file:" ++msgstr "" ++ ++#: lib/diff.tcl:122 ++msgid "Git Repository (subproject)" ++msgstr "" ++ ++#: lib/diff.tcl:134 ++msgid "* Binary file (not showing content)." ++msgstr "" ++ ++#: lib/diff.tcl:185 ++msgid "Error loading diff:" ++msgstr "" ++ ++#: lib/diff.tcl:302 ++msgid "Failed to unstage selected hunk." ++msgstr "" ++ ++#: lib/diff.tcl:309 ++msgid "Failed to stage selected hunk." ++msgstr "" ++ ++#: lib/error.tcl:12 lib/error.tcl:102 ++msgid "error" ++msgstr "" ++ ++#: lib/error.tcl:28 ++msgid "warning" ++msgstr "" ++ ++#: lib/error.tcl:81 ++msgid "You must correct the above errors before committing." ++msgstr "" ++ ++#: lib/index.tcl:241 ++#, tcl-format ++msgid "Unstaging %s from commit" ++msgstr "" ++ ++#: lib/index.tcl:285 ++#, tcl-format ++msgid "Adding %s" ++msgstr "" ++ ++#: lib/index.tcl:340 ++#, tcl-format ++msgid "Revert changes in file %s?" ++msgstr "" ++ ++#: lib/index.tcl:342 ++#, tcl-format ++msgid "Revert changes in these %i files?" ++msgstr "" ++ ++#: lib/index.tcl:348 ++msgid "Any unstaged changes will be permanently lost by the revert." ++msgstr "" ++ ++#: lib/index.tcl:351 ++msgid "Do Nothing" ++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 "" ++ ++#: 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 "" ++ ++#: lib/merge.tcl:44 ++#, 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 "" ++ ++#: lib/merge.tcl:54 ++#, 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 "" ++ ++#: lib/merge.tcl:106 ++#, tcl-format ++msgid "%s of %s" ++msgstr "" ++ ++#: lib/merge.tcl:119 ++#, tcl-format ++msgid "Merging %s and %s" ++msgstr "" ++ ++#: lib/merge.tcl:131 ++msgid "Merge completed successfully." ++msgstr "" ++ ++#: lib/merge.tcl:133 ++msgid "Merge failed. Conflict resolution is required." ++msgstr "" ++ ++#: lib/merge.tcl:158 ++#, tcl-format ++msgid "Merge Into %s" ++msgstr "" ++ ++#: lib/merge.tcl:177 ++msgid "Revision To Merge" ++msgstr "" ++ ++#: lib/merge.tcl:212 ++msgid "" ++"Cannot abort while amending.\n" ++"\n" ++"You must finish amending this commit.\n" ++msgstr "" ++ ++#: 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 "" ++ ++#: 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 "" ++ ++#: lib/merge.tcl:239 ++msgid "Aborting" ++msgstr "" ++ ++#: lib/merge.tcl:266 ++msgid "Abort failed." ++msgstr "" ++ ++#: lib/merge.tcl:268 ++msgid "Abort completed. Ready." ++msgstr "" ++ ++#: lib/option.tcl:82 ++msgid "Restore Defaults" ++msgstr "" ++ ++#: lib/option.tcl:86 ++msgid "Save" ++msgstr "" ++ ++#: lib/option.tcl:96 ++#, tcl-format ++msgid "%s Repository" ++msgstr "" ++ ++#: lib/option.tcl:97 ++msgid "Global (All Repositories)" ++msgstr "" ++ ++#: lib/option.tcl:103 ++msgid "User Name" ++msgstr "" ++ ++#: lib/option.tcl:104 ++msgid "Email Address" ++msgstr "" ++ ++#: lib/option.tcl:106 ++msgid "Summarize Merge Commits" ++msgstr "" ++ ++#: lib/option.tcl:107 ++msgid "Merge Verbosity" ++msgstr "" ++ ++#: lib/option.tcl:108 ++msgid "Show Diffstat After Merge" ++msgstr "" ++ ++#: lib/option.tcl:110 ++msgid "Trust File Modification Timestamps" ++msgstr "" ++ ++#: lib/option.tcl:111 ++msgid "Prune Tracking Branches During Fetch" ++msgstr "" ++ ++#: lib/option.tcl:112 ++msgid "Match Tracking Branches" ++msgstr "" ++ ++#: lib/option.tcl:113 ++msgid "Number of Diff Context Lines" ++msgstr "" ++ ++#: lib/option.tcl:114 ++msgid "New Branch Name Template" ++msgstr "" ++ ++#: lib/option.tcl:176 ++msgid "Change Font" ++msgstr "" ++ ++#: lib/option.tcl:180 ++#, tcl-format ++msgid "Choose %s" ++msgstr "" ++ ++#: lib/option.tcl:186 ++msgid "pt." ++msgstr "" ++ ++#: lib/option.tcl:200 ++msgid "Preferences" ++msgstr "" ++ ++#: lib/option.tcl:235 ++msgid "Failed to completely save options:" ++msgstr "" ++ ++#: lib/remote.tcl:165 ++msgid "Prune from" ++msgstr "" ++ ++#: lib/remote.tcl:170 ++msgid "Fetch from" ++msgstr "" ++ ++#: lib/remote.tcl:213 ++msgid "Push to" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 ++msgid "Delete Remote Branch" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:47 ++msgid "From Repository" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:123 ++msgid "Remote:" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:138 ++msgid "Arbitrary URL:" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:84 ++msgid "Branches" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:109 ++msgid "Delete Only If" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:111 ++msgid "Merged Into:" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:119 ++msgid "Always (Do not perform merge checks)" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:152 ++msgid "A branch is required for 'Merged Into'." ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:184 ++#, tcl-format ++msgid "" ++"The following branches are not completely merged into %s:\n" ++"\n" ++" - %s" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:189 ++#, 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 "" ++ ++#: lib/remote_branch_delete.tcl:207 ++msgid "Please select one or more branches to delete." ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:216 ++msgid "" ++"Recovering deleted branches is difficult.\n" ++"\n" ++"Delete the selected branches?" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:226 ++#, tcl-format ++msgid "Deleting branches from %s" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:286 ++msgid "No repository selected." ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:291 ++#, tcl-format ++msgid "Scanning %s..." ++msgstr "" ++ ++#: lib/shortcut.tcl:26 lib/shortcut.tcl:74 ++msgid "Cannot write script:" ++msgstr "" ++ ++#: lib/shortcut.tcl:149 ++msgid "Cannot write icon:" ++msgstr "" ++ ++#: lib/status_bar.tcl:83 ++#, tcl-format ++msgid "%s ... %*i of %*i %s (%3i%%)" ++msgstr "" ++ ++#: lib/transport.tcl:6 ++#, tcl-format ++msgid "fetch %s" ++msgstr "" ++ ++#: lib/transport.tcl:7 ++#, tcl-format ++msgid "Fetching new changes from %s" ++msgstr "" ++ ++#: lib/transport.tcl:18 ++#, tcl-format ++msgid "remote prune %s" ++msgstr "" ++ ++#: lib/transport.tcl:19 ++#, tcl-format ++msgid "Pruning tracking branches deleted from %s" ++msgstr "" ++ ++#: lib/transport.tcl:25 lib/transport.tcl:71 ++#, tcl-format ++msgid "push %s" ++msgstr "" ++ ++#: lib/transport.tcl:26 ++#, tcl-format ++msgid "Pushing changes to %s" ++msgstr "" ++ ++#: lib/transport.tcl:72 ++#, tcl-format ++msgid "Pushing %s %s to %s" ++msgstr "" ++ ++#: lib/transport.tcl:89 ++msgid "Push Branches" ++msgstr "" ++ ++#: lib/transport.tcl:103 ++msgid "Source Branches" ++msgstr "" ++ ++#: lib/transport.tcl:120 ++msgid "Destination Repository" ++msgstr "" ++ ++#: lib/transport.tcl:158 ++msgid "Transfer Options" ++msgstr "" ++ ++#: lib/transport.tcl:160 ++msgid "Force overwrite existing branch (may discard changes)" ++msgstr "" ++ ++#: lib/transport.tcl:164 ++msgid "Use thin pack (for slow network connections)" ++msgstr "" ++ ++#: lib/transport.tcl:168 ++msgid "Include tags" ++msgstr "" diff --cc git-gui/po/glossary/Makefile index 000000000,000000000..749aa2e7e new file mode 100644 --- /dev/null +++ b/git-gui/po/glossary/Makefile @@@ -1,0 -1,0 +1,9 @@@ ++PO_TEMPLATE = git-gui-glossary.pot ++ ++ALL_POFILES = $(wildcard *.po) ++ ++$(PO_TEMPLATE): $(subst .pot,.txt,$(PO_TEMPLATE)) ++ ./txt-to-pot.sh $< > $@ ++ ++update-po:: git-gui-glossary.pot ++ $(foreach p, $(ALL_POFILES), echo Updating $p ; msgmerge -U $p $(PO_TEMPLATE) ; ) diff --cc git-gui/po/glossary/de.po index 000000000,000000000..c94786c6a new file mode 100644 --- /dev/null +++ b/git-gui/po/glossary/de.po @@@ -1,0 -1,0 +1,185 @@@ ++# Translation of git-gui glossary to German ++# Copyright (C) 2007 Shawn Pearce, et al. ++# This file is distributed under the same license as the git package. ++# Christian Stimming , 2007 ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: git-gui glossary\n" ++"POT-Creation-Date: 2007-10-19 21:43+0200\n" ++"PO-Revision-Date: 2007-10-20 15:24+0200\n" ++"Last-Translator: Christian Stimming \n" ++"Language-Team: German \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++#. "English Definition (Dear translator: This file will never be visible to the user! It should only serve as a tool for you, the translator. Nothing more.)" ++msgid "" ++"English Term (Dear translator: This file will never be visible to the user!)" ++msgstr "" ++"Deutsche Übersetzung.\n" ++"Andere deutsche SCM:\n" ++" http://tortoisesvn.net/docs/release/TortoiseSVN_de/index.html und http://" ++"tortoisesvn.tigris.org/svn/tortoisesvn/trunk/Languages/Tortoise_de.po " ++"(username=guest, password empty, gut),\n" ++" http://msdn.microsoft.com/de-de/library/ms181038(vs.80).aspx (MS Visual " ++"Source Safe, kommerziell),\n" ++" http://cvsbook.red-bean.com/translations/german/Kap_06.html " ++"(mittelmäßig),\n" ++" http://tortoisecvs.cvs.sourceforge.net/tortoisecvs/po/TortoiseCVS/de_DE.po?" ++"view=markup (mittelmäßig),\n" ++" http://rapidsvn.tigris.org/svn/rapidsvn/trunk/src/locale/de/rapidsvn.po " ++"(username=guest, password empty, schlecht)" ++ ++#. "" ++msgid "amend" ++msgstr "nachbessern (ergänzen)" ++ ++#. "" ++msgid "annotate" ++msgstr "annotieren" ++ ++#. "A 'branch' is an active line of development." ++msgid "branch [noun]" ++msgstr "Zweig" ++ ++#. "" ++msgid "branch [verb]" ++msgstr "verzweigen" ++ ++#. "" ++msgid "checkout [noun]" ++msgstr "" ++"Arbeitskopie (Erstellung einer Arbeitskopie; Auscheck? Ausspielung? Abruf? " ++"Source Safe: Auscheckvorgang)" ++ ++#. "The action of updating the working tree to a revision which was stored in the object database." ++msgid "checkout [verb]" ++msgstr "" ++"Arbeitskopie erstellen; Zweig umstellen [checkout a branch] (auschecken? " ++"ausspielen? abrufen? Source Safe: auschecken)" ++ ++#. "" ++msgid "clone [verb]" ++msgstr "kopieren" ++ ++#. "A single point in the git history." ++msgid "commit [noun]" ++msgstr "" ++"Version; Eintragung; Änderung (Buchung?, Eintragung?, Übertragung?, " ++"Sendung?, Übergabe?, Einspielung?, Ablagevorgang?)" ++ ++#. "The action of storing a new snapshot of the project's state in the git history." ++msgid "commit [verb]" ++msgstr "" ++"eintragen (TortoiseSVN: übertragen; Source Safe: einchecken; senden?, " ++"übergeben?, einspielen?, einpflegen?, ablegen?)" ++ ++#. "" ++msgid "diff [noun]" ++msgstr "Vergleich (Source Safe: Unterschiede)" ++ ++#. "" ++msgid "diff [verb]" ++msgstr "vergleichen" ++ ++#. "A fast-forward is a special type of merge where you have a revision and you are merging another branch's changes that happen to be a descendant of what you have." ++msgid "fast forward merge" ++msgstr "Schnellzusammenführung" ++ ++#. "Fetching a branch means to get the branch's head from a remote repository, to find out which objects are missing from the local object database, and to get them, too." ++msgid "fetch" ++msgstr "anfordern (holen?)" ++ ++#. "A collection of files. The index is a stored version of your working tree." ++msgid "index (in git-gui: staging area)" ++msgstr "Bereitstellung" ++ ++#. "A successful merge results in the creation of a new commit representing the result of the merge." ++msgid "merge [noun]" ++msgstr "Zusammenführung" ++ ++#. "To bring the contents of another branch into the current branch." ++msgid "merge [verb]" ++msgstr "zusammenführen" ++ ++#. "" ++msgid "message" ++msgstr "Beschreibung (Meldung?, Nachricht?; Source Safe: Kommentar)" ++ ++#. "Deletes all stale tracking branches under . These stale branches have already been removed from the remote repository referenced by , but are still locally available in 'remotes/'." ++msgid "prune" ++msgstr "entfernen" ++ ++#. "Pulling a branch means to fetch it and merge it." ++msgid "pull" ++msgstr "übernehmen (ziehen?)" ++ ++#. "Pushing a branch means to get the branch's head ref from a remote repository, and ... (well, can someone please explain it for mere mortals?)" ++msgid "push" ++msgstr "versenden (ausliefern? hochladen? verschicken? schieben?)" ++ ++#. "" ++msgid "redo" ++msgstr "wiederholen" ++ ++#. "An other repository ('remote'). One might have a set of remotes whose branches one tracks." ++msgid "remote" ++msgstr "Andere Archive (Gegenseite?, Entfernte?, Server?)" ++ ++#. "A collection of refs (?) together with an object database containing all objects which are reachable from the refs... (oops, you've lost me here. Again, please an explanation for mere mortals?)" ++msgid "repository" ++msgstr "Projektarchiv" ++ ++#. "" ++msgid "reset" ++msgstr "zurücksetzen (zurückkehren?)" ++ ++#. "" ++msgid "revert" ++msgstr "revidieren" ++ ++#. "A particular state of files and directories which was stored in the object database." ++msgid "revision" ++msgstr "Version (TortoiseSVN: Revision; Source Safe: Version)" ++ ++#. "" ++msgid "sign off" ++msgstr "abzeichnen (gegenzeichnen?, freizeichnen?, absegnen?)" ++ ++#. "" ++msgid "staging area" ++msgstr "Bereitstellung" ++ ++#. "" ++msgid "status" ++msgstr "Status" ++ ++#. "A ref pointing to a tag or commit object" ++msgid "tag [noun]" ++msgstr "Markierung" ++ ++#. "" ++msgid "tag [verb]" ++msgstr "markieren" ++ ++#. "A regular git branch that is used to follow changes from another repository." ++msgid "tracking branch" ++msgstr "Übernahmezweig" ++ ++#. "" ++msgid "undo" ++msgstr "rückgängig" ++ ++#. "" ++msgid "update" ++msgstr "aktualisieren" ++ ++#. "" ++msgid "verify" ++msgstr "überprüfen" ++ ++#. "The tree of actual checked out files." ++msgid "working copy, working tree" ++msgstr "Arbeitskopie" diff --cc git-gui/po/glossary/git-gui-glossary.pot index 000000000,000000000..48af80331 new file mode 100644 --- /dev/null +++ b/git-gui/po/glossary/git-gui-glossary.pot @@@ -1,0 -1,0 +1,164 @@@ ++# SOME DESCRIPTIVE TITLE. ++# Copyright (C) YEAR Free Software Foundation, Inc. ++# FIRST AUTHOR , YEAR. ++# ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"POT-Creation-Date: 2007-10-19 21:43+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=CHARSET\n" ++"Content-Transfer-Encoding: ENCODING\n" ++ ++#. "English Definition (Dear translator: This file will never be visible to the user! It should only serve as a tool for you, the translator. Nothing more.)" ++msgid "English Term (Dear translator: This file will never be visible to the user!)" ++msgstr "" ++ ++#. "" ++msgid "amend" ++msgstr "" ++ ++#. "" ++msgid "annotate" ++msgstr "" ++ ++#. "A 'branch' is an active line of development." ++msgid "branch [noun]" ++msgstr "" ++ ++#. "" ++msgid "branch [verb]" ++msgstr "" ++ ++#. "" ++msgid "checkout [noun]" ++msgstr "" ++ ++#. "The action of updating the working tree to a revision which was stored in the object database." ++msgid "checkout [verb]" ++msgstr "" ++ ++#. "" ++msgid "clone [verb]" ++msgstr "" ++ ++#. "A single point in the git history." ++msgid "commit [noun]" ++msgstr "" ++ ++#. "The action of storing a new snapshot of the project's state in the git history." ++msgid "commit [verb]" ++msgstr "" ++ ++#. "" ++msgid "diff [noun]" ++msgstr "" ++ ++#. "" ++msgid "diff [verb]" ++msgstr "" ++ ++#. "A fast-forward is a special type of merge where you have a revision and you are merging another branch's changes that happen to be a descendant of what you have." ++msgid "fast forward merge" ++msgstr "" ++ ++#. "Fetching a branch means to get the branch's head from a remote repository, to find out which objects are missing from the local object database, and to get them, too." ++msgid "fetch" ++msgstr "" ++ ++#. "A collection of files. The index is a stored version of your working tree." ++msgid "index (in git-gui: staging area)" ++msgstr "" ++ ++#. "A successful merge results in the creation of a new commit representing the result of the merge." ++msgid "merge [noun]" ++msgstr "" ++ ++#. "To bring the contents of another branch into the current branch." ++msgid "merge [verb]" ++msgstr "" ++ ++#. "" ++msgid "message" ++msgstr "" ++ ++#. "Deletes all stale tracking branches under . These stale branches have already been removed from the remote repository referenced by , but are still locally available in 'remotes/'." ++msgid "prune" ++msgstr "" ++ ++#. "Pulling a branch means to fetch it and merge it." ++msgid "pull" ++msgstr "" ++ ++#. "Pushing a branch means to get the branch's head ref from a remote repository, and ... (well, can someone please explain it for mere mortals?)" ++msgid "push" ++msgstr "" ++ ++#. "" ++msgid "redo" ++msgstr "" ++ ++#. "An other repository ('remote'). One might have a set of remotes whose branches one tracks." ++msgid "remote" ++msgstr "" ++ ++#. "A collection of refs (?) together with an object database containing all objects which are reachable from the refs... (oops, you've lost me here. Again, please an explanation for mere mortals?)" ++msgid "repository" ++msgstr "" ++ ++#. "" ++msgid "reset" ++msgstr "" ++ ++#. "" ++msgid "revert" ++msgstr "" ++ ++#. "A particular state of files and directories which was stored in the object database." ++msgid "revision" ++msgstr "" ++ ++#. "" ++msgid "sign off" ++msgstr "" ++ ++#. "" ++msgid "staging area" ++msgstr "" ++ ++#. "" ++msgid "status" ++msgstr "" ++ ++#. "A ref pointing to a tag or commit object" ++msgid "tag [noun]" ++msgstr "" ++ ++#. "" ++msgid "tag [verb]" ++msgstr "" ++ ++#. "A regular git branch that is used to follow changes from another repository." ++msgid "tracking branch" ++msgstr "" ++ ++#. "" ++msgid "undo" ++msgstr "" ++ ++#. "" ++msgid "update" ++msgstr "" ++ ++#. "" ++msgid "verify" ++msgstr "" ++ ++#. "The tree of actual checked out files." ++msgid "working copy, working tree" ++msgstr "" ++ diff --cc git-gui/po/glossary/git-gui-glossary.txt index 000000000,000000000..500d0a0ea new file mode 100644 --- /dev/null +++ b/git-gui/po/glossary/git-gui-glossary.txt @@@ -1,0 -1,0 +1,37 @@@ ++"English Term (Dear translator: This file will never be visible to the user!)" "English Definition (Dear translator: This file will never be visible to the user! It should only serve as a tool for you, the translator. Nothing more.)" ++"amend" "" ++"annotate" "" ++"branch [noun]" "A 'branch' is an active line of development." ++"branch [verb]" "" ++"checkout [noun]" "" ++"checkout [verb]" "The action of updating the working tree to a revision which was stored in the object database." ++"clone [verb]" "" ++"commit [noun]" "A single point in the git history." ++"commit [verb]" "The action of storing a new snapshot of the project's state in the git history." ++"diff [noun]" "" ++"diff [verb]" "" ++"fast forward merge" "A fast-forward is a special type of merge where you have a revision and you are merging another branch's changes that happen to be a descendant of what you have." ++"fetch" "Fetching a branch means to get the branch's head from a remote repository, to find out which objects are missing from the local object database, and to get them, too." ++"index (in git-gui: staging area)" "A collection of files. The index is a stored version of your working tree." ++"merge [noun]" "A successful merge results in the creation of a new commit representing the result of the merge." ++"merge [verb]" "To bring the contents of another branch into the current branch." ++"message" "" ++"prune" "Deletes all stale tracking branches under . These stale branches have already been removed from the remote repository referenced by , but are still locally available in 'remotes/'." ++"pull" "Pulling a branch means to fetch it and merge it." ++"push" "Pushing a branch means to get the branch's head ref from a remote repository, and ... (well, can someone please explain it for mere mortals?)" ++"redo" "" ++"remote" "An other repository ('remote'). One might have a set of remotes whose branches one tracks." ++"repository" "A collection of refs (?) together with an object database containing all objects which are reachable from the refs... (oops, you've lost me here. Again, please an explanation for mere mortals?)" ++"reset" "" ++"revert" "" ++"revision" "A particular state of files and directories which was stored in the object database." ++"sign off" "" ++"staging area" "" ++"status" "" ++"tag [noun]" "A ref pointing to a tag or commit object" ++"tag [verb]" "" ++"tracking branch" "A regular git branch that is used to follow changes from another repository." ++"undo" "" ++"update" "" ++"verify" "" ++"working copy, working tree" "The tree of actual checked out files." diff --cc git-gui/po/glossary/it.po index 000000000,000000000..8e3d9a2f0 new file mode 100644 --- /dev/null +++ b/git-gui/po/glossary/it.po @@@ -1,0 -1,0 +1,180 @@@ ++# Translation of git-gui glossary to Italian ++# Copyright (C) 2007 Shawn Pearce, et al. ++# This file is distributed under the same license as the git package. ++# Christian Stimming , 2007 ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: git-gui glossary\n" ++"POT-Creation-Date: 2007-10-05 22:30+0200\n" ++"PO-Revision-Date: 2007-10-10 15:24+0200\n" ++"Last-Translator: Michele Ballabio \n" ++"Language-Team: Italian \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++#. "English Definition (Dear translator: This file will never be visible to the user! It should only serve as a tool for you, the translator. Nothing more.)" ++msgid "" ++"English Term (Dear translator: This file will never be visible to the user!)" ++msgstr "" ++"Traduzione italiana.\n" ++"Altri SCM in italiano:\n" ++" http://tortoisesvn.tigris.org/svn/tortoisesvn/trunk/Languages/Tortoise_it." ++"po (username=guest, password empty),\n" ++" http://tortoisecvs.cvs.sourceforge.net/tortoisecvs/po/TortoiseCVS/it_IT.po?" ++"view=markup ,\n" ++" http://rapidsvn.tigris.org/svn/rapidsvn/trunk/src/locale/it_IT/rapidsvn.po " ++"(username=guest, password empty)" ++ ++#. "" ++msgid "amend" ++msgstr "correggere, correzione" ++ ++#. "" ++msgid "annotate" ++msgstr "annotare, annotazione" ++ ++#. "A 'branch' is an active line of development." ++msgid "branch [noun]" ++msgstr "ramo, diramazione, ramificazione" ++ ++#. "" ++msgid "branch [verb]" ++msgstr "creare ramo, ramificare, diramare" ++ ++#. "" ++msgid "checkout [noun]" ++msgstr "attivazione, checkout, revisione attiva, prelievo (TortoiseCVS)?" ++ ++#. "The action of updating the working tree to a revision which was stored in the object database." ++msgid "checkout [verb]" ++msgstr "" ++"attivare, effettuare un checkout, attivare revisione, prelevare (TortoiseCVS), " ++"ritirare (TSVN)?" ++ ++#. "" ++msgid "clone [verb]" ++msgstr "clonare" ++ ++#. "A single point in the git history." ++msgid "commit [noun]" ++msgstr "revisione, commit, deposito (TortoiseCVS), invio (TSVN)?" ++ ++#. "The action of storing a new snapshot of the project's state in the git history." ++msgid "commit [verb]" ++msgstr "" ++"creare una nuova revisione, archiviare, effettuare un commit, depositare " ++"(nel server), fare un deposito (TortoiseCVS), inviare (TSVN)?" ++ ++#. "" ++msgid "diff [noun]" ++msgstr "differenza, confronto, comparazione, raffronto" ++ ++#. "" ++msgid "diff [verb]" ++msgstr "confronta, mostra le differenze" ++ ++#. "A fast-forward is a special type of merge where you have a revision and you are merging another branch's changes that happen to be a descendant of what you have." ++msgid "fast forward merge" ++msgstr "fusione in 'fast-forward', fusione in avanti veloce" ++ ++#. "Fetching a branch means to get the branch's head from a remote repository, to find out which objects are missing from the local object database, and to get them, too." ++msgid "fetch" ++msgstr "recuperare, prelevare, prendere da, recuperare (TSVN)" ++ ++#. "A collection of files. The index is a stored version of your working tree." ++msgid "index (in git-gui: staging area)" ++msgstr "indice" ++ ++#. "A successful merge results in the creation of a new commit representing the result of the merge." ++msgid "merge [noun]" ++msgstr "fusione, unione" ++ ++#. "To bring the contents of another branch into the current branch." ++msgid "merge [verb]" ++msgstr "effettuare la fusione, unire, fondere, eseguire la fusione" ++ ++#. "" ++msgid "message" ++msgstr "messaggio, commento" ++ ++#. "" ++msgid "prune" ++msgstr "potatura" ++ ++#. "Pulling a branch means to fetch it and merge it." ++msgid "pull" ++msgstr "" ++"prendi (recupera) e fondi (unisci)? (in pratica una traduzione di fetch + " ++"merge)" ++ ++#. "Pushing a branch means to get the branch's head ref from a remote repository, and ... (well, can someone please explain it for mere mortals?)" ++msgid "push" ++msgstr "propaga" ++ ++#. "" ++msgid "redo" ++msgstr "ripeti, rifai" ++ ++#. "A collection of refs (?) together with an object database containing all objects which are reachable from the refs... (oops, you've lost me here. Again, please an explanation for mere mortals?)" ++msgid "repository" ++msgstr "archivio, repository, database? deposito (rapidsvn)?" ++ ++#. "" ++msgid "reset" ++msgstr "ripristinare, annullare, azzerare, ripristinare" ++ ++#. "" ++msgid "revert" ++msgstr "" ++"annullare, inverti (rapidsvn), ritorna allo stato precedente, annulla le " ++"modifiche della revisione" ++ ++#. "A particular state of files and directories which was stored in the object database." ++msgid "revision" ++msgstr "revisione (TortoiseSVN)" ++ ++#. "" ++msgid "sign off" ++msgstr "sign off, firma" ++ ++#. "" ++msgid "staging area" ++msgstr "" ++"area di preparazione, zona di preparazione, modifiche in preparazione? " ++"modifiche in allestimento?" ++ ++#. "" ++msgid "status" ++msgstr "stato" ++ ++#. "A ref pointing to a tag or commit object" ++msgid "tag [noun]" ++msgstr "etichetta, etichettatura (TortoiseCVS)" ++ ++#. "" ++msgid "tag [verb]" ++msgstr "etichettare" ++ ++#. "A regular git branch that is used to follow changes from another repository." ++msgid "tracking branch" ++msgstr "" ++"duplicato locale di ramo remoto, ramo in 'tracking', ramo inseguitore? ramo di {inseguimento,allineamento," ++"rilevamento,puntamento}?" ++ ++#. "" ++msgid "undo" ++msgstr "annulla" ++ ++#. "" ++msgid "update" ++msgstr "aggiornamento, aggiornare" ++ ++#. "" ++msgid "verify" ++msgstr "verifica, verificare" ++ ++#. "The tree of actual checked out files." ++msgid "working copy, working tree" ++msgstr "directory di lavoro, copia di lavoro" diff --cc git-gui/po/glossary/txt-to-pot.sh index 000000000,000000000..49bf7c536 new file mode 100755 --- /dev/null +++ b/git-gui/po/glossary/txt-to-pot.sh @@@ -1,0 -1,0 +1,48 @@@ ++#!/bin/sh ++# This is a very, _very_, simple script to convert a tab-separated ++# .txt file into a .pot/.po. ++# Its not clever but it took me 2 minutes to write :) ++# Michael Twomey ++# 23 March 2001 ++# with slight GnuCash modifications by Christian Stimming ++# 19 Aug 2001, 23 Jul 2007 ++ ++#check args ++if [ $# -eq 0 ] ++then ++ cat < git-gui-glossary.pot ++! ++ exit 1; ++fi ++ ++GLOSSARY_CSV="$1"; ++ ++if [ ! -f "$GLOSSARY_CSV" ] ++then ++ echo "Can't find $GLOSSARY_CSV."; ++ exit 1; ++fi ++ ++cat <, YEAR. ++# ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"POT-Creation-Date: `date +'%Y-%m-%d %H:%M%z'`\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=CHARSET\n" ++"Content-Transfer-Encoding: ENCODING\n" ++ ++! ++ ++#Yes this is the most simple awk script you've ever seen :) ++awk -F'\t' '{if ($2 != "") print "#. "$2; print "msgid "$1; print "msgstr \"\"\n"}' \ ++$GLOSSARY_CSV diff --cc git-gui/po/glossary/zh_cn.po index 000000000,000000000..158835b5c new file mode 100644 --- /dev/null +++ b/git-gui/po/glossary/zh_cn.po @@@ -1,0 -1,0 +1,170 @@@ ++# Translation of git-gui glossary to Simplified Chinese ++# Copyright (C) 2007 Shawn Pearce, et al. ++# This file is distributed under the same license as the git package. ++# Xudong Guan and the zh-kernel.org mailing list, 2007 ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: git-gui glossary\n" ++"PO-Revision-Date: 2007-07-23 22:07+0200\n" ++"Last-Translator: Xudong Guan \n" ++"Language-Team: Simplified Chinese \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++#. "English Definition (Dear translator: This file will never be visible to the user! It should only serve as a tool for you, the translator. Nothing more.)" ++msgid "" ++"English Term (Dear translator: This file will never be visible to the user!)" ++msgstr "注:这个文件是为了帮助翻译人员统一名词术语。最终用户不会关心这个文件。" ++ ++#. "" ++#. amend指用户修改最近一次commit的操作,修订?修改?修正? ++#. [WANG Cong]: 根据我的了解,这个词似乎翻译成“修订”多一些。“修正”也可以,“修改”再次之。 ++#. [ZHANG Le]: 修订,感觉一般指对一些大型出版物的大规模升级,比如修订新华字典 ++# 修正,其实每次amend的结果也不一定就是最后结果,说不定还需要修改。所以不 ++# 如就叫修改 ++msgid "amend" ++msgstr "修订" ++ ++#. "" ++#. git annotate 文件名:用来标注文件的每一行在什么时候被谁最后修改。 ++#. [WANG Cong]: "标记"一般是mark。;) ++#. [ZHANG Le]: 标注,或者干脆用原意:注解,或注释 ++msgid "annotate" ++msgstr "标注" ++ ++#. "A 'branch' is an active line of development." ++msgid "branch [noun]" ++msgstr "分支" ++ ++#. "" ++msgid "branch [verb]" ++msgstr "建立分支" ++ ++#. "" ++#. [WANG Cong]: 网上有人翻译成“检出”,我感觉更好一些,毕竟把check的意思翻译出来了。 ++#. [ZHNAG Le]: 提取吧,提取分支/版本 ++#. [rae l]: 签出。subversion软件中的大多词汇已有翻译,既然git与subversion同是SCM管理,可以参考同类软件的翻译也不错。 ++msgid "checkout [noun]" ++msgstr "签出" ++ ++#. "The action of updating the working tree to a revision which was stored in the object database." ++msgid "checkout [verb]" ++msgstr "签出" ++ ++#. "A single point in the git history." ++msgid "commit [noun]" ++msgstr "提交" ++ ++#. "The action of storing a new snapshot of the project's state in the git history." ++msgid "commit [verb]" ++msgstr "提交" ++ ++#. "" ++#. 差异?差别? ++#. [ZHANG Le]: 个人感觉差别更加中性一些 ++msgid "diff [noun]" ++msgstr "差别" ++ ++#. "" ++msgid "diff [verb]" ++msgstr "比较" ++ ++#. "A fast-forward is a special type of merge where you have a revision and you are merging another branch's changes that happen to be a descendant of what you have." ++msgid "fast forward merge" ++msgstr "快进式合并" ++ ++#. "Fetching a branch means to get the branch's head from a remote repository, to find out which objects are missing from the local object database, and to get them, too." ++#. 获取?取得?下载?更新?注意和update的区分 ++msgid "fetch" ++msgstr "获取" ++ ++#. "A collection of files. The index is a stored version of your working tree." ++#. index是working tree和repository之间的缓存 ++msgid "index (in git-gui: staging area)" ++msgstr "工作缓存?" ++ ++#. "A successful merge results in the creation of a new commit representing the result of the merge." ++msgid "merge [noun]" ++msgstr "合并" ++ ++#. "To bring the contents of another branch into the current branch." ++msgid "merge [verb]" ++msgstr "合并" ++ ++#. "" ++#. message是指commit中的文字信息 ++msgid "message" ++msgstr "描述" ++ ++#. "Pulling a branch means to fetch it and merge it." ++msgid "pull" ++msgstr "获取+合并" ++ ++#. "Pushing a branch means to get the branch's head ref from a remote repository, and ... (well, can someone please explain it for mere mortals?)" ++msgid "push" ++msgstr "推入" ++ ++#. "" ++msgid "redo" ++msgstr "重做" ++ ++#. "A collection of refs (?) together with an object database containing all objects which are reachable from the refs... (oops, you've lost me here. Again, please an explanation for mere mortals?)" ++msgid "repository" ++msgstr "仓库" ++ ++#. "" ++msgid "reset" ++msgstr "重置" ++ ++#. "" ++msgid "revert" ++msgstr "恢复" ++ ++#. "A particular state of files and directories which was stored in the object database." ++msgid "revision" ++msgstr "版本" ++ ++#. "" ++msgid "sign off" ++msgstr "签名" ++ ++#. "" ++#. 似乎是git-gui里面显示的本次提交的文件清单区域 ++msgid "staging area" ++msgstr "提交暂存区" ++ ++#. "" ++msgid "status" ++msgstr "状态" ++ ++#. "A ref pointing to a tag or commit object" ++msgid "tag [noun]" ++msgstr "标签" ++ ++#. "" ++msgid "tag [verb]" ++msgstr "添加标签" ++ ++#. "A regular git branch that is used to follow changes from another repository." ++msgid "tracking branch" ++msgstr "跟踪分支" ++ ++#. "" ++msgid "undo" ++msgstr "撤销" ++ ++#. "" ++msgid "update" ++msgstr "更新。注意和fetch的区分" ++ ++#. "" ++msgid "verify" ++msgstr "验证" ++ ++#. "The tree of actual checked out files." ++#. "工作副本?工作区域?工作目录" ++#. [LI Yang]: 当前副本, 当前源码树? ++msgid "working copy, working tree" ++msgstr "工作副本,工作源码树" diff --cc git-gui/po/hu.po index 000000000,000000000..e8c04f7ae new file mode 100644 --- /dev/null +++ b/git-gui/po/hu.po @@@ -1,0 -1,0 +1,1895 @@@ ++# Hungarian translations for git-gui-i package. ++# Copyright (C) 2007 THE git-gui-i'S COPYRIGHT HOLDER ++# This file is distributed under the same license as the git-gui-i package. ++# Miklos Vajna , 2007. ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: git-gui-i 18n\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2007-10-10 04:04-0400\n" ++"PO-Revision-Date: 2007-07-27 13:15+0200\n" ++"Last-Translator: Miklos Vajna \n" ++"Language-Team: Hungarian\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:41 git-gui.sh:634 git-gui.sh:648 git-gui.sh:661 git-gui.sh:744 ++#: git-gui.sh:763 ++msgid "git-gui: fatal error" ++msgstr "" ++ ++#: git-gui.sh:595 ++#, fuzzy, tcl-format ++msgid "Invalid font specified in %s:" ++msgstr "Érvénytelen font lett megadva a grafikus felületben.%s:" ++ ++#: git-gui.sh:620 ++msgid "Main Font" ++msgstr "Fő betűtípus" ++ ++#: git-gui.sh:621 ++msgid "Diff/Console Font" ++msgstr "Diff/konzol betűtípus" ++ ++#: git-gui.sh:635 ++msgid "Cannot find git in PATH." ++msgstr "A git nem található a PATH-ban." ++ ++#: git-gui.sh:662 ++msgid "Cannot parse Git version string:" ++msgstr "Nem értelmezhető a Git verzió sztring:" ++ ++#: git-gui.sh:680 ++#, 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 "" ++"Nem állípítható meg a Git verziója.\n" ++"\n" ++"A(z) %s szerint a verzió '%s'.\n" ++"\n" ++"A(z) %s a Git 1.5.0 vagy későbbi verzióját igényli.\n" ++"\n" ++"Feltételezhetjük, hogy a(z) '%s' verziója legalább 1.5.0?\n" ++ ++#: git-gui.sh:853 ++msgid "Git directory not found:" ++msgstr "A Git könyvtár nem található:" ++ ++#: git-gui.sh:860 ++#, fuzzy ++msgid "Cannot move to top of working directory:" ++msgstr "Nem használható vicces .git könyvtár:" ++ ++#: git-gui.sh:867 ++msgid "Cannot use funny .git directory:" ++msgstr "Nem használható vicces .git könyvtár:" ++ ++#: git-gui.sh:872 ++msgid "No working directory" ++msgstr "Nincs munkakönyvtár" ++ ++#: git-gui.sh:1019 ++msgid "Refreshing file status..." ++msgstr "A fájlok státuszának frissítése..." ++ ++#: git-gui.sh:1084 ++msgid "Scanning for modified files ..." ++msgstr "Módosított fájlok keresése ..." ++ ++#: git-gui.sh:1259 lib/browser.tcl:245 ++msgid "Ready." ++msgstr "Kész." ++ ++#: git-gui.sh:1525 ++msgid "Unmodified" ++msgstr "Nem módosított" ++ ++#: git-gui.sh:1527 ++msgid "Modified, not staged" ++msgstr "Módosított, de nem kiválasztott" ++ ++#: git-gui.sh:1528 git-gui.sh:1533 ++msgid "Staged for commit" ++msgstr "Kiválasztva commitolásra" ++ ++#: git-gui.sh:1529 git-gui.sh:1534 ++msgid "Portions staged for commit" ++msgstr "Részek kiválasztva commitolásra" ++ ++#: git-gui.sh:1530 git-gui.sh:1535 ++msgid "Staged for commit, missing" ++msgstr "Kiválasztva commitolásra, hiányzó" ++ ++#: git-gui.sh:1532 ++msgid "Untracked, not staged" ++msgstr "Nem követett, nem kiválasztott" ++ ++#: git-gui.sh:1537 ++msgid "Missing" ++msgstr "Hiányzó" ++ ++#: git-gui.sh:1538 ++msgid "Staged for removal" ++msgstr "Kiválasztva eltávolításra" ++ ++#: git-gui.sh:1539 ++msgid "Staged for removal, still present" ++msgstr "Kiválasztva eltávolításra, jelenleg is elérhető" ++ ++#: git-gui.sh:1541 git-gui.sh:1542 git-gui.sh:1543 git-gui.sh:1544 ++msgid "Requires merge resolution" ++msgstr "Merge feloldás szükséges" ++ ++#: git-gui.sh:1579 ++msgid "Starting gitk... please wait..." ++msgstr "A gitk indítása... várjunk..." ++ ++#: git-gui.sh:1588 ++#, tcl-format ++msgid "" ++"Unable to start gitk:\n" ++"\n" ++"%s does not exist" ++msgstr "" ++"A gitk indítása sikertelen:\n" ++"\n" ++"A(z) %s nem létezik" ++ ++#: git-gui.sh:1788 lib/choose_repository.tcl:32 ++msgid "Repository" ++msgstr "Repó" ++ ++#: git-gui.sh:1789 ++msgid "Edit" ++msgstr "Szerkesztés" ++ ++#: git-gui.sh:1791 lib/choose_rev.tcl:560 ++msgid "Branch" ++msgstr "Branch" ++ ++#: git-gui.sh:1794 lib/choose_rev.tcl:547 ++#, fuzzy ++msgid "Commit@@noun" ++msgstr "Commit" ++ ++#: git-gui.sh:1797 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168 ++msgid "Merge" ++msgstr "Merge" ++ ++#: git-gui.sh:1798 lib/choose_rev.tcl:556 ++#, fuzzy ++msgid "Remote" ++msgstr "Távoli:" ++ ++#: git-gui.sh:1807 ++msgid "Browse Current Branch's Files" ++msgstr "A jelenlegi branch fájljainak böngészése" ++ ++#: git-gui.sh:1811 ++msgid "Browse Branch Files..." ++msgstr "A branch fájljainak böngészése..." ++ ++#: git-gui.sh:1816 ++msgid "Visualize Current Branch's History" ++msgstr "A jelenlegi branch történetének vizualizálása" ++ ++#: git-gui.sh:1820 ++msgid "Visualize All Branch History" ++msgstr "Az összes branch történetének vizualizálása" ++ ++#: git-gui.sh:1827 ++#, tcl-format ++msgid "Browse %s's Files" ++msgstr "A(z) %s branch fájljainak böngészése" ++ ++#: git-gui.sh:1829 ++#, tcl-format ++msgid "Visualize %s's History" ++msgstr "A(z) %s branch történetének vizualizálása" ++ ++#: git-gui.sh:1834 lib/database.tcl:27 lib/database.tcl:67 ++msgid "Database Statistics" ++msgstr "Adatbázis statisztikák" ++ ++#: git-gui.sh:1837 lib/database.tcl:34 ++msgid "Compress Database" ++msgstr "Adatbázis tömörítése" ++ ++#: git-gui.sh:1840 ++msgid "Verify Database" ++msgstr "Adatbázis ellenőrzése" ++ ++#: git-gui.sh:1847 git-gui.sh:1851 git-gui.sh:1855 lib/shortcut.tcl:9 ++#: lib/shortcut.tcl:45 lib/shortcut.tcl:84 ++msgid "Create Desktop Icon" ++msgstr "Asztal ikon létrehozása" ++ ++#: git-gui.sh:1860 lib/choose_repository.tcl:36 lib/choose_repository.tcl:95 ++msgid "Quit" ++msgstr "Kilépés" ++ ++#: git-gui.sh:1867 ++msgid "Undo" ++msgstr "Visszavonás" ++ ++#: git-gui.sh:1870 ++msgid "Redo" ++msgstr "Mégis" ++ ++#: git-gui.sh:1874 git-gui.sh:2366 ++msgid "Cut" ++msgstr "Kivágás" ++ ++#: git-gui.sh:1877 git-gui.sh:2369 git-gui.sh:2440 git-gui.sh:2512 ++#: lib/console.tcl:67 ++msgid "Copy" ++msgstr "Másolás" ++ ++#: git-gui.sh:1880 git-gui.sh:2372 ++msgid "Paste" ++msgstr "Beillesztés" ++ ++#: git-gui.sh:1883 git-gui.sh:2375 lib/branch_delete.tcl:26 ++#: lib/remote_branch_delete.tcl:38 ++msgid "Delete" ++msgstr "Törlés" ++ ++#: git-gui.sh:1887 git-gui.sh:2379 git-gui.sh:2516 lib/console.tcl:69 ++msgid "Select All" ++msgstr "Mindent kiválaszt" ++ ++#: git-gui.sh:1896 ++msgid "Create..." ++msgstr "Létrehozás..." ++ ++#: git-gui.sh:1902 ++msgid "Checkout..." ++msgstr "Checkout..." ++ ++#: git-gui.sh:1908 ++msgid "Rename..." ++msgstr "Átnevezés..." ++ ++#: git-gui.sh:1913 git-gui.sh:2012 ++msgid "Delete..." ++msgstr "Törlés..." ++ ++#: git-gui.sh:1918 ++msgid "Reset..." ++msgstr "Visszaállítás..." ++ ++#: git-gui.sh:1930 git-gui.sh:2313 ++msgid "New Commit" ++msgstr "Új commit" ++ ++#: git-gui.sh:1938 git-gui.sh:2320 ++msgid "Amend Last Commit" ++msgstr "Utolsó commit javítása" ++ ++#: git-gui.sh:1947 git-gui.sh:2280 lib/remote_branch_delete.tcl:99 ++msgid "Rescan" ++msgstr "Keresés újra" ++ ++#: git-gui.sh:1953 ++msgid "Stage To Commit" ++msgstr "Kiválasztás commitolásra" ++ ++#: git-gui.sh:1958 ++msgid "Stage Changed Files To Commit" ++msgstr "Módosított fájlok kiválasztása commitolásra" ++ ++#: git-gui.sh:1964 ++msgid "Unstage From Commit" ++msgstr "Commitba való kiválasztás visszavonása" ++ ++#: git-gui.sh:1969 lib/index.tcl:352 ++msgid "Revert Changes" ++msgstr "Változtatások visszaállítása" ++ ++#: git-gui.sh:1976 git-gui.sh:2292 git-gui.sh:2390 ++msgid "Sign Off" ++msgstr "Aláír" ++ ++#: git-gui.sh:1980 git-gui.sh:2296 ++#, fuzzy ++msgid "Commit@@verb" ++msgstr "Commit" ++ ++#: git-gui.sh:1991 ++msgid "Local Merge..." ++msgstr "Helyi merge..." ++ ++#: git-gui.sh:1996 ++msgid "Abort Merge..." ++msgstr "Merge megszakítása..." ++ ++#: git-gui.sh:2008 ++msgid "Push..." ++msgstr "Push..." ++ ++#: git-gui.sh:2019 lib/choose_repository.tcl:41 ++msgid "Apple" ++msgstr "Apple" ++ ++#: git-gui.sh:2022 git-gui.sh:2044 lib/about.tcl:13 ++#: lib/choose_repository.tcl:44 lib/choose_repository.tcl:50 ++#, tcl-format ++msgid "About %s" ++msgstr "Névjegy: %s" ++ ++#: git-gui.sh:2026 ++msgid "Preferences..." ++msgstr "" ++ ++#: git-gui.sh:2034 git-gui.sh:2558 ++msgid "Options..." ++msgstr "Opciók..." ++ ++#: git-gui.sh:2040 lib/choose_repository.tcl:47 ++msgid "Help" ++msgstr "Segítség" ++ ++#: git-gui.sh:2081 ++msgid "Online Documentation" ++msgstr "Online dokumentáció" ++ ++#: git-gui.sh:2165 ++#, tcl-format ++msgid "fatal: cannot stat path %s: No such file or directory" ++msgstr "" ++ ++#: git-gui.sh:2198 ++msgid "Current Branch:" ++msgstr "Jelenlegi branch:" ++ ++#: git-gui.sh:2219 ++#, fuzzy ++msgid "Staged Changes (Will Commit)" ++msgstr "Kiválasztott változtatások (commitolva lesz)" ++ ++#: git-gui.sh:2239 ++#, fuzzy ++msgid "Unstaged Changes" ++msgstr "Változtatások kiválasztása" ++ ++#: git-gui.sh:2286 ++msgid "Stage Changed" ++msgstr "Változtatások kiválasztása" ++ ++#: git-gui.sh:2302 lib/transport.tcl:93 lib/transport.tcl:182 ++msgid "Push" ++msgstr "Push" ++ ++#: git-gui.sh:2332 ++msgid "Initial Commit Message:" ++msgstr "Kezdeti commit üzenet:" ++ ++#: git-gui.sh:2333 ++msgid "Amended Commit Message:" ++msgstr "Javító commit üzenet:" ++ ++#: git-gui.sh:2334 ++msgid "Amended Initial Commit Message:" ++msgstr "Kezdeti javító commit üzenet:" ++ ++#: git-gui.sh:2335 ++msgid "Amended Merge Commit Message:" ++msgstr "Javító merge commit üzenet:" ++ ++#: git-gui.sh:2336 ++msgid "Merge Commit Message:" ++msgstr "Merge commit üzenet:" ++ ++#: git-gui.sh:2337 ++msgid "Commit Message:" ++msgstr "Commit üzenet:" ++ ++#: git-gui.sh:2382 git-gui.sh:2520 lib/console.tcl:71 ++msgid "Copy All" ++msgstr "Összes másolása" ++ ++#: git-gui.sh:2406 lib/blame.tcl:104 ++msgid "File:" ++msgstr "Fájl:" ++ ++#: git-gui.sh:2508 ++msgid "Refresh" ++msgstr "Frissítés" ++ ++#: git-gui.sh:2529 ++msgid "Apply/Reverse Hunk" ++msgstr "Hunk alkalmazása/visszaállítása" ++ ++#: git-gui.sh:2535 ++msgid "Decrease Font Size" ++msgstr "Font méret csökkentése" ++ ++#: git-gui.sh:2539 ++msgid "Increase Font Size" ++msgstr "Fönt méret növelése" ++ ++#: git-gui.sh:2544 ++msgid "Show Less Context" ++msgstr "Kevesebb környezet mutatása" ++ ++#: git-gui.sh:2551 ++msgid "Show More Context" ++msgstr "Több környezet mutatása" ++ ++#: git-gui.sh:2565 ++msgid "Unstage Hunk From Commit" ++msgstr "Hunk törlése commitból" ++ ++#: git-gui.sh:2567 ++msgid "Stage Hunk For Commit" ++msgstr "Hunk kiválasztása commitba" ++ ++#: git-gui.sh:2586 ++msgid "Initializing..." ++msgstr "Inicializálás..." ++ ++#: git-gui.sh:2677 ++#, 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 "" ++ ++#: git-gui.sh:2707 ++msgid "" ++"\n" ++"This is due to a known issue with the\n" ++"Tcl binary distributed by Cygwin." ++msgstr "" ++ ++#: git-gui.sh:2712 ++#, 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 "" ++ ++#: lib/about.tcl:25 ++msgid "git-gui - a graphical user interface for Git." ++msgstr "git-gui - egy grafikus felület a Githez." ++ ++#: lib/blame.tcl:77 ++msgid "File Viewer" ++msgstr "Fájl néző" ++ ++#: lib/blame.tcl:81 ++msgid "Commit:" ++msgstr "Commit:" ++ ++#: lib/blame.tcl:249 ++msgid "Copy Commit" ++msgstr "Commit másolása" ++ ++#: lib/blame.tcl:369 ++#, tcl-format ++msgid "Reading %s..." ++msgstr "A(z) %s olvasása..." ++ ++#: lib/blame.tcl:473 ++msgid "Loading copy/move tracking annotations..." ++msgstr "" ++ ++#: lib/blame.tcl:493 ++msgid "lines annotated" ++msgstr "" ++ ++#: lib/blame.tcl:674 ++msgid "Loading original location annotations..." ++msgstr "" ++ ++#: lib/blame.tcl:677 ++msgid "Annotation complete." ++msgstr "" ++ ++#: lib/blame.tcl:731 ++#, fuzzy ++msgid "Loading annotation..." ++msgstr "A(z) %s betöltése..." ++ ++#: lib/blame.tcl:787 ++msgid "Author:" ++msgstr "" ++ ++#: lib/blame.tcl:791 ++#, fuzzy ++msgid "Committer:" ++msgstr "Commit:" ++ ++#: lib/blame.tcl:796 ++msgid "Original File:" ++msgstr "" ++ ++#: lib/blame.tcl:910 ++msgid "Originally By:" ++msgstr "" ++ ++#: lib/blame.tcl:916 ++#, fuzzy ++msgid "In File:" ++msgstr "Fájl:" ++ ++#: lib/blame.tcl:921 ++msgid "Copied Or Moved Here By:" ++msgstr "" ++ ++#: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19 ++msgid "Checkout Branch" ++msgstr "Branch checkoutolása" ++ ++#: lib/branch_checkout.tcl:23 ++msgid "Checkout" ++msgstr "Checkout" ++ ++#: lib/branch_checkout.tcl:27 lib/branch_create.tcl:35 ++#: lib/branch_delete.tcl:32 lib/branch_rename.tcl:30 lib/browser.tcl:281 ++#: lib/checkout_op.tcl:522 lib/choose_font.tcl:43 lib/merge.tcl:172 ++#: lib/option.tcl:90 lib/remote_branch_delete.tcl:42 lib/transport.tcl:97 ++msgid "Cancel" ++msgstr "Mégsem" ++ ++#: lib/branch_checkout.tcl:32 lib/browser.tcl:286 ++msgid "Revision" ++msgstr "Revízió" ++ ++#: lib/branch_checkout.tcl:36 lib/branch_create.tcl:69 lib/option.tcl:202 ++msgid "Options" ++msgstr "Opciók" ++ ++#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92 ++msgid "Fetch Tracking Branch" ++msgstr "Követő branch letöltése" ++ ++#: lib/branch_checkout.tcl:44 ++msgid "Detach From Local Branch" ++msgstr "Helyi branch leválasztása" ++ ++#: lib/branch_create.tcl:22 ++msgid "Create Branch" ++msgstr "Branch létrehozása" ++ ++#: lib/branch_create.tcl:27 ++msgid "Create New Branch" ++msgstr "Új branch létrehozása" ++ ++#: lib/branch_create.tcl:31 lib/choose_repository.tcl:199 ++msgid "Create" ++msgstr "Létrehozás" ++ ++#: lib/branch_create.tcl:40 ++msgid "Branch Name" ++msgstr "Branch neve" ++ ++#: lib/branch_create.tcl:43 ++msgid "Name:" ++msgstr "Név:" ++ ++#: lib/branch_create.tcl:58 ++msgid "Match Tracking Branch Name" ++msgstr "Egyeztetendő követési branch név" ++ ++#: lib/branch_create.tcl:66 ++msgid "Starting Revision" ++msgstr "A következő revíziótól" ++ ++#: lib/branch_create.tcl:72 ++msgid "Update Existing Branch:" ++msgstr "Létező branch frissítése" ++ ++#: lib/branch_create.tcl:75 ++msgid "No" ++msgstr "Nem" ++ ++#: lib/branch_create.tcl:80 ++msgid "Fast Forward Only" ++msgstr "Csak fast forward" ++ ++#: lib/branch_create.tcl:85 lib/checkout_op.tcl:514 ++msgid "Reset" ++msgstr "Visszaállítás" ++ ++#: lib/branch_create.tcl:97 ++msgid "Checkout After Creation" ++msgstr "Checkout létrehozás után" ++ ++#: lib/branch_create.tcl:131 ++msgid "Please select a tracking branch." ++msgstr "Válasszunk ki egy követő branchet." ++ ++#: lib/branch_create.tcl:140 ++#, tcl-format ++msgid "Tracking branch %s is not a branch in the remote repository." ++msgstr "A(z) %s követő branch nem branch a távoli repóban." ++ ++#: lib/branch_create.tcl:153 lib/branch_rename.tcl:86 ++msgid "Please supply a branch name." ++msgstr "Adjunk megy egy branch nevet." ++ ++#: lib/branch_create.tcl:164 lib/branch_rename.tcl:106 ++#, tcl-format ++msgid "'%s' is not an acceptable branch name." ++msgstr "A(z) '%s' nem egy elfogadható branch név." ++ ++#: lib/branch_delete.tcl:15 ++msgid "Delete Branch" ++msgstr "Branch törlése" ++ ++#: lib/branch_delete.tcl:20 ++msgid "Delete Local Branch" ++msgstr "Helyi branch törlése" ++ ++#: lib/branch_delete.tcl:37 ++msgid "Local Branches" ++msgstr "Helyi branchek" ++ ++#: lib/branch_delete.tcl:52 ++msgid "Delete Only If Merged Into" ++msgstr "Csak már merge-ölt törlése" ++ ++#: lib/branch_delete.tcl:54 ++msgid "Always (Do not perform merge test.)" ++msgstr "Mindig (Ne legyen merge teszt.)" ++ ++#: lib/branch_delete.tcl:103 ++#, tcl-format ++msgid "The following branches are not completely merged into %s:" ++msgstr "A következő branchek nem teljesen lettek merge-ölve ebbe: %s:" ++ ++#: lib/branch_delete.tcl:115 ++msgid "" ++"Recovering deleted branches is difficult. \n" ++"\n" ++" Delete the selected branches?" ++msgstr "" ++"A törölt branchek visszaállítása bonyolult. \n" ++"\n" ++" Biztosan törli a kiválasztott brancheket?" ++ ++#: lib/branch_delete.tcl:141 ++#, tcl-format ++msgid "" ++"Failed to delete branches:\n" ++"%s" ++msgstr "" ++"Nem sikerült törölni a következő brancheket:\n" ++"%s" ++ ++#: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22 ++msgid "Rename Branch" ++msgstr "Branch átnevezése" ++ ++#: lib/branch_rename.tcl:26 ++msgid "Rename" ++msgstr "Átnevezés" ++ ++#: lib/branch_rename.tcl:36 ++msgid "Branch:" ++msgstr "Branch:" ++ ++#: lib/branch_rename.tcl:39 ++msgid "New Name:" ++msgstr "Új név:" ++ ++#: lib/branch_rename.tcl:75 ++msgid "Please select a branch to rename." ++msgstr "Válasszunk ki egy átnevezendő branchet." ++ ++#: lib/branch_rename.tcl:96 lib/checkout_op.tcl:179 ++#, tcl-format ++msgid "Branch '%s' already exists." ++msgstr "A(z) '%s' branch már létezik." ++ ++#: lib/branch_rename.tcl:117 ++#, tcl-format ++msgid "Failed to rename '%s'." ++msgstr "Nem sikerült átnevezni: '%s'." ++ ++#: lib/browser.tcl:17 ++msgid "Starting..." ++msgstr "Indítás..." ++ ++#: lib/browser.tcl:26 ++msgid "File Browser" ++msgstr "Fájl böngésző" ++ ++#: lib/browser.tcl:125 lib/browser.tcl:142 ++#, tcl-format ++msgid "Loading %s..." ++msgstr "A(z) %s betöltése..." ++ ++#: lib/browser.tcl:186 ++msgid "[Up To Parent]" ++msgstr "[Fel a szülőhöz]" ++ ++#: lib/browser.tcl:266 lib/browser.tcl:272 ++msgid "Browse Branch Files" ++msgstr "A branch fájljainak böngészése" ++ ++#: lib/browser.tcl:277 lib/choose_repository.tcl:215 ++#: lib/choose_repository.tcl:305 lib/choose_repository.tcl:315 ++#: lib/choose_repository.tcl:811 ++msgid "Browse" ++msgstr "Böngészés" ++ ++#: lib/checkout_op.tcl:79 ++#, tcl-format ++msgid "Fetching %s from %s" ++msgstr "A(z) %s letöltése innen: %s" ++ ++#: lib/checkout_op.tcl:127 ++#, tcl-format ++msgid "fatal: Cannot resolve %s" ++msgstr "" ++ ++#: lib/checkout_op.tcl:140 lib/console.tcl:79 lib/database.tcl:31 ++msgid "Close" ++msgstr "Bezárás" ++ ++#: lib/checkout_op.tcl:169 ++#, tcl-format ++msgid "Branch '%s' does not exist." ++msgstr "A(z) '%s' branch nem létezik." ++ ++#: lib/checkout_op.tcl:206 ++#, tcl-format ++msgid "" ++"Branch '%s' already exists.\n" ++"\n" ++"It cannot fast-forward to %s.\n" ++"A merge is required." ++msgstr "" ++"A(z) '%s' branch már létezik.\n" ++"\n" ++"Nem lehet fast-forwardolni a következőhöz: %s.\n" ++"Egy merge szükséges." ++ ++#: lib/checkout_op.tcl:220 ++#, tcl-format ++msgid "Merge strategy '%s' not supported." ++msgstr "A(z) '%s' merge strategy nem támogatott." ++ ++#: lib/checkout_op.tcl:239 ++#, tcl-format ++msgid "Failed to update '%s'." ++msgstr "Nem sikerült frissíteni a következőt: '%s'." ++ ++#: lib/checkout_op.tcl:251 ++msgid "Staging area (index) is already locked." ++msgstr "A kiválasztási terület (index) már zárolva van." ++ ++#: lib/checkout_op.tcl:266 ++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 "" ++"Az utolsó keresési állapot nem egyezik meg a repó állpotával.\n" ++"\n" ++"Egy másik Git program módosította ezt a repót az utolsó keresés óta. Egy " ++"újrakeresés mindenképpen szükséges mielőtt a jelenlegi branchet módosítani " ++"lehetne.\n" ++"\n" ++"Az újrakeresés most automatikusan el fog indulni.\n" ++ ++#: lib/checkout_op.tcl:322 ++#, fuzzy, tcl-format ++msgid "Updating working directory to '%s'..." ++msgstr "Nincs munkakönyvtár" ++ ++#: lib/checkout_op.tcl:353 ++#, tcl-format ++msgid "Aborted checkout of '%s' (file level merging is required)." ++msgstr "A(z) '%s' checkoutja megszakítva (fájlszintű merge-ölés szükséges)." ++ ++#: lib/checkout_op.tcl:354 ++msgid "File level merge required." ++msgstr "Fájlszintű merge-ölés szükséges." ++ ++#: lib/checkout_op.tcl:358 ++#, tcl-format ++msgid "Staying on branch '%s'." ++msgstr "Jelenleg a(z) '%s' branchen." ++ ++#: lib/checkout_op.tcl:429 ++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 "" ++"Már nem egy helyi branchen vagyunk.\n" ++"\n" ++"Ha egy branchen szeretnénk lenni, hozzunk létre egyet az 'Ez a leválasztott " ++"checkout'-ból." ++ ++#: lib/checkout_op.tcl:446 ++#, fuzzy, tcl-format ++msgid "Checked out '%s'." ++msgstr "Checkout..." ++ ++#: lib/checkout_op.tcl:478 ++#, tcl-format ++msgid "Resetting '%s' to '%s' will lose the following commits:" ++msgstr "" ++"A(z) '%s' -> '%s' visszaállítás a következő commitok elvesztését jelenti:" ++ ++#: lib/checkout_op.tcl:500 ++msgid "Recovering lost commits may not be easy." ++msgstr "Az elveszett commitok helyreállítása nem biztos, hogy egyszerű." ++ ++#: lib/checkout_op.tcl:505 ++#, tcl-format ++msgid "Reset '%s'?" ++msgstr "Visszaállítjuk a következőt: '%s'?" ++ ++#: lib/checkout_op.tcl:510 lib/merge.tcl:164 ++msgid "Visualize" ++msgstr "Vizualizálás" ++ ++#: lib/checkout_op.tcl:578 ++#, 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 "" ++"Nem sikerült beállítani a jelenlegi branchet.\n" ++"\n" ++"A munkakönyvtár csak részben váltott át. A fájlok sikeresen frissítve " ++"lettek, de nem sikerült frissíteni egy belső Git fájlt.\n" ++"\n" ++"Ennek nem szabad megtörténnie. A(z) %s most kilép és feladja." ++ ++#: lib/choose_font.tcl:39 ++#, fuzzy ++msgid "Select" ++msgstr "Mindent kiválaszt" ++ ++#: lib/choose_font.tcl:53 ++msgid "Font Family" ++msgstr "" ++ ++#: lib/choose_font.tcl:73 ++#, fuzzy ++msgid "Font Size" ++msgstr "Font méret csökkentése" ++ ++#: lib/choose_font.tcl:90 ++msgid "Font Example" ++msgstr "" ++ ++#: lib/choose_font.tcl:101 ++msgid "" ++"This is example text.\n" ++"If you like this text, it can be your font." ++msgstr "" ++ ++#: lib/choose_repository.tcl:25 ++msgid "Git Gui" ++msgstr "" ++ ++#: lib/choose_repository.tcl:69 lib/choose_repository.tcl:204 ++#, fuzzy ++msgid "Create New Repository" ++msgstr "Forrás repó" ++ ++#: lib/choose_repository.tcl:74 lib/choose_repository.tcl:291 ++#, fuzzy ++msgid "Clone Existing Repository" ++msgstr "Cél repó" ++ ++#: lib/choose_repository.tcl:79 lib/choose_repository.tcl:800 ++#, fuzzy ++msgid "Open Existing Repository" ++msgstr "Cél repó" ++ ++#: lib/choose_repository.tcl:91 ++msgid "Next >" ++msgstr "" ++ ++#: lib/choose_repository.tcl:152 ++#, fuzzy, tcl-format ++msgid "Location %s already exists." ++msgstr "A(z) '%s' branch már létezik." ++ ++#: lib/choose_repository.tcl:158 lib/choose_repository.tcl:165 ++#: lib/choose_repository.tcl:172 ++#, fuzzy, tcl-format ++msgid "Failed to create repository %s:" ++msgstr "Nem sikerült teljesen elmenteni a beállításokat:" ++ ++#: lib/choose_repository.tcl:209 lib/choose_repository.tcl:309 ++msgid "Directory:" ++msgstr "" ++ ++#: lib/choose_repository.tcl:238 lib/choose_repository.tcl:363 ++#: lib/choose_repository.tcl:834 ++#, fuzzy ++msgid "Git Repository" ++msgstr "Repó" ++ ++#: lib/choose_repository.tcl:253 lib/choose_repository.tcl:260 ++#, fuzzy, tcl-format ++msgid "Directory %s already exists." ++msgstr "A(z) '%s' branch már létezik." ++ ++#: lib/choose_repository.tcl:265 ++#, fuzzy, tcl-format ++msgid "File %s already exists." ++msgstr "A(z) '%s' branch már létezik." ++ ++#: lib/choose_repository.tcl:286 ++#, fuzzy ++msgid "Clone" ++msgstr "Bezárás" ++ ++#: lib/choose_repository.tcl:299 ++msgid "URL:" ++msgstr "" ++ ++#: lib/choose_repository.tcl:319 ++msgid "Clone Type:" ++msgstr "" ++ ++#: lib/choose_repository.tcl:325 ++msgid "Standard (Fast, Semi-Redundant, Hardlinks)" ++msgstr "" ++ ++#: lib/choose_repository.tcl:331 ++msgid "Full Copy (Slower, Redundant Backup)" ++msgstr "" ++ ++#: lib/choose_repository.tcl:337 ++msgid "Shared (Fastest, Not Recommended, No Backup)" ++msgstr "" ++ ++#: lib/choose_repository.tcl:369 lib/choose_repository.tcl:418 ++#: lib/choose_repository.tcl:560 lib/choose_repository.tcl:630 ++#: lib/choose_repository.tcl:840 lib/choose_repository.tcl:848 ++#, fuzzy, tcl-format ++msgid "Not a Git repository: %s" ++msgstr "Nincs kiválasztott repó." ++ ++#: lib/choose_repository.tcl:405 ++msgid "Standard only available for local repository." ++msgstr "" ++ ++#: lib/choose_repository.tcl:409 ++msgid "Shared only available for local repository." ++msgstr "" ++ ++#: lib/choose_repository.tcl:439 ++msgid "Failed to configure origin" ++msgstr "" ++ ++#: lib/choose_repository.tcl:451 ++msgid "Counting objects" ++msgstr "" ++ ++#: lib/choose_repository.tcl:452 ++msgid "buckets" ++msgstr "" ++ ++#: lib/choose_repository.tcl:476 ++#, tcl-format ++msgid "Unable to copy objects/info/alternates: %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:512 ++#, fuzzy, tcl-format ++msgid "Nothing to clone from %s." ++msgstr "Új változások letöltése innen: %s" ++ ++#: lib/choose_repository.tcl:514 lib/choose_repository.tcl:728 ++#: lib/choose_repository.tcl:740 ++msgid "The 'master' branch has not been initialized." ++msgstr "" ++ ++#: lib/choose_repository.tcl:527 ++msgid "Hardlinks are unavailable. Falling back to copying." ++msgstr "" ++ ++#: lib/choose_repository.tcl:539 ++#, fuzzy, tcl-format ++msgid "Cloning from %s" ++msgstr "A(z) %s letöltése innen: %s" ++ ++#: lib/choose_repository.tcl:570 ++#, fuzzy ++msgid "Copying objects" ++msgstr "Az objektum adatbázis tömörítése" ++ ++#: lib/choose_repository.tcl:571 ++msgid "KiB" ++msgstr "" ++ ++#: lib/choose_repository.tcl:595 ++#, tcl-format ++msgid "Unable to copy object: %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:605 ++msgid "Linking objects" ++msgstr "" ++ ++#: lib/choose_repository.tcl:606 ++msgid "objects" ++msgstr "" ++ ++#: lib/choose_repository.tcl:614 ++#, tcl-format ++msgid "Unable to hardlink object: %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:669 ++msgid "Cannot fetch branches and objects. See console output for details." ++msgstr "" ++ ++#: lib/choose_repository.tcl:680 ++msgid "Cannot fetch tags. See console output for details." ++msgstr "" ++ ++#: lib/choose_repository.tcl:704 ++msgid "Cannot determine HEAD. See console output for details." ++msgstr "" ++ ++#: lib/choose_repository.tcl:713 ++#, tcl-format ++msgid "Unable to cleanup %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:719 ++#, fuzzy ++msgid "Clone failed." ++msgstr "A félbeszakítás nem sikerült." ++ ++#: lib/choose_repository.tcl:726 ++msgid "No default branch obtained." ++msgstr "" ++ ++#: lib/choose_repository.tcl:737 ++#, tcl-format ++msgid "Cannot resolve %s as a commit." ++msgstr "" ++ ++#: lib/choose_repository.tcl:749 ++#, fuzzy ++msgid "Creating working directory" ++msgstr "Nincs munkakönyvtár" ++ ++#: lib/choose_repository.tcl:750 lib/index.tcl:15 lib/index.tcl:80 ++#: lib/index.tcl:149 ++msgid "files" ++msgstr "" ++ ++#: lib/choose_repository.tcl:779 ++msgid "Initial file checkout failed." ++msgstr "" ++ ++#: lib/choose_repository.tcl:795 ++msgid "Open" ++msgstr "" ++ ++#: lib/choose_repository.tcl:805 ++#, fuzzy ++msgid "Repository:" ++msgstr "Repó" ++ ++#: lib/choose_repository.tcl:854 ++#, fuzzy, tcl-format ++msgid "Failed to open repository %s:" ++msgstr "Nem sikerült teljesen elmenteni a beállításokat:" ++ ++#: lib/choose_rev.tcl:53 ++msgid "This Detached Checkout" ++msgstr "Ez a leválasztott checkout" ++ ++#: lib/choose_rev.tcl:60 ++msgid "Revision Expression:" ++msgstr "Revízió kifejezés:" ++ ++#: lib/choose_rev.tcl:74 ++msgid "Local Branch" ++msgstr "Helyi branch" ++ ++#: lib/choose_rev.tcl:79 ++msgid "Tracking Branch" ++msgstr "Követő branch" ++ ++#: lib/choose_rev.tcl:84 lib/choose_rev.tcl:537 ++msgid "Tag" ++msgstr "Tag" ++ ++#: lib/choose_rev.tcl:317 ++#, tcl-format ++msgid "Invalid revision: %s" ++msgstr "Érvénytelen revízió: %s" ++ ++#: lib/choose_rev.tcl:338 ++msgid "No revision selected." ++msgstr "Nincs kiválasztva revízió." ++ ++#: lib/choose_rev.tcl:346 ++msgid "Revision expression is empty." ++msgstr "A revízió kifejezés üres." ++ ++#: lib/choose_rev.tcl:530 ++msgid "Updated" ++msgstr "" ++ ++#: lib/choose_rev.tcl:558 ++msgid "URL" ++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 "" ++"Nincs semmi javítanivaló.\n" ++"\n" ++"Az első commit létrehozása előtt nincs semmilyen commit amit javitani " ++"lehetne.\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 "" ++"Nem lehet javítani merge alatt.\n" ++"\n" ++"A jelenlegi merge még nem teljesen fejeződött be. Csak akkor javíthat egy " ++"előbbi commitot, hogyha megszakítja a jelenlegi merge folyamatot.\n" ++ ++#: lib/commit.tcl:49 ++msgid "Error loading commit data for amend:" ++msgstr "Hiba a javítandó commit adat betöltése közben:" ++ ++#: lib/commit.tcl:76 ++msgid "Unable to obtain your identity:" ++msgstr "Nem sikerült megállapítani az azonosítót:" ++ ++#: lib/commit.tcl:81 ++msgid "Invalid GIT_COMMITTER_IDENT:" ++msgstr "Érvénytelen GIT_COMMITTER_IDENT:" ++ ++#: lib/commit.tcl:133 ++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 "" ++"Az utolsó keresési állapot nem egyezik meg a repó állapotával.\n" ++"\n" ++"Egy másik Git program módosította ezt a repót az utolsó keresés óta. Egy " ++"újrakeresés mindenképpen szükséges mielőtt a jelenlegi branchet módosítani " ++"lehetne.\n" ++"\n" ++"Az újrakeresés most automatikusan el fog indulni.\n" ++ ++#: lib/commit.tcl:154 ++#, 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 "" ++"Nem commitolhatunk fájlokat merge előtt.\n" ++"\n" ++"A(z) %s fájlban ütközések vannak. Egyszer azokat ki kell javítani, majd " ++"hozzá ki kell választani a fájlt mielőtt commitolni lehetne.\n" ++ ++#: lib/commit.tcl:162 ++#, tcl-format ++msgid "" ++"Unknown file state %s detected.\n" ++"\n" ++"File %s cannot be committed by this program.\n" ++msgstr "" ++"Ismeretlen fájl típus %s érzékelve.\n" ++"\n" ++"A(z) %s fájlt nem tudja ez a program commitolni.\n" ++ ++#: lib/commit.tcl:170 ++msgid "" ++"No changes to commit.\n" ++"\n" ++"You must stage at least 1 file before you can commit.\n" ++msgstr "" ++"Nincs commitolandó változtatás.\n" ++"\n" ++"Legalább egy fájl ki kell választani, hogy commitolni lehessen.\n" ++ ++#: lib/commit.tcl:183 ++msgid "" ++"Please supply a commit message.\n" ++"\n" ++"A good commit message has the following format:\n" ++"\n" ++"- First line: Describe in one sentance what you did.\n" ++"- Second line: Blank\n" ++"- Remaining lines: Describe why this change is good.\n" ++msgstr "" ++"Adjunk megy egy commit üzenetet.\n" ++"\n" ++"Egy jó commit üzenetnek a következő a formátuma:\n" ++"\n" ++"- Első sor: Egy mondatban leírja, hogy mit csináltunk.\n" ++"- Második sor: Üres\n" ++"- A többi sor: Leírja, hogy miért jó ez a változtatás.\n" ++ ++#: lib/commit.tcl:257 ++msgid "write-tree failed:" ++msgstr "a write-tree sikertelen:" ++ ++#: lib/commit.tcl:275 ++#, tcl-format ++msgid "Commit %s appears to be corrupt" ++msgstr "" ++ ++#: lib/commit.tcl:279 ++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 "" ++"Nincs commitolandó változtatás.\n" ++"\n" ++"Egyetlen fájlt se módosított ez a commit és merge commit se volt.\n" ++"\n" ++"Az újrakeresés most automatikusan el fog indulni.\n" ++ ++#: lib/commit.tcl:286 ++msgid "No changes to commit." ++msgstr "Nincs commitolandó változtatás." ++ ++#: lib/commit.tcl:303 ++#, tcl-format ++msgid "warning: Tcl does not support encoding '%s'." ++msgstr "" ++ ++#: lib/commit.tcl:317 ++msgid "commit-tree failed:" ++msgstr "a commit-tree sikertelen:" ++ ++#: lib/commit.tcl:339 ++msgid "update-ref failed:" ++msgstr "az update-ref sikertelen:" ++ ++#: lib/commit.tcl:430 ++#, tcl-format ++msgid "Created commit %s: %s" ++msgstr "Létrejött a %s commit: %s" ++ ++#: lib/console.tcl:57 ++msgid "Working... please wait..." ++msgstr "Munka folyamatban.. Várjunk..." ++ ++#: lib/console.tcl:183 ++msgid "Success" ++msgstr "Siker" ++ ++#: lib/console.tcl:196 ++msgid "Error: Command Failed" ++msgstr "Hiba: a parancs sikertelen" ++ ++#: lib/database.tcl:43 ++msgid "Number of loose objects" ++msgstr "Elvesztett objektumok száma" ++ ++#: lib/database.tcl:44 ++msgid "Disk space used by loose objects" ++msgstr "Elveszett objektumok által elfoglalt lemezterület" ++ ++#: lib/database.tcl:45 ++msgid "Number of packed objects" ++msgstr "Csomagolt objektumok számra" ++ ++#: lib/database.tcl:46 ++msgid "Number of packs" ++msgstr "Csomagok száma" ++ ++#: lib/database.tcl:47 ++msgid "Disk space used by packed objects" ++msgstr "A csomagolt objektumok által használt lemezterület" ++ ++#: lib/database.tcl:48 ++msgid "Packed objects waiting for pruning" ++msgstr "Eltávolításra váró csomagolt objektumok számra" ++ ++#: lib/database.tcl:49 ++msgid "Garbage files" ++msgstr "Hulladék fájlok" ++ ++#: lib/database.tcl:72 ++msgid "Compressing the object database" ++msgstr "Az objektum adatbázis tömörítése" ++ ++#: lib/database.tcl:83 ++msgid "Verifying the object database with fsck-objects" ++msgstr "Az objektum adatbázis ellenőrzése az fsck-objects használatával" ++ ++#: lib/database.tcl:108 ++#, 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 when more than %i loose objects exist.\n" ++"\n" ++"Compress the database now?" ++msgstr "" ++ ++#: lib/date.tcl:25 ++#, fuzzy, tcl-format ++msgid "Invalid date from Git: %s" ++msgstr "Érvénytelen revízió: %s" ++ ++#: lib/diff.tcl:42 ++#, 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 "" ++"Nincsenek változások.\n" ++"\n" ++"A(z) %s módosítatlan.\n" ++"\n" ++"A fájl módosítási dátumát frissítette egy másik alkalmazás, de a fájl " ++"tartalma változatlan.\n" ++"\n" ++"Egy újrakeresés fog indulni a hasonló állapotú fájlok megtalálása érdekében." ++ ++#: lib/diff.tcl:81 ++#, fuzzy, tcl-format ++msgid "Loading diff of %s..." ++msgstr "A(z) %s betöltése..." ++ ++#: lib/diff.tcl:114 lib/diff.tcl:184 ++#, tcl-format ++msgid "Unable to display %s" ++msgstr "" ++ ++#: lib/diff.tcl:115 ++msgid "Error loading file:" ++msgstr "Hiba a fájl betöltése közben:" ++ ++#: lib/diff.tcl:122 ++msgid "Git Repository (subproject)" ++msgstr "" ++ ++#: lib/diff.tcl:134 ++msgid "* Binary file (not showing content)." ++msgstr "" ++ ++#: lib/diff.tcl:185 ++msgid "Error loading diff:" ++msgstr "Hiba a diff betöltése közben:" ++ ++#: lib/diff.tcl:302 ++msgid "Failed to unstage selected hunk." ++msgstr "Nem visszavonni a hunk kiválasztását." ++ ++#: lib/diff.tcl:309 ++msgid "Failed to stage selected hunk." ++msgstr "Nem sikerült kiválasztani a hunkot." ++ ++#: lib/error.tcl:12 lib/error.tcl:102 ++msgid "error" ++msgstr "hiba" ++ ++#: lib/error.tcl:28 ++msgid "warning" ++msgstr "figyelmeztetés" ++ ++#: lib/error.tcl:81 ++msgid "You must correct the above errors before committing." ++msgstr "Ki kell javítanunk a fenti hibákat commit előtt." ++ ++#: lib/index.tcl:241 ++#, fuzzy, tcl-format ++msgid "Unstaging %s from commit" ++msgstr "Commitba való kiválasztás visszavonása" ++ ++#: lib/index.tcl:285 ++#, fuzzy, tcl-format ++msgid "Adding %s" ++msgstr "A(z) %s olvasása..." ++ ++#: lib/index.tcl:340 ++#, tcl-format ++msgid "Revert changes in file %s?" ++msgstr "Visszaállítja a változtatásokat a(z) %s fájlban?" ++ ++#: lib/index.tcl:342 ++#, tcl-format ++msgid "Revert changes in these %i files?" ++msgstr "Visszaállítja a változtatásokat ebben e %i fájlban?" ++ ++#: lib/index.tcl:348 ++msgid "Any unstaged changes will be permanently lost by the revert." ++msgstr "" ++"Minden nem kiválasztott változtatás el fog veszni ezáltal a visszaállítás " ++"által." ++ ++#: lib/index.tcl:351 ++msgid "Do Nothing" ++msgstr "Ne csináljunk semmit" ++ ++#: 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 "" ++"Javítás közben nem lehetséges a merge.\n" ++"\n" ++"Egyszer be kell fejezni ennek a commitnak a javítását, majd kezdődhet egy " ++"merge.\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 "" ++"Az utolsó keresési állapot nem egyezik meg a repó állapotával.\n" ++"\n" ++"Egy másik Git program módosította ezt a repót az utolsó keresés óta. Egy " ++"újrakeresés mindenképpen szükséges mielőtt a jelenlegi branchet módosítani " ++"lehetne.\n" ++"\n" ++"Az újrakeresés most automatikusan el fog indulni.\n" ++ ++#: lib/merge.tcl:44 ++#, 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 "" ++"Jelenleg egy ütközés feloldása közben vagyunk.\n" ++"\n" ++"A(z) %s fájlban ütközések vannak.\n" ++"\n" ++"Fel kell oldanunk őket, kiválasztani a fájlt, és commitolni hogy befejezzük " ++"a jelenlegi merge-t. Csak ezután kezdhetünk el egy újabbat.\n" ++ ++#: lib/merge.tcl:54 ++#, 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 "" ++"Jelenleg egy változtatás közben vagyunk.\n" ++"\n" ++"A(z) %s fájl megváltozott.\n" ++"\n" ++"Először be kell fejeznünk a jelenlegi commitot, hogy elkezdhessünk egy merge-" ++"t. Ez segíteni fog, hogy félbeszakíthassunk egy merge-t.\n" ++ ++#: lib/merge.tcl:106 ++#, tcl-format ++msgid "%s of %s" ++msgstr "%s / %s" ++ ++#: lib/merge.tcl:119 ++#, tcl-format ++msgid "Merging %s and %s" ++msgstr "A(z) %s és a(z) %s merge-ölése" ++ ++#: lib/merge.tcl:131 ++msgid "Merge completed successfully." ++msgstr "A merge sikeresen befejeződött." ++ ++#: lib/merge.tcl:133 ++msgid "Merge failed. Conflict resolution is required." ++msgstr "A merge sikertelen. Fel kell oldanunk az ütközéseket." ++ ++#: lib/merge.tcl:158 ++#, tcl-format ++msgid "Merge Into %s" ++msgstr "Merge-ölés a következőbe: %s" ++ ++#: lib/merge.tcl:177 ++msgid "Revision To Merge" ++msgstr "Merge-ölni szándékozott revízió" ++ ++#: lib/merge.tcl:212 ++msgid "" ++"Cannot abort while amending.\n" ++"\n" ++"You must finish amending this commit.\n" ++msgstr "" ++"A commit javítás közben megszakítva.\n" ++"\n" ++"Be kell fejeznünk ennek a commitnak a javítását.\n" ++ ++#: 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 "" ++"Megszakítjuk a merge-t?\n" ++"\n" ++"A jelenlegi merge megszakítása *MINDEN* nem commitolt változtatás " ++"elvesztését jelenti.\n" ++"\n" ++"Folytatjuk a jelenlegi merge megszakítását?" ++ ++#: 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 "" ++"Visszavonjuk a módosításokat?\n" ++"\n" ++"A módosítások visszavonása *MINDEN* nem commitolt változtatás elvesztését " ++"jelenti.\n" ++"\n" ++"Folytatjuk a jelenlegi módosítások visszavonását?" ++ ++#: lib/merge.tcl:239 ++msgid "Aborting" ++msgstr "Félbeszakítás" ++ ++#: lib/merge.tcl:266 ++msgid "Abort failed." ++msgstr "A félbeszakítás nem sikerült." ++ ++#: lib/merge.tcl:268 ++msgid "Abort completed. Ready." ++msgstr "A megkeszakítás befejeződött. Kész." ++ ++#: lib/option.tcl:82 ++msgid "Restore Defaults" ++msgstr "Alapértelmezés visszaállítása" ++ ++#: lib/option.tcl:86 ++msgid "Save" ++msgstr "Mentés" ++ ++#: lib/option.tcl:96 ++#, tcl-format ++msgid "%s Repository" ++msgstr "%s Repó" ++ ++#: lib/option.tcl:97 ++msgid "Global (All Repositories)" ++msgstr "Globális (minden repó)" ++ ++#: lib/option.tcl:103 ++msgid "User Name" ++msgstr "Felhasználónév" ++ ++#: lib/option.tcl:104 ++msgid "Email Address" ++msgstr "Email cím" ++ ++#: lib/option.tcl:106 ++msgid "Summarize Merge Commits" ++msgstr "A merge commitok összegzése" ++ ++#: lib/option.tcl:107 ++msgid "Merge Verbosity" ++msgstr "Merge beszédesség" ++ ++#: lib/option.tcl:108 ++msgid "Show Diffstat After Merge" ++msgstr "Diffstat mutatása merge után" ++ ++#: lib/option.tcl:110 ++msgid "Trust File Modification Timestamps" ++msgstr "A fájl módosítási dátumok megbízhatóak" ++ ++#: lib/option.tcl:111 ++msgid "Prune Tracking Branches During Fetch" ++msgstr "A követő branchek eltávolítása letöltés alatt" ++ ++#: lib/option.tcl:112 ++msgid "Match Tracking Branches" ++msgstr "A követő branchek egyeztetése" ++ ++#: lib/option.tcl:113 ++msgid "Number of Diff Context Lines" ++msgstr "A diff környezeti sorok száma" ++ ++#: lib/option.tcl:114 ++msgid "New Branch Name Template" ++msgstr "Új branch név sablon" ++ ++#: lib/option.tcl:176 ++#, fuzzy ++msgid "Change Font" ++msgstr "Fő betűtípus" ++ ++#: lib/option.tcl:180 ++#, tcl-format ++msgid "Choose %s" ++msgstr "" ++ ++#: lib/option.tcl:186 ++msgid "pt." ++msgstr "" ++ ++#: lib/option.tcl:200 ++msgid "Preferences" ++msgstr "" ++ ++#: lib/option.tcl:235 ++msgid "Failed to completely save options:" ++msgstr "Nem sikerült teljesen elmenteni a beállításokat:" ++ ++#: lib/remote.tcl:165 ++#, fuzzy ++msgid "Prune from" ++msgstr "Törlés innen: %s..." ++ ++# tcl-format ++#: lib/remote.tcl:170 ++#, fuzzy ++msgid "Fetch from" ++msgstr "Letöltés innen: %s..." ++ ++#: lib/remote.tcl:213 ++#, fuzzy ++msgid "Push to" ++msgstr "Push" ++ ++#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 ++msgid "Delete Remote Branch" ++msgstr "Távoli branch törlése" ++ ++#: lib/remote_branch_delete.tcl:47 ++msgid "From Repository" ++msgstr "Forrás repó" ++ ++#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:123 ++msgid "Remote:" ++msgstr "Távoli:" ++ ++#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:138 ++msgid "Arbitrary URL:" ++msgstr "Tetszőleges URL:" ++ ++#: lib/remote_branch_delete.tcl:84 ++msgid "Branches" ++msgstr "Branchek" ++ ++#: lib/remote_branch_delete.tcl:109 ++msgid "Delete Only If" ++msgstr "Törlés csak akkor ha" ++ ++#: lib/remote_branch_delete.tcl:111 ++msgid "Merged Into:" ++msgstr "Merge-ölt a következőbe:" ++ ++#: lib/remote_branch_delete.tcl:119 ++msgid "Always (Do not perform merge checks)" ++msgstr "Mindig (Ne végezzen merge vizsgálatokat)" ++ ++#: lib/remote_branch_delete.tcl:152 ++msgid "A branch is required for 'Merged Into'." ++msgstr "Egy branch szükséges a 'Merge-ölt a következőbe'-hez." ++ ++#: lib/remote_branch_delete.tcl:184 ++#, fuzzy, tcl-format ++msgid "" ++"The following branches are not completely merged into %s:\n" ++"\n" ++" - %s" ++msgstr "A következő branchek nem teljesen lettek merge-ölve ebbe: %s:" ++ ++#: lib/remote_branch_delete.tcl:189 ++#, 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 "" ++"Egy vagy több merge teszt hibát jelzett, mivel nem töltöttük le a megfelelő " ++"commitokat. Próbáljunk meg letölteni a következőből: %s először." ++ ++#: lib/remote_branch_delete.tcl:207 ++msgid "Please select one or more branches to delete." ++msgstr "Válasszunk ki egy vagy több branchet törlésre." ++ ++#: lib/remote_branch_delete.tcl:216 ++msgid "" ++"Recovering deleted branches is difficult.\n" ++"\n" ++"Delete the selected branches?" ++msgstr "" ++"A törölt branchek visszaállítása nehéz.\n" ++"\n" ++"Töröljük a kiválasztott brancheket?" ++ ++#: lib/remote_branch_delete.tcl:226 ++#, tcl-format ++msgid "Deleting branches from %s" ++msgstr "Brancek törlése innen: %s" ++ ++#: lib/remote_branch_delete.tcl:286 ++msgid "No repository selected." ++msgstr "Nincs kiválasztott repó." ++ ++#: lib/remote_branch_delete.tcl:291 ++#, tcl-format ++msgid "Scanning %s..." ++msgstr "Keresés itt: %s..." ++ ++#: lib/shortcut.tcl:26 lib/shortcut.tcl:74 ++msgid "Cannot write script:" ++msgstr "Nem sikerült írni a scriptet:" ++ ++#: lib/shortcut.tcl:149 ++msgid "Cannot write icon:" ++msgstr "Nem sikerült írni az ikont:" ++ ++#: lib/status_bar.tcl:83 ++#, tcl-format ++msgid "%s ... %*i of %*i %s (%3i%%)" ++msgstr "%s ... %*i / %*i %s (%3i%%)" ++ ++#: lib/transport.tcl:6 ++#, fuzzy, tcl-format ++msgid "fetch %s" ++msgstr "Letöltés" ++ ++#: lib/transport.tcl:7 ++#, tcl-format ++msgid "Fetching new changes from %s" ++msgstr "Új változások letöltése innen: %s" ++ ++#: lib/transport.tcl:18 ++#, tcl-format ++msgid "remote prune %s" ++msgstr "" ++ ++#: lib/transport.tcl:19 ++#, tcl-format ++msgid "Pruning tracking branches deleted from %s" ++msgstr "A %s repóból törölt követő branchek törlése" ++ ++#: lib/transport.tcl:25 lib/transport.tcl:71 ++#, tcl-format ++msgid "push %s" ++msgstr "" ++ ++#: lib/transport.tcl:26 ++#, tcl-format ++msgid "Pushing changes to %s" ++msgstr "Változások pusholása ide: %s" ++ ++#: lib/transport.tcl:72 ++#, tcl-format ++msgid "Pushing %s %s to %s" ++msgstr "Pusholás: %s %s, ide: %s" ++ ++#: lib/transport.tcl:89 ++msgid "Push Branches" ++msgstr "Branchek pusholása" ++ ++#: lib/transport.tcl:103 ++msgid "Source Branches" ++msgstr "Forrás branchek" ++ ++#: lib/transport.tcl:120 ++msgid "Destination Repository" ++msgstr "Cél repó" ++ ++#: lib/transport.tcl:158 ++msgid "Transfer Options" ++msgstr "Átviteli opciók" ++ ++#: lib/transport.tcl:160 ++msgid "Force overwrite existing branch (may discard changes)" ++msgstr "" ++ ++#: lib/transport.tcl:164 ++msgid "Use thin pack (for slow network connections)" ++msgstr "Vékony csomagok használata (lassú hálózati kapcsolatok számára)" ++ ++#: lib/transport.tcl:168 ++msgid "Include tags" ++msgstr "Tageket is" ++ ++#~ msgid "Cannot find the git directory:" ++#~ msgstr "Nem található a git könyvtár:" ++ ++#~ msgid "Unstaged Changes (Will Not Be Committed)" ++#~ msgstr "Nem kiválasztott változtatások (nem lesz commitolva)" ++ ++#~ msgid "Push to %s..." ++#~ msgstr "Pusholás ide: %s..." ++ ++#~ msgid "Add To Commit" ++#~ msgstr "Hozzáadás a commithoz" ++ ++#~ msgid "Add Existing To Commit" ++#~ msgstr "Hozzáadás létező commithoz" ++ ++#~ msgid "Running miga..." ++#~ msgstr "A miga futtatása..." ++ ++#~ msgid "Add Existing" ++#~ msgstr "Létező hozzáadása" ++ ++#~ msgid "" ++#~ "Abort commit?\n" ++#~ "\n" ++#~ "Aborting the current commit will cause *ALL* uncommitted changes to be " ++#~ "lost.\n" ++#~ "\n" ++#~ "Continue with aborting the current commit?" ++#~ msgstr "" ++#~ "Megszakítjuk a commitot?\n" ++#~ "\n" ++#~ "A jelenlegi commit megszakítása *MINDEN* nem commitolt változtatás " ++#~ "elvesztését jelenti.\n" ++#~ "\n" ++#~ "Folytatjuk a jelenlegi commit megszakítását?" ++ ++#~ msgid "Aborting... please wait..." ++#~ msgstr "Megszakítás... várjunk..." diff --cc git-gui/po/it.po index 000000000,000000000..766841410 new file mode 100644 --- /dev/null +++ b/git-gui/po/it.po @@@ -1,0 -1,0 +1,1872 @@@ ++# Translation of git-gui to Italian ++# Copyright (C) 2007 Shawn Pearce ++# This file is distributed under the same license as the git-gui package. ++# Paolo Ciarrocchi , 2007 ++# Michele Ballabio , 2007. ++# ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: git-gui\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2007-10-10 14:42+0200\n" ++"PO-Revision-Date: 2007-10-10 15:27+0200\n" ++"Last-Translator: Paolo Ciarrocchi \n" ++"Language-Team: Italian \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++#: git-gui.sh:41 git-gui.sh:634 git-gui.sh:648 git-gui.sh:661 git-gui.sh:744 ++#: git-gui.sh:763 ++msgid "git-gui: fatal error" ++msgstr "git-gui: errore grave" ++ ++#: git-gui.sh:595 ++#, tcl-format ++msgid "Invalid font specified in %s:" ++msgstr "Caratteri non validi specificati in %s:" ++ ++#: git-gui.sh:620 ++msgid "Main Font" ++msgstr "Caratteri principali" ++ ++#: git-gui.sh:621 ++msgid "Diff/Console Font" ++msgstr "Caratteri per confronti e terminale" ++ ++#: git-gui.sh:635 ++msgid "Cannot find git in PATH." ++msgstr "Impossibile trovare git nel PATH" ++ ++#: git-gui.sh:662 ++msgid "Cannot parse Git version string:" ++msgstr "Impossibile determinare la versione di Git:" ++ ++#: git-gui.sh:680 ++#, 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 "" ++"La versione di GIT non può essere determinata.\n" ++"\n" ++"%s riporta che la versione è '%s'.\n" ++"\n" ++"%s richiede almeno Git 1.5.0 o superiore.\n" ++"\n" ++"Assumere che '%s' sia alla versione 1.5.0?\n" ++ ++#: git-gui.sh:853 ++msgid "Git directory not found:" ++msgstr "Non trovo la directory di git: " ++ ++#: git-gui.sh:860 ++msgid "Cannot move to top of working directory:" ++msgstr "Impossibile spostarsi sulla directory principale del progetto:" ++ ++#: git-gui.sh:867 ++msgid "Cannot use funny .git directory:" ++msgstr "Impossibile usare una .git directory strana:" ++ ++#: git-gui.sh:872 ++msgid "No working directory" ++msgstr "Nessuna directory di lavoro" ++ ++#: git-gui.sh:1019 ++msgid "Refreshing file status..." ++msgstr "Controllo dello stato dei file in corso..." ++ ++#: git-gui.sh:1084 ++msgid "Scanning for modified files ..." ++msgstr "Ricerca di file modificati in corso..." ++ ++#: git-gui.sh:1259 lib/browser.tcl:245 ++msgid "Ready." ++msgstr "Pronto." ++ ++#: git-gui.sh:1525 ++msgid "Unmodified" ++msgstr "Non modificato" ++ ++#: git-gui.sh:1527 ++msgid "Modified, not staged" ++msgstr "Modificato, non preparato per una nuova revisione" ++ ++#: git-gui.sh:1528 git-gui.sh:1533 ++msgid "Staged for commit" ++msgstr "Preparato per una nuova revisione" ++ ++#: git-gui.sh:1529 git-gui.sh:1534 ++msgid "Portions staged for commit" ++msgstr "Parti preparate per una nuova revisione" ++ ++#: git-gui.sh:1530 git-gui.sh:1535 ++msgid "Staged for commit, missing" ++msgstr "Preparato per una nuova revisione, mancante" ++ ++#: git-gui.sh:1532 ++msgid "Untracked, not staged" ++msgstr "Non tracciato, non preparato per una nuova revisione" ++ ++#: git-gui.sh:1537 ++msgid "Missing" ++msgstr "Mancante" ++ ++#: git-gui.sh:1538 ++msgid "Staged for removal" ++msgstr "Preparato per la rimozione" ++ ++#: git-gui.sh:1539 ++msgid "Staged for removal, still present" ++msgstr "Preparato alla rimozione, ancora presente" ++ ++#: git-gui.sh:1541 git-gui.sh:1542 git-gui.sh:1543 git-gui.sh:1544 ++msgid "Requires merge resolution" ++msgstr "Richiede risoluzione dei conflitti" ++ ++#: git-gui.sh:1579 ++msgid "Starting gitk... please wait..." ++msgstr "Avvio di gitk... attendere..." ++ ++#: git-gui.sh:1588 ++#, tcl-format ++msgid "" ++"Unable to start gitk:\n" ++"\n" ++"%s does not exist" ++msgstr "" ++"Impossibile avviare gitk:\n" ++"\n" ++"%s non esiste" ++ ++#: git-gui.sh:1788 lib/choose_repository.tcl:32 ++msgid "Repository" ++msgstr "Archivio" ++ ++#: git-gui.sh:1789 ++msgid "Edit" ++msgstr "Modifica" ++ ++#: git-gui.sh:1791 lib/choose_rev.tcl:560 ++msgid "Branch" ++msgstr "Ramo" ++ ++#: git-gui.sh:1794 lib/choose_rev.tcl:547 ++msgid "Commit@@noun" ++msgstr "Revisione" ++ ++#: git-gui.sh:1797 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168 ++msgid "Merge" ++msgstr "Fusione (Merge)" ++ ++#: git-gui.sh:1798 lib/choose_rev.tcl:556 ++msgid "Remote" ++msgstr "Remoto" ++ ++#: git-gui.sh:1807 ++msgid "Browse Current Branch's Files" ++msgstr "Esplora i file del ramo corrente" ++ ++#: git-gui.sh:1811 ++msgid "Browse Branch Files..." ++msgstr "Esplora i file del ramo..." ++ ++#: git-gui.sh:1816 ++msgid "Visualize Current Branch's History" ++msgstr "Visualizza la cronologia del ramo corrente" ++ ++#: git-gui.sh:1820 ++msgid "Visualize All Branch History" ++msgstr "Visualizza la cronologia di tutti i rami" ++ ++#: git-gui.sh:1827 ++#, tcl-format ++msgid "Browse %s's Files" ++msgstr "Esplora i file di %s" ++ ++#: git-gui.sh:1829 ++#, tcl-format ++msgid "Visualize %s's History" ++msgstr "Visualizza la cronologia di %s" ++ ++#: git-gui.sh:1834 lib/database.tcl:27 lib/database.tcl:67 ++msgid "Database Statistics" ++msgstr "Statistiche dell'archivio" ++ ++#: git-gui.sh:1837 lib/database.tcl:34 ++msgid "Compress Database" ++msgstr "Comprimi l'archivio" ++ ++#: git-gui.sh:1840 ++msgid "Verify Database" ++msgstr "Verifica l'archivio" ++ ++#: git-gui.sh:1847 git-gui.sh:1851 git-gui.sh:1855 lib/shortcut.tcl:9 ++#: lib/shortcut.tcl:45 lib/shortcut.tcl:84 ++msgid "Create Desktop Icon" ++msgstr "Crea icona desktop" ++ ++#: git-gui.sh:1860 lib/choose_repository.tcl:36 lib/choose_repository.tcl:95 ++msgid "Quit" ++msgstr "Esci" ++ ++#: git-gui.sh:1867 ++msgid "Undo" ++msgstr "Annulla" ++ ++#: git-gui.sh:1870 ++msgid "Redo" ++msgstr "Ripeti" ++ ++#: git-gui.sh:1874 git-gui.sh:2366 ++msgid "Cut" ++msgstr "Taglia" ++ ++#: git-gui.sh:1877 git-gui.sh:2369 git-gui.sh:2440 git-gui.sh:2512 ++#: lib/console.tcl:67 ++msgid "Copy" ++msgstr "Copia" ++ ++#: git-gui.sh:1880 git-gui.sh:2372 ++msgid "Paste" ++msgstr "Incolla" ++ ++#: git-gui.sh:1883 git-gui.sh:2375 lib/branch_delete.tcl:26 ++#: lib/remote_branch_delete.tcl:38 ++msgid "Delete" ++msgstr "Elimina" ++ ++#: git-gui.sh:1887 git-gui.sh:2379 git-gui.sh:2516 lib/console.tcl:69 ++msgid "Select All" ++msgstr "Seleziona tutto" ++ ++#: git-gui.sh:1896 ++msgid "Create..." ++msgstr "Crea..." ++ ++#: git-gui.sh:1902 ++msgid "Checkout..." ++msgstr "Attiva..." ++ ++#: git-gui.sh:1908 ++msgid "Rename..." ++msgstr "Rinomina" ++ ++#: git-gui.sh:1913 git-gui.sh:2012 ++msgid "Delete..." ++msgstr "Elimina..." ++ ++#: git-gui.sh:1918 ++msgid "Reset..." ++msgstr "Ripristina..." ++ ++#: git-gui.sh:1930 git-gui.sh:2313 ++msgid "New Commit" ++msgstr "Nuova revisione" ++ ++#: git-gui.sh:1938 git-gui.sh:2320 ++msgid "Amend Last Commit" ++msgstr "Correggi l'ultima revisione" ++ ++#: git-gui.sh:1947 git-gui.sh:2280 lib/remote_branch_delete.tcl:99 ++msgid "Rescan" ++msgstr "Analizza nuovamente" ++ ++#: git-gui.sh:1953 ++msgid "Stage To Commit" ++msgstr "Prepara per una nuova revisione" ++ ++#: git-gui.sh:1958 ++msgid "Stage Changed Files To Commit" ++msgstr "Prepara i file modificati per una nuova revisione" ++ ++#: git-gui.sh:1964 ++msgid "Unstage From Commit" ++msgstr "Annulla preparazione" ++ ++#: git-gui.sh:1969 lib/index.tcl:352 ++msgid "Revert Changes" ++msgstr "Annulla modifiche" ++ ++#: git-gui.sh:1976 git-gui.sh:2292 git-gui.sh:2390 ++msgid "Sign Off" ++msgstr "Sign Off" ++ ++#: git-gui.sh:1980 git-gui.sh:2296 ++msgid "Commit@@verb" ++msgstr "Nuova revisione" ++ ++#: git-gui.sh:1991 ++msgid "Local Merge..." ++msgstr "Fusione locale..." ++ ++#: git-gui.sh:1996 ++msgid "Abort Merge..." ++msgstr "Interrompi fusione..." ++ ++#: git-gui.sh:2008 ++msgid "Push..." ++msgstr "Propaga..." ++ ++#: git-gui.sh:2019 lib/choose_repository.tcl:41 ++msgid "Apple" ++msgstr "Apple" ++ ++#: git-gui.sh:2022 git-gui.sh:2044 lib/about.tcl:13 ++#: lib/choose_repository.tcl:44 lib/choose_repository.tcl:50 ++#, tcl-format ++msgid "About %s" ++msgstr "Informazioni su %s" ++ ++#: git-gui.sh:2026 ++msgid "Preferences..." ++msgstr "Preferenze..." ++ ++#: git-gui.sh:2034 git-gui.sh:2558 ++msgid "Options..." ++msgstr "Opzioni..." ++ ++#: git-gui.sh:2040 lib/choose_repository.tcl:47 ++msgid "Help" ++msgstr "Aiuto" ++ ++#: git-gui.sh:2081 ++msgid "Online Documentation" ++msgstr "Documentazione sul web" ++ ++#: git-gui.sh:2165 ++#, tcl-format ++msgid "fatal: cannot stat path %s: No such file or directory" ++msgstr "" ++"errore grave: impossibile effettuare lo stat del path %s: file o directory " ++"non trovata" ++ ++#: git-gui.sh:2198 ++msgid "Current Branch:" ++msgstr "Ramo attuale:" ++ ++#: git-gui.sh:2219 ++msgid "Staged Changes (Will Commit)" ++msgstr "Modifiche preparate (saranno nella nuova revisione)" ++ ++#: git-gui.sh:2239 ++msgid "Unstaged Changes" ++msgstr "Modifiche non preparate" ++ ++#: git-gui.sh:2286 ++msgid "Stage Changed" ++msgstr "Prepara modificati" ++ ++#: git-gui.sh:2302 lib/transport.tcl:93 lib/transport.tcl:182 ++msgid "Push" ++msgstr "Propaga (Push)" ++ ++#: git-gui.sh:2332 ++msgid "Initial Commit Message:" ++msgstr "Messaggio di revisione iniziale:" ++ ++#: git-gui.sh:2333 ++msgid "Amended Commit Message:" ++msgstr "Messaggio di revisione corretto:" ++ ++#: git-gui.sh:2334 ++msgid "Amended Initial Commit Message:" ++msgstr "Messaggio iniziale di revisione corretto:" ++ ++#: git-gui.sh:2335 ++msgid "Amended Merge Commit Message:" ++msgstr "Messaggio di fusione corretto:" ++ ++#: git-gui.sh:2336 ++msgid "Merge Commit Message:" ++msgstr "Messaggio di fusione:" ++ ++#: git-gui.sh:2337 ++msgid "Commit Message:" ++msgstr "Messaggio di revisione:" ++ ++#: git-gui.sh:2382 git-gui.sh:2520 lib/console.tcl:71 ++msgid "Copy All" ++msgstr "Copia tutto" ++ ++#: git-gui.sh:2406 lib/blame.tcl:104 ++msgid "File:" ++msgstr "File:" ++ ++#: git-gui.sh:2508 ++msgid "Refresh" ++msgstr "Rinfresca" ++ ++#: git-gui.sh:2529 ++msgid "Apply/Reverse Hunk" ++msgstr "Applica/Inverti sezione" ++ ++#: git-gui.sh:2535 ++msgid "Decrease Font Size" ++msgstr "Diminuisci dimensione caratteri" ++ ++#: git-gui.sh:2539 ++msgid "Increase Font Size" ++msgstr "Aumenta dimensione caratteri" ++ ++#: git-gui.sh:2544 ++msgid "Show Less Context" ++msgstr "Mostra meno contesto" ++ ++#: git-gui.sh:2551 ++msgid "Show More Context" ++msgstr "Mostra più contesto" ++ ++#: git-gui.sh:2565 ++msgid "Unstage Hunk From Commit" ++msgstr "Sezione non preparata per una nuova revisione" ++ ++#: git-gui.sh:2567 ++msgid "Stage Hunk For Commit" ++msgstr "Prepara sezione per una nuova revisione" ++ ++#: git-gui.sh:2586 ++msgid "Initializing..." ++msgstr "Inizializzazione..." ++ ++#: git-gui.sh:2677 ++#, 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 "" ++"Possibili problemi con le variabili d'ambiente.\n" ++"\n" ++"Le seguenti variabili d'ambiente saranno probabilmente\n" ++"ignorate da tutti i sottoprocessi di Git avviati\n" ++"da %s:\n" ++"\n" ++ ++#: git-gui.sh:2707 ++msgid "" ++"\n" ++"This is due to a known issue with the\n" ++"Tcl binary distributed by Cygwin." ++msgstr "" ++"\n" ++"Ciò è dovuto a un problema conosciuto\n" ++"causato dall'eseguibile Tcl distribuito da Cygwin." ++ ++#: git-gui.sh:2712 ++#, 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" ++"Una buona alternativa a %s\n" ++"consiste nell'assegnare valori alle variabili di configurazione\n" ++"user.name e user.email nel tuo file ~/.gitconfig personale.\n" ++ ++#: lib/about.tcl:25 ++msgid "git-gui - a graphical user interface for Git." ++msgstr "git-gui - un'interfaccia grafica per Git." ++ ++#: lib/blame.tcl:77 ++msgid "File Viewer" ++msgstr "Mostra file" ++ ++#: lib/blame.tcl:81 ++msgid "Commit:" ++msgstr "Revisione:" ++ ++#: lib/blame.tcl:249 ++msgid "Copy Commit" ++msgstr "Copia revisione" ++ ++#: lib/blame.tcl:369 ++#, tcl-format ++msgid "Reading %s..." ++msgstr "Lettura di %s..." ++ ++#: lib/blame.tcl:473 ++msgid "Loading copy/move tracking annotations..." ++msgstr "Caricamento annotazioni per copie/spostamenti..." ++ ++#: lib/blame.tcl:493 ++msgid "lines annotated" ++msgstr "linee annotate" ++ ++#: lib/blame.tcl:674 ++msgid "Loading original location annotations..." ++msgstr "Caricamento annotazioni per posizione originaria..." ++ ++#: lib/blame.tcl:677 ++msgid "Annotation complete." ++msgstr "Annotazione completata." ++ ++#: lib/blame.tcl:731 ++msgid "Loading annotation..." ++msgstr "Caricamento annotazioni..." ++ ++#: lib/blame.tcl:787 ++msgid "Author:" ++msgstr "Autore:" ++ ++#: lib/blame.tcl:791 ++msgid "Committer:" ++msgstr "Revisione creata da:" ++ ++#: lib/blame.tcl:796 ++msgid "Original File:" ++msgstr "File originario:" ++ ++#: lib/blame.tcl:910 ++msgid "Originally By:" ++msgstr "In origine da:" ++ ++#: lib/blame.tcl:916 ++msgid "In File:" ++msgstr "Nel file:" ++ ++#: lib/blame.tcl:921 ++msgid "Copied Or Moved Here By:" ++msgstr "Copiato o spostato qui da:" ++ ++#: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19 ++msgid "Checkout Branch" ++msgstr "Attiva ramo" ++ ++#: lib/branch_checkout.tcl:23 ++msgid "Checkout" ++msgstr "Attiva" ++ ++#: lib/branch_checkout.tcl:27 lib/branch_create.tcl:35 ++#: lib/branch_delete.tcl:32 lib/branch_rename.tcl:30 lib/browser.tcl:281 ++#: lib/checkout_op.tcl:522 lib/choose_font.tcl:43 lib/merge.tcl:172 ++#: lib/option.tcl:90 lib/remote_branch_delete.tcl:42 lib/transport.tcl:97 ++msgid "Cancel" ++msgstr "Annulla" ++ ++#: lib/branch_checkout.tcl:32 lib/browser.tcl:286 ++msgid "Revision" ++msgstr "Revisione" ++ ++#: lib/branch_checkout.tcl:36 lib/branch_create.tcl:69 lib/option.tcl:202 ++msgid "Options" ++msgstr "Opzioni" ++ ++#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92 ++msgid "Fetch Tracking Branch" ++msgstr "Recupera duplicato locale di ramo remoto" ++ ++#: lib/branch_checkout.tcl:44 ++msgid "Detach From Local Branch" ++msgstr "Stacca da ramo locale" ++ ++#: lib/branch_create.tcl:22 ++msgid "Create Branch" ++msgstr "Crea ramo" ++ ++#: lib/branch_create.tcl:27 ++msgid "Create New Branch" ++msgstr "Crea nuovo ramo" ++ ++#: lib/branch_create.tcl:31 lib/choose_repository.tcl:199 ++msgid "Create" ++msgstr "Crea" ++ ++#: lib/branch_create.tcl:40 ++msgid "Branch Name" ++msgstr "Nome del ramo" ++ ++#: lib/branch_create.tcl:43 ++msgid "Name:" ++msgstr "Nome:" ++ ++#: lib/branch_create.tcl:58 ++msgid "Match Tracking Branch Name" ++msgstr "Appaia nome del duplicato locale di ramo remoto" ++ ++#: lib/branch_create.tcl:66 ++msgid "Starting Revision" ++msgstr "Revisione iniziale" ++ ++#: lib/branch_create.tcl:72 ++msgid "Update Existing Branch:" ++msgstr "Aggiorna ramo esistente:" ++ ++#: lib/branch_create.tcl:75 ++msgid "No" ++msgstr "No" ++ ++#: lib/branch_create.tcl:80 ++msgid "Fast Forward Only" ++msgstr "Solo fast forward" ++ ++#: lib/branch_create.tcl:85 lib/checkout_op.tcl:514 ++msgid "Reset" ++msgstr "Ripristina" ++ ++#: lib/branch_create.tcl:97 ++msgid "Checkout After Creation" ++msgstr "Attiva dopo la creazione" ++ ++#: lib/branch_create.tcl:131 ++msgid "Please select a tracking branch." ++msgstr "Scegliere un duplicato locale di ramo remoto" ++ ++#: lib/branch_create.tcl:140 ++#, tcl-format ++msgid "Tracking branch %s is not a branch in the remote repository." ++msgstr "" ++"Il duplicato locale del ramo remoto %s non è un ramo nell'archivio remoto." ++ ++#: lib/branch_create.tcl:153 lib/branch_rename.tcl:86 ++msgid "Please supply a branch name." ++msgstr "Inserire un nome per il ramo." ++ ++#: lib/branch_create.tcl:164 lib/branch_rename.tcl:106 ++#, tcl-format ++msgid "'%s' is not an acceptable branch name." ++msgstr "'%s' non è utilizzabile come nome di ramo." ++ ++#: lib/branch_delete.tcl:15 ++msgid "Delete Branch" ++msgstr "Elimina ramo" ++ ++#: lib/branch_delete.tcl:20 ++msgid "Delete Local Branch" ++msgstr "Elimina ramo locale" ++ ++#: lib/branch_delete.tcl:37 ++msgid "Local Branches" ++msgstr "Rami locali" ++ ++#: lib/branch_delete.tcl:52 ++msgid "Delete Only If Merged Into" ++msgstr "Cancella solo se fuso con un altro ramo" ++ ++#: lib/branch_delete.tcl:54 ++msgid "Always (Do not perform merge test.)" ++msgstr "Sempre (Non effettuare verifiche di fusione)." ++ ++#: lib/branch_delete.tcl:103 ++#, tcl-format ++msgid "The following branches are not completely merged into %s:" ++msgstr "I rami seguenti non sono stati fusi completamente in %s:" ++ ++#: lib/branch_delete.tcl:115 ++msgid "" ++"Recovering deleted branches is difficult. \n" ++"\n" ++" Delete the selected branches?" ++msgstr "" ++"Ricomporre rami cancellati può essere complicato. \n" ++"\n" ++" Eliminare i rami selezionati?" ++ ++#: lib/branch_delete.tcl:141 ++#, tcl-format ++msgid "" ++"Failed to delete branches:\n" ++"%s" ++msgstr "" ++"Cancellazione rami fallita:\n" ++"%s" ++ ++#: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22 ++msgid "Rename Branch" ++msgstr "Rinomina ramo" ++ ++#: lib/branch_rename.tcl:26 ++msgid "Rename" ++msgstr "Rinomina" ++ ++#: lib/branch_rename.tcl:36 ++msgid "Branch:" ++msgstr "Ramo:" ++ ++#: lib/branch_rename.tcl:39 ++msgid "New Name:" ++msgstr "Nuovo Nome:" ++ ++#: lib/branch_rename.tcl:75 ++msgid "Please select a branch to rename." ++msgstr "Scegliere un ramo da rinominare." ++ ++#: lib/branch_rename.tcl:96 lib/checkout_op.tcl:179 ++#, tcl-format ++msgid "Branch '%s' already exists." ++msgstr "Il ramo '%s' esiste già." ++ ++#: lib/branch_rename.tcl:117 ++#, tcl-format ++msgid "Failed to rename '%s'." ++msgstr "Impossibile rinominare '%s'." ++ ++#: lib/browser.tcl:17 ++msgid "Starting..." ++msgstr "Avvio in corso..." ++ ++#: lib/browser.tcl:26 ++msgid "File Browser" ++msgstr "File browser" ++ ++#: lib/browser.tcl:125 lib/browser.tcl:142 ++#, tcl-format ++msgid "Loading %s..." ++msgstr "Caricamento %s..." ++ ++#: lib/browser.tcl:186 ++msgid "[Up To Parent]" ++msgstr "[Directory superiore]" ++ ++#: lib/browser.tcl:266 lib/browser.tcl:272 ++msgid "Browse Branch Files" ++msgstr "Esplora i file del ramo" ++ ++#: lib/browser.tcl:277 lib/choose_repository.tcl:215 ++#: lib/choose_repository.tcl:305 lib/choose_repository.tcl:315 ++#: lib/choose_repository.tcl:811 ++msgid "Browse" ++msgstr "Sfoglia" ++ ++#: lib/checkout_op.tcl:79 ++#, tcl-format ++msgid "Fetching %s from %s" ++msgstr "Recupero %s da %s" ++ ++#: lib/checkout_op.tcl:127 ++#, tcl-format ++msgid "fatal: Cannot resolve %s" ++msgstr "errore grave: impossibile risolvere %s" ++ ++#: lib/checkout_op.tcl:140 lib/console.tcl:79 lib/database.tcl:31 ++msgid "Close" ++msgstr "Chiudi" ++ ++#: lib/checkout_op.tcl:169 ++#, tcl-format ++msgid "Branch '%s' does not exist." ++msgstr "Il ramo '%s' non esiste." ++ ++#: lib/checkout_op.tcl:206 ++#, tcl-format ++msgid "" ++"Branch '%s' already exists.\n" ++"\n" ++"It cannot fast-forward to %s.\n" ++"A merge is required." ++msgstr "" ++"Il ramo '%s' esiste già.\n" ++"\n" ++"Non può effettuare un 'fast-forward' a %s.\n" ++"E' necessaria una fusione." ++ ++#: lib/checkout_op.tcl:220 ++#, tcl-format ++msgid "Merge strategy '%s' not supported." ++msgstr "La strategia di fusione '%s' non è supportata." ++ ++#: lib/checkout_op.tcl:239 ++#, tcl-format ++msgid "Failed to update '%s'." ++msgstr "Aggiornamento di '%s' fallito." ++ ++#: lib/checkout_op.tcl:251 ++msgid "Staging area (index) is already locked." ++msgstr "L'area di preparazione per una nuova revisione (indice) è già bloccata." ++ ++#: lib/checkout_op.tcl:266 ++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 "" ++"L'ultimo stato analizzato non corrisponde allo stato dell'archivio.\n" ++"\n" ++"Un altro programma Git ha modificato questo archivio dall'ultima analisi. " ++"Bisogna effettuare una nuova analisi prima di poter cambiare il ramo " ++"corrente.\n" ++"\n" ++"La nuova analisi comincerà ora.\n" ++ ++#: lib/checkout_op.tcl:322 ++#, tcl-format ++msgid "Updating working directory to '%s'..." ++msgstr "Aggiornamento della directory di lavoro a '%s' in corso..." ++ ++#: lib/checkout_op.tcl:353 ++#, tcl-format ++msgid "Aborted checkout of '%s' (file level merging is required)." ++msgstr "Attivazione di '%s' fallita (richiesta una fusione a livello file)." ++ ++#: lib/checkout_op.tcl:354 ++msgid "File level merge required." ++msgstr "E' richiesta una fusione a livello file." ++ ++#: lib/checkout_op.tcl:358 ++#, tcl-format ++msgid "Staying on branch '%s'." ++msgstr "Si rimarrà sul ramo '%s'." ++ ++#: lib/checkout_op.tcl:429 ++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 "" ++"Non si è più su un ramo locale\n" ++"\n" ++"Se si vuole rimanere su un ramo, crearne uno ora a partire da 'Questa " ++"revisione attiva staccata'." ++ ++#: lib/checkout_op.tcl:446 ++#, tcl-format ++msgid "Checked out '%s'." ++msgstr "Attivazione di '%s' completata." ++ ++#: lib/checkout_op.tcl:478 ++#, tcl-format ++msgid "Resetting '%s' to '%s' will lose the following commits:" ++msgstr "" ++"Ripristinare '%s' a '%s' comporterà la perdita delle seguenti revisioni:" ++ ++#: lib/checkout_op.tcl:500 ++msgid "Recovering lost commits may not be easy." ++msgstr "Ricomporre le revisioni perdute potrebbe non essere semplice." ++ ++#: lib/checkout_op.tcl:505 ++#, tcl-format ++msgid "Reset '%s'?" ++msgstr "Ripristinare '%s'?" ++ ++#: lib/checkout_op.tcl:510 lib/merge.tcl:164 ++msgid "Visualize" ++msgstr "Visualizza" ++ ++#: lib/checkout_op.tcl:578 ++#, 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 "" ++"Preparazione ramo corrente fallita.\n" ++"\n" ++"Questa directory di lavoro è stata convertita solo parzialmente. I file sono " ++"stati aggiornati correttamente, ma l'aggiornamento di un file di Git ha " ++"prodotto degli errori.\n" ++"\n" ++"Questo non sarebbe dovuto succedere. %s ora terminerà senza altre azioni." ++ ++#: lib/choose_font.tcl:39 ++msgid "Select" ++msgstr "Seleziona" ++ ++#: lib/choose_font.tcl:53 ++msgid "Font Family" ++msgstr "Famiglia di caratteri" ++ ++#: lib/choose_font.tcl:73 ++msgid "Font Size" ++msgstr "Dimensione caratteri" ++ ++#: lib/choose_font.tcl:90 ++msgid "Font Example" ++msgstr "Esempio caratteri" ++ ++#: lib/choose_font.tcl:101 ++msgid "" ++"This is example text.\n" ++"If you like this text, it can be your font." ++msgstr "" ++"Questo è un testo d'esempio.\n" ++"Se ti piace questo testo, può essere il carattere giusto." ++ ++#: lib/choose_repository.tcl:25 ++msgid "Git Gui" ++msgstr "Git Gui" ++ ++#: lib/choose_repository.tcl:69 lib/choose_repository.tcl:204 ++msgid "Create New Repository" ++msgstr "Crea nuovo archivio" ++ ++#: lib/choose_repository.tcl:74 lib/choose_repository.tcl:291 ++msgid "Clone Existing Repository" ++msgstr "Clona archivio esistente" ++ ++#: lib/choose_repository.tcl:79 lib/choose_repository.tcl:800 ++msgid "Open Existing Repository" ++msgstr "Apri archivio esistente" ++ ++#: lib/choose_repository.tcl:91 ++msgid "Next >" ++msgstr "Successivo >" ++ ++#: lib/choose_repository.tcl:152 ++#, tcl-format ++msgid "Location %s already exists." ++msgstr "La posizione %s esiste già." ++ ++#: lib/choose_repository.tcl:158 lib/choose_repository.tcl:165 ++#: lib/choose_repository.tcl:172 ++#, tcl-format ++msgid "Failed to create repository %s:" ++msgstr "Impossibile creare l'archivio %s:" ++ ++#: lib/choose_repository.tcl:209 lib/choose_repository.tcl:309 ++msgid "Directory:" ++msgstr "Directory:" ++ ++#: lib/choose_repository.tcl:238 lib/choose_repository.tcl:363 ++#: lib/choose_repository.tcl:834 ++msgid "Git Repository" ++msgstr "Archivio Git" ++ ++#: lib/choose_repository.tcl:253 lib/choose_repository.tcl:260 ++#, tcl-format ++msgid "Directory %s already exists." ++msgstr "La directory %s esiste già." ++ ++#: lib/choose_repository.tcl:265 ++#, tcl-format ++msgid "File %s already exists." ++msgstr "Il file %s esiste già." ++ ++#: lib/choose_repository.tcl:286 ++msgid "Clone" ++msgstr "Clona" ++ ++#: lib/choose_repository.tcl:299 ++msgid "URL:" ++msgstr "URL:" ++ ++#: lib/choose_repository.tcl:319 ++msgid "Clone Type:" ++msgstr "Tipo di clone:" ++ ++#: lib/choose_repository.tcl:325 ++msgid "Standard (Fast, Semi-Redundant, Hardlinks)" ++msgstr "Standard (veloce, semi-ridondante, con hardlink)" ++ ++#: lib/choose_repository.tcl:331 ++msgid "Full Copy (Slower, Redundant Backup)" ++msgstr "Copia completa (più lento, backup ridondante)" ++ ++#: lib/choose_repository.tcl:337 ++msgid "Shared (Fastest, Not Recommended, No Backup)" ++msgstr "Shared (il più veloce, non raccomandato, nessun backup)" ++ ++#: lib/choose_repository.tcl:369 lib/choose_repository.tcl:418 ++#: lib/choose_repository.tcl:560 lib/choose_repository.tcl:630 ++#: lib/choose_repository.tcl:840 lib/choose_repository.tcl:848 ++#, tcl-format ++msgid "Not a Git repository: %s" ++msgstr "%s non è un archivio Git." ++ ++#: lib/choose_repository.tcl:405 ++msgid "Standard only available for local repository." ++msgstr "Standard è disponibile solo per archivi locali." ++ ++#: lib/choose_repository.tcl:409 ++msgid "Shared only available for local repository." ++msgstr "Shared è disponibile solo per archivi locali." ++ ++#: lib/choose_repository.tcl:439 ++msgid "Failed to configure origin" ++msgstr "Impossibile configurare origin" ++ ++#: lib/choose_repository.tcl:451 ++msgid "Counting objects" ++msgstr "Calcolo oggetti" ++ ++#: lib/choose_repository.tcl:452 ++msgid "buckets" ++msgstr "" ++ ++#: lib/choose_repository.tcl:476 ++#, tcl-format ++msgid "Unable to copy objects/info/alternates: %s" ++msgstr "Impossibile copiare oggetti/info/alternate: %s" ++ ++#: lib/choose_repository.tcl:512 ++#, tcl-format ++msgid "Nothing to clone from %s." ++msgstr "Niente da clonare da %s." ++ ++#: lib/choose_repository.tcl:514 lib/choose_repository.tcl:728 ++#: lib/choose_repository.tcl:740 ++msgid "The 'master' branch has not been initialized." ++msgstr "Il ramo 'master' non è stato inizializzato." ++ ++#: lib/choose_repository.tcl:527 ++msgid "Hardlinks are unavailable. Falling back to copying." ++msgstr "Impossibile utilizzare gli hardlink. Si ricorrerà alla copia." ++ ++#: lib/choose_repository.tcl:539 ++#, tcl-format ++msgid "Cloning from %s" ++msgstr "Clonazione da %s" ++ ++#: lib/choose_repository.tcl:570 ++msgid "Copying objects" ++msgstr "Copia degli oggetti" ++ ++#: lib/choose_repository.tcl:571 ++msgid "KiB" ++msgstr "KiB" ++ ++#: lib/choose_repository.tcl:595 ++#, tcl-format ++msgid "Unable to copy object: %s" ++msgstr "Impossibile copiare oggetto: %s" ++ ++#: lib/choose_repository.tcl:605 ++msgid "Linking objects" ++msgstr "Collegamento oggetti" ++ ++#: lib/choose_repository.tcl:606 ++msgid "objects" ++msgstr "oggetti" ++ ++#: lib/choose_repository.tcl:614 ++#, tcl-format ++msgid "Unable to hardlink object: %s" ++msgstr "Hardlink impossibile sull'oggetto: %s" ++ ++#: lib/choose_repository.tcl:669 ++msgid "Cannot fetch branches and objects. See console output for details." ++msgstr "" ++"Impossibile recuperare rami e oggetti. Controllare i dettagli forniti dalla " ++"console." ++ ++#: lib/choose_repository.tcl:680 ++msgid "Cannot fetch tags. See console output for details." ++msgstr "" ++"Impossibile recuperare le etichette. Controllare i dettagli forniti dalla " ++"console." ++ ++#: lib/choose_repository.tcl:704 ++msgid "Cannot determine HEAD. See console output for details." ++msgstr "" ++"Impossibile determinare HEAD. Controllare i dettagli forniti dalla console." ++ ++#: lib/choose_repository.tcl:713 ++#, tcl-format ++msgid "Unable to cleanup %s" ++msgstr "Impossibile ripulire %s" ++ ++#: lib/choose_repository.tcl:719 ++msgid "Clone failed." ++msgstr "Clonazione fallita." ++ ++#: lib/choose_repository.tcl:726 ++msgid "No default branch obtained." ++msgstr "Non è stato trovato un ramo predefinito." ++ ++#: lib/choose_repository.tcl:737 ++#, tcl-format ++msgid "Cannot resolve %s as a commit." ++msgstr "Impossibile risolvere %s come una revisione." ++ ++#: lib/choose_repository.tcl:749 ++msgid "Creating working directory" ++msgstr "Creazione directory di lavoro" ++ ++#: lib/choose_repository.tcl:750 lib/index.tcl:15 lib/index.tcl:80 ++#: lib/index.tcl:149 ++msgid "files" ++msgstr "file" ++ ++#: lib/choose_repository.tcl:779 ++msgid "Initial file checkout failed." ++msgstr "Attivazione iniziale impossibile." ++ ++#: lib/choose_repository.tcl:795 ++msgid "Open" ++msgstr "Apri" ++ ++#: lib/choose_repository.tcl:805 ++msgid "Repository:" ++msgstr "Archivio:" ++ ++#: lib/choose_repository.tcl:854 ++#, tcl-format ++msgid "Failed to open repository %s:" ++msgstr "Impossibile accedere all'archivio %s:" ++ ++#: lib/choose_rev.tcl:53 ++msgid "This Detached Checkout" ++msgstr "Questa revisione attiva staccata" ++ ++#: lib/choose_rev.tcl:60 ++msgid "Revision Expression:" ++msgstr "Espressione di revisione:" ++ ++#: lib/choose_rev.tcl:74 ++msgid "Local Branch" ++msgstr "Ramo locale" ++ ++#: lib/choose_rev.tcl:79 ++msgid "Tracking Branch" ++msgstr "Duplicato locale di ramo remoto" ++ ++#: lib/choose_rev.tcl:84 lib/choose_rev.tcl:537 ++msgid "Tag" ++msgstr "Etichetta" ++ ++#: lib/choose_rev.tcl:317 ++#, tcl-format ++msgid "Invalid revision: %s" ++msgstr "Revisione non valida: %s" ++ ++#: lib/choose_rev.tcl:338 ++msgid "No revision selected." ++msgstr "Nessuna revisione selezionata." ++ ++#: lib/choose_rev.tcl:346 ++msgid "Revision expression is empty." ++msgstr "L'espressione di revisione è vuota." ++ ++#: lib/choose_rev.tcl:530 ++msgid "Updated" ++msgstr "Aggiornato" ++ ++#: lib/choose_rev.tcl:558 ++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 "" ++"Non c'è niente da correggere.\n" ++"\n" ++"Stai per creare la revisione iniziale. Non esiste una revisione " ++"precedente da correggere.\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 "" ++"Non è possibile effettuare una correzione durante una fusione.\n" ++"\n" ++"In questo momento si sta effettuando una fusione che non è stata del tutto " ++"completata. Non puoi correggere la revisione precedente a meno che prima tu " ++"non interrompa l'operazione di fusione in corso.\n" ++ ++#: lib/commit.tcl:49 ++msgid "Error loading commit data for amend:" ++msgstr "Errore durante il caricamento dei dati della revisione da correggere:" ++ ++#: lib/commit.tcl:76 ++msgid "Unable to obtain your identity:" ++msgstr "Impossibile ottenere la tua identità:" ++ ++#: lib/commit.tcl:81 ++msgid "Invalid GIT_COMMITTER_IDENT:" ++msgstr "GIT_COMMITTER_IDENT non valida:" ++ ++#: lib/commit.tcl:133 ++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 "" ++"L'ultimo stato analizzato non corrisponde allo stato dell'archivio.\n" ++"\n" ++"Un altro programma Git ha modificato questo archivio dall'ultima analisi. " ++"Bisogna effettuare una nuova analisi prima di poter creare una nuova " ++"revisione.\n" ++"\n" ++"La nuova analisi comincerà ora.\n" ++ ++#: lib/commit.tcl:154 ++#, 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 "" ++"Non è possibile creare una revisione con file non sottoposti a fusione.\n" ++"\n" ++"Il file %s presenta dei conflitti. Devi risolverli e preparare il file per " ++"creare una nuova revisione prima di effettuare questa azione.\n" ++ ++#: lib/commit.tcl:162 ++#, tcl-format ++msgid "" ++"Unknown file state %s detected.\n" ++"\n" ++"File %s cannot be committed by this program.\n" ++msgstr "" ++"Stato di file %s sconosciuto.\n" ++"\n" ++"Questo programma non può creare una revisione contenente il file %s.\n" ++ ++#: lib/commit.tcl:170 ++msgid "" ++"No changes to commit.\n" ++"\n" ++"You must stage at least 1 file before you can commit.\n" ++msgstr "" ++"Nessuna modifica per la nuova revisione.\n" ++"\n" ++"Devi preparare per una nuova revisione almeno 1 file prima di effettuare questa " ++"operazione.\n" ++ ++#: lib/commit.tcl:183 ++msgid "" ++"Please supply a commit message.\n" ++"\n" ++"A good commit message has the following format:\n" ++"\n" ++"- First line: Describe in one sentance what you did.\n" ++"- Second line: Blank\n" ++"- Remaining lines: Describe why this change is good.\n" ++msgstr "" ++"Bisogna fornire un messaggio di revisione.\n" ++"\n" ++"Un buon messaggio di revisione ha il seguente formato:\n" ++"\n" ++"- Prima linea: descrivi in una frase ciò che hai fatto.\n" ++"- Seconda linea: vuota.\n" ++"- Terza linea: spiega a cosa serve la tua modifica.\n" ++ ++#: lib/commit.tcl:257 ++msgid "write-tree failed:" ++msgstr "write-tree fallito:" ++ ++#: lib/commit.tcl:275 ++#, tcl-format ++msgid "Commit %s appears to be corrupt" ++msgstr "La revisione %s sembra essere corrotta" ++ ++#: lib/commit.tcl:279 ++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 "" ++"Nessuna modifica per la nuova revisione.\n" ++"\n" ++"Questa revisione non modifica alcun file e non effettua alcuna fusione.\n" ++"\n" ++"Si procederà subito ad una nuova analisi.\n" ++ ++#: lib/commit.tcl:286 ++msgid "No changes to commit." ++msgstr "Nessuna modifica per la nuova revisione." ++ ++#: lib/commit.tcl:303 ++#, tcl-format ++msgid "warning: Tcl does not support encoding '%s'." ++msgstr "attenzione: Tcl non supporta la codifica '%s'." ++ ++#: lib/commit.tcl:317 ++msgid "commit-tree failed:" ++msgstr "commit-tree fallito:" ++ ++#: lib/commit.tcl:339 ++msgid "update-ref failed:" ++msgstr "update-ref fallito:" ++ ++#: lib/commit.tcl:430 ++#, tcl-format ++msgid "Created commit %s: %s" ++msgstr "Creata revisione %s: %s" ++ ++#: lib/console.tcl:57 ++msgid "Working... please wait..." ++msgstr "Elaborazione in corso... attendere..." ++ ++#: lib/console.tcl:183 ++msgid "Success" ++msgstr "Successo" ++ ++#: lib/console.tcl:196 ++msgid "Error: Command Failed" ++msgstr "Errore: comando fallito" ++ ++#: lib/database.tcl:43 ++msgid "Number of loose objects" ++msgstr "Numero di oggetti slegati" ++ ++#: lib/database.tcl:44 ++msgid "Disk space used by loose objects" ++msgstr "Spazio su disco utilizzato da oggetti slegati" ++ ++#: lib/database.tcl:45 ++msgid "Number of packed objects" ++msgstr "Numero di oggetti impacchettati" ++ ++#: lib/database.tcl:46 ++msgid "Number of packs" ++msgstr "Numero di pacchetti" ++ ++#: lib/database.tcl:47 ++msgid "Disk space used by packed objects" ++msgstr "Spazio su disco utilizzato da oggetti impacchettati" ++ ++#: lib/database.tcl:48 ++msgid "Packed objects waiting for pruning" ++msgstr "Oggetti impacchettati che attendono la potatura" ++ ++#: lib/database.tcl:49 ++msgid "Garbage files" ++msgstr "File inutili" ++ ++#: lib/database.tcl:72 ++msgid "Compressing the object database" ++msgstr "Compressione dell'archivio in corso" ++ ++#: lib/database.tcl:83 ++msgid "Verifying the object database with fsck-objects" ++msgstr "Verifica dell'archivio con fsck-objects in corso" ++ ++#: lib/database.tcl:108 ++#, 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 when more than %i loose objects exist.\n" ++"\n" ++"Compress the database now?" ++msgstr "" ++"Questo archivio attualmente ha circa %i oggetti slegati.\n" ++"\n" ++"Per mantenere buone prestazioni si raccomanda di comprimere l'archivio " ++"quando sono presenti più di %i oggetti slegati.\n" ++"\n" ++"Comprimere l'archivio ora?" ++ ++#: lib/date.tcl:25 ++#, tcl-format ++msgid "Invalid date from Git: %s" ++msgstr "Git ha restituito una data non valida: %s" ++ ++#: lib/diff.tcl:42 ++#, 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 "" ++"Non sono state trovate differenze.\n" ++"\n" ++"%s non ha modifiche.\n" ++"\n" ++"La data di modifica di questo file è stata cambiata da un'altra " ++"applicazione, ma il contenuto del file è rimasto invariato.\n" ++"\n" ++"Si procederà automaticamente ad una nuova analisi per trovare altri file che " ++"potrebbero avere lo stesso stato." ++ ++#: lib/diff.tcl:81 ++#, tcl-format ++msgid "Loading diff of %s..." ++msgstr "Caricamento delle differenze di %s..." ++ ++#: lib/diff.tcl:114 lib/diff.tcl:184 ++#, tcl-format ++msgid "Unable to display %s" ++msgstr "Impossibile visualizzare %s" ++ ++#: lib/diff.tcl:115 ++msgid "Error loading file:" ++msgstr "Errore nel caricamento del file:" ++ ++#: lib/diff.tcl:122 ++msgid "Git Repository (subproject)" ++msgstr "Archivio Git (sottoprogetto)" ++ ++#: lib/diff.tcl:134 ++msgid "* Binary file (not showing content)." ++msgstr "* File binario (il contenuto non sarà mostrato)." ++ ++#: lib/diff.tcl:185 ++msgid "Error loading diff:" ++msgstr "Errore nel caricamento delle differenze:" ++ ++#: lib/diff.tcl:302 ++msgid "Failed to unstage selected hunk." ++msgstr "La sezione scelta è ancora pronta per una nuova revisione." ++ ++#: lib/diff.tcl:309 ++msgid "Failed to stage selected hunk." ++msgstr "Impossibile preparare la sezione scelta per una nuova revisione." ++ ++#: lib/error.tcl:12 lib/error.tcl:102 ++msgid "error" ++msgstr "errore" ++ ++#: lib/error.tcl:28 ++msgid "warning" ++msgstr "attenzione" ++ ++#: lib/error.tcl:81 ++msgid "You must correct the above errors before committing." ++msgstr "Bisogna correggere gli errori suddetti prima di creare una nuova revisione." ++ ++#: lib/index.tcl:241 ++#, tcl-format ++msgid "Unstaging %s from commit" ++msgstr "%s non farà parte della prossima revisione" ++ ++#: lib/index.tcl:285 ++#, tcl-format ++msgid "Adding %s" ++msgstr "Aggiunta di %s in corso" ++ ++#: lib/index.tcl:340 ++#, tcl-format ++msgid "Revert changes in file %s?" ++msgstr "Annullare le modifiche nel file %s?" ++ ++#: lib/index.tcl:342 ++#, tcl-format ++msgid "Revert changes in these %i files?" ++msgstr "Annullare le modifiche in questi %i file?" ++ ++#: lib/index.tcl:348 ++msgid "Any unstaged changes will be permanently lost by the revert." ++msgstr "" ++"Tutte le modifiche non preparate per una nuova revisione saranno perse per " ++"sempre." ++ ++#: lib/index.tcl:351 ++msgid "Do Nothing" ++msgstr "Non fare niente" ++ ++#: 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 "" ++"Non posso effettuare fusioni durante una correzione.\n" ++"\n" ++"Bisogna finire di correggere questa revisione prima di iniziare una " ++"qualunque fusione.\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 "" ++"L'ultimo stato analizzato non corrisponde allo stato dell'archivio.\n" ++"\n" ++"Un altro programma Git ha modificato questo archivio dall'ultima analisi." ++"Bisogna effettuare una nuova analisi prima di poter effettuare una fusione.\n" ++"\n" ++"La nuova analisi comincerà ora.\n" ++ ++#: lib/merge.tcl:44 ++#, 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 "" ++"Sei nel mezzo di una fusione con conflitti.\n" ++"\n" ++"Il file %s ha dei conflitti.\n" ++"\n" ++"Bisogna risolvere i conflitti, preparare il file per una nuova revisione ed " ++"infine crearla per completare la fusione corrente. Solo a questo punto " ++"potrai iniziare un'altra fusione.\n" ++ ++#: lib/merge.tcl:54 ++#, 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 "" ++"Sei nel mezzo di una modifica.\n" ++"\n" ++"Il file %s è stato modificato.\n" ++"\n" ++"Bisogna completare la creazione della revisione corrente prima di iniziare una fusione. " ++"In questo modo sarà più facile interrompere una fusione non riuscita, nel " ++"caso ce ne fosse bisogno.\n" ++ ++#: lib/merge.tcl:106 ++#, tcl-format ++msgid "%s of %s" ++msgstr "%s di %s" ++ ++#: lib/merge.tcl:119 ++#, tcl-format ++msgid "Merging %s and %s" ++msgstr "Fusione di %s e %s in corso" ++ ++#: lib/merge.tcl:131 ++msgid "Merge completed successfully." ++msgstr "Fusione completata con successo." ++ ++#: lib/merge.tcl:133 ++msgid "Merge failed. Conflict resolution is required." ++msgstr "Fusione fallita. Bisogna risolvere i conflitti." ++ ++#: lib/merge.tcl:158 ++#, tcl-format ++msgid "Merge Into %s" ++msgstr "Fusione in %s" ++ ++#: lib/merge.tcl:177 ++msgid "Revision To Merge" ++msgstr "Revisione da fondere" ++ ++#: lib/merge.tcl:212 ++msgid "" ++"Cannot abort while amending.\n" ++"\n" ++"You must finish amending this commit.\n" ++msgstr "" ++"Interruzione impossibile durante una correzione.\n" ++"\n" ++"Bisogna finire di correggere questa revisione.\n" ++ ++#: 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 "" ++"Interrompere fusione?\n" ++"\n" ++"L'interruzione della fusione corrente causerà la perdita di *TUTTE* le " ++"modifiche non ancora presenti nell'archivio.\n" ++"\n" ++"Continuare con l'interruzione della fusione corrente?" ++ ++#: 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 "" ++"Ripristinare la revisione corrente e annullare le modifiche?\n" ++"\n" ++"L'annullamento delle modifiche causerà la perdita di *TUTTE* le modifiche " ++"non ancora presenti nell'archivio.\n" ++"\n" ++"Continuare con l'annullamento delle modifiche correnti?" ++ ++#: lib/merge.tcl:239 ++msgid "Aborting" ++msgstr "Interruzione in corso" ++ ++#: lib/merge.tcl:266 ++msgid "Abort failed." ++msgstr "Interruzione fallita." ++ ++#: lib/merge.tcl:268 ++msgid "Abort completed. Ready." ++msgstr "Interruzione completata. Pronto." ++ ++#: lib/option.tcl:82 ++msgid "Restore Defaults" ++msgstr "Ripristina predefiniti" ++ ++#: lib/option.tcl:86 ++msgid "Save" ++msgstr "Salva" ++ ++#: lib/option.tcl:96 ++#, tcl-format ++msgid "%s Repository" ++msgstr "Archivio di %s" ++ ++#: lib/option.tcl:97 ++msgid "Global (All Repositories)" ++msgstr "Tutti gli archivi" ++ ++#: lib/option.tcl:103 ++msgid "User Name" ++msgstr "Nome utente" ++ ++#: lib/option.tcl:104 ++msgid "Email Address" ++msgstr "Indirizzo Email" ++ ++#: lib/option.tcl:106 ++msgid "Summarize Merge Commits" ++msgstr "Riepilogo nelle revisioni di fusione" ++ ++#: lib/option.tcl:107 ++msgid "Merge Verbosity" ++msgstr "Prolissità della fusione" ++ ++#: lib/option.tcl:108 ++msgid "Show Diffstat After Merge" ++msgstr "Mostra statistiche delle differenze dopo la fusione" ++ ++#: lib/option.tcl:110 ++msgid "Trust File Modification Timestamps" ++msgstr "Fidati delle date di modifica dei file" ++ ++#: lib/option.tcl:111 ++msgid "Prune Tracking Branches During Fetch" ++msgstr "" ++"Effettua potatura dei duplicati locali di rami remoti durante il recupero" ++ ++#: lib/option.tcl:112 ++msgid "Match Tracking Branches" ++msgstr "Appaia duplicati locali di rami remoti" ++ ++#: lib/option.tcl:113 ++msgid "Number of Diff Context Lines" ++msgstr "Numero di linee di contesto nelle differenze" ++ ++#: lib/option.tcl:114 ++msgid "New Branch Name Template" ++msgstr "Modello per il nome di un nuovo ramo" ++ ++#: lib/option.tcl:176 ++msgid "Change Font" ++msgstr "Cambia caratteri" ++ ++#: lib/option.tcl:180 ++#, tcl-format ++msgid "Choose %s" ++msgstr "Scegli %s" ++ ++#: lib/option.tcl:186 ++msgid "pt." ++msgstr "pt." ++ ++#: lib/option.tcl:200 ++msgid "Preferences" ++msgstr "Preferenze" ++ ++#: lib/option.tcl:235 ++msgid "Failed to completely save options:" ++msgstr "Impossibile salvare completamente le opzioni:" ++ ++#: lib/remote.tcl:165 ++msgid "Prune from" ++msgstr "Effettua potatura da" ++ ++#: lib/remote.tcl:170 ++msgid "Fetch from" ++msgstr "Recupera da" ++ ++#: lib/remote.tcl:213 ++msgid "Push to" ++msgstr "Propaga verso" ++ ++#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 ++msgid "Delete Remote Branch" ++msgstr "Cancella ramo remoto" ++ ++#: lib/remote_branch_delete.tcl:47 ++msgid "From Repository" ++msgstr "Da archivio" ++ ++#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:123 ++msgid "Remote:" ++msgstr "Remoto:" ++ ++#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:138 ++msgid "Arbitrary URL:" ++msgstr "URL specifico:" ++ ++#: lib/remote_branch_delete.tcl:84 ++msgid "Branches" ++msgstr "Rami" ++ ++#: lib/remote_branch_delete.tcl:109 ++msgid "Delete Only If" ++msgstr "Elimina solo se" ++ ++#: lib/remote_branch_delete.tcl:111 ++msgid "Merged Into:" ++msgstr "Fuso in:" ++ ++#: lib/remote_branch_delete.tcl:119 ++msgid "Always (Do not perform merge checks)" ++msgstr "Sempre (non verificare le fusioni)" ++ ++#: lib/remote_branch_delete.tcl:152 ++msgid "A branch is required for 'Merged Into'." ++msgstr "Si richiede un ramo per 'Fuso in'." ++ ++#: lib/remote_branch_delete.tcl:184 ++#, tcl-format ++msgid "" ++"The following branches are not completely merged into %s:\n" ++"\n" ++" - %s" ++msgstr "" ++"I rami seguenti non sono stati fusi completamente in %s:\n" ++"\n" ++" - %s" ++ ++#: lib/remote_branch_delete.tcl:189 ++#, 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 "" ++"Una o più verifiche di fusione sono fallite perché mancano le revisioni " ++"necessarie. Prova prima a recuperarle da %s." ++ ++#: lib/remote_branch_delete.tcl:207 ++msgid "Please select one or more branches to delete." ++msgstr "Scegliere uno o più rami da cancellare." ++ ++#: lib/remote_branch_delete.tcl:216 ++msgid "" ++"Recovering deleted branches is difficult.\n" ++"\n" ++"Delete the selected branches?" ++msgstr "" ++"Ricomporre rami cancellati è difficile.\n" ++"\n" ++"Cancellare i rami selezionati?" ++ ++#: lib/remote_branch_delete.tcl:226 ++#, tcl-format ++msgid "Deleting branches from %s" ++msgstr "Cancellazione rami da %s" ++ ++#: lib/remote_branch_delete.tcl:286 ++msgid "No repository selected." ++msgstr "Nessun archivio selezionato." ++ ++#: lib/remote_branch_delete.tcl:291 ++#, tcl-format ++msgid "Scanning %s..." ++msgstr "Analisi in corso %s..." ++ ++#: lib/shortcut.tcl:26 lib/shortcut.tcl:74 ++msgid "Cannot write script:" ++msgstr "Impossibile scrivere script:" ++ ++#: lib/shortcut.tcl:149 ++msgid "Cannot write icon:" ++msgstr "Impossibile scrivere icona:" ++ ++#: lib/status_bar.tcl:83 ++#, tcl-format ++msgid "%s ... %*i of %*i %s (%3i%%)" ++msgstr "%s ... %*i di %*i %s (%3i%%)" ++ ++#: lib/transport.tcl:6 ++#, tcl-format ++msgid "fetch %s" ++msgstr "recupera da %s" ++ ++#: lib/transport.tcl:7 ++#, tcl-format ++msgid "Fetching new changes from %s" ++msgstr "Recupero nuove modifiche da %s" ++ ++#: lib/transport.tcl:18 ++#, tcl-format ++msgid "remote prune %s" ++msgstr "potatura remota di %s" ++ ++#: lib/transport.tcl:19 ++#, tcl-format ++msgid "Pruning tracking branches deleted from %s" ++msgstr "Effettua potatura dei duplicati locali di rami remoti cancellati da %s" ++ ++#: lib/transport.tcl:25 lib/transport.tcl:71 ++#, tcl-format ++msgid "push %s" ++msgstr "propaga verso %s" ++ ++#: lib/transport.tcl:26 ++#, tcl-format ++msgid "Pushing changes to %s" ++msgstr "Propagazione modifiche a %s" ++ ++#: lib/transport.tcl:72 ++#, tcl-format ++msgid "Pushing %s %s to %s" ++msgstr "Propagazione %s %s a %s" ++ ++#: lib/transport.tcl:89 ++msgid "Push Branches" ++msgstr "Propaga rami" ++ ++#: lib/transport.tcl:103 ++msgid "Source Branches" ++msgstr "Rami di origine" ++ ++#: lib/transport.tcl:120 ++msgid "Destination Repository" ++msgstr "Archivio di destinazione" ++ ++#: lib/transport.tcl:158 ++msgid "Transfer Options" ++msgstr "Opzioni di trasferimento" ++ ++#: lib/transport.tcl:160 ++msgid "Force overwrite existing branch (may discard changes)" ++msgstr "Sovrascrivi ramo esistente (alcune modifiche potrebbero essere perse)" ++ ++#: lib/transport.tcl:164 ++msgid "Use thin pack (for slow network connections)" ++msgstr "Utilizza 'thin pack' (per connessioni lente)" ++ ++#: lib/transport.tcl:168 ++msgid "Include tags" ++msgstr "Includi etichette" ++ diff --cc git-gui/po/ja.po index 000000000,000000000..f3a547b1b new file mode 100644 --- /dev/null +++ b/git-gui/po/ja.po @@@ -1,0 -1,0 +1,1843 @@@ ++# Translation of git-gui to Japanese ++# Copyright (C) 2007 Shawn Pearce ++# This file is distributed under the same license as the git-gui package. ++# しらいし ななこ , 2007. ++# ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: git-gui\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2007-10-10 04:04-0400\n" ++"PO-Revision-Date: 2007-10-31 16:23+0900\n" ++"Last-Translator: しらいし ななこ \n" ++"Language-Team: Japanese\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++#: git-gui.sh:41 git-gui.sh:634 git-gui.sh:648 git-gui.sh:661 git-gui.sh:744 ++#: git-gui.sh:763 ++msgid "git-gui: fatal error" ++msgstr "git-gui: 致命的なエラー" ++ ++#: git-gui.sh:595 ++#, tcl-format ++msgid "Invalid font specified in %s:" ++msgstr "%s に無効なフォントが指定されています:" ++ ++#: git-gui.sh:620 ++msgid "Main Font" ++msgstr "主フォント" ++ ++#: git-gui.sh:621 ++msgid "Diff/Console Font" ++msgstr "diff/コンソール・フォント" ++ ++#: git-gui.sh:635 ++msgid "Cannot find git in PATH." ++msgstr "PATH 中に git が見つかりません" ++ ++#: git-gui.sh:662 ++msgid "Cannot parse Git version string:" ++msgstr "Git バージョン名が理解できません:" ++ ++#: git-gui.sh:680 ++#, 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" ++"\n" ++"%s は最低でも 1.5.0 かそれ以降の Git が必要です\n" ++"\n" ++"'%s' はバージョン 1.5.0 と思って良いですか?\n" ++ ++#: git-gui.sh:853 ++msgid "Git directory not found:" ++msgstr "Git ディレクトリが見つかりません:" ++ ++#: git-gui.sh:860 ++msgid "Cannot move to top of working directory:" ++msgstr "作業ディレクトリの最上位に移動できません" ++ ++#: git-gui.sh:867 ++msgid "Cannot use funny .git directory:" ++msgstr "変な .git ディレクトリは使えません" ++ ++#: git-gui.sh:872 ++msgid "No working directory" ++msgstr "作業ディレクトリがありません" ++ ++#: git-gui.sh:1019 ++msgid "Refreshing file status..." ++msgstr "ファイル状態を更新しています…" ++ ++#: git-gui.sh:1084 ++msgid "Scanning for modified files ..." ++msgstr "変更されたファイルをスキャンしています…" ++ ++#: git-gui.sh:1259 lib/browser.tcl:245 ++msgid "Ready." ++msgstr "準備完了" ++ ++#: git-gui.sh:1525 ++msgid "Unmodified" ++msgstr "変更無し" ++ ++#: git-gui.sh:1527 ++msgid "Modified, not staged" ++msgstr "変更あり、コミット未予定" ++ ++#: git-gui.sh:1528 git-gui.sh:1533 ++msgid "Staged for commit" ++msgstr "コミット予定済" ++ ++#: git-gui.sh:1529 git-gui.sh:1534 ++msgid "Portions staged for commit" ++msgstr "部分的にコミット予定済" ++ ++#: git-gui.sh:1530 git-gui.sh:1535 ++msgid "Staged for commit, missing" ++msgstr "コミット予定済、ファイル無し" ++ ++#: git-gui.sh:1532 ++msgid "Untracked, not staged" ++msgstr "管理外、コミット未予定" ++ ++#: git-gui.sh:1537 ++msgid "Missing" ++msgstr "ファイル無し" ++ ++#: git-gui.sh:1538 ++msgid "Staged for removal" ++msgstr "削除予定済" ++ ++#: git-gui.sh:1539 ++msgid "Staged for removal, still present" ++msgstr "削除予定済、ファイル未削除" ++ ++#: git-gui.sh:1541 git-gui.sh:1542 git-gui.sh:1543 git-gui.sh:1544 ++msgid "Requires merge resolution" ++msgstr "要マージ解決" ++ ++#: git-gui.sh:1579 ++msgid "Starting gitk... please wait..." ++msgstr "gitk を起動中…お待ち下さい…" ++ ++#: git-gui.sh:1588 ++#, tcl-format ++msgid "" ++"Unable to start gitk:\n" ++"\n" ++"%s does not exist" ++msgstr "" ++"gitk を起動できません:\n" ++"\n" ++"%s がありません" ++ ++#: git-gui.sh:1788 lib/choose_repository.tcl:32 ++msgid "Repository" ++msgstr "リポジトリ" ++ ++#: git-gui.sh:1789 ++msgid "Edit" ++msgstr "編集" ++ ++#: git-gui.sh:1791 lib/choose_rev.tcl:560 ++msgid "Branch" ++msgstr "ブランチ" ++ ++#: git-gui.sh:1794 lib/choose_rev.tcl:547 ++msgid "Commit@@noun" ++msgstr "コミット" ++ ++#: git-gui.sh:1797 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168 ++msgid "Merge" ++msgstr "マージ" ++ ++#: git-gui.sh:1798 lib/choose_rev.tcl:556 ++msgid "Remote" ++msgstr "リモート" ++ ++#: git-gui.sh:1807 ++msgid "Browse Current Branch's Files" ++msgstr "現在のブランチのファイルを見る" ++ ++#: git-gui.sh:1811 ++msgid "Browse Branch Files..." ++msgstr "ブランチのファイルを見る…" ++ ++#: git-gui.sh:1816 ++msgid "Visualize Current Branch's History" ++msgstr "現在のブランチの履歴を見る" ++ ++#: git-gui.sh:1820 ++msgid "Visualize All Branch History" ++msgstr "全てのブランチの履歴を見る" ++ ++#: git-gui.sh:1827 ++#, tcl-format ++msgid "Browse %s's Files" ++msgstr "ブランチ %s のファイルを見る" ++ ++#: git-gui.sh:1829 ++#, tcl-format ++msgid "Visualize %s's History" ++msgstr "ブランチ %s の履歴を見る" ++ ++#: git-gui.sh:1834 lib/database.tcl:27 lib/database.tcl:67 ++msgid "Database Statistics" ++msgstr "データベース統計" ++ ++#: git-gui.sh:1837 lib/database.tcl:34 ++msgid "Compress Database" ++msgstr "データベース圧縮" ++ ++#: git-gui.sh:1840 ++msgid "Verify Database" ++msgstr "データベース検証" ++ ++#: git-gui.sh:1847 git-gui.sh:1851 git-gui.sh:1855 lib/shortcut.tcl:9 ++#: lib/shortcut.tcl:45 lib/shortcut.tcl:84 ++msgid "Create Desktop Icon" ++msgstr "デスクトップ・アイコンを作る" ++ ++#: git-gui.sh:1860 lib/choose_repository.tcl:36 lib/choose_repository.tcl:95 ++msgid "Quit" ++msgstr "終了" ++ ++#: git-gui.sh:1867 ++msgid "Undo" ++msgstr "元に戻す" ++ ++#: git-gui.sh:1870 ++msgid "Redo" ++msgstr "やり直し" ++ ++#: git-gui.sh:1874 git-gui.sh:2366 ++msgid "Cut" ++msgstr "切り取り" ++ ++#: git-gui.sh:1877 git-gui.sh:2369 git-gui.sh:2440 git-gui.sh:2512 ++#: lib/console.tcl:67 ++msgid "Copy" ++msgstr "コピー" ++ ++#: git-gui.sh:1880 git-gui.sh:2372 ++msgid "Paste" ++msgstr "貼り付け" ++ ++#: git-gui.sh:1883 git-gui.sh:2375 lib/branch_delete.tcl:26 ++#: lib/remote_branch_delete.tcl:38 ++msgid "Delete" ++msgstr "削除" ++ ++#: git-gui.sh:1887 git-gui.sh:2379 git-gui.sh:2516 lib/console.tcl:69 ++msgid "Select All" ++msgstr "全て選択" ++ ++#: git-gui.sh:1896 ++msgid "Create..." ++msgstr "作成…" ++ ++#: git-gui.sh:1902 ++msgid "Checkout..." ++msgstr "チェックアウト" ++ ++#: git-gui.sh:1908 ++msgid "Rename..." ++msgstr "名前変更…" ++ ++#: git-gui.sh:1913 git-gui.sh:2012 ++msgid "Delete..." ++msgstr "削除…" ++ ++#: git-gui.sh:1918 ++msgid "Reset..." ++msgstr "リセット…" ++ ++#: git-gui.sh:1930 git-gui.sh:2313 ++msgid "New Commit" ++msgstr "新規コミット" ++ ++#: git-gui.sh:1938 git-gui.sh:2320 ++msgid "Amend Last Commit" ++msgstr "最新コミットを訂正" ++ ++#: git-gui.sh:1947 git-gui.sh:2280 lib/remote_branch_delete.tcl:99 ++msgid "Rescan" ++msgstr "再スキャン" ++ ++#: git-gui.sh:1953 ++msgid "Stage To Commit" ++msgstr "コミット予定する" ++ ++#: git-gui.sh:1958 ++msgid "Stage Changed Files To Commit" ++msgstr "変更されたファイルをコミット予定" ++ ++#: git-gui.sh:1964 ++msgid "Unstage From Commit" ++msgstr "コミットから降ろす" ++ ++#: git-gui.sh:1969 lib/index.tcl:352 ++msgid "Revert Changes" ++msgstr "変更を元に戻す" ++ ++#: git-gui.sh:1976 git-gui.sh:2292 git-gui.sh:2390 ++msgid "Sign Off" ++msgstr "署名" ++ ++#: git-gui.sh:1980 git-gui.sh:2296 ++msgid "Commit@@verb" ++msgstr "コミット" ++ ++#: git-gui.sh:1991 ++msgid "Local Merge..." ++msgstr "ローカル・マージ…" ++ ++#: git-gui.sh:1996 ++msgid "Abort Merge..." ++msgstr "マージ中止…" ++ ++#: git-gui.sh:2008 ++msgid "Push..." ++msgstr "プッシュ…" ++ ++#: git-gui.sh:2019 lib/choose_repository.tcl:41 ++msgid "Apple" ++msgstr "りんご" ++ ++#: git-gui.sh:2022 git-gui.sh:2044 lib/about.tcl:13 ++#: lib/choose_repository.tcl:44 lib/choose_repository.tcl:50 ++#, tcl-format ++msgid "About %s" ++msgstr "%s について" ++ ++#: git-gui.sh:2026 ++msgid "Preferences..." ++msgstr "設定…" ++ ++#: git-gui.sh:2034 git-gui.sh:2558 ++msgid "Options..." ++msgstr "オプション…" ++ ++#: git-gui.sh:2040 lib/choose_repository.tcl:47 ++msgid "Help" ++msgstr "ヘルプ" ++ ++#: git-gui.sh:2081 ++msgid "Online Documentation" ++msgstr "オンライン・ドキュメント" ++ ++#: git-gui.sh:2165 ++#, tcl-format ++msgid "fatal: cannot stat path %s: No such file or directory" ++msgstr "致命的: パス %s が stat できません。そのようなファイルやディレクトリはありません" ++ ++#: git-gui.sh:2198 ++msgid "Current Branch:" ++msgstr "現在のブランチ" ++ ++#: git-gui.sh:2219 ++msgid "Staged Changes (Will Commit)" ++msgstr "ステージングされた(コミット予定済の)変更" ++ ++#: git-gui.sh:2239 ++msgid "Unstaged Changes" ++msgstr "コミット予定に入っていない変更" ++ ++#: git-gui.sh:2286 ++msgid "Stage Changed" ++msgstr "変更をコミット予定に入れる" ++ ++#: git-gui.sh:2302 lib/transport.tcl:93 lib/transport.tcl:182 ++msgid "Push" ++msgstr "プッシュ" ++ ++#: git-gui.sh:2332 ++msgid "Initial Commit Message:" ++msgstr "最初のコミットメッセージ:" ++ ++#: git-gui.sh:2333 ++msgid "Amended Commit Message:" ++msgstr "訂正したコミットメッセージ:" ++ ++#: git-gui.sh:2334 ++msgid "Amended Initial Commit Message:" ++msgstr "訂正した最初のコミットメッセージ:" ++ ++#: git-gui.sh:2335 ++msgid "Amended Merge Commit Message:" ++msgstr "訂正したマージコミットメッセージ:" ++ ++#: git-gui.sh:2336 ++msgid "Merge Commit Message:" ++msgstr "マージコミットメッセージ:" ++ ++#: git-gui.sh:2337 ++msgid "Commit Message:" ++msgstr "コミットメッセージ:" ++ ++#: git-gui.sh:2382 git-gui.sh:2520 lib/console.tcl:71 ++msgid "Copy All" ++msgstr "全てコピー" ++ ++#: git-gui.sh:2406 lib/blame.tcl:104 ++msgid "File:" ++msgstr "ファイル:" ++ ++#: git-gui.sh:2508 ++msgid "Refresh" ++msgstr "再読み込み" ++ ++#: git-gui.sh:2529 ++msgid "Apply/Reverse Hunk" ++msgstr "パッチを適用/取り消す" ++ ++#: git-gui.sh:2535 ++msgid "Decrease Font Size" ++msgstr "フォントを小さく" ++ ++#: git-gui.sh:2539 ++msgid "Increase Font Size" ++msgstr "フォントを大きく" ++ ++#: git-gui.sh:2544 ++msgid "Show Less Context" ++msgstr "文脈を少なく" ++ ++#: git-gui.sh:2551 ++msgid "Show More Context" ++msgstr "文脈を多く" ++ ++#: git-gui.sh:2565 ++msgid "Unstage Hunk From Commit" ++msgstr "パッチをコミット予定から外す" ++ ++#: git-gui.sh:2567 ++msgid "Stage Hunk For Commit" ++msgstr "パッチをコミット予定に加える" ++ ++#: git-gui.sh:2586 ++msgid "Initializing..." ++msgstr "初期化しています…" ++ ++#: git-gui.sh:2677 ++#, 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" ++"以下の環境変数は %s が起動する Git サブプロセスによって無視されるでしょう:\n" ++"\n" ++ ++#: git-gui.sh:2707 ++msgid "" ++"\n" ++"This is due to a known issue with the\n" ++"Tcl binary distributed by Cygwin." ++msgstr "" ++"\n" ++"これは Cygwin で配布されている Tcl バイナリに\n" ++"関しての既知の問題によります" ++ ++#: git-gui.sh:2712 ++#, 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" ++"個人的な ~/.gitconfig ファイル内で user.name と user.email の値を設定\n" ++"するのが、%s の良い代用となります\n" ++ ++#: lib/about.tcl:25 ++msgid "git-gui - a graphical user interface for Git." ++msgstr "Git のグラフィカルUI git-gui" ++ ++#: lib/blame.tcl:77 ++msgid "File Viewer" ++msgstr "ファイルピューワ" ++ ++#: lib/blame.tcl:81 ++msgid "Commit:" ++msgstr "コミット:" ++ ++#: lib/blame.tcl:249 ++msgid "Copy Commit" ++msgstr "コミットをコピー" ++ ++#: lib/blame.tcl:369 ++#, tcl-format ++msgid "Reading %s..." ++msgstr "%s を読んでいます…" ++ ++#: lib/blame.tcl:473 ++msgid "Loading copy/move tracking annotations..." ++msgstr "コピー・移動追跡データを読んでいます…" ++ ++#: lib/blame.tcl:493 ++msgid "lines annotated" ++msgstr "行を注釈しました" ++ ++#: lib/blame.tcl:674 ++msgid "Loading original location annotations..." ++msgstr "元位置行の注釈データを読んでいます…" ++ ++#: lib/blame.tcl:677 ++msgid "Annotation complete." ++msgstr "注釈完了しました" ++ ++#: lib/blame.tcl:731 ++msgid "Loading annotation..." ++msgstr "注釈を読み込んでいます…" ++ ++#: lib/blame.tcl:787 ++msgid "Author:" ++msgstr "作者:" ++ ++#: lib/blame.tcl:791 ++msgid "Committer:" ++msgstr "コミット者:" ++ ++#: lib/blame.tcl:796 ++msgid "Original File:" ++msgstr "元ファイル" ++ ++#: lib/blame.tcl:910 ++msgid "Originally By:" ++msgstr "原作者:" ++ ++#: lib/blame.tcl:916 ++msgid "In File:" ++msgstr "ファイル:" ++ ++#: lib/blame.tcl:921 ++msgid "Copied Or Moved Here By:" ++msgstr "複写・移動者:" ++ ++#: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19 ++msgid "Checkout Branch" ++msgstr "ブランチをチェックアウト" ++ ++#: lib/branch_checkout.tcl:23 ++msgid "Checkout" ++msgstr "チェックアウト" ++ ++#: lib/branch_checkout.tcl:27 lib/branch_create.tcl:35 ++#: lib/branch_delete.tcl:32 lib/branch_rename.tcl:30 lib/browser.tcl:281 ++#: lib/checkout_op.tcl:522 lib/choose_font.tcl:43 lib/merge.tcl:172 ++#: lib/option.tcl:90 lib/remote_branch_delete.tcl:42 lib/transport.tcl:97 ++msgid "Cancel" ++msgstr "中止" ++ ++#: lib/branch_checkout.tcl:32 lib/browser.tcl:286 ++msgid "Revision" ++msgstr "リビジョン" ++ ++#: lib/branch_checkout.tcl:36 lib/branch_create.tcl:69 lib/option.tcl:202 ++msgid "Options" ++msgstr "オプション" ++ ++#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92 ++msgid "Fetch Tracking Branch" ++msgstr "トラッキング・ブランチをフェッチ" ++ ++#: lib/branch_checkout.tcl:44 ++msgid "Detach From Local Branch" ++msgstr "ローカル・ブランチから削除" ++ ++#: lib/branch_create.tcl:22 ++msgid "Create Branch" ++msgstr "ブランチを作成" ++ ++#: lib/branch_create.tcl:27 ++msgid "Create New Branch" ++msgstr "ブランチを新規作成" ++ ++#: lib/branch_create.tcl:31 lib/choose_repository.tcl:199 ++msgid "Create" ++msgstr "作成" ++ ++#: lib/branch_create.tcl:40 ++msgid "Branch Name" ++msgstr "ブランチ名" ++ ++#: lib/branch_create.tcl:43 ++msgid "Name:" ++msgstr "名前:" ++ ++#: lib/branch_create.tcl:58 ++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:85 lib/checkout_op.tcl:514 ++msgid "Reset" ++msgstr "リセット" ++ ++#: lib/branch_create.tcl:97 ++msgid "Checkout After Creation" ++msgstr "作成してすぐチェックアウト" ++ ++#: lib/branch_create.tcl:131 ++msgid "Please select a tracking branch." ++msgstr "トラッキング・ブランチを選択して下さい。" ++ ++#: lib/branch_create.tcl:140 ++#, tcl-format ++msgid "Tracking branch %s is not a branch in the remote repository." ++msgstr "トラッキング・ブランチ %s は遠隔リポジトリのブランチではありません。" ++ ++#: lib/branch_create.tcl:153 lib/branch_rename.tcl:86 ++msgid "Please supply a branch name." ++msgstr "ブランチ名を指定して下さい。" ++ ++#: lib/branch_create.tcl:164 lib/branch_rename.tcl:106 ++#, tcl-format ++msgid "'%s' is not an acceptable branch name." ++msgstr "'%s' はブランチ名に使えません。" ++ ++#: lib/branch_delete.tcl:15 ++msgid "Delete Branch" ++msgstr "ブランチ削除" ++ ++#: lib/branch_delete.tcl:20 ++msgid "Delete Local Branch" ++msgstr "ローカル・ブランチを削除" ++ ++#: lib/branch_delete.tcl:37 ++msgid "Local Branches" ++msgstr "ローカル・ブランチ" ++ ++#: lib/branch_delete.tcl:52 ++msgid "Delete Only If Merged Into" ++msgstr "マージ済みの時のみ削除" ++ ++#: lib/branch_delete.tcl:54 ++msgid "Always (Do not perform merge test.)" ++msgstr "無条件(マージテストしない)" ++ ++#: lib/branch_delete.tcl:103 ++#, tcl-format ++msgid "The following branches are not completely merged into %s:" ++msgstr "以下のブランチは %s に完全にマージされていません:" ++ ++#: lib/branch_delete.tcl:115 ++msgid "" ++"Recovering deleted branches is difficult. \n" ++"\n" ++" Delete the selected branches?" ++msgstr "" ++"ブランチを削除すると元に戻すのは困難です。 \n" ++"\n" ++" 選択したブランチを削除しますか?" ++ ++#: lib/branch_delete.tcl:141 ++#, tcl-format ++msgid "" ++"Failed to delete branches:\n" ++"%s" ++msgstr "" ++"以下のブランチを削除できません:\n" ++"%s" ++ ++#: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22 ++msgid "Rename Branch" ++msgstr "ブランチの名前変更" ++ ++#: lib/branch_rename.tcl:26 ++msgid "Rename" ++msgstr "名前変更" ++ ++#: lib/branch_rename.tcl:36 ++msgid "Branch:" ++msgstr "ブランチ:" ++ ++#: lib/branch_rename.tcl:39 ++msgid "New Name:" ++msgstr "新しい名前:" ++ ++#: lib/branch_rename.tcl:75 ++msgid "Please select a branch to rename." ++msgstr "名前を変更するブランチを選んで下さい。" ++ ++#: lib/branch_rename.tcl:96 lib/checkout_op.tcl:179 ++#, tcl-format ++msgid "Branch '%s' already exists." ++msgstr "'%s'というブランチは既に存在します。" ++ ++#: lib/branch_rename.tcl:117 ++#, tcl-format ++msgid "Failed to rename '%s'." ++msgstr "'%s'の名前変更に失敗しました。" ++ ++#: lib/browser.tcl:17 ++msgid "Starting..." ++msgstr "起動中…" ++ ++#: lib/browser.tcl:26 ++msgid "File Browser" ++msgstr "ファイル・ブラウザ" ++ ++#: lib/browser.tcl:125 lib/browser.tcl:142 ++#, tcl-format ++msgid "Loading %s..." ++msgstr "%s をロード中…" ++ ++#: lib/browser.tcl:186 ++msgid "[Up To Parent]" ++msgstr "[上位フォルダへ]" ++ ++#: lib/browser.tcl:266 lib/browser.tcl:272 ++msgid "Browse Branch Files" ++msgstr "現在のブランチのファイルを見る" ++ ++#: lib/browser.tcl:277 lib/choose_repository.tcl:215 ++#: lib/choose_repository.tcl:305 lib/choose_repository.tcl:315 ++#: lib/choose_repository.tcl:811 ++msgid "Browse" ++msgstr "ブラウズ" ++ ++#: lib/checkout_op.tcl:79 ++#, tcl-format ++msgid "Fetching %s from %s" ++msgstr "%s から %s をフェッチしています" ++ ++#: lib/checkout_op.tcl:127 ++#, tcl-format ++msgid "fatal: Cannot resolve %s" ++msgstr "致命的エラー: %s を解決できません" ++ ++#: lib/checkout_op.tcl:140 lib/console.tcl:79 lib/database.tcl:31 ++msgid "Close" ++msgstr "閉じる" ++ ++#: lib/checkout_op.tcl:169 ++#, tcl-format ++msgid "Branch '%s' does not exist." ++msgstr "ブランチ'%s'は存在しません。" ++ ++#: lib/checkout_op.tcl:206 ++#, 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" ++"マージが必要です。" ++ ++#: lib/checkout_op.tcl:220 ++#, tcl-format ++msgid "Merge strategy '%s' not supported." ++msgstr "'%s' マージ戦略はサポートされていません。" ++ ++#: lib/checkout_op.tcl:239 ++#, tcl-format ++msgid "Failed to update '%s'." ++msgstr "'%s' の更新に失敗しました。" ++ ++#: lib/checkout_op.tcl:251 ++msgid "Staging area (index) is already locked." ++msgstr "インデックスは既にロックされています。" ++ ++#: lib/checkout_op.tcl:266 ++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:322 ++#, tcl-format ++msgid "Updating working directory to '%s'..." ++msgstr "作業ディレクトリを '%s' に更新しています…" ++ ++#: lib/checkout_op.tcl:353 ++#, tcl-format ++msgid "Aborted checkout of '%s' (file level merging is required)." ++msgstr "'%s' のチェックアウトを中止しました(ファイル毎のマージが必要です)。" ++ ++#: lib/checkout_op.tcl:354 ++msgid "File level merge required." ++msgstr "ファイル毎のマージが必要です。" ++ ++#: lib/checkout_op.tcl:358 ++#, tcl-format ++msgid "Staying on branch '%s'." ++msgstr "ブランチ '%s' に滞まります。" ++ ++#: lib/checkout_op.tcl:429 ++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:446 ++#, tcl-format ++msgid "Checked out '%s'." ++msgstr "'%s' をチェックアウトしました" ++ ++#: lib/checkout_op.tcl:478 ++#, tcl-format ++msgid "Resetting '%s' to '%s' will lose the following commits:" ++msgstr "'%s' を '%s' にリセットすると、以下のコミットが失なわれます:" ++ ++#: lib/checkout_op.tcl:500 ++msgid "Recovering lost commits may not be easy." ++msgstr "失なわれたコミットを回復するのは簡単ではありません。" ++ ++#: lib/checkout_op.tcl:505 ++#, tcl-format ++msgid "Reset '%s'?" ++msgstr "'%s' をリセットしますか?" ++ ++#: lib/checkout_op.tcl:510 lib/merge.tcl:164 ++msgid "Visualize" ++msgstr "可視化" ++ ++#: lib/checkout_op.tcl:578 ++#, 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" ++"起こるはずのないエラーです。あきらめて %s を終了します。" ++ ++#: lib/choose_font.tcl:39 ++msgid "Select" ++msgstr "選択" ++ ++#: lib/choose_font.tcl:53 ++msgid "Font Family" ++msgstr "フォント・ファミリー" ++ ++#: lib/choose_font.tcl:73 ++msgid "Font Size" ++msgstr "フォントの大きさ" ++ ++#: lib/choose_font.tcl:90 ++msgid "Font Example" ++msgstr "フォント・サンプル" ++ ++#: lib/choose_font.tcl:101 ++msgid "" ++"This is example text.\n" ++"If you like this text, it can be your font." ++msgstr "" ++"これはサンプル文です。\n" ++"このフォントが気に入ればお使いになれます。" ++ ++#: lib/choose_repository.tcl:25 ++msgid "Git Gui" ++msgstr "Git GUI" ++ ++#: lib/choose_repository.tcl:69 lib/choose_repository.tcl:204 ++msgid "Create New Repository" ++msgstr "新しいリポジトリを作る" ++ ++#: lib/choose_repository.tcl:74 lib/choose_repository.tcl:291 ++msgid "Clone Existing Repository" ++msgstr "既存リポジトリを複製する" ++ ++#: lib/choose_repository.tcl:79 lib/choose_repository.tcl:800 ++msgid "Open Existing Repository" ++msgstr "既存リポジトリを開く" ++ ++#: lib/choose_repository.tcl:91 ++msgid "Next >" ++msgstr "次 >" ++ ++#: lib/choose_repository.tcl:152 ++#, tcl-format ++msgid "Location %s already exists." ++msgstr "'%s' は既に存在します。" ++ ++#: lib/choose_repository.tcl:158 lib/choose_repository.tcl:165 ++#: lib/choose_repository.tcl:172 ++#, tcl-format ++msgid "Failed to create repository %s:" ++msgstr "リポジトリ %s を作製できません:" ++ ++#: lib/choose_repository.tcl:209 lib/choose_repository.tcl:309 ++msgid "Directory:" ++msgstr "ディレクトリ:" ++ ++#: lib/choose_repository.tcl:238 lib/choose_repository.tcl:363 ++#: lib/choose_repository.tcl:834 ++msgid "Git Repository" ++msgstr "GIT リポジトリ" ++ ++#: lib/choose_repository.tcl:253 lib/choose_repository.tcl:260 ++#, tcl-format ++msgid "Directory %s already exists." ++msgstr "ディレクトリ '%s' は既に存在します。" ++ ++#: lib/choose_repository.tcl:265 ++#, tcl-format ++msgid "File %s already exists." ++msgstr "ファイル '%s' は既に存在します。" ++ ++#: lib/choose_repository.tcl:286 ++msgid "Clone" ++msgstr "複製" ++ ++#: lib/choose_repository.tcl:299 ++msgid "URL:" ++msgstr "URL:" ++ ++#: lib/choose_repository.tcl:319 ++msgid "Clone Type:" ++msgstr "複製方式:" ++ ++#: lib/choose_repository.tcl:325 ++msgid "Standard (Fast, Semi-Redundant, Hardlinks)" ++msgstr "標準(高速・中冗長度・ハードリンク)" ++ ++#: lib/choose_repository.tcl:331 ++msgid "Full Copy (Slower, Redundant Backup)" ++msgstr "全複写(低速・冗長バックアップ)" ++ ++#: lib/choose_repository.tcl:337 ++msgid "Shared (Fastest, Not Recommended, No Backup)" ++msgstr "共有(最高速・非推奨・バックアップ無し)" ++ ++#: lib/choose_repository.tcl:369 lib/choose_repository.tcl:418 ++#: lib/choose_repository.tcl:560 lib/choose_repository.tcl:630 ++#: lib/choose_repository.tcl:840 lib/choose_repository.tcl:848 ++#, tcl-format ++msgid "Not a Git repository: %s" ++msgstr "Git リポジトリではありません: %s" ++ ++#: lib/choose_repository.tcl:405 ++msgid "Standard only available for local repository." ++msgstr "標準方式は同一計算機上のリポジトリにのみ使えます。" ++ ++#: lib/choose_repository.tcl:409 ++msgid "Shared only available for local repository." ++msgstr "共有方式は同一計算機上のリポジトリにのみ使えます。" ++ ++#: lib/choose_repository.tcl:439 ++msgid "Failed to configure origin" ++msgstr "origin を設定できませんでした" ++ ++#: lib/choose_repository.tcl:451 ++msgid "Counting objects" ++msgstr "オブジェクトを数えています" ++ ++#: lib/choose_repository.tcl:452 ++msgid "buckets" ++msgstr "バケツ" ++ ++#: lib/choose_repository.tcl:476 ++#, tcl-format ++msgid "Unable to copy objects/info/alternates: %s" ++msgstr "objects/info/alternates を複写できません: %s" ++ ++#: lib/choose_repository.tcl:512 ++#, tcl-format ++msgid "Nothing to clone from %s." ++msgstr "%s から複製する内容はありません" ++ ++#: lib/choose_repository.tcl:514 lib/choose_repository.tcl:728 ++#: lib/choose_repository.tcl:740 ++msgid "The 'master' branch has not been initialized." ++msgstr "'master' ブランチが初期化されていません" ++ ++#: lib/choose_repository.tcl:527 ++msgid "Hardlinks are unavailable. Falling back to copying." ++msgstr "ハードリンクが作れないので、コピーします" ++ ++#: lib/choose_repository.tcl:539 ++#, tcl-format ++msgid "Cloning from %s" ++msgstr "%s から複製しています" ++ ++#: lib/choose_repository.tcl:570 ++msgid "Copying objects" ++msgstr "オブジェクトを複写しています" ++ ++#: lib/choose_repository.tcl:571 ++msgid "KiB" ++msgstr "KiB" ++ ++#: lib/choose_repository.tcl:595 ++#, tcl-format ++msgid "Unable to copy object: %s" ++msgstr "オブジェクトを複写できません: %s" ++ ++#: lib/choose_repository.tcl:605 ++msgid "Linking objects" ++msgstr "オブジェクトを連結しています" ++ ++#: lib/choose_repository.tcl:606 ++msgid "objects" ++msgstr "オブジェクト" ++ ++#: lib/choose_repository.tcl:614 ++#, tcl-format ++msgid "Unable to hardlink object: %s" ++msgstr "オブジェクトをハードリンクできません: %s" ++ ++#: lib/choose_repository.tcl:669 ++msgid "Cannot fetch branches and objects. See console output for details." ++msgstr "ブランチやオブジェクトを取得できません。コンソール出力を見て下さい" ++ ++#: lib/choose_repository.tcl:680 ++msgid "Cannot fetch tags. See console output for details." ++msgstr "タグを取得できません。コンソール出力を見て下さい" ++ ++#: lib/choose_repository.tcl:704 ++msgid "Cannot determine HEAD. See console output for details." ++msgstr "HEAD を確定できません。コンソール出力を見て下さい" ++ ++#: lib/choose_repository.tcl:713 ++#, tcl-format ++msgid "Unable to cleanup %s" ++msgstr "%s を掃除できません" ++ ++#: lib/choose_repository.tcl:719 ++msgid "Clone failed." ++msgstr "複写に失敗しました。" ++ ++#: lib/choose_repository.tcl:726 ++msgid "No default branch obtained." ++msgstr "デフォールト・ブランチが取得されませんでした" ++ ++#: lib/choose_repository.tcl:737 ++#, tcl-format ++msgid "Cannot resolve %s as a commit." ++msgstr "%s をコミットとして解釈できません" ++ ++#: lib/choose_repository.tcl:749 ++msgid "Creating working directory" ++msgstr "作業ディレクトリを作成しています" ++ ++#: lib/choose_repository.tcl:750 lib/index.tcl:15 lib/index.tcl:80 ++#: lib/index.tcl:149 ++msgid "files" ++msgstr "ファイル" ++ ++#: lib/choose_repository.tcl:779 ++msgid "Initial file checkout failed." ++msgstr "初期チェックアウトに失敗しました" ++ ++#: lib/choose_repository.tcl:795 ++msgid "Open" ++msgstr "開く" ++ ++#: lib/choose_repository.tcl:805 ++msgid "Repository:" ++msgstr "リポジトリ:" ++ ++#: lib/choose_repository.tcl:854 ++#, tcl-format ++msgid "Failed to open repository %s:" ++msgstr "リポジトリ %s を開けません:" ++ ++#: lib/choose_rev.tcl:53 ++msgid "This Detached Checkout" ++msgstr "分離されたチェックアウト" ++ ++#: lib/choose_rev.tcl:60 ++msgid "Revision Expression:" ++msgstr "リビジョン式:" ++ ++#: lib/choose_rev.tcl:74 ++msgid "Local Branch" ++msgstr "ローカル・ブランチ" ++ ++#: lib/choose_rev.tcl:79 ++msgid "Tracking Branch" ++msgstr "トラッキング・ブランチ" ++ ++#: lib/choose_rev.tcl:84 lib/choose_rev.tcl:537 ++msgid "Tag" ++msgstr "タグ" ++ ++#: lib/choose_rev.tcl:317 ++#, tcl-format ++msgid "Invalid revision: %s" ++msgstr "無効なリビジョン: %s" ++ ++#: lib/choose_rev.tcl:338 ++msgid "No revision selected." ++msgstr "リビジョンが未選択です。" ++ ++#: lib/choose_rev.tcl:346 ++msgid "Revision expression is empty." ++msgstr "リビジョン式が空です。" ++ ++#: lib/choose_rev.tcl:530 ++msgid "Updated" ++msgstr "更新しました" ++ ++#: lib/choose_rev.tcl:558 ++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 "" ++"訂正するコミットがそもそもありません。\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:49 ++msgid "Error loading commit data for amend:" ++msgstr "訂正するコミットのデータを読めません:" ++ ++#: lib/commit.tcl:76 ++msgid "Unable to obtain your identity:" ++msgstr "ユーザの正体を確認できません:" ++ ++#: lib/commit.tcl:81 ++msgid "Invalid GIT_COMMITTER_IDENT:" ++msgstr "GIT_COMMITTER_IDENT が無効です:" ++ ++#: lib/commit.tcl:133 ++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:154 ++#, 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:162 ++#, 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:170 ++msgid "" ++"No changes to commit.\n" ++"\n" ++"You must stage at least 1 file before you can commit.\n" ++msgstr "" ++"コミットする変更がありません。\n" ++"\n" ++"最低一つの変更をコミット予定に加えてからコミットして下さい。\n" ++ ++#: lib/commit.tcl:183 ++msgid "" ++"Please supply a commit message.\n" ++"\n" ++"A good commit message has the following format:\n" ++"\n" ++"- First line: Describe in one sentance what you did.\n" ++"- Second line: Blank\n" ++"- Remaining lines: Describe why this change is good.\n" ++msgstr "" ++"コミット・メッセージを入力して下さい。\n" ++"\n" ++"正しいコミット・メッセージは:\n" ++"\n" ++"- 第1行: 何をしたか、を1行で要約。\n" ++"- 第2行: 空白\n" ++"- 残りの行: なぜ、この変更が良い変更か、の説明。\n" ++ ++#: lib/commit.tcl:257 ++msgid "write-tree failed:" ++msgstr "write-tree が失敗しました:" ++ ++#: lib/commit.tcl:275 ++#, tcl-format ++msgid "Commit %s appears to be corrupt" ++msgstr "コミット %s は壊れています" ++ ++#: lib/commit.tcl:279 ++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:286 ++msgid "No changes to commit." ++msgstr "コミットする変更がありません。" ++ ++#: lib/commit.tcl:303 ++#, tcl-format ++msgid "warning: Tcl does not support encoding '%s'." ++msgstr "警告: Tcl はエンコーディング '%s' をサポートしていません" ++ ++#: lib/commit.tcl:317 ++msgid "commit-tree failed:" ++msgstr "commit-tree が失敗しました:" ++ ++#: lib/commit.tcl:339 ++msgid "update-ref failed:" ++msgstr "update-ref が失敗しました:" ++ ++#: lib/commit.tcl:430 ++#, tcl-format ++msgid "Created commit %s: %s" ++msgstr "コミット %s を作成しました: %s" ++ ++#: lib/console.tcl:57 ++msgid "Working... please wait..." ++msgstr "実行中…お待ち下さい…" ++ ++#: lib/console.tcl:183 ++msgid "Success" ++msgstr "成功" ++ ++#: lib/console.tcl:196 ++msgid "Error: Command Failed" ++msgstr "エラー: コマンドが失敗しました" ++ ++#: lib/database.tcl:43 ++msgid "Number of loose objects" ++msgstr "ばらばらなオブジェクトの数" ++ ++#: lib/database.tcl:44 ++msgid "Disk space used by loose objects" ++msgstr "ばらばらなオブジェクトの使用するディスク量" ++ ++#: lib/database.tcl:45 ++msgid "Number of packed objects" ++msgstr "パックされたオブジェクトの数" ++ ++#: lib/database.tcl:46 ++msgid "Number of packs" ++msgstr "パックの数" ++ ++#: lib/database.tcl:47 ++msgid "Disk space used by packed objects" ++msgstr "パックされたオブジェクトの使用するディスク量" ++ ++#: lib/database.tcl:48 ++msgid "Packed objects waiting for pruning" ++msgstr "パックに存在するので捨てて良いオブジェクトの数" ++ ++#: lib/database.tcl:49 ++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 でオブジェクト・データベースを検証しています" ++ ++#: lib/database.tcl:108 ++#, 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 when more than %i loose objects exist.\n" ++"\n" ++"Compress the database now?" ++msgstr "" ++"このリポジトリにはおおよそ %i 個の個別オブジェクトがあります\n" ++"\n" ++"最適な性能を保つために、%i 個以上の個別オブジェクトを作る毎にデータベースを圧縮することを推奨します\n" ++"\n" ++"データベースを圧縮しますか?" ++ ++#: lib/date.tcl:25 ++#, tcl-format ++msgid "Invalid date from Git: %s" ++msgstr "Git から出た無効な日付: %s" ++ ++#: lib/diff.tcl:42 ++#, 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:81 ++#, tcl-format ++msgid "Loading diff of %s..." ++msgstr "%s の変更点をロード中…" ++ ++#: lib/diff.tcl:114 lib/diff.tcl:184 ++#, tcl-format ++msgid "Unable to display %s" ++msgstr "%s を表示できません" ++ ++#: lib/diff.tcl:115 ++msgid "Error loading file:" ++msgstr "ファイルを読む際のエラーです:" ++ ++#: lib/diff.tcl:122 ++msgid "Git Repository (subproject)" ++msgstr "Git リポジトリ(サブプロジェクト)" ++ ++#: lib/diff.tcl:134 ++msgid "* Binary file (not showing content)." ++msgstr "* バイナリファイル(内容は表示しません)" ++ ++#: lib/diff.tcl:185 ++msgid "Error loading diff:" ++msgstr "diff を読む際のエラーです:" ++ ++#: lib/diff.tcl:302 ++msgid "Failed to unstage selected hunk." ++msgstr "選択されたパッチをコミット予定から外せません。" ++ ++#: lib/diff.tcl:309 ++msgid "Failed to stage selected hunk." ++msgstr "選択されたパッチをコミット予定に加えられません。" ++ ++#: lib/error.tcl:12 lib/error.tcl:102 ++msgid "error" ++msgstr "エラー" ++ ++#: lib/error.tcl:28 ++msgid "warning" ++msgstr "警告" ++ ++#: lib/error.tcl:81 ++msgid "You must correct the above errors before committing." ++msgstr "コミットする前に、以上のエラーを修正して下さい" ++ ++#: lib/index.tcl:241 ++#, tcl-format ++msgid "Unstaging %s from commit" ++msgstr "コミットから '%s' を降ろす" ++ ++#: lib/index.tcl:285 ++#, tcl-format ++msgid "Adding %s" ++msgstr "コミットに %s を加えています" ++ ++#: lib/index.tcl:340 ++#, tcl-format ++msgid "Revert changes in file %s?" ++msgstr "ファイル %s にした変更を元に戻しますか?" ++ ++#: lib/index.tcl:342 ++#, tcl-format ++msgid "Revert changes in these %i files?" ++msgstr "これら %i 個のファイルにした変更を元に戻しますか?" ++ ++#: lib/index.tcl:348 ++msgid "Any unstaged changes will be permanently lost by the revert." ++msgstr "変更を元に戻すとコミット予定していない変更は全て失われます。" ++ ++#: lib/index.tcl:351 ++msgid "Do Nothing" ++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" ++ ++#: lib/merge.tcl:44 ++#, 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:54 ++#, 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:106 ++#, tcl-format ++msgid "%s of %s" ++msgstr "%s の %s ブランチ" ++ ++#: lib/merge.tcl:119 ++#, tcl-format ++msgid "Merging %s and %s" ++msgstr "%s と %s をマージします" ++ ++#: lib/merge.tcl:131 ++msgid "Merge completed successfully." ++msgstr "マージが完了しました" ++ ++#: lib/merge.tcl:133 ++msgid "Merge failed. Conflict resolution is required." ++msgstr "マージが失敗しました。衝突の解決が必要です。" ++ ++#: lib/merge.tcl:158 ++#, tcl-format ++msgid "Merge Into %s" ++msgstr "%s にマージ" ++ ++#: lib/merge.tcl:177 ++msgid "Revision To Merge" ++msgstr "マージするリビジョン" ++ ++#: lib/merge.tcl:212 ++msgid "" ++"Cannot abort while amending.\n" ++"\n" ++"You must finish amending this commit.\n" ++msgstr "" ++"訂正中には中止できません。\n" ++"\n" ++"まず今のコミット訂正を完了させて下さい。\n" ++ ++#: 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 "" ++"マージを中断しますか?\n" ++"\n" ++"現在のマージを中断すると、コミットしていない全ての変更が失われます。\n" ++"\n" ++"マージを中断してよろしいですか?" ++ ++#: 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 "" ++"変更点をリセットしますか?\n" ++"\n" ++"変更点をリセットすると、コミットしていない全ての変更が失われます。\n" ++"\n" ++"リセットしてよろしいですか?" ++ ++#: lib/merge.tcl:239 ++msgid "Aborting" ++msgstr "中断しています" ++ ++#: lib/merge.tcl:266 ++msgid "Abort failed." ++msgstr "中断に失敗しました。" ++ ++#: lib/merge.tcl:268 ++msgid "Abort completed. Ready." ++msgstr "中断完了。" ++ ++#: lib/option.tcl:82 ++msgid "Restore Defaults" ++msgstr "既定値に戻す" ++ ++#: lib/option.tcl:86 ++msgid "Save" ++msgstr "保存" ++ ++#: lib/option.tcl:96 ++#, tcl-format ++msgid "%s Repository" ++msgstr "%s リポジトリ" ++ ++#: lib/option.tcl:97 ++msgid "Global (All Repositories)" ++msgstr "大域(全てのリポジトリ)" ++ ++#: lib/option.tcl:103 ++msgid "User Name" ++msgstr "ユーザ名" ++ ++#: lib/option.tcl:104 ++msgid "Email Address" ++msgstr "電子メールアドレス" ++ ++#: lib/option.tcl:106 ++msgid "Summarize Merge Commits" ++msgstr "マージコミットの要約" ++ ++#: lib/option.tcl:107 ++msgid "Merge Verbosity" ++msgstr "マージの冗長度" ++ ++#: lib/option.tcl:108 ++msgid "Show Diffstat After Merge" ++msgstr "マージ後に diffstat を表示" ++ ++#: lib/option.tcl:110 ++msgid "Trust File Modification Timestamps" ++msgstr "ファイル変更時刻を信頼する" ++ ++#: lib/option.tcl:111 ++msgid "Prune Tracking Branches During Fetch" ++msgstr "フェッチ中にトラッキングブランチを刈る" ++ ++#: lib/option.tcl:112 ++msgid "Match Tracking Branches" ++msgstr "トラッキングブランチを合わせる" ++ ++#: lib/option.tcl:113 ++msgid "Number of Diff Context Lines" ++msgstr "diff の文脈行数" ++ ++#: lib/option.tcl:114 ++msgid "New Branch Name Template" ++msgstr "新しいブランチ名のテンプレート" ++ ++#: lib/option.tcl:176 ++msgid "Change Font" ++msgstr "フォントを変更" ++ ++#: lib/option.tcl:180 ++#, tcl-format ++msgid "Choose %s" ++msgstr "%s を選択" ++ ++#: lib/option.tcl:186 ++msgid "pt." ++msgstr "ポイント" ++ ++#: lib/option.tcl:200 ++msgid "Preferences" ++msgstr "設定" ++ ++#: lib/option.tcl:235 ++msgid "Failed to completely save options:" ++msgstr "完全にオプションを保存できません:" ++ ++#: lib/remote.tcl:165 ++msgid "Prune from" ++msgstr "から刈込む…" ++ ++#: lib/remote.tcl:170 ++msgid "Fetch from" ++msgstr "取得元" ++ ++#: lib/remote.tcl:213 ++msgid "Push to" ++msgstr "プッシュ先" ++ ++#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 ++msgid "Delete Remote Branch" ++msgstr "リモート・ブランチを削除" ++ ++#: lib/remote_branch_delete.tcl:47 ++msgid "From Repository" ++msgstr "元のリポジトリ" ++ ++#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:123 ++msgid "Remote:" ++msgstr "リモート:" ++ ++#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:138 ++msgid "Arbitrary URL:" ++msgstr "任意の URL:" ++ ++#: lib/remote_branch_delete.tcl:84 ++msgid "Branches" ++msgstr "ブランチ" ++ ++#: lib/remote_branch_delete.tcl:109 ++msgid "Delete Only If" ++msgstr "条件付で削除" ++ ++#: lib/remote_branch_delete.tcl:111 ++msgid "Merged Into:" ++msgstr "マージ先:" ++ ++#: lib/remote_branch_delete.tcl:119 ++msgid "Always (Do not perform merge checks)" ++msgstr "無条件(マージ検査をしない)" ++ ++#: lib/remote_branch_delete.tcl:152 ++msgid "A branch is required for 'Merged Into'." ++msgstr "'マージ先' にはブランチが必要です。" ++ ++#: lib/remote_branch_delete.tcl:184 ++#, tcl-format ++msgid "" ++"The following branches are not completely merged into %s:\n" ++"\n" ++" - %s" ++msgstr "" ++"以下のブランチは %s に完全にマージされていません:\n" ++"\n" ++" - %s" ++ ++#: lib/remote_branch_delete.tcl:189 ++#, 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:207 ++msgid "Please select one or more branches to delete." ++msgstr "削除するブランチを選択して下さい。" ++ ++#: lib/remote_branch_delete.tcl:216 ++msgid "" ++"Recovering deleted branches is difficult.\n" ++"\n" ++"Delete the selected branches?" ++msgstr "" ++"削除したブランチを回復するのは困難です。\n" ++"\n" ++"選択したブランチを削除して良いですか?" ++ ++#: lib/remote_branch_delete.tcl:226 ++#, tcl-format ++msgid "Deleting branches from %s" ++msgstr "%s からブランチを削除しています。" ++ ++#: lib/remote_branch_delete.tcl:286 ++msgid "No repository selected." ++msgstr "リポジトリが選択されていません。" ++ ++#: lib/remote_branch_delete.tcl:291 ++#, tcl-format ++msgid "Scanning %s..." ++msgstr "%s をスキャンしています…" ++ ++#: lib/shortcut.tcl:26 lib/shortcut.tcl:74 ++msgid "Cannot write script:" ++msgstr "スクリプトが書けません:" ++ ++#: lib/shortcut.tcl:149 ++msgid "Cannot write icon:" ++msgstr "アイコンが書けません:" ++ ++#: lib/status_bar.tcl:83 ++#, tcl-format ++msgid "%s ... %*i of %*i %s (%3i%%)" ++msgstr "%1$s ... %4$*i %6$s 中の %2$*i (%7$3i%%)" ++ ++#: lib/transport.tcl:6 ++#, tcl-format ++msgid "fetch %s" ++msgstr "%s を取得" ++ ++#: lib/transport.tcl:7 ++#, tcl-format ++msgid "Fetching new changes from %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 lib/transport.tcl:71 ++#, tcl-format ++msgid "push %s" ++msgstr "%s をプッシュ" ++ ++#: lib/transport.tcl:26 ++#, tcl-format ++msgid "Pushing changes to %s" ++msgstr "%s へ変更をプッシュしています" ++ ++#: lib/transport.tcl:72 ++#, tcl-format ++msgid "Pushing %s %s to %s" ++msgstr "%3$s へ %1$s %2$s をプッシュしています" ++ ++#: lib/transport.tcl:89 ++msgid "Push Branches" ++msgstr "ブランチをプッシュ" ++ ++#: lib/transport.tcl:103 ++msgid "Source Branches" ++msgstr "元のブランチ" ++ ++#: lib/transport.tcl:120 ++msgid "Destination Repository" ++msgstr "送り先リポジトリ" ++ ++#: lib/transport.tcl:158 ++msgid "Transfer Options" ++msgstr "通信オプション" ++ ++#: lib/transport.tcl:160 ++msgid "Force overwrite existing branch (may discard changes)" ++msgstr "既存ブランチを上書き(変更を破棄する可能性があります)" ++ ++#: lib/transport.tcl:164 ++msgid "Use thin pack (for slow network connections)" ++msgstr "Thin Pack を使う(遅いネットワーク接続)" ++ ++#: lib/transport.tcl:168 ++msgid "Include tags" ++msgstr "タグを含める" ++ diff --cc git-gui/po/po2msg.sh index 000000000,000000000..c63248e37 new file mode 100644 --- /dev/null +++ b/git-gui/po/po2msg.sh @@@ -1,0 -1,0 +1,133 @@@ ++#!/bin/sh ++# Tcl ignores the next line -*- tcl -*- \ ++exec tclsh "$0" -- "$@" ++ ++# This is a really stupid program, which serves as an alternative to ++# msgfmt. It _only_ translates to Tcl mode, does _not_ validate the ++# input, and does _not_ output any statistics. ++ ++proc u2a {s} { ++ set res "" ++ foreach i [split $s ""] { ++ scan $i %c c ++ if {$c<128} { ++ # escape '[', '\' and ']' ++ if {$c == 0x5b || $c == 0x5d} { ++ append res "\\" ++ } ++ append res $i ++ } else { ++ append res \\u[format %04.4x $c] ++ } ++ } ++ return $res ++} ++ ++set output_directory "." ++set lang "dummy" ++set files [list] ++set show_statistics 0 ++ ++# parse options ++for {set i 0} {$i < $argc} {incr i} { ++ set arg [lindex $argv $i] ++ if {$arg == "--statistics"} { ++ incr show_statistics ++ continue ++ } ++ if {$arg == "--tcl"} { ++ # we know ++ continue ++ } ++ if {$arg == "-l"} { ++ incr i ++ set lang [lindex $argv $i] ++ continue ++ } ++ if {$arg == "-d"} { ++ incr i ++ set tmp [lindex $argv $i] ++ regsub "\[^/\]$" $tmp "&/" output_directory ++ continue ++ } ++ lappend files $arg ++} ++ ++proc flush_msg {} { ++ global msgid msgstr mode lang out fuzzy ++ global translated_count fuzzy_count not_translated_count ++ ++ if {![info exists msgid] || $mode == ""} { ++ return ++ } ++ set mode "" ++ if {$fuzzy == 1} { ++ incr fuzzy_count ++ set fuzzy 0 ++ return ++ } ++ ++ if {$msgid == ""} { ++ set prefix "set ::msgcat::header" ++ } else { ++ if {$msgstr == ""} { ++ incr not_translated_count ++ return ++ } ++ set prefix "::msgcat::mcset $lang \"[u2a $msgid]\"" ++ incr translated_count ++ } ++ ++ puts $out "$prefix \"[u2a $msgstr]\"" ++} ++ ++set fuzzy 0 ++set translated_count 0 ++set fuzzy_count 0 ++set not_translated_count 0 ++foreach file $files { ++ regsub "^.*/\(\[^/\]*\)\.po$" $file "$output_directory\\1.msg" outfile ++ set in [open $file "r"] ++ fconfigure $in -encoding utf-8 ++ set out [open $outfile "w"] ++ ++ set mode "" ++ while {[gets $in line] >= 0} { ++ if {[regexp "^#" $line]} { ++ if {[regexp ", fuzzy" $line]} { ++ set fuzzy 1 ++ } else { ++ flush_msg ++ } ++ continue ++ } elseif {[regexp "^msgid \"(.*)\"$" $line dummy match]} { ++ flush_msg ++ set msgid $match ++ set mode "msgid" ++ } elseif {[regexp "^msgstr \"(.*)\"$" $line dummy match]} { ++ set msgstr $match ++ set mode "msgstr" ++ } elseif {$line == ""} { ++ flush_msg ++ } elseif {[regexp "^\"(.*)\"$" $line dummy match]} { ++ if {$mode == "msgid"} { ++ append msgid $match ++ } elseif {$mode == "msgstr"} { ++ append msgstr $match ++ } else { ++ puts stderr "I do not know what to do: $match" ++ } ++ } else { ++ puts stderr "Cannot handle $line" ++ } ++ } ++ flush_msg ++ close $in ++ close $out ++} ++ ++if {$show_statistics} { ++ puts [concat "$translated_count translated messages, " \ ++ "$fuzzy_count fuzzy ones, " \ ++ "$not_translated_count untranslated ones."] ++} diff --cc git-gui/po/ru.po index 000000000,000000000..6727a832e new file mode 100644 --- /dev/null +++ b/git-gui/po/ru.po @@@ -1,0 -1,0 +1,1893 @@@ ++# Translation of git-gui to russian ++# Copyright (C) 2007 Shawn Pearce ++# This file is distributed under the same license as the git-gui package. ++# Irina Riesen , 2007. ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: git-gui\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2007-10-31 21:23+0100\n" ++"PO-Revision-Date: 2007-10-22 22:30-0200\n" ++"Last-Translator: Alex Riesen \n" ++"Language-Team: Russian Translation \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++#: git-gui.sh:41 git-gui.sh:597 git-gui.sh:611 git-gui.sh:624 git-gui.sh:707 ++#: git-gui.sh:726 ++msgid "git-gui: fatal error" ++msgstr "git-gui: критическая ошибка" ++ ++#: git-gui.sh:558 ++#, tcl-format ++msgid "Invalid font specified in %s:" ++msgstr "В %s установлен неверный шрифт:" ++ ++#: git-gui.sh:583 ++msgid "Main Font" ++msgstr "Шрифт интерфейса" ++ ++#: git-gui.sh:584 ++msgid "Diff/Console Font" ++msgstr "Шрифт консоли и изменений (diff)" ++ ++#: git-gui.sh:598 ++msgid "Cannot find git in PATH." ++msgstr "git не найден в PATH." ++ ++#: git-gui.sh:625 ++msgid "Cannot parse Git version string:" ++msgstr "Невозможно распознать строку версии Git: " ++ ++#: git-gui.sh:643 ++#, 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" ++"%s указывает на версию '%s'.\n" ++"\n" ++"для %s требуется версия Git, начиная с 1.5.0\n" ++"\n" ++"Принять '%s' как версию 1.5.0?\n" ++ ++#: git-gui.sh:881 ++msgid "Git directory not found:" ++msgstr "Каталог Git не найден:" ++ ++#: git-gui.sh:888 ++msgid "Cannot move to top of working directory:" ++msgstr "Невозможно перейти к корню рабочего каталога репозитория: " ++ ++#: git-gui.sh:895 ++msgid "Cannot use funny .git directory:" ++msgstr "Каталог.git испорчен: " ++ ++#: git-gui.sh:900 ++msgid "No working directory" ++msgstr "Отсутствует рабочий каталог" ++ ++#: git-gui.sh:1047 ++msgid "Refreshing file status..." ++msgstr "Обновление информации о состоянии файлов..." ++ ++#: git-gui.sh:1112 ++msgid "Scanning for modified files ..." ++msgstr "Поиск измененных файлов..." ++ ++#: git-gui.sh:1287 lib/browser.tcl:245 ++msgid "Ready." ++msgstr "Готово." ++ ++#: git-gui.sh:1553 ++msgid "Unmodified" ++msgstr "Не изменено" ++ ++#: git-gui.sh:1555 ++msgid "Modified, not staged" ++msgstr "Изменено, не подготовлено" ++ ++#: git-gui.sh:1556 git-gui.sh:1561 ++msgid "Staged for commit" ++msgstr "Подготовлено для сохранения" ++ ++#: git-gui.sh:1557 git-gui.sh:1562 ++msgid "Portions staged for commit" ++msgstr "Части, подготовленные для сохранения" ++ ++#: git-gui.sh:1558 git-gui.sh:1563 ++msgid "Staged for commit, missing" ++msgstr "Подготовлено для сохранения, отсутствует" ++ ++#: git-gui.sh:1560 ++msgid "Untracked, not staged" ++msgstr "Не отслеживается, не подготовлено" ++ ++#: git-gui.sh:1565 ++msgid "Missing" ++msgstr "Отсутствует" ++ ++#: git-gui.sh:1566 ++msgid "Staged for removal" ++msgstr "Подготовлено для удаления" ++ ++#: git-gui.sh:1567 ++msgid "Staged for removal, still present" ++msgstr "Подготовлено для удаления, еще не удалено" ++ ++#: git-gui.sh:1569 git-gui.sh:1570 git-gui.sh:1571 git-gui.sh:1572 ++msgid "Requires merge resolution" ++msgstr "Требуется разрешение конфликта при объединении" ++ ++#: git-gui.sh:1607 ++msgid "Starting gitk... please wait..." ++msgstr "Запускается gitk... пожалуйста, ждите..." ++ ++#: git-gui.sh:1616 ++#, tcl-format ++msgid "" ++"Unable to start gitk:\n" ++"\n" ++"%s does not exist" ++msgstr "" ++"Не удалось запустить gitk:\n" ++"\n" ++"%s не существует" ++ ++#: git-gui.sh:1816 lib/choose_repository.tcl:35 ++msgid "Repository" ++msgstr "Репозиторий" ++ ++#: git-gui.sh:1817 ++msgid "Edit" ++msgstr "Редактировать" ++ ++#: git-gui.sh:1819 lib/choose_rev.tcl:560 ++msgid "Branch" ++msgstr "Ветвь" ++ ++#: git-gui.sh:1822 lib/choose_rev.tcl:547 ++msgid "Commit@@noun" ++msgstr "Состояние" ++ ++#: git-gui.sh:1825 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168 ++msgid "Merge" ++msgstr "Объединить" ++ ++#: git-gui.sh:1826 lib/choose_rev.tcl:556 ++msgid "Remote" ++msgstr "Внешние репозитории" ++ ++#: git-gui.sh:1835 ++msgid "Browse Current Branch's Files" ++msgstr "Просмотреть файлы текущей ветви" ++ ++#: git-gui.sh:1839 ++msgid "Browse Branch Files..." ++msgstr "Показать файлы ветви..." ++ ++#: git-gui.sh:1844 ++msgid "Visualize Current Branch's History" ++msgstr "История текущей ветви наглядно" ++ ++#: git-gui.sh:1848 ++msgid "Visualize All Branch History" ++msgstr "История всех ветвей наглядно" ++ ++#: git-gui.sh:1855 ++#, tcl-format ++msgid "Browse %s's Files" ++msgstr "Показать файлы ветви %s" ++ ++#: git-gui.sh:1857 ++#, tcl-format ++msgid "Visualize %s's History" ++msgstr "История ветви %s наглядно" ++ ++#: git-gui.sh:1862 lib/database.tcl:27 lib/database.tcl:67 ++msgid "Database Statistics" ++msgstr "Статистика базы данных" ++ ++#: git-gui.sh:1865 lib/database.tcl:34 ++msgid "Compress Database" ++msgstr "Сжать базу данных" ++ ++#: git-gui.sh:1868 ++msgid "Verify Database" ++msgstr "Проверить базу данных" ++ ++#: git-gui.sh:1875 git-gui.sh:1879 git-gui.sh:1883 lib/shortcut.tcl:7 ++#: lib/shortcut.tcl:39 lib/shortcut.tcl:71 ++msgid "Create Desktop Icon" ++msgstr "Создать ярлык на рабочем столе" ++ ++#: git-gui.sh:1888 lib/choose_repository.tcl:176 lib/choose_repository.tcl:184 ++msgid "Quit" ++msgstr "Выход" ++ ++#: git-gui.sh:1895 ++msgid "Undo" ++msgstr "Отменить" ++ ++#: git-gui.sh:1898 ++msgid "Redo" ++msgstr "Повторить" ++ ++#: git-gui.sh:1902 git-gui.sh:2395 ++msgid "Cut" ++msgstr "Вырезать" ++ ++#: git-gui.sh:1905 git-gui.sh:2398 git-gui.sh:2469 git-gui.sh:2541 ++#: lib/console.tcl:67 ++msgid "Copy" ++msgstr "Копировать" ++ ++#: git-gui.sh:1908 git-gui.sh:2401 ++msgid "Paste" ++msgstr "Вставить" ++ ++#: git-gui.sh:1911 git-gui.sh:2404 lib/branch_delete.tcl:26 ++#: lib/remote_branch_delete.tcl:38 ++msgid "Delete" ++msgstr "Удалить" ++ ++#: git-gui.sh:1915 git-gui.sh:2408 git-gui.sh:2545 lib/console.tcl:69 ++msgid "Select All" ++msgstr "Выделить все" ++ ++#: git-gui.sh:1924 ++msgid "Create..." ++msgstr "Создать..." ++ ++#: git-gui.sh:1930 ++msgid "Checkout..." ++msgstr "Перейти..." ++ ++#: git-gui.sh:1936 ++msgid "Rename..." ++msgstr "Переименовать..." ++ ++#: git-gui.sh:1941 git-gui.sh:2040 ++msgid "Delete..." ++msgstr "Удалить..." ++ ++#: git-gui.sh:1946 ++msgid "Reset..." ++msgstr "Сбросить..." ++ ++#: git-gui.sh:1958 git-gui.sh:2342 ++msgid "New Commit" ++msgstr "Новое состояние" ++ ++#: git-gui.sh:1966 git-gui.sh:2349 ++msgid "Amend Last Commit" ++msgstr "Исправить последнее состояние" ++ ++#: git-gui.sh:1975 git-gui.sh:2309 lib/remote_branch_delete.tcl:99 ++msgid "Rescan" ++msgstr "Перечитать" ++ ++#: git-gui.sh:1981 ++msgid "Stage To Commit" ++msgstr "Подготовить для сохранения" ++ ++#: git-gui.sh:1986 ++msgid "Stage Changed Files To Commit" ++msgstr "Подготовить измененные файлы для сохранения" ++ ++#: git-gui.sh:1992 ++msgid "Unstage From Commit" ++msgstr "Убрать из подготовленного" ++ ++#: git-gui.sh:1997 lib/index.tcl:393 ++msgid "Revert Changes" ++msgstr "Отменить изменения" ++ ++#: git-gui.sh:2004 git-gui.sh:2321 git-gui.sh:2419 ++msgid "Sign Off" ++msgstr "Подписать" ++ ++#: git-gui.sh:2008 git-gui.sh:2325 ++msgid "Commit@@verb" ++msgstr "Сохранить" ++ ++#: git-gui.sh:2019 ++msgid "Local Merge..." ++msgstr "Локальное объединение..." ++ ++#: git-gui.sh:2024 ++msgid "Abort Merge..." ++msgstr "Прервать объединение..." ++ ++#: git-gui.sh:2036 ++msgid "Push..." ++msgstr "Отправить..." ++ ++#: git-gui.sh:2047 lib/choose_repository.tcl:40 ++msgid "Apple" ++msgstr "" ++ ++#: git-gui.sh:2050 git-gui.sh:2072 lib/about.tcl:13 ++#: lib/choose_repository.tcl:43 lib/choose_repository.tcl:49 ++#, tcl-format ++msgid "About %s" ++msgstr "О %s" ++ ++#: git-gui.sh:2054 ++msgid "Preferences..." ++msgstr "Настройки..." ++ ++#: git-gui.sh:2062 git-gui.sh:2587 ++msgid "Options..." ++msgstr "Настройки..." ++ ++#: git-gui.sh:2068 lib/choose_repository.tcl:46 ++msgid "Help" ++msgstr "Помощь" ++ ++#: git-gui.sh:2109 ++msgid "Online Documentation" ++msgstr "Документация в интернете" ++ ++#: git-gui.sh:2193 ++#, tcl-format ++msgid "fatal: cannot stat path %s: No such file or directory" ++msgstr "критическая ошибка: %s: нет такого файла или каталога" ++ ++#: git-gui.sh:2226 ++msgid "Current Branch:" ++msgstr "Текущая ветвь:" ++ ++#: git-gui.sh:2247 ++msgid "Staged Changes (Will Commit)" ++msgstr "Подготовлено (будет сохранено)" ++ ++#: git-gui.sh:2266 ++msgid "Unstaged Changes" ++msgstr "Изменено (не будет сохранено)" ++ ++#: git-gui.sh:2315 ++msgid "Stage Changed" ++msgstr "Подготовить все" ++ ++#: git-gui.sh:2331 lib/transport.tcl:93 lib/transport.tcl:182 ++msgid "Push" ++msgstr "Отправить" ++ ++#: git-gui.sh:2361 ++msgid "Initial Commit Message:" ++msgstr "Комментарий к первому состоянию:" ++ ++#: git-gui.sh:2362 ++msgid "Amended Commit Message:" ++msgstr "Комментарий к исправленному состоянию:" ++ ++#: git-gui.sh:2363 ++msgid "Amended Initial Commit Message:" ++msgstr "Комментарий к исправленному первоначальному состоянию:" ++ ++#: git-gui.sh:2364 ++msgid "Amended Merge Commit Message:" ++msgstr "Комментарий к исправленному объединению:" ++ ++#: git-gui.sh:2365 ++msgid "Merge Commit Message:" ++msgstr "Комментарий к объединению:" ++ ++#: git-gui.sh:2366 ++msgid "Commit Message:" ++msgstr "Комментарий к состоянию:" ++ ++#: git-gui.sh:2411 git-gui.sh:2549 lib/console.tcl:71 ++msgid "Copy All" ++msgstr "Копировать все" ++ ++#: git-gui.sh:2435 lib/blame.tcl:104 ++msgid "File:" ++msgstr "Файл:" ++ ++#: git-gui.sh:2537 ++msgid "Refresh" ++msgstr "Обновить" ++ ++#: git-gui.sh:2558 ++msgid "Apply/Reverse Hunk" ++msgstr "Применить/Убрать изменение" ++ ++#: git-gui.sh:2564 ++msgid "Decrease Font Size" ++msgstr "Уменьшить размер шрифта" ++ ++#: git-gui.sh:2568 ++msgid "Increase Font Size" ++msgstr "Увеличить размер шрифта" ++ ++#: git-gui.sh:2573 ++msgid "Show Less Context" ++msgstr "Меньше контекста" ++ ++#: git-gui.sh:2580 ++msgid "Show More Context" ++msgstr "Больше контекста" ++ ++#: git-gui.sh:2594 ++msgid "Unstage Hunk From Commit" ++msgstr "Не сохранять часть" ++ ++#: git-gui.sh:2596 ++msgid "Stage Hunk For Commit" ++msgstr "Подготовить часть для сохранения" ++ ++#: git-gui.sh:2615 ++msgid "Initializing..." ++msgstr "Инициализация..." ++ ++#: git-gui.sh:2706 ++#, 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" ++"запущенными из %s\n" ++"\n" ++ ++#: git-gui.sh:2736 ++msgid "" ++"\n" ++"This is due to a known issue with the\n" ++"Tcl binary distributed by Cygwin." ++msgstr "" ++"\n" ++"Это известная проблема с Tcl,\n" ++"распространяемым Cygwin." ++ ++#: git-gui.sh:2741 ++#, 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 в Вашем персональном\n" ++"файле ~/.gitconfig.\n" ++ ++#: lib/about.tcl:25 ++msgid "git-gui - a graphical user interface for Git." ++msgstr "git-gui - графический пользовательский интерфейс к Git." ++ ++#: lib/blame.tcl:77 ++msgid "File Viewer" ++msgstr "Просмотр файла" ++ ++#: lib/blame.tcl:81 ++msgid "Commit:" ++msgstr "Сохраненное состояние:" ++ ++#: lib/blame.tcl:249 ++msgid "Copy Commit" ++msgstr "Скопировать SHA-1" ++ ++#: lib/blame.tcl:369 ++#, tcl-format ++msgid "Reading %s..." ++msgstr "Чтение %s..." ++ ++#: lib/blame.tcl:473 ++msgid "Loading copy/move tracking annotations..." ++msgstr "Загрузка аннотации копирований/переименований..." ++ ++#: lib/blame.tcl:493 ++msgid "lines annotated" ++msgstr "строк прокомментировано" ++ ++#: lib/blame.tcl:674 ++msgid "Loading original location annotations..." ++msgstr "Загрузка аннотаций первоначального положения объекта..." ++ ++#: lib/blame.tcl:677 ++msgid "Annotation complete." ++msgstr "Аннотация завершена." ++ ++#: lib/blame.tcl:731 ++msgid "Loading annotation..." ++msgstr "Загрузка аннотации..." ++ ++#: lib/blame.tcl:787 ++msgid "Author:" ++msgstr "Автор:" ++ ++#: lib/blame.tcl:791 ++msgid "Committer:" ++msgstr "Сохранил:" ++ ++#: lib/blame.tcl:796 ++msgid "Original File:" ++msgstr "Исходный файл:" ++ ++#: lib/blame.tcl:910 ++msgid "Originally By:" ++msgstr "Источник:" ++ ++#: lib/blame.tcl:916 ++msgid "In File:" ++msgstr "Файл:" ++ ++#: lib/blame.tcl:921 ++msgid "Copied Or Moved Here By:" ++msgstr "Скопировано/перемещено в:" ++ ++#: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19 ++msgid "Checkout Branch" ++msgstr "Перейти на ветвь" ++ ++#: lib/branch_checkout.tcl:23 ++msgid "Checkout" ++msgstr "Перейти" ++ ++#: lib/branch_checkout.tcl:27 lib/branch_create.tcl:35 ++#: lib/branch_delete.tcl:32 lib/branch_rename.tcl:30 lib/browser.tcl:281 ++#: lib/checkout_op.tcl:522 lib/choose_font.tcl:43 lib/merge.tcl:172 ++#: lib/option.tcl:90 lib/remote_branch_delete.tcl:42 lib/transport.tcl:97 ++msgid "Cancel" ++msgstr "Отменить" ++ ++#: lib/branch_checkout.tcl:32 lib/browser.tcl:286 ++msgid "Revision" ++msgstr "Версия" ++ ++#: lib/branch_checkout.tcl:36 lib/branch_create.tcl:69 lib/option.tcl:202 ++msgid "Options" ++msgstr "Настройки" ++ ++#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92 ++msgid "Fetch Tracking Branch" ++msgstr "Получить изменения из внешней ветви" ++ ++#: lib/branch_checkout.tcl:44 ++msgid "Detach From Local Branch" ++msgstr "Отсоединить от локальной ветви" ++ ++#: lib/branch_create.tcl:22 ++msgid "Create Branch" ++msgstr "Создание ветви" ++ ++#: lib/branch_create.tcl:27 ++msgid "Create New Branch" ++msgstr "Создать новую ветвь" ++ ++#: lib/branch_create.tcl:31 lib/choose_repository.tcl:375 ++msgid "Create" ++msgstr "Создать" ++ ++#: lib/branch_create.tcl:40 ++msgid "Branch Name" ++msgstr "Название ветви" ++ ++#: lib/branch_create.tcl:43 ++msgid "Name:" ++msgstr "Название:" ++ ++#: lib/branch_create.tcl:58 ++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 "Только Fast Forward" ++ ++#: lib/branch_create.tcl:85 lib/checkout_op.tcl:514 ++msgid "Reset" ++msgstr "Сброс" ++ ++#: lib/branch_create.tcl:97 ++msgid "Checkout After Creation" ++msgstr "После создания сделать текущей" ++ ++#: lib/branch_create.tcl:131 ++msgid "Please select a tracking branch." ++msgstr "Укажите ветвь слежения." ++ ++#: lib/branch_create.tcl:140 ++#, tcl-format ++msgid "Tracking branch %s is not a branch in the remote repository." ++msgstr "Ветвь слежения %s не является ветвью во внешнем репозитории." ++ ++#: lib/branch_create.tcl:153 lib/branch_rename.tcl:86 ++msgid "Please supply a branch name." ++msgstr "Укажите название ветви." ++ ++#: lib/branch_create.tcl:164 lib/branch_rename.tcl:106 ++#, tcl-format ++msgid "'%s' is not an acceptable branch name." ++msgstr "Недопустимое название ветви '%s'." ++ ++#: lib/branch_delete.tcl:15 ++msgid "Delete Branch" ++msgstr "Удаление ветви" ++ ++#: lib/branch_delete.tcl:20 ++msgid "Delete Local Branch" ++msgstr "Удалить локальную ветвь" ++ ++#: lib/branch_delete.tcl:37 ++msgid "Local Branches" ++msgstr "Локальные ветви" ++ ++#: lib/branch_delete.tcl:52 ++msgid "Delete Only If Merged Into" ++msgstr "Удалить только в случае, если было объединение с" ++ ++#: lib/branch_delete.tcl:54 ++msgid "Always (Do not perform merge test.)" ++msgstr "Всегда (не выполнять проверку на объединение)" ++ ++#: lib/branch_delete.tcl:103 ++#, tcl-format ++msgid "The following branches are not completely merged into %s:" ++msgstr "Следующие ветви объединены с %s не полностью:" ++ ++#: lib/branch_delete.tcl:115 ++msgid "" ++"Recovering deleted branches is difficult. \n" ++"\n" ++" Delete the selected branches?" ++msgstr "" ++"Восстанавливать удаленные ветви сложно. \n" ++"\n" ++" Удалить выбранные ветви?" ++ ++#: lib/branch_delete.tcl:141 ++#, tcl-format ++msgid "" ++"Failed to delete branches:\n" ++"%s" ++msgstr "" ++"Не удалось удалить ветви:\n" ++"%s" ++ ++#: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22 ++msgid "Rename Branch" ++msgstr "Переименование ветви" ++ ++#: lib/branch_rename.tcl:26 ++msgid "Rename" ++msgstr "Переименовать" ++ ++#: lib/branch_rename.tcl:36 ++msgid "Branch:" ++msgstr "Ветвь:" ++ ++#: lib/branch_rename.tcl:39 ++msgid "New Name:" ++msgstr "Новое название:" ++ ++#: lib/branch_rename.tcl:75 ++msgid "Please select a branch to rename." ++msgstr "Укажите ветвь для переименования." ++ ++#: lib/branch_rename.tcl:96 lib/checkout_op.tcl:179 ++#, tcl-format ++msgid "Branch '%s' already exists." ++msgstr "Ветвь '%s' уже существует." ++ ++#: lib/branch_rename.tcl:117 ++#, tcl-format ++msgid "Failed to rename '%s'." ++msgstr "Не удалось переименовать '%s'. " ++ ++#: lib/browser.tcl:17 ++msgid "Starting..." ++msgstr "Запуск..." ++ ++#: lib/browser.tcl:26 ++msgid "File Browser" ++msgstr "Просмотр списка файлов" ++ ++#: lib/browser.tcl:125 lib/browser.tcl:142 ++#, tcl-format ++msgid "Loading %s..." ++msgstr "Загрузка %s..." ++ ++#: lib/browser.tcl:186 ++msgid "[Up To Parent]" ++msgstr "[На уровень выше]" ++ ++#: lib/browser.tcl:266 lib/browser.tcl:272 ++msgid "Browse Branch Files" ++msgstr "Показать файлы ветви" ++ ++#: lib/browser.tcl:277 lib/choose_repository.tcl:391 ++#: lib/choose_repository.tcl:482 lib/choose_repository.tcl:492 ++#: lib/choose_repository.tcl:989 ++msgid "Browse" ++msgstr "Показать" ++ ++#: lib/checkout_op.tcl:79 ++#, tcl-format ++msgid "Fetching %s from %s" ++msgstr "Получение %s из %s " ++ ++#: lib/checkout_op.tcl:127 ++#, tcl-format ++msgid "fatal: Cannot resolve %s" ++msgstr "критическая ошибка: невозможно разрешить %s" ++ ++#: lib/checkout_op.tcl:140 lib/console.tcl:79 lib/database.tcl:31 ++msgid "Close" ++msgstr "Закрыть" ++ ++#: lib/checkout_op.tcl:169 ++#, tcl-format ++msgid "Branch '%s' does not exist." ++msgstr "Ветвь '%s' не существует " ++ ++#: lib/checkout_op.tcl:206 ++#, tcl-format ++msgid "" ++"Branch '%s' already exists.\n" ++"\n" ++"It cannot fast-forward to %s.\n" ++"A merge is required." ++msgstr "" ++"Ветвь '%s' уже существует.\n" ++"\n" ++"Она не может быть прокручена(fast-forward) к %s.\n" ++"Требуется объединение." ++ ++#: lib/checkout_op.tcl:220 ++#, tcl-format ++msgid "Merge strategy '%s' not supported." ++msgstr "Стратегия объединения '%s' не поддерживается." ++ ++#: lib/checkout_op.tcl:239 ++#, tcl-format ++msgid "Failed to update '%s'." ++msgstr "Не удалось обновить '%s'." ++ ++#: lib/checkout_op.tcl:251 ++msgid "Staging area (index) is already locked." ++msgstr "Рабочая область заблокирована другим процессом." ++ ++#: lib/checkout_op.tcl:266 ++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:322 ++#, tcl-format ++msgid "Updating working directory to '%s'..." ++msgstr "Обновление рабочего каталога из '%s'..." ++ ++#: lib/checkout_op.tcl:353 ++#, tcl-format ++msgid "Aborted checkout of '%s' (file level merging is required)." ++msgstr "Прерван переход на '%s' (требуется объединение на уровне файлов)" ++ ++#: lib/checkout_op.tcl:354 ++msgid "File level merge required." ++msgstr "Требуется объединение на уровне файлов." ++ ++#: lib/checkout_op.tcl:358 ++#, tcl-format ++msgid "Staying on branch '%s'." ++msgstr "Ветвь '%s' остается текущей." ++ ++#: lib/checkout_op.tcl:429 ++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:446 ++#, tcl-format ++msgid "Checked out '%s'." ++msgstr "Ветвь '%s' сделана текущей." ++ ++#: lib/checkout_op.tcl:478 ++#, tcl-format ++msgid "Resetting '%s' to '%s' will lose the following commits:" ++msgstr "Сброс '%s' в '%s' приведет к потере следующих сохраненных состояний: " ++ ++#: lib/checkout_op.tcl:500 ++msgid "Recovering lost commits may not be easy." ++msgstr "Восстановить потерянные сохраненные состояния будет сложно." ++ ++#: lib/checkout_op.tcl:505 ++#, tcl-format ++msgid "Reset '%s'?" ++msgstr "Сбросить '%s'?" ++ ++#: lib/checkout_op.tcl:510 lib/merge.tcl:164 ++msgid "Visualize" ++msgstr "Наглядно" ++ ++#: lib/checkout_op.tcl:578 ++#, 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/choose_font.tcl:39 ++msgid "Select" ++msgstr "Выбрать" ++ ++#: lib/choose_font.tcl:53 ++msgid "Font Family" ++msgstr "Шрифт" ++ ++#: lib/choose_font.tcl:73 ++msgid "Font Size" ++msgstr "Размер шрифта" ++ ++#: lib/choose_font.tcl:90 ++msgid "Font Example" ++msgstr "Пример текста" ++ ++#: lib/choose_font.tcl:101 ++msgid "" ++"This is example text.\n" ++"If you like this text, it can be your font." ++msgstr "" ++"Это пример текста.\n" ++"Если Вам нравится этот текст, это может быть Ваш шрифт." ++ ++#: lib/choose_repository.tcl:27 ++msgid "Git Gui" ++msgstr "" ++ ++#: lib/choose_repository.tcl:80 lib/choose_repository.tcl:380 ++msgid "Create New Repository" ++msgstr "Создать новый репозиторий" ++ ++#: lib/choose_repository.tcl:86 ++msgid "New..." ++msgstr "Новый..." ++ ++#: lib/choose_repository.tcl:93 lib/choose_repository.tcl:468 ++msgid "Clone Existing Repository" ++msgstr "Склонировать существующий репозиторий" ++ ++#: lib/choose_repository.tcl:99 ++msgid "Clone..." ++msgstr "Склонировать..." ++ ++#: lib/choose_repository.tcl:106 lib/choose_repository.tcl:978 ++msgid "Open Existing Repository" ++msgstr "Выбрать существующий репозиторий" ++ ++#: lib/choose_repository.tcl:112 ++msgid "Open..." ++msgstr "Открыть..." ++ ++#: lib/choose_repository.tcl:125 ++msgid "Recent Repositories" ++msgstr "Недавние репозитории" ++ ++#: lib/choose_repository.tcl:131 ++msgid "Open Recent Repository:" ++msgstr "Открыть последний репозиторий" ++ ++#: lib/choose_repository.tcl:294 ++#, tcl-format ++msgid "Location %s already exists." ++msgstr "Путь '%s' уже существует." ++ ++#: lib/choose_repository.tcl:300 lib/choose_repository.tcl:307 ++#: lib/choose_repository.tcl:314 ++#, tcl-format ++msgid "Failed to create repository %s:" ++msgstr "Не удалось создать репозиторий %s:" ++ ++#: lib/choose_repository.tcl:385 lib/choose_repository.tcl:486 ++msgid "Directory:" ++msgstr "Каталог:" ++ ++#: lib/choose_repository.tcl:415 lib/choose_repository.tcl:544 ++#: lib/choose_repository.tcl:1013 ++msgid "Git Repository" ++msgstr "Репозиторий" ++ ++#: lib/choose_repository.tcl:430 lib/choose_repository.tcl:437 ++#, tcl-format ++msgid "Directory %s already exists." ++msgstr "Каталог '%s' уже существует." ++ ++#: lib/choose_repository.tcl:442 ++#, tcl-format ++msgid "File %s already exists." ++msgstr "Файл '%s' уже существует." ++ ++#: lib/choose_repository.tcl:463 ++msgid "Clone" ++msgstr "Склонировать" ++ ++#: lib/choose_repository.tcl:476 ++msgid "URL:" ++msgstr "Ссылка:" ++ ++#: lib/choose_repository.tcl:496 ++msgid "Clone Type:" ++msgstr "Тип клона:" ++ ++#: lib/choose_repository.tcl:502 ++msgid "Standard (Fast, Semi-Redundant, Hardlinks)" ++msgstr "Стандартный (Быстрый, полуизбыточный, \"жесткие\" ссылки)" ++ ++#: lib/choose_repository.tcl:508 ++msgid "Full Copy (Slower, Redundant Backup)" ++msgstr "Полная копия (Медленный, создает резервную копию)" ++ ++#: lib/choose_repository.tcl:514 ++msgid "Shared (Fastest, Not Recommended, No Backup)" ++msgstr "Общий (Самый быстрый, не рекомендуется, без резервной копии)" ++ ++#: lib/choose_repository.tcl:550 lib/choose_repository.tcl:597 ++#: lib/choose_repository.tcl:738 lib/choose_repository.tcl:808 ++#: lib/choose_repository.tcl:1019 lib/choose_repository.tcl:1027 ++#, tcl-format ++msgid "Not a Git repository: %s" ++msgstr "Каталог не является репозиторием: %s" ++ ++#: lib/choose_repository.tcl:586 ++msgid "Standard only available for local repository." ++msgstr "Стандартный клон возможен только для локального репозитория." ++ ++#: lib/choose_repository.tcl:590 ++msgid "Shared only available for local repository." ++msgstr "Общий клон возможен только для локального репозитория." ++ ++#: lib/choose_repository.tcl:617 ++msgid "Failed to configure origin" ++msgstr "Не могу сконфигурировать исходный репозиторий." ++ ++#: lib/choose_repository.tcl:629 ++msgid "Counting objects" ++msgstr "Считаю объекты" ++ ++#: lib/choose_repository.tcl:630 ++msgid "buckets" ++msgstr "" ++ ++#: lib/choose_repository.tcl:654 ++#, tcl-format ++msgid "Unable to copy objects/info/alternates: %s" ++msgstr "Не могу скопировать objects/info/alternates: %s" ++ ++#: lib/choose_repository.tcl:690 ++#, tcl-format ++msgid "Nothing to clone from %s." ++msgstr "Нечего клонировать с %s." ++ ++#: lib/choose_repository.tcl:692 lib/choose_repository.tcl:906 ++#: lib/choose_repository.tcl:918 ++msgid "The 'master' branch has not been initialized." ++msgstr "Не инициализирована ветвь 'master'." ++ ++#: lib/choose_repository.tcl:705 ++msgid "Hardlinks are unavailable. Falling back to copying." ++msgstr "\"Жесткие ссылки\" не доступны. Буду использовать копирование." ++ ++#: lib/choose_repository.tcl:717 ++#, tcl-format ++msgid "Cloning from %s" ++msgstr "Клонирование %s" ++ ++#: lib/choose_repository.tcl:748 ++msgid "Copying objects" ++msgstr "Копирование objects" ++ ++#: lib/choose_repository.tcl:749 ++msgid "KiB" ++msgstr "КБ" ++ ++#: lib/choose_repository.tcl:773 ++#, tcl-format ++msgid "Unable to copy object: %s" ++msgstr "Не могу скопировать объект: %s" ++ ++#: lib/choose_repository.tcl:783 ++msgid "Linking objects" ++msgstr "Создание ссылок на objects" ++ ++#: lib/choose_repository.tcl:784 ++msgid "objects" ++msgstr "объекты" ++ ++#: lib/choose_repository.tcl:792 ++#, tcl-format ++msgid "Unable to hardlink object: %s" ++msgstr "Не могу \"жестко связать\" объект: %s" ++ ++#: lib/choose_repository.tcl:847 ++msgid "Cannot fetch branches and objects. See console output for details." ++msgstr "" ++"Не могу получить ветви и объекты. Дополнительная информация на консоли." ++ ++#: lib/choose_repository.tcl:858 ++msgid "Cannot fetch tags. See console output for details." ++msgstr "Не могу получить метки. Дополнительная информация на консоли." ++ ++#: lib/choose_repository.tcl:882 ++msgid "Cannot determine HEAD. See console output for details." ++msgstr "Не могу определить HEAD. Дополнительная информация на консоли." ++ ++#: lib/choose_repository.tcl:891 ++#, tcl-format ++msgid "Unable to cleanup %s" ++msgstr "Не могу очистить %s" ++ ++#: lib/choose_repository.tcl:897 ++msgid "Clone failed." ++msgstr "Клонирование не удалось." ++ ++#: lib/choose_repository.tcl:904 ++msgid "No default branch obtained." ++msgstr "Не было получено ветви по умолчанию." ++ ++#: lib/choose_repository.tcl:915 ++#, tcl-format ++msgid "Cannot resolve %s as a commit." ++msgstr "Не могу распознать %s как состояние." ++ ++#: lib/choose_repository.tcl:927 ++msgid "Creating working directory" ++msgstr "Создаю рабочий каталог" ++ ++#: lib/choose_repository.tcl:928 lib/index.tcl:65 lib/index.tcl:127 ++#: lib/index.tcl:193 ++msgid "files" ++msgstr "файлов" ++ ++#: lib/choose_repository.tcl:957 ++msgid "Initial file checkout failed." ++msgstr "Не удалось получить начальное состояние файлов репозитория." ++ ++#: lib/choose_repository.tcl:973 ++msgid "Open" ++msgstr "Открыть" ++ ++#: lib/choose_repository.tcl:983 ++msgid "Repository:" ++msgstr "Репозиторий:" ++ ++#: lib/choose_repository.tcl:1033 ++#, tcl-format ++msgid "Failed to open repository %s:" ++msgstr "Не удалось открыть репозиторий %s:" ++ ++#: lib/choose_rev.tcl:53 ++msgid "This Detached Checkout" ++msgstr "Текущее отсоединенное состояние" ++ ++#: lib/choose_rev.tcl:60 ++msgid "Revision Expression:" ++msgstr "Выражение для определения версии:" ++ ++#: lib/choose_rev.tcl:74 ++msgid "Local Branch" ++msgstr "Локальная ветвь:" ++ ++#: lib/choose_rev.tcl:79 ++msgid "Tracking Branch" ++msgstr "Ветвь слежения" ++ ++#: lib/choose_rev.tcl:84 lib/choose_rev.tcl:537 ++msgid "Tag" ++msgstr "Таг" ++ ++#: lib/choose_rev.tcl:317 ++#, tcl-format ++msgid "Invalid revision: %s" ++msgstr "Неверная версия: %s" ++ ++#: lib/choose_rev.tcl:338 ++msgid "No revision selected." ++msgstr "Версия не указана." ++ ++#: lib/choose_rev.tcl:346 ++msgid "Revision expression is empty." ++msgstr "Пустое выражение для определения версии." ++ ++#: lib/choose_rev.tcl:530 ++msgid "Updated" ++msgstr "Обновлено" ++ ++#: lib/choose_rev.tcl:558 ++msgid "URL" ++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:49 ++msgid "Error loading commit data for amend:" ++msgstr "Ошибка при загрузке данных для исправления сохраненного состояния:" ++ ++#: lib/commit.tcl:76 ++msgid "Unable to obtain your identity:" ++msgstr "Невозможно получить информацию об авторстве:" ++ ++#: lib/commit.tcl:81 ++msgid "Invalid GIT_COMMITTER_IDENT:" ++msgstr "Неверный GIT_COMMITTER_IDENT:" ++ ++#: lib/commit.tcl:133 ++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:154 ++#, 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:162 ++#, 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:170 ++msgid "" ++"No changes to commit.\n" ++"\n" ++"You must stage at least 1 file before you can commit.\n" ++msgstr "" ++"Отсутствуют изменения для сохранения.\n" ++"\n" ++"Подготовьте хотя бы один файл до создания сохраненного состояния.\n" ++ ++#: lib/commit.tcl:183 ++msgid "" ++"Please supply a commit message.\n" ++"\n" ++"A good commit message has the following format:\n" ++"\n" ++"- First line: Describe in one sentance 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" ++ ++#: lib/commit.tcl:257 ++msgid "write-tree failed:" ++msgstr "Программа write-tree завершилась с ошибкой:" ++ ++#: lib/commit.tcl:275 ++#, tcl-format ++msgid "Commit %s appears to be corrupt" ++msgstr "Состояние %s выглядит поврежденным" ++ ++#: lib/commit.tcl:279 ++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:286 ++msgid "No changes to commit." ++msgstr "Отуствуют измения для сохранения." ++ ++#: lib/commit.tcl:303 ++#, tcl-format ++msgid "warning: Tcl does not support encoding '%s'." ++msgstr "предупреждение: Tcl не поддерживает кодировку '%s'." ++ ++#: lib/commit.tcl:317 ++msgid "commit-tree failed:" ++msgstr "Программа commit-tree завершилась с ошибкой:" ++ ++#: lib/commit.tcl:339 ++msgid "update-ref failed:" ++msgstr "Программа update-ref завершилась с ошибкой:" ++ ++#: lib/commit.tcl:430 ++#, tcl-format ++msgid "Created commit %s: %s" ++msgstr "Создано состояние %s: %s " ++ ++#: lib/console.tcl:57 ++msgid "Working... please wait..." ++msgstr "В процессе... пожалуйста, ждите..." ++ ++#: lib/console.tcl:183 ++msgid "Success" ++msgstr "Процесс успешно завершен" ++ ++#: lib/console.tcl:196 ++msgid "Error: Command Failed" ++msgstr "Ошибка: не удалось выполнить команду" ++ ++#: lib/database.tcl:43 ++msgid "Number of loose objects" ++msgstr "Количество несвязанных объектов" ++ ++#: lib/database.tcl:44 ++msgid "Disk space used by loose objects" ++msgstr "Объем дискового пространства, занятый несвязанными объектами" ++ ++#: lib/database.tcl:45 ++msgid "Number of packed objects" ++msgstr "Количество упакованных объектов" ++ ++#: lib/database.tcl:46 ++msgid "Number of packs" ++msgstr "Количество pack-файлов" ++ ++#: lib/database.tcl:47 ++msgid "Disk space used by packed objects" ++msgstr "Объем дискового пространства, занятый упакованными объектами" ++ ++#: lib/database.tcl:48 ++msgid "Packed objects waiting for pruning" ++msgstr "Несвязанные объекты, которые можно удалить" ++ ++#: lib/database.tcl:49 ++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" ++ ++#: lib/database.tcl:108 ++#, 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 when more than %i loose objects exist.\n" ++"\n" ++"Compress the database now?" ++msgstr "" ++"Этот репозиторий сейчас содержит примерно %i свободных объектов\n" ++"\n" ++"Для лучшей производительности рекомендуется сжать базу данных, когда есть " ++"более %i несвязанных объектов.\n" ++"\n" ++"Сжать базу данных сейчас?" ++ ++#: lib/date.tcl:25 ++#, tcl-format ++msgid "Invalid date from Git: %s" ++msgstr "Неправильная дата в репозитории: %s" ++ ++#: lib/diff.tcl:42 ++#, 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:81 ++#, tcl-format ++msgid "Loading diff of %s..." ++msgstr "Загрузка изменений в %s..." ++ ++#: lib/diff.tcl:114 lib/diff.tcl:184 ++#, tcl-format ++msgid "Unable to display %s" ++msgstr "Не могу показать %s" ++ ++#: lib/diff.tcl:115 ++msgid "Error loading file:" ++msgstr "Ошибка загрузки файла:" ++ ++#: lib/diff.tcl:122 ++msgid "Git Repository (subproject)" ++msgstr "Репозиторий Git (подпроект)" ++ ++#: lib/diff.tcl:134 ++msgid "* Binary file (not showing content)." ++msgstr "* Двоичный файл (содержимое не показано)" ++ ++#: lib/diff.tcl:185 ++msgid "Error loading diff:" ++msgstr "Ошибка загрузки diff:" ++ ++#: lib/diff.tcl:302 ++msgid "Failed to unstage selected hunk." ++msgstr "Не удалось исключить выбранную часть." ++ ++#: lib/diff.tcl:309 ++msgid "Failed to stage selected hunk." ++msgstr "Не удалось подготовить к сохранению выбранную часть." ++ ++#: lib/error.tcl:12 lib/error.tcl:102 ++msgid "error" ++msgstr "ошибка" ++ ++#: lib/error.tcl:28 ++msgid "warning" ++msgstr "предупреждение" ++ ++#: lib/error.tcl:81 ++msgid "You must correct the above errors before committing." ++msgstr "Прежде чем сохранить, исправьте вышеуказанные ошибки." ++ ++#: lib/index.tcl:6 ++msgid "Unable to unlock the index." ++msgstr "Не удалось разблокировать индекс" ++ ++#: lib/index.tcl:15 ++msgid "Index Error" ++msgstr "Ошибка индекса" ++ ++#: lib/index.tcl:21 ++msgid "" ++"Updating the Git index failed. A rescan will be automatically started to " ++"resynchronize git-gui." ++msgstr "" ++"Не удалось обновить индекс Git. Состояние репозитория будет" ++"перечитано автоматически." ++ ++#: lib/index.tcl:27 ++msgid "Continue" ++msgstr "Продолжить" ++ ++#: lib/index.tcl:31 ++msgid "Unlock Index" ++msgstr "Разблокировать индекс" ++ ++#: lib/index.tcl:282 ++#, tcl-format ++msgid "Unstaging %s from commit" ++msgstr "Удаление %s из подготовленного" ++ ++#: lib/index.tcl:326 ++#, tcl-format ++msgid "Adding %s" ++msgstr "Добавление %s..." ++ ++#: lib/index.tcl:381 ++#, tcl-format ++msgid "Revert changes in file %s?" ++msgstr "Отменить изменения в файле %s?" ++ ++#: lib/index.tcl:383 ++#, tcl-format ++msgid "Revert changes in these %i files?" ++msgstr "Отменить изменения в %i файле(-ах)?" ++ ++#: lib/index.tcl:389 ++msgid "Any unstaged changes will be permanently lost by the revert." ++msgstr "" ++"Любые изменения, не подготовленные к сохранению, будут потеряны при данной " ++"операции." ++ ++#: lib/index.tcl:392 ++msgid "Do Nothing" ++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" ++ ++#: lib/merge.tcl:44 ++#, 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:54 ++#, 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:106 ++#, tcl-format ++msgid "%s of %s" ++msgstr "%s из %s" ++ ++#: lib/merge.tcl:119 ++#, tcl-format ++msgid "Merging %s and %s" ++msgstr "Объединение %s и %s" ++ ++#: lib/merge.tcl:131 ++msgid "Merge completed successfully." ++msgstr "Объединение успешно завершено." ++ ++#: lib/merge.tcl:133 ++msgid "Merge failed. Conflict resolution is required." ++msgstr "Не удалось завершить объединение. Требуется разрешение конфликта." ++ ++#: lib/merge.tcl:158 ++#, tcl-format ++msgid "Merge Into %s" ++msgstr "Объединить с %s" ++ ++#: lib/merge.tcl:177 ++msgid "Revision To Merge" ++msgstr "Версия для объединения" ++ ++#: lib/merge.tcl:212 ++msgid "" ++"Cannot abort while amending.\n" ++"\n" ++"You must finish amending this commit.\n" ++msgstr "" ++"Невозможно прервать исправление.\n" ++"\n" ++"Завершите текущее исправление сохраненного состояния.\n" ++ ++#: 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 "" ++"Прервать объединение?\n" ++"\n" ++"Прерывание объединения приведет к потере *ВСЕХ* несохраненных изменений.\n" ++"\n" ++"Продолжить?" ++ ++#: 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 "" ++"Прервать объединение?\n" ++"\n" ++"Прерывание объединения приведет к потере *ВСЕХ* несохраненных изменений.\n" ++"\n" ++"Продолжить?" ++ ++#: lib/merge.tcl:239 ++msgid "Aborting" ++msgstr "Прерываю" ++ ++#: lib/merge.tcl:266 ++msgid "Abort failed." ++msgstr "Прервать не удалось." ++ ++#: lib/merge.tcl:268 ++msgid "Abort completed. Ready." ++msgstr "Прервано." ++ ++#: lib/option.tcl:82 ++msgid "Restore Defaults" ++msgstr "Восстановить настройки по умолчанию" ++ ++#: lib/option.tcl:86 ++msgid "Save" ++msgstr "Сохранить" ++ ++#: lib/option.tcl:96 ++#, tcl-format ++msgid "%s Repository" ++msgstr "для репозитория %s" ++ ++#: lib/option.tcl:97 ++msgid "Global (All Repositories)" ++msgstr "Общие (для всех репозиториев)" ++ ++#: lib/option.tcl:103 ++msgid "User Name" ++msgstr "Имя пользователя" ++ ++#: lib/option.tcl:104 ++msgid "Email Address" ++msgstr "Адес электронной почты" ++ ++#: lib/option.tcl:106 ++msgid "Summarize Merge Commits" ++msgstr "Суммарный комментарий при объединении" ++ ++#: lib/option.tcl:107 ++msgid "Merge Verbosity" ++msgstr "Уровень детальности сообщений при объединении" ++ ++#: lib/option.tcl:108 ++msgid "Show Diffstat After Merge" ++msgstr "Показать отчет об изменениях после объединения" ++ ++#: lib/option.tcl:110 ++msgid "Trust File Modification Timestamps" ++msgstr "Доверять времени модификации файла" ++ ++#: lib/option.tcl:111 ++msgid "Prune Tracking Branches During Fetch" ++msgstr "Чистка ветвей слежения при получении изменений" ++ ++#: lib/option.tcl:112 ++msgid "Match Tracking Branches" ++msgstr "Имя новой ветви взять из имен ветвей слежения" ++ ++#: lib/option.tcl:113 ++msgid "Number of Diff Context Lines" ++msgstr "Число строк в контексте diff" ++ ++#: lib/option.tcl:114 ++msgid "New Branch Name Template" ++msgstr "Шаблон для имени новой ветви" ++ ++#: lib/option.tcl:176 ++msgid "Change Font" ++msgstr "Изменить шрифт" ++ ++#: lib/option.tcl:180 ++#, tcl-format ++msgid "Choose %s" ++msgstr "Выберите %s" ++ ++# carbon copy ++#: lib/option.tcl:186 ++msgid "pt." ++msgstr "" ++ ++#: lib/option.tcl:200 ++msgid "Preferences" ++msgstr "Настройки" ++ ++#: lib/option.tcl:235 ++msgid "Failed to completely save options:" ++msgstr "Не удалось полностью сохранить настройки:" ++ ++#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 ++msgid "Delete Remote Branch" ++msgstr "Удалить внешнюю ветвь" ++ ++#: lib/remote_branch_delete.tcl:47 ++msgid "From Repository" ++msgstr "Из репозитория" ++ ++#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:123 ++msgid "Remote:" ++msgstr "внешний:" ++ ++#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:138 ++msgid "Arbitrary URL:" ++msgstr "по указанному URL:" ++ ++#: lib/remote_branch_delete.tcl:84 ++msgid "Branches" ++msgstr "Ветви" ++ ++#: lib/remote_branch_delete.tcl:109 ++msgid "Delete Only If" ++msgstr "Удалить только в случае, если" ++ ++#: lib/remote_branch_delete.tcl:111 ++msgid "Merged Into:" ++msgstr "Объединено с:" ++ ++#: lib/remote_branch_delete.tcl:119 ++msgid "Always (Do not perform merge checks)" ++msgstr "Всегда (не выполнять проверку объединений)" ++ ++#: lib/remote_branch_delete.tcl:152 ++msgid "A branch is required for 'Merged Into'." ++msgstr "Для опции 'Объединено с' требуется указать ветвь." ++ ++#: lib/remote_branch_delete.tcl:184 ++#, tcl-format ++msgid "" ++"The following branches are not completely merged into %s:\n" ++"\n" ++" - %s" ++msgstr "" ++"Следующие ветви объединены с %s не полностью:\n" ++" - %s" ++ ++#: lib/remote_branch_delete.tcl:189 ++#, 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:207 ++msgid "Please select one or more branches to delete." ++msgstr "Укажите одну или несколько ветвей для удаления." ++ ++#: lib/remote_branch_delete.tcl:216 ++msgid "" ++"Recovering deleted branches is difficult.\n" ++"\n" ++"Delete the selected branches?" ++msgstr "" ++"Восстановить удаленные ветви сложно.\n" ++"\n" ++"Продолжить?" ++ ++#: lib/remote_branch_delete.tcl:226 ++#, tcl-format ++msgid "Deleting branches from %s" ++msgstr "Удаление ветвей из %s" ++ ++#: lib/remote_branch_delete.tcl:286 ++msgid "No repository selected." ++msgstr "Не указан репозиторий." ++ ++#: lib/remote_branch_delete.tcl:291 ++#, tcl-format ++msgid "Scanning %s..." ++msgstr "Перечитывание %s... " ++ ++#: lib/remote.tcl:165 ++msgid "Prune from" ++msgstr "Чистка" ++ ++#: lib/remote.tcl:170 ++msgid "Fetch from" ++msgstr "Получение из" ++ ++#: lib/remote.tcl:213 ++msgid "Push to" ++msgstr "Отправить" ++ ++#: lib/shortcut.tcl:20 lib/shortcut.tcl:61 ++msgid "Cannot write shortcut:" ++msgstr "Невозможно записать ссылку:" ++ ++#: lib/shortcut.tcl:136 ++msgid "Cannot write icon:" ++msgstr "Невозможно записать значок:" ++ ++#: lib/status_bar.tcl:83 ++#, tcl-format ++msgid "%s ... %*i of %*i %s (%3i%%)" ++msgstr "%s ... %*i из %*i %s (%3i%%)" ++ ++#: lib/transport.tcl:6 ++#, tcl-format ++msgid "fetch %s" ++msgstr "получение %s" ++ ++#: lib/transport.tcl:7 ++#, tcl-format ++msgid "Fetching new changes from %s" ++msgstr "Получение изменений из %s " ++ ++# carbon copy ++#: 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 lib/transport.tcl:71 ++#, tcl-format ++msgid "push %s" ++msgstr "отправить %s" ++ ++#: lib/transport.tcl:26 ++#, tcl-format ++msgid "Pushing changes to %s" ++msgstr "Отправка изменений в %s " ++ ++#: lib/transport.tcl:72 ++#, tcl-format ++msgid "Pushing %s %s to %s" ++msgstr "Отправка %s %s в %s" ++ ++#: lib/transport.tcl:89 ++msgid "Push Branches" ++msgstr "Отправить изменения в ветвях" ++ ++#: lib/transport.tcl:103 ++msgid "Source Branches" ++msgstr "Исходные ветви" ++ ++#: lib/transport.tcl:120 ++msgid "Destination Repository" ++msgstr "Репозиторий назначения" ++ ++#: lib/transport.tcl:158 ++msgid "Transfer Options" ++msgstr "Настройки отправки" ++ ++#: lib/transport.tcl:160 ++msgid "Force overwrite existing branch (may discard changes)" ++msgstr "Намеренно переписать существующую ветвь (возможна потеря изменений)" ++ ++#: lib/transport.tcl:164 ++msgid "Use thin pack (for slow network connections)" ++msgstr "Использовать thin pack (для медленных сетевых подключений)" ++ ++#: lib/transport.tcl:168 ++msgid "Include tags" ++msgstr "Передать таги" ++ ++#~ msgid "Next >" ++#~ msgstr "Дальше >" diff --cc git-gui/po/zh_cn.po index 000000000,000000000..621c9479b new file mode 100644 --- /dev/null +++ b/git-gui/po/zh_cn.po @@@ -1,0 -1,0 +1,1769 @@@ ++# Translation of git-gui to Chinese ++# Copyright (C) 2007 Shawn Pearce ++# This file is distributed under the same license as the git-gui package. ++# Xudong Guan , 2007. ++# ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: git-gui\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2007-10-10 04:04-0400\n" ++"PO-Revision-Date: 2007-07-21 01:23-0700\n" ++"Last-Translator: Xudong Guan \n" ++"Language-Team: Chinese\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++#: git-gui.sh:41 git-gui.sh:634 git-gui.sh:648 git-gui.sh:661 git-gui.sh:744 ++#: git-gui.sh:763 ++msgid "git-gui: fatal error" ++msgstr "" ++ ++#: git-gui.sh:595 ++#, tcl-format ++msgid "Invalid font specified in %s:" ++msgstr "" ++ ++#: git-gui.sh:620 ++msgid "Main Font" ++msgstr "" ++ ++#: git-gui.sh:621 ++msgid "Diff/Console Font" ++msgstr "" ++ ++#: git-gui.sh:635 ++msgid "Cannot find git in PATH." ++msgstr "" ++ ++#: git-gui.sh:662 ++msgid "Cannot parse Git version string:" ++msgstr "" ++ ++#: git-gui.sh:680 ++#, 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-gui.sh:853 ++msgid "Git directory not found:" ++msgstr "" ++ ++#: git-gui.sh:860 ++msgid "Cannot move to top of working directory:" ++msgstr "" ++ ++#: git-gui.sh:867 ++msgid "Cannot use funny .git directory:" ++msgstr "" ++ ++#: git-gui.sh:872 ++msgid "No working directory" ++msgstr "" ++ ++#: git-gui.sh:1019 ++msgid "Refreshing file status..." ++msgstr "" ++ ++#: git-gui.sh:1084 ++msgid "Scanning for modified files ..." ++msgstr "" ++ ++#: git-gui.sh:1259 lib/browser.tcl:245 ++#, fuzzy ++msgid "Ready." ++msgstr "重做" ++ ++#: git-gui.sh:1525 ++msgid "Unmodified" ++msgstr "" ++ ++#: git-gui.sh:1527 ++msgid "Modified, not staged" ++msgstr "" ++ ++#: git-gui.sh:1528 git-gui.sh:1533 ++#, fuzzy ++msgid "Staged for commit" ++msgstr "从本次提交移除" ++ ++#: git-gui.sh:1529 git-gui.sh:1534 ++#, fuzzy ++msgid "Portions staged for commit" ++msgstr "从本次提交移除" ++ ++#: git-gui.sh:1530 git-gui.sh:1535 ++msgid "Staged for commit, missing" ++msgstr "" ++ ++#: git-gui.sh:1532 ++msgid "Untracked, not staged" ++msgstr "" ++ ++#: git-gui.sh:1537 ++msgid "Missing" ++msgstr "" ++ ++#: git-gui.sh:1538 ++msgid "Staged for removal" ++msgstr "" ++ ++#: git-gui.sh:1539 ++msgid "Staged for removal, still present" ++msgstr "" ++ ++#: git-gui.sh:1541 git-gui.sh:1542 git-gui.sh:1543 git-gui.sh:1544 ++msgid "Requires merge resolution" ++msgstr "" ++ ++#: git-gui.sh:1579 ++msgid "Starting gitk... please wait..." ++msgstr "" ++ ++#: git-gui.sh:1588 ++#, tcl-format ++msgid "" ++"Unable to start gitk:\n" ++"\n" ++"%s does not exist" ++msgstr "" ++ ++#: git-gui.sh:1788 lib/choose_repository.tcl:32 ++msgid "Repository" ++msgstr "版本树" ++ ++#: git-gui.sh:1789 ++msgid "Edit" ++msgstr "编辑" ++ ++#: git-gui.sh:1791 lib/choose_rev.tcl:560 ++msgid "Branch" ++msgstr "分支" ++ ++#: git-gui.sh:1794 lib/choose_rev.tcl:547 ++#, fuzzy ++msgid "Commit@@noun" ++msgstr "提交" ++ ++#: git-gui.sh:1797 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168 ++msgid "Merge" ++msgstr "合并" ++ ++#: git-gui.sh:1798 lib/choose_rev.tcl:556 ++#, fuzzy ++msgid "Remote" ++msgstr "改名..." ++ ++#: git-gui.sh:1807 ++msgid "Browse Current Branch's Files" ++msgstr "浏览当前分支文件" ++ ++#: git-gui.sh:1811 ++#, fuzzy ++msgid "Browse Branch Files..." ++msgstr "浏览当前分支文件" ++ ++#: git-gui.sh:1816 ++msgid "Visualize Current Branch's History" ++msgstr "调用gitk显示当前分支" ++ ++#: git-gui.sh:1820 ++msgid "Visualize All Branch History" ++msgstr "调用gitk显示所有分支" ++ ++#: git-gui.sh:1827 ++#, fuzzy, tcl-format ++msgid "Browse %s's Files" ++msgstr "浏览当前分支文件" ++ ++#: git-gui.sh:1829 ++#, fuzzy, tcl-format ++msgid "Visualize %s's History" ++msgstr "调用gitk显示所有分支" ++ ++#: git-gui.sh:1834 lib/database.tcl:27 lib/database.tcl:67 ++msgid "Database Statistics" ++msgstr "数据库统计数据" ++ ++#: git-gui.sh:1837 lib/database.tcl:34 ++msgid "Compress Database" ++msgstr "压缩数据库" ++ ++#: git-gui.sh:1840 ++msgid "Verify Database" ++msgstr "验证数据库" ++ ++#: git-gui.sh:1847 git-gui.sh:1851 git-gui.sh:1855 lib/shortcut.tcl:9 ++#: lib/shortcut.tcl:45 lib/shortcut.tcl:84 ++msgid "Create Desktop Icon" ++msgstr "创建桌面图标" ++ ++#: git-gui.sh:1860 lib/choose_repository.tcl:36 lib/choose_repository.tcl:95 ++msgid "Quit" ++msgstr "退出" ++ ++#: git-gui.sh:1867 ++msgid "Undo" ++msgstr "撤销" ++ ++#: git-gui.sh:1870 ++msgid "Redo" ++msgstr "重做" ++ ++#: git-gui.sh:1874 git-gui.sh:2366 ++msgid "Cut" ++msgstr "剪切" ++ ++#: git-gui.sh:1877 git-gui.sh:2369 git-gui.sh:2440 git-gui.sh:2512 ++#: lib/console.tcl:67 ++msgid "Copy" ++msgstr "复制" ++ ++#: git-gui.sh:1880 git-gui.sh:2372 ++msgid "Paste" ++msgstr "粘贴" ++ ++#: git-gui.sh:1883 git-gui.sh:2375 lib/branch_delete.tcl:26 ++#: lib/remote_branch_delete.tcl:38 ++msgid "Delete" ++msgstr "删除" ++ ++#: git-gui.sh:1887 git-gui.sh:2379 git-gui.sh:2516 lib/console.tcl:69 ++msgid "Select All" ++msgstr "全选" ++ ++#: git-gui.sh:1896 ++msgid "Create..." ++msgstr "新建..." ++ ++#: git-gui.sh:1902 ++msgid "Checkout..." ++msgstr "切换..." ++ ++#: git-gui.sh:1908 ++msgid "Rename..." ++msgstr "改名..." ++ ++#: git-gui.sh:1913 git-gui.sh:2012 ++msgid "Delete..." ++msgstr "删除..." ++ ++#: git-gui.sh:1918 ++msgid "Reset..." ++msgstr "重置所有修动..." ++ ++#: git-gui.sh:1930 git-gui.sh:2313 ++msgid "New Commit" ++msgstr "新提交" ++ ++#: git-gui.sh:1938 git-gui.sh:2320 ++msgid "Amend Last Commit" ++msgstr "修订上次提交" ++ ++#: git-gui.sh:1947 git-gui.sh:2280 lib/remote_branch_delete.tcl:99 ++msgid "Rescan" ++msgstr "重新扫描" ++ ++#: git-gui.sh:1953 ++#, fuzzy ++msgid "Stage To Commit" ++msgstr "从本次提交移除" ++ ++#: git-gui.sh:1958 ++#, fuzzy ++msgid "Stage Changed Files To Commit" ++msgstr "将被提交的修改" ++ ++#: git-gui.sh:1964 ++msgid "Unstage From Commit" ++msgstr "从本次提交移除" ++ ++#: git-gui.sh:1969 lib/index.tcl:352 ++msgid "Revert Changes" ++msgstr "恢复修改" ++ ++#: git-gui.sh:1976 git-gui.sh:2292 git-gui.sh:2390 ++msgid "Sign Off" ++msgstr "签名" ++ ++#: git-gui.sh:1980 git-gui.sh:2296 ++#, fuzzy ++msgid "Commit@@verb" ++msgstr "提交" ++ ++#: git-gui.sh:1991 ++msgid "Local Merge..." ++msgstr "本地合并..." ++ ++#: git-gui.sh:1996 ++msgid "Abort Merge..." ++msgstr "取消合并..." ++ ++#: git-gui.sh:2008 ++msgid "Push..." ++msgstr "上传..." ++ ++#: git-gui.sh:2019 lib/choose_repository.tcl:41 ++msgid "Apple" ++msgstr "苹果" ++ ++#: git-gui.sh:2022 git-gui.sh:2044 lib/about.tcl:13 ++#: lib/choose_repository.tcl:44 lib/choose_repository.tcl:50 ++#, tcl-format ++msgid "About %s" ++msgstr "关于%s" ++ ++#: git-gui.sh:2026 ++msgid "Preferences..." ++msgstr "" ++ ++#: git-gui.sh:2034 git-gui.sh:2558 ++msgid "Options..." ++msgstr "选项..." ++ ++#: git-gui.sh:2040 lib/choose_repository.tcl:47 ++msgid "Help" ++msgstr "帮助" ++ ++#: git-gui.sh:2081 ++msgid "Online Documentation" ++msgstr "在线文档" ++ ++#: git-gui.sh:2165 ++#, tcl-format ++msgid "fatal: cannot stat path %s: No such file or directory" ++msgstr "" ++ ++#: git-gui.sh:2198 ++msgid "Current Branch:" ++msgstr "当前分支:" ++ ++#: git-gui.sh:2219 ++#, fuzzy ++msgid "Staged Changes (Will Commit)" ++msgstr "将被提交的修改" ++ ++#: git-gui.sh:2239 ++msgid "Unstaged Changes" ++msgstr "" ++ ++#: git-gui.sh:2286 ++msgid "Stage Changed" ++msgstr "" ++ ++#: git-gui.sh:2302 lib/transport.tcl:93 lib/transport.tcl:182 ++msgid "Push" ++msgstr "上传" ++ ++#: git-gui.sh:2332 ++msgid "Initial Commit Message:" ++msgstr "初始提交描述:" ++ ++#: git-gui.sh:2333 ++msgid "Amended Commit Message:" ++msgstr "修订提交描述:" ++ ++#: git-gui.sh:2334 ++msgid "Amended Initial Commit Message:" ++msgstr "修订初始提交描述:" ++ ++#: git-gui.sh:2335 ++msgid "Amended Merge Commit Message:" ++msgstr "修订合并提交描述:" ++ ++#: git-gui.sh:2336 ++msgid "Merge Commit Message:" ++msgstr "合并提交描述:" ++ ++#: git-gui.sh:2337 ++msgid "Commit Message:" ++msgstr "提交描述:" ++ ++#: git-gui.sh:2382 git-gui.sh:2520 lib/console.tcl:71 ++msgid "Copy All" ++msgstr "全部复制" ++ ++#: git-gui.sh:2406 lib/blame.tcl:104 ++msgid "File:" ++msgstr "" ++ ++#: git-gui.sh:2508 ++msgid "Refresh" ++msgstr "刷新" ++ ++#: git-gui.sh:2529 ++msgid "Apply/Reverse Hunk" ++msgstr "应用/撤消此修改块" ++ ++#: git-gui.sh:2535 ++msgid "Decrease Font Size" ++msgstr "缩小字体" ++ ++#: git-gui.sh:2539 ++msgid "Increase Font Size" ++msgstr "放大字体" ++ ++#: git-gui.sh:2544 ++msgid "Show Less Context" ++msgstr "显示更多diff上下文" ++ ++#: git-gui.sh:2551 ++msgid "Show More Context" ++msgstr "显示更少diff上下文" ++ ++#: git-gui.sh:2565 ++#, fuzzy ++msgid "Unstage Hunk From Commit" ++msgstr "从本次提交移除" ++ ++#: git-gui.sh:2567 ++#, fuzzy ++msgid "Stage Hunk For Commit" ++msgstr "从本次提交移除" ++ ++#: git-gui.sh:2586 ++msgid "Initializing..." ++msgstr "" ++ ++#: git-gui.sh:2677 ++#, 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 "" ++ ++#: git-gui.sh:2707 ++msgid "" ++"\n" ++"This is due to a known issue with the\n" ++"Tcl binary distributed by Cygwin." ++msgstr "" ++ ++#: git-gui.sh:2712 ++#, 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 "" ++ ++#: lib/about.tcl:25 ++msgid "git-gui - a graphical user interface for Git." ++msgstr "" ++ ++#: lib/blame.tcl:77 ++msgid "File Viewer" ++msgstr "" ++ ++#: lib/blame.tcl:81 ++#, fuzzy ++msgid "Commit:" ++msgstr "提交" ++ ++#: lib/blame.tcl:249 ++#, fuzzy ++msgid "Copy Commit" ++msgstr "提交" ++ ++#: lib/blame.tcl:369 ++#, tcl-format ++msgid "Reading %s..." ++msgstr "" ++ ++#: lib/blame.tcl:473 ++msgid "Loading copy/move tracking annotations..." ++msgstr "" ++ ++#: lib/blame.tcl:493 ++msgid "lines annotated" ++msgstr "" ++ ++#: lib/blame.tcl:674 ++msgid "Loading original location annotations..." ++msgstr "" ++ ++#: lib/blame.tcl:677 ++msgid "Annotation complete." ++msgstr "" ++ ++#: lib/blame.tcl:731 ++msgid "Loading annotation..." ++msgstr "" ++ ++#: lib/blame.tcl:787 ++msgid "Author:" ++msgstr "" ++ ++#: lib/blame.tcl:791 ++#, fuzzy ++msgid "Committer:" ++msgstr "提交" ++ ++#: lib/blame.tcl:796 ++msgid "Original File:" ++msgstr "" ++ ++#: lib/blame.tcl:910 ++msgid "Originally By:" ++msgstr "" ++ ++#: lib/blame.tcl:916 ++msgid "In File:" ++msgstr "" ++ ++#: lib/blame.tcl:921 ++msgid "Copied Or Moved Here By:" ++msgstr "" ++ ++#: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19 ++#, fuzzy ++msgid "Checkout Branch" ++msgstr "当前分支:" ++ ++#: lib/branch_checkout.tcl:23 ++#, fuzzy ++msgid "Checkout" ++msgstr "切换..." ++ ++#: lib/branch_checkout.tcl:27 lib/branch_create.tcl:35 ++#: lib/branch_delete.tcl:32 lib/branch_rename.tcl:30 lib/browser.tcl:281 ++#: lib/checkout_op.tcl:522 lib/choose_font.tcl:43 lib/merge.tcl:172 ++#: lib/option.tcl:90 lib/remote_branch_delete.tcl:42 lib/transport.tcl:97 ++msgid "Cancel" ++msgstr "" ++ ++#: lib/branch_checkout.tcl:32 lib/browser.tcl:286 ++msgid "Revision" ++msgstr "" ++ ++#: lib/branch_checkout.tcl:36 lib/branch_create.tcl:69 lib/option.tcl:202 ++#, fuzzy ++msgid "Options" ++msgstr "选项..." ++ ++#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92 ++msgid "Fetch Tracking Branch" ++msgstr "" ++ ++#: lib/branch_checkout.tcl:44 ++msgid "Detach From Local Branch" ++msgstr "" ++ ++#: lib/branch_create.tcl:22 ++#, fuzzy ++msgid "Create Branch" ++msgstr "当前分支:" ++ ++#: lib/branch_create.tcl:27 ++#, fuzzy ++msgid "Create New Branch" ++msgstr "当前分支:" ++ ++#: lib/branch_create.tcl:31 lib/choose_repository.tcl:199 ++#, fuzzy ++msgid "Create" ++msgstr "新建..." ++ ++#: lib/branch_create.tcl:40 ++#, fuzzy ++msgid "Branch Name" ++msgstr "分支" ++ ++#: lib/branch_create.tcl:43 ++msgid "Name:" ++msgstr "" ++ ++#: lib/branch_create.tcl:58 ++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:85 lib/checkout_op.tcl:514 ++#, fuzzy ++msgid "Reset" ++msgstr "重置所有修动..." ++ ++#: lib/branch_create.tcl:97 ++msgid "Checkout After Creation" ++msgstr "" ++ ++#: lib/branch_create.tcl:131 ++msgid "Please select a tracking branch." ++msgstr "" ++ ++#: lib/branch_create.tcl:140 ++#, tcl-format ++msgid "Tracking branch %s is not a branch in the remote repository." ++msgstr "" ++ ++#: lib/branch_create.tcl:153 lib/branch_rename.tcl:86 ++msgid "Please supply a branch name." ++msgstr "" ++ ++#: lib/branch_create.tcl:164 lib/branch_rename.tcl:106 ++#, tcl-format ++msgid "'%s' is not an acceptable branch name." ++msgstr "" ++ ++#: lib/branch_delete.tcl:15 ++#, fuzzy ++msgid "Delete Branch" ++msgstr "当前分支:" ++ ++#: lib/branch_delete.tcl:20 ++msgid "Delete Local Branch" ++msgstr "" ++ ++#: lib/branch_delete.tcl:37 ++#, fuzzy ++msgid "Local Branches" ++msgstr "分支" ++ ++#: lib/branch_delete.tcl:52 ++msgid "Delete Only If Merged Into" ++msgstr "" ++ ++#: lib/branch_delete.tcl:54 ++msgid "Always (Do not perform merge test.)" ++msgstr "" ++ ++#: lib/branch_delete.tcl:103 ++#, tcl-format ++msgid "The following branches are not completely merged into %s:" ++msgstr "" ++ ++#: lib/branch_delete.tcl:115 ++msgid "" ++"Recovering deleted branches is difficult. \n" ++"\n" ++" Delete the selected branches?" ++msgstr "" ++ ++#: lib/branch_delete.tcl:141 ++#, tcl-format ++msgid "" ++"Failed to delete branches:\n" ++"%s" ++msgstr "" ++ ++#: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22 ++#, fuzzy ++msgid "Rename Branch" ++msgstr "当前分支:" ++ ++#: lib/branch_rename.tcl:26 ++#, fuzzy ++msgid "Rename" ++msgstr "改名..." ++ ++#: lib/branch_rename.tcl:36 ++#, fuzzy ++msgid "Branch:" ++msgstr "分支" ++ ++#: lib/branch_rename.tcl:39 ++msgid "New Name:" ++msgstr "" ++ ++#: lib/branch_rename.tcl:75 ++msgid "Please select a branch to rename." ++msgstr "" ++ ++#: lib/branch_rename.tcl:96 lib/checkout_op.tcl:179 ++#, tcl-format ++msgid "Branch '%s' already exists." ++msgstr "" ++ ++#: lib/branch_rename.tcl:117 ++#, tcl-format ++msgid "Failed to rename '%s'." ++msgstr "" ++ ++#: lib/browser.tcl:17 ++msgid "Starting..." ++msgstr "" ++ ++#: lib/browser.tcl:26 ++msgid "File Browser" ++msgstr "" ++ ++#: lib/browser.tcl:125 lib/browser.tcl:142 ++#, tcl-format ++msgid "Loading %s..." ++msgstr "" ++ ++#: lib/browser.tcl:186 ++msgid "[Up To Parent]" ++msgstr "" ++ ++#: lib/browser.tcl:266 lib/browser.tcl:272 ++#, fuzzy ++msgid "Browse Branch Files" ++msgstr "浏览当前分支文件" ++ ++#: lib/browser.tcl:277 lib/choose_repository.tcl:215 ++#: lib/choose_repository.tcl:305 lib/choose_repository.tcl:315 ++#: lib/choose_repository.tcl:811 ++msgid "Browse" ++msgstr "" ++ ++#: lib/checkout_op.tcl:79 ++#, tcl-format ++msgid "Fetching %s from %s" ++msgstr "" ++ ++#: lib/checkout_op.tcl:127 ++#, tcl-format ++msgid "fatal: Cannot resolve %s" ++msgstr "" ++ ++#: lib/checkout_op.tcl:140 lib/console.tcl:79 lib/database.tcl:31 ++msgid "Close" ++msgstr "" ++ ++#: lib/checkout_op.tcl:169 ++#, tcl-format ++msgid "Branch '%s' does not exist." ++msgstr "" ++ ++#: lib/checkout_op.tcl:206 ++#, tcl-format ++msgid "" ++"Branch '%s' already exists.\n" ++"\n" ++"It cannot fast-forward to %s.\n" ++"A merge is required." ++msgstr "" ++ ++#: lib/checkout_op.tcl:220 ++#, tcl-format ++msgid "Merge strategy '%s' not supported." ++msgstr "" ++ ++#: lib/checkout_op.tcl:239 ++#, tcl-format ++msgid "Failed to update '%s'." ++msgstr "" ++ ++#: lib/checkout_op.tcl:251 ++msgid "Staging area (index) is already locked." ++msgstr "" ++ ++#: lib/checkout_op.tcl:266 ++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 "" ++ ++#: lib/checkout_op.tcl:322 ++#, tcl-format ++msgid "Updating working directory to '%s'..." ++msgstr "" ++ ++#: lib/checkout_op.tcl:353 ++#, tcl-format ++msgid "Aborted checkout of '%s' (file level merging is required)." ++msgstr "" ++ ++#: lib/checkout_op.tcl:354 ++msgid "File level merge required." ++msgstr "" ++ ++#: lib/checkout_op.tcl:358 ++#, tcl-format ++msgid "Staying on branch '%s'." ++msgstr "" ++ ++#: lib/checkout_op.tcl:429 ++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 "" ++ ++#: lib/checkout_op.tcl:446 ++#, fuzzy, tcl-format ++msgid "Checked out '%s'." ++msgstr "切换..." ++ ++#: lib/checkout_op.tcl:478 ++#, tcl-format ++msgid "Resetting '%s' to '%s' will lose the following commits:" ++msgstr "" ++ ++#: lib/checkout_op.tcl:500 ++msgid "Recovering lost commits may not be easy." ++msgstr "" ++ ++#: lib/checkout_op.tcl:505 ++#, tcl-format ++msgid "Reset '%s'?" ++msgstr "" ++ ++#: lib/checkout_op.tcl:510 lib/merge.tcl:164 ++msgid "Visualize" ++msgstr "" ++ ++#: lib/checkout_op.tcl:578 ++#, 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 "" ++ ++#: lib/choose_font.tcl:39 ++#, fuzzy ++msgid "Select" ++msgstr "全选" ++ ++#: lib/choose_font.tcl:53 ++msgid "Font Family" ++msgstr "" ++ ++#: lib/choose_font.tcl:73 ++#, fuzzy ++msgid "Font Size" ++msgstr "缩小字体" ++ ++#: lib/choose_font.tcl:90 ++msgid "Font Example" ++msgstr "" ++ ++#: lib/choose_font.tcl:101 ++msgid "" ++"This is example text.\n" ++"If you like this text, it can be your font." ++msgstr "" ++ ++#: lib/choose_repository.tcl:25 ++msgid "Git Gui" ++msgstr "" ++ ++#: lib/choose_repository.tcl:69 lib/choose_repository.tcl:204 ++#, fuzzy ++msgid "Create New Repository" ++msgstr "版本树" ++ ++#: lib/choose_repository.tcl:74 lib/choose_repository.tcl:291 ++#, fuzzy ++msgid "Clone Existing Repository" ++msgstr "版本树" ++ ++#: lib/choose_repository.tcl:79 lib/choose_repository.tcl:800 ++#, fuzzy ++msgid "Open Existing Repository" ++msgstr "版本树" ++ ++#: lib/choose_repository.tcl:91 ++msgid "Next >" ++msgstr "" ++ ++#: lib/choose_repository.tcl:152 ++#, tcl-format ++msgid "Location %s already exists." ++msgstr "" ++ ++#: lib/choose_repository.tcl:158 lib/choose_repository.tcl:165 ++#: lib/choose_repository.tcl:172 ++#, tcl-format ++msgid "Failed to create repository %s:" ++msgstr "" ++ ++#: lib/choose_repository.tcl:209 lib/choose_repository.tcl:309 ++msgid "Directory:" ++msgstr "" ++ ++#: lib/choose_repository.tcl:238 lib/choose_repository.tcl:363 ++#: lib/choose_repository.tcl:834 ++#, fuzzy ++msgid "Git Repository" ++msgstr "版本树" ++ ++#: lib/choose_repository.tcl:253 lib/choose_repository.tcl:260 ++#, tcl-format ++msgid "Directory %s already exists." ++msgstr "" ++ ++#: lib/choose_repository.tcl:265 ++#, tcl-format ++msgid "File %s already exists." ++msgstr "" ++ ++#: lib/choose_repository.tcl:286 ++msgid "Clone" ++msgstr "" ++ ++#: lib/choose_repository.tcl:299 ++msgid "URL:" ++msgstr "" ++ ++#: lib/choose_repository.tcl:319 ++msgid "Clone Type:" ++msgstr "" ++ ++#: lib/choose_repository.tcl:325 ++msgid "Standard (Fast, Semi-Redundant, Hardlinks)" ++msgstr "" ++ ++#: lib/choose_repository.tcl:331 ++msgid "Full Copy (Slower, Redundant Backup)" ++msgstr "" ++ ++#: lib/choose_repository.tcl:337 ++msgid "Shared (Fastest, Not Recommended, No Backup)" ++msgstr "" ++ ++#: lib/choose_repository.tcl:369 lib/choose_repository.tcl:418 ++#: lib/choose_repository.tcl:560 lib/choose_repository.tcl:630 ++#: lib/choose_repository.tcl:840 lib/choose_repository.tcl:848 ++#, tcl-format ++msgid "Not a Git repository: %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:405 ++msgid "Standard only available for local repository." ++msgstr "" ++ ++#: lib/choose_repository.tcl:409 ++msgid "Shared only available for local repository." ++msgstr "" ++ ++#: lib/choose_repository.tcl:439 ++msgid "Failed to configure origin" ++msgstr "" ++ ++#: lib/choose_repository.tcl:451 ++msgid "Counting objects" ++msgstr "" ++ ++#: lib/choose_repository.tcl:452 ++msgid "buckets" ++msgstr "" ++ ++#: lib/choose_repository.tcl:476 ++#, tcl-format ++msgid "Unable to copy objects/info/alternates: %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:512 ++#, tcl-format ++msgid "Nothing to clone from %s." ++msgstr "" ++ ++#: lib/choose_repository.tcl:514 lib/choose_repository.tcl:728 ++#: lib/choose_repository.tcl:740 ++msgid "The 'master' branch has not been initialized." ++msgstr "" ++ ++#: lib/choose_repository.tcl:527 ++msgid "Hardlinks are unavailable. Falling back to copying." ++msgstr "" ++ ++#: lib/choose_repository.tcl:539 ++#, tcl-format ++msgid "Cloning from %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:570 ++#, fuzzy ++msgid "Copying objects" ++msgstr "压缩数据库" ++ ++#: lib/choose_repository.tcl:571 ++msgid "KiB" ++msgstr "" ++ ++#: lib/choose_repository.tcl:595 ++#, tcl-format ++msgid "Unable to copy object: %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:605 ++msgid "Linking objects" ++msgstr "" ++ ++#: lib/choose_repository.tcl:606 ++msgid "objects" ++msgstr "" ++ ++#: lib/choose_repository.tcl:614 ++#, tcl-format ++msgid "Unable to hardlink object: %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:669 ++msgid "Cannot fetch branches and objects. See console output for details." ++msgstr "" ++ ++#: lib/choose_repository.tcl:680 ++msgid "Cannot fetch tags. See console output for details." ++msgstr "" ++ ++#: lib/choose_repository.tcl:704 ++msgid "Cannot determine HEAD. See console output for details." ++msgstr "" ++ ++#: lib/choose_repository.tcl:713 ++#, tcl-format ++msgid "Unable to cleanup %s" ++msgstr "" ++ ++#: lib/choose_repository.tcl:719 ++msgid "Clone failed." ++msgstr "" ++ ++#: lib/choose_repository.tcl:726 ++msgid "No default branch obtained." ++msgstr "" ++ ++#: lib/choose_repository.tcl:737 ++#, tcl-format ++msgid "Cannot resolve %s as a commit." ++msgstr "" ++ ++#: lib/choose_repository.tcl:749 ++msgid "Creating working directory" ++msgstr "" ++ ++#: lib/choose_repository.tcl:750 lib/index.tcl:15 lib/index.tcl:80 ++#: lib/index.tcl:149 ++msgid "files" ++msgstr "" ++ ++#: lib/choose_repository.tcl:779 ++msgid "Initial file checkout failed." ++msgstr "" ++ ++#: lib/choose_repository.tcl:795 ++msgid "Open" ++msgstr "" ++ ++#: lib/choose_repository.tcl:805 ++#, fuzzy ++msgid "Repository:" ++msgstr "版本树" ++ ++#: lib/choose_repository.tcl:854 ++#, tcl-format ++msgid "Failed to open repository %s:" ++msgstr "" ++ ++#: lib/choose_rev.tcl:53 ++msgid "This Detached Checkout" ++msgstr "" ++ ++#: lib/choose_rev.tcl:60 ++msgid "Revision Expression:" ++msgstr "" ++ ++#: lib/choose_rev.tcl:74 ++#, fuzzy ++msgid "Local Branch" ++msgstr "分支" ++ ++#: lib/choose_rev.tcl:79 ++#, fuzzy ++msgid "Tracking Branch" ++msgstr "当前分支:" ++ ++#: lib/choose_rev.tcl:84 lib/choose_rev.tcl:537 ++msgid "Tag" ++msgstr "" ++ ++#: lib/choose_rev.tcl:317 ++#, tcl-format ++msgid "Invalid revision: %s" ++msgstr "" ++ ++#: lib/choose_rev.tcl:338 ++msgid "No revision selected." ++msgstr "" ++ ++#: lib/choose_rev.tcl:346 ++msgid "Revision expression is empty." ++msgstr "" ++ ++#: lib/choose_rev.tcl:530 ++msgid "Updated" ++msgstr "" ++ ++#: lib/choose_rev.tcl:558 ++msgid "URL" ++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 "" ++ ++#: 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 "" ++ ++#: lib/commit.tcl:49 ++msgid "Error loading commit data for amend:" ++msgstr "" ++ ++#: lib/commit.tcl:76 ++msgid "Unable to obtain your identity:" ++msgstr "" ++ ++#: lib/commit.tcl:81 ++msgid "Invalid GIT_COMMITTER_IDENT:" ++msgstr "" ++ ++#: lib/commit.tcl:133 ++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 "" ++ ++#: lib/commit.tcl:154 ++#, 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 "" ++ ++#: lib/commit.tcl:162 ++#, tcl-format ++msgid "" ++"Unknown file state %s detected.\n" ++"\n" ++"File %s cannot be committed by this program.\n" ++msgstr "" ++ ++#: lib/commit.tcl:170 ++msgid "" ++"No changes to commit.\n" ++"\n" ++"You must stage at least 1 file before you can commit.\n" ++msgstr "" ++ ++#: lib/commit.tcl:183 ++msgid "" ++"Please supply a commit message.\n" ++"\n" ++"A good commit message has the following format:\n" ++"\n" ++"- First line: Describe in one sentance what you did.\n" ++"- Second line: Blank\n" ++"- Remaining lines: Describe why this change is good.\n" ++msgstr "" ++ ++#: lib/commit.tcl:257 ++msgid "write-tree failed:" ++msgstr "" ++ ++#: lib/commit.tcl:275 ++#, tcl-format ++msgid "Commit %s appears to be corrupt" ++msgstr "" ++ ++#: lib/commit.tcl:279 ++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 "" ++ ++#: lib/commit.tcl:286 ++msgid "No changes to commit." ++msgstr "" ++ ++#: lib/commit.tcl:303 ++#, tcl-format ++msgid "warning: Tcl does not support encoding '%s'." ++msgstr "" ++ ++#: lib/commit.tcl:317 ++msgid "commit-tree failed:" ++msgstr "" ++ ++#: lib/commit.tcl:339 ++msgid "update-ref failed:" ++msgstr "" ++ ++#: lib/commit.tcl:430 ++#, tcl-format ++msgid "Created commit %s: %s" ++msgstr "" ++ ++#: lib/console.tcl:57 ++msgid "Working... please wait..." ++msgstr "" ++ ++#: lib/console.tcl:183 ++msgid "Success" ++msgstr "" ++ ++#: lib/console.tcl:196 ++msgid "Error: Command Failed" ++msgstr "" ++ ++#: lib/database.tcl:43 ++msgid "Number of loose objects" ++msgstr "" ++ ++#: lib/database.tcl:44 ++msgid "Disk space used by loose objects" ++msgstr "" ++ ++#: lib/database.tcl:45 ++msgid "Number of packed objects" ++msgstr "" ++ ++#: lib/database.tcl:46 ++msgid "Number of packs" ++msgstr "" ++ ++#: lib/database.tcl:47 ++msgid "Disk space used by packed objects" ++msgstr "" ++ ++#: lib/database.tcl:48 ++msgid "Packed objects waiting for pruning" ++msgstr "" ++ ++#: lib/database.tcl:49 ++msgid "Garbage files" ++msgstr "" ++ ++#: lib/database.tcl:72 ++#, fuzzy ++msgid "Compressing the object database" ++msgstr "压缩数据库" ++ ++#: lib/database.tcl:83 ++msgid "Verifying the object database with fsck-objects" ++msgstr "" ++ ++#: lib/database.tcl:108 ++#, 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 when more than %i loose objects exist.\n" ++"\n" ++"Compress the database now?" ++msgstr "" ++ ++#: lib/date.tcl:25 ++#, tcl-format ++msgid "Invalid date from Git: %s" ++msgstr "" ++ ++#: lib/diff.tcl:42 ++#, 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 "" ++ ++#: lib/diff.tcl:81 ++#, tcl-format ++msgid "Loading diff of %s..." ++msgstr "" ++ ++#: lib/diff.tcl:114 lib/diff.tcl:184 ++#, tcl-format ++msgid "Unable to display %s" ++msgstr "" ++ ++#: lib/diff.tcl:115 ++msgid "Error loading file:" ++msgstr "" ++ ++#: lib/diff.tcl:122 ++msgid "Git Repository (subproject)" ++msgstr "" ++ ++#: lib/diff.tcl:134 ++msgid "* Binary file (not showing content)." ++msgstr "" ++ ++#: lib/diff.tcl:185 ++msgid "Error loading diff:" ++msgstr "" ++ ++#: lib/diff.tcl:302 ++msgid "Failed to unstage selected hunk." ++msgstr "" ++ ++#: lib/diff.tcl:309 ++msgid "Failed to stage selected hunk." ++msgstr "" ++ ++#: lib/error.tcl:12 lib/error.tcl:102 ++msgid "error" ++msgstr "" ++ ++#: lib/error.tcl:28 ++msgid "warning" ++msgstr "" ++ ++#: lib/error.tcl:81 ++msgid "You must correct the above errors before committing." ++msgstr "" ++ ++#: lib/index.tcl:241 ++#, fuzzy, tcl-format ++msgid "Unstaging %s from commit" ++msgstr "从本次提交移除" ++ ++#: lib/index.tcl:285 ++#, tcl-format ++msgid "Adding %s" ++msgstr "" ++ ++#: lib/index.tcl:340 ++#, fuzzy, tcl-format ++msgid "Revert changes in file %s?" ++msgstr "恢复修改" ++ ++#: lib/index.tcl:342 ++#, tcl-format ++msgid "Revert changes in these %i files?" ++msgstr "" ++ ++#: lib/index.tcl:348 ++msgid "Any unstaged changes will be permanently lost by the revert." ++msgstr "" ++ ++#: lib/index.tcl:351 ++msgid "Do Nothing" ++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 "" ++ ++#: 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 "" ++ ++#: lib/merge.tcl:44 ++#, 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 "" ++ ++#: lib/merge.tcl:54 ++#, 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 "" ++ ++#: lib/merge.tcl:106 ++#, tcl-format ++msgid "%s of %s" ++msgstr "" ++ ++#: lib/merge.tcl:119 ++#, tcl-format ++msgid "Merging %s and %s" ++msgstr "" ++ ++#: lib/merge.tcl:131 ++msgid "Merge completed successfully." ++msgstr "" ++ ++#: lib/merge.tcl:133 ++msgid "Merge failed. Conflict resolution is required." ++msgstr "" ++ ++#: lib/merge.tcl:158 ++#, tcl-format ++msgid "Merge Into %s" ++msgstr "" ++ ++#: lib/merge.tcl:177 ++msgid "Revision To Merge" ++msgstr "" ++ ++#: lib/merge.tcl:212 ++msgid "" ++"Cannot abort while amending.\n" ++"\n" ++"You must finish amending this commit.\n" ++msgstr "" ++ ++#: 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 "" ++ ++#: 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 "" ++ ++#: lib/merge.tcl:239 ++msgid "Aborting" ++msgstr "" ++ ++#: lib/merge.tcl:266 ++msgid "Abort failed." ++msgstr "" ++ ++#: lib/merge.tcl:268 ++msgid "Abort completed. Ready." ++msgstr "" ++ ++#: lib/option.tcl:82 ++msgid "Restore Defaults" ++msgstr "" ++ ++#: lib/option.tcl:86 ++msgid "Save" ++msgstr "" ++ ++#: lib/option.tcl:96 ++#, fuzzy, tcl-format ++msgid "%s Repository" ++msgstr "版本树" ++ ++#: lib/option.tcl:97 ++msgid "Global (All Repositories)" ++msgstr "" ++ ++#: lib/option.tcl:103 ++msgid "User Name" ++msgstr "" ++ ++#: lib/option.tcl:104 ++msgid "Email Address" ++msgstr "" ++ ++#: lib/option.tcl:106 ++#, fuzzy ++msgid "Summarize Merge Commits" ++msgstr "修订合并提交描述:" ++ ++#: lib/option.tcl:107 ++msgid "Merge Verbosity" ++msgstr "" ++ ++#: lib/option.tcl:108 ++msgid "Show Diffstat After Merge" ++msgstr "" ++ ++#: lib/option.tcl:110 ++msgid "Trust File Modification Timestamps" ++msgstr "" ++ ++#: lib/option.tcl:111 ++msgid "Prune Tracking Branches During Fetch" ++msgstr "" ++ ++#: lib/option.tcl:112 ++msgid "Match Tracking Branches" ++msgstr "" ++ ++#: lib/option.tcl:113 ++msgid "Number of Diff Context Lines" ++msgstr "" ++ ++#: lib/option.tcl:114 ++msgid "New Branch Name Template" ++msgstr "" ++ ++#: lib/option.tcl:176 ++msgid "Change Font" ++msgstr "" ++ ++#: lib/option.tcl:180 ++#, tcl-format ++msgid "Choose %s" ++msgstr "" ++ ++#: lib/option.tcl:186 ++msgid "pt." ++msgstr "" ++ ++#: lib/option.tcl:200 ++msgid "Preferences" ++msgstr "" ++ ++#: lib/option.tcl:235 ++msgid "Failed to completely save options:" ++msgstr "" ++ ++#: lib/remote.tcl:165 ++msgid "Prune from" ++msgstr "" ++ ++#: lib/remote.tcl:170 ++#, fuzzy ++msgid "Fetch from" ++msgstr "导入" ++ ++#: lib/remote.tcl:213 ++#, fuzzy ++msgid "Push to" ++msgstr "上传" ++ ++#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 ++msgid "Delete Remote Branch" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:47 ++#, fuzzy ++msgid "From Repository" ++msgstr "版本树" ++ ++#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:123 ++msgid "Remote:" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:138 ++msgid "Arbitrary URL:" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:84 ++#, fuzzy ++msgid "Branches" ++msgstr "分支" ++ ++#: lib/remote_branch_delete.tcl:109 ++#, fuzzy ++msgid "Delete Only If" ++msgstr "删除" ++ ++#: lib/remote_branch_delete.tcl:111 ++msgid "Merged Into:" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:119 ++msgid "Always (Do not perform merge checks)" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:152 ++msgid "A branch is required for 'Merged Into'." ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:184 ++#, tcl-format ++msgid "" ++"The following branches are not completely merged into %s:\n" ++"\n" ++" - %s" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:189 ++#, 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 "" ++ ++#: lib/remote_branch_delete.tcl:207 ++msgid "Please select one or more branches to delete." ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:216 ++msgid "" ++"Recovering deleted branches is difficult.\n" ++"\n" ++"Delete the selected branches?" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:226 ++#, tcl-format ++msgid "Deleting branches from %s" ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:286 ++msgid "No repository selected." ++msgstr "" ++ ++#: lib/remote_branch_delete.tcl:291 ++#, tcl-format ++msgid "Scanning %s..." ++msgstr "" ++ ++#: lib/shortcut.tcl:26 lib/shortcut.tcl:74 ++msgid "Cannot write script:" ++msgstr "" ++ ++#: lib/shortcut.tcl:149 ++msgid "Cannot write icon:" ++msgstr "" ++ ++#: lib/status_bar.tcl:83 ++#, tcl-format ++msgid "%s ... %*i of %*i %s (%3i%%)" ++msgstr "" ++ ++#: lib/transport.tcl:6 ++#, fuzzy, tcl-format ++msgid "fetch %s" ++msgstr "导入" ++ ++#: lib/transport.tcl:7 ++#, tcl-format ++msgid "Fetching new changes from %s" ++msgstr "" ++ ++#: lib/transport.tcl:18 ++#, tcl-format ++msgid "remote prune %s" ++msgstr "" ++ ++#: lib/transport.tcl:19 ++#, tcl-format ++msgid "Pruning tracking branches deleted from %s" ++msgstr "" ++ ++#: lib/transport.tcl:25 lib/transport.tcl:71 ++#, tcl-format ++msgid "push %s" ++msgstr "" ++ ++#: lib/transport.tcl:26 ++#, tcl-format ++msgid "Pushing changes to %s" ++msgstr "" ++ ++#: lib/transport.tcl:72 ++#, tcl-format ++msgid "Pushing %s %s to %s" ++msgstr "" ++ ++#: lib/transport.tcl:89 ++#, fuzzy ++msgid "Push Branches" ++msgstr "分支" ++ ++#: lib/transport.tcl:103 ++#, fuzzy ++msgid "Source Branches" ++msgstr "当前分支:" ++ ++#: lib/transport.tcl:120 ++#, fuzzy ++msgid "Destination Repository" ++msgstr "版本树" ++ ++#: lib/transport.tcl:158 ++msgid "Transfer Options" ++msgstr "" ++ ++#: lib/transport.tcl:160 ++msgid "Force overwrite existing branch (may discard changes)" ++msgstr "" ++ ++#: lib/transport.tcl:164 ++msgid "Use thin pack (for slow network connections)" ++msgstr "" ++ ++#: lib/transport.tcl:168 ++msgid "Include tags" ++msgstr "" ++ ++#~ msgid "Add To Commit" ++#~ msgstr "添加到本次提交" ++ ++#~ msgid "Add Existing To Commit" ++#~ msgstr "添加默认修改文件" ++ ++#~ msgid "Unstaged Changes (Will Not Be Committed)" ++#~ msgstr "不被提交的修改" ++ ++#~ msgid "Add Existing" ++#~ msgstr "添加默认修改文件" ++ ++#, fuzzy ++#~ msgid "Push to %s..." ++#~ msgstr "上传..." diff --cc git-gui/windows/git-gui.sh index 000000000,000000000..98f32c0a0 new file mode 100644 --- /dev/null +++ b/git-gui/windows/git-gui.sh @@@ -1,0 -1,0 +1,16 @@@ ++#!/bin/sh ++# Tcl ignores the next line -*- tcl -*- \ ++exec wish "$0" -- "$@" ++ ++if { $argc >=2 && [lindex $argv 0] == "--working-dir" } { ++ cd [lindex $argv 1] ++ set argv [lrange $argv 2 end] ++ incr argc -2 ++} ++ ++set gitguidir [file dirname [info script]] ++regsub -all ";" $gitguidir "\\;" gitguidir ++set env(PATH) "$gitguidir;$env(PATH)" ++unset gitguidir ++ ++source [file join [file dirname [info script]] git-gui.tcl]