0
0
Fork 0

Fix thread depth computation in statuses_controller (#9426)

* Add test that should currently fail

* Fix depth computation (will still fail if statuses have been filtered out)

* Fix handling of broken threads
This commit is contained in:
ThibG 2018-12-05 02:12:29 +01:00 committed by Eugen Rochko
parent a61ce1c947
commit e88c6a5c3c
2 changed files with 21 additions and 15 deletions

View file

@ -65,12 +65,13 @@ class StatusesController < ApplicationController
private
def create_descendant_thread(depth, statuses)
def create_descendant_thread(starting_depth, statuses)
depth = starting_depth + statuses.size
if depth < DESCENDANTS_DEPTH_LIMIT
{ statuses: statuses }
{ statuses: statuses, starting_depth: starting_depth }
else
next_status = statuses.pop
{ statuses: statuses, next_status: next_status }
{ statuses: statuses, starting_depth: starting_depth, next_status: next_status }
end
end
@ -101,16 +102,19 @@ class StatusesController < ApplicationController
@descendant_threads = []
if descendants.present?
statuses = [descendants.first]
depth = 1
statuses = [descendants.first]
starting_depth = 0
descendants.drop(1).each_with_index do |descendant, index|
if descendants[index].id == descendant.in_reply_to_id
depth += 1
statuses << descendant
else
@descendant_threads << create_descendant_thread(depth, statuses)
@descendant_threads << create_descendant_thread(starting_depth, statuses)
# The thread is broken, assume it's a reply to the root status
starting_depth = 0
# ... unless we can find its ancestor in one of the already-processed threads
@descendant_threads.reverse_each do |descendant_thread|
statuses = descendant_thread[:statuses]
@ -119,18 +123,16 @@ class StatusesController < ApplicationController
end
if index.present?
depth += index - statuses.size
starting_depth = descendant_thread[:starting_depth] + index + 1
break
end
depth -= statuses.size
end
statuses = [descendant]
end
end
@descendant_threads << create_descendant_thread(depth, statuses)
@descendant_threads << create_descendant_thread(starting_depth, statuses)
end
@max_descendant_thread_id = @descendant_threads.pop[:statuses].first.id if descendants.size >= DESCENDANTS_LIMIT