git-gui: Show all fetched branches for remote pulls.
[gitweb.git] / git-gui
diff --git a/git-gui b/git-gui
index 6035105f8e54d806a627529aa8a6363605819e11..0c88e4c7c32edffe0f4bef5e7216d5796b0b9dc9 100755 (executable)
--- a/git-gui
+++ b/git-gui
@@ -499,8 +499,8 @@ proc rescan_done {fd buf after} {
                set pathList [list]
                foreach path [array names file_states] {
                        switch -- [lindex $file_states($path) 0] {
-                       AM -
-                       MM {lappend pathList $path}
+                       A? -
+                       M? {lappend pathList $path}
                        }
                }
                if {$pathList ne {}} {
@@ -1502,10 +1502,13 @@ proc write_update_index {fd pathList totalCnt batch msg after} {
                switch -glob -- [lindex $file_states($path) 0] {
                AD -
                MD -
+               UD -
                _D {set new DD}
 
                _M -
                MM -
+               UM -
+               U_ -
                M_ {set new M_}
 
                _O -
@@ -1643,10 +1646,59 @@ proc populate_branch_menu {m} {
        }
 }
 
-proc switch_branch {b} {
+proc do_create_branch {} {
+       error "NOT IMPLEMENTED"
+}
+
+proc do_delete_branch {} {
        error "NOT IMPLEMENTED"
 }
 
+proc switch_branch {b} {
+       global HEAD commit_type file_states current_branch
+       global selected_commit_type ui_comm
+
+       if {![lock_index switch]} return
+
+       # -- Backup the selected branch (repository_state resets it)
+       #
+       set new_branch $current_branch
+
+       # -- Our in memory state should match the repository.
+       #
+       repository_state curType curHEAD curMERGE_HEAD
+       if {[string match amend* $commit_type]
+               && $curType eq {normal}
+               && $curHEAD eq $HEAD} {
+       } elseif {$commit_type ne $curType || $HEAD ne $curHEAD} {
+               info_popup {Last scanned state does not match repository state.
+
+Another Git program has modified this repository
+since the last scan.  A rescan must be performed
+before the current branch can be changed.
+
+The rescan will be automatically started now.
+}
+               unlock_index
+               rescan {set ui_status_value {Ready.}}
+               return
+       }
+
+       # -- Toss the message buffer if we are in amend mode.
+       #
+       if {[string match amend* $curType]} {
+               $ui_comm delete 0.0 end
+               $ui_comm edit reset
+               $ui_comm edit modified false
+       }
+
+       set selected_commit_type new
+       set current_branch $new_branch
+
+       unlock_index
+       error "NOT FINISHED"
+}
+
 ######################################################################
 ##
 ## remote management
@@ -1767,28 +1819,29 @@ proc populate_pull_menu {m} {
        global gitdir repo_config all_remotes disable_on_lock
 
        foreach remote $all_remotes {
-               set rb {}
+               set rb_list [list]
                if {[array get repo_config remote.$remote.url] ne {}} {
                        if {[array get repo_config remote.$remote.fetch] ne {}} {
-                               regexp {^([^:]+):} \
-                                       [lindex $repo_config(remote.$remote.fetch) 0] \
-                                       line rb
+                               foreach line $repo_config(remote.$remote.fetch) {
+                                       if {[regexp {^([^:]+):} $line line rb]} {
+                                               lappend rb_list $rb
+                                       }
+                               }
                        }
                } else {
                        catch {
                                set fd [open [file join $gitdir remotes $remote] r]
                                while {[gets $fd line] >= 0} {
                                        if {[regexp {^Pull:[ \t]*([^:]+):} $line line rb]} {
-                                               break
+                                               lappend rb_list $rb
                                        }
                                }
                                close $fd
                        }
                }
 
-               set rb_short $rb
-               regsub ^refs/heads/ $rb {} rb_short
-               if {$rb_short ne {}} {
+               foreach rb $rb_list {
+                       regsub ^refs/heads/ $rb {} rb_short
                        $m add command \
                                -label "Branch $rb_short from $remote..." \
                                -command [list pull_remote $remote $rb] \
@@ -2338,6 +2391,7 @@ proc do_include_all {} {
 }
 
 proc revert_helper {txt paths} {
+       global gitdir appname
        global file_states current_diff
 
        if {![lock_index begin-update]} return
@@ -2370,13 +2424,17 @@ proc revert_helper {txt paths} {
                set s "these $n files"
        }
 
+       set reponame [lindex [file split \
+               [file normalize [file dirname $gitdir]]] \
+               end]
+
        set reply [tk_dialog \
                .confirm_revert \
-               "title" \
+               "$appname ($reponame)" \
                "Revert unincluded changes in $s?
 
 Any unincluded changes will be permanently lost by the revert." \
-               questhead \
+               question \
                1 \
                {Do Nothing} \
                {Revert Changes} \
@@ -2997,6 +3055,7 @@ if {!$single_commit} {
                        -font font_ui
        }
 }
+
 .mbar.repository add command -label Quit \
        -command do_quit \
        -accelerator $M1T-Q \
@@ -3036,9 +3095,9 @@ menu .mbar.edit
        -accelerator $M1T-A \
        -font font_ui
 
+# -- Branch Menu
+#
 if {!$single_commit} {
-       # -- Branch Menu
-       #
        menu .mbar.branch
 
        .mbar.branch add command -label {Create...} \
@@ -3085,13 +3144,13 @@ lappend disable_on_lock \
 lappend disable_on_lock \
        [list .mbar.commit entryconf [.mbar.commit index last] -state]
 
-.mbar.commit add command -label {Include In Commit} \
+.mbar.commit add command -label {Add To Commit} \
        -command do_include_selection \
        -font font_ui
 lappend disable_on_lock \
        [list .mbar.commit entryconf [.mbar.commit index last] -state]
 
-.mbar.commit add command -label {Include All In Commit} \
+.mbar.commit add command -label {Add All To Commit} \
        -command do_include_all \
        -accelerator $M1T-I \
        -font font_ui
@@ -3152,6 +3211,35 @@ if {[is_MacOSX]} {
                -command do_options \
                -font font_ui
 
+       # -- Tools Menu
+       #
+       if {[file exists /usr/local/miga/lib/gui-miga]} {
+       proc do_miga {} {
+               global gitdir ui_status_value
+               if {![lock_index update]} return
+               set cmd [list sh --login -c "/usr/local/miga/lib/gui-miga \"[pwd]\""]
+               set miga_fd [open "|$cmd" r]
+               fconfigure $miga_fd -blocking 0
+               fileevent $miga_fd readable [list miga_done $miga_fd]
+               set ui_status_value {Running miga...}
+       }
+       proc miga_done {fd} {
+               read $fd 512
+               if {[eof $fd]} {
+                       close $fd
+                       unlock_index
+                       rescan [list set ui_status_value {Ready.}]
+               }
+       }
+       .mbar add cascade -label Tools -menu .mbar.tools
+       menu .mbar.tools
+       .mbar.tools add command -label "Migrate" \
+               -command do_miga \
+               -font font_ui
+       lappend disable_on_lock \
+               [list .mbar.tools entryconf [.mbar.tools index last] -state]
+       }
+
        # -- Help Menu
        #
        .mbar add cascade -label Help -menu .mbar.help
@@ -3259,7 +3347,7 @@ pack .vpane.lower.commarea.buttons.rescan -side top -fill x
 lappend disable_on_lock \
        {.vpane.lower.commarea.buttons.rescan conf -state}
 
-button .vpane.lower.commarea.buttons.incall -text {Include All} \
+button .vpane.lower.commarea.buttons.incall -text {Add All} \
        -command do_include_all \
        -font font_ui
 pack .vpane.lower.commarea.buttons.incall -side top -fill x
@@ -3615,11 +3703,9 @@ set selected_commit_type new
 wm title . "$appname ([file normalize [file dirname $gitdir]])"
 focus -force $ui_comm
 
-# -- Warn the user about environmental problems.
-#    Cygwin's Tcl does *not* pass its env array
-#    onto any processes it spawns.  This means
-#    that the git processes get none of our
-#    environment.  That may not work...
+# -- Warn the user about environmental problems.  Cygwin's Tcl
+#    does *not* pass its env array onto any processes it spawns.
+#    This means that git processes get none of our environment.
 #
 if {[is_Windows]} {
        set ignored_env 0
@@ -3672,13 +3758,17 @@ user.email settings into your personal
        unset ignored_env msg suggest_user name
 }
 
+# -- Only initialize complex UI if we are going to stay running.
+#
 if {!$single_commit} {
        load_all_remotes
        load_all_heads
+
        populate_branch_menu .mbar.branch
        populate_fetch_menu .mbar.fetch
        populate_pull_menu .mbar.pull
        populate_push_menu .mbar.push
 }
+
 lock_index begin-read
 after 1 do_rescan