47
44
self.__debug(revision)
49
46
# to handle merge revision as childs
50
if revision.merge_depth > 0 and not self.start_with_merge:
51
if self.previous_merge_depth < revision.merge_depth:
52
if self.log_count > 0:
53
merge_depth_diference = revision.merge_depth - \
54
self.previous_merge_depth
55
for m in range(merge_depth_diference):
56
actions.append(self.__open_merge)
57
if merge_depth_diference > 1:
58
self.nested_merge_count += 1
59
elif self.log_count == 0:
60
# first log is inside a merge, we show it as a top level
61
# we could support a merge tag without parent log.
62
self.start_with_merge = True
63
elif self.previous_merge_depth > revision.merge_depth:
64
# TODO: testcase for more than one level of nested merges
65
actions.append({self.__close_merge:self.previous_merge_depth - \
66
revision.merge_depth})
67
if self.nested_merge_count > 0:
68
self.nested_merge_count -= 1
70
actions.append(self.__close_log)
72
if self.open_logs > 0:
73
actions.append(self.__close_log)
74
elif self.previous_merge_depth < revision.merge_depth:
75
actions.append({self.__close_merge:self.previous_merge_depth - \
76
revision.merge_depth})
77
if self.nested_merge_count > 0:
78
self.nested_merge_count -= 1
80
actions.append(self.__close_log)
81
elif self.open_merges > 0:
82
actions.append({self.__close_merge:self.open_merges})
83
#actions.append(self.__close_merge)
84
actions.append(self.__close_log)
86
actions.append(self.__close_log)
87
if self.start_with_merge:
88
# we only care about the first log, the following logs are
89
# handlend in the logic of nested merges
90
self.start_with_merge = False
91
for action in actions:
92
if type(action) == dict:
93
action.keys()[0](action[action.keys()[0]])
47
if self.previous_merge_depth < revision.merge_depth:
48
if self.log_count > 0:
49
self.__open_merge(revision.merge_depth - self.previous_merge_depth)
50
elif self.previous_merge_depth > revision.merge_depth:
51
self.__close_merge(self.previous_merge_depth - revision.merge_depth)
52
if len(self.stack) > 0 and self.stack[len(self.stack) - 1] == 'log':
97
57
self.__log_revision(revision)
99
59
self.log_count = self.log_count + 1
100
60
self.previous_merge_depth = revision.merge_depth
102
def __open_merge(self):
103
self.to_file.write('<merge>')
104
self.open_merges += 1
105
self.stack.append('merge')
107
def __close_merge(self, num=1):
108
for item in self.stack.__reversed__():
109
self.to_file.write('</%s>' % item)
112
self.open_merges -= 1
62
def __open_merge(self, levels):
63
for i in range(levels):
64
self.to_file.write('<merge>')
65
self.stack.append('merge')
119
67
def __open_log(self):
120
68
self.to_file.write('<log>',)
121
self.open_logs = self.open_logs + 1
122
69
self.stack.append('log')
71
def __close_merge(self, levels):
72
while len(self.stack) > 0:
73
item = self.stack.pop(len(self.stack) - 1)
74
self.to_file.write('</%s>' % item)
124
80
def __close_log(self):
125
for item in self.stack.__reversed__():
81
while len(self.stack) > 0:
82
item = self.stack.pop(len(self.stack) - 1)
126
83
self.to_file.write('</%s>' % item)
132
self.open_merges -= 1
134
87
def __log_revision(self, revision):
135
88
if revision.revno is not None:
189
142
def end_log(self):
190
143
#if the last logged was inside a merge (and it was only one log)
191
if self.open_logs > 1 and self.open_merges > 0:
192
self.to_file.write('</log>')
193
self.open_logs = self.open_logs - 1
194
if not self.start_with_merge:
195
# In case that the last log was inside a merge we need to close it
196
if self.open_merges > 0:
197
for merge in range(self.open_merges):
198
self.to_file.write('</merge>')
199
if self.open_logs > 0:
200
self.to_file.write('</log>')
202
self.open_merges = self.open_merges - 1
203
# to close the last opened log
204
if self.open_logs > 0:
205
self.to_file.write('</log>')
206
self.open_logs = self.open_logs - 1
208
if self.open_logs > 0:
209
self.to_file.write('</log>')
210
self.open_logs = self.open_logs - 1
144
self.__close_merge(len(self.stack))
211
145
self.to_file.write('</logs>')