Mon, 22 Jul 2013 20:08:29 +0200
Started to implement support for Mercurial queue repositories.
--- a/Plugins/VcsPlugins/vcsMercurial/HgCommitDialog.py Mon Jul 22 19:02:37 2013 +0200 +++ b/Plugins/VcsPlugins/vcsMercurial/HgCommitDialog.py Mon Jul 22 20:08:29 2013 +0200 @@ -25,20 +25,25 @@ accepted = pyqtSignal() rejected = pyqtSignal() - def __init__(self, vcs, parent=None): + def __init__(self, vcs, mq, parent=None): """ Constructor @param vcs reference to the vcs object + @param mq flag indicating a queue commit (boolean) @param parent parent widget (QWidget) """ super().__init__(parent, Qt.WindowFlags(Qt.Window)) self.setupUi(self) - if vcs.version < (2, 2): - self.amendCheckBox.setEnabled(False) - - self.subrepoCheckBox.setVisible(vcs.hasSubrepositories()) + if mq: + self.amendCheckBox.setVisible(False) + self.subrepoCheckBox.setVisible(False) + else: + if vcs.version < (2, 2): + self.amendCheckBox.setEnabled(False) + + self.subrepoCheckBox.setVisible(vcs.hasSubrepositories()) def showEvent(self, evt): """
--- a/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py Mon Jul 22 19:02:37 2013 +0200 +++ b/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py Mon Jul 22 20:08:29 2013 +0200 @@ -25,11 +25,12 @@ """ Class implementing a dialog to show the output of the hg status command process. """ - def __init__(self, vcs, parent=None): + def __init__(self, vcs, mq=False, parent=None): """ Constructor @param vcs reference to the vcs object + @param mq flag indicating to show a queue repo status (boolean) @param parent parent widget (QWidget) """ super().__init__(parent) @@ -52,37 +53,47 @@ self.vcs = vcs self.vcs.committed.connect(self.__committed) self.__hgClient = self.vcs.getClient() + self.__mq = mq self.statusList.headerItem().setText(self.__lastColumn, "") self.statusList.header().setSortIndicator(self.__pathColumn, Qt.AscendingOrder) + if mq: + self.buttonsLine.setVisible(False) + self.addButton.setVisible(False) + self.diffButton.setVisible(False) + self.revertButton.setVisible(False) + self.forgetButton.setVisible(False) + self.restoreButton.setVisible(False) + self.menuactions = [] self.menu = QMenu() - self.menuactions.append(self.menu.addAction( - self.trUtf8("Commit changes to repository..."), self.__commit)) - self.menuactions.append(self.menu.addAction( - self.trUtf8("Select all for commit"), self.__commitSelectAll)) - self.menuactions.append(self.menu.addAction( - self.trUtf8("Deselect all from commit"), self.__commitDeselectAll)) - self.menu.addSeparator() - self.menuactions.append(self.menu.addAction( - self.trUtf8("Add to repository"), self.__add)) - self.menuactions.append(self.menu.addAction( - self.trUtf8("Show differences"), self.__diff)) - self.menuactions.append(self.menu.addAction( - self.trUtf8("Remove from repository"), self.__forget)) - self.menuactions.append(self.menu.addAction( - self.trUtf8("Revert changes"), self.__revert)) - self.menuactions.append(self.menu.addAction( - self.trUtf8("Restore missing"), self.__restoreMissing)) - self.menu.addSeparator() - self.menuactions.append(self.menu.addAction(self.trUtf8("Adjust column sizes"), - self.__resizeColumns)) - for act in self.menuactions: - act.setEnabled(False) - - self.statusList.setContextMenuPolicy(Qt.CustomContextMenu) - self.statusList.customContextMenuRequested.connect(self.__showContextMenu) + if not mq: + self.menuactions.append(self.menu.addAction( + self.trUtf8("Commit changes to repository..."), self.__commit)) + self.menuactions.append(self.menu.addAction( + self.trUtf8("Select all for commit"), self.__commitSelectAll)) + self.menuactions.append(self.menu.addAction( + self.trUtf8("Deselect all from commit"), self.__commitDeselectAll)) + self.menu.addSeparator() + self.menuactions.append(self.menu.addAction( + self.trUtf8("Add to repository"), self.__add)) + self.menuactions.append(self.menu.addAction( + self.trUtf8("Show differences"), self.__diff)) + self.menuactions.append(self.menu.addAction( + self.trUtf8("Remove from repository"), self.__forget)) + self.menuactions.append(self.menu.addAction( + self.trUtf8("Revert changes"), self.__revert)) + self.menuactions.append(self.menu.addAction( + self.trUtf8("Restore missing"), self.__restoreMissing)) + self.menu.addSeparator() + self.menuactions.append(self.menu.addAction( + self.trUtf8("Adjust column sizes"), self.__resizeColumns)) + for act in self.menuactions: + act.setEnabled(False) + + self.statusList.setContextMenuPolicy(Qt.CustomContextMenu) + self.statusList.customContextMenuRequested.connect(self.__showContextMenu) self.modifiedIndicators = [ self.trUtf8('added'), @@ -190,22 +201,32 @@ self.statusFilterCombo.clear() self.__statusFilters = [] - self.setWindowTitle(self.trUtf8('Mercurial Status')) + if self.__mq: + self.setWindowTitle(self.trUtf8("Mercurial Queue Repository Status")) + else: + self.setWindowTitle(self.trUtf8('Mercurial Status')) args = [] args.append('status') self.vcs.addArguments(args, self.vcs.options['global']) - self.vcs.addArguments(args, self.vcs.options['status']) - - if self.vcs.hasSubrepositories(): - args.append("--subrepos") - - if isinstance(fn, list): - self.dname, fnames = self.vcs.splitPathList(fn) - self.vcs.addArguments(args, fn) + if self.__mq: + args.append('--mq') + if isinstance(fn, list): + self.dname, fnames = self.vcs.splitPathList(fn) + else: + self.dname, fname = self.vcs.splitPath(fn) else: - self.dname, fname = self.vcs.splitPath(fn) - args.append(fn) + self.vcs.addArguments(args, self.vcs.options['status']) + + if self.vcs.hasSubrepositories(): + args.append("--subrepos") + + if isinstance(fn, list): + self.dname, fnames = self.vcs.splitPathList(fn) + self.vcs.addArguments(args, fn) + else: + self.dname, fname = self.vcs.splitPath(fn) + args.append(fn) # find the root of the repo repodir = self.dname @@ -541,20 +562,23 @@ """ Private slot to handle the Commit context menu entry. """ - names = [os.path.join(self.dname, itm.text(self.__pathColumn)) \ - for itm in self.__getCommitableItems()] - if not names: - E5MessageBox.information(self, - self.trUtf8("Commit"), - self.trUtf8("""There are no entries selected to be""" - """ committed.""")) - return - - if Preferences.getVCS("AutoSaveFiles"): - vm = e5App().getObject("ViewManager") - for name in names: - vm.saveEditor(name) - self.vcs.vcsCommit(names, '') + if self.__mq: + self.vcs.vcsCommit(self.dname, "", mq=True) + else: + names = [os.path.join(self.dname, itm.text(self.__pathColumn)) \ + for itm in self.__getCommitableItems()] + if not names: + E5MessageBox.information(self, + self.trUtf8("Commit"), + self.trUtf8("""There are no entries selected to be""" + """ committed.""")) + return + + if Preferences.getVCS("AutoSaveFiles"): + vm = e5App().getObject("ViewManager") + for name in names: + vm.saveEditor(name) + self.vcs.vcsCommit(names, '') def __committed(self): """
--- a/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.ui Mon Jul 22 19:02:37 2013 +0200 +++ b/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.ui Mon Jul 22 20:08:29 2013 +0200 @@ -105,7 +105,7 @@ </widget> </item> <item> - <widget class="Line" name="line"> + <widget class="Line" name="buttonsLine"> <property name="orientation"> <enum>Qt::Vertical</enum> </property>
--- a/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/ProjectHelper.py Mon Jul 22 19:02:37 2013 +0200 +++ b/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/ProjectHelper.py Mon Jul 22 20:08:29 2013 +0200 @@ -31,6 +31,34 @@ """ Public method to generate the action objects. """ + self.hgQueueInitAct = E5Action(self.trUtf8('Init Queue Repository'), + self.trUtf8('Init Queue Repository'), + 0, 0, self, 'mercurial_queues_init') + self.hgQueueInitAct.setStatusTip(self.trUtf8( + 'Initialize a new versioned queue repository' + )) + self.hgQueueInitAct.setWhatsThis(self.trUtf8( + """<b>Init Queue Repository</b>""" + """<p>This initializes a new versioned queue repository inside the""" + """ current repository.</p>""" + )) + self.hgQueueInitAct.triggered[()].connect(self.__hgQueueInit) + self.actions.append(self.hgQueueInitAct) + + self.hgQueueCommitAct = E5Action( + self.trUtf8('Commit changes'), + self.trUtf8('Commit changes...'), + 0, 0, self, 'mercurial_queues_commit') + self.hgQueueCommitAct.setStatusTip(self.trUtf8( + 'Commit changes in the queue repository' + )) + self.hgQueueCommitAct.setWhatsThis(self.trUtf8( + """<b>Commit changes...</b>""" + """<p>This commits changes in the queue repository.</p>""" + )) + self.hgQueueCommitAct.triggered[()].connect(self.__hgQueueCommit) + self.actions.append(self.hgQueueCommitAct) + self.hgQueueNewAct = E5Action(self.trUtf8('New Patch'), self.trUtf8('New Patch...'), 0, 0, self, 'mercurial_queues_new') @@ -167,6 +195,19 @@ self.hgQueueFoldAct.triggered[()].connect(self.__hgQueueFoldUnappliedPatches) self.actions.append(self.hgQueueFoldAct) + self.hgQueueStatusAct = E5Action(self.trUtf8('Show Status'), + self.trUtf8('Show &Status...'), + 0, 0, self, 'mercurial_queues_status') + self.hgQueueStatusAct.setStatusTip(self.trUtf8( + 'Show the status of the queue repository' + )) + self.hgQueueStatusAct.setWhatsThis(self.trUtf8( + """<b>Show Status</b>""" + """<p>This shows the status of the queue repository.</p>""" + )) + self.hgQueueStatusAct.triggered[()].connect(self.__hgQueueStatus) + self.actions.append(self.hgQueueStatusAct) + self.__initPushPopActions() self.__initPushPopForceActions() self.__initGuardsActions() @@ -622,11 +663,16 @@ queuesMenu.addSeparator() queuesMenu.addAction(self.hgQueueListQueuesAct) + menu.addAction(self.hgQueueInitAct) + menu.addAction(self.hgQueueCommitAct) + menu.addSeparator() menu.addAction(self.hgQueueNewAct) menu.addAction(self.hgQueueRefreshAct) menu.addAction(self.hgQueueRefreshMessageAct) menu.addAction(self.hgQueueFinishAct) menu.addSeparator() + menu.addAction(self.hgQueueStatusAct) + menu.addSeparator() menu.addAction(self.hgQueueDiffAct) menu.addAction(self.hgQueueHeaderAct) menu.addSeparator() @@ -951,3 +997,23 @@ """ self.vcs.getExtensionObject("mq")\ .hgQueueListQueues(self.project.getProjectPath()) + + def __hgQueueInit(self): + """ + Private slot to initialize a new queue repository. + """ + self.vcs.getExtensionObject("mq")\ + .hgQueueInit(self.project.getProjectPath()) + + def __hgQueueCommit(self): + """ + Private slot to commit changes in the queue repository. + """ + self.vcs.vcsCommit(self.project.getProjectPath(), "", mq=True) + + def __hgQueueStatus(self): + """ + Private slot to show the status of the queue repository. + """ + self.vcs.getExtensionObject("mq")\ + .hgQueueStatus(self.project.getProjectPath())
--- a/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/queues.py Mon Jul 22 19:02:37 2013 +0200 +++ b/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/queues.py Mon Jul 22 20:08:29 2013 +0200 @@ -51,6 +51,7 @@ self.queuesListAllGuardsDialog = None self.queuesDefineGuardsDialog = None self.queuesListQueuesDialog = None + self.queueStatusDialog = None def shutdown(self): """ @@ -70,6 +71,8 @@ self.queuesDefineGuardsDialog.close() if self.queuesListQueuesDialog is not None: self.queuesListQueuesDialog.close() + if self.queueStatusDialog is not None: + self.queueStatusDialog.close() def __getPatchesList(self, repodir, listType, withSummary=False): """ @@ -892,3 +895,37 @@ self.trUtf8("Available Queues"), False, repodir, self.vcs) self.queuesListQueuesDialog.show() + + def hgQueueInit(self, name): + """ + Public method to initialize a new queue repository. + + @param name directory name (string) + """ + # find the root of the repo + repodir = self.vcs.splitPath(name)[0] + while not os.path.isdir(os.path.join(repodir, self.vcs.adminDir)): + repodir = os.path.dirname(repodir) + if os.path.splitdrive(repodir)[1] == os.sep: + return + + args = [] + args.append('init') + args.append('--mq') + args.append(repodir) + # init is not possible with the command server + dia = HgDialog(self.trUtf8('Initializing new queue repository'), self.vcs) + res = dia.startProcess(args) + if res: + dia.exec_() + + def hgQueueStatus(self, name): + """ + Public method used to view the status of a queue repository. + + @param name directory name (string) + """ + from ..HgStatusDialog import HgStatusDialog + self.queueStatusDialog = HgStatusDialog(self.vcs, mq=True) + self.queueStatusDialog.show() + self.queueStatusDialog.start(name)
--- a/Plugins/VcsPlugins/vcsMercurial/hg.py Mon Jul 22 19:02:37 2013 +0200 +++ b/Plugins/VcsPlugins/vcsMercurial/hg.py Mon Jul 22 20:08:29 2013 +0200 @@ -367,7 +367,7 @@ os.remove(os.path.join(projectDir, '.hgignore')) return status - def vcsCommit(self, name, message, noDialog=False, closeBranch=False): + def vcsCommit(self, name, message, noDialog=False, closeBranch=False, mq=False): """ Public method used to make the change of a file/directory permanent in the Mercurial repository. @@ -376,14 +376,19 @@ @param message message for this operation (string) @param noDialog flag indicating quiet operations @keyparam closeBranch flag indicating a close branch commit (boolean) + @keyparam mq flag indicating a queue commit (boolean) """ msg = message + if mq: + # ensure dialog is shown for a queue commit + noDialog = False + if not noDialog and not msg: # call CommitDialog and get message from there if self.__commitDialog is None: from .HgCommitDialog import HgCommitDialog - self.__commitDialog = HgCommitDialog(self, self.__ui) + self.__commitDialog = HgCommitDialog(self, mq, self.__ui) self.__commitDialog.accepted.connect(self.__vcsCommit_Step2) self.__commitDialog.show() self.__commitDialog.raise_() @@ -393,6 +398,7 @@ self.__commitData["msg"] = msg self.__commitData["noDialog"] = noDialog self.__commitData["closeBranch"] = closeBranch + self.__commitData["mq"] = mq if noDialog: self.__vcsCommit_Step2() @@ -405,6 +411,7 @@ msg = self.__commitData["msg"] noDialog = self.__commitData["noDialog"] closeBranch = self.__commitData["closeBranch"] + mq = self.__commitData["mq"] if not noDialog: # check, if there are unsaved changes, that should be committed @@ -441,7 +448,6 @@ msg = self.__commitDialog.logMessage() amend = self.__commitDialog.amend() commitSubrepositories = self.__commitDialog.commitSubrepositories() -## self.__commitDialog.accepted.disconnect(self.__vcsCommit_Step2) self.__commitDialog.deleteLater() self.__commitDialog = None else: @@ -456,12 +462,15 @@ self.addArguments(args, self.options['global']) self.addArguments(args, self.options['commit']) args.append("-v") - if closeBranch: - args.append("--close-branch") - if amend: - args.append("--amend") - if commitSubrepositories: - args.append("--subrepos") + if mq: + args.append("--mq") + else: + if closeBranch: + args.append("--close-branch") + if amend: + args.append("--amend") + if commitSubrepositories: + args.append("--subrepos") if msg: args.append("--message") args.append(msg)