src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/largefiles.py

branch
eric7
changeset 9209
b99e7fd55fd3
parent 8881
54e42bc2437a
child 9221
bf71ee032bb4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/largefiles.py	Thu Jul 07 11:23:56 2022 +0200
@@ -0,0 +1,194 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2014 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the largefiles extension interface.
+"""
+
+import os
+
+from PyQt6.QtCore import QTimer
+from PyQt6.QtWidgets import QDialog
+
+from EricWidgets.EricApplication import ericApp
+from EricWidgets import EricMessageBox
+
+from ..HgExtension import HgExtension
+from ..HgDialog import HgDialog
+from ..HgClient import HgClient
+
+
+class Largefiles(HgExtension):
+    """
+    Class implementing the largefiles extension interface.
+    """
+    def __init__(self, vcs):
+        """
+        Constructor
+        
+        @param vcs reference to the Mercurial vcs object
+        """
+        super().__init__(vcs)
+    
+    def hgLfconvert(self, direction, projectFile):
+        """
+        Public slot to convert the repository format of the current project.
+        
+        @param direction direction of the conversion (string, one of
+            'largefiles' or 'normal')
+        @param projectFile file name of the current project file (string)
+        @exception ValueError raised to indicate a bad value for the
+            'direction' parameter.
+        """
+        if direction not in ["largefiles", "normal"]:
+            raise ValueError("Bad value for 'direction' parameter.")
+        
+        projectDir = os.path.dirname(projectFile)
+        
+        from .LfConvertDataDialog import LfConvertDataDialog
+        dlg = LfConvertDataDialog(projectDir, direction)
+        if dlg.exec() == QDialog.DialogCode.Accepted:
+            newName, minSize, patterns = dlg.getData()
+            newProjectFile = os.path.join(
+                newName, os.path.basename(projectFile))
+            
+            # step 1: convert the current project to new project
+            args = self.vcs.initCommand("lfconvert")
+            if direction == 'normal':
+                args.append('--to-normal')
+            else:
+                args.append("--size")
+                args.append(str(minSize))
+            args.append(projectDir)
+            args.append(newName)
+            if direction == 'largefiles' and patterns:
+                args.extend(patterns)
+            
+            dia = HgDialog(self.tr('Convert Project - Converting'), self.vcs)
+            res = dia.startProcess(args)
+            if res:
+                dia.exec()
+                res = dia.normalExit() and os.path.isdir(
+                    os.path.join(newName, self.vcs.adminDir))
+            
+            # step 2: create working directory contents
+            if res:
+                # step 2.1: start a command server client for the new repo
+                client = HgClient(newName, "utf-8", self.vcs)
+                ok, err = client.startServer()
+                if not ok:
+                    EricMessageBox.warning(
+                        None,
+                        self.tr("Mercurial Command Server"),
+                        self.tr(
+                            """<p>The Mercurial Command Server could not be"""
+                            """ started.</p><p>Reason: {0}</p>""").format(err))
+                    return
+                
+                # step 2.2: create working directory contents
+                args = self.vcs.initCommand("update")
+                args.append("--verbose")
+                dia = HgDialog(self.tr('Convert Project - Extracting'),
+                               self.vcs, client=client)
+                res = dia.startProcess(args)
+                if res:
+                    dia.exec()
+                    res = dia.normalExit() and os.path.isfile(newProjectFile)
+                
+                # step 2.3: stop the command server client for the new repo
+                client.stopServer()
+            
+            # step 3: close current project and open new one
+            if res:
+                if direction == 'largefiles':
+                    self.vcs.hgEditConfig(
+                        repoName=newName,
+                        largefilesData={"minsize": minSize,
+                                        "pattern": patterns}
+                    )
+                else:
+                    self.vcs.hgEditConfig(
+                        repoName=newName,
+                        withLargefiles=False
+                    )
+                QTimer.singleShot(
+                    0, lambda: ericApp().getObject("Project").openProject(
+                        newProjectFile))
+    
+    def hgAdd(self, names, mode):
+        """
+        Public method used to add a file to the Mercurial repository.
+        
+        @param names file name(s) to be added (string or list of string)
+        @param mode add mode (string one of 'normal' or 'large')
+        """
+        args = self.vcs.initCommand("add")
+        args.append("-v")
+        if mode == "large":
+            args.append("--large")
+        else:
+            args.append("--normal")
+        
+        if isinstance(names, list):
+            self.vcs.addArguments(args, names)
+        else:
+            args.append(names)
+        
+        dia = HgDialog(
+            self.tr('Adding files to the Mercurial repository'),
+            self.vcs)
+        res = dia.startProcess(args)
+        if res:
+            dia.exec()
+    
+    def hgLfPull(self, revisions=None):
+        """
+        Public method to pull missing large files into the local repository.
+        
+        @param revisions list of revisions to pull (list of string)
+        """
+        revs = []
+        if revisions:
+            revs = revisions
+        else:
+            from .LfRevisionsInputDialog import LfRevisionsInputDialog
+            dlg = LfRevisionsInputDialog()
+            if dlg.exec() == QDialog.DialogCode.Accepted:
+                revs = dlg.getRevisions()
+        
+        if revs:
+            args = self.vcs.initCommand("lfpull")
+            args.append("-v")
+            for rev in revs:
+                args.append("--rev")
+                args.append(rev)
+            
+            dia = HgDialog(self.tr("Pulling large files"), self.vcs)
+            res = dia.startProcess(args)
+            if res:
+                dia.exec()
+    
+    def hgLfVerify(self, mode):
+        """
+        Public method to verify large files integrity.
+        
+        @param mode verify mode (string; one of 'large', 'lfa' or 'lfc')
+        """
+        args = self.vcs.initCommand("verify")
+        if mode == "large":
+            args.append("--large")
+        elif mode == "lfa":
+            args.append("--lfa")
+        elif mode == "lfc":
+            args.append("--lfc")
+        else:
+            return
+        
+        dia = HgDialog(
+            self.tr('Verifying the integrity of large files'),
+            self.vcs)
+        res = dia.startProcess(args)
+        if res:
+            dia.exec()

eric ide

mercurial