Code

git-gui: Maintain remote and source ref for tracking branches
[git.git] / lib / choose_rev.tcl
index 04f77c009296c88093db5eed5ca0b8647440e0c9..b3b615ee42d6e54058c5140fc3cb89d000ebcf2e 100644 (file)
@@ -11,6 +11,8 @@ field c_trck        {}; # selected tracking branch
 field c_tag         {}; # selected tag
 field c_expr        {}; # current revision expression
 
+field trck_spec       ; # array of specifications
+
 constructor new {path {title {}}} {
        global all_heads current_branch
 
@@ -37,19 +39,30 @@ constructor new {path {title {}}} {
                trace add variable @c_head write [cb _select head]
        }
 
-       set all_trackings [all_tracking_branches]
-       if {$all_trackings ne {}} {
-               set c_trck [lindex $all_trackings 0]
+       set trck_list [all_tracking_branches]
+       if {$trck_list ne {}} {
+               set nam [list]
+               foreach spec $trck_list {
+                       set txt [lindex $spec 0]
+                       regsub ^refs/(heads/|remotes/)? $txt {} txt
+                       set trck_spec($txt) $spec
+                       lappend nam $txt
+               }
+               set nam [lsort -unique $nam]
+
                radiobutton $w.trck_r \
                        -text {Tracking Branch:} \
                        -value trck \
                        -variable @revtype
-               eval tk_optionMenu $w.trck_m @c_trck $all_trackings
+               eval tk_optionMenu $w.trck_m @c_trck $nam
                grid $w.trck_r $w.trck_m -sticky w
+
+               set c_trck [lindex $nam 0]
                if {$revtype eq {}} {
                        set revtype trck
                }
                trace add variable @c_trck write [cb _select trck]
+               unset nam spec txt
        }
 
        set all_tags [load_all_tags]
@@ -87,19 +100,50 @@ constructor new {path {title {}}} {
        return $this
 }
 
+method none {text} {
+       if {[winfo exists $w.none_r]} {
+               $w.none_r configure -text $text
+               return
+       }
+
+       radiobutton $w.none_r \
+               -anchor w \
+               -text $text \
+               -value none \
+               -variable @revtype
+       grid $w.none_r -sticky we -padx {0 5} -columnspan 2
+       if {$revtype eq {}} {
+               set revtype none
+       }
+}
+
 method get {} {
        switch -- $revtype {
        head { return $c_head }
        trck { return $c_trck }
        tag  { return $c_tag  }
        expr { return $c_expr }
+       none { return {}      }
        default { error "unknown type of revision" }
        }
 }
 
+method get_expr {} {
+       switch -- $revtype {
+       head { return refs/heads/$c_head             }
+       trck { return [lindex $trck_spec($c_trck) 0] }
+       tag  { return refs/tags/$c_tag               }
+       expr { return $c_expr                        }
+       none { return {}                             }
+       default { error "unknown type of revision"   }
+       }
+}
+
 method get_commit {} {
-       set rev [get $this]
-       return [git rev-parse --verify "${rev}^0"]
+       if {$revtype eq {none}} {
+               return {}
+       }
+       return [git rev-parse --verify "[get_expr $this]^0"]
 }
 
 method _validate {d S} {