|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2003 - 2019 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing a dialog to show repository related information for a |
|
8 file/directory. |
|
9 """ |
|
10 |
|
11 from __future__ import unicode_literals |
|
12 |
|
13 import os |
|
14 import sys |
|
15 |
|
16 import pysvn |
|
17 |
|
18 from PyQt5.QtCore import Qt, QMutexLocker |
|
19 from PyQt5.QtWidgets import QDialog, QApplication |
|
20 |
|
21 from .SvnUtilities import formatTime |
|
22 from .SvnDialogMixin import SvnDialogMixin |
|
23 from VCS.Ui_RepositoryInfoDialog import Ui_VcsRepositoryInfoDialog |
|
24 |
|
25 |
|
26 class SvnInfoDialog(QDialog, SvnDialogMixin, Ui_VcsRepositoryInfoDialog): |
|
27 """ |
|
28 Class implementing a dialog to show repository related information |
|
29 for a file/directory. |
|
30 """ |
|
31 def __init__(self, vcs, parent=None): |
|
32 """ |
|
33 Constructor |
|
34 |
|
35 @param vcs reference to the vcs object |
|
36 @param parent parent widget (QWidget) |
|
37 """ |
|
38 super(SvnInfoDialog, self).__init__(parent) |
|
39 self.setupUi(self) |
|
40 SvnDialogMixin.__init__(self) |
|
41 self.setWindowFlags(Qt.Window) |
|
42 |
|
43 self.vcs = vcs |
|
44 |
|
45 self.client = self.vcs.getClient() |
|
46 self.client.callback_cancel = \ |
|
47 self._clientCancelCallback |
|
48 self.client.callback_get_login = \ |
|
49 self._clientLoginCallback |
|
50 self.client.callback_ssl_server_trust_prompt = \ |
|
51 self._clientSslServerTrustPromptCallback |
|
52 |
|
53 self.show() |
|
54 QApplication.processEvents() |
|
55 |
|
56 def start(self, projectPath, fn): |
|
57 """ |
|
58 Public slot to start the svn info command. |
|
59 |
|
60 @param projectPath path name of the project (string) |
|
61 @param fn file or directory name relative to the project (string) |
|
62 """ |
|
63 locker = QMutexLocker(self.vcs.vcsExecutionMutex) |
|
64 cwd = os.getcwd() |
|
65 os.chdir(projectPath) |
|
66 try: |
|
67 entries = self.client.info2(fn, recurse=False) |
|
68 infoStr = "<table>" |
|
69 for path, info in entries: |
|
70 if sys.version_info[0] == 2: |
|
71 path = path.decode('utf-8') |
|
72 infoStr += self.tr( |
|
73 "<tr><td><b>Path (relative to project):</b></td>" |
|
74 "<td>{0}</td></tr>").format(path) |
|
75 if info['URL']: |
|
76 infoStr += self.tr( |
|
77 "<tr><td><b>Url:</b></td><td>{0}</td></tr>")\ |
|
78 .format(info['URL']) |
|
79 if info['rev']: |
|
80 infoStr += self.tr( |
|
81 "<tr><td><b>Revision:</b></td><td>{0}</td></tr>")\ |
|
82 .format(info['rev'].number) |
|
83 if info['repos_root_URL']: |
|
84 infoStr += self.tr( |
|
85 "<tr><td><b>Repository root URL:</b></td>" |
|
86 "<td>{0}</td></tr>").format(info['repos_root_URL']) |
|
87 if info['repos_UUID']: |
|
88 infoStr += self.tr( |
|
89 "<tr><td><b>Repository UUID:</b></td>" |
|
90 "<td>{0}</td></tr>").format(info['repos_UUID']) |
|
91 if info['last_changed_author']: |
|
92 infoStr += self.tr( |
|
93 "<tr><td><b>Last changed author:</b></td>" |
|
94 "<td>{0}</td></tr>")\ |
|
95 .format(info['last_changed_author']) |
|
96 if info['last_changed_date']: |
|
97 infoStr += self.tr( |
|
98 "<tr><td><b>Last Changed Date:</b></td>" |
|
99 "<td>{0}</td></tr>")\ |
|
100 .format(formatTime(info['last_changed_date'])) |
|
101 if info['last_changed_rev'] and \ |
|
102 info['last_changed_rev'].kind == \ |
|
103 pysvn.opt_revision_kind.number: |
|
104 infoStr += self.tr( |
|
105 "<tr><td><b>Last changed revision:</b></td>" |
|
106 "<td>{0}</td></tr>")\ |
|
107 .format(info['last_changed_rev'].number) |
|
108 if info['kind']: |
|
109 if info['kind'] == pysvn.node_kind.file: |
|
110 nodeKind = self.tr("file") |
|
111 elif info['kind'] == pysvn.node_kind.dir: |
|
112 nodeKind = self.tr("directory") |
|
113 elif info['kind'] == pysvn.node_kind.none: |
|
114 nodeKind = self.tr("none") |
|
115 else: |
|
116 nodeKind = self.tr("unknown") |
|
117 infoStr += self.tr( |
|
118 "<tr><td><b>Node kind:</b></td><td>{0}</td></tr>")\ |
|
119 .format(nodeKind) |
|
120 if info['lock']: |
|
121 lockInfo = info['lock'] |
|
122 infoStr += self.tr( |
|
123 "<tr><td><b>Lock Owner:</b></td><td>{0}</td></tr>")\ |
|
124 .format(lockInfo['owner']) |
|
125 infoStr += self.tr( |
|
126 "<tr><td><b>Lock Creation Date:</b></td>" |
|
127 "<td>{0}</td></tr>")\ |
|
128 .format(formatTime(lockInfo['creation_date'])) |
|
129 if lockInfo['expiration_date'] is not None: |
|
130 infoStr += self.tr( |
|
131 "<tr><td><b>Lock Expiration Date:</b></td>" |
|
132 "<td>{0}</td></tr>")\ |
|
133 .format(formatTime(lockInfo['expiration_date'])) |
|
134 infoStr += self.tr( |
|
135 "<tr><td><b>Lock Token:</b></td><td>{0}</td></tr>")\ |
|
136 .format(lockInfo['token']) |
|
137 infoStr += self.tr( |
|
138 "<tr><td><b>Lock Comment:</b></td><td>{0}</td></tr>")\ |
|
139 .format(lockInfo['comment']) |
|
140 if info['wc_info']: |
|
141 wcInfo = info['wc_info'] |
|
142 if wcInfo['schedule']: |
|
143 if wcInfo['schedule'] == pysvn.wc_schedule.normal: |
|
144 schedule = self.tr("normal") |
|
145 elif wcInfo['schedule'] == pysvn.wc_schedule.add: |
|
146 schedule = self.tr("add") |
|
147 elif wcInfo['schedule'] == pysvn.wc_schedule.delete: |
|
148 schedule = self.tr("delete") |
|
149 elif wcInfo['schedule'] == pysvn.wc_schedule.replace: |
|
150 schedule = self.tr("replace") |
|
151 infoStr += self.tr( |
|
152 "<tr><td><b>Schedule:</b></td><td>{0}</td></tr>")\ |
|
153 .format(schedule) |
|
154 if wcInfo['copyfrom_url']: |
|
155 infoStr += self.tr( |
|
156 "<tr><td><b>Copied From URL:</b></td>" |
|
157 "<td>{0}</td></tr>")\ |
|
158 .format(wcInfo['copyfrom_url']) |
|
159 infoStr += self.tr( |
|
160 "<tr><td><b>Copied From Rev:</b></td>" |
|
161 "<td>{0}</td></tr>")\ |
|
162 .format(wcInfo['copyfrom_rev'].number) |
|
163 if wcInfo['text_time']: |
|
164 infoStr += self.tr( |
|
165 "<tr><td><b>Text Last Updated:</b></td>" |
|
166 "<td>{0}</td></tr>")\ |
|
167 .format(formatTime(wcInfo['text_time'])) |
|
168 if wcInfo['prop_time']: |
|
169 infoStr += self.tr( |
|
170 "<tr><td><b>Properties Last Updated:</b></td>" |
|
171 "<td>{0}</td></tr>")\ |
|
172 .format(formatTime(wcInfo['prop_time'])) |
|
173 if wcInfo['checksum']: |
|
174 infoStr += self.tr( |
|
175 "<tr><td><b>Checksum:</b></td><td>{0}</td></tr>")\ |
|
176 .format(wcInfo['checksum']) |
|
177 infoStr += "</table>" |
|
178 self.infoBrowser.setHtml(infoStr) |
|
179 except pysvn.ClientError as e: |
|
180 self.__showError(e.args[0]) |
|
181 locker.unlock() |
|
182 os.chdir(cwd) |
|
183 |
|
184 def __showError(self, msg): |
|
185 """ |
|
186 Private slot to show an error message. |
|
187 |
|
188 @param msg error message to show (string) |
|
189 """ |
|
190 infoStr = "<p>{0}</p>".format(msg) |
|
191 self.infoBrowser.setHtml(infoStr) |