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

branch
eric7
changeset 9209
b99e7fd55fd3
parent 8881
54e42bc2437a
child 9221
bf71ee032bb4
equal deleted inserted replaced
9208:3fc8dfeb6ebe 9209:b99e7fd55fd3
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2014 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the largefiles extension interface.
8 """
9
10 import os
11
12 from PyQt6.QtCore import QTimer
13 from PyQt6.QtWidgets import QDialog
14
15 from EricWidgets.EricApplication import ericApp
16 from EricWidgets import EricMessageBox
17
18 from ..HgExtension import HgExtension
19 from ..HgDialog import HgDialog
20 from ..HgClient import HgClient
21
22
23 class Largefiles(HgExtension):
24 """
25 Class implementing the largefiles extension interface.
26 """
27 def __init__(self, vcs):
28 """
29 Constructor
30
31 @param vcs reference to the Mercurial vcs object
32 """
33 super().__init__(vcs)
34
35 def hgLfconvert(self, direction, projectFile):
36 """
37 Public slot to convert the repository format of the current project.
38
39 @param direction direction of the conversion (string, one of
40 'largefiles' or 'normal')
41 @param projectFile file name of the current project file (string)
42 @exception ValueError raised to indicate a bad value for the
43 'direction' parameter.
44 """
45 if direction not in ["largefiles", "normal"]:
46 raise ValueError("Bad value for 'direction' parameter.")
47
48 projectDir = os.path.dirname(projectFile)
49
50 from .LfConvertDataDialog import LfConvertDataDialog
51 dlg = LfConvertDataDialog(projectDir, direction)
52 if dlg.exec() == QDialog.DialogCode.Accepted:
53 newName, minSize, patterns = dlg.getData()
54 newProjectFile = os.path.join(
55 newName, os.path.basename(projectFile))
56
57 # step 1: convert the current project to new project
58 args = self.vcs.initCommand("lfconvert")
59 if direction == 'normal':
60 args.append('--to-normal')
61 else:
62 args.append("--size")
63 args.append(str(minSize))
64 args.append(projectDir)
65 args.append(newName)
66 if direction == 'largefiles' and patterns:
67 args.extend(patterns)
68
69 dia = HgDialog(self.tr('Convert Project - Converting'), self.vcs)
70 res = dia.startProcess(args)
71 if res:
72 dia.exec()
73 res = dia.normalExit() and os.path.isdir(
74 os.path.join(newName, self.vcs.adminDir))
75
76 # step 2: create working directory contents
77 if res:
78 # step 2.1: start a command server client for the new repo
79 client = HgClient(newName, "utf-8", self.vcs)
80 ok, err = client.startServer()
81 if not ok:
82 EricMessageBox.warning(
83 None,
84 self.tr("Mercurial Command Server"),
85 self.tr(
86 """<p>The Mercurial Command Server could not be"""
87 """ started.</p><p>Reason: {0}</p>""").format(err))
88 return
89
90 # step 2.2: create working directory contents
91 args = self.vcs.initCommand("update")
92 args.append("--verbose")
93 dia = HgDialog(self.tr('Convert Project - Extracting'),
94 self.vcs, client=client)
95 res = dia.startProcess(args)
96 if res:
97 dia.exec()
98 res = dia.normalExit() and os.path.isfile(newProjectFile)
99
100 # step 2.3: stop the command server client for the new repo
101 client.stopServer()
102
103 # step 3: close current project and open new one
104 if res:
105 if direction == 'largefiles':
106 self.vcs.hgEditConfig(
107 repoName=newName,
108 largefilesData={"minsize": minSize,
109 "pattern": patterns}
110 )
111 else:
112 self.vcs.hgEditConfig(
113 repoName=newName,
114 withLargefiles=False
115 )
116 QTimer.singleShot(
117 0, lambda: ericApp().getObject("Project").openProject(
118 newProjectFile))
119
120 def hgAdd(self, names, mode):
121 """
122 Public method used to add a file to the Mercurial repository.
123
124 @param names file name(s) to be added (string or list of string)
125 @param mode add mode (string one of 'normal' or 'large')
126 """
127 args = self.vcs.initCommand("add")
128 args.append("-v")
129 if mode == "large":
130 args.append("--large")
131 else:
132 args.append("--normal")
133
134 if isinstance(names, list):
135 self.vcs.addArguments(args, names)
136 else:
137 args.append(names)
138
139 dia = HgDialog(
140 self.tr('Adding files to the Mercurial repository'),
141 self.vcs)
142 res = dia.startProcess(args)
143 if res:
144 dia.exec()
145
146 def hgLfPull(self, revisions=None):
147 """
148 Public method to pull missing large files into the local repository.
149
150 @param revisions list of revisions to pull (list of string)
151 """
152 revs = []
153 if revisions:
154 revs = revisions
155 else:
156 from .LfRevisionsInputDialog import LfRevisionsInputDialog
157 dlg = LfRevisionsInputDialog()
158 if dlg.exec() == QDialog.DialogCode.Accepted:
159 revs = dlg.getRevisions()
160
161 if revs:
162 args = self.vcs.initCommand("lfpull")
163 args.append("-v")
164 for rev in revs:
165 args.append("--rev")
166 args.append(rev)
167
168 dia = HgDialog(self.tr("Pulling large files"), self.vcs)
169 res = dia.startProcess(args)
170 if res:
171 dia.exec()
172
173 def hgLfVerify(self, mode):
174 """
175 Public method to verify large files integrity.
176
177 @param mode verify mode (string; one of 'large', 'lfa' or 'lfc')
178 """
179 args = self.vcs.initCommand("verify")
180 if mode == "large":
181 args.append("--large")
182 elif mode == "lfa":
183 args.append("--lfa")
184 elif mode == "lfc":
185 args.append("--lfc")
186 else:
187 return
188
189 dia = HgDialog(
190 self.tr('Verifying the integrity of large files'),
191 self.vcs)
192 res = dia.startProcess(args)
193 if res:
194 dia.exec()

eric ide

mercurial