Commit 2d75b454ef87a87bff942dc31837687919113468
1 parent
e0635297
Exists in
master
and in
4 other branches
Store diff with line note. It makes possible to see inline notes with proper dif…
…f even if MR diff changed
Showing
2 changed files
with
38 additions
and
8 deletions
Show diff stats
app/models/note.rb
| ... | ... | @@ -50,6 +50,9 @@ class Note < ActiveRecord::Base |
| 50 | 50 | scope :inc_author_project, ->{ includes(:project, :author) } |
| 51 | 51 | scope :inc_author, ->{ includes(:author) } |
| 52 | 52 | |
| 53 | + serialize :st_diff | |
| 54 | + before_create :set_diff, if: ->(n) { n.noteable_type == 'MergeRequest' && n.line_code.present? } | |
| 55 | + | |
| 53 | 56 | def self.create_status_change_note(noteable, author, status) |
| 54 | 57 | create({ |
| 55 | 58 | noteable: noteable, |
| ... | ... | @@ -67,22 +70,33 @@ class Note < ActiveRecord::Base |
| 67 | 70 | nil |
| 68 | 71 | end |
| 69 | 72 | |
| 70 | - def diff | |
| 71 | - if noteable.diffs.present? | |
| 72 | - noteable.diffs.select do |d| | |
| 73 | - if d.new_path | |
| 74 | - Digest::SHA1.hexdigest(d.new_path) == diff_file_index | |
| 75 | - end | |
| 76 | - end.first | |
| 73 | + def find_diff | |
| 74 | + return nil unless noteable.diffs.present? | |
| 75 | + | |
| 76 | + @diff ||= noteable.diffs.find do |d| | |
| 77 | + Digest::SHA1.hexdigest(d.new_path) == diff_file_index if d.new_path | |
| 77 | 78 | end |
| 78 | 79 | end |
| 79 | 80 | |
| 81 | + def set_diff | |
| 82 | + # First lets find notes with same diff | |
| 83 | + # before iterating over all mr diffs | |
| 84 | + diff = self.noteable.notes.where(line_code: self.line_code).last.try(:diff) | |
| 85 | + diff ||= find_diff | |
| 86 | + | |
| 87 | + self.st_diff = diff.to_hash if diff | |
| 88 | + end | |
| 89 | + | |
| 90 | + def diff | |
| 91 | + @diff ||= Gitlab::Git::Diff.new(st_diff) if st_diff.respond_to?(:map) | |
| 92 | + end | |
| 93 | + | |
| 80 | 94 | def diff_file_index |
| 81 | 95 | line_code.split('_')[0] |
| 82 | 96 | end |
| 83 | 97 | |
| 84 | 98 | def diff_file_name |
| 85 | - diff.new_path | |
| 99 | + diff.new_path if diff | |
| 86 | 100 | end |
| 87 | 101 | |
| 88 | 102 | def diff_new_line | ... | ... |
| ... | ... | @@ -0,0 +1,16 @@ |
| 1 | +desc "GITLAB | Migrate inline notes" | |
| 2 | +task migrate_inline_notes: :environment do | |
| 3 | + Note.where(noteable_type: 'MergeRequest').find_each(batch_size: 100) do |note| | |
| 4 | + begin | |
| 5 | + note.set_diff | |
| 6 | + if note.save | |
| 7 | + print '.' | |
| 8 | + else | |
| 9 | + print 'F' | |
| 10 | + end | |
| 11 | + rescue | |
| 12 | + print 'F' | |
| 13 | + end | |
| 14 | + end | |
| 15 | +end | |
| 16 | + | ... | ... |