51
52
return self.do_repository_request(repository, *args)
55
class SmartServerRepositoryGetParentMap(SmartServerRepositoryRequest):
57
def do_repository_request(self, repository, *revision_ids):
58
repository.lock_read()
60
return self._do_repository_request(repository, revision_ids)
64
def _do_repository_request(self, repository, revision_ids):
65
"""Get parent details for some revisions.
67
All the parents for revision_ids are returned. Additionally up to 64KB
68
of additional parent data found by performing a breadth first search
69
from revision_ids is returned.
71
:param repository: The repository to query in.
72
:param revision_id:s The utf8 encoded revision_id to answer.
73
:return: A smart server response where the body contains an utf8
74
encoded flattened list of the revision graph, (the same format as
75
Repository.get_revision_graph).
78
repo_graph = repository.get_graph()
82
next_revs = revision_ids
83
first_loop_done = False
85
queried_revs.update(next_revs)
86
parent_map = repo_graph.get_parent_map(next_revs)
88
for revision_id, parents in parent_map.iteritems():
90
if parents == (_mod_revision.NULL_REVISION,):
92
# add parents to the result
93
result[revision_id] = parents
94
# prepare the next query
95
next_revs.update(parents)
96
size_so_far += 2 + len(revision_id) + sum(map(len, parents))
97
# get all the directly asked for parents, and then flesh out to
99
if first_loop_done and size_so_far > 65000:
102
# don't query things we've already queried
103
next_revs.difference_update(queried_revs)
104
first_loop_done = True
106
for revision, parents in result.items():
107
lines.append(' '.join((revision, ) + tuple(parents)))
109
return SuccessfulSmartServerResponse(('ok', ), '\n'.join(lines))
54
112
class SmartServerRepositoryGetRevisionGraph(SmartServerRepositoryRequest):
56
114
def do_repository_request(self, repository, revision_id):