Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 0.8, 0.8.1, and 0.8.2

hggtk: standardize module run() functions

All take the same arguments: run(ui, *pats, **opts)
The dialogs use os.getcwd() and hglib.rootpath() to find their repository root

Remove all of the "main" functions. The dialogs can't be used outside of the
context of hgtk anymore (this may seem arbritrary now, but there will soon be
reasons for this requirement).

Changeset aa5e7a24100e

Parent 0ca65325372d

by Steve Borho

Changes to 28 files · Browse files at aa5e7a24100e Showing diff from parent 0ca65325372d Diff from another changeset...

Change 1 of 1 Show Entire File hggtk/​about.py Stacked
 
84
85
86
87
 
88
89
90
91
92
93
94
95
96
 
84
85
86
 
87
88
89
90
91
92
93
 
 
 
@@ -84,13 +84,10 @@
  # close the About dialog...   self.connect('response', gtk.main_quit)   -def run(*args, **opts): +def run(_ui, *pats, **opts):   dialog = AboutDialog()   dialog.show_all()   gtk.gdk.threads_init()   gtk.gdk.threads_enter()   gtk.main()   gtk.gdk.threads_leave() - -if __name__ == "__main__": - run()
Change 1 of 1 Show Entire File hggtk/​backout.py Stacked
 
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
 
102
103
104
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
@@ -102,21 +102,3 @@
  dlg.hide()   if self.notify_func:   self.notify_func(self.notify_args) - -def run(root='', **opts): - # This dialog is intended to be launched by the changelog browser - # It's not expected to be used from hgtk. I leave this path in - # place for testing purposes. - dialog = BackoutDialog(root, 'tip') - dialog.show_all() - dialog.connect('destroy', gtk.main_quit) - gtk.gdk.threads_init() - gtk.gdk.threads_enter() - gtk.main() - gtk.gdk.threads_leave() - -if __name__ == "__main__": - import sys - opts = {} - opts['root'] = len(sys.argv) > 1 and sys.argv[1] or os.getcwd() - run(**opts)
 
55
56
57
58
59
60
 
 
61
62
63
64
65
66
67
68
69
70
71
 
55
56
57
 
 
 
58
59
60
61
62
63
64
 
 
 
 
 
 
@@ -55,17 +55,10 @@
  textview.get_buffer().set_text(text)   return vbox   - -def run(**opts): - dialog = BugReport(ui.ui(), None, None, None, opts, True) +def run(_ui, *pats, **opts): + dialog = BugReport(_ui, None, None, None, opts, True)   gtk.gdk.threads_init()   gtk.gdk.threads_enter()   dialog.display()   gtk.main()   gtk.gdk.threads_leave() - -if __name__ == "__main__": - opts = {} - opts['cmd'] = 'command' - opts['error'] = 'test error' - run(**opts)
 
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
 
705
706
707
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
@@ -705,23 +705,3 @@
  dlg.run()   dlg.hide()   shell_notify([self.curfile]) - -def run(root='', cwd='', files=[], **opts): - u = ui.ui() - u.updateopts(debug=False, traceback=False) - repo = hg.repository(u, path=root) - - dialog = ChangeSet(u, repo, cwd, files, opts, True) - dialog.display() - - gtk.gdk.threads_init() - gtk.gdk.threads_enter() - gtk.main() - gtk.gdk.threads_leave() - -if __name__ == "__main__": - import sys - opts = {} - opts['root'] = len(sys.argv) > 1 and sys.argv[1] or os.getcwd() - opts['rev'] = ['750'] - run(**opts)
Change 1 of 2 Show Entire File hggtk/​clone.py Stacked
 
16
17
18
19
 
20
21
 
22
23
24
25
26
27
28
 
320
321
322
323
324
 
 
325
326
327
328
329
330
331
332
333
334
335
336
 
16
17
18
 
19
20
21
22
23
 
 
 
24
25
26
 
318
319
320
 
 
321
322
323
324
325
326
327
 
 
 
 
 
 
 
@@ -16,13 +16,11 @@
   class CloneDialog(gtk.Window):   """ Dialog to add tag to Mercurial repo """ - def __init__(self, cwd='', repos=[]): + def __init__(self, repos=[]):   """ Initialize the Dialog """   gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) + shlib.set_tortoise_icon(self, 'menuclone.ico')   - shlib.set_tortoise_icon(self, 'menuclone.ico') - if cwd: os.chdir(cwd) -   # set dialog title   title = 'hg clone'   self.set_title(title) @@ -320,17 +318,10 @@
  self._add_src_to_recent(src)   self._add_dest_to_recent(dest)   -def run(cwd='', files=[], **opts): - dialog = CloneDialog(cwd, repos=files) +def run(_ui, *pats, **opts): + dialog = CloneDialog(pats)   dialog.show_all()   gtk.gdk.threads_init()   gtk.gdk.threads_enter()   gtk.main()   gtk.gdk.threads_leave() - -if __name__ == "__main__": - import sys - opts = {} - opts['cwd'] = os.getcwd() - opts['files'] = sys.argv[1:] - run(**opts)
Change 1 of 3 Show Entire File hggtk/​commit.py Stacked
 
558
559
560
561
 
562
563
564
 
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
 
674
675
676
 
680
681
682
683
 
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
 
 
 
 
 
558
559
560
 
561
562
563
564
 
649
650
651
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
652
653
654
655
 
659
660
661
 
662
663
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
664
665
666
667
@@ -558,7 +558,7 @@
  # But since we can't be sure they will do it right, we will   # have them to retry, to re-trigger the checking mechanism.   from thgconfig import ConfigDialog - dlg = ConfigDialog(self.repo.root, False) + dlg = ConfigDialog(False)   dlg.show_all()   dlg.focus_field('ui.username')   dlg.run() @@ -649,28 +649,7 @@
  self.reload_status()   self.qnew_name.grab_focus() # set focus back   -def launch(root='', files=[], cwd='', main=True, **opts): - u = ui.ui() - u.updateopts(debug=False, traceback=False) - repo = hg.repository(u, path=root) - - # move cwd to repo root if repo is merged, so we can show - # all the changed files - if len(repo.changectx(None).parents()) > 1 and repo.root != cwd: - cwd = repo.root - repo = hg.repository(u, path=cwd) - files = [cwd] - - ct = repo.ui.config('tortoisehg', 'extcommit', None) - if ct == 'qct': - from hglib import thgdispatch - args = ['--repository', root, ct] - try: - thgdispatch(repo.ui, args=args) - except SystemExit: - pass - return - +def run(_ui, *pats, **opts):   cmdoptions = {   'user':opts.get('user', ''), 'date':opts.get('date', ''),   'logfile':'', 'message':'', @@ -680,25 +659,9 @@
  'check': True, 'git':False, 'addremove':False,   }   - dialog = GCommit(u, repo, cwd, files, cmdoptions, main) + dialog = GCommit(_ui, None, None, pats, cmdoptions, True)   dialog.display() - return dialog - -def run(root='', files=[], cwd='', **opts): - # If no files or directories were selected, take current dir - # TODO: Not clear if this is best; user may expect repo wide - if not files and cwd: - files = [cwd] - if launch(root, files, cwd, True, **opts): - gtk.gdk.threads_init() - gtk.gdk.threads_enter() - gtk.main() - gtk.gdk.threads_leave() - -if __name__ == "__main__": - import sys - from hglib import rootpath - opts = {} - opts['cwd'] = len(sys.argv) > 1 and sys.argv[1] or os.getcwd() - opts['root'] = rootpath(opts['cwd']) - run(**opts) + gtk.gdk.threads_init() + gtk.gdk.threads_enter() + gtk.main() + gtk.gdk.threads_leave()
Change 1 of 2 Show Entire File hggtk/​datamine.py Stacked
 
47
48
49
50
 
 
 
 
 
 
 
 
 
 
 
 
 
51
52
53
 
684
685
686
687
688
689
690
691
 
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
 
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
 
47
48
49
 
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
696
697
698
 
 
 
 
 
699
700
701
702
703
704
705
 
 
 
 
 
 
 
 
 
 
706
707
 
 
 
 
 
 
708
709
710
711
 
 
 
 
 
 
 
 
@@ -47,7 +47,19 @@
  ]     def prepare_display(self): - os.chdir(self.repo.root) + root = self.repo.root + cf = [] + for f in self.pats: + if os.path.isfile(f): + cf.append(util.canonpath(root, self.cwd, f)) + elif os.path.isdir(f): + Prompt(_('Invalid path'), + _('Cannot annotate directory: %s') % f, None).run() + for f in cf: + self.add_annotate_page(f, '.') + if not self.notebook.get_n_pages(): + self.add_search_page() + os.chdir(root)     def save_settings(self):   settings = GDialog.save_settings(self) @@ -684,43 +696,16 @@
  menuitem.set_border_width(1)   return menuitem   -def run(root='', cwd='', files=[], **opts): - u = ui.ui() - u.updateopts(debug=False, traceback=False) - repo = hg.repository(u, path=root) - +def run(ui, *pats, **opts):   cmdoptions = {   'follow':False, 'follow-first':False, 'copies':False, 'keyword':[],   'limit':0, 'rev':[], 'removed':False, 'no_merges':False, 'date':None,   'only_merges':None, 'prune':[], 'git':False, 'verbose':False,   'include':[], 'exclude':[]   } - - cf = [] - for f in files: - if os.path.isfile(f): - cf.append(util.canonpath(root, cwd, f)) - elif os.path.isdir(f): - Prompt(_('Invalid path'), - _('Cannot annotate directory: %s') % f, None).run() - - dialog = DataMineDialog(u, repo, cwd, files, cmdoptions, True) + dialog = DataMineDialog(ui, None, None, pats, cmdoptions, True)   dialog.display() - - for f in cf: - dialog.add_annotate_page(f, '.') - if not dialog.notebook.get_n_pages(): - dialog.add_search_page() -   gtk.gdk.threads_init()   gtk.gdk.threads_enter()   gtk.main()   gtk.gdk.threads_leave() - -if __name__ == "__main__": - import sys - opts = {} - opts['cwd'] = os.getcwd() - opts['root'] = rootpath() - opts['files'] = sys.argv[1:] or [] - run(**opts)
Change 1 of 3 Show Entire File hggtk/​gdialog.py Stacked
 
91
92
93
94
 
95
96
97
 
98
99
100
 
333
334
335
336
 
 
337
338
339
 
415
416
417
418
 
419
420
421
 
91
92
93
 
94
95
96
 
97
98
99
100
 
333
334
335
 
336
337
338
339
340
 
416
417
418
 
419
420
421
422
@@ -91,10 +91,10 @@
    def __init__(self, ui, repo, cwd, pats, opts, main):   gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) - self.cwd = cwd + self.cwd = cwd or os.getcwd()   self.ui = ui   self.ui.interactive=False - self.repo = repo + self.repo = repo or hg.repository(ui, path=hglib.rootpath())   self.pats = pats   self.opts = opts   self.main = main @@ -333,7 +333,8 @@
  prompttext += errors.getvalue()   errors.close()   if len(prompttext) > 1: - Prompt(title + _(' Messages and Errors'), prompttext, self).run() + Prompt(title + _(' Messages and Errors'), + prompttext, self).run()     return True, textout   @@ -415,7 +416,7 @@
  from thgconfig import ConfigDialog   Prompt(_('No visual editor configured'),   _('Please configure a visual editor.'), self).run() - dlg = ConfigDialog(self.repo.root, False) + dlg = ConfigDialog(False)   dlg.show_all()   dlg.focus_field('tortoisehg.editor')   dlg.run()
Change 1 of 2 Show Entire File hggtk/​guess.py Stacked
 
36
37
38
39
 
40
41
42
43
44
 
45
46
 
47
48
49
 
366
367
368
369
370
 
 
371
372
373
374
375
376
377
378
379
380
 
36
37
38
 
39
40
41
42
43
 
44
45
 
46
47
48
49
 
366
367
368
 
 
369
370
371
372
373
374
375
376
 
 
 
 
@@ -36,14 +36,14 @@
   class DetectRenameDialog(gtk.Window):   'Detect renames after they occur' - def __init__(self, root=''): + def __init__(self):   'Initialize the Dialog'   gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)   set_tortoise_icon(self, 'detect_rename.ico')   - self.root = root + self.root = rootpath()   self.notify_func = None - path = toutf(os.path.basename(root)) + path = toutf(os.path.basename(self.root))   self.set_title(_('Detect Copies/Renames in ') + path)   settings = shlib.Settings('rename')   dims = settings.get_value('dims', (800, 600)) @@ -366,15 +366,11 @@
  line = diffexpand(line)   buf.insert(bufiter, line)   -def run(root='', **opts): - dialog = DetectRenameDialog(root) +def run(ui, *pats, **opts): + dialog = DetectRenameDialog()   dialog.show_all()   dialog.connect('destroy', gtk.main_quit)   gtk.gdk.threads_init()   gtk.gdk.threads_enter()   gtk.main()   gtk.gdk.threads_leave() - -if __name__ == "__main__": - opts['root'] = rootpath() - run(**opts)
Change 1 of 1 Show Entire File hggtk/​hgcmd.py Stacked
 
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
 
158
159
160
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
@@ -158,22 +158,3 @@
  return self.hgthread.return_code()   else:   return False - -def run(cmdline=[], gui=True, **opts): - if not gui: - q = Queue.Queue() - hgcmd_toq(None, q, *cmdline[1:]) - return - - dlg = CmdDialog(cmdline) - dlg.connect('response', gtk.main_quit) - dlg.show_all() - gtk.gdk.threads_init() - gtk.gdk.threads_enter() - gtk.main() - gtk.gdk.threads_leave() - -if __name__ == "__main__": - import sys - run(sys.argv) -
Change 1 of 4 Show Entire File hggtk/​hgemail.py Stacked
 
16
17
18
19
20
21
22
 
261
262
263
264
 
 
265
266
267
 
303
304
305
 
306
307
308
 
309
310
311
 
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
 
16
17
18
 
19
20
21
 
260
261
262
 
263
264
265
266
267
 
303
304
305
306
307
308
 
309
310
311
312
 
360
361
362
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
@@ -16,7 +16,6 @@
 from mercurial import hg, ui, extensions  from mercurial.i18n import _  from hglib import RepoError, fromutf, toutf -from thgconfig import ConfigDialog  from hgcmd import CmdDialog    class EmailDialog(gtk.Window): @@ -261,7 +260,8 @@
  self._diffstat.set_sensitive(False)     def _on_conf_clicked(self, button): - dlg = ConfigDialog(self.root, False) + from thgconfig import ConfigDialog + dlg = ConfigDialog(False)   dlg.show_all()   dlg.focus_field('email.from')   dlg.run() @@ -303,9 +303,10 @@
    if self.repo.ui.config('email', 'method', 'smtp') == 'smtp' and not test:   if not self.repo.ui.config('smtp', 'host'): + from thgconfig import ConfigDialog   info_dialog(self, _('Info required'),   _('You must configure SMTP')) - dlg = ConfigDialog(self.root, False) + dlg = ConfigDialog(False)   dlg.show_all()   dlg.focus_field('smtp.host')   dlg.run() @@ -359,20 +360,3 @@
  if oldpager:   os.environ['PAGER'] = oldpager   os.unlink(tmpfile) - -def run(root='', **opts): - # In most use cases, this dialog will be launched by other - # hggtk tools like glog and synch. It's not expected to be - # used from hgtk. I leave this path in place for testing purposes. - dialog = EmailDialog(root, ['tip']) - dialog.show_all() - dialog.connect('destroy', gtk.main_quit) - gtk.gdk.threads_init() - gtk.gdk.threads_enter() - gtk.main() - gtk.gdk.threads_leave() - -if __name__ == "__main__": - opts = {} - opts['root'] = len(sys.argv) > 1 and sys.argv[1] or os.getcwd() - run(**opts)
Change 1 of 6 Show Entire File hggtk/​hgignore.py Stacked
 
7
8
9
 
 
10
11
12
13
14
 
15
16
17
18
 
19
20
21
22
23
24
 
 
25
26
27
 
38
39
40
41
 
42
43
44
 
138
139
140
141
 
142
143
144
145
146
147
 
148
149
150
 
165
166
167
168
 
169
170
171
 
176
177
178
179
 
180
181
182
 
195
196
197
198
199
 
 
 
 
200
201
202
203
204
205
206
207
208
209
210
 
7
8
9
10
11
12
13
 
 
 
14
15
16
17
 
18
19
20
21
22
 
 
23
24
25
26
27
 
38
39
40
 
41
42
43
44
 
138
139
140
 
141
142
143
144
145
146
 
147
148
149
150
 
165
166
167
 
168
169
170
171
 
176
177
178
 
179
180
181
182
 
195
196
197
 
 
198
199
200
201
202
203
204
205
206
207
 
 
 
 
 
@@ -7,21 +7,21 @@
 import os  import gtk  import gobject +from mercurial import hg, ui, match +from mercurial.i18n import _  from dialog import *  from shlib import shell_notify, set_tortoise_icon -from hglib import fromutf, toutf -from mercurial import hg, ui, match -from mercurial.i18n import _ +import hglib    class HgIgnoreDialog(gtk.Window):   'Edit a reposiory .hgignore file' - def __init__(self, root='', fileglob=''): + def __init__(self, fileglob='', *pats):   'Initialize the Dialog'   gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)   set_tortoise_icon(self, 'ignore.ico')   - self.root = root - self.set_title(_('Ignore filter for ') + os.path.basename(root)) + self.root = hglib.rootpath() + self.set_title(_('Ignore filter for ') + os.path.basename(self.root))   self.set_default_size(630, 400)   self.notify_func = None   @@ -38,7 +38,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) - glob_entry.set_text(toutf(fileglob)) + glob_entry.set_text(hglib.toutf(fileglob))   self.glob_entry = glob_entry   mainvbox.pack_start(hbox, False, False)   @@ -138,13 +138,13 @@
  self.glob_entry.set_text(model[paths][0])     def add_glob(self, widget, glob_entry): - newglob = fromutf(glob_entry.get_text()) + newglob = hglib.fromutf(glob_entry.get_text())   self.ignorelines.append('glob:' + newglob)   self.write_ignore_lines()   self.refresh()     def add_regexp(self, widget, regexp_entry): - newregexp = fromutf(regexp_entry.get_text()) + newregexp = hglib.fromutf(regexp_entry.get_text())   self.ignorelines.append('regexp:' + newregexp)   self.write_ignore_lines()   self.refresh() @@ -165,7 +165,7 @@
  deleted, unknown, ignored, clean) = changes   self.unkmodel.clear()   for u in unknown: - self.unkmodel.append([toutf(u), u]) + self.unkmodel.append([hglib.toutf(u), u])   try:   l = open(repo.wjoin('.hgignore'), 'rb').readlines()   self.doseoln = l[0].endswith('\r\n') @@ -176,7 +176,7 @@
  model = gtk.ListStore(str)   self.ignorelines = []   for line in l: - model.append([toutf(line.strip())]) + model.append([hglib.toutf(line.strip())])   self.ignorelines.append(line.strip())   self.pattree.set_model(model)   self.repo = repo @@ -195,16 +195,13 @@
  shell_notify(self.repo.wjoin('.hgignore'))   if self.notify_func: self.notify_func()   -def run(root='', fileglob='', **opts): - dialog = HgIgnoreDialog(root, fileglob) +def run(_ui, *pats, **opts): + if pats and pats[0].endswith('.hgignore'): + pats = [] + dialog = HgIgnoreDialog(*pats)   dialog.show_all()   dialog.connect('destroy', gtk.main_quit)   gtk.gdk.threads_init()   gtk.gdk.threads_enter()   gtk.main()   gtk.gdk.threads_leave() - -if __name__ == "__main__": - import hglib - opts = {'root' : hglib.rootpath()} - run(**opts)
Change 1 of 2 Show Entire File hggtk/​hginit.py Stacked
 
15
16
17
18
 
19
20
21
 
164
165
166
167
168
 
 
169
170
171
172
173
174
175
176
177
178
179
180
 
15
16
17
 
18
19
20
21
 
164
165
166
 
 
167
168
169
170
171
172
173
 
 
 
 
 
 
 
@@ -15,7 +15,7 @@
   class InitDialog(gtk.Window):   """ Dialog to add tag to Mercurial repo """ - def __init__(self, cwd='', repos=[]): + def __init__(self, repos=[]):   """ Initialize the Dialog """   gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)   @@ -164,17 +164,10 @@
  info_dialog(self, _('New repository created'),   _('in directory %s') % toutf(os.path.abspath(dest)))   -def run(cwd='', files=[], **opts): - dialog = InitDialog(cwd, repos=files) +def run(ui, *pats, **opts): + dialog = InitDialog(repos=pats)   dialog.show_all()   gtk.gdk.threads_init()   gtk.gdk.threads_enter()   gtk.main()   gtk.gdk.threads_leave() - -if __name__ == "__main__": - import sys - opts = {} - opts['cwd'] = os.getcwd() - opts['files'] = sys.argv[1:] - run(**opts)
Change 1 of 3 Show Entire File hggtk/​hgtk.py Stacked
 
35
36
37
38
 
39
40
41
 
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
211
212
213
214
 
215
216
217
218
219
220
221
 
222
223
224
225
226
227
228
 
229
230
 
231
232
233
234
235
 
236
237
238
239
240
241
 
242
243
244
 
245
246
 
247
248
249
250
251
 
252
253
254
255
256
257
 
258
259
260
261
262
263
 
264
265
 
266
267
268
 
269
270
271
272
273
274
 
275
276
 
277
278
279
 
281
282
283
284
 
285
286
 
287
288
289
 
290
291
292
293
294
 
295
296
297
 
35
36
37
 
38
39
40
41
 
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
211
212
 
 
213
214
215
216
217
218
219
220
 
 
221
222
223
224
225
 
226
227
228
229
230
 
 
 
231
232
233
234
235
 
 
 
236
237
 
238
239
240
 
 
 
241
242
243
244
245
 
 
246
247
248
 
249
250
 
251
252
253
254
255
 
256
257
258
259
260
 
 
261
262
263
264
265
 
 
266
267
 
268
269
270
 
271
272
273
274
275
 
 
276
277
 
278
279
280
281
 
283
284
285
 
286
287
 
288
289
290
 
291
292
293
294
295
 
296
297
298
299
@@ -35,7 +35,7 @@
  pdb.post_mortem(sys.exc_info()[2])   error = traceback.format_exc()   from bugreport import run - run(**{'cmd':' '.join(sys.argv[1:]), 'error':error}) + run(u, **{'cmd':' '.join(sys.argv[1:]), 'error':error})    def get_list_from_file(filename):   try: @@ -164,116 +164,118 @@
 def about(ui, *pats, **opts):   """about TortoiseHg"""   from hggtk.about import run - run(**opts) + run(ui, *pats, **opts)    def add(ui, *pats, **opts):   """add files"""   from mercurial import dispatch   dispatch.dispatch(['add'] + list(pats))   -def clone(ui, source=None, dest=None, **opts): +def clone(ui, *pats, **opts):   """clone tool"""   from hggtk.clone import run - opts['files'] = [os.path.abspath(x) for x in (source, dest) if x] - run(**opts) + run(ui, *pats, **opts)    def commit(ui, *pats, **opts):   """commit tool""" + ct = ui.config('tortoisehg', 'extcommit', None) + if ct == 'qct': + from hglib import thgdispatch + args = ['--repository', root, ct] + try: + thgdispatch(repo.ui, args=args) + except SystemExit: + pass + return + # move cwd to repo root if repo is merged, so we can show + # all the changed files + repo = hg.repository(ui, path=hglib.rootpath()) + if len(repo.changectx(None).parents()) > 1: + os.chdir(repo.root) + pats = []   from hggtk.commit import run - opts['files'] = [os.path.abspath(x) for x in pats] - run(**opts) + run(ui, *pats, **opts)    def shelve(ui, *pats, **opts):   """shelve/unshelve tool"""   from hggtk.thgshelve import run - opts['files'] = [os.path.abspath(x) for x in pats] - run(**opts) + run(ui, *pats, **opts)   -def userconfig(ui, **opts): +def userconfig(ui, *pats, **opts):   """user configuration editor"""   from hggtk.thgconfig import run - run(**opts) + opts['repomode'] = False + run(ui, *pats, **opts)    def repoconfig(ui, *pats, **opts):   """repository configuration editor"""   from hggtk.thgconfig import run - opts['files'] = opts['root'] - run(**opts) + opts['repomode'] = True + run(ui, *pats, **opts)    def rename(ui, *pats, **opts):   """rename a single file or directory"""   from hggtk.rename import run   if not pats or len(pats) > 2:   raise util.Abort(_('rename takes one or two path arguments')) - opts['files'] = pats - run(**opts) + run(ui, *pats, **opts)    def guess(ui, *pats, **opts):   """guess previous renames or copies"""   from hggtk.guess import run - run(**opts) + run(ui, *pats, **opts)    def datamine(ui, *pats, **opts):   """repository search and annotate tool"""   from hggtk.datamine import run - opts['files'] = pats or [] - opts['cwd'] = os.getcwd() - run(**opts) + run(ui, *pats, **opts)    def hgignore(ui, *pats, **opts):   """ignore filter editor"""   from hggtk.hgignore import run - if pats and not pats[0].endswith('.hgignore'): - opts['fileglob'] = pats[0] - run(**opts) + run(ui, *pats, **opts)   -def hginit(ui, dest=None, **opts): +def hginit(ui, *pats, **opts):   """repository initialization tool"""   from hggtk.hginit import run - if dest: - opts['files'] = [dest] - run(**opts) + run(ui, *pats, **opts)    def log(ui, *pats, **opts):   """changelog viewer"""   from hggtk.history import run - opts['files'] = [os.path.abspath(x) for x in pats] - run(**opts) + run(ui, *pats, **opts)    def merge(ui, node=None, rev=None, **opts): - """merge tool """ + """merge tool"""   from hggtk.merge import run - run(**opts) + run(ui, *pats, **opts)    def recovery(ui, *pats, **opts):   """recover, rollback & verify"""   from hggtk.recovery import run - run(**opts) + run(ui, *pats, **opts)    def remove(ui, *pats, **opts):   """file status viewer in remove mode"""   from hggtk.status import run - opts['files'] = [os.path.abspath(x) for x in pats] - run(**opts) + run(ui, *pats, **opts)    def revert(ui, *pats, **opts):   """file status viewer in revert mode"""   from hggtk.status import run - opts['files'] = [os.path.abspath(x) for x in pats] - run(**opts) + run(ui, *pats, **opts)   -def serve(ui, **opts): +def serve(ui, *pats, **opts):   """web server"""   from hggtk.serve import run - run(**opts) + run(ui, *pats, **opts)    def status(ui, *pats, **opts):   """file status viewer"""   from hggtk.status import run - opts['files'] = [os.path.abspath(x) for x in pats] - run(**opts) + run(ui, *pats, **opts)   -def synch(ui, **opts): +def synch(ui, *pats, **opts):   """repository synchronization tool"""   from hggtk.synch import run   cmd = sys.argv[1] @@ -281,17 +283,17 @@
  opts['pushmode'] = True   else:   opts['pushmode'] = False - run(**opts) + run(ui, *pats, **opts)   -def update(ui, **opts): +def update(ui, *pats, **opts):   """update/checkout tool"""   from hggtk.update import run - run(**opts) + run(ui, *pats, **opts)    def vdiff(ui, *pats, **opts):   """launch configured visual diff tool"""   from hggtk.visdiff import run - run(pats, **opts) + run(ui, *pats, **opts)    ### help management, adapted from mercurial.commands.help_()  def help_(ui, name=None, with_version=False):
Change 1 of 3 Show Entire File hggtk/​history.py Stacked
 
634
635
636
637
 
638
639
640
 
651
652
653
654
 
655
656
657
 
726
727
728
729
730
731
732
733
734
735
 
736
737
738
739
740
 
 
 
741
742
743
744
 
745
746
747
748
749
750
751
752
753
754
755
756
757
758
 
634
635
636
 
637
638
639
640
 
651
652
653
 
654
655
656
657
 
726
727
728
 
 
 
 
 
 
 
729
730
731
 
 
 
732
733
734
735
736
 
 
737
738
739
740
741
742
 
 
 
 
 
 
 
 
 
@@ -634,7 +634,7 @@
  from update import UpdateDialog   rev = self.currow[treemodel.REVID]   parents = [x.node() for x in self.repo.changectx(None).parents()] - dialog = UpdateDialog(self.cwd, rev) + dialog = UpdateDialog(rev)   dialog.set_transient_for(self)   dialog.show_all()   dialog.set_notify_func(self.checkout_completed, parents) @@ -651,7 +651,7 @@
  rev = self.currow[treemodel.REVID]   parents = [x.node() for x in self.repo.changectx(None).parents()]   node = short(self.repo.changelog.node(rev)) - dialog = MergeDialog(self.repo.root, self.cwd, node) + dialog = MergeDialog(self.repo.root, node)   dialog.set_transient_for(self)   dialog.show_all()   dialog.set_notify_func(self.merge_completed, parents) @@ -726,33 +726,17 @@
  self._menu.get_children()[0].activate()   return True   -def run(root='', cwd='', files=[], limit='', **opts): - u = ui.ui() - u.updateopts(debug=False, traceback=False) - repo = hg.repository(u, path=root) - - files = [util.canonpath(root, cwd, f) for f in files] - +def run(ui, *pats, **opts):   cmdoptions = {   'follow':False, 'follow-first':False, 'copies':False, 'keyword':[], - 'limit':limit, 'rev':[], 'removed':False, 'no_merges':False, 'date':None, - 'only_merges':None, 'prune':[], 'git':False, 'verbose':False, - 'include':[], 'exclude':[] + 'limit':limit, 'rev':[], 'removed':False, 'no_merges':False, + 'date':None, 'only_merges':None, 'prune':[], 'git':False, + 'verbose':False, 'include':[], 'exclude':[]   }   - dialog = GLog(u, repo, cwd, files, cmdoptions, True) - + dialog = GLog(u, None, None, pats, cmdoptions, True)   gtk.gdk.threads_init()   gtk.gdk.threads_enter()   dialog.display()   gtk.main()   gtk.gdk.threads_leave() - -if __name__ == "__main__": - import sys - opts = {} - path = len(sys.argv) > 1 and sys.argv[1] or os.getcwd() - opts['root'] = os.path.abspath(path) - opts['files'] = [opts['root']] - opts['limit'] = '' - run(**opts)
 
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
 
249
250
251
252
253
254
255
256
257
 
232
233
234
 
 
 
 
 
 
 
 
 
235
236
237
 
240
241
242
 
 
 
 
 
 
@@ -232,15 +232,6 @@
  return True   return False   -def run(root='', files=[], **opts): - dialog = HistoryDialog(root=root, files=files) - dialog.show_all() - dialog.connect('response', gtk.main_quit) - gtk.gdk.threads_init() - gtk.gdk.threads_enter() - gtk.main() - gtk.gdk.threads_leave() -  def select(root='', files=[]):   dialog = HistoryDialog(root=root, files=files, select=True)   resp = dialog.run() @@ -249,9 +240,3 @@
  rev = dialog.selected[1]   dialog.hide()   return rev - -if __name__ == "__main__": - import sys - opts = {} - opts['root'] = len(sys.argv) > 1 and sys.argv[1:] or [] - run(**opts)
 
230
231
232
233
234
235
236
237
238
239
240
241
242
243
 
230
231
232
 
 
 
 
 
 
 
 
 
 
 
@@ -230,14 +230,3 @@
  dlg = CmdDialog(['hg', 'help', 'dates'], False)   dlg.run()   dlg.hide() - -if __name__ == "__main__": - # this dialog is not designed for standalone use - # this is for debugging only - dialog = FilterDialog() - dialog.show_all() - dialog.connect('response', gtk.main_quit) - gtk.gdk.threads_init() - gtk.gdk.threads_enter() - gtk.main() - gtk.gdk.threads_leave()
Change 1 of 5 Show Entire File hggtk/​merge.py Stacked
 
11
12
13
14
15
16
17
 
18
19
20
21
 
22
23
24
 
28
29
30
31
32
 
33
34
35
 
125
126
127
128
 
129
130
131
 
207
208
209
210
 
211
212
213
 
231
232
233
234
 
235
236
237
238
239
240
 
 
241
242
243
244
245
246
247
248
249
250
251
252
 
11
12
13
 
14
15
16
17
18
19
20
 
21
22
23
24
 
28
29
30
 
 
31
32
33
34
 
124
125
126
 
127
128
129
130
 
206
207
208
 
209
210
211
212
 
230
231
232
 
233
234
235
236
237
 
 
238
239
240
241
242
243
244
245
 
 
 
 
 
 
@@ -11,14 +11,14 @@
 from mercurial.node import *  from mercurial.i18n import _  from mercurial import util, hg, ui -from hglib import RepoError  from hgcmd import CmdDialog  from shlib import set_tortoise_icon, shell_notify  import histselect +import hglib    class MergeDialog(gtk.Window):   """ Dialog to merge revisions of a Mercurial repo """ - def __init__(self, root='', cwd='', rev=''): + def __init__(self, root='', rev=''):   """ Initialize the Dialog """   gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)   @@ -28,8 +28,7 @@
  if root: title += " - %s" % root   self.set_title(title)   - self.root = root - self.cwd = cwd or root + self.root = root or hglib.rootpath()   self.rev = rev   self.repo = None   self.notify_func = None @@ -125,7 +124,7 @@
  # FIXME: force hg to refresh parents info   del self.repo   self.repo = hg.repository(ui.ui(), path=self.root) - except RepoError: + except hglib.RepoError:   return None     # populate parent rev data @@ -207,7 +206,7 @@
  dlg.hide()   if self.notify_func:   self.notify_func(self.notify_args) - shell_notify([self.cwd]) + shell_notify([self.root])   self._refresh()     def _do_merge(self): @@ -231,22 +230,16 @@
  dlg = CmdDialog(cmdline)   dlg.run()   dlg.hide() - shell_notify([self.cwd]) + shell_notify([self.root])   if self.notify_func:   self.notify_func(self.notify_args)   self._refresh()   -def run(root='', cwd='', rev='', **opts): - dialog = MergeDialog(root, cwd, rev) +def run(ui, *pats, **opts): + dialog = MergeDialog()   dialog.connect('destroy', gtk.main_quit)   dialog.show_all()   gtk.gdk.threads_init()   gtk.gdk.threads_enter()   gtk.main()   gtk.gdk.threads_leave() - -if __name__ == "__main__": - import sys - opts = {} - opts['root'] = len(sys.argv) > 1 and sys.argv[1] or '' - run(**opts)
Change 1 of 3 Show Entire File hggtk/​recovery.py Stacked
 
15
16
17
18
 
19
20
21
22
23
 
24
25
26
27
28
29
 
30
31
32
 
129
130
131
132
 
133
134
135
 
208
209
210
211
212
 
 
213
214
215
216
217
218
219
220
221
 
15
16
17
 
18
19
20
21
22
 
23
24
25
26
27
 
 
28
29
30
31
 
128
129
130
 
131
132
133
134
 
207
208
209
 
 
210
211
212
213
214
215
216
 
 
 
 
@@ -15,18 +15,17 @@
 from mercurial.i18n import _  from mercurial import hg, ui, util  from dialog import error_dialog, question_dialog -from hglib import HgThread, toutf, RepoError +from hglib import HgThread, toutf, RepoError, rootpath  from shlib import set_tortoise_icon, shell_notify  import gtklib    class RecoveryDialog(gtk.Window): - def __init__(self, cwd='', root=''): + def __init__(self):   """ Initialize the Dialog. """   gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)     set_tortoise_icon(self, 'general.ico') - self.root = root - self.cwd = cwd + self.root = rootpath()   self.selected_path = None   self.hgthread = None   self.connect('delete-event', self._delete) @@ -129,7 +128,7 @@
  def _notify(self, ret, *args):   import time   time.sleep(0.5) # give fs some time to pick up changes - shell_notify([self.cwd]) + shell_notify([self.root])     def _rollback_clicked(self, toolbutton, data=None):   response = question_dialog(self, _('Rollback repository'), @@ -208,14 +207,10 @@
  self.write(_('[command interrupted]'))   return False # Stop polling this function   -def run(cwd='', root='', **opts): - dialog = RecoveryDialog(cwd, root) +def run(ui, *pats, **opts): + dialog = RecoveryDialog(root)   dialog.show_all()   gtk.gdk.threads_init()   gtk.gdk.threads_enter()   gtk.main()   gtk.gdk.threads_leave() - -if __name__ == "__main__": - import sys - run(*sys.argv[1:])
Change 1 of 2 Show Entire File hggtk/​rename.py Stacked
 
14
15
16
17
18
 
19
20
21
22
 
 
23
24
25
 
76
77
78
79
80
81
82
83
84
85
86
87
88
 
14
15
16
 
 
17
18
19
 
 
20
21
22
23
24
 
75
76
77
 
 
 
 
 
 
 
 
 
 
@@ -14,12 +14,11 @@
 from hglib import toutf, fromutf, rootpath, RepoError  import gtklib   -def run(files = [], root='', cwd='', **opts): - if cwd: os.chdir(cwd) +def run(ui, *pats, **opts):   fname, target = '', ''   try: - fname = files[0] - target = files[1] + fname = pats[0] + target = pats[1]   except IndexError:   pass   from dialog import entry_dialog @@ -76,13 +75,3 @@
  error_dialog(None, _('rename error'), textout)   elif toquit:   gtk.main_quit() - -if __name__ == "__main__": - if '--detect' in sys.argv: - opts['root'] = rootpath() - opts['detect'] = True - elif len(sys.argv) == 3: - opts = {'files' : sys.argv[1:2] } - else: - opts = {'files' : [sys.argv[1]] } - run(**opts)
Change 1 of 4 Show Entire File hggtk/​serve.py Stacked
 
27
28
29
30
 
31
32
33
 
44
45
46
47
 
48
49
50
51
52
53
54
 
202
203
204
205
 
206
207
208
 
344
345
346
347
348
349
 
 
350
351
352
353
354
355
356
357
358
359
360
361
362
363
 
27
28
29
 
30
31
32
33
 
44
45
46
 
47
48
 
 
 
49
50
51
 
199
200
201
 
202
203
204
205
 
341
342
343
 
 
 
344
345
346
347
348
349
350
 
 
 
 
 
 
 
 
 
@@ -27,7 +27,7 @@
 gservice = None  class ServeDialog(gtk.Window):   """ Dialog to run web server""" - def __init__(self, cwd='', root='', webdir_conf=''): + def __init__(self, webdir_conf):   """ Initialize the Dialog """   gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)   @@ -44,11 +44,8 @@
  commands.table.update(thg_serve_cmd)     self._url = None - self._root = root + self._root = hglib.rootpath()   self._webdirconf = webdir_conf - if cwd: - os.chdir(cwd) -   self._get_config()   self.set_default_size(500, 300)   @@ -202,7 +199,7 @@
    def _on_conf_clicked(self, *args):   from thgconfig import ConfigDialog - dlg = ConfigDialog(self._root, True) + dlg = ConfigDialog(True)   dlg.show_all()   dlg.focus_field('web.name')   dlg.run() @@ -344,20 +341,10 @@
  ('', 'certificate', '', _('SSL certificate file'))],   _('hg serve [OPTION]...'))}   - -def run(cwd='', root='', webdir_conf='', **opts): - dialog = ServeDialog(cwd, root, webdir_conf) +def run(ui, *pats, **opts): + dialog = ServeDialog(opts.get('webdir_conf'))   dialog.show_all()   gtk.gdk.threads_init()   gtk.gdk.threads_enter()   gtk.main()   gtk.gdk.threads_leave() - -if __name__ == "__main__": - opts = {} - opts['cwd'] = os.getcwd() - if len(sys.argv) == 2 and sys.argv[1].endswith('.conf'): - opts['webdir_conf'] = sys.argv[1] - else: - opts['root'] = len(sys.argv) > 1 and sys.argv[1] or '' - run(**opts)
Change 1 of 2 Show Entire File hggtk/​status.py Stacked
 
9
10
11
12
13
14
15
 
1311
1312
1313
1314
1315
1316
1317
1318
1319
 
 
1320
1321
1322
1323
1324
1325
1326
1327
1328
 
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
 
9
10
11
 
12
13
14
 
1310
1311
1312
 
 
 
 
 
 
1313
1314
1315
1316
1317
1318
1319
1320
 
 
 
1321
1322
1323
1324
1325
1326
 
 
 
 
 
 
@@ -9,7 +9,6 @@
   import os  import cStringIO -  import pygtk  import gtk  import pango @@ -1311,29 +1310,17 @@
  menu.get_children()[0].activate()   return True   -def run(root='', cwd='', files=[], **opts): - u = ui.ui() - u.updateopts(debug=False, traceback=False, quiet=True) - repo = hg.repository(u, path=root) - - showclean = files and True or False +def run(ui, *pats, **opts): + showclean = pats and True or False   cmdoptions = {   'all':False, 'clean':showclean, 'ignored':False, 'modified':True,   'added':True, 'removed':True, 'deleted':True, 'unknown':True, 'rev':[],   'exclude':[], 'include':[], 'debug':True, 'verbose':True, 'git':False,   'check':True   } - - dialog = GStatus(u, repo, cwd, files, cmdoptions, True) - + dialog = GStatus(ui, None, None, pats, cmdoptions, True)   gtk.gdk.threads_init()   gtk.gdk.threads_enter()   dialog.display()   gtk.main()   gtk.gdk.threads_leave() - -if __name__ == "__main__": - import sys - opts = {} - opts['root'] = len(sys.argv) > 1 and sys.argv[1] or '' - run(**opts)
Change 1 of 5 Show Entire File hggtk/​synch.py Stacked
 
20
21
22
23
 
24
25
26
27
28
29
 
30
31
32
 
43
44
45
46
 
47
48
49
 
300
301
302
303
 
304
305
306
 
446
447
448
449
 
450
451
452
 
617
618
619
620
621
 
 
622
623
624
625
626
627
628
629
 
20
21
22
 
23
24
25
26
27
 
 
28
29
30
31
 
42
43
44
 
45
46
47
48
 
299
300
301
 
302
303
304
305
 
445
446
447
 
448
449
450
451
 
616
617
618
 
 
619
620
621
622
623
624
625
 
 
 
@@ -20,13 +20,12 @@
 import urllib    class SynchDialog(gtk.Window): - def __init__(self, cwd='', root = '', repos=[], pushmode=False): + def __init__(self, repos=[], pushmode=False):   """ Initialize the Dialog. """   gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)     shlib.set_tortoise_icon(self, 'menusynch.ico') - self.root = root - self.cwd = cwd + self.root = rootpath()   self.selected_path = None   self.hgthread = None   @@ -43,7 +42,7 @@
  extensions.load(self.ui, 'fetch', None)   extensions.load(self.ui, 'rebase', None)   - name = self.repo.ui.config('web', 'name') or os.path.basename(root) + name = self.repo.ui.config('web', 'name') or os.path.basename(self.root)   self.set_title(_('TortoiseHg Synchronize - ') + name)     self.connect('delete-event', self._delete) @@ -300,7 +299,7 @@
  from history import GLog   countpulled = len(self.repo.changelog) - self.origchangecount   opts = {'limit' : countpulled } - dialog = GLog(self.ui, self.repo, self.cwd, [], opts, False) + dialog = GLog(self.ui, None, None, [], opts, False)   dialog.display()     def _update_to_tip(self, button): @@ -446,7 +445,7 @@
  newpath = None   break   from thgconfig import ConfigDialog - dlg = ConfigDialog(self.root, True) + dlg = ConfigDialog(True)   dlg.show_all()   if newpath:   dlg.new_path(newpath) @@ -617,13 +616,10 @@
  value = getattr(getattr(self, member), 'get_%s'%attr)()   set_value(key, value)   -def run(cwd='', root='', files=[], pushmode=False, **opts): - dialog = SynchDialog(cwd, root, files, pushmode) +def run(ui, *pats, **opts): + dialog = SynchDialog(pats, opts.get('pushmode') or False)   dialog.show_all()   gtk.gdk.threads_init()   gtk.gdk.threads_enter()   gtk.main()   gtk.gdk.threads_leave() - -if __name__ == "__main__": - run(**{})
Change 1 of 1 Show Entire File hggtk/​tagadd.py Stacked
 
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
 
236
237
238
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
@@ -236,24 +236,3 @@
  message = _('Removed tag %s') % name   r = self.repo.changectx(nullid).node()   self.repo.tag(name, r, message, local, user, date) - -def run(root='', tag='', rev='', **opts): - dialog = TagAddDialog(root, tag, rev) - - # the dialog maybe called by another window/dialog, so we only - # enable the close dialog handler if dialog is run as mainapp - dialog.connect('destroy', gtk.main_quit) - - dialog.show_all() - gtk.gdk.threads_init() - gtk.gdk.threads_enter() - gtk.main() - gtk.gdk.threads_leave() - -if __name__ == "__main__": - import sys - opts = {} - opts['root'] = len(sys.argv) > 1 and sys.argv[1] or '' - #opts['tag'] = 'mytag' - #opts['rev'] = '-1' - run(**opts)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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
146
147
148
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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
 
344
345
346
347
348
349
350
 
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
 
 
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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
146
147
148
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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
 
 
 
 
340
341
342
343
344
345
346
 
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
 
 
990
991
992
993
 
 
 
994
995
996
997
 
 
 
 
 
 
 
 
 
 
 
 #_  # Configuration dialog for TortoiseHg and Mercurial  #  # Copyright (C) 2008-9 Steve Borho <steve@borho.org>  # Copyright (C) 2007 TK Soh <teekaysoh@gmail.com>  #    import gtk  import gobject  import os  import re  import urlparse  from mercurial.i18n import _  from mercurial import hg, ui, util, url  from dialog import error_dialog, question_dialog -from hglib import RepoError, toutf, fromutf +from hglib import RepoError, toutf, fromutf, rootpath  import shlib  import iniparse    _unspecstr = _('<unspecified>')    _pwfields = ('http_proxy.passwd', 'smtp.password')    _tortoise_info = (   (_('3-way Merge Tool'), 'ui.merge', [],   _('Graphical merge program for resolving merge conflicts. If left'   ' unspecified, Mercurial will use the first applicable tool it finds'   ' on your system or use its internal merge tool that leaves conflict'   ' markers in place. Chose internal:merge to force conflict markers.')),   (_('Visual Diff Command'), 'tortoisehg.vdiff', [],   _('Specify visual diff tool; must be an extdiff command')),   (_('Visual Editor'), 'tortoisehg.editor', [],   _('Specify the visual editor used to view files, etc')),   (_('CLI Editor'), 'ui.editor', [],   _('The editor to use during a commit and other'   ' instances where Mercurial needs multiline input from'   ' the user. Only used by command line interface commands.')),   (_('Tab Width'), 'tortoisehg.tabwidth', [],   _('Specify the number of spaces that tabs expand to in various'   ' TortoiseHG windows.'   ' Default: Not expanded')),   (_('Bottom Diffs'), 'gtools.diffbottom', ['False', 'True'],   _('Show the diff panel below the file list in status, shelve, and'   ' commit dialogs.'   ' Default: False (show diffs to right of file list)')))    shellcmds = '''about add clone commit datamine init log merge recovery  shelve synch status userconfig repoconfig guess remove rename revert  serve update vdiff'''.split()    _commit_info = (   (_('Username'), 'ui.username', [],   _('Name associated with commits')),   (_('External Commit Tool'), 'tortoisehg.extcommit', ['None', 'qct'],   _('Select commit tool launched by TortoiseHg. (Qct is no longer'   ' distributed as part of TortoiseHG.)'   ' Default: None (use the builtin tool)')))    _log_info = (   (_('Author Coloring'), 'tortoisehg.authorcolor', ['False', 'True'],   _('Color changesets by author name. If not enabled,'   ' the changes are colored green for merge, red for'   ' non-trivial parents, black for normal.'   ' Default: False')),   (_('Long Summary'), 'tortoisehg.longsummary', ['False', 'True'],   _('If true, concatenate multiple lines of changeset summary'   ' until they reach 80 characters.'   ' Default: False')),   (_('Log Batch Size'), 'tortoisehg.graphlimit', ['500'],   _('The number of revisions to read and display in the'   ' changelog viewer in a single batch.'   ' Default: 500')),   (_('Copy Hash'), 'tortoisehg.copyhash', ['False', 'True'],   _('Allow the changelog viewer to copy the changeset hash'   ' of the currently selected changeset into the clipboard.'   ' Default: False')))    _paths_info = (   ('After pull operation', 'tortoisehg.postpull',   ['none', 'update', 'fetch', 'rebase'],   _('Operation which is performed directly after a successful pull.'   ' update equates to pull --update, fetch equates to the fetch'   ' extension, rebase equates to pull --rebase. Default: none')),)    _web_info = (   (_('Name'), 'web.name', ['unknown'],   _('Repository name to use in the web interface.'   ' Default is the working directory.')),   (_('Description'), 'web.description', ['unknown'],   _("Textual description of the repository's purpose or"   " contents.")),   (_('Contact'), 'web.contact', ['unknown'],   _('Name or email address of the person in charge of the'   ' repository.')),   (_('Style'), 'web.style',   ['paper', 'monoblue', 'coal', 'spartan', 'gitweb', 'old'],   _('Which template map style to use')),   (_('Archive Formats'), 'web.allow_archive', ['bz2', 'gz', 'zip'],   _('Comma separated list of archive formats allowed for'   ' downloading')),   (_('Port'), 'web.port', ['8000'], _('Port to listen on')),   (_('Push Requires SSL'), 'web.push_ssl', ['True', 'False'],   _('Whether to require that inbound pushes be transported'   ' over SSL to prevent password sniffing.')),   (_('Stripes'), 'web.stripes', ['1', '0'],   _('How many lines a "zebra stripe" should span in multiline output.'   ' Default is 1; set to 0 to disable.')),   (_('Max Files'), 'web.maxfiles', ['10'],   _('Maximum number of files to list per changeset.')),   (_('Max Changes'), 'web.maxfiles', ['10'],   _('Maximum number of changes to list on the changelog.')),   (_('Allow Push'), 'web.allow_push', ['*'],   _('Whether to allow pushing to the repository. If empty or not'   ' set, push is not allowed. If the special value "*", any remote'   ' user can push, including unauthenticated users. Otherwise, the'   ' remote user must have been authenticated, and the authenticated'   ' user name must be present in this list (separated by whitespace'   ' or ","). The contents of the allow_push list are examined after'   ' the deny_push list.')),   (_('Deny Push'), 'web.deny_push', ['*'],   _('Whether to deny pushing to the repository. If empty or not set,'   ' push is not denied. If the special value "*", all remote users'   ' are denied push. Otherwise, unauthenticated users are all'   ' denied, and any authenticated user name present in this list'   ' (separated by whitespace or ",") is also denied. The contents'   ' of the deny_push list are examined before the allow_push list.')),   (_('Encoding'), 'web.encoding', ['UTF-8'],   _('Character encoding name')))    _proxy_info = (   (_('Host'), 'http_proxy.host', [],   _('Host name and (optional) port of proxy server, for'   ' example "myproxy:8000"')),   (_('Bypass List'), 'http_proxy.no', [],   _('Optional. Comma-separated list of host names that'   ' should bypass the proxy')),   (_('Password'), 'http_proxy.passwd', [],   _('Optional. Password to authenticate with at the'   ' proxy server')),   (_('User'), 'http_proxy.user', [],   _('Optional. User name to authenticate with at the'   ' proxy server')))    _email_info = (   (_('From'), 'email.from', [],   _('Email address to use in the "From" header and for the SMTP envelope')),   (_('To'), 'email.to', [],   _('Comma-separated list of recipient email addresses')),   (_('Cc'), 'email.cc', [],   _('Comma-separated list of carbon copy recipient email'   ' addresses')),   (_('Bcc'), 'email.bcc', [],   _('Comma-separated list of blind carbon copy recipient'   ' email addresses')),   (_('method'), 'email.method', ['smtp'],  _('Optional. Method to use to send email messages. If value is "smtp" (default),'  ' use SMTP (configured below). Otherwise, use as name of program to run that'  ' acts like sendmail (takes "-f" option for sender, list of recipients on'  ' command line, message on stdin). Normally, setting this to "sendmail" or'  ' "/usr/sbin/sendmail" is enough to use sendmail to send messages.')),   (_('SMTP Host'), 'smtp.host', [], _('Host name of mail server')),   (_('SMTP Port'), 'smtp.port', ['25'],   _('Port to connect to on mail server.'   ' Default: 25')),   (_('SMTP TLS'), 'smtp.tls', ['False', 'True'],   _('Connect to mail server using TLS.'   ' Default: False')),   (_('SMTP Username'), 'smtp.username', [],   _('Username to authenticate to mail server with')),   (_('SMTP Password'), 'smtp.password', [],   _('Password to authenticate to mail server with')),   (_('Local Hostname'), 'smtp.local_hostname', [],   _('Hostname the sender can use to identify itself to the mail server.')))    _diff_info = (   (_('Git Format'), 'diff.git', ['False', 'True'],   _('Use git extended diff header format.'   ' Default: False')),   (_('No Dates'), 'diff.nodates', ['False', 'True'],   _('Do not include modification dates in diff headers.'   ' Default: False')),   (_('Show Function'), 'diff.showfunc', ['False', 'True'],   _('Show which function each change is in.'   ' Default: False')),   (_('Ignore White Space'), 'diff.ignorews', ['False', 'True'],   _('Ignore white space when comparing lines.'   ' Default: False')),   (_('Ignore WS Amount'), 'diff.ignorewsamount', ['False', 'True'],   _('Ignore changes in the amount of white space.'   ' Default: False')),   (_('Ignore Blank Lines'), 'diff.ignoreblanklines', ['False', 'True'],   _('Ignore changes whose lines are all blank.'   ' Default: False')))    class PathEditDialog(gtk.Dialog):   _protocols = ['ssh', 'http', 'https', 'local']     def __init__(self, path, alias):   gtk.Dialog.__init__(self, parent=None, flags=gtk.DIALOG_MODAL,   buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))   self.connect('response', self.response)   self.set_title(_('Edit remote repository path'))   self.newpath, self.newalias = None, None     self.entries = {}   for name in ('URL', 'Port', 'Folder', 'Host', 'User',   'Password', 'Alias'):   entry = gtk.Entry()   label = gtk.Label(name)   self.entries[name] = (entry, label)     self.entries['URL'][0].set_width_chars(50)   self.entries['URL'][0].set_editable(False)   self.entries['Password'][0].set_visibility(False)     hbox = gtk.HBox()   hbox.pack_start(self.entries['Alias'][1], False, False, 2)   hbox.pack_start(self.entries['Alias'][0], False, False, 2)   hbox.pack_start(self.entries['URL'][1], False, False, 2)   hbox.pack_start(self.entries['URL'][0], True, True, 2)   self.vbox.pack_start(hbox, False, False, 2)     frame = gtk.Frame()   self.vbox.pack_start(frame, False, False, 2)   vbox = gtk.VBox()   vbox.set_border_width(10)   frame.add(vbox)   frame.set_border_width(10)     self.protcombo = gtk.combo_box_new_text()   for p in self._protocols:   self.protcombo.append_text(p)   vbox.pack_start(self.protcombo, False, False, 10)     hbox = gtk.HBox()   hbox.pack_start(self.entries['Host'][1], False, False, 2)   hbox.pack_start(self.entries['Host'][0], True, True, 2)   hbox.pack_start(self.entries['Port'][1], False, False, 2)   hbox.pack_start(self.entries['Port'][0], False, False, 2)   vbox.pack_start(hbox, False, False, 2)     for n in ('Folder', 'User', 'Password'):   hbox = gtk.HBox()   hbox.pack_start(self.entries[n][1], False, False, 2)   hbox.pack_start(self.entries[n][0], True, True, 2)   vbox.pack_start(hbox, False, False, 2)     user, host, port, folder, pw, scheme = self.urlparse(path)     self.entries['URL'][0].set_text(path)   self.entries['Alias'][0].set_text(alias)   self.entries['User'][0].set_text(user or '')   self.entries['Host'][0].set_text(host or '')   self.entries['Port'][0].set_text(port or '')   self.entries['Folder'][0].set_text(folder or '')   self.entries['Password'][0].set_text(pw or '')   for n, (e, l) in self.entries.iteritems():   e.connect('changed', self.changed)     self.lastproto = None   self.protcombo.connect('changed', self.changed)   i = self._protocols.index(scheme)   self.protcombo.set_active(i)   self.show_all()     def urlparse(self, path):   if path.startswith('ssh://'):   m = re.match(r'^ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?$', path)   user = m.group(2)   host = m.group(3)   port = m.group(5)   folder = m.group(7) or "."   passwd = ''   scheme = 'ssh'   elif path.startswith('http'):   snpaqf = urlparse.urlparse(path)   scheme, netloc, folder, params, query, fragment = snpaqf   host, port, user, passwd = url.netlocsplit(netloc)   if folder.startswith('/'): folder = folder[1:]   else:   user, host, port, passwd = [''] * 4   folder = path   scheme = 'local'   return user, host, port, folder, passwd, scheme     def changed(self, combo):   newurl = self.buildurl()   self.entries['URL'][0].set_text(url.hidepassword(newurl))   proto = self.protcombo.get_active_text()   if proto == self.lastproto:   return   self.lastproto = proto   if proto == 'local':   for n in ('User', 'Password', 'Port', 'Host'):   self.entries[n][0].set_sensitive(False)   self.entries[n][1].set_sensitive(False)   elif proto == 'ssh':   for n in ('User', 'Port', 'Host'):   self.entries[n][0].set_sensitive(True)   self.entries[n][1].set_sensitive(True)   self.entries['Password'][0].set_sensitive(False)   self.entries['Password'][1].set_sensitive(False)   else:   for n in ('User', 'Password', 'Port', 'Host'):   self.entries[n][0].set_sensitive(True)   self.entries[n][1].set_sensitive(True)     def response(self, widget, response_id):   if response_id != gtk.RESPONSE_CLOSE:   self.destroy()   return   self.newpath = self.buildurl()   self.newalias = self.entries['Alias'][0].get_text()   self.destroy()     def buildurl(self):   proto = self.protcombo.get_active_text()   host = self.entries['Host'][0].get_text()   port = self.entries['Port'][0].get_text()   folder = self.entries['Folder'][0].get_text()   user = self.entries['User'][0].get_text()   pwd = self.entries['Password'][0].get_text()   if proto == 'ssh':   ret = 'ssh://'   if user:   ret += user + '@'   ret += host   if port:   ret += ':' + port   ret += '/' + folder   elif proto == 'local':   ret = folder   else:   ret = proto + '://'   netloc = url.netlocunsplit(host, port, user, pwd)   ret += netloc + '/' + folder   return ret    class ConfigDialog(gtk.Dialog): - def __init__(self, root='', - configrepo=False, - focusfield=None, - newpath=None): + def __init__(self, configrepo=False, focusfield=None, newpath=None):   """ Initialize the Dialog. """   gtk.Dialog.__init__(self, parent=None, flags=0,   buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))     self.ui = ui.ui()   try: - repo = hg.repository(self.ui, path=root) + repo = hg.repository(self.ui, path=rootpath())   except RepoError:   repo = None   if configrepo:   error_dialog(self, _('No repository found'),   _('no repo at ') + root)   self.response(gtk.RESPONSE_CANCEL)     # Catch close events   self.connect('delete-event', self._delete)   self.connect('response', self._response)     if configrepo:   self.ui = repo.ui   name = repo.ui.config('web', 'name') or os.path.basename(repo.root)   self.rcpath = [os.sep.join([repo.root, '.hg', 'hgrc'])]   self.set_title(_('TortoiseHg Configure Repository - ') + name)   shlib.set_tortoise_icon(self, 'settings_repo.ico')   self.root = repo.root   else:   self.rcpath = util.user_rcpath()   self.set_title(_('TortoiseHg Configure User-Global Settings'))   shlib.set_tortoise_icon(self, 'settings_user.ico')   self.root = None     self.ini = self.load_config(self.rcpath)     # Create a new notebook, place the position of the tabs   self.notebook = notebook = gtk.Notebook()   notebook.set_tab_pos(gtk.POS_TOP)   self.vbox.pack_start(notebook, True, True)   notebook.show()   self.show_tabs = True   self.show_border = True     self._btn_apply = gtk.Button(_('Apply'))   self._btn_apply.connect('clicked', self._apply_clicked)   self.action_area.pack_end(self._btn_apply)     self.dirty = False   self.pages = []   self.tooltips = gtk.Tooltips()   self.history = shlib.Settings('config_history')     # create pages for each section of configuration file   self.tortoise_frame = self.add_page(notebook, 'TortoiseHG')   self.fill_frame(self.tortoise_frame, _tortoise_info)     self.commit_frame = self.add_page(notebook, _('Commit'))   self.fill_frame(self.commit_frame, _commit_info)     self.log_frame = self.add_page(notebook, _('Changelog'))   self.fill_frame(self.log_frame, _log_info)     self.paths_frame = self.add_page(notebook, _('Synch'))   vbox = self.fill_frame(self.paths_frame, _paths_info)   self.fill_path_frame(vbox)     self.web_frame = self.add_page(notebook, _('Web'))   self.fill_frame(self.web_frame, _web_info)     self.proxy_frame = self.add_page(notebook, _('Proxy'))   self.fill_frame(self.proxy_frame, _proxy_info)     self.email_frame = self.add_page(notebook, _('Email'))   self.fill_frame(self.email_frame, _email_info)     self.diff_frame = self.add_page(notebook, _('Diff'))   self.fill_frame(self.diff_frame, _diff_info)     if not configrepo and os.name == 'nt':   self.shellframe = self.add_page(notebook, _('Shell Ext'))   self.fill_shell_frame(self.shellframe)   self.configrepo = configrepo     # Force dialog into clean state in the beginning   self._refresh_vlist()   self._btn_apply.set_sensitive(False)   self.dirty = False     def _delete(self, widget, event):   return True     def _response(self, widget, response_id):   if self.dirty:   if question_dialog(self, _('Quit without saving?'),   _('Yes to abandon changes, No to continue')) != gtk.RESPONSE_YES:   widget.emit_stop_by_name('response')     def focus_field(self, focusfield):   '''Set page and focus to requested datum'''   for page_num, (vbox, info, widgets) in enumerate(self.pages):   for w, (label, cpath, values, tip) in enumerate(info):   if cpath == focusfield:   self.notebook.set_current_page(page_num)   widgets[w].grab_focus()   return     def new_path(self, newpath):   '''Add a new path to [paths], give default name, focus'''   i = self.pathdata.insert_before(None, None)   self.pathdata.set_value(i, 0, 'new')   self.pathdata.set_value(i, 1, '%s' % toutf(url.hidepassword(newpath)))   self.pathdata.set_value(i, 2, '%s' % toutf(newpath))   self.pathtree.get_selection().select_iter(i)   self.pathtree.set_cursor(   self.pathdata.get_path(i),   self.pathtree.get_column(0))   self.refresh_path_list()   # This method may be called from hggtk.sync, so ensure page is visible   self.notebook.set_current_page(3)   self.dirty_event()     def dirty_event(self, *args):   if not self.dirty:   self._btn_apply.set_sensitive(True)   self.dirty = True     def _add_path(self, *args):   self.new_path('http://')     def _edit_path(self, *args):   selection = self.pathtree.get_selection()   if not selection.count_selected_rows():   return   model, path = selection.get_selected()   dialog = PathEditDialog(model[path][2], model[path][0])   dialog.run()   if dialog.newpath:   model[path][0] = dialog.newalias   model[path][1] = url.hidepassword(dialog.newpath)   model[path][2] = dialog.newpath   self.dirty_event()     def _remove_path(self, *args):   selection = self.pathtree.get_selection()   if not selection.count_selected_rows():   return   model, path = selection.get_selected()   next_iter = self.pathdata.iter_next(path)   del self.pathdata[path]   if next_iter:   selection.select_iter(next_iter)   elif len(self.pathdata):   selection.select_path(len(self.pathdata) - 1)   self.refresh_path_list()   self.dirty_event()     def _test_path(self, *args):   selection = self.pathtree.get_selection()   if not selection.count_selected_rows():   return   if not self.root:   error_dialog(self, _('No Repository Found'),   _('Path testing cannot work without a repository'))   return   model, path = selection.get_selected()   testpath = fromutf(model[path][1])   if not testpath:   return   if testpath[0] == '~':   testpath = os.path.expanduser(testpath)   cmdline = ['hg', 'incoming', '--verbose', testpath]   from hgcmd import CmdDialog   dlg = CmdDialog(cmdline)   dlg.run()   dlg.hide()     def _pathtree_changed(self, sel):   self.refresh_path_list()     def refresh_path_list(self):   """Update sensitivity of buttons"""   path_selected = (len(self.pathdata) > 0   and self.pathtree.get_selection().count_selected_rows() > 0)   repo_available = self.root is not None   self._editpathbutton.set_sensitive(path_selected)   self._delpathbutton.set_sensitive(path_selected)   self._testpathbutton.set_sensitive(repo_available and path_selected)     def fill_path_frame(self, frvbox):   frame = gtk.Frame(_('Remote repository paths'))   frame.set_border_width(10)   frvbox.pack_start(frame, True, True, 2)   vbox = gtk.VBox()   vbox.set_border_width(5)   frame.add(vbox)     # Initialize data model for 'Paths' tab   self.pathdata = gtk.ListStore(str, str, str)   if 'paths' in list(self.ini):   for name in self.ini['paths']:   path = self.ini['paths'][name]   safepath = toutf(url.hidepassword(path))   self.pathdata.append([toutf(name), safepath, toutf(path)])     # Define view model for 'Paths' tab   self.pathtree = gtk.TreeView(self.pathdata)   self.pathtree.set_enable_search(False)   self.pathtree.connect("cursor-changed", self._pathtree_changed)     renderer = gtk.CellRendererText()   column = gtk.TreeViewColumn(_('Alias'), renderer, text=0)   self.pathtree.append_column(column)     renderer = gtk.CellRendererText()   column = gtk.TreeViewColumn(_('Repository Path'), renderer, text=1)   self.pathtree.append_column(column)     scrolledwindow = gtk.ScrolledWindow()   scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)   scrolledwindow.add(self.pathtree)   vbox.add(scrolledwindow)     buttonbox = gtk.HBox()   self.addButton = gtk.Button(_('_Add'))   self.addButton.set_use_underline(True)   self.addButton.connect('clicked', self._add_path)   buttonbox.pack_start(self.addButton)     self._editpathbutton = gtk.Button(_('_Edit'))   self._editpathbutton.set_use_underline(True)   self._editpathbutton.connect('clicked', self._edit_path)   buttonbox.pack_start(self._editpathbutton)     self._delpathbutton = gtk.Button(_('_Remove'))   self._delpathbutton.set_use_underline(True)   self._delpathbutton.connect('clicked', self._remove_path)   buttonbox.pack_start(self._delpathbutton)     self._testpathbutton = gtk.Button(_('_Test'))   self._testpathbutton.set_use_underline(True)   self._testpathbutton.connect('clicked', self._test_path)   buttonbox.pack_start(self._testpathbutton)     vbox.pack_start(buttonbox, False, False, 4)   self.refresh_path_list()     def set_help(self, widget, event, buffer, tooltip):   text = ' '.join(tooltip.splitlines())   buffer.set_text(text)     def fill_shell_frame(self, frame):   'Fill special tab for shell extension configurations'   vbox = gtk.VBox()   frame.add(vbox)     # Text entry for supported applications   hbox = gtk.HBox()   vbox.pack_start(hbox, False, False, 2)   lbl = gtk.Label(_('Supported applications:'))   hbox.pack_start(lbl, False, False, 10)   self.shellapps = gtk.Entry()   hbox.pack_start(self.shellapps, True, True, 10)     ovframe = gtk.Frame(_('Overlay configuration'))   ovframe.set_border_width(10)   vbox.pack_start(ovframe, False, False, 2)   ovcvbox = gtk.VBox()   ovframe.add(ovcvbox)   hbox = gtk.HBox()   ovcvbox.pack_start(hbox, False, False, 2)   self.ovenable = gtk.CheckButton(_('Enable overlays'))   hbox.pack_start(self.ovenable, False, False, 2)   self.ovenable.connect('toggled', self.ovenable_toggled)   self.lclonly = gtk.CheckButton(_('Local disks only'))   hbox.pack_start(self.lclonly, False, False, 2)   self.ovdebug = gtk.CheckButton(_('Enable debug logging'))   hbox.pack_start(self.ovdebug, False, False, 2)   table = gtk.Table(2, 2, False)   ovcvbox.pack_start(table, False, False, 2)     # Text entry for overlay include path   lbl = gtk.Label(_('Include path:'))   lbl.set_alignment(1.0, 0.0)   self.ovinclude = gtk.Entry()   table.attach(lbl, 0, 1, 0, 1, gtk.FILL, 0, 4, 3)   table.attach(self.ovinclude, 1, 2, 0, 1, gtk.FILL|gtk.EXPAND, 0, 4, 3)     # Text entry for overlay include path   lbl = gtk.Label(_('Exclude path:'))   lbl.set_alignment(1.0, 0.0)   self.ovexclude = gtk.Entry()   table.attach(lbl, 0, 1, 1, 2, gtk.FILL, 0, 4, 3)   table.attach(self.ovexclude, 1, 2, 1, 2, gtk.FILL|gtk.EXPAND, 0, 4, 3)     cmframe = gtk.Frame(_('Context menu configuration'))   cmframe.set_border_width(10)   vbox.pack_start(cmframe, False, False, 2)   cmcvbox = gtk.VBox()   cmframe.add(cmcvbox)     descframe = gtk.Frame(_('Description'))   descframe.set_border_width(10)   desctext = gtk.TextView()   desctext.set_wrap_mode(gtk.WRAP_WORD)   desctext.set_editable(False)   scrolledwindow = gtk.ScrolledWindow()   scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)   scrolledwindow.add(desctext)   descframe.add(scrolledwindow)   vbox.pack_start(gtk.Label(), True, True, 2)   vbox.pack_start(descframe, False, False, 2)     self.cmdebug = gtk.CheckButton(_('Enable debug logging'))   cmcvbox.pack_start(self.cmdebug, False, False, 2)     lbl = gtk.Label(_('Promote menu items to the top menu'))   cmcvbox.pack_start(lbl, False, False, 2)     rows = (len(shellcmds) + 2) / 3   table = gtk.Table(rows, 3, False)   cmcvbox.pack_start(table, False, False, 2)   self.cmptoggles = {}   for i, cmd in enumerate(shellcmds):   row, col = divmod(i, 3)   check = gtk.CheckButton(cmd)   table.attach(check, col, col+1,   row, row+1, gtk.FILL|gtk.EXPAND, 0, 4, 3)   self.cmptoggles[cmd] = check   tooltip = _('Promote menu item "%s" to top menu') % cmd   check.connect('toggled', self.dirty_event)   check.connect('focus-in-event', self.set_help,   desctext.get_buffer(), tooltip)     tooltip = _('A comma (,) separated list of applications that'   ' the shell extensions will support. If unspecified,'   ' it defaults to asterisk (*), supporting all apps')   self.shellapps.connect('changed', self.dirty_event)   self.shellapps.connect('focus-in-event', self.set_help,   desctext.get_buffer(), tooltip)   tooltip = _('Enable/Disable the overlay icons globally')   self.ovenable.connect('focus-in-event', self.set_help,   desctext.get_buffer(), tooltip)   tooltip = _('Only enable overlays on local disks')   self.lclonly.connect('toggled', self.dirty_event)   self.lclonly.connect('focus-in-event', self.set_help,   desctext.get_buffer(), tooltip)   tooltip = _('Enable the overlay code to emit debug messages'   ' that the TortoiseHg tracelog application can receive.')   self.ovdebug.connect('toggled', self.dirty_event)   self.ovdebug.connect('focus-in-event', self.set_help,   desctext.get_buffer(), tooltip)   tooltip = _('A list of semicolon (;) separated paths that the'   ' overlays will respect. This include filter is applied'   ' after the local disk check. If unspecified, the default'   ' is to display in all repositories.')   self.ovinclude.connect('changed', self.dirty_event)   self.ovinclude.connect('focus-in-event', self.set_help,   desctext.get_buffer(), tooltip)   tooltip = _('A list of semicolon (;) separated paths that are'   ' excluded by the overlay system. This exclude filter is'   ' applied after the local disk check and include filters.'   ' So there is no need to exclude paths outside of your'   ' include filter. Default is no exclusion.')   self.ovexclude.connect('changed', self.dirty_event)   self.ovexclude.connect('focus-in-event', self.set_help,   desctext.get_buffer(), tooltip)   tooltip = _('Enable the context menu code to emit debug messages'   ' that the TortoiseHg tracelog application can receive.')   self.cmdebug.connect('toggled', self.dirty_event)   self.cmdebug.connect('focus-in-event', self.set_help,   desctext.get_buffer(), tooltip)   self.load_shell_configs()     def load_shell_configs(self):   shellapps = '*'   includepath = ''   excludepath = ''   overlayenable = True   overlaydebug = False   localdisks = False   cmenudebug = False   promoteditems = 'commit'   try:   from _winreg import HKEY_CURRENT_USER, OpenKey, QueryValueEx   hkey = OpenKey(HKEY_CURRENT_USER, r"Software\TortoiseHg")   t = ('1', 'True')   try: shellapps = QueryValueEx(hkey, 'ShellApps')[0]   except EnvironmentError: pass   try: overlayenable = QueryValueEx(hkey, 'EnableOverlays')[0] in t   except EnvironmentError: pass   try: localdisks = QueryValueEx(hkey, 'LocalDisksOnly')[0] in t   except EnvironmentError: pass   try: overlaydebug = QueryValueEx(hkey, 'OverlayDebug')[0] in t   except EnvironmentError: pass   try: includepath = QueryValueEx(hkey, 'IncludePath')[0]   except EnvironmentError: pass   try: excludepath = QueryValueEx(hkey, 'ExcludePath')[0]   except EnvironmentError: pass   try: cmenudebug = QueryValueEx(hkey, 'ContextMenuDebug')[0] in t   except EnvironmentError: pass   try: promoteditems = QueryValueEx(hkey, 'PromotedItems')[0]   except EnvironmentError: pass   except (ImportError, WindowsError):   pass     self.shellapps.set_text(shellapps)   self.ovenable.set_active(overlayenable)   self.lclonly.set_active(localdisks)   self.ovdebug.set_active(overlaydebug)   self.ovinclude.set_text(includepath)   self.ovexclude.set_text(excludepath)   self.cmdebug.set_active(cmenudebug)   promoted = [pi.strip() for pi in promoteditems.split(',')]   for cmd, check in self.cmptoggles.iteritems():   check.set_active(cmd in promoted)     def save_shell_configs(self):   shellapps = self.shellapps.get_text()   overlayenable = self.ovenable.get_active() and '1' or '0'   localdisks = self.lclonly.get_active() and '1' or '0'   overlaydebug = self.ovdebug.get_active() and '1' or '0'   includepath = self.ovinclude.get_text()   excludepath = self.ovexclude.get_text()   cmenudebug = self.cmdebug.get_active() and '1' or '0'   promoted = []   for cmd, check in self.cmptoggles.iteritems():   if check.get_active():   promoted.append(cmd)   try:   from _winreg import HKEY_CURRENT_USER, CreateKey, SetValueEx, REG_SZ   hkey = CreateKey(HKEY_CURRENT_USER, r"Software\TortoiseHg")   SetValueEx(hkey, 'ShellApps', 0, REG_SZ, shellapps)   SetValueEx(hkey, 'EnableOverlays', 0, REG_SZ, overlayenable)   SetValueEx(hkey, 'LocalDisksOnly', 0, REG_SZ, localdisks)   SetValueEx(hkey, 'OverlayDebug', 0, REG_SZ, overlaydebug)   SetValueEx(hkey, 'IncludePath', 0, REG_SZ, includepath)   SetValueEx(hkey, 'ExcludePath', 0, REG_SZ, excludepath)   SetValueEx(hkey, 'ContextMenuDebug', 0, REG_SZ, cmenudebug)   SetValueEx(hkey, 'PromotedItems', 0, REG_SZ, ','.join(promoted))   except ImportError:   pass     def ovenable_toggled(self, check):   self.lclonly.set_sensitive(check.get_active())   self.ovdebug.set_sensitive(check.get_active())   self.ovinclude.set_sensitive(check.get_active())   self.ovexclude.set_sensitive(check.get_active())   self.dirty_event()     def fill_frame(self, frame, info):   widgets = []     descframe = gtk.Frame(_('Description'))   descframe.set_border_width(10)   desctext = gtk.TextView()   desctext.set_wrap_mode(gtk.WRAP_WORD)   desctext.set_editable(False)   scrolledwindow = gtk.ScrolledWindow()   scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)   scrolledwindow.add(desctext)   descframe.add(scrolledwindow)     vbox = gtk.VBox()   table = gtk.Table(len(info), 2, False)   vbox.pack_start(table, False, False, 2)   if info != _paths_info:   vbox.pack_start(gtk.Label(), True, True, 2)   vbox.pack_start(descframe, False, False, 2)   frame.add(vbox)     for row, (label, cpath, values, tooltip) in enumerate(info):   vlist = gtk.ListStore(str, bool)   combo = gtk.ComboBoxEntry(vlist, 0)   combo.connect('changed', self.dirty_event)   combo.child.connect('focus-in-event', self.set_help,   desctext.get_buffer(), tooltip)   combo.set_row_separator_func(lambda model, path: model[path][1])   combo.child.set_width_chars(40)   if cpath in _pwfields:   combo.child.set_visibility(False)   widgets.append(combo)     lbl = gtk.Label(label + ':')   lbl.set_alignment(1.0, 0.0)   eventbox = gtk.EventBox()   eventbox.set_visible_window(False)   eventbox.add(lbl)   table.attach(eventbox, 0, 1, row, row+1, gtk.FILL, 0, 4, 3)   table.attach(combo, 1, 2, row, row+1, gtk.FILL|gtk.EXPAND, 0, 4, 3)   self.tooltips.set_tip(eventbox, tooltip)     self.pages.append((vbox, info, widgets))   return vbox     def _refresh_vlist(self):   for vbox, info, widgets in self.pages:   for row, (label, cpath, values, tooltip) in enumerate(info):   ispw = cpath in _pwfields   combo = widgets[row]   vlist = combo.get_model()   vlist.clear()     # Get currently configured value from this config file   curvalue = self.get_ini_config(cpath)     if cpath == 'tortoisehg.vdiff':   # Special case, add extdiff.cmd.* to possible values   for name, value in self.ui.configitems('extdiff'):   if name.startswith('cmd.'):   if name[4:] not in values:   values.append(name[4:])   elif not name.startswith('opts.'):   if name not in values:   values.append(name)   elif cpath == 'ui.merge':   # Special case, add [merge-tools] to possible values   try:   from mercurial import filemerge   tools = []   for key, value in self.ui.configitems('merge-tools'):   t = key.split('.')[0]   if t not in tools:   tools.append(t)   for t in tools:   # Ensure the tool is installed   if filemerge._findtool(self.ui, t):   values.append(t)   values.append('internal:merge')   except ImportError:   pass     currow = None   if not ispw:   vlist.append([_unspecstr, False])   if values:   vlist.append([_('Suggested'), True])   for v in values:   vlist.append([toutf(v), False])   if v == curvalue:   currow = len(vlist) - 1   if cpath in self.history.get_keys() and not ispw:   separator = False   for v in self.history.mrul(cpath):   if v in values: continue   if not separator:   vlist.append([_('History'), True])   separator = True   vlist.append([toutf(v), False])   if v == curvalue:   currow = len(vlist) - 1     if curvalue is None and len(vlist):   combo.set_active(0)   elif currow is None and curvalue:   combo.child.set_text(toutf(curvalue))   elif currow:   combo.set_active(currow)     def add_page(self, notebook, tab):   frame = gtk.Frame()   frame.set_border_width(10)   frame.show()     label = gtk.Label(tab)   notebook.append_page(frame, label)   return frame     def get_ini_config(self, cpath):   '''Retrieve a value from the parsed config file'''   try:   # Presumes single section/key level depth   section, key = cpath.split('.', 1)   return self.ini[section][key]   except KeyError:   return None     def load_config(self, rcpath):   for fn in rcpath:   if os.path.exists(fn):   break   else:   fn = rcpath[0]   f = open(fn, 'w')   f.write(_('# Generated by tortoisehg-config\n'))   f.close()   self.fn = fn   return iniparse.INIConfig(file(fn), optionxformvalue=None)     def record_new_value(self, cpath, newvalue, keephistory=True):   section, key = cpath.split('.', 1)   if newvalue == _unspecstr or newvalue == '':   try:   del self.ini[section][key]   except KeyError:   pass   return   if section not in list(self.ini):   self.ini.new_namespace(section)   self.ini[section][key] = newvalue   if not keephistory:   return   if cpath not in self.history.get_keys():   self.history.set_value(cpath, [])   elif newvalue in self.history.get_keys():   self.history.get_value(cpath).remove(newvalue)   self.history.mrul(cpath).add(newvalue)     def _apply_clicked(self, *args):   # Reload history, since it may have been modified externally   self.history.read()     # flush changes on paths page   if len(self.pathdata):   refreshlist = []   for row in self.pathdata:   name = fromutf(row[0])   path = fromutf(row[2])   cpath = '.'.join(['paths', name])   self.record_new_value(cpath, path, False)   refreshlist.append(name)   if 'paths' not in list(self.ini):   self.ini.new_namespace('paths')   for name in list(self.ini.paths):   if name not in refreshlist:   del self.ini['paths'][name]   elif 'paths' in list(self.ini):   for name in list(self.ini.paths):   del self.ini['paths'][name]     # Flush changes on all pages   for vbox, info, widgets in self.pages:   for w, (label, cpath, values, tip) in enumerate(info):   newvalue = fromutf(widgets[w].child.get_text())   self.record_new_value(cpath, newvalue)     self.history.write()   self._refresh_vlist()     try:   f = open(self.fn, "w")   f.write(str(self.ini))   f.close()   except IOError, e:   error_dialog(self, _('Unable to write configuration file'), str(e))     if not self.configrepo and os.name == 'nt':   self.save_shell_configs()   self._btn_apply.set_sensitive(False)   self.dirty = False   return 0   -def run(root='', cmdline=[], files=[], **opts): - dialog = ConfigDialog(root, bool(files)) +def run(ui, *pats, **opts): + dialog = ConfigDialog(opts.get('repomode') or False)   dialog.show_all()   dialog.connect('response', gtk.main_quit) - if '--focusfield' in cmdline: - field = cmdline[cmdline.index('--focusfield')+1] - dialog.focus_field(field)   gtk.gdk.threads_init()   gtk.gdk.threads_enter()   gtk.main()   gtk.gdk.threads_leave() - -if __name__ == "__main__": - # example command lines - # python hggtk/thgconfig.py --focusfield ui.editor - # python hggtk/thgconfig.py --focusfield paths.default --configrepo - import sys - opts = {} - opts['root'] = os.getcwd() - opts['cmdline'] = sys.argv - opts['files'] = '--configrepo' in sys.argv and ['.'] or [] - run(**opts)
 
208
209
210
 
 
 
 
 
 
 
 
 
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
 
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
 
 
 
 
 
208
209
210
211
212
213
214
215
216
217
218
219
220
 
 
 
 
 
 
 
 
 
 
 
 
 
 
221
222
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
224
225
226
@@ -208,40 +208,19 @@
  self._activate_shelve_buttons(True)   return True   +def run(_ui, *pats, **opts): + cmdoptions = { + 'user':opts.get('user', ''), 'date':opts.get('date', ''), + 'logfile':'', 'message':'', + 'modified':True, 'added':True, 'removed':True, 'deleted':True, + 'unknown':True, 'ignored':False, + 'exclude':[], 'include':[], + 'check': True, 'git':False, 'addremove':False, + }   -def launch(root='', files=[], cwd='', main=True): - u = ui.ui() - u.updateopts(debug=False, traceback=False) - repo = hg.repository(u, path=root) - - cmdoptions = { - 'user':'', 'date':'', - 'modified':True, 'added':True, 'removed':True, 'deleted':True, - 'unknown':False, 'ignored':False, - 'exclude':[], 'include':[], - 'check': True, 'git':False, 'logfile':'', 'addremove':False, - } - - dialog = GShelve(u, repo, cwd, files, cmdoptions, main) + dialog = GShelve(_ui, None, None, pats, cmdoptions, True)   dialog.display() - return dialog - -def run(root='', files=[], cwd='', **opts): - # If no files or directories were selected, take current dir - # TODO: Not clear if this is best; user may expect repo wide - if not files and cwd: - files = [cwd] - if launch(root, files, cwd, True): - gtk.gdk.threads_init() - gtk.gdk.threads_enter() - gtk.main() - gtk.gdk.threads_leave() - -if __name__ == "__main__": - import sys - from hglib import rootpath - - opts = {} - opts['cwd'] = len(sys.argv) > 1 and sys.argv[1] or os.getcwd() - opts['root'] = rootpath(opts['cwd']) - run(**opts) + gtk.gdk.threads_init() + gtk.gdk.threads_enter() + gtk.main() + gtk.gdk.threads_leave()
Change 1 of 3 Show Entire File hggtk/​update.py Stacked
 
17
18
19
20
 
21
22
23
24
25
 
26
27
28
 
33
34
35
36
 
37
38
39
 
179
180
181
182
 
183
184
185
 
 
186
187
188
189
190
191
192
193
194
195
196
197
198
 
17
18
19
 
20
21
22
23
 
 
24
25
26
27
 
32
33
34
 
35
36
37
38
 
178
179
180
 
181
182
 
 
183
184
185
186
187
188
189
190
 
 
 
 
 
 
 
@@ -17,12 +17,11 @@
   class UpdateDialog(gtk.Window):   """ Dialog to update Mercurial repo """ - def __init__(self, cwd='', rev=None): + def __init__(self, rev=None):   """ Initialize the Dialog """   gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)   set_tortoise_icon(self, 'menucheckout.ico') - self.cwd = cwd or os.getcwd() - self.root = rootpath(self.cwd) + self.root = rootpath()   self.rev = rev   self.notify_func = None   @@ -33,7 +32,7 @@
  return None     # set dialog title - title = "hg update - %s" % toutf(self.cwd) + title = "hg update - %s" % toutf(self.root)   self.set_title(title)     self._create() @@ -179,20 +178,13 @@
  if self.notify_func:   self.notify_func(self.notify_args)   self._refresh() - shell_notify([self.cwd]) + shell_notify([self.root])   -def run(cwd='', rev=None, **opts): - dialog = UpdateDialog(cwd, rev) +def run(ui, *pats, **opts): + dialog = UpdateDialog()   dialog.connect('destroy', gtk.main_quit)   dialog.show_all()   gtk.gdk.threads_init()   gtk.gdk.threads_enter()   gtk.main()   gtk.gdk.threads_leave() - -if __name__ == "__main__": - import sys - opts = {} - opts['cwd'] = len(sys.argv) > 1 and sys.argv[1] or '' - #opts['rev'] = 123 - run(**opts)
Change 1 of 3 Show Entire File hggtk/​visdiff.py Stacked
 
47
48
49
50
 
51
52
53
 
121
122
123
124
 
125
126
127
 
256
257
258
259
260
 
 
 
 
 
 
261
262
263
 
47
48
49
 
50
51
52
53
 
121
122
123
 
124
125
126
127
 
256
257
258
 
 
259
260
261
262
263
264
265
266
267
@@ -47,7 +47,7 @@
   class FileSelectionDialog(gtk.Dialog):   'Dialog for selecting visual diff candidates' - def __init__(self, pats, opts): + def __init__(self, canonpats, opts):   'Initialize the Dialog'   gtk.Dialog.__init__(self)   self.set_title('Visual Diffs') @@ -121,7 +121,7 @@
  cwd = os.getcwd()   try:   os.chdir(repo.root) - self.find_files(repo, pats, opts, model) + self.find_files(repo, canonpats, opts, model)   finally:   os.chdir(cwd)   else: @@ -256,8 +256,12 @@
  Prompt(_('Tool launch failure'),   _('%s : %s') % (self.diffpath, str(e)), None).run()   -def run(pats, **opts): - dialog = FileSelectionDialog(pats, opts) +def run(ui, *pats, **opts): + root = rootpath() + canonpats = [] + for f in pats: + canonpats.append(util.canonpath(root, os.getcwd(), f)) + dialog = FileSelectionDialog(canonpats, opts)   dialog.connect('destroy', gtk.main_quit)   dialog.show_all()   gtk.gdk.threads_init()