X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=lib%2Fsup%2Fthread.rb;h=99f21dc31a07bfcb3424a1fc206e20133e2ec8ab;hb=eabc808e1f79297aff65bb9e3adacf59a72b90ba;hp=83f0db71aa4a08adfda53bd469d234ba684ac338;hpb=1a402d42d2601bce15644f7cef2094d26a811e58;p=sup diff --git a/lib/sup/thread.rb b/lib/sup/thread.rb index 83f0db7..99f21dc 100644 --- a/lib/sup/thread.rb +++ b/lib/sup/thread.rb @@ -207,7 +207,7 @@ class Container def subj; find_attr :subj; end def date; find_attr :date; end - def is_reply?; subj && Message.subject_is_reply?(subj); end + def is_reply?; subj && Message.subj_is_reply?(subj); end def to_s [ "<#{id}", @@ -259,7 +259,7 @@ class ThreadSet @thread_by_subj = thread_by_subj end - def thread_for_id mid; (c = @messages[mid]) && c.root.thread end + def thread_for_id mid; @messages.member?(mid) && @messages[mid].root.thread end def contains_id? id; @messages.member?(id) && !@messages[id].empty? end def thread_for m; thread_for_id m.id end def contains? m; contains_id? m.id end @@ -324,7 +324,7 @@ class ThreadSet ## load in (at most) num number of threads from the index def load_n_threads num, opts={} @index.each_id_by_date opts do |mid, builder| - break if size >= num + break if size >= num unless num == -1 next if contains_id? mid m = builder.call @@ -349,6 +349,32 @@ class ThreadSet t.each { |m, *o| add_message m } end + ## merges two threads together. both must be members of this threadset. + ## does its best, heuristically, to determine which is the parent. + def join_threads threads + return if threads.size < 2 + + containers = threads.map do |t| + c = @messages[t.first.id] + raise "not in threadset: #{t.first.id}" unless c && c.message + c + end + + ## use subject headers heuristically + parent = containers.find { |c| !c.is_reply? } + + ## no thread was rooted by a non-reply, so make a fake parent + parent ||= @messages["joining-ref-" + containers.map { |c| c.id }.join("-")] + + containers.each do |c| + next if c == parent + c.message.add_ref parent.id + link parent, c + end + + true + end + def is_relevant? m m.refs.any? { |ref_id| @messages.member? ref_id } end @@ -389,14 +415,8 @@ class ThreadSet ## that we first added a child message with a different ## subject) if root.thread - unless @threads[key] == root.thread - if @threads[key] - root.thread.empty! - @threads[key] << root - root.thread = @threads[key] - else - @threads[key] = root.thread - end + if @threads.member?(key) && @threads[key] != root.thread + @threads.delete key end else thread = @threads[key]