git-gui: Make sure remotes are loaded when picking revisions
[gitweb.git] / lib / browser.tcl
index e612247c9eca4287f372c317260d82383133e419..b684c671489ed4dfcf93bbb11407b4db5ddec079 100644 (file)
@@ -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
 }
 
@@ -180,8 +184,7 @@ method _ls {tree_id {name {}}} {
        lappend browser_stack [list $tree_id $name]
        $w conf -state disabled
 
-       set cmd [list git ls-tree -z $tree_id]
-       set fd [open "| $cmd" r]
+       set fd [git_read ls-tree -z $tree_id]
        fconfigure $fd -blocking 0 -translation binary -encoding binary
        fileevent $fd readable [cb _read $fd]
 }
@@ -240,3 +243,56 @@ method _read {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"
+       if {$top ne {.}} {
+               wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
+       }
+
+       label $w.header \
+               -text {Browse Branch Files} \
+               -font font_uibold
+       pack $w.header -side top -fill x
+
+       frame $w.buttons
+       button $w.buttons.browse -text Browse \
+               -default active \
+               -command [cb _open]
+       pack $w.buttons.browse -side right
+       button $w.buttons.cancel -text {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}]
+       $w_rev bind_listbox <Double-Button-1> [cb _open]
+       pack $w.rev -anchor nw -fill both -expand 1 -pady 5 -padx 5
+
+       bind $w <Visibility> [cb _visible]
+       bind $w <Key-Escape> [list destroy $w]
+       bind $w <Key-Return> [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
+}
+
+}