1# -*- coding: utf-8 -*-
2
3# Copyright (c) 2007 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4#
5
6"""
7Module implementing the Subversion version control plugin.
8"""
9
10import os
11import contextlib
12
13from PyQt5.QtCore import QObject, QCoreApplication
14
15from E5Gui.E5Application import e5App
16
17import Preferences
18from Preferences.Shortcuts import readShortcuts
19
20from VcsPlugins.vcsSubversion.SvnUtilities import getConfigPath, getServersPath
21
22import Utilities
23import UI.Info
24
25# Start-Of-Header
26name = "Subversion Plugin"
27author = "Detlev Offenbach <detlev@die-offenbachs.de>"
28autoactivate = False
29deactivateable = True
30version = UI.Info.VersionOnly
31pluginType = "version_control"
32pluginTypename = "Subversion"
33className = "VcsSubversionPlugin"
34packageName = "__core__"
35shortDescription = "Implements the Subversion version control interface."
36longDescription = (
37    """This plugin provides the Subversion version control interface."""
38)
39pyqtApi = 2
40# End-Of-Header
41
42error = ""
43
44
45def 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 = 'svn'
53    if Utilities.isWindowsPlatform():
54        exe += '.exe'
55
56    data = {
57        "programEntry": True,
58        "header": QCoreApplication.translate(
59            "VcsSubversionPlugin", "Version Control - Subversion (svn)"),
60        "exe": exe,
61        "versionCommand": '--version',
62        "versionStartsWith": 'svn',
63        "versionPosition": 2,
64        "version": "",
65        "versionCleanup": None,
66    }
67
68    return data
69
70
71def 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 = 'svn'
81    if Utilities.isWindowsPlatform():
82        exe += '.exe'
83    if Utilities.isinpath(exe):
84        data[".svn"] = (pluginTypename, displayString())
85        data["_svn"] = (pluginTypename, displayString())
86    return data
87
88
89def displayString():
90    """
91    Public function to get the display string.
92
93    @return display string (string)
94    """
95    exe = 'svn'
96    if Utilities.isWindowsPlatform():
97        exe += '.exe'
98    if Utilities.isinpath(exe):
99        return QCoreApplication.translate(
100            'VcsSubversionPlugin', 'Subversion (svn)')
101    else:
102        return ""
103
104subversionCfgPluginObject = None
105
106
107def 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 subversionCfgPluginObject
115    from VcsPlugins.vcsSubversion.ConfigurationPage.SubversionPage import (
116        SubversionPage
117    )
118    if subversionCfgPluginObject is None:
119        subversionCfgPluginObject = VcsSubversionPlugin(None)
120    page = SubversionPage(subversionCfgPluginObject)
121    return page
122
123
124def getConfigData():
125    """
126    Module function returning data as required by the configuration dialog.
127
128    @return dictionary with key "zzz_subversionPage" containing the relevant
129    data
130    """
131    return {
132        "zzz_subversionPage":
133        [QCoreApplication.translate("VcsSubversionPlugin", "Subversion"),
134         os.path.join("VcsPlugins", "vcsSubversion", "icons",
135                      "preferences-subversion.svg"),
136         createConfigurationPage, "vcsPage", None],
137    }
138
139
140def prepareUninstall():
141    """
142    Module function to prepare for an uninstallation.
143    """
144    if not e5App().getObject("PluginManager").isPluginLoaded(
145            "PluginVcsSubversion"):
146        Preferences.Prefs.settings.remove("Subversion")
147
148
149class VcsSubversionPlugin(QObject):
150    """
151    Class implementing the Subversion version control plugin.
152    """
153    def __init__(self, ui):
154        """
155        Constructor
156
157        @param ui reference to the user interface object (UI.UserInterface)
158        """
159        super().__init__(ui)
160        self.__ui = ui
161
162        self.__subversionDefaults = {
163            "StopLogOnCopy": True,
164            "LogLimit": 20,
165            "CommitMessages": 20,
166        }
167
168        from VcsPlugins.vcsSubversion.ProjectHelper import SvnProjectHelper
169        self.__projectHelperObject = SvnProjectHelper(None, None)
170        with contextlib.suppress(KeyError):
171            e5App().registerPluginObject(
172                pluginTypename, self.__projectHelperObject, pluginType)
173        readShortcuts(pluginName=pluginTypename)
174
175    def getProjectHelper(self):
176        """
177        Public method to get a reference to the project helper object.
178
179        @return reference to the project helper object
180        """
181        return self.__projectHelperObject
182
183    def initToolbar(self, ui, toolbarManager):
184        """
185        Public slot to initialize the VCS toolbar.
186
187        @param ui reference to the main window (UserInterface)
188        @param toolbarManager reference to a toolbar manager object
189            (E5ToolBarManager)
190        """
191        if self.__projectHelperObject:
192            self.__projectHelperObject.initToolbar(ui, toolbarManager)
193
194    def activate(self):
195        """
196        Public method to activate this plugin.
197
198        @return tuple of reference to instantiated viewmanager and
199            activation status (boolean)
200        """
201        from VcsPlugins.vcsSubversion.subversion import Subversion
202        self.__object = Subversion(self, self.__ui)
203
204        tb = self.__ui.getToolbar("vcs")[1]
205        tb.setVisible(False)
206        tb.setEnabled(False)
207
208        tb = self.__ui.getToolbar("subversion")[1]
209        tb.setVisible(Preferences.getVCS("ShowVcsToolbar"))
210        tb.setEnabled(True)
211
212        return self.__object, True
213
214    def deactivate(self):
215        """
216        Public method to deactivate this plugin.
217        """
218        self.__object = None
219
220        tb = self.__ui.getToolbar("subversion")[1]
221        tb.setVisible(False)
222        tb.setEnabled(False)
223
224        tb = self.__ui.getToolbar("vcs")[1]
225        tb.setVisible(Preferences.getVCS("ShowVcsToolbar"))
226        tb.setEnabled(True)
227
228    def getPreferences(self, key):
229        """
230        Public method to retrieve the various settings.
231
232        @param key the key of the value to get
233        @return the requested setting
234        """
235        if key in ["StopLogOnCopy"]:
236            return Preferences.toBool(Preferences.Prefs.settings.value(
237                "Subversion/" + key, self.__subversionDefaults[key]))
238        elif key in ["LogLimit", "CommitMessages"]:
239            return int(Preferences.Prefs.settings.value(
240                "Subversion/" + key,
241                self.__subversionDefaults[key]))
242        elif key in ["Commits"]:
243            return Preferences.toList(Preferences.Prefs.settings.value(
244                "Subversion/" + key))
245        else:
246            return Preferences.Prefs.settings.value("Subversion/" + key)
247
248    def setPreferences(self, key, value):
249        """
250        Public method to store the various settings.
251
252        @param key the key of the setting to be set
253        @param value the value to be set
254        """
255        Preferences.Prefs.settings.setValue("Subversion/" + key, value)
256
257    def getServersPath(self):
258        """
259        Public method to get the filename of the servers file.
260
261        @return filename of the servers file (string)
262        """
263        return getServersPath()
264
265    def getConfigPath(self):
266        """
267        Public method to get the filename of the config file.
268
269        @return filename of the config file (string)
270        """
271        return getConfigPath()
272
273    def prepareUninstall(self):
274        """
275        Public method to prepare for an uninstallation.
276        """
277        e5App().unregisterPluginObject(pluginTypename)
278
279    def prepareUnload(self):
280        """
281        Public method to prepare for an unload.
282        """
283        if self.__projectHelperObject:
284            self.__projectHelperObject.removeToolbar(
285                self.__ui, e5App().getObject("ToolbarManager"))
286        e5App().unregisterPluginObject(pluginTypename)
287