Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 2.1, 2.1.1, and 2.1.2

reporegistry: do not pass workbench reference down into the registry

Moved openshell() to qtlib; terminal shell configuration is now global
removed obsolete goto() method from Workbench

Changeset 12da60da0b10

Parent e7e80b1e5ca3

by Steve Borho

Changes to 7 files · Browse files at 12da60da0b10 Showing diff from parent e7e80b1e5ca3 Diff from another changeset...

 
154
155
156
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
158
159
 
184
185
186
 
 
187
188
189
 
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
 
210
211
212
213
214
215
216
217
@@ -154,6 +154,32 @@
  hglib.tounicode(str(e))))   return False   +_user_shell = None +def openshell(root): + global _user_shell + if _user_shell: + cwd = os.getcwd() + try: + os.chdir(repo.root) + QProcess.startDetached(_user_shell) + finally: + os.chdir(cwd) + else: + InfoMsgBox(_('No shell configured'), + _('A terminal shell must be configured')) + +def configureshell(ui): + global _user_shell + _user_shell = ui.config('tortoisehg', 'shell') + if _user_shell: + return + if sys.platform == 'darwin': + return # Terminal.App does not support open-to-folder + elif os.name == 'nt': + _user_shell = 'cmd.exe' + else: + _user_shell = 'xterm' +  # _styles maps from ui labels to effects  # _effects maps an effect to font style properties. We define a limited  # set of _effects, since we convert color effect names to font style @@ -184,6 +210,8 @@
 thgstylesheet = '* { white-space: pre; font-family: monospace; font-size: 9pt; }'    def configstyles(ui): + configureshell(ui) +   # extensions may provide more labels and default effects   for name, ext in extensions.extensions():   _styles.update(getattr(ext, 'colortable', {}))
 
9
10
11
12
13
14
 
15
16
17
 
24
25
26
 
 
27
28
29
30
 
31
32
33
34
35
 
72
73
74
75
 
76
77
78
 
80
81
82
 
83
84
85
 
86
87
88
 
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
 
187
188
189
190
 
191
192
 
193
194
195
196
197
198
199
 
200
201
202
203
204
205
206
 
207
208
209
 
218
219
220
 
221
222
223
224
 
 
225
226
227
 
234
235
236
237
238
239
240
 
 
 
241
242
243
244
245
 
 
246
247
248
 
258
259
260
261
262
 
 
263
264
265
 
9
10
11
 
 
 
12
13
14
15
 
22
23
24
25
26
27
28
29
 
30
31
 
32
33
34
 
71
72
73
 
74
75
76
77
 
79
80
81
82
83
84
 
85
86
87
88
 
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
 
194
195
196
 
197
198
 
199
200
201
202
203
204
205
 
206
207
208
209
210
211
 
 
212
213
214
215
 
224
225
226
227
228
229
 
 
230
231
232
233
234
 
241
242
243
 
 
 
 
244
245
246
247
 
248
249
250
251
252
253
254
255
 
265
266
267
 
 
268
269
270
271
272
@@ -9,9 +9,7 @@
   from tortoisehg.util import hglib  from tortoisehg.hgqt.i18n import _ -from tortoisehg.hgqt import qtlib, thgrepo -from tortoisehg.hgqt.repotreemodel import RepoTreeModel -from tortoisehg.hgqt.clone import CloneDialog +from tortoisehg.hgqt import qtlib, repotreemodel, clone, settings    from PyQt4.QtCore import *  from PyQt4.QtGui import * @@ -24,12 +22,13 @@
     class RepoTreeView(QTreeView): + showMessage = pyqtSignal(QString) + openRepo = pyqtSignal(QString, bool)     contextmenu = None   - def __init__(self, parent, workbench): + def __init__(self, parent):   QTreeView.__init__(self, parent, allColumnsShowFocus=True) - self.workbench = workbench   self.selitem = None   self.msg = ''   @@ -72,7 +71,7 @@
  if idx.isValid():   item = idx.internalPointer()   self.msg = item.details() - self.workbench.showMessage(self.msg) + self.showMessage.emit(self.msg)   super(RepoTreeView, self).mouseMoveEvent(event)     def keyPressEvent(self, event): @@ -80,9 +79,10 @@
  self.showFirstTabOrOpen()   else:   super(RepoTreeView, self).keyPressEvent(event) +   def leaveEvent(self, event):   if self.msg != '': - self.workbench.showMessage('') + self.showMessage.emit('')     def mouseDoubleClickEvent(self, event):   if self.selitem and self.selitem.internalPointer().details(): @@ -145,27 +145,34 @@
  def startSettings(self):   if not self.selitem:   return - self.selitem.internalPointer().startSettings(self.parent()) + root = self.selitem.internalPointer().rootpath() + sd = settings.SettingsDialog(configrepo=True, focus='web.name', + parent=self, root=root) + sd.exec_()     def startRename(self):   if not self.selitem:   return   self.edit(self.selitem)   - def open(self): - if not self.selitem: - return - self.selitem.internalPointer().open() -   def openAll(self):   if not self.selitem:   return   self.selitem.internalPointer().openAll()   - def showFirstTabOrOpen(self): + def open(self): + 'open context menu action, open repowidget unconditionally'   if not self.selitem:   return - self.selitem.internalPointer().showFirstTabOrOpen(workbench=self.workbench) + root = self.selitem.internalPointer().rootpath() + self.openRepo.emit(hglib.tounicode(root), False) + + def showFirstTabOrOpen(self): + 'Enter or double click events, show existing or open a new repowidget' + if not self.selitem: + return + root = self.selitem.internalPointer().rootpath() + self.openRepo.emit(hglib.tounicode(root), True)     def newGroup(self):   m = self.model() @@ -187,23 +194,22 @@
  if not self.selitem:   return   root = self.selitem.internalPointer().rootpath() - d = CloneDialog(args=[root, root + '-clone'], parent=self) + d = clone.CloneDialog(args=[root, root + '-clone'], parent=self)   d.finished.connect(d.deleteLater) - d.clonedRepository.connect(self.workbench.showRepo) + d.clonedRepository.connect(self.open)   d.show()     def explore(self):   if not self.selitem:   return   root = self.selitem.internalPointer().rootpath() - self.workbench.launchExplorer(root) + QDesktopServices.openUrl(QUrl.fromLocalFile(root))     def terminal(self):   if not self.selitem:   return   root = self.selitem.internalPointer().rootpath() - repo = thgrepo.repository(path=root) - self.workbench.launchTerminal(repo) + qtlib.openshell(root)     def addRepo(self):   if not self.selitem: @@ -218,10 +224,11 @@
   class RepoRegistryView(QDockWidget):   + showMessage = pyqtSignal(QString)   openRepoSignal = pyqtSignal(QString, bool)   - def __init__(self, workbench): - QDockWidget.__init__(self, workbench) + def __init__(self, parent): + QDockWidget.__init__(self, parent)     self.setFeatures(QDockWidget.DockWidgetClosable |   QDockWidget.DockWidgetMovable | @@ -234,15 +241,15 @@
  mainframe.setLayout(lay)   self.setWidget(mainframe)   - self.tmodel = m = RepoTreeModel(self.openrepo, settingsfilename(), - parent=self) - - self.tview = tv = RepoTreeView(self, workbench) + self.tmodel = m = repotreemodel.RepoTreeModel(settingsfilename(), self) + self.tview = tv = RepoTreeView(self) + tv.setModel(m)   lay.addWidget(tv) - tv.setModel(m)     tv.setIndentation(10)   tv.setFirstColumnSpanned(0, QModelIndex(), True) + tv.openRepo.connect(self.openRepo) + tv.showMessage.connect(self.showMessage)     self.tview.setColumnHidden(1, True)   QTimer.singleShot(0, self.expand) @@ -258,8 +265,8 @@
  else:   it.ensureRepoLoaded()   - def openrepo(self, path, reuse=False): - self.openRepoSignal.emit(hglib.tounicode(path), reuse) + def openRepo(self, path, reuse=False): + self.openRepoSignal.emit(path, reuse)     def showPaths(self, show):   self.tview.setColumnHidden(1, not show)
 
60
61
62
63
 
 
64
65
66
67
68
69
70
 
60
61
62
 
63
64
65
66
 
 
67
68
69
@@ -60,11 +60,10 @@
  yield undumpObject(xr, model)    class RepoTreeModel(QAbstractItemModel): - def __init__(self, openrepofunc, filename=None, parent=None): + + def __init__(self, filename, parent):   QAbstractItemModel.__init__(self, parent)   - self.openrepofunc = openrepofunc -   root = None   all = None  
 
370
371
372
373
 
 
374
375
376
 
370
371
372
 
373
374
375
376
377
@@ -370,7 +370,8 @@
  'See <a href="%s">OpenAtLine</a>'   % 'http://bitbucket.org/tortoisehg/thg/wiki/OpenAtLine')),   _fi(_('Shell'), 'tortoisehg.shell', genEditCombo, - _('Specify your preferred terminal shell application')), + _('Specify your preferred terminal shell application'), + globalonly=True),   _fi(_('Immediate Operations'), 'tortoisehg.immediate', genEditCombo,   _('Space separated list of shell operations you would like '   'to be performed immediately, without user interaction. '
 
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
 
 
535
536
537
 
518
519
520
 
 
 
 
 
 
 
 
 
 
 
 
 
 
521
522
523
524
525
@@ -518,20 +518,8 @@
  qtlib.InfoMsgBox(_('Repository not local'),   _('A terminal shell cannot be opened for remote'))   return - shell = self.repo.shell() - if shell: - cwd = os.getcwd() - try: - os.chdir(folder) - QProcess.startDetached(shell) - except EnvironmentError, e: - qtlib.InfoMsgBox(_('Repository not found'), - hglib.tounicode(str(e))) - finally: - os.chdir(cwd) - else: - qtlib.InfoMsgBox(_('No shell configured'), - _('A terminal shell must be configured')) + qtlib.openshell(folder) +   def removeurl(self):   if qtlib.QuestionMsgBox(_('Confirm path delete'),   _('Delete %s from your repo configuration file?') % self.menualias,
 
249
250
251
252
 
253
254
255
 
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
 
459
460
461
462
463
464
465
466
467
468
 
249
250
251
 
252
253
254
255
 
324
325
326
 
 
 
 
 
 
 
 
 
 
 
 
327
328
329
 
447
448
449
 
 
 
 
450
451
452
@@ -249,7 +249,7 @@
  except (EnvironmentError, ValueError):   pass   -_uiprops = '''_uifiles _uimtime _shell postpull tabwidth maxdiff +_uiprops = '''_uifiles _uimtime postpull tabwidth maxdiff   deadbranches _exts _thghiddentags displayname summarylen   shortname mergetools namedbranches'''.split()   @@ -324,18 +324,6 @@
  return n     @propertycache - def _shell(self): - s = self.ui.config('tortoisehg', 'shell') - if s: - return s - if sys.platform == 'darwin': - return None # Terminal.App does not support open-to-folder - elif os.name == 'nt': - return 'cmd.exe' - else: - return 'xterm' - - @propertycache   def _uifiles(self):   cfg = self.ui._ucfg   files = set() @@ -459,10 +447,6 @@
  heads.extend(nodes)   return heads   - def shell(self): - 'Returns terminal shell configured for this repo' - return self._shell -   def uifiles(self):   'Returns latest mtime and complete list of config files'   return self._uimtime, self._uifiles
 
46
47
48
 
 
49
50
51
 
57
58
59
60
61
62
63
64
 
335
336
337
338
339
340
341
342
 
 
 
 
 
343
344
345
 
349
350
351
352
 
353
 
354
355
356
357
358
 
 
 
 
359
360
361
 
553
554
555
556
 
557
558
559
 
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
 
642
643
644
645
 
646
647
648
 
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
 
46
47
48
49
50
51
52
53
 
59
60
61
 
 
62
63
64
 
335
336
337
 
 
 
 
 
338
339
340
341
342
343
344
345
 
349
350
351
 
352
353
354
355
356
 
 
 
357
358
359
360
361
362
363
 
555
556
557
 
558
559
560
561
 
583
584
585
 
586
587
 
 
588
589
590
 
591
592
593
594
 
595
596
597
 
598
599
600
601
 
 
 
 
602
603
604
 
641
642
643
 
644
645
646
647
 
672
673
674
 
675
676
677
678
679
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
680
681
682
683
@@ -46,6 +46,8 @@
    self.reporegistry = rr = RepoRegistryView(self)   rr.setObjectName('RepoRegistryView') + rr.showMessage.connect(self.showMessage) + rr.openRepoSignal.connect(self.openRepo)   rr.hide()   self.addDockWidget(Qt.LeftDockWidgetArea, rr)   @@ -57,8 +59,6 @@
    self._setupActions()   - rr.openRepoSignal.connect(self.openRepo) -   self.repoTabChanged()   self.restoreSettings()   self.setAcceptDrops(True) @@ -335,11 +335,11 @@
  if rw:   rw.switchToNamedTaskTab(str(action.data().toString()))   - def openRepo(self, repopath, reuse=False): - """ Open repo by openRepoSignal from reporegistry """ - if isinstance(repopath, (unicode, QString)): # as Qt slot - repopath = hglib.fromunicode(repopath) - self._openRepo(path=repopath, reuse=reuse) + @pyqtSlot(QString, bool) + def openRepo(self, root, reuse): + """ Open repo by openRepoSignal from reporegistry [unicode] """ + root = hglib.fromunicode(root) + self._openRepo(root, reuse)     @pyqtSlot(QString)   def openLinkedRepo(self, path): @@ -349,13 +349,15 @@
  rw.taskTabsWidget.setCurrentIndex(rw.commitTabIndex)     @pyqtSlot(QString) - def showRepo(self, path): + def showRepo(self, root):   """Activate the repo tab or open it if not available [unicode]""" + root = hglib.fromunicode(root)   for i in xrange(self.repoTabsWidget.count()):   w = self.repoTabsWidget.widget(i) - if hglib.tounicode(w.repo.root) == path: - return self.repoTabsWidget.setCurrentIndex(i) - self.openRepo(path) + if hglib.tounicode(w.repo.root) == root: + self.repoTabsWidget.setCurrentIndex(i) + return + self._openRepo(root, False)     @pyqtSlot(unicode, QString)   def setRevsetFilter(self, path, filter): @@ -553,7 +555,7 @@
  dlg.finished.connect(dlg.deleteLater)   if dlg.exec_():   path = dlg.getPath() - self.openRepo(path) + self._openRepo(path, False)     def cloneRepository(self):   """ Run clone dialog """ @@ -581,25 +583,22 @@
  FD = QFileDialog   path = FD.getExistingDirectory(self, caption, cwd,   FD.ShowDirsOnly | FD.ReadOnly) - self._openRepo(path=hglib.fromunicode(path)) + self._openRepo(hglib.fromunicode(path), False)   - def _openRepo(self, path, reuse=False): - if path and not path.startswith('ssh://'): + def _openRepo(self, root, reuse): + if root and not root.startswith('ssh://'):   if reuse: - for rw in self._findrepowidget(path): + for rw in self._findrepowidget(root): + self.repoTabsWidget.setCurrentWidget(rw)   return   try: - repo = thgrepo.repository(path=path) + repo = thgrepo.repository(path=root)   self.addRepoTab(repo)   except RepoError: - upath = hglib.tounicode(path) + upath = hglib.tounicode(root)   qtlib.WarningMsgBox(_('Failed to open repository'),   _('%s is not a valid repository') % upath)   - def goto(self, root, rev): - for rw in self._findrepowidget(root): - rw.goto(rev) -   def _findrepowidget(self, root):   """Iterates RepoWidget for the specified root"""   tw = self.repoTabsWidget @@ -642,7 +641,7 @@
  save = s.value(wb + 'saveRepos').toBool()   self.actionSaveRepos.setChecked(save)   for path in hglib.fromunicode(s.value(wb + 'openrepos').toString()).split(','): - self._openRepo(path) + self._openRepo(path, False)   # Allow repo registry to assemble itself before toggling path state   sp = s.value(wb + 'showPaths').toBool()   QTimer.singleShot(0, lambda: self.actionShowPaths.setChecked(sp)) @@ -673,29 +672,12 @@
  def explore(self):   w = self.repoTabsWidget.currentWidget()   if w: - self.launchExplorer(w.repo.root) + QDesktopServices.openUrl(QUrl.fromLocalFile(w.repo.root))     def terminal(self):   w = self.repoTabsWidget.currentWidget()   if w: - self.launchTerminal(w.repo) - - def launchExplorer(self, root): - """open Windows Explorer at the repo root""" - QDesktopServices.openUrl(QUrl.fromLocalFile(root)) - - def launchTerminal(self, repo): - shell = repo.shell() - if shell: - cwd = os.getcwd() - try: - os.chdir(repo.root) - QProcess.startDetached(shell) - finally: - os.chdir(cwd) - else: - qtlib.InfoMsgBox(_('No shell configured'), - _('A terminal shell must be configured')) + qtlib.openshell(w.repo.root)     def editSettings(self):   tw = self.repoTabsWidget