]> asedeno.scripts.mit.edu Git - git.git/blob - lib/choose_rev.tcl
01e8efe991599901a5b90b65ec333a3063af635d
[git.git] / lib / choose_rev.tcl
1 # git-gui revision chooser
2 # Copyright (C) 2006, 2007 Shawn Pearce
3
4 class choose_rev {
5
6 field w               ; # our megawidget path
7 field revtype       {}; # type of revision chosen
8
9 field c_head        {}; # selected local branch head
10 field c_trck        {}; # selected tracking branch
11 field c_tag         {}; # selected tag
12 field c_expr        {}; # current revision expression
13
14 constructor new {path {title {}}} {
15         global all_heads current_branch
16
17         set w $path
18
19         if {$title ne {}} {
20                 labelframe $w -text $title
21         } else {
22                 frame $w
23         }
24         bind $w <Destroy> [cb _delete %W]
25
26         if {$all_heads ne {}} {
27                 set c_head $current_branch
28                 radiobutton $w.head_r \
29                         -text {Local Branch:} \
30                         -value head \
31                         -variable @revtype
32                 eval tk_optionMenu $w.head_m @c_head $all_heads
33                 grid $w.head_r $w.head_m -sticky w
34                 if {$revtype eq {}} {
35                         set revtype head
36                 }
37                 trace add variable @c_head write [cb _select head]
38         }
39
40         set all_trackings [all_tracking_branches]
41         if {$all_trackings ne {}} {
42                 set c_trck [lindex $all_trackings 0]
43                 radiobutton $w.trck_r \
44                         -text {Tracking Branch:} \
45                         -value trck \
46                         -variable @revtype
47                 eval tk_optionMenu $w.trck_m @c_trck $all_trackings
48                 grid $w.trck_r $w.trck_m -sticky w
49                 if {$revtype eq {}} {
50                         set revtype trck
51                 }
52                 trace add variable @c_trck write [cb _select trck]
53         }
54
55         set all_tags [load_all_tags]
56         if {$all_tags ne {}} {
57                 set c_tag [lindex $all_tags 0]
58                 radiobutton $w.tag_r \
59                         -text {Tag:} \
60                         -value tag \
61                         -variable @revtype
62                 eval tk_optionMenu $w.tag_m @c_tag $all_tags
63                 grid $w.tag_r $w.tag_m -sticky w
64                 if {$revtype eq {}} {
65                         set revtype tag
66                 }
67                 trace add variable @c_tag write [cb _select tag]
68         }
69
70         radiobutton $w.expr_r \
71                 -text {Revision Expression:} \
72                 -value expr \
73                 -variable @revtype
74         entry $w.expr_t \
75                 -borderwidth 1 \
76                 -relief sunken \
77                 -width 50 \
78                 -textvariable @c_expr \
79                 -validate key \
80                 -validatecommand [cb _validate %d %S]
81         grid $w.expr_r $w.expr_t -sticky we -padx {0 5}
82         if {$revtype eq {}} {
83                 set revtype expr
84         }
85
86         grid columnconfigure $w 1 -weight 1
87         return $this
88 }
89
90 method none {text} {
91         if {[winfo exists $w.none_r]} {
92                 $w.none_r configure -text $text
93                 return
94         }
95
96         radiobutton $w.none_r \
97                 -anchor w \
98                 -text $text \
99                 -value none \
100                 -variable @revtype
101         grid $w.none_r -sticky we -padx {0 5} -columnspan 2
102         if {$revtype eq {}} {
103                 set revtype none
104         }
105 }
106
107 method get {} {
108         switch -- $revtype {
109         head { return $c_head }
110         trck { return $c_trck }
111         tag  { return $c_tag  }
112         expr { return $c_expr }
113         none { return {}      }
114         default { error "unknown type of revision" }
115         }
116 }
117
118 method get_commit {} {
119         if {$revtype eq {none}} {
120                 return {}
121         }
122         set rev [get $this]
123         return [git rev-parse --verify "${rev}^0"]
124 }
125
126 method _validate {d S} {
127         if {$d == 1} {
128                 if {[regexp {\s} $S]} {
129                         return 0
130                 }
131                 if {[string length $S] > 0} {
132                         set revtype expr
133                 }
134         }
135         return 1
136 }
137
138 method _select {value args} {
139         set revtype $value
140 }
141
142 method _delete {current} {
143         if {$current eq $w} {
144                 delete_this
145         }
146 }
147
148 }