1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 | |
""" |
# generic cache mechanism for subversion-related structures |
# XXX make mt-safe |
""" |
|
import time |
|
proplist = {} |
info = {} |
entries = {} |
prop = {} |
|
|
|
|
|
|
|
|
class RepoEntry: |
def __init__(self, url, rev, timestamp): |
self.url = url |
self.rev = rev |
self.timestamp = timestamp |
|
def __str__(self): |
return "repo: %s;%s %s" %(self.url, self.rev, self.timestamp) |
|
class RepoCache: |
""" The Repocache manages discovered repository paths |
and their revisions. If inside a timeout the cache |
will even return the revision of the root. |
""" |
timeout = 20 |
|
def __init__(self): |
self.repos = [] |
|
def clear(self): |
self.repos = [] |
|
def put(self, url, rev, timestamp=None): |
if rev is None: |
return |
if timestamp is None: |
timestamp = time.time() |
|
for entry in self.repos: |
if url == entry.url: |
entry.timestamp = timestamp |
entry.rev = rev |
|
break |
else: |
entry = RepoEntry(url, rev, timestamp) |
self.repos.append(entry) |
|
|
def get(self, url): |
now = time.time() |
for entry in self.repos: |
if url.startswith(entry.url): |
if now < entry.timestamp + self.timeout: |
|
return entry.url, entry.rev |
return entry.url, -1 |
return url, -1 |
|
repositories = RepoCache() |
| |