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.
# reporegistry.py - registry for a user's repositories## Copyright 2010 Adrian Buehlmann <adrian@cadifra.com>## This software may be used and distributed according to the terms of the# GNU General Public License version 2 or any later version.importosfrommercurialimporterrorfromtortoisehg.utilimporthglib,pathsfromtortoisehg.hgqt.i18nimport_fromtortoisehg.hgqtimportqtlib,repotreemodel,clone,settingsfromPyQt4.QtCoreimport*fromPyQt4.QtGuiimport*importqtlibdefsettingsfilename():"""Return path to thg-reporegistry.xml as unicode"""s=QSettings()dir=os.path.dirname(unicode(s.fileName()))returndir+'/'+'thg-reporegistry.xml'classRepoTreeView(QTreeView):showMessage=pyqtSignal(QString)menuRequested=pyqtSignal(object,object)openRepo=pyqtSignal(QString,bool)def__init__(self,parent):QTreeView.__init__(self,parent,allColumnsShowFocus=True)self.selitem=Noneself.msg=''self.setHeaderHidden(True)self.setExpandsOnDoubleClick(False)self.setMouseTracking(True)# enable drag and drop# (see http://doc.qt.nokia.com/4.6/model-view-dnd.html)self.setDragEnabled(True)self.setAcceptDrops(True)self.setAutoScroll(True)self.setDragDropMode(QAbstractItemView.DragDrop)self.setDropIndicatorShown(True)self.setEditTriggers(QAbstractItemView.DoubleClicked)self.setSelectionBehavior(QAbstractItemView.SelectRows)QShortcut('Return',self,self.showFirstTabOrOpen).setContext(Qt.WidgetShortcut)QShortcut('Enter',self,self.showFirstTabOrOpen).setContext(Qt.WidgetShortcut)defcontextMenuEvent(self,event):ifnotself.selitem:returnself.menuRequested.emit(event.globalPos(),self.selitem)defdragEnterEvent(self,event):ifevent.source()isself:# Use the default event handler for internal draggingsuper(RepoTreeView,self).dragEnterEvent(event)returnd=event.mimeData()foruind.urls():root=paths.find_root(hglib.fromunicode(u.toLocalFile()))ifroot:event.setDropAction(Qt.LinkAction)event.accept()self.setState(QAbstractItemView.DraggingState)breakdefdropLocation(self,event):index=self.indexAt(event.pos())# Determine where the item was dropped.# Depth in tree: 1 = group, 2 = repo, and (eventually) 3+ = subrepodepth=self.model().depth(index)ifdepth==1:group=indexrow=-1elifdepth==2:indicator=self.dropIndicatorPosition()group=index.parent()row=index.row()ifindicator==QAbstractItemView.BelowItem:row=index.row()+1else:index=group=row=Nonereturnindex,group,rowdefdropEvent(self,event):data=event.mimeData()index,group,row=self.dropLocation(event)ifindex:ifevent.source()isself:# Event is an internal move, so pass it to the modelcol=0drop=self.model().dropMimeData(data,Qt.MoveAction,row,col,group)ifdrop:event.setDropAction(Qt.MoveAction)event.accept()else:# Event is a drop of an external repoaccept=Falseforuindata.urls():root=paths.find_root(hglib.fromunicode(u.toLocalFile()))ifrootandnotself.model().getRepoItem(root):self.model().addRepo(group,root,row)accept=Trueifaccept:event.setDropAction(Qt.LinkAction)event.accept()self.setAutoScroll(False)self.setState(QAbstractItemView.NoState)self.viewport().update()defmouseMoveEvent(self,event):self.msg=''pos=event.pos()idx=self.indexAt(pos)ifidx.isValid():item=idx.internalPointer()self.msg=item.details()self.showMessage.emit(self.msg)ifevent.buttons()==Qt.NoButton:# Bail out early to avoid tripping over this bug:# http://bugreports.qt.nokia.com/browse/QTBUG-10180returnsuper(RepoTreeView,self).mouseMoveEvent(event)defleaveEvent(self,event):ifself.msg!='':self.showMessage.emit('')defmouseDoubleClickEvent(self,event):ifself.selitemandself.selitem.internalPointer().isRepo():# We can only open mercurial repositories and subrepositoriesrepotype=self.selitem.internalPointer().repotype()ifrepotype=='hg':self.showFirstTabOrOpen()else:qtlib.WarningMsgBox(_('Unsupported repository type (%s)')%repotype,_('Cannot open non mercurial repositories or subrepositories'),parent=self)else:# a double-click on non-repo rows opens an editorsuper(RepoTreeView,self).mouseDoubleClickEvent(event)defselectionChanged(self,selected,deselected):selection=self.selectedIndexes()iflen(selection)==0:self.selitem=Noneelse:self.selitem=selection[0]defsizeHint(self):size=super(RepoTreeView,self).sizeHint()size.setWidth(QFontMetrics(self.font()).width('M')*15)returnsizedefshowFirstTabOrOpen(self):'Enter or double click events, show existing or open a new repowidget'ifself.selitemandself.selitem.internalPointer().isRepo():root=self.selitem.internalPointer().rootpath()self.openRepo.emit(hglib.tounicode(root),True)classRepoRegistryView(QDockWidget):showMessage=pyqtSignal(QString)openRepo=pyqtSignal(QString,bool)def__init__(self,parent,showSubrepos=True,showNetworkSubrepos=True):QDockWidget.__init__(self,parent)self.showSubrepos=showSubreposself.showNetworkSubrepos=showNetworkSubreposself.setFeatures(QDockWidget.DockWidgetClosable|QDockWidget.DockWidgetMovable|QDockWidget.DockWidgetFloatable)self.setWindowTitle(_('Repository Registry'))mainframe=QFrame()mainframe.setLayout(QVBoxLayout())self.setWidget(mainframe)mainframe.layout().setContentsMargins(0,0,0,0)self.contextmenu=QMenu(self)self.tview=tv=RepoTreeView(self)tv.setModel(repotreemodel.RepoTreeModel(settingsfilename(),self,showSubrepos=self.showSubrepos,showNetworkSubrepos=self.showNetworkSubrepos))mainframe.layout().addWidget(tv)tv.setIndentation(10)tv.setFirstColumnSpanned(0,QModelIndex(),True)tv.setColumnHidden(1,True)tv.showMessage.connect(self.showMessage)tv.menuRequested.connect(self.onMenuRequest)tv.openRepo.connect(self.openRepo)self.createActions() QTimer.singleShot(0, self.expand)
def setShowSubrepos(self, show):
- self.showSubrepos = show
- self.reloadModel()
+ if self.showSubrepos != show:+ self.showSubrepos = show
+self.reloadModel()
def setShowNetworkSubrepos(self, show):
- self.showNetworkSubrepos = show
- self.reloadModel()
+ if self.showNetworkSubrepos != show:+ self.showNetworkSubrepos = show
+self.reloadModel()
def reloadModel(self):
self.tview.setModel(
repotreemodel.RepoTreeModel(settingsfilename(),self,self.showSubrepos,self.showNetworkSubrepos))self.expand()defexpand(self):self.tview.expandToDepth(0)defaddRepo(self,root):'workbench has opened a new repowidget, ensure it is in the registry'm=self.tview.model()it=m.getRepoItem(root)ifit==None:m.addRepo(None,root,-1)defshowPaths(self,show):self.tview.setColumnHidden(1,notshow)self.tview.setHeaderHidden(notshow)ifshow:self.tview.resizeColumnToContents(0)self.tview.resizeColumnToContents(1)defclose(self):self.tview.model().write(settingsfilename())def_action_defs(self):a=[("reloadRegistry",_("Refresh repository list"),'view-refresh',_("Refresh the Repository Registry list"),self.reloadModel),("open",_("Open"),'thg-repository-open',_("Open the repository in a new tab"),self.open),("openAll",_("Open All"),'thg-repository-open',_("Open all repositories in new tabs"),self.openAll),("newGroup",_("New Group"),'new-group',_("Create a new group"),self.newGroup),("rename",_("Rename"),None,_("Rename the entry"),self.startRename),("settings",_("Settings..."),'settings_user',_("View the repository's settings"),self.startSettings),("remove",_("Remove from registry"),'menudelete',_("Remove the node and all its subnodes."" Repositories are not deleted from disk."),self.removeSelected),("clone",_("Clone..."),'hg-clone',_("Clone Repository"),self.cloneRepo),("explore",_("Explore"),'system-file-manager',_("Open the repository in a file browser"),self.explore),("terminal",_("Terminal"),'utilities-terminal',_("Open a shell terminal in the repository root"),self.terminal),("add",_("Add repository..."),'hg',_("Add a repository to this group"),self.addNewRepo),]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)defonMenuRequest(self,point,selitem):menulist=selitem.internalPointer().menulist()ifnotmenulist:returnself.contextmenu.clear()foractinmenulist:ifact:self.contextmenu.addAction(self._actions[act])else:self.contextmenu.addSeparator()self.selitem=selitemself.contextmenu.exec_(point)### Menu action handlers#defcloneRepo(self):root=self.selitem.internalPointer().rootpath()d=clone.CloneDialog(args=[root,root+'-clone'],parent=self)d.finished.connect(d.deleteLater)d.clonedRepository.connect(self.open)d.show()defexplore(self):root=self.selitem.internalPointer().rootpath()QDesktopServices.openUrl(QUrl.fromLocalFile(root))defterminal(self):root=self.selitem.internalPointer().rootpath()qtlib.openshell(root)defaddNewRepo(self):'menu action handler for adding a new repository'caption=_('Select repository directory to add')FD=QFileDialogpath=FD.getExistingDirectory(caption=caption,options=FD.ShowDirsOnly|FD.ReadOnly)ifpath:root=paths.find_root(hglib.fromunicode(path))ifrootandnotself.tview.model().getRepoItem(root):try:self.tview.model().addRepo(self.selitem,root)excepterror.RepoError:qtlib.WarningMsgBox(_('Failed to add repository'),_('%s is not a valid repository')%path,parent=self)returndefstartSettings(self):root=self.selitem.internalPointer().rootpath()sd=settings.SettingsDialog(configrepo=True,focus='web.name',parent=self,root=root)sd.finished.connect(sd.deleteLater)sd.exec_()defopenAll(self):forrootinself.selitem.internalPointer().childRoots():self.openRepo.emit(hglib.tounicode(root),False)defopen(self):'open context menu action, open repowidget unconditionally'root=self.selitem.internalPointer().rootpath()repotype=self.selitem.internalPointer().repotype()ifrepotype=='hg':self.openRepo.emit(hglib.tounicode(root),False)else:qtlib.WarningMsgBox(_('Unsupported repository type (%s)')%repotype,_('Cannot open non mercurial repositories or subrepositories'),parent=self)defstartRename(self):self.tview.edit(self.selitem)defnewGroup(self):self.tview.model().addGroup(_('New Group'))defremoveSelected(self):s=self.selitemitem=s.internalPointer()ifnotitem.okToDelete():labels=[(QMessageBox.Yes,_('&Delete')),(QMessageBox.No,_('Cancel'))]ifnotqtlib.QuestionMsgBox(_('Confirm Delete'),_("Delete Group '%s' and all its entries?")%item.name,labels=labels,parent=self):returnm=self.tview.model()row=s.row()parent=s.parent()m.removeRows(row,1,parent)self.tview.selectionChanged(None,None)@pyqtSlot(QString,QString)defshortNameChanged(self,uroot,uname):it=self.tview.model().getRepoItem(hglib.fromunicode(uroot))ifit:it.setShortName(uname)self.tview.model().layoutChanged.emit()@pyqtSlot(QString,object)defbaseNodeChanged(self,uroot,basenode):it=self.tview.model().getRepoItem(hglib.fromunicode(uroot))ifit:it.setBaseNode(basenode)
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.