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.
# -*- coding: iso-8859-1 -*-#!/usr/bin/env python# 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"""importsys,osimportrefromPyQt4importQtCore,QtGui,Qscifrommercurialimportui,hg,utilfrommercurial.errorimportRepoErrorfromtortoisehg.util.utilimporttounicodefromtortoisehg.util.utilimportrootpath,find_repositoryfromtortoisehg.hgqt.i18nimport_fromtortoisehg.hgqt.decoratorsimporttimeitfromtortoisehg.hgqt.configimportHgConfigfromtortoisehg.hgqt.qtlibimportgeticonfromtortoisehg.hgqt.quickbarimportFindInGraphlogQuickBarfromtortoisehg.hgqt.repowidgetimportRepoWidgetfromtortoisehg.hgqt.commitimportCommitWidgetfromtortoisehg.hgqt.reporegistryimportRepoRegistryViewfromtortoisehg.utilimportpathsfrommercurial.errorimportRepoErrorQt=QtCore.Qtbold=QtGui.QFont.Boldconnect=QtCore.QObject.connectSIGNAL=QtCore.SIGNALclassWorkbench(QtGui.QMainWindow):"""hg repository viewer/browser application"""def__init__(self,ui,repo=None):self.ui=uiself._reload_rev=Noneself._reload_file=Noneself._loading=Trueself._scanForRepoChanges=Trueself._searchWidgets=[]self.commitwidgets={}# key: reporootQtGui.QMainWindow.__init__(self)self.load_config(ui)self.setupUi(self)self._quickbars=[]self.disab_shortcuts=[]self.repotabs_splitter.setCollapsible(0,False)self.dummywidget=QtGui.QWidget()self.stackedWidget.addWidget(self.dummywidget)self.stackedWidget.setCurrentWidget(self.dummywidget)self.setWindowTitle('TortoiseHg Workbench')self.reporegistry=rr=RepoRegistryView(ui,self)rr.setObjectName('RepoRegistryView')self.addDockWidget(Qt.LeftDockWidgetArea,rr)rr.openRepoSignal.connect(self.openRepo)ifrepo:self.addRepoTab(repo)tw=self.repoTabsWidgettw.removeTab(0)connect(tw,SIGNAL('tabCloseRequested(int)'),self.repoTabCloseRequested)connect(tw,SIGNAL('currentChanged(int)'),self.repoTabChanged)self.createActions()self.createToolbars()self.repoTabChanged()self.setupBranchCombo()self.restoreSettings()self.setAcceptDrops(True)defgotVisible(state):self.actionShowRepoRegistry.setChecked(self.reporegistry.isVisible())self.reporegistry.visibilityChanged.connect(gotVisible)defattachQuickBar(self,qbar):qbar.setParent(self)self._quickbars.append(qbar)connect(qbar,SIGNAL('escShortcutDisabled(bool)'),self.setShortcutsEnabled)self.addToolBar(Qt.BottomToolBarArea,qbar)connect(qbar,SIGNAL('visible'),self.ensureOneQuickBar)defsetShortcutsEnabled(self,enabled=True):forshinself.disab_shortcuts:sh.setEnabled(enabled)defensureOneQuickBar(self):tb=self.sender()forwinself._quickbars:ifwisnottb:w.hide()defload_config(self,ui):cfg=HgConfig(ui)fontstr=cfg.getFont()font=QtGui.QFont()try:ifnotfont.fromString(fontstr):raiseExceptionexcept:print"bad font name '%s'"%fontstrfont.setFamily("Monospace")font.setFixedPitch(True)font.setPointSize(10)self._font=fontself.rowheight=cfg.getRowHeight()self.users,self.aliases=cfg.getUsers()returncfgdefaccept(self):self.close()defreject(self):self.close()defsetupUi(self,MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(627,721)icon=QtGui.QIcon()icon.addPixmap(QtGui.QPixmap(":/icons/log.svg"),QtGui.QIcon.Normal,QtGui.QIcon.Off)MainWindow.setWindowIcon(icon)self.centralwidget=QtGui.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.verticalLayout=QtGui.QVBoxLayout(self.centralwidget)self.verticalLayout.setSpacing(0)self.verticalLayout.setMargin(0)self.verticalLayout.setObjectName("verticalLayout")self.repotabs_splitter=QtGui.QSplitter(self.centralwidget)self.repotabs_splitter.setOrientation(QtCore.Qt.Vertical)self.repotabs_splitter.setObjectName("repotabs_splitter")self.repoTabsWidget=QtGui.QTabWidget(self.repotabs_splitter)sizePolicy=QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding)sizePolicy.setHorizontalStretch(1)sizePolicy.setVerticalStretch(1)sizePolicy.setHeightForWidth(self.repoTabsWidget.sizePolicy().hasHeightForWidth())self.repoTabsWidget.setSizePolicy(sizePolicy)self.repoTabsWidget.setDocumentMode(True)self.repoTabsWidget.setTabsClosable(True)self.repoTabsWidget.setMovable(True)self.repoTabsWidget.setObjectName("repoTabsWidget")self.firstRepoTab=QtGui.QWidget()self.firstRepoTab.setObjectName("firstRepoTab")self.repoTabsWidget.addTab(self.firstRepoTab,"")self.stackedWidget=QtGui.QStackedWidget(self.repotabs_splitter)self.stackedWidget.setObjectName("stackedWidget")self.verticalLayout.addWidget(self.repotabs_splitter)MainWindow.setCentralWidget(self.centralwidget)self.menubar=QtGui.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0,0,627,19))self.menubar.setObjectName("menubar")self.menuFile=QtGui.QMenu(self.menubar)self.menuFile.setObjectName("menuFile")self.menuHelp=QtGui.QMenu(self.menubar)self.menuHelp.setObjectName("menuHelp")self.menuView=QtGui.QMenu(self.menubar)self.menuView.setObjectName("menuView")MainWindow.setMenuBar(self.menubar)self.statusbar=QtGui.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.toolBar_edit=QtGui.QToolBar(MainWindow)self.toolBar_edit.setEnabled(True)self.toolBar_edit.setObjectName("toolBar_edit")MainWindow.addToolBar(QtCore.Qt.ToolBarArea(QtCore.Qt.TopToolBarArea),self.toolBar_edit)self.toolBar_treefilters=QtGui.QToolBar(MainWindow)self.toolBar_treefilters.setEnabled(True)self.toolBar_treefilters.setObjectName("toolBar_treefilters")MainWindow.addToolBar(QtCore.Qt.ToolBarArea(QtCore.Qt.TopToolBarArea),self.toolBar_treefilters)self.toolBar_diff=QtGui.QToolBar(MainWindow)self.toolBar_diff.setObjectName("toolBar_diff")MainWindow.addToolBar(QtCore.Qt.ToolBarArea(QtCore.Qt.TopToolBarArea),self.toolBar_diff)self.toolBar_help=QtGui.QToolBar(MainWindow)self.toolBar_help.setObjectName("toolBar_help")MainWindow.addToolBar(QtCore.Qt.ToolBarArea(QtCore.Qt.TopToolBarArea),self.toolBar_help)self.actionOpen_repository=QtGui.QAction(MainWindow)self.actionOpen_repository.setObjectName("actionOpen_repository")self.actionRefresh=QtGui.QAction(MainWindow)self.actionRefresh.setObjectName("actionRefresh")self.actionQuit=QtGui.QAction(MainWindow)self.actionQuit.setShortcut("None")self.actionQuit.setObjectName("actionQuit")self.actionAbout=QtGui.QAction(MainWindow)self.actionAbout.setObjectName("actionAbout")self.actionDisplayAllBranches=QtGui.QAction(MainWindow)self.actionDisplayAllBranches.setObjectName("actionDisplayAllBranches")self.actionHelp=QtGui.QAction(MainWindow)self.actionHelp.setObjectName("actionHelp")self.actionBack=QtGui.QAction(MainWindow)icon1=QtGui.QIcon()icon1.addPixmap(QtGui.QPixmap(":/icons/back.svg"),QtGui.QIcon.Normal,QtGui.QIcon.Off)self.actionBack.setIcon(icon1)self.actionBack.setObjectName("actionBack")self.actionForward=QtGui.QAction(MainWindow)icon2=QtGui.QIcon()icon2.addPixmap(QtGui.QPixmap(":/icons/forward.svg"),QtGui.QIcon.Normal,QtGui.QIcon.Off)self.actionForward.setIcon(icon2)self.actionForward.setObjectName("actionForward")self.actionShowPaths=QtGui.QAction(MainWindow)self.actionShowPaths.setCheckable(True)self.actionShowPaths.setObjectName("actionShowPaths")self.actionShowRepoRegistry=QtGui.QAction(MainWindow)self.actionShowRepoRegistry.setCheckable(True)self.actionShowRepoRegistry.setObjectName("actionShowRepoRegistry")self.menuFile.addAction(self.actionOpen_repository)self.menuFile.addAction(self.actionRefresh)self.menuFile.addSeparator()self.menuFile.addAction(self.actionQuit)self.menuHelp.addAction(self.actionAbout)self.menuHelp.addAction(self.actionHelp)self.menuView.addAction(self.actionShowRepoRegistry)self.menuView.addAction(self.actionShowPaths)self.menubar.addAction(self.menuFile.menuAction())self.menubar.addAction(self.menuView.menuAction())self.menubar.addAction(self.menuHelp.menuAction())self.toolBar_edit.addAction(self.actionRefresh)self.toolBar_edit.addSeparator()self.toolBar_edit.addAction(self.actionBack)self.toolBar_edit.addAction(self.actionForward) self.toolBar_edit.addSeparator()
self.toolBar_help.addAction(self.actionHelp)
- self.retranslateUi(MainWindow) self.repoTabsWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
- def retranslateUi(self, MainWindow): self.menuFile.setTitle(_("&File"))
self.menuHelp.setTitle(_("&Help"))
self.menuView.setTitle(_("View"))
self.toolBar_edit.setWindowTitle(_("Edit Toolbar"))self.toolBar_treefilters.setWindowTitle(_("Filter Toolbar"))self.toolBar_diff.setWindowTitle(_("Diff toolbar"))self.toolBar_help.setWindowTitle(_("Help toolbar"))self.actionOpen_repository.setText(_("&Open Repository"))self.actionOpen_repository.setShortcut("Ctrl+O")self.actionRefresh.setText(_("&Refresh"))self.actionRefresh.setShortcut("Ctrl+R")self.actionQuit.setText(_("E&xit"))self.actionQuit.setIconText(_("Exit"))self.actionQuit.setToolTip(_("Exit"))self.actionAbout.setText(_("About"))self.actionDisplayAllBranches.setText("displayAllBranches")self.actionHelp.setText(_("Help"))self.actionBack.setText(_("Back"))self.actionForward.setText(_("Forward"))self.actionShowPaths.setText(_("Show Paths"))self.actionShowRepoRegistry.setText(_("Show Repository Registry"))defshowRepoRegistry(self,show):self.reporegistry.setVisible(show)defopenRepo(self,repopath):repo=hg.repository(self.ui,path=str(repopath))self.addRepoTab(repo)deffind_root(self,url):p=str(url.toLocalFile())returnpaths.find_root(p)defdragEnterEvent(self,event):d=event.mimeData()foruind.urls():root=self.find_root(u)ifroot:event.acceptProposedAction()breakdefdropEvent(self,event):accept=Falsed=event.mimeData()foruind.urls():root=self.find_root(u)ifroot:repo=hg.repository(self.ui,path=root)self.addRepoTab(repo)accept=Trueifaccept:event.acceptProposedAction()defrepoTabCloseRequested(self,index):tw=self.repoTabsWidgetw=tw.widget(index)ifw.closeRepoWidget():tw.removeTab(index)defrepoTabChanged(self,index=0):self.setupBranchCombo()w=self.repoTabsWidget.currentWidget()mode='diff'ann=Falsetags=[]ifw:mode=w.getMode()ann=w.getAnnotate()tags=w.repo.tags().keys()w.switchedTo()else:self.actionDiffMode.setEnabled(False)self.stackedWidget.setCurrentWidget(self.dummywidget)self.actionDiffMode.setChecked(mode=='diff')self.actionAnnMode.setChecked(ann)defaddRepoTab(self,repo):'''opens the given repo in a new tab'''reponame=os.path.basename(repo.root)ifrepo.rootinself.commitwidgets:cw=self.commitwidgets[repo.root]else:pats={}opts={}cw=CommitWidget(pats,opts,root=repo.root)self.commitwidgets[repo.root]=cwself.stackedWidget.addWidget(cw)s=QtCore.QSettings()cw.loadConfigs(s)rw=RepoWidget(repo,self.stackedWidget,cw)rw.showMessageSignal.connect(self.showMessage)rw.switchToSignal.connect(self.switchTo)tw=self.repoTabsWidgetindex=self.repoTabsWidget.addTab(rw,reponame)tw.setCurrentIndex(index)self.reporegistry.addRepo(repo.root)defswitchTo(self,widget):self.repoTabsWidget.setCurrentWidget(widget)defshowMessage(self,msg):self.statusBar().showMessage(msg)defsetupBranchCombo(self,*args):w=self.repoTabsWidget.currentWidget()ifnotw:self.branch_label_action.setEnabled(False)self.branch_comboBox_action.setEnabled(False)self.branch_comboBox.clear()returnrepo=w.repoallbranches=sorted(repo.branchtags().items())openbr=[]forbranch,brnodeinallbranches:openbr.extend(repo.branchheads(branch,closed=False))clbranches=[brforbr,nodeinallbranchesifnodenotinopenbr]branches=[brforbr,nodeinallbranchesifnodeinopenbr]ifself.branch_checkBox_action.isChecked():branches=branches+clbranchesiflen(branches)==1:self.branch_label_action.setEnabled(False)self.branch_comboBox_action.setEnabled(False)self.branch_comboBox.clear()else:branches=['']+branchesself.branchesmodel=QtGui.QStringListModel(branches)self.branch_comboBox.setModel(self.branchesmodel)self.branch_label_action.setEnabled(True)self.branch_comboBox_action.setEnabled(True)branch=w.filterbranch()index=-1fori,binenumerate(branches):ifb==branch:index=ibreakself.branch_comboBox.setCurrentIndex(index)defcreateToolbars(self):# find quickbarself.find_toolbar=tb=FindInGraphlogQuickBar(self)tb.setObjectName("find_toolbar")#tb.attachFileView(self.fileview)#tb.attachHeaderView(self.revdisplay)#connect(tb, SIGNAL('revisionSelected'), self.repoview.goto)#connect(tb, SIGNAL('fileSelected'), self.tableView_filelist.selectFile)connect(tb,SIGNAL('showMessage'),self.statusBar().showMessage,Qt.QueuedConnection)self.attachQuickBar(tb)findaction=self.find_toolbar.toggleViewAction()findaction.setIcon(geticon('find'))self.toolBar_edit.addAction(findaction)# tree filters toolbarself.branch_label=QtGui.QToolButton()self.branch_label.setText("Branch")self.branch_label.setStatusTip("Display graph the named branch only")self.branch_label.setPopupMode(QtGui.QToolButton.InstantPopup)self.branch_menu=QtGui.QMenu()cbranch_action=self.branch_menu.addAction("Display closed branches")cbranch_action.setCheckable(True)self.branch_checkBox_action=cbranch_actionself.branch_label.setMenu(self.branch_menu)self.branch_comboBox=QtGui.QComboBox()connect(self.branch_comboBox,SIGNAL('activated(const QString &)'),self.refreshRevisionTable)connect(cbranch_action,SIGNAL('toggled(bool)'),self.setupBranchCombo)self.toolBar_treefilters.layout().setSpacing(3)self.branch_label_action=self.toolBar_treefilters.addWidget(self.branch_label)self.branch_comboBox_action=self.toolBar_treefilters.addWidget(self.branch_comboBox)self.toolBar_treefilters.addSeparator()self.toolBar_treefilters.addAction(self.actionSearch)self.toolBar_treefilters.addSeparator()# diff mode toolbarself.toolBar_diff.addAction(self.actionDiffMode)self.toolBar_diff.addAction(self.actionAnnMode)self.toolBar_diff.addAction(self.actionNextDiff)self.toolBar_diff.addAction(self.actionPrevDiff)defcreateActions(self):# main window actions (from .ui file)self.actionRefresh.triggered.connect(self.reload)self.actionAbout.triggered.connect(self.on_about)self.actionQuit.triggered.connect(self.close)self.actionBack.triggered.connect(self.back)self.actionForward.triggered.connect(self.forward)self.actionShowPaths.toggled.connect(self.actionShowPathsToggled)self.actionShowRepoRegistry.toggled.connect(self.showRepoRegistry)self.actionQuit.setIcon(geticon('quit'))self.actionRefresh.setIcon(geticon('reload'))self.actionDiffMode=QtGui.QAction('Diff mode',self)self.actionDiffMode.setCheckable(True)connect(self.actionDiffMode,SIGNAL('toggled(bool)'),self.setMode)self.actionAnnMode=QtGui.QAction('Annotate',self)self.actionAnnMode.setCheckable(True)connect(self.actionAnnMode,SIGNAL('toggled(bool)'),self.setAnnotate)self.actionSearch=QtGui.QAction('Search',self)self.actionSearch.setShortcut(Qt.Key_F3)connect(self.actionSearch,SIGNAL('triggered()'),self.on_search)self.actionHelp.setShortcut(Qt.Key_F1)self.actionHelp.setIcon(geticon('help'))connect(self.actionHelp,SIGNAL('triggered()'),self.on_help)# Next/Prev diff (in full file mode)self.actionNextDiff=QtGui.QAction(geticon('down'),'Next diff',self)self.actionNextDiff.setShortcut('Alt+Down')deffilled():self.actionNextDiff.setEnabled(self.fileview.fileMode()andself.fileview.nDiffs())#connect(self.fileview, SIGNAL('filled'), filled)self.actionPrevDiff=QtGui.QAction(geticon('up'),'Previous diff',self)self.actionPrevDiff.setShortcut('Alt+Up')connect(self.actionNextDiff,SIGNAL('triggered()'),self.nextDiff)connect(self.actionPrevDiff,SIGNAL('triggered()'),self.prevDiff)self.actionDiffMode.setChecked(True)# Next/Prev fileself.actionNextFile=QtGui.QAction('Next file',self)self.actionNextFile.setShortcut('Right')#connect(self.actionNextFile, SIGNAL('triggered()'),# self.tableView_filelist.nextFile)self.actionPrevFile=QtGui.QAction('Prev file',self)self.actionPrevFile.setShortcut('Left')#connect(self.actionPrevFile, SIGNAL('triggered()'),# self.tableView_filelist.prevFile)self.addAction(self.actionNextFile)self.addAction(self.actionPrevFile)self.disab_shortcuts.append(self.actionNextFile)self.disab_shortcuts.append(self.actionPrevFile)# Next/Prev revself.actionNextRev=QtGui.QAction('Next revision',self)self.actionNextRev.setShortcut('Down')#connect(self.actionNextRev, SIGNAL('triggered()'),# self.repoview.nextRev)self.actionPrevRev=QtGui.QAction('Prev revision',self)self.actionPrevRev.setShortcut('Up')#connect(self.actionPrevRev, SIGNAL('triggered()'),# self.repoview.prevRev)self.addAction(self.actionNextRev)self.addAction(self.actionPrevRev)self.disab_shortcuts.append(self.actionNextRev)self.disab_shortcuts.append(self.actionPrevRev)# navigate in file viewerself.actionNextLine=QtGui.QAction('Next line',self)self.actionNextLine.setShortcut(Qt.SHIFT+Qt.Key_Down)#connect(self.actionNextLine, SIGNAL('triggered()'),# self.fileview.nextLine)self.addAction(self.actionNextLine)self.actionPrevLine=QtGui.QAction('Prev line',self)self.actionPrevLine.setShortcut(Qt.SHIFT+Qt.Key_Up)#connect(self.actionPrevLine, SIGNAL('triggered()'),# self.fileview.prevLine)self.addAction(self.actionPrevLine)self.actionNextCol=QtGui.QAction('Next column',self)self.actionNextCol.setShortcut(Qt.SHIFT+Qt.Key_Right)#connect(self.actionNextCol, SIGNAL('triggered()'),# self.fileview.nextCol)self.addAction(self.actionNextCol)self.actionPrevCol=QtGui.QAction('Prev column',self)self.actionPrevCol.setShortcut(Qt.SHIFT+Qt.Key_Left)#connect(self.actionPrevCol, SIGNAL('triggered()'),# self.fileview.prevCol)self.addAction(self.actionPrevCol)connect(self.actionOpen_repository,SIGNAL('triggered()'),self.openRepository)defactionShowPathsToggled(self,show):self.reporegistry.showPaths(show)defback(self):w=self.repoTabsWidget.currentWidget()ifw:w.back()defforward(self):w=self.repoTabsWidget.currentWidget()ifw:w.forward()defopenRepository(self):caption=_('Select repository directory to open')FD=QtGui.QFileDialogpath=FD.getExistingDirectory(parent=self,caption=caption,options=FD.ShowDirsOnly|FD.ReadOnly)path=str(path)try:repo=hg.repository(self.ui,path=path)self.addRepoTab(repo)exceptRepoError:QtGui.QMessageBox.warning(self,_('Failed to open repository'),_('%s is not a valid repository')%path)defsetMode(self,mode):w=self.repoTabsWidget.currentWidget()ifw:w.setMode(mode)self.actionAnnMode.setEnabled(notmode)self.actionNextDiff.setEnabled(notmode)self.actionPrevDiff.setEnabled(notmode)defsetAnnotate(self,ann):w=self.repoTabsWidget.currentWidget()ifw:w.setAnnotate(ann)defnextDiff(self):passdefprevDiff(self):passdeffile_displayed(self,filename):# self.actionPrevDiff.setEnabled(False)passdefreload(self):w=self.repoTabsWidget.currentWidget()ifw:w.reload()self.setupBranchCombo()defreloadRepository(self,root):tw=self.repoTabsWidgetforidxinrange(tw.count()):rw=tw.widget(idx)ifrw.repo.root==root:rw.reload()self.setupBranchCombo()#@timeitdefrefreshRevisionTable(self,*args,**kw):"""Starts the process of filling the HgModel"""branch=self.branch_comboBox.currentText()branch=str(branch)tw=self.repoTabsWidgetw=tw.currentWidget()ifw:w.setRepomodel(branch)ifbranch:tabtext='%s [%s]'%(w.reponame(),branch)else:tabtext=w.reponame()tw.setTabText(tw.currentIndex(),tabtext)defon_about(self,*args):""" Display about dialog """from__pkginfo__importmodname,version,short_desc,long_desctry:frommercurial.versionimportget_versionhgversion=get_version()except:frommercurial.__version__importversionashgversionmsg="<h2>About %(appname)s%(version)s</h2> (using hg %(hgversion)s)"% \
{"appname":modname,"version":version,"hgversion":hgversion}msg+="<p><i>%s</i></p>"%short_desc.capitalize()msg+="<p>%s</p>"%long_descQtGui.QMessageBox.about(self,"About %s"%modname,msg)defon_help(self,*args):passdefon_search(self,*args):fromtortoisehg.hgqt.grepimportSearchWidget# todo: get root of current repo, pass to search widgetroot=Nones=SearchWidget('',root,self)s.setAllowedAreas(QtCore.Qt.TopDockWidgetArea|QtCore.Qt.BottomDockWidgetArea)s.setObjectName("searchWidget%d"%len(self._searchWidgets))self.addDockWidget(QtCore.Qt.BottomDockWidgetArea,s)self._searchWidgets.append(s)defokToContinue(self):''' returns False if there is unsaved data If there is unsaved data, present a dialog asking the user if it is ok to discard the changes made. '''returnTruedefstoreSettings(self):s=QtCore.QSettings()wb="Workbench/"s.setValue(wb+'geometry',self.saveGeometry())s.setValue(wb+'windowState',self.saveState())forninself.splitternames:s.setValue(wb+n,getattr(self,n).saveState())defrestoreSettings(self):s=QtCore.QSettings()wb="Workbench/"self.restoreGeometry(s.value(wb+'geometry').toByteArray())self.restoreState(s.value(wb+'windowState').toByteArray())self.splitternames=[]sn=('repotabs',)forninsn:n+='_splitter'self.splitternames.append(n)getattr(self,n).restoreState(s.value(wb+n).toByteArray())defcloseEvent(self,event):ifnotself.okToContinue()ornotself.closeRepoTabs():event.ignore()else:self.storeSettings()self.reporegistry.close()defcloseRepoTabs(self):'''returns False if close should be aborted'''tw=self.repoTabsWidgetforidxinrange(tw.count()):rw=tw.widget(idx)ifnotrw.closeRepoWidget():returnFalsereturnTruedefrun(ui,*pats,**opts):repo=Noneroot=paths.find_root()ifroot:repo=hg.repository(ui,path=root)returnWorkbench(ui,repo)
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.