Plugins/VcsPlugins/vcsMercurial/HisteditExtension/histedit.py

changeset 5283
06423d65a2b8
child 5291
e93d14b48c34
diff -r 898b0dda21e1 -r 06423d65a2b8 Plugins/VcsPlugins/vcsMercurial/HisteditExtension/histedit.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/histedit.py	Sat Oct 29 19:28:04 2016 +0200
@@ -0,0 +1,192 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2016 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the histedit extension interface.
+"""
+
+from __future__ import unicode_literals
+
+import os
+import sys
+
+from PyQt5.QtWidgets import QDialog
+
+from ..HgExtension import HgExtension
+from ..HgDialog import HgDialog
+
+
+class Histedit(HgExtension):
+    """
+    Class implementing the histedit extension interface.
+    """
+    def __init__(self, vcs):
+        """
+        Constructor
+        
+        @param vcs reference to the Mercurial vcs object
+        @type Hg
+        """
+        super(Histedit, self).__init__(vcs)
+    
+    def hgHisteditStart(self, name, rev=""):
+        """
+        Public method to start a histedit session.
+        
+        @param name file/directory name
+        @type str
+        @keyparam rev revision to start histedit at
+        @type str
+        @return flag indicating that the project should be reread
+        @rtype bool
+        """
+        # 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 False
+        
+        from .HgHisteditConfigDialog import HgHisteditConfigDialog
+        res = False
+        dlg = HgHisteditConfigDialog(self.vcs.hgGetTagsList(repodir),
+                            self.vcs.hgGetBranchesList(repodir),
+                            self.vcs.hgGetBookmarksList(repodir),
+                            rev)
+        if dlg.exec_() == QDialog.Accepted:
+            rev, force, keep = dlg.getData()
+            
+            args = self.vcs.initCommand("histedit")
+            args.append("-v")
+            if keep:
+                args.append("--keep")
+            if rev:
+                if rev == "--outgoing":
+                    if force:
+                        args.append("--force")
+                else:
+                    args.append("--rev")
+                args.append(rev)
+            
+            editor = os.path.join(
+                os.path.dirname(__file__), "HgHisteditEditor.py")
+            env = {"HGEDITOR": "{0} {1}".format(sys.executable, editor)}
+            
+            dia = HgDialog(
+                self.tr("Starting histedit session"),
+                self.vcs, 
+                useClient=False)
+            res = dia.startProcess(args, repodir, environment=env)
+            if res:
+                dia.exec_()
+                res = dia.hasAddOrDelete()
+                self.vcs.checkVCSStatus()
+        return res
+    
+    def hgHisteditContinue(self, name):
+        """
+        Public method to continue an interrupted histedit session.
+        
+        @param name file/directory name
+        @type str
+        @return flag indicating that the project should be reread
+        @rtype bool
+        """
+        # 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 False
+        
+        args = self.vcs.initCommand("histedit")
+        args.append("--continue")
+        args.append("-v")
+        
+        editor = os.path.join(
+            os.path.dirname(__file__), "HgHisteditEditor.py")
+        env = {"HGEDITOR": "{0} {1}".format(sys.executable, editor)}
+        
+        dia = HgDialog(
+            self.tr("Continue histedit session"),
+            self.vcs, 
+            useClient=False)
+        res = dia.startProcess(args, repodir, environment=env)
+        if res:
+            dia.exec_()
+            res = dia.hasAddOrDelete()
+            self.vcs.checkVCSStatus()
+        return res
+    
+    def hgHisteditAbort(self, name):
+        """
+        Public method to abort an interrupted histedit session.
+        
+        @param name file/directory name
+        @type str
+        @return flag indicating that the project should be reread
+        @rtype bool
+        """
+        # 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 False
+        
+        args = self.vcs.initCommand("histedit")
+        args.append("--abort")
+        args.append("-v")
+        
+        editor = os.path.join(
+            os.path.dirname(__file__), "HgHisteditEditor.py")
+        env = {"HGEDITOR": "{0} {1}".format(sys.executable, editor)}
+        
+        dia = HgDialog(
+            self.tr("Abort histedit session"),
+            self.vcs, 
+            useClient=False)
+        res = dia.startProcess(args, repodir, environment=env)
+        if res:
+            dia.exec_()
+            res = dia.hasAddOrDelete()
+            self.vcs.checkVCSStatus()
+        return res
+    
+    def hgHisteditEditPlan(self, name):
+        """
+        Public method to edit the remaining actions list of an interrupted
+        histedit session.
+        
+        @param name file/directory name
+        @type str
+        @return flag indicating that the project should be reread
+        @rtype bool
+        """
+        # 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 False
+        
+        args = self.vcs.initCommand("histedit")
+        args.append("--edit-plan")
+        args.append("-v")
+        
+        editor = os.path.join(
+            os.path.dirname(__file__), "HgHisteditEditor.py")
+        env = {"HGEDITOR": "{0} {1}".format(sys.executable, editor)}
+        
+        dia = HgDialog(
+            self.tr("Edit Plan"),
+            self.vcs, 
+            useClient=False)
+        res = dia.startProcess(args, repodir, environment=env)
+        if res:
+            dia.exec_()
+            res = dia.hasAddOrDelete()
+            self.vcs.checkVCSStatus()
+        return res

eric ide

mercurial