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