summaryrefslogtreecommitdiff
path: root/app/services/notes
diff options
context:
space:
mode:
authorDouwe Maan <douwe@selenight.nl>2016-06-20 19:22:39 +0200
committerDouwe Maan <douwe@selenight.nl>2016-07-06 18:51:00 -0400
commit710c4886911682742d439b15c5a7add7ca0bd898 (patch)
tree36c238f097c9ccb8cf328f6918810e06cf131444 /app/services/notes
parent8d7dc26d39b65b3ef6e8ec80ed5995ae307c3d3c (diff)
downloadgitlab-ce-710c4886911682742d439b15c5a7add7ca0bd898.tar.gz
Automatically update diff note positions when MR is pushed to
Diffstat (limited to 'app/services/notes')
-rw-r--r--app/services/notes/diff_position_update_service.rb30
1 files changed, 30 insertions, 0 deletions
diff --git a/app/services/notes/diff_position_update_service.rb b/app/services/notes/diff_position_update_service.rb
new file mode 100644
index 00000000000..0cb731f5bc3
--- /dev/null
+++ b/app/services/notes/diff_position_update_service.rb
@@ -0,0 +1,30 @@
+module Notes
+ class DiffPositionUpdateService < BaseService
+ def execute(note)
+ new_position = tracer.trace(note.position)
+
+ # Don't update the position if the type doesn't match, since that means
+ # the diff line commented on was changed, and the comment is now outdated
+ old_position = note.position
+ if new_position &&
+ new_position != old_position &&
+ new_position.type == old_position.type
+
+ note.position = new_position
+ end
+
+ note
+ end
+
+ private
+
+ def tracer
+ @tracer ||= Gitlab::Diff::PositionTracer.new(
+ repository: project.repository,
+ old_diff_refs: params[:old_diff_refs],
+ new_diff_refs: params[:new_diff_refs],
+ paths: params[:paths]
+ )
+ end
+ end
+end