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.importsysimportosfromPyQt4importQtCore,QtGuifromPyQt4.QtCoreimportQt,QVariant,SIGNAL,SLOTfromPyQt4.QtCoreimportQModelIndex,QStringfromPyQt4.QtGuiimportQVBoxLayout,QDockWidget,QFramefromtortoisehg.hgqt.i18nimport_fromtortoisehg.hgqt.qtlibimportgeticonfromsettingsimportSettingsDialogconnect=QtCore.QObject.connectextractXmlElementName='reporegextract'reporegistryXmlElementName='reporegistry'repoRegMimeType='application/thg-reporegistry'xmlClassMap={'allgroup':'AllRepoGroupItem','group':'RepoGroupItem','repo':'RepoItem','treeitem':'RepoTreeItem',}inverseXmlClassMap={}defxmlToClass(ele):returnxmlClassMap[ele]defclassToXml(classname):iflen(inverseXmlClassMap)==0:fork,vinxmlClassMap.iteritems():inverseXmlClassMap[v]=kreturninverseXmlClassMap[classname]defsettingsfilename():s=QtCore.QSettings()dir=os.path.dirname(str(s.fileName()))returndir+'/'+'thg-reporegistry.xml'defwriteXml(target,item,rootElementName):xw=QtCore.QXmlStreamWriter(target)xw.setAutoFormatting(True)xw.setAutoFormattingIndent(2)xw.writeStartDocument()xw.writeStartElement(rootElementName)item.dumpObject(xw)xw.writeEndElement()xw.writeEndDocument()defreadXml(source,rootElementName,model):itemread=Nonexr=QtCore.QXmlStreamReader(source)ifxr.readNextStartElement():ele=str(xr.name().toString())ifele!=rootElementName:print"unexpected xml element '%s' "\
"(was looking for %s)"%(ele,rootElementName)returnifxr.hasError():printstr(xr.errorString())ifxr.readNextStartElement():itemread=undumpObject(xr,model)xr.skipCurrentElement()ifxr.hasError():printstr(xr.errorString())returnitemreaddefundumpObject(xr,model):classname=xmlToClass(str(xr.name().toString()))class_=getattr(sys.modules[RepoTreeItem.__module__],classname)obj=class_(model)obj.undump(xr)returnobjclassRepoTreeItem:def__init__(self,model,parent=None):self.model=modelself._parent=parentself.childs=[]self._row=0defappendChild(self,child):child._row=len(self.childs)child._parent=selfself.childs.append(child)defchild(self,row):returnself.childs[row]defchildCount(self):returnlen(self.childs)defcolumnCount(self):return2defdata(self,column,role):returnQVariant()defsetData(self,column,value):returnFalsedefrow(self):returnself._rowdefparent(self):returnself._parentdefmenulist(self):return[]defflags(self):returnQt.NoItemFlagsdefremoveRows(self,row,count):cs=self.childsremove=cs[row:row+count]keep=cs[:row]+cs[row+count:]self.childs=keepforcinremove:c._row=0c._parent=Nonefori,cinenumerate(keep):c._row=ireturnTruedefdump(self,xw):forcinself.childs:c.dumpObject(xw)defundump(self,xr):whilenotxr.atEnd():xr.readNext()ifxr.isStartElement():item=undumpObject(xr,self.model)self.appendChild(item)elifxr.isEndElement():breakdefdumpObject(self,xw):xw.writeStartElement(classToXml(self.__class__.__name__))self.dump(xw)xw.writeEndElement()defopen(self):passclassRepoItem(RepoTreeItem):def__init__(self,model,rootpath='',parent=None):RepoTreeItem.__init__(self,model,parent)self._root=rootpathself._setttingsdlg=Nonedefrootpath(self):returnself._rootdefdata(self,column,role):ifrole==Qt.DecorationRole:ifcolumn==0:ico=geticon('hg')returnQVariant(ico)returnQVariant()ifcolumn==0:returnQVariant(os.path.basename(self._root))elifcolumn==1:returnQVariant(self._root)returnQVariant()defmenulist(self):return['open','remove',None,'settings']defflags(self):returnQt.ItemIsEnabled|Qt.ItemIsSelectable|Qt.ItemIsDragEnableddefremoveRows(self,row,count):returnFalsedefdump(self,xw):RepoTreeItem.dump(self,xw)xw.writeAttribute('root',self._root)defundump(self,xr):a=xr.attributes()self._root=str(a.value('','root').toString())RepoTreeItem.undump(self,xr)defopen(self):self.model.openrepofunc(self._root) def startSettings(self, parent):
if self._setttingsdlg is None:
self._setttingsdlg = SettingsDialog(
- configrepo=True, parent=parent, root=self._root)
+ configrepo=True, focus='web.name', parent=parent,
+ root=self._root)
self._setttingsdlg.show()
classRepoGroupItem(RepoTreeItem):def__init__(self,model,name=None,parent=None):RepoTreeItem.__init__(self,model,parent)ifname:self.name=nameelse:self.name=QString()defdata(self,column,role):ifrole==Qt.DecorationRole:ifcolumn==0:s=QtGui.QApplication.style()ico=s.standardIcon(QtGui.QStyle.SP_DirIcon)returnQVariant(ico)returnQVariant()ifcolumn==0:returnQVariant(self.name)returnQVariant()defsetData(self,column,value):ifcolumn==0:self.name=value.toString()returnTruereturnFalsedefmenulist(self):return['newGroup',None,'rename','remove']defflags(self):return(Qt.ItemIsEnabled|Qt.ItemIsSelectable|Qt.ItemIsDropEnabled|Qt.ItemIsEditable)defdump(self,xw):xw.writeAttribute('name',self.name)RepoTreeItem.dump(self,xw)defundump(self,xr):a=xr.attributes()self.name=a.value('','name').toString()RepoTreeItem.undump(self,xr)classAllRepoGroupItem(RepoTreeItem):def__init__(self,model,parent=None):RepoTreeItem.__init__(self,model,parent)defdata(self,column,role):ifrole==Qt.DecorationRole:ifcolumn==0:s=QtGui.QApplication.style()ico=s.standardIcon(QtGui.QStyle.SP_DirIcon)returnQVariant(ico)returnQVariant()ifcolumn==0:returnQVariant(_('all'))returnQVariant()defsetData(self,column,value):returnFalsedefmenulist(self):return['newGroup']defflags(self):returnQt.ItemIsEnabled|Qt.ItemIsSelectable|Qt.ItemIsDropEnableddefdump(self,xw):RepoTreeItem.dump(self,xw)defundump(self,xr):RepoTreeItem.undump(self,xr)classRepoTreeModel(QtCore.QAbstractItemModel):def__init__(self,openrepofunc,filename=None,parent=None):QtCore.QAbstractItemModel.__init__(self,parent)self.openrepofunc=openrepofuncroot=Noneall=Noneiffilename:f=QtCore.QFile(settingsfilename())iff.open(QtCore.QIODevice.ReadOnly):root=readXml(f,reporegistryXmlElementName,self)f.close()ifroot:forcinroot.childs:ifisinstance(c,AllRepoGroupItem):all=cbreakifnotroot:root=RepoTreeItem()all=AllRepoGroupItem()root.appendChild(all)self.rootItem=rootself.allrepos=all# see http://doc.qt.nokia.com/4.6/model-view-model-subclassing.html# overrides from QAbstractItemModeldefindex(self,row,column,parent):ifnotself.hasIndex(row,column,parent):returnQModelIndex()if(notparent.isValid()):parentItem=self.rootItemelse:parentItem=parent.internalPointer()childItem=parentItem.child(row)ifchildItem:returnself.createIndex(row,column,childItem)else:returnQModelIndex()defparent(self,index):ifnotindex.isValid():returnQModelIndex()childItem=index.internalPointer()parentItem=childItem.parent()ifparentItemisself.rootItem:returnQModelIndex()returnself.createIndex(parentItem.row(),0,parentItem)defrowCount(self,parent):ifparent.column()>0:return0ifnotparent.isValid():parentItem=self.rootItem;else:parentItem=parent.internalPointer()returnparentItem.childCount()defcolumnCount(self,parent):ifparent.isValid():returnparent.internalPointer().columnCount()else:returnself.rootItem.columnCount()defdata(self,index,role):ifnotindex.isValid():returnQVariant()if(role!=Qt.DisplayRoleandrole!=Qt.EditRoleandrole!=Qt.DecorationRole):returnQVariant()item=index.internalPointer()returnitem.data(index.column(),role)defheaderData(self,section,orientation,role):ifrole==Qt.DisplayRole:iforientation==Qt.Horizontal:ifsection==1:returnQString(_('Path'))returnQVariant()defflags(self,index):ifnotindex.isValid():returnQt.NoItemFlagsitem=index.internalPointer()returnitem.flags()defsupportedDropActions(self):returnQt.MoveActiondefremoveRows(self,row,count,parent):item=parent.internalPointer()ifitemisNone:item=self.rootItemself.beginRemoveRows(parent,row,row+count-1)res=item.removeRows(row,count)self.endRemoveRows()returnresdefmimeTypes(self):returnQtCore.QStringList(repoRegMimeType)defmimeData(self,indexes):i=indexes[0]item=i.internalPointer()buf=QtCore.QByteArray()writeXml(buf,item,extractXmlElementName)d=QtCore.QMimeData()d.setData(repoRegMimeType,buf)returnddefdropMimeData(self,data,action,row,column,parent):d=str(data.data(repoRegMimeType))itemread=readXml(d,extractXmlElementName,self)group=parent.internalPointer()cc=group.childCount()self.beginInsertRows(parent,cc,cc)group.appendChild(itemread)self.endInsertRows()returnTruedefsetData(self,index,value,role):ifnotindex.isValid()orrole!=Qt.EditRole:returnFalses=value.toString()ifs.isEmpty():returnFalseitem=index.internalPointer()ifitem.setData(index.column(),value):self.emit(SIGNAL('dataChanged(index, index)'),index,index)returnTruereturnFalse# functions not defined in QAbstractItemModeldefallreposIndex(self):returnself.createIndex(0,0,self.allrepos)defaddRepo(self,reporoot):all=self.allreposcc=all.childCount()self.beginInsertRows(self.allreposIndex(),cc,cc+1)all.appendChild(RepoItem(reporoot))self.endInsertRows()defgetRepoItem(self,reporoot):forcinself.allrepos.childs:ifc.rootpath()==reporoot:returncreturnNonedefaddGroup(self,name):ri=self.rootItemcc=ri.childCount()self.beginInsertRows(QModelIndex(),cc,cc+1)ri.appendChild(RepoGroupItem(name,ri))self.endInsertRows()defwrite(self,fn):f=QtCore.QFile(fn)f.open(QtCore.QIODevice.WriteOnly)writeXml(f,self.rootItem,reporegistryXmlElementName)f.close()classRepoTreeView(QtGui.QTreeView):def__init__(self,parent):QtGui.QTreeView.__init__(self)self.parent=parentself.selitem=Noneself.setExpandsOnDoubleClick(False)# enable drag and drop# (see http://doc.qt.nokia.com/4.6/model-view-dnd.html)self.setDragEnabled(True)self.setAcceptDrops(True)self.setDragDropMode(QtGui.QAbstractItemView.DragDrop)self.setDropIndicatorShown(True)self.createActions()defcontextMenuEvent(self,event):menulist=self.selitem.internalPointer().menulist()iflen(menulist)>0:menu=QtGui.QMenu(self)foractinmenulist:ifact:menu.addAction(self._actions[act])else:menu.addSeparator()menu.exec_(event.globalPos())defmouseDoubleClickEvent(self,event):self.open()defselectionChanged(self,selected,deselected):selection=self.selectedIndexes()iflen(selection)==0:self.selitem=Noneelse:self.selitem=selection[0]def_action_defs(self):a=[("open",_("Open"),None,_("Opens the repository in a new tab"),None,self.open),("newGroup",_("New Group"),None,_("Create a new group"),None,self.newGroup),("rename",_("Rename"),None,_("Rename the entry"),None,self.startRename),("settings",_("Settings"),None,_("View the repository's settings"),None,self.startSettings),("remove",_("Remove entry"),None,_("Remove the entry"),None,self.removeSelected),]returnadefcreateActions(self):self._actions={}forname,desc,icon,tip,key,cbinself._action_defs():self._actions[name]=QtGui.QAction(desc,self)QtCore.QTimer.singleShot(0,self.configureActions)defconfigureActions(self):forname,desc,icon,tip,key,cbinself._action_defs():act=self._actions[name]''' if icon: act.setIcon(geticon(icon)) '''iftip:act.setStatusTip(tip)ifkey:act.setShortcut(key)ifcb:connect(act,SIGNAL('triggered()'),cb)self.addAction(act)defstartSettings(self):ifnotself.selitem:returnself.selitem.internalPointer().startSettings(self.parent)defstartRename(self):ifnotself.selitem:returnself.edit(self.selitem)defopen(self):ifnotself.selitem:returnself.selitem.internalPointer().open()defnewGroup(self):m=self.model()m.addGroup(_('New Group'))defremoveSelected(self):ifnotself.selitem:returnm=self.model()s=self.selitemrow=s.row()parent=s.parent()m.removeRows(row,1,parent)classRepoRegistryView(QDockWidget):openRepoSignal=QtCore.pyqtSignal(QtCore.QString)visibilityChanged=QtCore.pyqtSignal(bool)def__init__(self,parent):QDockWidget.__init__(self,parent)self.setFeatures(QDockWidget.DockWidgetClosable|QDockWidget.DockWidgetMovable|QDockWidget.DockWidgetFloatable)self.setWindowTitle(_('Repository Registry'))mainframe=QFrame()lay=QVBoxLayout()lay.setContentsMargins(0,0,0,0)mainframe.setLayout(lay)self.setWidget(mainframe)self.tmodel=m=RepoTreeModel(self.openrepo,settingsfilename())self.tview=tv=RepoTreeView(self)lay.addWidget(tv)tv.setModel(m)tv.setIndentation(10)tv.setFirstColumnSpanned(0,QModelIndex(),True)self.tview.setColumnHidden(1,True)QtCore.QTimer.singleShot(0,self.expand)defexpand(self):self.tview.expandToDepth(0)defaddRepo(self,reporoot):m=self.tmodelifm.getRepoItem(reporoot)==None:m.addRepo(reporoot)defopenrepo(self,path):self.openRepoSignal.emit(path)defshowPaths(self,show):self.tview.setColumnHidden(1,notshow)ifshow:self.tview.resizeColumnToContents(0)self.tview.resizeColumnToContents(1)defclose(self):self.tmodel.write(settingsfilename())defshowEvent(self,event):self.visibilityChanged.emit(True)defhideEvent(self,event):self.visibilityChanged.emit(False)
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.