diff options
author | Eric Wong <e@80x24.org> | 2018-04-26 00:01:56 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2018-04-26 00:02:24 +0000 |
commit | 370d1e01ac9a81c10aa1cc3dea256337f94321c9 (patch) | |
tree | ca724eb755de8d54aa9eac56cc52b7db3013aa05 /lib/msgthr/container.rb | |
parent | 341e3ac6a07358c76b4e0690567949063cc70497 (diff) | |
download | msgthr-370d1e01ac9a81c10aa1cc3dea256337f94321c9.tar.gz |
We failed to detect cyclic dependencies, leading to lost thread roots. In this Ruby version, I also screwed up the `seen' hash check in a misguided effort to avoid an extra hash lookup. The same algorithm was recently fixed in public-inbox: https://public-inbox.org/meta/20180425085249.14974-1-e@80x24.org/ Summarizing what happened with public-inbox: this algorithm can still be thrown off when the References: order presented to us is wrong, so sorting messages by age before feeding to Msgthr#add can improve the results. Regardless of ordering, messages should not become "lost" by the algorithm.
Diffstat (limited to 'lib/msgthr/container.rb')
-rw-r--r-- | lib/msgthr/container.rb | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/lib/msgthr/container.rb b/lib/msgthr/container.rb index fbff719..256033b 100644 --- a/lib/msgthr/container.rb +++ b/lib/msgthr/container.rb @@ -64,9 +64,10 @@ class Msgthr::Container end def has_descendent(child) # :nodoc: - seen = Hash.new(0) + seen = {} while child - return true if self == child || (seen[child] += 1) != 0 + return true if self == child || seen[child] + seen[child] = true child = child.parent end false |