From 354e114d7461c5f7f6bd4e0fb6d880bdd15a7823 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Sun, 23 Sep 2007 22:29:18 -0400 Subject: [PATCH 01/16] git-gui: Deiconify startup wizard so it raises to the top Signed-off-by: Shawn O. Pearce --- lib/choose_repository.tcl | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl index 1bec8bd0a8..5f2d12fd07 100644 --- a/lib/choose_repository.tcl +++ b/lib/choose_repository.tcl @@ -123,6 +123,7 @@ constructor pick {} { grab $top focus $top " + wm deiconify $top tkwait variable @done if {$top eq {.}} { From 40f86af01b061fbbd1e46d125280073322bf9f33 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Mon, 24 Sep 2007 08:26:07 -0400 Subject: [PATCH 02/16] git-gui: Don't bother showing OS error message about hardlinks If we failed to create our test hardlink for the first object we need to link/copy then the only recourse we have is to make a copy of the objects. Users don't really need to know the OS details about why the hardlink failed as its usually because they are crossing filesystem boundaries. Signed-off-by: Shawn O. Pearce --- lib/choose_repository.tcl | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl index 5f2d12fd07..9074c1ba5c 100644 --- a/lib/choose_repository.tcl +++ b/lib/choose_repository.tcl @@ -496,10 +496,7 @@ method _do_clone2 {} { [file join .git objects $i] \ [file join $objdir $i] } err]} { - info_popup [strcat \ - [mc "Hardlinks are unavailable. Falling back to copying."] \ - "\n" \ - $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]] From 81d4d3dddc5e96aea45a2623c9b1840491348b92 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Mon, 24 Sep 2007 08:40:44 -0400 Subject: [PATCH 03/16] git-gui: Keep the UI responsive while counting objects in clone If we are doing a "standard" clone by way of hardlinking the objects (or copying them if hardlinks are not available) the UI can freeze up for a good few seconds while Tcl scans all of the object directories. This is espeically noticed on a Windows system when you are working off network shares and need to wait for both the NT overheads and the network. We now show a progress bar as we count the objects and build our list of things to copy. This keeps the user amused and also makes sure we run the Tk event loop often enough that the window can still be dragged around the desktop. Signed-off-by: Shawn O. Pearce --- lib/choose_repository.tcl | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl index 9074c1ba5c..4ad1f781f7 100644 --- a/lib/choose_repository.tcl +++ b/lib/choose_repository.tcl @@ -462,20 +462,42 @@ method _do_clone2 {} { switch -exact -- $clone_type { hardlink { + set o_cons [status_bar::new $w_body] + pack $w_body -fill x -padx 10 + + $o_cons start \ + [mc "Counting objects"] \ + [mc "buckets"] + update + 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] } - foreach i [glob -tails -nocomplain \ - -directory [file join $objdir] ??] { + $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 \ @@ -483,13 +505,11 @@ method _do_clone2 {} { "\n" \ [mc "The 'master' branch has not been initialized."] \ ] + destroy $w_body set done 1 return } - set o_cons [status_bar::new $w_body] - pack $w_body -fill x -padx 10 - set i [lindex $tolink 0] if {[catch { file link -hard \ From 85f77eadcc1d6e5a62079ab86988ffe95e9421d5 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Mon, 24 Sep 2007 08:50:58 -0400 Subject: [PATCH 04/16] git-gui: Copy objects/info/alternates during standard clone If the source repository is using an objects/info/alternates file we need to copy the file to our new repository so that it can access any objects that won't be copied/hardlinked as they are stored in the alternate location. We explicitly resolve all paths in the objects/info/alternates as relative to the source repository but then convert them into an absolute path for the new clone. This allows the new clone to access the exact same locaton as the source repository, even if relative paths had been used before. Under Cygwin we assume that Git is Cygwin based and that the paths in objects/info/alternates must be valid Cygwin UNIX paths, so we need to run `cygpath --unix` on each line in the alternate list. Signed-off-by: Shawn O. Pearce --- lib/choose_repository.tcl | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl index 4ad1f781f7..f7b8c93095 100644 --- a/lib/choose_repository.tcl +++ b/lib/choose_repository.tcl @@ -470,6 +470,32 @@ method _do_clone2 {} { [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 \ From cd38c86fd8e8fbbc1d83b80f7d96cf19d8266196 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Mon, 24 Sep 2007 23:24:12 -0400 Subject: [PATCH 05/16] git-gui: add a simple msgfmt replacement The program "msgfmt" was our only dependency on gettext. Since it is more than just a hassle to compile gettext on MinGW, here is a (very simple) drop-in replacement, which Works For Us. [sp: Changed Makefile to enable/disable po2msg.sh by the new NO_MSGFMT variable.] Signed-off-by: Johannes Schindelin Signed-off-by: Shawn O. Pearce --- Makefile | 11 +++++- po/po2msg.sh | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 po/po2msg.sh diff --git a/Makefile b/Makefile index 6236dd6ad3..0ab33517a9 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,10 @@ 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 @@ -129,7 +133,12 @@ $(GITGUI_BUILT_INS): git-gui $(QUIET_BUILT_IN)rm -f $@ && ln git-gui $@ XGETTEXT ?= xgettext -MSGFMT ?= msgfmt +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 diff --git a/po/po2msg.sh b/po/po2msg.sh new file mode 100644 index 0000000000..da0765dd80 --- /dev/null +++ b/po/po2msg.sh @@ -0,0 +1,103 @@ +#!/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] + +# parse options +for {set i 1} {$i < $argc} {incr i} { + set arg [lindex $argv $i] + if {$arg == "--statistics" || $arg == "--tcl"} { + 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 + + if {![info exists msgid] || $mode == ""} { + return + } + set mode "" + + if {$msgid == ""} { + set prefix "set ::msgcat::header" + } else { + set prefix "::msgcat::mcset $lang \"[u2a $msgid]\"" + } + + puts $out "$prefix \"[u2a $msgstr]\"" +} + +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]} { + 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 +} + From 6f2d73ec0cb6d5937bb4a62a222f942e4f886d6e Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Wed, 26 Sep 2007 14:05:54 -0400 Subject: [PATCH 06/16] git-gui: Don't delete console window namespaces too early If the console finishes displaying its output and is "done" but needs to draw a scrollbar to show the final output messages it is possible for Tk to delete the window namespace before it does the text widget updates, which means we are unable to add the horizontal or vertical scrollbar to the window when the text widget decides it cannot draw all glyphs on screen. We need to delay deleting the window namespace until we know the window is not going to ever be used again. This occurs if we are done receiving output, the command is successful and the window is closed, or if the window is open and the user chooses to close the window after the command has completed. Signed-off-by: Shawn O. Pearce --- lib/console.tcl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/console.tcl b/lib/console.tcl index cde9a09268..c0e6fb3cc2 100644 --- a/lib/console.tcl +++ b/lib/console.tcl @@ -179,23 +179,26 @@ method insert {txt} { method done {ok} { if {$ok} { if {[winfo exists $w.m.s]} { + 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 } + 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} { From 59213f60b7a3085732f76736e1826869994abf1a Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Wed, 26 Sep 2007 14:16:45 -0400 Subject: [PATCH 07/16] git-gui: Don't delete scrollbars in console windows If we have added a scrollbar to the console window because one direction has too much text to fit in the available screen space we should just keep the scrollbars. Its annoying to watch our horizontal scrollbar bounce in and out of the window as additional text is inserted into the widget and the need for the scrollbar comes and goes. Signed-off-by: Shawn O. Pearce --- lib/console.tcl | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/lib/console.tcl b/lib/console.tcl index c0e6fb3cc2..2075374683 100644 --- a/lib/console.tcl +++ b/lib/console.tcl @@ -202,14 +202,8 @@ method done {ok} { } method _sb_set {sb orient first last} { - if {$first == 0 && $last == 1} { - if {[winfo exists $sb]} { - destroy $sb - } - return - } - 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 @@ -218,7 +212,7 @@ method _sb_set {sb orient first last} { pack $sb -fill y -side right -before $w_t } } - catch {$sb set $first $last} + $sb set $first $last } } From a7cb8f583ff6ef01c23b1694f30e9004271264f9 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Wed, 26 Sep 2007 14:59:09 -0400 Subject: [PATCH 08/16] git-gui: Switch the git-gui logo to Henrik Nyh's logo Henrik came up with this alternative logo for gitweb and posted it on his blog: http://henrik.nyh.se/2007/06/alternative-git-logo-and-favicon The msysGit port uses his logo within some of their components, and frankly it looks better here in git-gui for our repository setup wizard screen. The logo fits quite nicely along the left edge of our window, leaving significantly more vertical space for things like the git-fetch console output. Because the logo changes the layout charateristics of the setup window I also needed to adjust some of the padding for our widgets and stop using a fixed width window size. We now let Tk compute the correct size of the main window whenever the layout changes, and drop the window into roughly the upper left 1/3 of the desktop so its not quite centered but is likely to be far enough away from any sort of task bars/menu bars/docks that the user may have along any edge of the screen. Signed-off-by: Shawn O. Pearce --- lib/choose_repository.tcl | 63 +++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl index f7b8c93095..8d3c81e7c0 100644 --- a/lib/choose_repository.tcl +++ b/lib/choose_repository.tcl @@ -3,19 +3,36 @@ class choose_repository { +# Henrik Nyh's alternative Git logo, from his blog post +# http://henrik.nyh.se/2007/06/alternative-git-logo-and-favicon +# image create photo ::choose_repository::git_logo -data { -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 +JwQAOw== } field top @@ -66,7 +83,6 @@ constructor pick {} { -command do_about } - _center $top 500 350 wm protocol $top WM_DELETE_WINDOW exit bind $top <$M1B-q> exit bind $top <$M1B-Q> exit @@ -81,7 +97,7 @@ constructor pick {} { -relief sunken \ -background white \ -image ::choose_repository::git_logo - pack $w.git_logo -side top -fill x -padx 20 -pady 20 + pack $w.git_logo -side left -fill y -padx 10 -pady 10 set w_body $w.body frame $w_body @@ -103,7 +119,7 @@ constructor pick {} { pack $w_body.new -anchor w -fill x pack $w_body.clone -anchor w -fill x pack $w_body.open -anchor w -fill x - pack $w_body -fill x -padx 10 + pack $w_body -fill x -padx 10 -pady 10 frame $w.buttons set w_next $w.buttons.next @@ -120,15 +136,16 @@ constructor pick {} { 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] - _center $top 500 600 } } @@ -140,10 +157,12 @@ proc _home {} { return $h } -proc _center {top nx ny} { - set rx [expr {([winfo screenwidth $top] - $nx) / 2}] - set ry [expr {([winfo screenheight $top] - $ny) / 2}] - wm geometry $top [format {%dx%d+%d+%d} $nx $ny $rx $ry] +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 {} { @@ -463,7 +482,7 @@ method _do_clone2 {} { switch -exact -- $clone_type { hardlink { set o_cons [status_bar::new $w_body] - pack $w_body -fill x -padx 10 + pack $w_body -fill x -padx 10 -pady 10 $o_cons start \ [mc "Counting objects"] \ @@ -762,7 +781,7 @@ method _do_clone_checkout {HEAD} { } set o_cons [status_bar::new $w_body] - pack $w_body -fill x -padx 10 + pack $w_body -fill x -padx 10 -pady 10 $o_cons start \ [mc "Creating working directory"] \ [mc "files"] From 96225dbe966fdbf00ef1a3a1dd801534953c9919 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Wed, 26 Sep 2007 15:31:42 -0400 Subject: [PATCH 09/16] git-gui: Make the status bar easier to read in the setup wizard The setup wizard looks better if we layout the progress bar as two lines: the first line holds the message text and our text formatting of the progress while the second line holds the bar itself. Both extend the full width of the window and we try to pad out the message text so the window doesn't expand when the completed progress number jumps to the next order of magnitude. This change required updating the progress meter format string to allow the application to supply the precision. So we also are updating all of the translations at once to use the newer formatting string. Signed-off-by: Shawn O. Pearce --- lib/choose_repository.tcl | 4 ++-- lib/status_bar.tcl | 38 +++++++++++++++++++++++++++++++++----- po/de.po | 4 ++-- po/git-gui.pot | 2 +- po/hu.po | 4 ++-- po/it.po | 4 ++-- po/ja.po | 4 ++-- po/ru.po | 4 ++-- po/zh_cn.po | 2 +- 9 files changed, 47 insertions(+), 19 deletions(-) diff --git a/lib/choose_repository.tcl b/lib/choose_repository.tcl index 8d3c81e7c0..16bf67c34f 100644 --- a/lib/choose_repository.tcl +++ b/lib/choose_repository.tcl @@ -481,7 +481,7 @@ method _do_clone2 {} { switch -exact -- $clone_type { hardlink { - set o_cons [status_bar::new $w_body] + set o_cons [status_bar::two_line $w_body] pack $w_body -fill x -padx 10 -pady 10 $o_cons start \ @@ -780,7 +780,7 @@ method _do_clone_checkout {HEAD} { return } - set o_cons [status_bar::new $w_body] + 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"] \ diff --git a/lib/status_bar.tcl b/lib/status_bar.tcl index 769ef81c4b..5c5bf7c731 100644 --- a/lib/status_bar.tcl +++ b/lib/status_bar.tcl @@ -6,6 +6,7 @@ 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 @@ -24,6 +25,29 @@ constructor new {path} { -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 @@ -34,13 +58,12 @@ method start {msg uds} { $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 @@ -53,11 +76,16 @@ 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 [mc "%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} { diff --git a/po/de.po b/po/de.po index 7d57dd15f9..94b7463ca3 100644 --- a/po/de.po +++ b/po/de.po @@ -1350,8 +1350,8 @@ msgstr "Fehler beim Erstellen des Icons:" #: lib/status_bar.tcl:58 #, tcl-format -msgid "%s ... %i of %i %s (%2i%%)" -msgstr "%s ... %i von %i %s (%2i%%)" +msgid "%s ... %*i of %*i %s (%3i%%)" +msgstr "%s ... %*i von %*i %s (%3i%%)" #: lib/transport.tcl:7 #, tcl-format diff --git a/po/git-gui.pot b/po/git-gui.pot index 991efea5f3..b352302572 100644 --- a/po/git-gui.pot +++ b/po/git-gui.pot @@ -1216,7 +1216,7 @@ msgstr "" #: lib/status_bar.tcl:58 #, tcl-format -msgid "%s ... %i of %i %s (%2i%%)" +msgid "%s ... %*i of %*i %s (%3i%%)" msgstr "" #: lib/transport.tcl:7 diff --git a/po/hu.po b/po/hu.po index faac58f810..1e189b6086 100644 --- a/po/hu.po +++ b/po/hu.po @@ -1344,8 +1344,8 @@ msgstr "Nem sikerült írni az ikont:" #: lib/status_bar.tcl:58 #, tcl-format -msgid "%s ... %i of %i %s (%2i%%)" -msgstr "%s ... %i / %i %s (%2i%%)" +msgid "%s ... %*i of %*i %s (%3i%%)" +msgstr "%s ... %*i / %*i %s (%3i%%)" #: lib/transport.tcl:7 #, tcl-format diff --git a/po/it.po b/po/it.po index 17a5c21882..ad5cd9e5da 100644 --- a/po/it.po +++ b/po/it.po @@ -1344,8 +1344,8 @@ msgstr "Impossibile scrivere icona:" #: lib/status_bar.tcl:58 #, tcl-format -msgid "%s ... %i of %i %s (%2i%%)" -msgstr "%s ... %i di %i %s (%2i%%)" +msgid "%s ... %*i of %*i %s (%3i%%)" +msgstr "%s ... %*i di %*i %s (%3i%%)" #: lib/transport.tcl:7 #, tcl-format diff --git a/po/ja.po b/po/ja.po index 17139080ec..cdbc981ca5 100644 --- a/po/ja.po +++ b/po/ja.po @@ -1333,8 +1333,8 @@ msgstr "アイコンが書けません:" #: lib/status_bar.tcl:58 #, tcl-format -msgid "%s ... %i of %i %s (%2i%%)" -msgstr "%1$s ... %3$i %4$s 中の %$2i (%5$2i%%)" +msgid "%s ... %*i of %*i %s (%3i%%)" +msgstr "%1$s ... %3$*i %4$s 中の %$2*i (%5$3i%%)" #: lib/transport.tcl:7 #, tcl-format diff --git a/po/ru.po b/po/ru.po index c44d30af0a..20080338c8 100644 --- a/po/ru.po +++ b/po/ru.po @@ -1434,8 +1434,8 @@ msgstr "Невозможно записать значок:" #: lib/status_bar.tcl:58 #, tcl-format -msgid "%s ... %i of %i %s (%2i%%)" -msgstr "%s ... %i из %i %s (%2i%%)" +msgid "%s ... %*i of %*i %s (%3i%%)" +msgstr "%s ... %*i из %*i %s (%3i%%)" #: lib/transport.tcl:7 #, tcl-format diff --git a/po/zh_cn.po b/po/zh_cn.po index 45eb5b5f98..d1ed94f8a9 100644 --- a/po/zh_cn.po +++ b/po/zh_cn.po @@ -1238,7 +1238,7 @@ msgstr "" #: lib/status_bar.tcl:58 #, tcl-format -msgid "%s ... %i of %i %s (%2i%%)" +msgid "%s ... %*i of %*i %s (%3i%%)" msgstr "" #: lib/transport.tcl:7 From cbf13d9e0c4fc7ac4f2f52f88cff94f1fc311971 Mon Sep 17 00:00:00 2001 From: Michele Ballabio Date: Thu, 27 Sep 2007 14:53:25 +0200 Subject: [PATCH 10/16] git-gui: fix typo in lib/blame.tcl Signed-off-by: Michele Ballabio Signed-off-by: Shawn O. Pearce --- lib/blame.tcl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/blame.tcl b/lib/blame.tcl index a911c3c77d..00ecf21333 100644 --- a/lib/blame.tcl +++ b/lib/blame.tcl @@ -905,7 +905,7 @@ method _open_tooltip {cur_w} { set author_time {} catch {set author_name $header($cmit,author)} catch {set summary $header($cmit,summary)} - catch {set author_time [foramt_date $header($cmit,author-time)]} + catch {set author_time [format_date $header($cmit,author-time)]} $tooltip_t insert end [strcat [mc "Originally By:"] "\n"] section_header $tooltip_t insert end "commit $cmit\n" From 1bdd8a153528b539fdaed23c18e87a374b1f3ff8 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Thu, 27 Sep 2007 00:18:29 -0400 Subject: [PATCH 11/16] git-gui: Use Henrik Nyh's git logo icon on Windows systems Rather than displaying the stock red "Tk" icon in our window title bars and on the task bar we now show a Git specific logo. This is Henrik Nyh's logo that we also use in the startup wizard, scaled to a 16x16 image for Windows task bar usage with a proper transparent background. Signed-off-by: Shawn O. Pearce --- Makefile | 2 ++ git-gui.sh | 4 ++++ lib/git-gui.ico | Bin 0 -> 318 bytes 3 files changed, 6 insertions(+) create mode 100644 lib/git-gui.ico diff --git a/Makefile b/Makefile index 0ab33517a9..ea83263406 100644 --- a/Makefile +++ b/Makefile @@ -193,6 +193,7 @@ install: all $(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 $(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(libdir_SQ)' $(INSTALL_D1) $(QUIET)$(INSTALL_R0)lib/tclIndex $(INSTALL_R1) '$(DESTDIR_SQ)$(libdir_SQ)' + $(QUIET)$(INSTALL_R0)lib/git-gui.ico $(INSTALL_R1) '$(DESTDIR_SQ)$(libdir_SQ)' $(QUIET)$(foreach p,$(ALL_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 @@ -203,6 +204,7 @@ uninstall: $(QUIET)$(foreach p,$(GITGUI_BUILT_INS), $(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/$p $(REMOVE_F1) &&) true $(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(libdir_SQ)' $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/tclIndex $(REMOVE_F1) + $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/git-gui.ico $(REMOVE_F1) $(QUIET)$(foreach p,$(ALL_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 diff --git a/git-gui.sh b/git-gui.sh index 37da8fde3b..843191a896 100755 --- a/git-gui.sh +++ b/git-gui.sh @@ -527,6 +527,10 @@ bind . { set root_exists 1 } +if {[is_Windows]} { + wm iconbitmap . -default $oguilib/git-gui.ico +} + ###################################################################### ## ## config defaults diff --git a/lib/git-gui.ico b/lib/git-gui.ico new file mode 100644 index 0000000000000000000000000000000000000000..563dd66238c1a5c169438fdb87ab797f6d19d1bc GIT binary patch literal 318 zcmZ{aI}XAy5JV>uJ$7MQDAOPcghU60DUcAtknN#y8;J{W6>gFv&{A`PAPRmFV(kqb zS!;GYZx%@SDW!O~kS0I}K+00A9xL#s+3xo6-ebNzqCY-kQB0do|8gSInpZISaEic) zJMD~%z0r(_oRhmXtwN+BPw>r1oU&Pn^z+Qx2&}bPyiW4F7RUZ SE~I<%|8o#MxGM)hRp&1`Pe2d= literal 0 HcmV?d00001 From 72a8e81d457a1ee1283817d03d8e28303c2b4e7e Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Thu, 27 Sep 2007 02:30:51 -0400 Subject: [PATCH 12/16] git-gui: Support a native Mac OS X application bundle If we are building on Darwin (sometimes known as Mac OS X) and we find the Mac OS X Tk.framework in the expected location we build a proper Mac OS X application bundle with icons and info list. The git-gui and git-citool commands are modified to be very short shell scripts that just execute the application bundle, starting Tk with our own info list and icon set. Although the Makefile change here is rather large it makes for a much more pleasant user experience on Mac OS X as git-gui now has its own icon on the dock, in the standard tk_messageBox dialogs, and the application name now says "Git Gui" instead of "Wish" in locations such as the menu bar and the alt-tab window. Signed-off-by: Shawn O. Pearce --- .gitignore | 4 +- Makefile | 96 +++++++++++++++++++++++++++++++++++--------- macosx/AppMain.tcl | 22 ++++++++++ macosx/Info.plist | 28 +++++++++++++ macosx/git-gui.icns | Bin 0 -> 28866 bytes 5 files changed, 129 insertions(+), 21 deletions(-) create mode 100644 macosx/AppMain.tcl create mode 100644 macosx/Info.plist create mode 100644 macosx/git-gui.icns diff --git a/.gitignore b/.gitignore index 020b86deae..a7cfd6d5a0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ +.DS_Store +Git Gui.app* +git-gui.tcl GIT-VERSION-FILE GIT-GUI-VARS -git-citool git-gui lib/tclIndex diff --git a/Makefile b/Makefile index ea83263406..818a0ab45c 100644 --- a/Makefile +++ b/Makefile @@ -11,11 +11,12 @@ 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 @@ -35,7 +36,7 @@ ifndef INSTALL INSTALL = install endif -RM_F ?= rm -f +RM_RF ?= rm -rf RMDIR ?= rmdir INSTALL_D0 = $(INSTALL) -d -m755 # space is required here @@ -44,6 +45,8 @@ 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 = @@ -51,14 +54,13 @@ 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' @@ -70,6 +72,8 @@ ifndef V 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= @@ -80,15 +84,15 @@ ifndef V 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 DESTDIR_SQ = $(subst ','\'',$(DESTDIR)) @@ -105,6 +109,7 @@ exedir = $(dir $(gitexecdir))share/git-gui/lib GITGUI_SCRIPT := $$0 GITGUI_RELATIVE := +GITGUI_MACOSXAPP := ifeq ($(exedir),$(gg_libdir)) GITGUI_RELATIVE := 1 @@ -116,8 +121,51 @@ ifeq ($(uname_O),Cygwin) 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 -$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh +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 + +$(GITGUI_MAIN): git-gui.sh GIT-VERSION-FILE GIT-GUI-VARS $(QUIET_GEN)rm -f $@ $@+ && \ sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ -e '1,30s|^ argv0=$$0| argv0=$(GITGUI_SCRIPT)|' \ @@ -125,13 +173,10 @@ $(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \ -e 's|@@GITGUI_RELATIVE@@|$(GITGUI_RELATIVE)|' \ -e '$(GITGUI_RELATIVE)s|@@GITGUI_LIBDIR@@|$(libdir_SED)|' \ - $@.sh >$@+ && \ + 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 @@ -152,7 +197,7 @@ update-po:: $(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' \ @@ -166,16 +211,13 @@ lib/tclIndex: $(ALL_LIBFILES) 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 @@ -185,7 +227,10 @@ GIT-GUI-VARS: .FORCE-GIT-GUI-VARS echo 1>$@ "$$VARS"; \ fi -all:: $(ALL_PROGRAMS) lib/tclIndex $(ALL_MSGFILES) +ifdef GITGUI_MACOSXAPP +all:: git-gui Git\ Gui.app +endif +all:: $(GITGUI_MAIN) lib/tclIndex $(ALL_MSGFILES) install: all $(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(gitexecdir_SQ)' $(INSTALL_D1) @@ -194,6 +239,10 @@ install: all $(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(libdir_SQ)' $(INSTALL_D1) $(QUIET)$(INSTALL_R0)lib/tclIndex $(INSTALL_R1) '$(DESTDIR_SQ)$(libdir_SQ)' $(QUIET)$(INSTALL_R0)lib/git-gui.ico $(INSTALL_R1) '$(DESTDIR_SQ)$(libdir_SQ)' +ifdef GITGUI_MACOSXAPP + $(QUIET)$(INSTALL_A0)'Git Gui.app' $(INSTALL_A1) '$(DESTDIR_SQ)$(libdir_SQ)' + $(QUIET)$(INSTALL_X0)git-gui.tcl $(INSTALL_X1) '$(DESTDIR_SQ)$(libdir_SQ)' +endif $(QUIET)$(foreach p,$(ALL_LIBFILES), $(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 @@ -205,6 +254,10 @@ uninstall: $(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(libdir_SQ)' $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/tclIndex $(REMOVE_F1) $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/git-gui.ico $(REMOVE_F1) +ifdef GITGUI_MACOSXAPP + $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)/Git Gui.app' $(REMOVE_F1) + $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/git-gui.tcl $(REMOVE_F1) +endif $(QUIET)$(foreach p,$(ALL_LIBFILES), $(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 @@ -218,8 +271,11 @@ dist-version: @echo $(GITGUI_VERSION) > $(TARDIR)/version clean:: - rm -f $(ALL_PROGRAMS) lib/tclIndex po/*.msg - 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 .PHONY: all install uninstall dist-version clean .PHONY: .FORCE-GIT-VERSION-FILE diff --git a/macosx/AppMain.tcl b/macosx/AppMain.tcl new file mode 100644 index 0000000000..41ca08e2b7 --- /dev/null +++ b/macosx/AppMain.tcl @@ -0,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 --git a/macosx/Info.plist b/macosx/Info.plist new file mode 100644 index 0000000000..99913ec57a --- /dev/null +++ b/macosx/Info.plist @@ -0,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 --git a/macosx/git-gui.icns b/macosx/git-gui.icns new file mode 100644 index 0000000000000000000000000000000000000000..77d88a77a7669667335cf6fd5767c8b40f3ce6e7 GIT binary patch literal 28866 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 literal 0 HcmV?d00001 From 0b2bc460fc69d2aa4f5af743b2b2317088e53949 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Thu, 27 Sep 2007 02:15:29 -0400 Subject: [PATCH 13/16] git-gui: Refer to ourselves as "Git Gui" and not "git-gui" When displaying the name of the application in window titles and menu options (e.g. "About [appname]") we would prefer to call ourselves "Git Gui" over "git-gui" as the former name is now being actively used in the Mac OS X UI strings and just plain looks better to the reader. Signed-off-by: Shawn O. Pearce --- git-gui.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/git-gui.sh b/git-gui.sh index 843191a896..82f873bdcd 100755 --- a/git-gui.sh +++ b/git-gui.sh @@ -108,7 +108,7 @@ unset oguimsg ## ## read only globals -set _appname [lindex [file split $argv0] end] +set _appname {Git Gui} set _gitdir {} set _gitexec {} set _reponame {} @@ -789,7 +789,7 @@ unset -nocomplain idx fd ## ## feature option selection -if {[regexp {^git-(.+)$} [appname] _junk subcommand]} { +if {[regexp {^git-(.+)$} [file tail $argv0] _junk subcommand]} { unset _junk } else { set subcommand gui @@ -2140,7 +2140,8 @@ 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 {} From 501e4c6f23378aca2ce14ba4bc3eebeccb92e8d7 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Tue, 2 Oct 2007 12:24:44 -0400 Subject: [PATCH 14/16] git-gui: Allow gitk to be started on Cygwin with native Tcl/Tk gitk expects $env(GIT_DIR) to be valid as both a path that core Git and Tcl/Tk can resolve to a valid directory, but it has no special handling for Cygwin style UNIX paths and Windows style paths. So we need to do that for gitk and ensure that only relative paths are fed to it, thus allowing both Cygwin style and UNIX style paths to be resolved. Signed-off-by: Shawn O. Pearce --- git-gui.sh | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/git-gui.sh b/git-gui.sh index c8375029dd..9682418e12 100755 --- a/git-gui.sh +++ b/git-gui.sh @@ -1468,7 +1468,27 @@ proc do_gitk {revs} { if {! [file exists $exe]} { error_popup "Unable to start gitk:\n\n$exe does not exist" } 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 From 906ab7f6c03764423adef6c0e4d77442405adc23 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Tue, 2 Oct 2007 12:27:32 -0400 Subject: [PATCH 15/16] git-gui: Don't crash when starting gitk from a browser session If the user has started git-gui from the command line as a browser we offer the gitk menu options but we didn't create the main status bar widget in the "." toplevel. Trying to access it while starting gitk just results in Tcl errors. Signed-off-by: Shawn O. Pearce --- git-gui.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/git-gui.sh b/git-gui.sh index 9682418e12..cf88a0d824 100755 --- a/git-gui.sh +++ b/git-gui.sh @@ -1125,11 +1125,17 @@ proc mapdesc {state path} { } proc ui_status {msg} { - $::main_status show $msg + global main_status + if {[info exists main_status]} { + $main_status show $msg + } } proc ui_ready {{test {}}} { - $::main_status show {Ready.} $test + global main_status + if {[info exists main_status]} { + $main_status show [mc "Ready."] $test + } } proc escape_path {path} { From 1952aa1d5735ccbedd832620e43db3e03fc77088 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Tue, 2 Oct 2007 12:52:22 -0400 Subject: [PATCH 16/16] git-gui: Allow forced push into remote repository Some workflows allow the user to forcefully update a remote branch, such as in a "proposed updates" (aka "pu") branch where the branch is rewound and rebuilt on a daily basis against the current master branch. In such a case the "--force" or leading + must be used to make git-push execute anyway, even though it may be discarding one or more commits on the remote side. Signed-off-by: Shawn O. Pearce --- lib/transport.tcl | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/transport.tcl b/lib/transport.tcl index 3b05b8fc2c..8e6a9d0a60 100644 --- a/lib/transport.tcl +++ b/lib/transport.tcl @@ -32,6 +32,7 @@ proc push_to {remote} { 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 { @@ -45,6 +46,9 @@ proc start_push_anywhere_action {w} { if {$push_thin} { lappend cmd --thin } + if {$push_force} { + lappend cmd --force + } if {$push_tags} { lappend cmd --tags } @@ -76,6 +80,7 @@ trace add variable push_remote write \ 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 @@ -151,6 +156,10 @@ proc do_push_anywhere {} { pack $w.dest -anchor nw -fill x -pady 5 -padx 5 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 [mc "Use thin pack (for slow network connections)"] \ -variable push_thin @@ -163,6 +172,7 @@ proc do_push_anywhere {} { 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