~piastucki/bzr-xmloutput/fix-551351-ignored-in-symlink-root

« back to all changes in this revision

Viewing changes to logxml.py

  • Committer: Guillermo Gonzalez
  • Author(s): Piotr Piastucki
  • Date: 2013-06-30 23:18:07 UTC
  • mfrom: (166.3.4 bzr-xmloutput)
  • Revision ID: guillo.gonzo@gmail.com-20130630231807-iy0go7zdbepaa6bh
xmllog improvements and tests fix.

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
        super(XMLLogFormatter, self).__init__(*args, **kwargs)
25
25
        self.log_count = 0
26
26
        self.start_with_merge = False
27
 
        self.nested_merge_count = 0
28
27
        self.previous_merge_depth = 0
29
28
        self.debug_enabled = 'debug' in debug.debug_flags
30
 
        self.open_logs = 0
31
 
        self.open_merges = 0
32
29
        self.stack = []
33
30
 
34
31
    def show(self, revno, rev, delta, tags=None):
47
44
            self.__debug(revision)
48
45
        actions = []
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
69
 
                else:
70
 
                    actions.append(self.__close_log)
71
 
            else:
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
79
 
            else:
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)
85
 
        else:
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]])
94
 
            else:
95
 
                action()
 
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':
 
53
                self.__close_log()
 
54
        else:        
 
55
            self.__close_log()
96
56
        self.__open_log()
97
57
        self.__log_revision(revision)
98
58
 
99
59
        self.log_count = self.log_count + 1
100
60
        self.previous_merge_depth = revision.merge_depth
101
61
 
102
 
    def __open_merge(self):
103
 
        self.to_file.write('<merge>')
104
 
        self.open_merges += 1
105
 
        self.stack.append('merge')
106
 
 
107
 
    def __close_merge(self, num=1):
108
 
        for item in self.stack.__reversed__():
109
 
            self.to_file.write('</%s>' % item)
110
 
            self.stack.pop()
111
 
            if item == 'merge':
112
 
                self.open_merges -= 1
113
 
                num -= 1
114
 
                if num == 0:
115
 
                    return
116
 
            if item == 'log':
117
 
                self.open_logs -= 1
 
62
    def __open_merge(self, levels):
 
63
        for i in range(levels):
 
64
            self.to_file.write('<merge>')
 
65
            self.stack.append('merge')
118
66
 
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')
123
70
 
 
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)
 
75
            if item == 'merge':
 
76
                levels -= 1
 
77
                if levels == 0:
 
78
                    return
 
79
            
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)
127
 
            self.stack.pop()
128
84
            if item == 'log':
129
 
                self.open_logs -= 1
130
85
                return
131
 
            if item == 'merge':
132
 
                self.open_merges -= 1
133
86
 
134
87
    def __log_revision(self, revision):
135
88
        if revision.revno is not None:
137
90
        if revision.tags:
138
91
            self.to_file.write('<tags>')
139
92
            for tag in revision.tags:
140
 
                self.to_file.write('<tag>%s</tag>' % tag)
 
93
                self.to_file.write('<tag>%s</tag>' % _escape_cdata(tag))
141
94
            self.to_file.write('</tags>')
142
95
        if self.show_ids:
143
96
            self.to_file.write('<revisionid>%s</revisionid>' %
188
141
 
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>')
201
 
                        self.open_logs -= 1
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
207
 
        else:
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>')
212
146
 
213
147