From 85d2d59760e5de7f288109cb278eb91da0d5f9bf Mon Sep 17 00:00:00 2001
From: "Shawn O. Pearce" <spearce@spearce.org>
Date: Wed, 18 Jul 2007 00:53:14 -0400
Subject: [PATCH] git-gui: Allow browser subcommand to start in subdirectory

Like our blame subcommand the browser subcommand now accepts both
a revision and a path, just a revision or just a path.  This way
the user can start the subcommand on any branch, or on any subtree.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 git-gui.sh      | 46 ++++++++++++++++++++--------------------------
 lib/browser.tcl | 10 +++++++---
 2 files changed, 27 insertions(+), 29 deletions(-)

diff --git a/git-gui.sh b/git-gui.sh
index 9ddb61ea9..267d60621 100755
--- a/git-gui.sh
+++ b/git-gui.sh
@@ -1976,27 +1976,7 @@ proc usage {} {
 # -- Not a normal commit type invocation?  Do that instead!
 #
 switch -- $subcommand {
-browser {
-	set subcommand_args {rev?}
-	switch [llength $argv] {
-	0 { load_current_branch }
-	1 {
-		set current_branch [lindex $argv 0]
-		if {[regexp {^[0-9a-f]{1,39}$} $current_branch]} {
-			if {[catch {
-					set current_branch \
-					[git rev-parse --verify $current_branch]
-				} err]} {
-				puts stderr $err
-				exit 1
-			}
-		}
-	}
-	default usage
-	}
-	browser::new $current_branch
-	return
-}
+browser -
 blame {
 	set subcommand_args {rev? path}
 	if {$argv eq {}} usage
@@ -2044,12 +2024,26 @@ blame {
 		set current_branch $head
 	}
 
-	if {$head eq {} && ![file exists $path]} {
-		puts stderr "fatal: cannot stat path $path: No such file or directory"
-		exit 1
+	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"
+			exit 1
+		}
+		blame::new $head $path
+	}
 	}
-
-	blame::new $head $path
 	return
 }
 citool -
diff --git a/lib/browser.tcl b/lib/browser.tcl
index 911e5af7f..e8802d001 100644
--- a/lib/browser.tcl
+++ b/lib/browser.tcl
@@ -13,13 +13,13 @@ field browser_busy   1
 
 field ls_buf     {}; # Buffered record output from ls-tree
 
-constructor new {commit} {
+constructor new {commit {path {}}} {
 	global cursor_ptr M1B
 	make_toplevel top w
 	wm title $top "[appname] ([reponame]): File Browser"
 
 	set browser_commit $commit
-	set browser_path $browser_commit:
+	set browser_path $browser_commit:$path
 
 	label $w.path \
 		-textvariable @browser_path \
@@ -73,7 +73,11 @@ constructor new {commit} {
 
 	bind $w_list <Visibility> [list focus $w_list]
 	set w $w_list
-	_ls $this $browser_commit
+	if {$path ne {}} {
+		_ls $this $browser_commit:$path $path
+	} else {
+		_ls $this $browser_commit $path
+	}
 	return $this
 }
 
-- 
2.26.2