Merge branch 'as/bulgarian' into pu
diff --git a/git-gui.sh b/git-gui.sh
index f9b323a..5bc21b8 100755
--- a/git-gui.sh
+++ b/git-gui.sh
@@ -534,28 +534,10 @@
 }
 
 proc git {args} {
-	set opt [list]
-
-	while {1} {
-		switch -- [lindex $args 0] {
-		--nice {
-			_lappend_nice opt
-		}
-
-		default {
-			break
-		}
-
-		}
-
-		set args [lrange $args 1 end]
-	}
-
-	set cmdp [_git_cmd [lindex $args 0]]
-	set args [lrange $args 1 end]
-
-	_trace_exec [concat $opt $cmdp $args]
-	set result [eval exec $opt $cmdp $args]
+	set fd [eval [list git_read] $args]
+	fconfigure $fd -translation binary -encoding utf-8
+	set result [string trimright [read $fd] "\n"]
+	close $fd
 	if {$::_trace} {
 		puts stderr "< $result"
 	}
@@ -1111,7 +1093,7 @@
 				[list git_read config] \
 				$args \
 				[list --null --list]]
-			fconfigure $fd_rc -translation binary
+			fconfigure $fd_rc -translation binary -encoding utf-8
 			set buf [read $fd_rc]
 			close $fd_rc
 		}
@@ -1691,7 +1673,7 @@
 		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] \
+			[encoding convertfrom utf-8 $p] \
 			[lindex $i 4]? \
 			[list [lindex $i 0] [lindex $i 2]] \
 			[list]
@@ -1724,7 +1706,7 @@
 		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] \
+			[encoding convertfrom utf-8 $p] \
 			?[lindex $i 4] \
 			[list] \
 			[list [lindex $i 0] [lindex $i 2]]
@@ -1747,7 +1729,7 @@
 	set pck [split $buf_rlo "\0"]
 	set buf_rlo [lindex $pck end]
 	foreach p [lrange $pck 0 end-1] {
-		set p [encoding convertfrom $p]
+		set p [encoding convertfrom utf-8 $p]
 		if {[string index $p end] eq {/}} {
 			set p [string range $p 0 end-1]
 		}
diff --git a/lib/browser.tcl b/lib/browser.tcl
index 1580493..a982983 100644
--- a/lib/browser.tcl
+++ b/lib/browser.tcl
@@ -197,7 +197,7 @@
 	$w conf -state disabled
 
 	set fd [git_read ls-tree -z $tree_id]
-	fconfigure $fd -blocking 0 -translation binary -encoding binary
+	fconfigure $fd -blocking 0 -translation binary -encoding utf-8
 	fileevent $fd readable [cb _read $fd]
 }
 
diff --git a/lib/commit.tcl b/lib/commit.tcl
index 01d2cc2..83620b7 100644
--- a/lib/commit.tcl
+++ b/lib/commit.tcl
@@ -2,7 +2,7 @@
 # Copyright (C) 2006, 2007 Shawn Pearce
 
 proc load_last_commit {} {
-	global HEAD PARENT MERGE_HEAD commit_type ui_comm
+	global HEAD PARENT MERGE_HEAD commit_type ui_comm commit_author
 	global repo_config
 
 	if {[llength $PARENT] == 0} {
@@ -34,6 +34,8 @@
 					lappend parents [string range $line 7 end]
 				} elseif {[string match {encoding *} $line]} {
 					set enc [string tolower [string range $line 9 end]]
+				} elseif {[regexp "author (.*)\\s<(.*)>\\s(\\d.*$)" $line all name email time]} {
+					set commit_author [list name $name email $email date $time]
 				}
 			}
 			set msg [read $fd]
@@ -106,9 +108,10 @@
 }
 
 proc create_new_commit {} {
-	global commit_type ui_comm
+	global commit_type ui_comm commit_author
 
 	set commit_type normal
+	unset -nocomplain commit_author
 	$ui_comm delete 0.0 end
 	$ui_comm edit reset
 	$ui_comm edit modified false
@@ -322,11 +325,12 @@
 }
 
 proc commit_committree {fd_wt curHEAD msg_p} {
-	global HEAD PARENT MERGE_HEAD commit_type
+	global HEAD PARENT MERGE_HEAD commit_type commit_author
 	global current_branch
 	global ui_comm selected_commit_type
 	global file_states selected_paths rescan_active
 	global repo_config
+	global env
 
 	gets $fd_wt tree_id
 	if {[catch {close $fd_wt} err]} {
@@ -366,6 +370,9 @@
 		}
 	}
 
+	if {[info exists commit_author]} {
+		set old_author [commit_author_ident $commit_author]
+	}
 	# -- Create the commit.
 	#
 	set cmd [list commit-tree $tree_id]
@@ -381,8 +388,14 @@
 		error_popup [strcat [mc "commit-tree failed:"] "\n\n$err"]
 		ui_status [mc "Commit failed."]
 		unlock_index
+		unset -nocomplain commit_author
+		commit_author_reset $old_author
 		return
 	}
+	if {[info exists commit_author]} {
+		unset -nocomplain commit_author
+		commit_author_reset $old_author
+	}
 
 	# -- Update the HEAD ref.
 	#
@@ -509,3 +522,20 @@
 	}
 	fconfigure $fd_ph -blocking 0
 }
+
+proc commit_author_ident {details} {
+	global env
+	array set author $details
+	set old [array get env GIT_AUTHOR_*]
+	set env(GIT_AUTHOR_NAME) $author(name)
+	set env(GIT_AUTHOR_EMAIL) $author(email)
+	set env(GIT_AUTHOR_DATE) $author(date)
+	return $old
+}
+proc commit_author_reset {details} {
+	global env
+	unset env(GIT_AUTHOR_NAME) env(GIT_AUTHOR_EMAIL) env(GIT_AUTHOR_DATE)
+	if {$details ne {}} {
+		array set env $details
+	}
+}
diff --git a/lib/index.tcl b/lib/index.tcl
index 3a3e534..b588db1 100644
--- a/lib/index.tcl
+++ b/lib/index.tcl
@@ -115,7 +115,7 @@
 		set info [lindex $s 2]
 		if {$info eq {}} continue
 
-		puts -nonewline $fd "$info\t[encoding convertto $path]\0"
+		puts -nonewline $fd "$info\t[encoding convertto utf-8 $path]\0"
 		display_file $path $new
 	}
 
@@ -186,7 +186,7 @@
 		?M {set new M_}
 		?? {continue}
 		}
-		puts -nonewline $fd "[encoding convertto $path]\0"
+		puts -nonewline $fd "[encoding convertto utf-8 $path]\0"
 		display_file $path $new
 	}
 
@@ -247,7 +247,7 @@
 		?M -
 		?T -
 		?D {
-			puts -nonewline $fd "[encoding convertto $path]\0"
+			puts -nonewline $fd "[encoding convertto utf-8 $path]\0"
 			display_file $path ?_
 		}
 		}