src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/shelve.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 shelve extension interface.
8 """
9
10 from PyQt6.QtWidgets import QDialog
11
12 from EricWidgets import EricMessageBox
13
14 from ..HgExtension import HgExtension
15 from ..HgDialog import HgDialog
16
17
18 class Shelve(HgExtension):
19 """
20 Class implementing the shelve extension interface.
21 """
22 def __init__(self, vcs):
23 """
24 Constructor
25
26 @param vcs reference to the Mercurial vcs object
27 """
28 super().__init__(vcs)
29
30 self.__unshelveKeep = False
31
32 self.__shelveBrowserDialog = None
33
34 def shutdown(self):
35 """
36 Public method used to shutdown the shelve interface.
37 """
38 if self.__shelveBrowserDialog is not None:
39 self.__shelveBrowserDialog.close()
40
41 def __hgGetShelveNamesList(self):
42 """
43 Private method to get the list of shelved changes.
44
45 @return list of shelved changes (list of string)
46 """
47 args = self.vcs.initCommand("shelve")
48 args.append('--list')
49 args.append('--quiet')
50
51 client = self.vcs.getClient()
52 output = client.runcommand(args)[0]
53
54 shelveNamesList = []
55 for line in output.splitlines():
56 shelveNamesList.append(line.strip())
57
58 return shelveNamesList[:]
59
60 def hgShelve(self, name):
61 """
62 Public method to shelve current changes of files or directories.
63
64 @param name directory or file name (string) or list of directory
65 or file names (list of string)
66 @return flag indicating that the project should be reread (boolean)
67 """
68 res = False
69 from .HgShelveDataDialog import HgShelveDataDialog
70 dlg = HgShelveDataDialog(self.vcs.version)
71 if dlg.exec() == QDialog.DialogCode.Accepted:
72 shelveName, dateTime, message, addRemove, keep = dlg.getData()
73
74 args = self.vcs.initCommand("shelve")
75 if shelveName:
76 args.append("--name")
77 args.append(shelveName)
78 if message:
79 args.append("--message")
80 args.append(message)
81 if addRemove:
82 args.append("--addremove")
83 if dateTime.isValid():
84 args.append("--date")
85 args.append(dateTime.toString("yyyy-MM-dd hh:mm:ss"))
86 if self.vcs.version >= (5, 0, 0) and keep:
87 args.append("--keep")
88 args.append("-v")
89
90 if isinstance(name, list):
91 self.vcs.addArguments(args, name)
92 else:
93 args.append(name)
94
95 dia = HgDialog(self.tr('Shelve current changes'), self.vcs)
96 res = dia.startProcess(args)
97 if res:
98 dia.exec()
99 res = dia.hasAddOrDelete()
100 self.vcs.checkVCSStatus()
101 return res
102
103 def hgShelveBrowser(self):
104 """
105 Public method to show the shelve browser dialog.
106 """
107 if self.__shelveBrowserDialog is None:
108 from .HgShelveBrowserDialog import HgShelveBrowserDialog
109 self.__shelveBrowserDialog = HgShelveBrowserDialog(
110 self.vcs)
111 self.__shelveBrowserDialog.show()
112 self.__shelveBrowserDialog.start()
113
114 def hgUnshelve(self, shelveName=""):
115 """
116 Public method to restore shelved changes to the project directory.
117
118 @param shelveName name of the shelve to restore (string)
119 @return flag indicating that the project should be reread (boolean)
120 """
121 res = False
122 from .HgUnshelveDataDialog import HgUnshelveDataDialog
123 dlg = HgUnshelveDataDialog(self.__hgGetShelveNamesList(),
124 shelveName=shelveName)
125 if dlg.exec() == QDialog.DialogCode.Accepted:
126 shelveName, keep = dlg.getData()
127 self.__unshelveKeep = keep # store for potential continue
128
129 args = self.vcs.initCommand("unshelve")
130 if keep:
131 args.append("--keep")
132 if shelveName:
133 args.append(shelveName)
134
135 dia = HgDialog(self.tr('Restore shelved changes'), self.vcs)
136 res = dia.startProcess(args)
137 if res:
138 dia.exec()
139 res = dia.hasAddOrDelete()
140 self.vcs.checkVCSStatus()
141 return res
142
143 def hgUnshelveAbort(self):
144 """
145 Public method to abort the ongoing restore operation.
146
147 @return flag indicating that the project should be reread (boolean)
148 """
149 args = self.vcs.initCommand("unshelve")
150 args.append("--abort")
151
152 dia = HgDialog(self.tr('Abort restore operation'), self.vcs)
153 res = dia.startProcess(args)
154 if res:
155 dia.exec()
156 res = dia.hasAddOrDelete()
157 self.vcs.checkVCSStatus()
158 return res
159
160 def hgUnshelveContinue(self):
161 """
162 Public method to continue the ongoing restore operation.
163
164 @return flag indicating that the project should be reread (boolean)
165 """
166 args = self.vcs.initCommand("unshelve")
167 if self.__unshelveKeep:
168 args.append("--keep")
169 args.append("--continue")
170
171 dia = HgDialog(self.tr('Continue restore operation'), self.vcs)
172 res = dia.startProcess(args)
173 if res:
174 dia.exec()
175 res = dia.hasAddOrDelete()
176 self.vcs.checkVCSStatus()
177 return res
178
179 def hgDeleteShelves(self, shelveNames=None):
180 """
181 Public method to delete named shelves.
182
183 @param shelveNames name of shelves to delete (list of string)
184 """
185 if not shelveNames:
186 from .HgShelvesSelectionDialog import HgShelvesSelectionDialog
187 dlg = HgShelvesSelectionDialog(
188 self.tr("Select the shelves to be deleted:"),
189 self.__hgGetShelveNamesList())
190 if dlg.exec() == QDialog.DialogCode.Accepted:
191 shelveNames = dlg.getSelectedShelves()
192 else:
193 return
194
195 from UI.DeleteFilesConfirmationDialog import (
196 DeleteFilesConfirmationDialog
197 )
198 dlg = DeleteFilesConfirmationDialog(
199 None,
200 self.tr("Delete shelves"),
201 self.tr("Do you really want to delete these shelves?"),
202 shelveNames)
203 if dlg.exec() == QDialog.DialogCode.Accepted:
204 args = self.vcs.initCommand("shelve")
205 args.append("--delete")
206 args.extend(shelveNames)
207
208 dia = HgDialog(self.tr('Delete shelves'), self.vcs)
209 res = dia.startProcess(args)
210 if res:
211 dia.exec()
212
213 def hgCleanupShelves(self):
214 """
215 Public method to delete all shelves.
216 """
217 res = EricMessageBox.yesNo(
218 None,
219 self.tr("Delete all shelves"),
220 self.tr("""Do you really want to delete all shelved changes?"""))
221 if res:
222 args = self.vcs.initCommand("shelve")
223 args.append("--cleanup")
224
225 dia = HgDialog(self.tr('Delete all shelves'), self.vcs)
226 res = dia.startProcess(args)
227 if res:
228 dia.exec()

eric ide

mercurial