eric7/Plugins/PluginVcsGit.py

branch
eric7
changeset 8312
800c432b34c8
parent 8305
698a4d9f4977
child 8318
962bce857696
equal deleted inserted replaced
8311:4e8b98454baa 8312:800c432b34c8
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2014 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the Git version control plugin.
8 """
9
10 import os
11 import contextlib
12
13 from PyQt5.QtCore import QObject, QCoreApplication, QByteArray
14
15 from E5Gui.E5Application import e5App
16
17 import Preferences
18 from Preferences.Shortcuts import readShortcuts
19
20 from VcsPlugins.vcsGit.GitUtilities import getConfigPath
21
22 import Utilities
23 import UI.Info
24
25 # Start-Of-Header
26 name = "Git Plugin"
27 author = "Detlev Offenbach <detlev@die-offenbachs.de>"
28 autoactivate = False
29 deactivateable = True
30 version = UI.Info.VersionOnly
31 pluginType = "version_control"
32 pluginTypename = "Git"
33 className = "VcsGitPlugin"
34 packageName = "__core__"
35 shortDescription = "Implements the Git version control interface."
36 longDescription = (
37 """This plugin provides the Git version control interface."""
38 )
39 pyqtApi = 2
40 # End-Of-Header
41
42 error = ""
43
44
45 def exeDisplayData():
46 """
47 Public method to support the display of some executable info.
48
49 @return dictionary containing the data to query the presence of
50 the executable
51 """
52 exe = 'git'
53 if Utilities.isWindowsPlatform():
54 exe += '.exe'
55
56 data = {
57 "programEntry": True,
58 "header": QCoreApplication.translate(
59 "VcsGitPlugin", "Version Control - Git"),
60 "exe": exe,
61 "versionCommand": 'version',
62 "versionStartsWith": 'git',
63 "versionPosition": 2,
64 "version": "",
65 "versionCleanup": None,
66 }
67
68 return data
69
70
71 def getVcsSystemIndicator():
72 """
73 Public function to get the indicators for this version control system.
74
75 @return dictionary with indicator as key and a tuple with the vcs name
76 (string) and vcs display string (string)
77 """
78 global pluginTypename
79 data = {}
80 exe = 'git'
81 if Utilities.isWindowsPlatform():
82 exe += '.exe'
83 if Utilities.isinpath(exe):
84 data[".git"] = (pluginTypename, displayString())
85 data["_git"] = (pluginTypename, displayString())
86 return data
87
88
89 def displayString():
90 """
91 Public function to get the display string.
92
93 @return display string (string)
94 """
95 exe = 'git'
96 if Utilities.isWindowsPlatform():
97 exe += '.exe'
98 if Utilities.isinpath(exe):
99 return QCoreApplication.translate('VcsGitPlugin', 'Git')
100 else:
101 return ""
102
103
104 gitCfgPluginObject = None
105
106
107 def createConfigurationPage(configDlg):
108 """
109 Module function to create the configuration page.
110
111 @param configDlg reference to the configuration dialog (QDialog)
112 @return reference to the configuration page
113 """
114 global gitCfgPluginObject
115 from VcsPlugins.vcsGit.ConfigurationPage.GitPage import (
116 GitPage
117 )
118 if gitCfgPluginObject is None:
119 gitCfgPluginObject = VcsGitPlugin(None)
120 page = GitPage(gitCfgPluginObject)
121 return page
122
123
124 def getConfigData():
125 """
126 Module function returning data as required by the configuration dialog.
127
128 @return dictionary with key "zzz_gitPage" containing the relevant
129 data
130 """
131 return {
132 "zzz_gitPage":
133 [QCoreApplication.translate("VcsGitPlugin", "Git"),
134 os.path.join("VcsPlugins", "vcsGit", "icons",
135 "preferences-git.svg"),
136 createConfigurationPage, "vcsPage", None],
137 }
138
139
140 def prepareUninstall():
141 """
142 Module function to prepare for an uninstallation.
143 """
144 if not e5App().getObject("PluginManager").isPluginLoaded(
145 "PluginVcsGit"):
146 Preferences.Prefs.settings.remove("Git")
147
148
149 def clearPrivateData():
150 """
151 Module function to clear the private data of the plug-in.
152 """
153 for key in ["RepositoryUrlHistory"]:
154 VcsGitPlugin.setPreferences(key, [])
155
156
157 class VcsGitPlugin(QObject):
158 """
159 Class implementing the Git version control plugin.
160 """
161 GitDefaults = {
162 "StopLogOnCopy": True, # used in log browser
163 "ShowAuthorColumns": True, # used in log browser
164 "ShowCommitterColumns": True, # used in log browser
165 "ShowCommitIdColumn": True, # used in log browser
166 "ShowBranchesColumn": True, # used in log browser
167 "ShowTagsColumn": True, # used in log browser
168 "FindCopiesHarder": False, # used in log browser
169 "LogLimit": 20,
170 "LogSubjectColumnWidth": 30,
171 "LogBrowserGeometry": QByteArray(),
172 "LogBrowserSplitterStates": [QByteArray(), QByteArray(),
173 QByteArray()],
174 # mainSplitter, detailsSplitter, diffSplitter
175 "StatusDialogGeometry": QByteArray(),
176 "StatusDialogSplitterStates": [QByteArray(), QByteArray()],
177 # vertical splitter, horizontal splitter
178 "CommitMessages": 20,
179 "Commits": [],
180 "CommitIdLength": 10,
181 "CleanupPatterns": "*.orig *.rej *~",
182 "AggressiveGC": True,
183 "RepositoryUrlHistory": [],
184 }
185
186 def __init__(self, ui):
187 """
188 Constructor
189
190 @param ui reference to the user interface object (UI.UserInterface)
191 """
192 super().__init__(ui)
193 self.__ui = ui
194
195 from VcsPlugins.vcsGit.ProjectHelper import GitProjectHelper
196 self.__projectHelperObject = GitProjectHelper(None, None)
197 with contextlib.suppress(KeyError):
198 e5App().registerPluginObject(
199 pluginTypename, self.__projectHelperObject, pluginType)
200
201 readShortcuts(pluginName=pluginTypename)
202
203 def getProjectHelper(self):
204 """
205 Public method to get a reference to the project helper object.
206
207 @return reference to the project helper object
208 """
209 return self.__projectHelperObject
210
211 def initToolbar(self, ui, toolbarManager):
212 """
213 Public slot to initialize the VCS toolbar.
214
215 @param ui reference to the main window (UserInterface)
216 @param toolbarManager reference to a toolbar manager object
217 (E5ToolBarManager)
218 """
219 if self.__projectHelperObject:
220 self.__projectHelperObject.initToolbar(ui, toolbarManager)
221
222 def activate(self):
223 """
224 Public method to activate this plugin.
225
226 @return tuple of reference to instantiated viewmanager and
227 activation status (boolean)
228 """
229 from VcsPlugins.vcsGit.git import Git
230 self.__object = Git(self, self.__ui)
231
232 tb = self.__ui.getToolbar("vcs")[1]
233 tb.setVisible(False)
234 tb.setEnabled(False)
235
236 tb = self.__ui.getToolbar("git")[1]
237 tb.setVisible(Preferences.getVCS("ShowVcsToolbar"))
238 tb.setEnabled(True)
239
240 return self.__object, True
241
242 def deactivate(self):
243 """
244 Public method to deactivate this plugin.
245 """
246 self.__object = None
247
248 tb = self.__ui.getToolbar("git")[1]
249 tb.setVisible(False)
250 tb.setEnabled(False)
251
252 tb = self.__ui.getToolbar("vcs")[1]
253 tb.setVisible(Preferences.getVCS("ShowVcsToolbar"))
254 tb.setEnabled(True)
255
256 @classmethod
257 def getPreferences(cls, key):
258 """
259 Class method to retrieve the various settings.
260
261 @param key the key of the value to get
262 @return the requested setting
263 """
264 if key in ["StopLogOnCopy", "ShowReflogInfo", "ShowAuthorColumns",
265 "ShowCommitterColumns", "ShowCommitIdColumn",
266 "ShowBranchesColumn", "ShowTagsColumn", "FindCopiesHarder",
267 "AggressiveGC"]:
268 return Preferences.toBool(Preferences.Prefs.settings.value(
269 "Git/" + key, cls.GitDefaults[key]))
270 elif key in ["LogLimit", "CommitMessages", "CommitIdLength",
271 "LogSubjectColumnWidth"]:
272 return int(Preferences.Prefs.settings.value(
273 "Git/" + key, cls.GitDefaults[key]))
274 elif key in ["Commits", "RepositoryUrlHistory"]:
275 return Preferences.toList(Preferences.Prefs.settings.value(
276 "Git/" + key))
277 elif key in ["LogBrowserGeometry", "StatusDialogGeometry"]:
278 v = Preferences.Prefs.settings.value("Git/" + key)
279 if v is not None:
280 return v
281 else:
282 return cls.GitDefaults[key]
283 elif key in ["LogBrowserSplitterStates", "StatusDialogSplitterStates"]:
284 states = Preferences.Prefs.settings.value("Git/" + key)
285 if states is not None:
286 return states
287 else:
288 return cls.GitDefaults[key]
289 else:
290 return Preferences.Prefs.settings.value(
291 "Git/" + key, cls.GitDefaults[key])
292
293 @classmethod
294 def setPreferences(cls, key, value):
295 """
296 Class method to store the various settings.
297
298 @param key the key of the setting to be set
299 @param value the value to be set
300 """
301 Preferences.Prefs.settings.setValue("Git/" + key, value)
302
303 def getConfigPath(self):
304 """
305 Public method to get the filename of the config file.
306
307 @return filename of the config file (string)
308 """
309 return getConfigPath()
310
311 def prepareUninstall(self):
312 """
313 Public method to prepare for an uninstallation.
314 """
315 e5App().unregisterPluginObject(pluginTypename)
316
317 def prepareUnload(self):
318 """
319 Public method to prepare for an unload.
320 """
321 if self.__projectHelperObject:
322 self.__projectHelperObject.removeToolbar(
323 self.__ui, e5App().getObject("ToolbarManager"))
324 e5App().unregisterPluginObject(pluginTypename)
325
326 #
327 # eflag: noqa = M801

eric ide

mercurial