Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 0.7, 0.7.1, and 0.7.2

hgignore: fill in most missing functionality

Can add new globs and regexps expressions
Can remove existing lines via a context menu
Deals seemlessly with eoln issues

Changeset b0f04e627847

Parent 521958f6fd78

by Steve Borho

Changes to one file · Browse files at b0f04e627847 Showing diff from parent 521958f6fd78 Diff from another changeset...

Change 1 of 6 Show Entire File hggtk/​hgignore.py Stacked
 
7
8
9
10
 
11
12
13
 
54
55
56
 
57
58
59
 
73
74
75
 
 
76
 
77
78
79
 
107
108
109
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
111
112
 
116
117
118
 
119
120
121
 
 
 
 
122
123
124
 
 
 
 
 
125
126
127
 
128
129
130
131
132
133
134
135
136
 
137
138
139
140
141
142
143
 
144
145
146
147
148
 
149
150
151
152
153
154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
156
157
 
158
159
160
161
162
 
163
164
165
166
 
167
168
169
 
185
186
187
 
188
189
 
7
8
9
 
10
11
12
13
 
54
55
56
57
58
59
60
 
74
75
76
77
78
79
80
81
82
83
 
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
 
149
150
151
152
153
154
 
155
156
157
158
159
 
 
160
161
162
163
164
165
166
 
167
168
169
 
 
 
 
 
 
 
170
171
 
 
 
 
 
 
172
173
 
 
 
 
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
 
197
198
199
200
201
 
202
203
204
205
206
207
208
209
210
 
226
227
228
229
230
231
@@ -7,7 +7,7 @@
 import os  import gtk  from dialog import * -import hglib +from shlib import shell_notify  from mercurial import hg, ui, match    class HgIgnoreDialog(gtk.Window): @@ -54,6 +54,7 @@
  hbox.pack_start(glob_button, False, False, 4)   glob_button.connect('clicked', self.add_glob, glob_entry)   glob_entry.connect('activate', self.add_glob, glob_entry) + self.glob_entry = glob_entry   mainvbox.pack_start(hbox, False, False)     hbox = gtk.HBox() @@ -73,7 +74,10 @@
  frame = gtk.Frame('Filters')   hbox.pack_start(frame, True, True, 4)   pattree = gtk.TreeView() + pattree.connect('button-press-event', self.tree_button_press) + pattree.set_reorderable(False)   sel = pattree.get_selection() + sel.set_mode(gtk.SELECTION_SINGLE)   sel.connect("changed", self.pattern_rowchanged)   col = gtk.TreeViewColumn('Patterns', gtk.CellRendererText(), text=0)   pattree.append_column(col) @@ -107,6 +111,35 @@
  glob_entry.grab_focus()   self.connect('map_event', self._on_window_map_event)   + def tree_button_press(self, widget, event): + if event.button != 3: + return False + if event.state & (gtk.gdk.SHIFT_MASK | gtk.gdk.CONTROL_MASK): + return False + + path = widget.get_path_at_pos(int(event.x), int(event.y))[0] + selection = widget.get_selection() + rows = selection.get_selected_rows() + if path[0] not in rows[1]: + selection.unselect_all() + selection.select_path(path[0]) + + menu = gtk.Menu() + menuitem = gtk.MenuItem('Remove', True) + menuitem.connect('activate', self.remove_ignore_line, path[0]) + menuitem.set_border_width(1) + menu.append(menuitem) + menu.show_all() + menu.popup(None, None, None, 0, 0) + return True + + def remove_ignore_line(self, menuitem, linenum): + model = self.pattree.get_model() + del model[linenum] + del self.ignorelines[linenum] + self.write_ignore_lines() + self.refresh() +   def pattern_rowchanged(self, sel):   model, iter = sel.get_selected()   if not iter: @@ -116,54 +149,62 @@
  model, iter = sel.get_selected()   if not iter:   return + self.glob_entry.set_text(model[iter][0])     def add_glob(self, widget, glob_entry): - pass + newglob = glob_entry.get_text() + self.ignorelines.append('glob:' + newglob) + self.write_ignore_lines() + self.refresh()   - def add_regexp(self, widget, glob_entry): - pass + def add_regexp(self, widget, regexp_entry): + newregexp = regexp_entry.get_text() + self.ignorelines.append('regexp:' + newregexp) + self.write_ignore_lines() + self.refresh()     def _on_window_map_event(self, event, param): - self._refresh_clicked(None) + self.refresh()     def _refresh_clicked(self, togglebutton, data=None): - try: - l = open(os.path.join(self.root, '.hgignore'), 'rb').readlines() - if l[0].endswith('\r\n'): - self.doseoln = True - except IOError, ValueError: - self.doseoln = os.name == 'nt' - l = [] + self.refresh()   - model = gtk.ListStore(str) - for line in l: - model.append([line.strip()]) - self.pattree.set_model(model) - self.ignorelines = l - + def refresh(self):   try: repo = hg.repository(ui.ui(), path=self.root) - except: - print 'no repository found' - gtk.main_quit() - + except: gtk.main_quit()   matcher = match.always(repo.root, repo.root)   changes = repo.dirstate.status(matcher, ignored=False, clean=False, unknown=True)   (lookup, modified, added, removed, deleted, unknown, ignored, clean) = changes   self.unkmodel.clear()   for u in unknown:   self.unkmodel.append([u]) + try: + l = open(repo.wjoin('.hgignore'), 'rb').readlines() + self.doseoln = l[0].endswith('\r\n') + except IOError, ValueError: + self.doseoln = os.name == 'nt' + l = [] + + model = gtk.ListStore(str) + self.ignorelines = [] + for line in l: + model.append([line.strip()]) + self.ignorelines.append(line.strip()) + self.pattree.set_model(model) + self.repo = repo     def write_ignore_lines(self): - if doseoln: + if self.doseoln:   out = [line + '\r\n' for line in self.ignorelines]   else:   out = [line + '\n' for line in self.ignorelines]   try: - f = open(os.path.join(self.root, '.hgignore'), 'wb') + f = open(self.repo.wjoin('.hgignore'), 'wb')   f.writelines(out)   f.close()   except IOError:   pass + shell_notify(self.repo.wjoin('.hgignore'))     def _close_clicked(self, toolbutton, data=None):   self.destroy() @@ -185,5 +226,6 @@
  gtk.gdk.threads_leave()    if __name__ == "__main__": + import hglib   opts = {'root' : hglib.rootpath()}   run(**opts)