Started to implement support for Mercurial queue repositories.

Mon, 22 Jul 2013 20:08:29 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 22 Jul 2013 20:08:29 +0200
changeset 2815
53c1d1f9ec86
parent 2814
2688e49ccdc0
child 2816
05aab5164d64

Started to implement support for Mercurial queue repositories.

Plugins/VcsPlugins/vcsMercurial/HgCommitDialog.py file | annotate | diff | comparison | revisions
Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py file | annotate | diff | comparison | revisions
Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.ui file | annotate | diff | comparison | revisions
Plugins/VcsPlugins/vcsMercurial/QueuesExtension/ProjectHelper.py file | annotate | diff | comparison | revisions
Plugins/VcsPlugins/vcsMercurial/QueuesExtension/queues.py file | annotate | diff | comparison | revisions
Plugins/VcsPlugins/vcsMercurial/hg.py file | annotate | diff | comparison | revisions
--- 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)

eric ide

mercurial