Commit 2d75b454ef87a87bff942dc31837687919113468

Authored by Dmitriy Zaporozhets
1 parent e0635297

Store diff with line note. It makes possible to see inline notes with proper dif…

…f even if MR diff changed
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
... ...
lib/tasks/migrate/migrate_inline_notes.rake 0 → 100644
... ... @@ -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 +
... ...