This patch adds -C (change working directory) parameter to
gitk. With this parameter, instead of need to cd to directory
with .git folder, one can point the correct folder from
commandline.

Signed-off-by: Juha-Pekka Heikkila <[email protected]>

---
v2: Adjusted the parameter as per Eric's suggestion. I think
    it now work in similar manner as in many GNU tools as well
    as git itself.

v3: catch error from cd and other small refinement.

 Documentation/gitk.txt |  7 +++++++
 gitk-git/gitk          | 30 +++++++++++++++++++++---------
 2 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/Documentation/gitk.txt b/Documentation/gitk.txt
index 6ade002..d194d9b 100644
--- a/Documentation/gitk.txt
+++ b/Documentation/gitk.txt
@@ -146,6 +146,13 @@ gitk-specific options
        Select the specified commit after loading the graph.
        Default behavior is equivalent to specifying '--select-commit=HEAD'.
 
+-C <path>::
+
+       Run as if gitk was started in '<path>' instead of the current
+       working directory. When multiple `-C` options are given, each
+       subsequent non-absolute `-C <path>` is interpreted relative to
+       the preceding `-C <path>`.
+
 Examples
 --------
 gitk v2.6.12.. include/scsi drivers/scsi::
diff --git a/gitk-git/gitk b/gitk-git/gitk
index fcc606e..a7076f8 100755
--- a/gitk-git/gitk
+++ b/gitk-git/gitk
@@ -12279,20 +12279,14 @@ setui $uicolor
 
 setoptions
 
-# check that we can find a .git directory somewhere...
-if {[catch {set gitdir [exec git rev-parse --git-dir]}]} {
-    show_error {} . [mc "Cannot find a git repository here."]
-    exit 1
-}
-
 set selecthead {}
 set selectheadid {}
 
 set revtreeargs {}
 set cmdline_files {}
-set i 0
 set revtreeargscmd {}
-foreach arg $argv {
+for {set i 0} {$i < [llength $argv]} {incr i} {
+       set arg [lindex $argv [expr {$i}]]
     switch -glob -- $arg {
        "" { }
        "--" {
@@ -12305,11 +12299,29 @@ foreach arg $argv {
        "--argscmd=*" {
            set revtreeargscmd [string range $arg 10 end]
        }
+       "-C*" {
+               if {[string length $arg] < 3} {
+                       incr i
+                       set cwd_path [lindex $argv [expr {$i}]]
+               } else {
+                       set cwd_path [string range $arg 2 end]
+               }
+
+               if {[catch {cd $cwd_path}]} {
+                       show_error {} . [mc "Cannot change directory to '%s'" 
$cwd_path]
+                       exit 1
+               }
+       }
        default {
            lappend revtreeargs $arg
        }
     }
-    incr i
+}
+
+# check that we can find a .git directory somewhere...
+if {[catch {set gitdir [exec git rev-parse --git-dir]}]} {
+    show_error {} . [mc "Cannot find a git repository here."]
+    exit 1
 }
 
 if {$selecthead eq "HEAD"} {
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to