~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugins/changelog_merge/changelog_merge.py

(spiv) Fix ValueError in changelog_merge plugin. (Andrew Bennetts)

Show diffs side-by-side

added added

removed removed

Lines of Context:
85
85
            result_entries = merge_entries(
86
86
                base_entries, this_entries, other_entries)
87
87
        except EntryConflict:
88
 
            return 'not_applicable' # XXX: generating a nice conflict file
89
 
                                    # would be better
 
88
            # XXX: generating a nice conflict file would be better
 
89
            return 'not_applicable', None
90
90
        # Transform the merged elements back into real blocks of lines.
91
91
        return 'success', entries_to_lines(result_entries)
92
92
 
101
101
    This algorithm does O(N^2 * logN) SequenceMatcher.ratio() calls, which is
102
102
    pretty bad, but it shouldn't be used very often.
103
103
    """
104
 
    deleted_entries_as_strs = [
105
 
        entry_as_str(entry) for entry in deleted_entries]
106
 
    new_entries_as_strs = [
107
 
        entry_as_str(entry) for entry in new_entries]
 
104
    deleted_entries_as_strs = map(entry_as_str, deleted_entries)
 
105
    new_entries_as_strs = map(entry_as_str, new_entries)
108
106
    result_new = list(new_entries)
109
107
    result_deleted = list(deleted_entries)
110
108
    result_edits = []
112
110
    CUTOFF = 0.8
113
111
    while True:
114
112
        best = None
115
 
        best_score = None
116
 
        for new_entry in new_entries:
117
 
            new_entry_as_str = entry_as_str(new_entry)
 
113
        best_score = CUTOFF
 
114
        # Compare each new entry with each old entry to find the best match
 
115
        for new_entry_as_str in new_entries_as_strs:
118
116
            sm.set_seq1(new_entry_as_str)
119
117
            for old_entry_as_str in deleted_entries_as_strs:
120
118
                sm.set_seq2(old_entry_as_str)
121
119
                score = sm.ratio()
122
 
                if score > CUTOFF:
123
 
                    if best_score is None or score > best_score:
124
 
                        best = new_entry_as_str, old_entry_as_str
125
 
                        best_score = score
 
120
                if score > best_score:
 
121
                    best = new_entry_as_str, old_entry_as_str
 
122
                    best_score = score
126
123
        if best is not None:
 
124
            # Add the best match to the list of edits, and remove it from the
 
125
            # the list of new/old entries.  Also remove it from the new/old
 
126
            # lists for the next round.
127
127
            del_index = deleted_entries_as_strs.index(best[1])
128
128
            new_index = new_entries_as_strs.index(best[0])
129
129
            result_edits.append(
131
131
            del deleted_entries_as_strs[del_index], result_deleted[del_index]
132
132
            del new_entries_as_strs[new_index], result_new[new_index]
133
133
        else:
 
134
            # No match better than CUTOFF exists in the remaining new and old
 
135
            # entries.
134
136
            break
135
137
    return result_new, result_deleted, result_edits
136
138