RefactoringRope/RefactoringDialogBase.py

Tue, 19 Sep 2017 18:59:14 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Tue, 19 Sep 2017 18:59:14 +0200
branch
server_client_variant
changeset 173
2cdb7c48b719
parent 172
c8890f852917
child 189
2711fdd91925
permissions
-rw-r--r--

Finished implementing the distributed rename refactorings.

3
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
147
3f8a995f6e49 Updated copyright for 2017.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 144
diff changeset
3 # Copyright (c) 2010 - 2017 Detlev Offenbach <detlev@die-offenbachs.de>
3
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing the Refactoring dialog base class.
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
76
936b2a98fe4e Merge with Py2 comp.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 62 63
diff changeset
10 from __future__ import unicode_literals
50
a29c3d2e6dc0 rope for Python2 projects enabled, if running on Python2
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 46
diff changeset
11
87
1fbf5fdbe721 Ported to PyQt5 and eric6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 76
diff changeset
12 from PyQt5.QtCore import Qt
171
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
13 from PyQt5.QtWidgets import QDialog
3
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 from E5Gui.E5Application import e5App
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 class RefactoringDialogBase(QDialog):
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 """
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 Class implementing the Refactoring dialog base class.
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 """
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 def __init__(self, refactoring, title, parent=None):
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 """
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 Constructor
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 @param refactoring reference to the main refactoring object
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 (Refactoring)
9
8cee612bcc28 Corrected some source docu.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 3
diff changeset
28 @param title title of the dialog (string)
3
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 @param parent reference to the parent widget (QWidget)
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 """
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 QDialog.__init__(self, parent)
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 self.setAttribute(Qt.WA_DeleteOnClose)
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 self.setWindowTitle(title)
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34
173
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
35 self._ui = parent
3
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 self._refactoring = refactoring
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 self._title = title
172
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
38
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
39 self._changesCalculated = False
173
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
40
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
41 self.__queue = []
172
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
42
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
43 def getChangeGroupName(self):
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
44 """
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
45 Public method to get the name of the change group.
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
46
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
47 @return name of the associated change group
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
48 @rtype str
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
49 """
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
50 return self._changeGroupName
3
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51
173
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
52 def _calculateChanges(self):
3
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 """
173
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
54 Protected method to initiate the calculation of changes.
3
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55
55
d501156be247 Fixed code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 46
diff changeset
56 @exception NotImplementedError raised to indicate that this method must
d501156be247 Fixed code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 46
diff changeset
57 be overridden by subclasses
3
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 """
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 raise NotImplementedError("_calculateChanges must be overridden.")
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60
172
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
61 def requestPreview(self):
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
62 """
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
63 Public method to request a preview of the calculated changes.
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
64 """
173
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
65 self.__queue.append(("PreviewChanges", {
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
66 "ChangeGroup": self._changeGroupName,
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
67 }))
172
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
68
173
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
69 self._calculateChanges()
172
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
70
171
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
71 def previewChanges(self, data):
3
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 """
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 Public method to preview the changes.
171
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
74
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
75 @param data dictionary containing the change data
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
76 @type dict
3
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 """
171
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
78 from ChangesPreviewDialog import ChangesPreviewDialog
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
79 dlg = ChangesPreviewDialog(
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
80 data["Description"], data["Changes"], self)
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
81 if dlg.exec_() == QDialog.Accepted:
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
82 self.applyChanges()
3
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83
171
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
84 def applyChanges(self):
3
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 """
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 Public method to apply the changes.
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 """
172
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
88 if not self._changesCalculated:
173
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
89 self.__queue.append(("ApplyChanges", {
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
90 "ChangeGroup": self._changeGroupName,
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
91 "Title": self._title,
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
92 }))
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
93 self._calculateChanges()
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
94 else:
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
95 self._refactoring.sendJson("ApplyChanges", {
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
96 "ChangeGroup": self._changeGroupName,
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
97 "Title": self._title,
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
98 })
171
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
99
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
100 def processChangeData(self, data):
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
101 """
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
102 Public method to process the change data sent by the refactoring
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
103 client.
3
3be1b4662b48 Added the 'rename' refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104
171
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
105 @param data dictionary containing the change data
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
106 @type dict
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
107 """
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
108 subcommand = data["Subcommand"]
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
109 if subcommand == "PreviewChanges":
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
110 self.previewChanges(data)
172
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
111 elif subcommand == "ChangesCalculated":
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
112 self._changesCalculated = True
173
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
113 if not self.isVisible():
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
114 self.show()
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
115 if self.__queue:
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
116 method, params = self.__queue.pop(0)
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 172
diff changeset
117 self._refactoring.sendJson(method, params)
171
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
118 elif subcommand == "ChangesApplied":
172
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
119 if self._refactoring.handleRopeError(data):
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
120 self._refactoring.refreshEditors(data["ChangedFiles"])
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
121 p = e5App().getObject("Project")
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
122 if p.isDirty():
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
123 p.saveProject()
c8890f852917 Continued implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 171
diff changeset
124
171
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
125 self.accept()
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
126
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
127 def closeEvent(self, evt):
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
128 """
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
129 Protected method handling close events.
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
130
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
131 @param evt reference to the close event object
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
132 @type QCloseEvent
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
133 """
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
134 self.__refactoring.sendJson("ClearChanges", {
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
135 "ChangeGroup": self._changeGroupName,
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
136 })
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
137
9872d31f8755 Started implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 147
diff changeset
138 evt.accept()

eric ide

mercurial