Mercurial and Git clients can push and pull from this alias URL to interact with this repository. You can change to which repository an alias points by going to the Aliases link on the project page.
# workbench.py - main TortoiseHg Window## Copyright (C) 2007-2010 Logilab. All rights reserved.## This software may be used and distributed according to the terms# of the GNU General Public License, incorporated herein by reference."""Main Qt4 application for TortoiseHg"""importosimportsysfrommercurialimportuifrommercurial.errorimportRepoErrorfromtortoisehg.utilimportpaths,hglibfromtortoisehg.hgqtimportthgrepo,cmdui,qtlibfromtortoisehg.hgqt.i18nimport_fromtortoisehg.hgqt.repowidgetimportRepoWidgetfromtortoisehg.hgqt.reporegistryimportRepoRegistryViewfromtortoisehg.hgqt.logcolumnsimportColumnSelectDialogfromtortoisehg.hgqt.docklogimportLogDockWidgetfromtortoisehg.hgqt.settingsimportSettingsDialogfromPyQt4.QtCoreimport*fromPyQt4.QtGuiimport*classThgTabBar(QTabBar):defmouseReleaseEvent(self,event):ifevent.button()==Qt.MidButton:self.tabCloseRequested.emit(self.tabAt(event.pos()))super(QTabBar,self).mouseReleaseEvent(event)classWorkbench(QMainWindow):"""hg repository viewer/browser application"""finished=pyqtSignal(int)def__init__(self):QMainWindow.__init__(self)self.ui=ui.ui()self.setupUi()self.setWindowTitle(_('TortoiseHg Workbench'))self.reporegistry=rr=RepoRegistryView(self)rr.setObjectName('RepoRegistryView')rr.showMessage.connect(self.showMessage)rr.openRepo.connect(self.openRepo)rr.hide()self.addDockWidget(Qt.LeftDockWidgetArea,rr)self.log=LogDockWidget(self)self.log.setObjectName('Log')self.log.progressReceived.connect(self.statusbar.progress)self.log.hide()self.addDockWidget(Qt.BottomDockWidgetArea,self.log)self._setupActions()self.repoTabChanged()self.restoreSettings()self.setAcceptDrops(True)ifos.name=='nt':# Allow CTRL+Q to close Workbench on WindowsQShortcut(QKeySequence('CTRL+Q'),self,self.close)ifsys.platform=='darwin':self.dockMenu=QMenu(self)self.dockMenu.addAction(_('New Repository...'),self.newRepository)self.dockMenu.addAction(_('Clone Repository...'),self.cloneRepository)self.dockMenu.addAction(_('Open Repository...'),self.openRepository)qt_mac_set_dock_menu(self.dockMenu)# Create the actions that will be displayed on the context menuself.createActions()self.lastClosedRepoRootList=[]defsetupUi(self):desktopgeom=qApp.desktop().availableGeometry()self.resize(desktopgeom.size()*0.8)self.setWindowIcon(qtlib.geticon('hg-log'))self.repoTabsWidget=tw=QTabWidget()tw.setTabBar(ThgTabBar())tw.setDocumentMode(True)tw.setTabsClosable(True)tw.setMovable(True)tw.tabBar().hide()tw.tabBar().setContextMenuPolicy(Qt.CustomContextMenu)tw.tabBar().customContextMenuRequested.connect(self.tabBarContextMenuRequest)tw.lastClickedTab=-1# No tab clicked yetsp=QSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)sp.setHorizontalStretch(1)sp.setVerticalStretch(1)sp.setHeightForWidth(tw.sizePolicy().hasHeightForWidth())tw.setSizePolicy(sp)tw.tabCloseRequested.connect(self.repoTabCloseRequested)tw.currentChanged.connect(self.repoTabChanged)self.setCentralWidget(tw)self.statusbar=cmdui.ThgStatusBar(self)self.setStatusBar(self.statusbar)def_setupActions(self):"""Setup actions, menus and toolbars"""self.menubar=QMenuBar(self)self.setMenuBar(self.menubar)self.menuFile=self.menubar.addMenu(_("&File"))self.menuView=self.menubar.addMenu(_("&View"))self.menuRepository=self.menubar.addMenu(_("&Repository"))self.menuHelp=self.menubar.addMenu(_("&Help"))self.edittbar=QToolBar(_("Edit Toolbar"),objectName='edittbar')self.addToolBar(self.edittbar)self.docktbar=QToolBar(_("Dock Toolbar"),objectName='docktbar')self.addToolBar(self.docktbar)self.synctbar=QToolBar(_('Sync Toolbar'),objectName='synctbar')self.addToolBar(self.synctbar)self.tasktbar=QToolBar(_('Task Toolbar'),objectName='taskbar')self.addToolBar(self.tasktbar)# availability map of actions; applied by updateMenu()self._actionavails={'repoopen':[]}defkeysequence(o):"""Create QKeySequence from string or QKeySequence"""ifisinstance(o,(QKeySequence,QKeySequence.StandardKey)):returnotry:returngetattr(QKeySequence,str(o))# standard keyexceptAttributeError:returnQKeySequence(o)defmodifiedkeysequence(o,modifier):"""Create QKeySequence of modifier key prepended"""origseq=QKeySequence(keysequence(o))returnQKeySequence('%s+%s'%(modifier,origseq.toString()))defnewaction(text,slot=None,icon=None,shortcut=None,checkable=False,tooltip=None,data=None,enabled=None,menu=None,toolbar=None,parent=self):"""Create new action and register it :slot: function called if action triggered or toggled. :checkable: checkable action. slot will be called on toggled. :data: optional data stored on QAction. :enabled: bool or group name to enable/disable action. :shortcut: QKeySequence, key sequence or name of standard key. :menu: name of menu to add this action. :toolbar: name of toolbar to add this action. """action=QAction(text,parent,checkable=checkable)ifslot:ifcheckable:action.toggled.connect(slot)else:action.triggered.connect(slot)ificon:iftoolbar:action.setIcon(qtlib.geticon(icon))else:action.setIcon(qtlib.getmenuicon(icon))ifshortcut:action.setShortcut(keysequence(shortcut))iftooltip:action.setToolTip(tooltip)ifdataisnotNone:action.setData(data)ifisinstance(enabled,bool):action.setEnabled(enabled)elifenabled:self._actionavails[enabled].append(action)ifmenu:getattr(self,'menu%s'%menu.title()).addAction(action)iftoolbar:getattr(self,'%stbar'%toolbar).addAction(action)returnactiondefnewseparator(menu=None,toolbar=None):"""Insert a separator action; returns nothing"""ifmenu:getattr(self,'menu%s'%menu.title()).addSeparator()iftoolbar:getattr(self,'%stbar'%toolbar).addSeparator()newaction(_("&New Repository..."),self.newRepository,shortcut='New',menu='file',icon='hg-init')newaction(_("Clone Repository..."),self.cloneRepository,shortcut=modifiedkeysequence('New',modifier='Shift'),menu='file',icon='hg-clone')newseparator(menu='file')newaction(_("&Open Repository..."),self.openRepository,shortcut='Open',menu='file')closerepo=newaction(_("&Close Repository"),self.closeRepository,shortcut='Close',enabled='repoopen',menu='file')ifos.name=='nt':sc=closerepo.shortcuts()sc.append(keysequence('Ctrl+W'))closerepo.setShortcuts(sc)newseparator(menu='file')newaction(_('&Settings...'),self.editSettings,icon='settings_user',shortcut='Preferences',menu='file')newseparator(menu='file')newaction(_("E&xit"),self.close,shortcut='Quit',menu='file')a=self.reporegistry.toggleViewAction()a.setText(_('Show Repository Registry'))a.setShortcut('Ctrl+Shift+O')a.setIcon(qtlib.geticon('thg-reporegistry'))self.docktbar.addAction(a)self.menuView.addAction(a)self.actionShowPaths= \
newaction(_("Show Paths"),self.reporegistry.showPaths,checkable=True,menu='view')self.actionShowSubrepos= \
newaction(_("Show Subrepos on Registry"),self.reporegistry.setShowSubrepos,checkable=True,menu='view')self.actionShowNetworkSubrepos= \
newaction(_("Show Subrepos for remote repositories"),self.reporegistry.setShowNetworkSubrepos,checkable=True,menu='view')a=self.log.toggleViewAction()a.setText(_('Show Output &Log'))a.setShortcut('Ctrl+L')a.setIcon(qtlib.geticon('thg-console'))self.docktbar.addAction(a)self.menuView.addAction(a)newseparator(menu='view')newaction(_("Choose Log Columns..."),self.setHistoryColumns,menu='view')self.actionSaveRepos= \
newaction(_("Save Open Repositories On Exit"),checkable=True,menu='view')newseparator(menu='view')self.actionGroupTaskView=QActionGroup(self)self.actionGroupTaskView.triggered.connect(self.onSwitchRepoTaskTab)defaddtaskview(icon,label,name):a=newaction(label,icon=None,checkable=True,data=name,enabled='repoopen',menu='view')a.setIcon(qtlib.geticon(icon))self.actionGroupTaskView.addAction(a)self.tasktbar.addAction(a)returnaaddtaskview('hg-log',_("Revision &Details"),'log')addtaskview('hg-commit',_('&Commit'),'commit')self.actionSelectTaskMQ= \
addtaskview('thg-mq',_('Patch &Queue'),'mq')addtaskview('thg-sync',_('S&ynchronize'),'sync')addtaskview('hg-annotate',_('&Manifest'),'manifest')addtaskview('hg-grep',_('&Search'),'grep')self.actionSelectTaskPbranch= \
addtaskview('branch',_('&Patch Branch'),'pbranch')newseparator(menu='view')newaction(_("&Refresh"),self._repofwd('reload'),icon='view-refresh',shortcut='Refresh',enabled='repoopen',menu='view',toolbar='edit',tooltip=_('Refresh current repository'))newaction(_("Refresh &Task Tab"),self._repofwd('reloadTaskTab'),enabled='repoopen',shortcut=modifiedkeysequence('Refresh',modifier='Shift'),tooltip=_('Refresh only the current task tab'),menu='view')newaction(_("Load all revisions"),self.loadall,enabled='repoopen',menu='view',shortcut='Shift+Ctrl+A',tooltip=_('Load all revisions into graph'))newaction(_("Web Server..."),self.serve,enabled='repoopen',menu='repository')newseparator(menu='repository')newaction(_("Shelve..."),self._repofwd('shelve'),icon='shelve',enabled='repoopen',menu='repository')newaction(_("Import..."),self._repofwd('thgimport'),icon='hg-import',enabled='repoopen',menu='repository')newseparator(menu='repository')newaction(_("Verify"),self._repofwd('verify'),enabled='repoopen',menu='repository')newaction(_("Recover"),self._repofwd('recover'),enabled='repoopen',menu='repository')newseparator(menu='repository')newaction(_("Resolve..."),self._repofwd('resolve'),icon='hg-merge',enabled='repoopen',menu='repository')newseparator(menu='repository')newaction(_("Rollback/Undo..."),self._repofwd('rollback'),enabled='repoopen',menu='repository')newseparator(menu='repository')newaction(_("Purge..."),self._repofwd('purge'),enabled='repoopen',icon='hg-purge',menu='repository')newseparator(menu='repository')newaction(_("Bisect..."),self._repofwd('bisect'),enabled='repoopen',menu='repository')newseparator(menu='repository')newaction(_("Explore"),self.explore,shortcut='Shift+Ctrl+S',icon='system-file-manager',enabled='repoopen',menu='repository')newaction(_("Terminal"),self.terminal,shortcut='Shift+Ctrl+T',icon='utilities-terminal',enabled='repoopen',menu='repository')newaction(_("Help"),self.onHelp,menu='help',icon='help-browser')newaction(_("About Qt"),QApplication.aboutQt,menu='help')newaction(_("About TortoiseHg"),self.onAbout,menu='help',icon='thg-logo')newseparator(toolbar='edit')self.actionBack= \
newaction(_("Back"),self._repofwd('back'),icon='go-previous',enabled=False,toolbar='edit')self.actionForward= \
newaction(_("Forward"),self._repofwd('forward'),icon='go-next',enabled=False,toolbar='edit')newseparator(toolbar='edit',menu='View')self.filtertbaction= \
newaction(_('Filter Toolbar'),self._repotogglefwd('toggleFilterBar'),icon='view-filter',shortcut='Ctrl+S',enabled='repoopen',toolbar='edit',menu='View',checkable=True,tooltip=_('Filter graph with revision sets or branches'))menu=QMenu(_('Workbench Toolbars'),self)menu.addAction(self.edittbar.toggleViewAction())menu.addAction(self.docktbar.toggleViewAction())menu.addAction(self.synctbar.toggleViewAction())menu.addAction(self.tasktbar.toggleViewAction())self.menuView.addMenu(menu)newaction(_('Incoming'),self._repofwd('incoming'),icon='hg-incoming',tooltip=_('Check for incoming changes from selected URL'),enabled='repoopen',toolbar='sync')newaction(_('Pull'),self._repofwd('pull'),icon='hg-pull',tooltip=_('Pull incoming changes from selected URL'),enabled='repoopen',toolbar='sync')newaction(_('Outgoing'),self._repofwd('outgoing'),icon='hg-outgoing',tooltip=_('Detect outgoing changes to selected URL'),enabled='repoopen',toolbar='sync')newaction(_('Push'),self._repofwd('push'),icon='hg-push',tooltip=_('Push outgoing changes to selected URL'),enabled='repoopen',toolbar='sync')self.updateMenu()def_action_defs(self):a=[("closetab",_("Close tab"),'',_("Close tab"),self.closeLastClickedTab),("closeothertabs",_("Close other tabs"),'',_("Close other tabs"),self.closeNotLastClickedTabs),("reopenlastclosed",_("Undo close tab"),'',_("Reopen last closed tab"),self.reopenLastClosedTabs),("reopenlastclosedgroup",_("Undo close other tabs"),'',_("Reopen last closed tab group"),self.reopenLastClosedTabs),]returnadefcreateActions(self):self._actions={}forname,desc,icon,tip,cbinself._action_defs():self._actions[name]=QAction(desc,self)QTimer.singleShot(0,self.configureActions)defconfigureActions(self):forname,desc,icon,tip,cbinself._action_defs():act=self._actions[name]ificon:act.setIcon(qtlib.getmenuicon(icon))iftip:act.setStatusTip(tip)ifcb:act.triggered.connect(cb)self.addAction(act)@pyqtSlot(QPoint)deftabBarContextMenuRequest(self,point):# Activate the clicked tabclickedwidget=qApp.widgetAt(self.repoTabsWidget.mapToGlobal(point))ifnotclickedwidgetor \
notisinstance(clickedwidget,ThgTabBar):returnself.repoTabsWidget.lastClickedTab=-1clickedtabindex=clickedwidget.tabAt(point)ifclickedtabindex>-1:self.repoTabsWidget.lastClickedTab=clickedtabindexelse:self.repoTabsWidget.lastClickedTab=self.repoTabsWidget.currentIndex()actionlist=['closetab','closeothertabs']existingClosedRepoList=[]forreporootinself.lastClosedRepoRootList:ifos.path.isdir(reporoot):existingClosedRepoList.append(reporoot)self.lastClosedRepoRootList=existingClosedRepoListiflen(self.lastClosedRepoRootList)>1:actionlist+=['','reopenlastclosedgroup']eliflen(self.lastClosedRepoRootList)>0:actionlist+=['','reopenlastclosed']contextmenu=QMenu(self)foractinactionlist:ifact:contextmenu.addAction(self._actions[act])else:contextmenu.addSeparator()ifactionlist:contextmenu.exec_(self.repoTabsWidget.mapToGlobal(point))defcloseLastClickedTab(self):ifself.repoTabsWidget.lastClickedTab>-1:self.repoTabCloseRequested(self.repoTabsWidget.lastClickedTab)def_closeOtherTabs(self,tabIndex):iftabIndex>-1:tb=self.repoTabsWidget.tabBar()tb.setCurrentIndex(tabIndex)closedRepoRootList=[]foridxinrange(tb.count()-1,-1,-1):ifidx!=tabIndex:self.repoTabCloseRequested(idx)# repoTabCloseRequested updates self.lastClosedRepoRootListclosedRepoRootList+=self.lastClosedRepoRootListself.lastClosedRepoRootList=closedRepoRootListdefcloseNotLastClickedTabs(self):self._closeOtherTabs(self.repoTabsWidget.lastClickedTab)defonSwitchRepoTaskTab(self,action):rw=self.repoTabsWidget.currentWidget()ifrw:rw.switchToNamedTaskTab(str(action.data().toString()))@pyqtSlot(QString,bool)defopenRepo(self,root,reuse):""" Open repo by openRepoSignal from reporegistry [unicode] """root=hglib.fromunicode(root)self._openRepo(root,reuse)@pyqtSlot(QString)defopenLinkedRepo(self,path):self.showRepo(path)rw=self.repoTabsWidget.currentWidget()ifrw:rw.taskTabsWidget.setCurrentIndex(rw.commitTabIndex)@pyqtSlot(QString)defshowRepo(self,root):"""Activate the repo tab or open it if not available [unicode]"""root=hglib.fromunicode(root)foriinxrange(self.repoTabsWidget.count()):w=self.repoTabsWidget.widget(i)ifhglib.tounicode(w.repo.root)==root:self.repoTabsWidget.setCurrentIndex(i)returnself._openRepo(root,False)@pyqtSlot(unicode,QString)defsetRevsetFilter(self,path,filter):foriinxrange(self.repoTabsWidget.count()):w=self.repoTabsWidget.widget(i)ifhglib.tounicode(w.repo.root)==path:w.filterbar.revsetle.setText(filter)w.filterbar.returnPressed()returndeffind_root(self,url):p=hglib.fromunicode(url.toLocalFile())returnpaths.find_root(p)defdragEnterEvent(self,event):d=event.mimeData()foruind.urls():root=self.find_root(u)ifroot:event.setDropAction(Qt.LinkAction)event.accept()breakdefdropEvent(self,event):accept=Falsed=event.mimeData()foruind.urls():root=self.find_root(u)ifroot:self.showRepo(root)accept=Trueifaccept:event.setDropAction(Qt.LinkAction)event.accept()defupdateMenu(self):"""Enable actions when repoTabs are opened or closed or changed"""# Update actions affected by repo open/closesomeRepoOpen=self.repoTabsWidget.count()>0foractioninself._actionavails['repoopen']:action.setEnabled(someRepoOpen)# Update actions affected by repo open/close/changeself.updateTaskViewMenu()self.updateToolBarActions()tw=self.repoTabsWidgetw=tw.currentWidget()if((tw.count()==0)or((tw.count()==1)andnotself.ui.configbool('tortoisehg','forcerepotab',False))):tw.tabBar().hide()else:tw.tabBar().show()iftw.count()==0:self.setWindowTitle(_('TortoiseHg Workbench'))elifw.repo.shortname!=w.repo.displayname:self.setWindowTitle(_('%s - TortoiseHg Workbench - %s')%(w.repo.shortname,w.repo.displayname))else:self.setWindowTitle(_('%s - TortoiseHg Workbench')%w.repo.shortname)defupdateToolBarActions(self):w=self.repoTabsWidget.currentWidget()ifw:self.filtertbaction.setChecked(w.filterBarVisible())defupdateTaskViewMenu(self):'Update task tab menu for current repository'ifself.repoTabsWidget.count()==0:forainself.actionGroupTaskView.actions():a.setChecked(False)self.actionSelectTaskMQ.setVisible(False)self.actionSelectTaskPbranch.setVisible(False)else:repoWidget=self.repoTabsWidget.currentWidget()exts=repoWidget.repo.extensions()self.actionSelectTaskMQ.setVisible('mq'inexts)self.actionSelectTaskPbranch.setVisible('pbranch'inexts)taskIndex=repoWidget.taskTabsWidget.currentIndex()forname,idxinrepoWidget.namedTabs.iteritems():ifidx==taskIndex:breakforactioninself.actionGroupTaskView.actions():ifstr(action.data().toString())==name:action.setChecked(True)@pyqtSlot()defupdateHistoryActions(self):'Update back / forward actions'rw=self.repoTabsWidget.currentWidget()ifnotrw:returnself.actionBack.setEnabled(rw.canGoBack())self.actionForward.setEnabled(rw.canGoForward())defrepoTabCloseSelf(self,widget):self.repoTabsWidget.setCurrentWidget(widget)index=self.repoTabsWidget.currentIndex()ifwidget.closeRepoWidget():w=self.repoTabsWidget.widget(index)try:reporoot=w.repo.rootexcept:reporoot=''self.repoTabsWidget.removeTab(index)widget.deleteLater()self.updateMenu()self.lastClosedRepoRootList=[reporoot]defrepoTabCloseRequested(self,index):tw=self.repoTabsWidgetif0<=index<tw.count():w=tw.widget(index)try:reporoot=w.repo.rootexcept:reporoot=''ifwandw.closeRepoWidget():tw.removeTab(index)w.deleteLater()self.updateMenu()self.lastClosedRepoRootList=[reporoot]defreopenLastClosedTabs(self):forreporootinself.lastClosedRepoRootList:ifos.path.isdir(reporoot):self.showRepo(reporoot)self.lastClosedRepoRootList=[]defrepoTabChanged(self,index=0):w=self.repoTabsWidget.currentWidget()ifw:self.updateHistoryActions()self.updateMenu()self.log.setRepository(wandw.repoorNone)defaddRepoTab(self,repo):'''opens the given repo in a new tab'''rw=RepoWidget(repo,self)rw.showMessageSignal.connect(self.showMessage)rw.closeSelfSignal.connect(self.repoTabCloseSelf)rw.progress.connect(lambdatp,p,i,u,tl:self.statusbar.progress(tp,p,i,u,tl,repo.root))rw.output.connect(self.log.output)rw.makeLogVisible.connect(self.log.setShown)rw.revisionSelected.connect(self.updateHistoryActions)rw.repoLinkClicked.connect(self.openLinkedRepo)rw.taskTabsWidget.currentChanged.connect(self.updateTaskViewMenu)rw.toolbarVisibilityChanged.connect(self.updateToolBarActions)rw.shortNameChanged.connect(self.reporegistry.shortNameChanged)rw.baseNodeChanged.connect(self.reporegistry.baseNodeChanged)tw=self.repoTabsWidgetindex=self.repoTabsWidget.addTab(rw,rw.title())tw.setCurrentIndex(index)rw.titleChanged.connect(lambdatitle:tw.setTabText(tw.indexOf(rw),title))rw.showIcon.connect(lambdaicon:tw.setTabIcon(tw.indexOf(rw),icon))self.reporegistry.addRepo(repo.root)self.updateMenu()defshowMessage(self,msg):self.statusbar.showMessage(msg)defsetHistoryColumns(self,*args):"""Display the column selection dialog"""w=self.repoTabsWidget.currentWidget()dlg=ColumnSelectDialog('workbench',_('Workbench'),wandw.repoview.model()orNone)ifdlg.exec_()==QDialog.Accepted:ifw:w.repoview.model().updateColumns()w.repoview.resizeColumns()def_repotogglefwd(self,name):"""Return function to forward action to the current repo tab"""defforwarder(checked):w=self.repoTabsWidget.currentWidget()ifw:getattr(w,name)(checked)returnforwarderdef_repofwd(self,name):"""Return function to forward action to the current repo tab"""defforwarder():w=self.repoTabsWidget.currentWidget()ifw:getattr(w,name)()returnforwarderdefserve(self):w=self.repoTabsWidget.currentWidget()ifw:fromtortoisehg.hgqtimportrunrun.serve(w.repo.ui,root=w.repo.root)defloadall(self):w=self.repoTabsWidget.currentWidget()ifw:w.repoview.model().loadall()defnewRepository(self):""" Run init dialog """fromtortoisehg.hgqt.hginitimportInitDialogrepoWidget=self.repoTabsWidget.currentWidget()ifrepoWidget:path=os.path.dirname(repoWidget.repo.root)else:path=os.getcwd()dlg=InitDialog([path],parent=self)dlg.finished.connect(dlg.deleteLater)ifdlg.exec_():path=dlg.getPath()self._openRepo(path,False)defcloneRepository(self):""" Run clone dialog """fromtortoisehg.hgqt.cloneimportCloneDialogrepoWidget=self.repoTabsWidget.currentWidget()ifrepoWidget:root=repoWidget.repo.rootargs=[root,root+'-clone']else:args=[]dlg=CloneDialog(args,parent=self)dlg.finished.connect(dlg.deleteLater)dlg.clonedRepository.connect(self.showRepo)dlg.exec_()defopenRepository(self):""" Open repo from File menu """caption=_('Select repository directory to open')repoWidget=self.repoTabsWidget.currentWidget()ifrepoWidget:cwd=os.path.dirname(repoWidget.repo.root)else:cwd=os.getcwd()cwd=hglib.tounicode(cwd)FD=QFileDialogpath=FD.getExistingDirectory(self,caption,cwd,FD.ShowDirsOnly|FD.ReadOnly)self._openRepo(hglib.fromunicode(path),False)def_openRepo(self,root,reuse):ifrootandnotroot.startswith('ssh://'):ifreuse:forrwinself._findrepowidget(root):self.repoTabsWidget.setCurrentWidget(rw)returntry:repo=thgrepo.repository(path=root)self.addRepoTab(repo)exceptRepoError:upath=hglib.tounicode(root)qtlib.WarningMsgBox(_('Failed to open repository'),_('%s is not a valid repository')%upath)def_findrepowidget(self,root):"""Iterates RepoWidget for the specified root"""tw=self.repoTabsWidgetforidxinrange(tw.count()):rw=tw.widget(idx)ifrw.repo.root==root:yieldrwdefonAbout(self,*args):""" Display about dialog """fromtortoisehg.hgqt.aboutimportAboutDialogad=AboutDialog(self)ad.finished.connect(ad.deleteLater)ad.exec_()defonHelp(self,*args):""" Display online help """qtlib.openhelpcontents('workbench.html')defstoreSettings(self):s=QSettings()wb="Workbench/"s.setValue(wb+'geometry',self.saveGeometry())s.setValue(wb+'windowState',self.saveState())s.setValue(wb+'showPaths',self.actionShowPaths.isChecked())s.setValue(wb+'showSubrepos',self.actionShowSubrepos.isChecked())s.setValue(wb+'showNetworkSubrepos',self.actionShowNetworkSubrepos.isChecked())s.setValue(wb+'saveRepos',self.actionSaveRepos.isChecked())repostosave=[]ifself.actionSaveRepos.isChecked():tw=self.repoTabsWidgetforidxinrange(tw.count()):rw=tw.widget(idx)repostosave.append(hglib.tounicode(rw.repo.root))s.setValue(wb+'openrepos',(',').join(repostosave))defrestoreSettings(self):s=QSettings()wb="Workbench/"self.restoreGeometry(s.value(wb+'geometry').toByteArray())self.restoreState(s.value(wb+'windowState').toByteArray())save=s.value(wb+'saveRepos').toBool()self.actionSaveRepos.setChecked(save)forpathinhglib.fromunicode(s.value(wb+'openrepos').toString()).split(','):self._openRepo(path,False)# Load the repo registry settings. Note that we must allow the# repo registry to assemble itself before toggling its settings# Also the view path setttings should be enabled last, once we have# loaded the repo subrepositories (if needed)# Normally, checking the "show subrepos" and the "show network subrepos"# settings will trigger a reload of the repo registry.# To avoid reloading it twice (every time we set one of its view# settings), we tell the setters to avoid reloading the repo tree# model, and then we manually reload the modelssr=s.value(wb+'showSubrepos',defaultValue=QVariant(True)).toBool()snsr=s.value(wb+'showNetworkSubrepos',defaultValue=QVariant(True)).toBool()self.reporegistry.setShowSubrepos(ssr,False)self.reporegistry.setShowNetworkSubrepos(snsr,False)# Note that calling setChecked will NOT reload the model if the new# setting is the same as the one in the repo registryQTimer.singleShot(0,lambda:self.actionShowSubrepos.setChecked(ssr))QTimer.singleShot(0,lambda:self.actionShowNetworkSubrepos.setChecked(ssr)) # Manually reload the model now, to apply the settings
self.reporegistry.reloadModel()
+ # Allow repo registry to assemble itself before toggling path state sp = s.value(wb + 'showPaths').toBool()
QTimer.singleShot(0, lambda: self.actionShowPaths.setChecked(sp))
defgoto(self,root,rev):forrwinself._findrepowidget(root):rw.goto(rev)defcloseEvent(self,event):ifnotself.closeRepoTabs():event.ignore()else:self.storeSettings()self.reporegistry.close()# mimic QDialog exitself.finished.emit(0)defcloseRepoTabs(self):'''returns False if close should be aborted'''tw=self.repoTabsWidgetforidxinrange(tw.count()):rw=tw.widget(idx)ifnotrw.closeRepoWidget():tw.setCurrentWidget(rw)returnFalsereturnTruedefcloseRepository(self):"""close the current repo tab"""self.repoTabCloseRequested(self.repoTabsWidget.currentIndex())defexplore(self):w=self.repoTabsWidget.currentWidget()ifw:QDesktopServices.openUrl(QUrl.fromLocalFile(w.repo.root))defterminal(self):w=self.repoTabsWidget.currentWidget()ifw:qtlib.openshell(w.repo.root)defeditSettings(self):tw=self.repoTabsWidgetw=tw.currentWidget()twrepo=(wandw.repo.rootor'')sd=SettingsDialog(configrepo=False,focus='tortoisehg.authorcolor',parent=self,root=twrepo)sd.exec_()defrun(ui,*pats,**opts):root=opts.get('root')orpaths.find_root()ifrootandpats:repo=thgrepo.repository(ui,root)pats=hglib.canonpaths(pats)iflen(pats)==1andos.path.isfile(repo.wjoin(pats[0])):fromtortoisehg.hgqt.filedialogsimportFileLogDialogfname=pats[0]ufname=hglib.tounicode(fname)dlg=FileLogDialog(repo,fname,None)dlg.setWindowTitle(_('Hg file log viewer [%s] - %s')%(repo.displayname,ufname))returndlgw=Workbench()ifroot:root=hglib.tounicode(root)w.showRepo(root)ifpats:q=[]forpatinpats:f=repo.wjoin(pat)ifos.path.isdir(f):q.append('file("%s/**")'%pat)elifos.path.isfile(f):q.append('file("%s")'%pat)w.setRevsetFilter(root,' or '.join(q))ifw.repoTabsWidget.count()<=0:w.reporegistry.setVisible(True)returnw
Attach a Trello Card
Add a tag
Your session has expired
You are no longer logged in. Please log in and try your request again.
Filter RSS Feed
This RSS feed URL allows you to see the contents of your current filter using any feed reader.
This link includes a special authentication token. If you share the URL with anyone else, they can see this RSS feed's activity. You can disable these tokens when needed.
Your current filter is unsaved; changing it won't affect this RSS feed.