annotate examples/trac/trac/versioncontrol/api.py @ 39:93b4dcbafd7b trunk

Copy Trac to main branch.
author cmlenz
date Mon, 03 Jul 2006 18:53:27 +0000
parents
children
rev   line source
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
2 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2005 Edgewall Software
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2005 Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5 # All rights reserved.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7 # This software is licensed as described in the file COPYING, which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 # you should have received as part of this distribution. The terms
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9 # are also available at http://trac.edgewall.com/license.html.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 # This software consists of voluntary contributions made by many
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12 # individuals. For the exact contribution history, see the revision
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13 # history and logs, available at http://projects.edgewall.com/trac/.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 # Author: Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17 from heapq import heappop, heappush
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19 from trac.config import Option
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20 from trac.core import *
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21 from trac.perm import PermissionError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24 class IRepositoryConnector(Interface):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25 """Extension point interface for components that provide support for a
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26 specific version control system."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28 def get_supported_types():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29 """Return the types of version control systems that are supported by
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30 this connector, and their relative priorities.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32 Highest number is highest priority.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35 def get_repository(repos_type, repos_dir, authname):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36 """Return the Repository object for the given repository type and
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37 directory.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41 class RepositoryManager(Component):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 """Component that keeps track of the supported version control systems, and
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43 provides easy access to the configured implementation."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45 connectors = ExtensionPoint(IRepositoryConnector)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47 repository_type = Option('trac', 'repository_type', 'svn',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48 """Repository connector type. (''since 0.10'')""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49 repository_dir = Option('trac', 'repository_dir', '',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50 """Path to local repository""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52 def __init__(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53 self._connector = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55 # Public API methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57 def get_repository(self, authname):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58 if not self._connector:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59 candidates = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60 for connector in self.connectors:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61 for repos_type_, prio in connector.get_supported_types():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62 if self.repository_type != repos_type_:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63 continue
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64 heappush(candidates, (-prio, connector))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65 if not candidates:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66 raise TracError, 'Unsupported version control system "%s"' \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67 % self.repository_type
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68 self._connector = heappop(candidates)[1]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 return self._connector.get_repository(self.repository_type,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70 self.repository_dir, authname)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73 class NoSuchChangeset(TracError):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
74 def __init__(self, rev):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
75 TracError.__init__(self, "No changeset %s in the repository" % rev)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
76
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
77 class NoSuchNode(TracError):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
78 def __init__(self, path, rev, msg=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
79 TracError.__init__(self, "%sNo node %s at revision %s" \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
80 % (msg and '%s: ' % msg or '', path, rev))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
81
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
82 class Repository(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
83 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
84 Base class for a repository provided by a version control system.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
85 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
86
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
87 def __init__(self, name, authz, log):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
88 self.name = name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
89 self.authz = authz or Authorizer()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
90 self.log = log
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
91
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
92 def close(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
93 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
94 Close the connection to the repository.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
95 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
96 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
97
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
98 def get_changeset(self, rev):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
99 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
100 Retrieve a Changeset object that describes the changes made in
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
101 revision 'rev'.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
102 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
103 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
104
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
105 def get_changesets(self, start, stop):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
106 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
107 Generate Changeset belonging to the given time period (start, stop).
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
108 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
109 rev = self.youngest_rev
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
110 while rev:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
111 if self.authz.has_permission_for_changeset(rev):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
112 chgset = self.get_changeset(rev)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
113 if chgset.date < start:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
114 return
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
115 if chgset.date < stop:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
116 yield chgset
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
117 rev = self.previous_rev(rev)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
118
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
119 def has_node(self, path, rev=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
120 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
121 Tell if there's a node at the specified (path,rev) combination.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
122
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
123 When `rev` is `None`, the latest revision is implied.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
124 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
125 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
126 self.get_node(path, rev)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
127 return True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
128 except TracError:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
129 return False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
130
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
131 def get_node(self, path, rev=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
132 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
133 Retrieve a Node (directory or file) from the repository at the
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
134 given path. If the rev parameter is specified, the version of the
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
135 node at that revision is returned, otherwise the latest version
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
136 of the node is returned.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
137 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
138 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
139
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
140 def get_oldest_rev(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
141 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
142 Return the oldest revision stored in the repository.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
143 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
144 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
145 oldest_rev = property(lambda x: x.get_oldest_rev())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
146
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
147 def get_youngest_rev(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
148 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
149 Return the youngest revision in the repository.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
150 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
151 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
152 youngest_rev = property(lambda x: x.get_youngest_rev())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
153
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
154 def previous_rev(self, rev):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
155 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
156 Return the revision immediately preceding the specified revision.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
157 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
158 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
159
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
160 def next_rev(self, rev, path=''):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
161 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
162 Return the revision immediately following the specified revision.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
163 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
164 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
165
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
166 def rev_older_than(self, rev1, rev2):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
167 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
168 Return True if rev1 is older than rev2, i.e. if rev1 comes before rev2
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
169 in the revision sequence.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
170 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
171 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
172
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
173 def get_youngest_rev_in_cache(self, db):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
174 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
175 Return the youngest revision currently cached.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
176 The way revisions are sequenced is version control specific.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
177 By default, one assumes that the revisions are sequenced in time.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
178 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
179 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
180 cursor.execute("SELECT rev FROM revision ORDER BY time DESC LIMIT 1")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
181 row = cursor.fetchone()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
182 return row and row[0] or None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
183
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
184 def get_path_history(self, path, rev=None, limit=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
185 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
186 Retrieve all the revisions containing this path (no newer than 'rev').
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
187 The result format should be the same as the one of Node.get_history()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
188 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
189 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
190
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
191 def normalize_path(self, path):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
192 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
193 Return a canonical representation of path in the repos.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
194 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
195 return NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
196
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
197 def normalize_rev(self, rev):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
198 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
199 Return a canonical representation of a revision in the repos.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
200 'None' is a valid revision value and represents the youngest revision.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
201 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
202 return NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
203
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
204 def short_rev(self, rev):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
205 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
206 Return a compact representation of a revision in the repos.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
207 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
208 return self.normalize_rev(rev)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
209
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
210 def get_changes(self, old_path, old_rev, new_path, new_rev,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
211 ignore_ancestry=1):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
212 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
213 Generator that yields change tuples (old_node, new_node, kind, change)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
214 for each node change between the two arbitrary (path,rev) pairs.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
215
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
216 The old_node is assumed to be None when the change is an ADD,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
217 the new_node is assumed to be None when the change is a DELETE.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
218 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
219 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
220
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
221
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
222 class Node(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
223 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
224 Represents a directory or file in the repository.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
225 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
226
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
227 DIRECTORY = "dir"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
228 FILE = "file"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
229
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
230 def __init__(self, path, rev, kind):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
231 assert kind in (Node.DIRECTORY, Node.FILE), "Unknown node kind %s" % kind
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
232 self.path = unicode(path)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
233 self.rev = rev
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
234 self.kind = kind
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
235
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
236 def get_content(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
237 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
238 Return a stream for reading the content of the node. This method
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
239 will return None for directories. The returned object should provide
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
240 a read([len]) function.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
241 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
242 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
243
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
244 def get_entries(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
245 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
246 Generator that yields the immediate child entries of a directory, in no
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
247 particular order. If the node is a file, this method returns None.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
248 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
249 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
250
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
251 def get_history(self, limit=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
252 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
253 Generator that yields (path, rev, chg) tuples, one for each revision in which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
254 the node was changed. This generator will follow copies and moves of a
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
255 node (if the underlying version control system supports that), which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
256 will be indicated by the first element of the tuple (i.e. the path)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
257 changing.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
258 Starts with an entry for the current revision.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
259 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
260 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
261
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
262 def get_previous(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
263 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
264 Return the (path, rev, chg) tuple corresponding to the previous
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
265 revision for that node.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
266 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
267 skip = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
268 for p in self.get_history(2):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
269 if skip:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
270 skip = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
271 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
272 return p
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
273
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
274 def get_properties(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
275 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
276 Returns a dictionary containing the properties (meta-data) of the node.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
277 The set of properties depends on the version control system.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
278 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
279 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
280
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
281 def get_content_length(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
282 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
283 content_length = property(lambda x: x.get_content_length())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
284
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
285 def get_content_type(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
286 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
287 content_type = property(lambda x: x.get_content_type())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
288
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
289 def get_name(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
290 return self.path.split('/')[-1]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
291 name = property(lambda x: x.get_name())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
292
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
293 def get_last_modified(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
294 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
295 last_modified = property(lambda x: x.get_last_modified())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
296
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
297 isdir = property(lambda x: x.kind == Node.DIRECTORY)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
298 isfile = property(lambda x: x.kind == Node.FILE)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
299
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
300
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
301 class Changeset(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
302 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
303 Represents a set of changes of a repository.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
304 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
305
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
306 ADD = 'add'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
307 COPY = 'copy'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
308 DELETE = 'delete'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
309 EDIT = 'edit'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
310 MOVE = 'move'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
311
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
312 def __init__(self, rev, message, author, date):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
313 self.rev = rev
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
314 self.message = message
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
315 self.author = author
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
316 self.date = date
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
317
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
318 def get_properties(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
319 """Generator that provide additional metadata for this changeset.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
320
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
321 Each additional property is a 4 element tuple:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
322 * `name` is the name of the property,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
323 * `text` its value
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
324 * `wikiflag` indicates whether the `text` should be interpreted as
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
325 wiki text or not
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
326 * `htmlclass` enables to attach special formatting to the displayed
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
327 property, e.g. `'author'`, `'time'`, `'message'` or `'changeset'`.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
328 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
329
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
330 def get_changes(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
331 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
332 Generator that produces a (path, kind, change, base_path, base_rev)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
333 tuple for every change in the changeset, where change can be one of
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
334 Changeset.ADD, Changeset.COPY, Changeset.DELETE, Changeset.EDIT or
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
335 Changeset.MOVE, and kind is one of Node.FILE or Node.DIRECTORY.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
336 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
337 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
338
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
339
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
340 class PermissionDenied(PermissionError):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
341 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
342 Exception raised by an authorizer if the user has insufficient permissions
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
343 to view a specific part of the repository.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
344 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
345 def __str__(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
346 return self.action
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
347
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
348
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
349 class Authorizer(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
350 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
351 Base class for authorizers that are responsible to granting or denying
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
352 access to view certain parts of a repository.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
353 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
354
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
355 def assert_permission(self, path):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
356 if not self.has_permission(path):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
357 raise PermissionDenied, \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
358 'Insufficient permissions to access %s' % path
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
359
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
360 def assert_permission_for_changeset(self, rev):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
361 if not self.has_permission_for_changeset(rev):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
362 raise PermissionDenied, \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
363 'Insufficient permissions to access changeset %s' % rev
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
364
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
365 def has_permission(self, path):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
366 return True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
367
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
368 def has_permission_for_changeset(self, rev):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
369 return True
Copyright (C) 2012-2017 Edgewall Software