sup 0.15.4 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NWExZWEzYjRhODk5ZGI5MGU1MDc3Mjg5OWU3NmE3YjI0Y2I4YzA4Mg==
5
- data.tar.gz: !binary |-
6
- YTA5YmU2MDgwNGZkZDc1MjMxMzg0NmJiNTg3NDU5NDNlMWIwMTUzNw==
2
+ SHA1:
3
+ metadata.gz: 58f12f8b8d3223e51c43fad6ebad16a8621992cb
4
+ data.tar.gz: b5d08b2c0a7734cd83b4d0613ce209b2b81b757e
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- NTllYmY1YmRiNGY0NzFmMzMxODY3MWNlM2M0NjllOWMzY2U3MDY5NWQ2MzE0
10
- OTg1OTUyNzNiZTI0NTI1YWJjMmNhMjIwM2I3NTAyOWYzOWRmZmE5N2ExNGMy
11
- NjJlMGRiYzMyZWE3ZDVhMzc2NDIwMWQ5OTMxNmI4YmQ3M2I3NTg=
12
- data.tar.gz: !binary |-
13
- NjcyZTBkMzMxYTU3OTg5Njc3NmNjOThhOGViYzYwZmUwODhkYTFkMWMxY2Nl
14
- ZDE3NGE3MWY4YWZkNjU1MzYwZjc3MGE0MzU5NTRmOTQ5OWYzZTBiZmU2MTIx
15
- YWI0ZDNiZGExZDNlNGM2NDAxMDk4MTAxOTNjMjhhMjJhZWNjMjM=
6
+ metadata.gz: 084e53c311359b9bcb0e97e57ebbb4d49b7a30a1697492522c8cd799fc86ce9b289c46ddc21a8b597a06f737923f2c6303c57bbf85343647f74e2c50fd68da85
7
+ data.tar.gz: 307daf56455e61012cb480d5bed83781a395c38233cdc545b1bf58d0bfac3286b66f580d3e3880e96e5b5338013c65388f8b3950af1630f3ba2be9a29ad1a148
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/CONTRIBUTORS CHANGED
@@ -18,10 +18,12 @@ Clint Byrum <clint at the ubuntu dot coms>
18
18
  Marcus Williams <marcus-sup at the bar-coded dot nets>
19
19
  Lionel Ott <white.magic at the gmx dot des>
20
20
  Gaudenz Steinlin <gaudenz at the soziologie dot chs>
21
- Mark Alexander <marka at the pobox dot coms>
21
+ Matthieu Rakotojaona <matthieu.rakotojaona at the gmail dot coms>
22
22
  Ingmar Vanhassel <ingmar at the exherbo dot orgs>
23
+ Mark Alexander <marka at the pobox dot coms>
23
24
  Edward Z. Yang <ezyang at the mit dot edus>
24
- Matthieu Rakotojaona <matthieu.rakotojaona at the gmail dot coms>
25
+ Timon Vonk <timonv at the gmail dot coms>
26
+ julien@macbook <julien.stechele at the gmail dot coms>
25
27
  Christopher Warrington <chrisw at the rice dot edus>
26
28
  W. Trevor King <wking at the drexel dot edus>
27
29
  Richard Brown <rbrown at the exherbo dot orgs>
@@ -29,13 +31,14 @@ Anthony Martinez <pi+sup at the pihost dot uss>
29
31
  Marc Hartstein <marc.hartstein at the alum.vassar dot edus>
30
32
  Israel Herraiz <israel.herraiz at the gmail dot coms>
31
33
  Bo Borgerson <gigabo at the gmail dot coms>
34
+ Atte Kojo <atte.kojo at the reaktor dot fis>
32
35
  Michael Hamann <michael at the content-space dot des>
33
- Jonathan Lassoff <jof at the thejof dot coms>
34
36
  William Erik Baxter <web at the superscript dot coms>
35
- Grant Hollingworth <grant at the antiflux dot orgs>
36
- Adeodato Simó <dato at the net.com.org dot ess>
37
+ Jonathan Lassoff <jof at the thejof dot coms>
37
38
  Markus Klinik <markus.klinik at the gmx dot des>
39
+ Grant Hollingworth <grant at the antiflux dot orgs>
38
40
  Ico Doornekamp <ico at the pruts dot nls>
41
+ Adeodato Simó <dato at the net.com.org dot ess>
39
42
  Daniel Schoepe <daniel.schoepe at the googlemail dot coms>
40
43
  Jason Petsod <jason at the petsod dot orgs>
41
44
  James Taylor <james at the jamestaylor dot orgs>
@@ -46,8 +49,8 @@ Decklin Foster <decklin at the red-bean dot coms>
46
49
  Cameron Matheson <cam+sup at the cammunism dot orgs>
47
50
  Carl Worth <cworth at the cworth dot orgs>
48
51
  Alex Vandiver <alex at the chmrr dot nets>
49
- Andrew Pimlott <andrew at the pimlott dot nets>
50
52
  Jeff Balogh <its.jeff.balogh at the gmail dot coms>
53
+ Andrew Pimlott <andrew at the pimlott dot nets>
51
54
  Matías Aguirre <matiasaguirre at the gmail dot coms>
52
55
  Kornilios Kourtis <kkourt at the cslab.ece.ntua dot grs>
53
56
  Lars Fischer <fischer at the wiwi.uni-siegen dot des>
@@ -58,18 +61,18 @@ Alvaro Herrera <alvherre at the alvh.no-ip dot orgs>
58
61
  Steven Lawrance <stl at the koffein dot nets>
59
62
  Jonah <Jonah at the GoodCoffee dot cas>
60
63
  ian <itaylor at the uark dot edus>
61
- Todd Eisenberger <teisenbe at the andrew.cmu dot edus>
64
+ MichaelRevell <mikearevell at the gmail dot coms>
62
65
  Per Andersson <avtobiff at the gmail dot coms>
66
+ Todd Eisenberger <teisenbe at the andrew.cmu dot edus>
67
+ Gregor Hoffleit <gregor at the sam.mediasupervision dot des>
63
68
  Adam Lloyd <adam at the alloy-d dot nets>
64
- MichaelRevell <mikearevell at the gmail dot coms>
65
69
  0xACE <0xACE at the users.noreply.github dot coms>
66
- Gregor Hoffleit <gregor at the sam.mediasupervision dot des>
67
70
  Steven Walter <swalter at the monarch.(none)>
68
- Atte Kojo <atte.kojo at the reaktor dot fis>
69
- Stefan Lundström <lundst at the snabb.(none)>
71
+ Jon M. Dugan <jdugan at the es dot nets>
72
+ Horacio Sanson <horacio at the skillupjapan.co dot jps>
70
73
  Matthias Vallentin <vallentin at the icir dot orgs>
71
74
  akojo <atte.kojo at the gmail dot coms>
72
- Horacio Sanson <horacio at the skillupjapan.co dot jps>
73
- Jon M. Dugan <jdugan at the es dot nets>
75
+ William A. Kennington III <william at the wkennington dot coms>
76
+ Stefan Lundström <lundst at the snabb.(none)>
74
77
  Johannes Larsen <johs.a.larsen at the gmail dot coms>
75
78
  Kirill Smelkov <kirr at the landau.phys.spbu dot rus>
data/History.txt CHANGED
@@ -1,3 +1,11 @@
1
+ == 0.16.0 / 2014-03-21
2
+
3
+ * sup-sync-back-mbox removed.
4
+ * safer mime-view attachment file name handling
5
+ * show thread labels in thread-view-mode
6
+ * remove lock file if there is no sup alive
7
+ * deprecate migration script on ruby > 2.1
8
+
1
9
  == 0.15.4 / 2014-02-06
2
10
 
3
11
  * Various bugfixes
data/README.md CHANGED
@@ -20,9 +20,6 @@ Features:
20
20
 
21
21
  Current limitations:
22
22
 
23
- * [Ruby 2.0 support][ruby20] is very fresh, consider it experimental. Patches
24
- are welcome
25
-
26
23
  * Sup does in general not play nicely with other mail clients, not all
27
24
  changes can be synced back to the mail source. Refer to [Maildir Syncback][maildir-syncback]
28
25
  in the wiki for this recently included feature. Maildir Syncback
data/ReleaseNotes CHANGED
@@ -1,3 +1,13 @@
1
+ Release 0.16.0:
2
+
3
+ Removed unfinished and abandoned sup-sync-back-mbox.
4
+
5
+ Safer mime-view attachment file name handling, a temp file name is used
6
+ while the extension is only used if it is alphanumeric.
7
+
8
+ The migration script for YAML documents is now deprecated for ruby > 2.1
9
+ and will be removed in the future.
10
+
1
11
  Release 0.15.4:
2
12
 
3
13
  Bugfixes.
@@ -5,6 +5,11 @@ $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
5
5
  require "sup"
6
6
  require "fileutils"
7
7
 
8
+ if RUBY_VERSION >= "2.1"
9
+ puts "YAML migration is deprecated by Ruby 2.1 and newer."
10
+ exit
11
+ end
12
+
8
13
  Redwood.start
9
14
 
10
15
  fn = Redwood::SOURCE_FN
@@ -25,49 +25,64 @@ module InteractiveLock
25
25
  begin
26
26
  Index.lock
27
27
  rescue Index::LockError => e
28
- stream.puts <<EOS
29
- Error: the index is locked by another process! User '#{e.user}' on
30
- host '#{e.host}' is running #{e.pname} with pid #{e.pid}.
31
- The process was alive as of at least #{time_ago_in_words e.mtime} ago.
28
+ begin
29
+ Process.kill 0, e.pid.to_i # 0 signal test the existence of PID
30
+ stream.puts <<EOS
31
+ Error: the index is locked by another process! User '#{e.user}' on
32
+ host '#{e.host}' is running #{e.pname} with pid #{e.pid}.
33
+ The process was alive as of at least #{time_ago_in_words e.mtime} ago.
32
34
 
33
35
  EOS
34
- stream.print "Should I ask that process to kill itself (y/n)? "
35
- stream.flush
36
-
37
- success = if $stdin.gets =~ /^\s*y(es)?\s*$/i
38
- stream.puts "Ok, trying to kill process..."
39
-
40
- begin
36
+ stream.print "Should I ask that process to kill itself (y/n)? "
37
+ stream.flush
38
+ if $stdin.gets =~ /^\s*y(es)?\s*$/i
41
39
  Process.kill "TERM", e.pid.to_i
42
40
  sleep DELAY
43
- rescue Errno::ESRCH # no such process
44
- stream.puts "Hm, I couldn't kill it."
41
+ stream.puts "Let's try that again."
42
+ begin
43
+ Index.lock
44
+ rescue Index::LockError => e
45
+ stream.puts "I couldn't lock the index. The lockfile might just be stale."
46
+ stream.print "Should I just remove it and continue? (y/n) "
47
+ stream.flush
48
+ if $stdin.gets =~ /^\s*y(es)?\s*$/i
49
+ begin
50
+ FileUtils.rm e.path
51
+ rescue Errno::ENOENT
52
+ stream.puts "The lockfile doesn't exists. We continue."
53
+ end
54
+ stream.puts "Let's try that one more time."
55
+ begin
56
+ Index.lock
57
+ rescue Index::LockError => e
58
+ stream.puts "I couldn't unlock the index."
59
+ return false
60
+ end
61
+ return true
62
+ end
63
+ end
45
64
  end
46
-
47
- stream.puts "Let's try that again."
65
+ rescue Errno::ESRCH # no such process
66
+ stream.puts "I couldn't lock the index. The lockfile might just be stale."
67
+ begin
68
+ FileUtils.rm e.path
69
+ rescue Errno::ENOENT
70
+ stream.puts "The lockfile doesn't exists. We continue."
71
+ end
72
+ stream.puts "Let's try that one more time."
48
73
  begin
74
+ sleep DELAY
49
75
  Index.lock
50
76
  rescue Index::LockError => e
51
- stream.puts "I couldn't lock the index. The lockfile might just be stale."
52
- stream.print "Should I just remove it and continue? (y/n) "
53
- stream.flush
54
-
55
- if $stdin.gets =~ /^\s*y(es)?\s*$/i
56
- FileUtils.rm e.path
57
-
58
- stream.puts "Let's try that one more time."
59
- begin
60
- Index.lock
61
- true
62
- rescue Index::LockError => e
63
- end
64
- end
77
+ stream.puts "I couldn't unlock the index."
78
+ return false
65
79
  end
80
+ return true
66
81
  end
67
-
68
- stream.puts "Sorry, couldn't unlock the index." unless success
69
- success
82
+ stream.puts "Sorry, couldn't unlock the index."
83
+ return false
70
84
  end
85
+ return true
71
86
  end
72
87
  end
73
88
 
data/lib/sup/mbox.rb CHANGED
@@ -119,8 +119,6 @@ class MBox < Source
119
119
  ## we're just moving messages around on disk, than reading things
120
120
  ## into memory with raw_message.
121
121
  ##
122
- ## i hoped never to have to move shit around on disk but
123
- ## sup-sync-back-mbox has to do it.
124
122
  def each_raw_message_line offset
125
123
  @mutex.synchronize do
126
124
  ensure_open
@@ -60,8 +60,6 @@ end
60
60
  module Redwood
61
61
  module Chunk
62
62
  class Attachment
63
- ## please see note in write_to_disk on important usage
64
- ## of quotes to avoid remote command injection.
65
63
  HookManager.register "mime-decode", <<EOS
66
64
  Decodes a MIME attachment into text form. The text will be displayed
67
65
  directly in Sup. For attachments that you wish to use a separate program
@@ -79,8 +77,6 @@ Return value:
79
77
  EOS
80
78
 
81
79
 
82
- ## please see note in write_to_disk on important usage
83
- ## of quotes to avoid remote command injection.
84
80
  HookManager.register "mime-view", <<EOS
85
81
  Views a non-text MIME attachment. This hook allows you to run
86
82
  third-party programs for attachments that require such a thing (e.g.
@@ -132,8 +128,6 @@ EOS
132
128
  when /^text\/plain\b/
133
129
  @raw_content
134
130
  else
135
- ## please see note in write_to_disk on important usage
136
- ## of quotes to avoid remote command injection.
137
131
  HookManager.run "mime-decode", :content_type => @content_type,
138
132
  :filename => lambda { write_to_disk },
139
133
  :charset => encoded_content.charset,
@@ -171,8 +165,6 @@ EOS
171
165
  def initial_state; :open end
172
166
  def viewable?; @lines.nil? end
173
167
  def view_default! path
174
- ## please see note in write_to_disk on important usage
175
- ## of quotes to avoid remote command injection.
176
168
  case RbConfig::CONFIG['arch']
177
169
  when /darwin/
178
170
  cmd = "open #{path}"
@@ -185,28 +177,32 @@ EOS
185
177
  end
186
178
 
187
179
  def view!
188
- ## please see note in write_to_disk on important usage
189
- ## of quotes to avoid remote command injection.
190
- write_to_disk do |file|
191
-
192
- @@view_tempfiles.push file # make sure the tempfile is not garbage collected before sup stops
193
-
180
+ write_to_disk do |path|
194
181
  ret = HookManager.run "mime-view", :content_type => @content_type,
195
- :filename => file.path
196
- ret || view_default!(file.path)
182
+ :filename => path
183
+ ret || view_default!(path)
197
184
  end
198
185
  end
199
186
 
200
- ## note that the path returned from write_to_disk is
201
- ## Shellwords.escaped and is intended to be used without single
202
- ## or double quotes. the use of either opens sup up for remote
203
- ## code injection through the file name.
204
187
  def write_to_disk
205
188
  begin
206
- file = Tempfile.new(["sup", Shellwords.escape(@filename.gsub("/", "_")) || "sup-attachment"])
189
+ # Add the original extension to the generated tempfile name only if the
190
+ # extension is "safe" (won't be interpreted by the shell). Since
191
+ # Tempfile.new always generates safe file names this should prevent
192
+ # attacking the user with funny attachment file names.
193
+ tempname = if (File.extname @filename) =~ /^\.[[:alnum:]]+$/ then
194
+ ["sup-attachment", File.extname(@filename)]
195
+ else
196
+ "sup-attachment"
197
+ end
198
+
199
+ file = Tempfile.new(tempname)
207
200
  file.print @raw_content
208
201
  file.flush
209
- yield file if block_given?
202
+
203
+ @@view_tempfiles.push file # make sure the tempfile is not garbage collected before sup stops
204
+
205
+ yield file.path if block_given?
210
206
  return file.path
211
207
  ensure
212
208
  file.close
@@ -130,7 +130,7 @@ protected
130
130
  def text_for_contact p
131
131
  aalias = ContactManager.alias_for(p) || ""
132
132
  [[:tagged_color, @tags.tagged?(p) ? ">" : " "],
133
- [:none, sprintf("%-#{@awidth}s %-#{@nwidth}s %s", aalias, p.name, p.email)]]
133
+ [:text_color, sprintf("%-#{@awidth}s %-#{@nwidth}s %s", aalias, p.name, p.email)]]
134
134
  end
135
135
 
136
136
  def regen_text
@@ -6,7 +6,6 @@ class InboxMode < ThreadIndexMode
6
6
  register_keymap do |k|
7
7
  ## overwrite toggle_archived with archive
8
8
  k.add :archive, "Archive thread (remove from inbox)", 'a'
9
- k.add :read_and_archive, "Archive thread (remove from inbox) and mark read", 'A'
10
9
  k.add :refine_search, "Refine search", '|'
11
10
  end
12
11
 
@@ -64,47 +63,6 @@ class InboxMode < ThreadIndexMode
64
63
  threads.each { |t| Index.save_thread t }
65
64
  end
66
65
 
67
- def read_and_archive
68
- return unless cursor_thread
69
- thread = cursor_thread # to make sure lambda only knows about 'old' cursor_thread
70
-
71
- was_unread = thread.labels.member? :unread
72
- UndoManager.register "reading and archiving thread" do
73
- thread.apply_label :inbox
74
- thread.apply_label :unread if was_unread
75
- add_or_unhide thread.first
76
- Index.save_thread thread
77
- end
78
-
79
- cursor_thread.remove_label :unread
80
- cursor_thread.remove_label :inbox
81
- hide_thread cursor_thread
82
- regen_text
83
- Index.save_thread thread
84
- end
85
-
86
- def multi_read_and_archive threads
87
- old_labels = threads.map { |t| t.labels.dup }
88
-
89
- threads.each do |t|
90
- t.remove_label :unread
91
- t.remove_label :inbox
92
- hide_thread t
93
- end
94
- regen_text
95
-
96
- UndoManager.register "reading and archiving #{threads.size.pluralize 'thread'}" do
97
- threads.zip(old_labels).each do |t, l|
98
- t.labels = l
99
- add_or_unhide t.first
100
- Index.save_thread t
101
- end
102
- regen_text
103
- end
104
-
105
- threads.each { |t| Index.save_thread t }
106
- end
107
-
108
66
  def handle_unarchived_update sender, m
109
67
  add_or_unhide m
110
68
  end
@@ -33,6 +33,7 @@ EOS
33
33
  k.add_multi "Load all threads (! to confirm) :", '!' do |kk|
34
34
  kk.add :load_all_threads, "Load all threads (may list a _lot_ of threads)", '!'
35
35
  end
36
+ k.add :read_and_archive, "Archive thread (remove from inbox) and mark read", 'A'
36
37
  k.add :cancel_search, "Cancel current search", :ctrl_g
37
38
  k.add :reload, "Refresh view", '@'
38
39
  k.add :toggle_archived, "Toggle archived status", 'a'
@@ -732,6 +733,47 @@ EOS
732
733
  end
733
734
  ignore_concurrent_calls :load_threads
734
735
 
736
+ def read_and_archive
737
+ return unless cursor_thread
738
+ thread = cursor_thread # to make sure lambda only knows about 'old' cursor_thread
739
+
740
+ was_unread = thread.labels.member? :unread
741
+ UndoManager.register "reading and archiving thread" do
742
+ thread.apply_label :inbox
743
+ thread.apply_label :unread if was_unread
744
+ add_or_unhide thread.first
745
+ Index.save_thread thread
746
+ end
747
+
748
+ cursor_thread.remove_label :unread
749
+ cursor_thread.remove_label :inbox
750
+ hide_thread cursor_thread
751
+ regen_text
752
+ Index.save_thread thread
753
+ end
754
+
755
+ def multi_read_and_archive threads
756
+ old_labels = threads.map { |t| t.labels.dup }
757
+
758
+ threads.each do |t|
759
+ t.remove_label :unread
760
+ t.remove_label :inbox
761
+ hide_thread t
762
+ end
763
+ regen_text
764
+
765
+ UndoManager.register "reading and archiving #{threads.size.pluralize 'thread'}" do
766
+ threads.zip(old_labels).each do |t, l|
767
+ t.labels = l
768
+ add_or_unhide t.first
769
+ Index.save_thread t
770
+ end
771
+ regen_text
772
+ end
773
+
774
+ threads.each { |t| Index.save_thread t }
775
+ end
776
+
735
777
  def resize rows, cols
736
778
  regen_text
737
779
  super
@@ -692,6 +692,15 @@ EOS
692
692
  end
693
693
  end
694
694
 
695
+
696
+ def status
697
+ user_labels = @thread.labels.to_a.map do |l|
698
+ l.to_s if LabelManager.user_defined_labels.member?(l)
699
+ end.compact.join(",")
700
+ user_labels = (user_labels.empty? and "" or "<#{user_labels}>")
701
+ [user_labels, super].join(" -- ")
702
+ end
703
+
695
704
  private
696
705
 
697
706
  def initial_state_for m
data/lib/sup/person.rb CHANGED
@@ -15,7 +15,7 @@ class Person
15
15
  name.gsub('\\\\', '\\')
16
16
  end
17
17
 
18
- @email = email.strip.gsub(/\s+/, " ").downcase
18
+ @email = email.strip.gsub(/\s+/, " ")
19
19
  end
20
20
 
21
21
  def to_s; "#@name <#@email>" end
data/lib/sup/source.rb CHANGED
@@ -68,7 +68,7 @@ class Source
68
68
  @poll_lock = Monitor.new
69
69
  end
70
70
 
71
- ## overwrite me if you have a disk incarnation (currently used only for sup-sync-back-mbox)
71
+ ## overwrite me if you have a disk incarnation
72
72
  def file_path; nil end
73
73
 
74
74
  def to_s; @uri.to_s; end
data/lib/sup/util.rb CHANGED
@@ -267,6 +267,14 @@ end
267
267
  class String
268
268
  def display_length
269
269
  @display_length ||= Unicode.width(self.fix_encoding!, false)
270
+
271
+ # if Unicode.width fails and returns -1, fall back to
272
+ # regular String#length, see pull-request: #256.
273
+ if @display_length < 0
274
+ @display_length = self.length
275
+ end
276
+
277
+ @display_length
270
278
  end
271
279
 
272
280
  def slice_by_display_length len
data/lib/sup/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Redwood
2
- VERSION = "0.15.4"
2
+ VERSION = "0.16.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.4
4
+ version: 0.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Morgan
@@ -11,253 +11,248 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain:
14
- - !binary |-
15
- LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURWRENDQWp5Z0F3SUJB
16
- Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJRTVFzd0NRWURWUVFEREFKbFp6
17
- RVYKTUJNR0NnbVNKb21UOGl4a0FSa1dCV2RoZFhSbE1SVXdFd1lLQ1pJbWla
18
- UHlMR1FCR1JZRmRtVjBjMm94RXpBUgpCZ29Ka2lhSmsvSXNaQUVaRmdOamIy
19
- MHdIaGNOTVRNd05UQTRNVEF6T0RRM1doY05NVFF3TlRBNE1UQXpPRFEzCldq
20
- QlFNUXN3Q1FZRFZRUUREQUpsWnpFVk1CTUdDZ21TSm9tVDhpeGtBUmtXQldk
21
- aGRYUmxNUlV3RXdZS0NaSW0KaVpQeUxHUUJHUllGZG1WMGMyb3hFekFSQmdv
22
- SmtpYUprL0lzWkFFWkZnTmpiMjB3Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFV
23
- QUE0SUJEd0F3Z2dFS0FvSUJBUUM3c05jNXpZNE1yWUI3ZXl3RS9hSzJJb0Rx
24
- cE05bHE0WkZsSHp0ClBtcTFMRzZhaDJsdS9IZmpxeGlQb3F3WTdRa2RTT0dE
25
- TFNrN0c4WUJxREEvdE9EaGtQUFNUcXhCRHpZeUNPNDYKaGFXVHRvTjV0Smt4
26
- SURKS3AxblZYSGkwTWxiNEdKVktkOVAwcTk1QmVCWUJmczh2eVBOK3k0YjRH
27
- ZWJneDlVMwpLcU1EYmU1aDlNQVBaR210aVJGTWIzdWdtaXVqRG03djhmQUNh
28
- NUV0U3ZLL2x4TWtSRGdsZWNUL2tuRTk5TllJCmwzNVNPL0J1bmUxYnhZbWt3
29
- VzY0bVE0d1JsR1ZlQW5YKzE5bXNBTGZTOXJkSkwyNmRmVzJMZ3FXaTVRb1ZU
30
- QkgKS05LVGwvaTNmeEswbXpndG5vUkNXZE1KUUZOTm9uRlRuUFVVYXdpMWM5
31
- S2g0QWRQQWdNQkFBR2pPVEEzTUFrRwpBMVVkRXdRQ01BQXdIUVlEVlIwT0JC
32
- WUVGSk5DT3hMMFNXY2JXMk0rRElFVXpBTXoxYlpzTUFzR0ExVWREd1FFCkF3
33
- SUVzREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBcjNRVWF5ZDBnZUJERXhP
34
- K1d3emFFUEF1VVozeldRWUcKRzl2cnBsQ2ttSnRqUy9YL3dWQWVmN0puL1Y1
35
- TU5rWEtYc2lPZ1hKWGtpK243SHVsTlpVZjFyenI3VW45NmdWSgoxaHEvWlR1
36
- YXBuUHBzdEJxcWR2NjBSQjhITkd5ZEhRZUV6NnVzNXozbmorS2NoUHFKNjU3
37
- RHo4b1gvTm02LzI0CjdRU1FwQ2g4eEJZZFNXRXBvSUUwelVTWTc3THRWVFJW
38
- d0lyOXVEcFdUVHI5a0NWQklOQnNPUU5qV0tydUVXalYKK0pNdURzK2lXZWZw
39
- RjRSM0J5U29PYzFRNFdvRVMzK29jMHFvMzdNc0FaeWZuUUlQVFpreUxaQ014
40
- ZUw2TWhhNApoRmMyeUFOQmo4dm9hWTVDNzRDZzJWcUV4dGNuU2F4VXRXOXdD
41
- NHc1aE9sZzBBVmZiMUpXemc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
42
- Cg==
43
- date: 2014-02-06 00:00:00.000000000 Z
14
+ - |
15
+ -----BEGIN CERTIFICATE-----
16
+ MIIDVDCCAjygAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQDDAJlZzEV
17
+ MBMGCgmSJomT8ixkARkWBWdhdXRlMRUwEwYKCZImiZPyLGQBGRYFdmV0c2oxEzAR
18
+ BgoJkiaJk/IsZAEZFgNjb20wHhcNMTMwNTA4MTAzODQ3WhcNMTQwNTA4MTAzODQ3
19
+ WjBQMQswCQYDVQQDDAJlZzEVMBMGCgmSJomT8ixkARkWBWdhdXRlMRUwEwYKCZIm
20
+ iZPyLGQBGRYFdmV0c2oxEzARBgoJkiaJk/IsZAEZFgNjb20wggEiMA0GCSqGSIb3
21
+ DQEBAQUAA4IBDwAwggEKAoIBAQC7sNc5zY4MrYB7eywE/aK2IoDqpM9lq4ZFlHzt
22
+ Pmq1LG6ah2lu/HfjqxiPoqwY7QkdSOGDLSk7G8YBqDA/tODhkPPSTqxBDzYyCO46
23
+ haWTtoN5tJkxIDJKp1nVXHi0Mlb4GJVKd9P0q95BeBYBfs8vyPN+y4b4Gebgx9U3
24
+ KqMDbe5h9MAPZGmtiRFMb3ugmiujDm7v8fACa5EtSvK/lxMkRDglecT/knE99NYI
25
+ l35SO/Bune1bxYmkwW64mQ4wRlGVeAnX+19msALfS9rdJL26dfW2LgqWi5QoVTBH
26
+ KNKTl/i3fxK0mzgtnoRCWdMJQFNNonFTnPUUawi1c9Kh4AdPAgMBAAGjOTA3MAkG
27
+ A1UdEwQCMAAwHQYDVR0OBBYEFJNCOxL0SWcbW2M+DIEUzAMz1bZsMAsGA1UdDwQE
28
+ AwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAr3QUayd0geBDExO+WwzaEPAuUZ3zWQYG
29
+ G9vrplCkmJtjS/X/wVAef7Jn/V5MNkXKXsiOgXJXki+n7HulNZUf1rzr7Un96gVJ
30
+ 1hq/ZTuapnPpstBqqdv60RB8HNGydHQeEz6us5z3nj+KchPqJ657Dz8oX/Nm6/24
31
+ 7QSQpCh8xBYdSWEpoIE0zUSY77LtVTRVwIr9uDpWTTr9kCVBINBsOQNjWKruEWjV
32
+ +JMuDs+iWefpF4R3BySoOc1Q4WoES3+oc0qo37MsAZyfnQIPTZkyLZCMxeL6Mha4
33
+ hFc2yANBj8voaY5C74Cg2VqExtcnSaxUtW9wC4w5hOlg0AVfb1JWzg==
34
+ -----END CERTIFICATE-----
35
+ date: 2014-03-21 00:00:00.000000000 Z
44
36
  dependencies:
45
37
  - !ruby/object:Gem::Dependency
46
38
  name: xapian-ruby
47
39
  requirement: !ruby/object:Gem::Requirement
48
40
  requirements:
49
- - - ~>
41
+ - - "~>"
50
42
  - !ruby/object:Gem::Version
51
43
  version: 1.2.15
52
44
  type: :runtime
53
45
  prerelease: false
54
46
  version_requirements: !ruby/object:Gem::Requirement
55
47
  requirements:
56
- - - ~>
48
+ - - "~>"
57
49
  - !ruby/object:Gem::Version
58
50
  version: 1.2.15
59
51
  - !ruby/object:Gem::Dependency
60
52
  name: ncursesw
61
53
  requirement: !ruby/object:Gem::Requirement
62
54
  requirements:
63
- - - ~>
55
+ - - "~>"
64
56
  - !ruby/object:Gem::Version
65
57
  version: 1.4.0
66
58
  type: :runtime
67
59
  prerelease: false
68
60
  version_requirements: !ruby/object:Gem::Requirement
69
61
  requirements:
70
- - - ~>
62
+ - - "~>"
71
63
  - !ruby/object:Gem::Version
72
64
  version: 1.4.0
73
65
  - !ruby/object:Gem::Dependency
74
66
  name: rmail-sup
75
67
  requirement: !ruby/object:Gem::Requirement
76
68
  requirements:
77
- - - ~>
69
+ - - "~>"
78
70
  - !ruby/object:Gem::Version
79
71
  version: 1.0.1
80
72
  type: :runtime
81
73
  prerelease: false
82
74
  version_requirements: !ruby/object:Gem::Requirement
83
75
  requirements:
84
- - - ~>
76
+ - - "~>"
85
77
  - !ruby/object:Gem::Version
86
78
  version: 1.0.1
87
79
  - !ruby/object:Gem::Dependency
88
80
  name: highline
89
81
  requirement: !ruby/object:Gem::Requirement
90
82
  requirements:
91
- - - ! '>='
83
+ - - ">="
92
84
  - !ruby/object:Gem::Version
93
85
  version: '0'
94
86
  type: :runtime
95
87
  prerelease: false
96
88
  version_requirements: !ruby/object:Gem::Requirement
97
89
  requirements:
98
- - - ! '>='
90
+ - - ">="
99
91
  - !ruby/object:Gem::Version
100
92
  version: '0'
101
93
  - !ruby/object:Gem::Dependency
102
94
  name: trollop
103
95
  requirement: !ruby/object:Gem::Requirement
104
96
  requirements:
105
- - - ! '>='
97
+ - - ">="
106
98
  - !ruby/object:Gem::Version
107
99
  version: '1.12'
108
100
  type: :runtime
109
101
  prerelease: false
110
102
  version_requirements: !ruby/object:Gem::Requirement
111
103
  requirements:
112
- - - ! '>='
104
+ - - ">="
113
105
  - !ruby/object:Gem::Version
114
106
  version: '1.12'
115
107
  - !ruby/object:Gem::Dependency
116
108
  name: lockfile
117
109
  requirement: !ruby/object:Gem::Requirement
118
110
  requirements:
119
- - - ! '>='
111
+ - - ">="
120
112
  - !ruby/object:Gem::Version
121
113
  version: '0'
122
114
  type: :runtime
123
115
  prerelease: false
124
116
  version_requirements: !ruby/object:Gem::Requirement
125
117
  requirements:
126
- - - ! '>='
118
+ - - ">="
127
119
  - !ruby/object:Gem::Version
128
120
  version: '0'
129
121
  - !ruby/object:Gem::Dependency
130
122
  name: mime-types
131
123
  requirement: !ruby/object:Gem::Requirement
132
124
  requirements:
133
- - - ~>
125
+ - - "~>"
134
126
  - !ruby/object:Gem::Version
135
127
  version: '1.0'
136
128
  type: :runtime
137
129
  prerelease: false
138
130
  version_requirements: !ruby/object:Gem::Requirement
139
131
  requirements:
140
- - - ~>
132
+ - - "~>"
141
133
  - !ruby/object:Gem::Version
142
134
  version: '1.0'
143
135
  - !ruby/object:Gem::Dependency
144
136
  name: locale
145
137
  requirement: !ruby/object:Gem::Requirement
146
138
  requirements:
147
- - - ~>
139
+ - - "~>"
148
140
  - !ruby/object:Gem::Version
149
141
  version: '2.0'
150
142
  type: :runtime
151
143
  prerelease: false
152
144
  version_requirements: !ruby/object:Gem::Requirement
153
145
  requirements:
154
- - - ~>
146
+ - - "~>"
155
147
  - !ruby/object:Gem::Version
156
148
  version: '2.0'
157
149
  - !ruby/object:Gem::Dependency
158
150
  name: chronic
159
151
  requirement: !ruby/object:Gem::Requirement
160
152
  requirements:
161
- - - ~>
153
+ - - "~>"
162
154
  - !ruby/object:Gem::Version
163
155
  version: 0.9.1
164
156
  type: :runtime
165
157
  prerelease: false
166
158
  version_requirements: !ruby/object:Gem::Requirement
167
159
  requirements:
168
- - - ~>
160
+ - - "~>"
169
161
  - !ruby/object:Gem::Version
170
162
  version: 0.9.1
171
163
  - !ruby/object:Gem::Dependency
172
164
  name: unicode
173
165
  requirement: !ruby/object:Gem::Requirement
174
166
  requirements:
175
- - - ~>
167
+ - - "~>"
176
168
  - !ruby/object:Gem::Version
177
169
  version: 0.4.4
178
170
  type: :runtime
179
171
  prerelease: false
180
172
  version_requirements: !ruby/object:Gem::Requirement
181
173
  requirements:
182
- - - ~>
174
+ - - "~>"
183
175
  - !ruby/object:Gem::Version
184
176
  version: 0.4.4
185
177
  - !ruby/object:Gem::Dependency
186
178
  name: bundler
187
179
  requirement: !ruby/object:Gem::Requirement
188
180
  requirements:
189
- - - ~>
181
+ - - "~>"
190
182
  - !ruby/object:Gem::Version
191
183
  version: '1.3'
192
184
  type: :development
193
185
  prerelease: false
194
186
  version_requirements: !ruby/object:Gem::Requirement
195
187
  requirements:
196
- - - ~>
188
+ - - "~>"
197
189
  - !ruby/object:Gem::Version
198
190
  version: '1.3'
199
191
  - !ruby/object:Gem::Dependency
200
192
  name: rake
201
193
  requirement: !ruby/object:Gem::Requirement
202
194
  requirements:
203
- - - ! '>='
195
+ - - ">="
204
196
  - !ruby/object:Gem::Version
205
197
  version: '0'
206
198
  type: :development
207
199
  prerelease: false
208
200
  version_requirements: !ruby/object:Gem::Requirement
209
201
  requirements:
210
- - - ! '>='
202
+ - - ">="
211
203
  - !ruby/object:Gem::Version
212
204
  version: '0'
213
205
  - !ruby/object:Gem::Dependency
214
206
  name: minitest
215
207
  requirement: !ruby/object:Gem::Requirement
216
208
  requirements:
217
- - - ~>
209
+ - - "~>"
218
210
  - !ruby/object:Gem::Version
219
211
  version: '4.7'
220
212
  type: :development
221
213
  prerelease: false
222
214
  version_requirements: !ruby/object:Gem::Requirement
223
215
  requirements:
224
- - - ~>
216
+ - - "~>"
225
217
  - !ruby/object:Gem::Version
226
218
  version: '4.7'
227
219
  - !ruby/object:Gem::Dependency
228
220
  name: rr
229
221
  requirement: !ruby/object:Gem::Requirement
230
222
  requirements:
231
- - - ~>
223
+ - - "~>"
232
224
  - !ruby/object:Gem::Version
233
225
  version: 1.0.5
234
226
  type: :development
235
227
  prerelease: false
236
228
  version_requirements: !ruby/object:Gem::Requirement
237
229
  requirements:
238
- - - ~>
230
+ - - "~>"
239
231
  - !ruby/object:Gem::Version
240
232
  version: 1.0.5
241
233
  - !ruby/object:Gem::Dependency
242
234
  name: gpgme
243
235
  requirement: !ruby/object:Gem::Requirement
244
236
  requirements:
245
- - - ! '>='
237
+ - - ">="
246
238
  - !ruby/object:Gem::Version
247
239
  version: 2.0.2
248
240
  type: :development
249
241
  prerelease: false
250
242
  version_requirements: !ruby/object:Gem::Requirement
251
243
  requirements:
252
- - - ! '>='
244
+ - - ">="
253
245
  - !ruby/object:Gem::Version
254
246
  version: 2.0.2
255
- description: ! " Sup is a console-based email client for people with a lot of
256
- email.\n\n * GMail-like thread-centered archiving, tagging and muting\n *
257
- Handling mail from multiple mbox and Maildir sources\n * Blazing fast full-text
258
- search with a rich query language\n * Multiple accounts - pick the right one
259
- when sending mail\n * Ruby-programmable hooks\n * Automatically tracking
260
- recent contacts\n"
247
+ description: |2
248
+ Sup is a console-based email client for people with a lot of email.
249
+
250
+ * GMail-like thread-centered archiving, tagging and muting
251
+ * Handling mail from multiple mbox and Maildir sources
252
+ * Blazing fast full-text search with a rich query language
253
+ * Multiple accounts - pick the right one when sending mail
254
+ * Ruby-programmable hooks
255
+ * Automatically tracking recent contacts
261
256
  email: sup-talk@rubyforge.org
262
257
  executables:
263
258
  - sup
@@ -268,7 +263,6 @@ executables:
268
263
  - sup-recover-sources
269
264
  - sup-sync
270
265
  - sup-sync-back-maildir
271
- - sup-sync-back-mbox
272
266
  - sup-tweak-labels
273
267
  - sup-psych-ify-config-files
274
268
  extensions: []
@@ -288,7 +282,6 @@ files:
288
282
  - bin/sup-recover-sources
289
283
  - bin/sup-sync
290
284
  - bin/sup-sync-back-maildir
291
- - bin/sup-sync-back-mbox
292
285
  - bin/sup-tweak-labels
293
286
  - lib/sup.rb
294
287
  - lib/sup/account.rb
@@ -359,26 +352,28 @@ homepage: http://supmua.org
359
352
  licenses:
360
353
  - GPL-2
361
354
  metadata: {}
362
- post_install_message: ! "SUP: If you are upgrading Sup from before version 0.14.0:
363
- Please\n run `sup-psych-ify-config-files` to migrate from 0.13.\n\n Check
364
- https://github.com/sup-heliotrope/sup/wiki/Migration-0.13-to-0.14\n for more
365
- detailed and up-to-date instructions.\n"
355
+ post_install_message: |
356
+ SUP: If you are upgrading Sup from before version 0.14.0: Please
357
+ run `sup-psych-ify-config-files` to migrate from 0.13.
358
+
359
+ Check https://github.com/sup-heliotrope/sup/wiki/Migration-0.13-to-0.14
360
+ for more detailed and up-to-date instructions.
366
361
  rdoc_options: []
367
362
  require_paths:
368
363
  - lib
369
364
  required_ruby_version: !ruby/object:Gem::Requirement
370
365
  requirements:
371
- - - ! '>='
366
+ - - ">="
372
367
  - !ruby/object:Gem::Version
373
368
  version: 1.9.2
374
369
  required_rubygems_version: !ruby/object:Gem::Requirement
375
370
  requirements:
376
- - - ! '>='
371
+ - - ">="
377
372
  - !ruby/object:Gem::Version
378
373
  version: '0'
379
374
  requirements: []
380
375
  rubyforge_project:
381
- rubygems_version: 2.2.1
376
+ rubygems_version: 2.2.2
382
377
  signing_key:
383
378
  specification_version: 4
384
379
  summary: A console-based email client with the best features of GMail, mutt and Emacs
metadata.gz.sig CHANGED
Binary file
@@ -1,181 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
4
-
5
- require 'rubygems'
6
- require 'uri'
7
- require 'tempfile'
8
- require 'trollop'
9
- require "sup"
10
-
11
- fail "not working yet"
12
-
13
- ## save a message 'm' to an open file pointer 'fp'
14
- def save m, fp
15
- m.source.each_raw_message_line(m.source_info) { |l| fp.print l }
16
- end
17
- def die msg
18
- $stderr.puts "Error: #{msg}"
19
- exit(-1)
20
- end
21
- def has_any_from_source_with_label? index, source, label
22
- query = { :source_id => source.id, :label => label, :limit => 1, :load_spam => true, :load_deleted => true, :load_killed => true }
23
- index.num_results_for(query) != 0
24
- end
25
-
26
- opts = Trollop::options do
27
- version "sup-sync-back-mbox (sup #{Redwood::VERSION})"
28
- banner <<EOS
29
- Drop or move messages from Sup sources that are marked as deleted or
30
- spam in the Sup index.
31
-
32
- Currently only works with mbox sources.
33
-
34
- Usage:
35
- sup-sync-back-mbox [options] <source>*
36
-
37
- where <source>* is zero or more source URIs. If no sources are given,
38
- sync back all usual sources.
39
-
40
- You almost certainly want to run sup-sync --changed after this command.
41
- Running this does not change the index.
42
-
43
- Options include:
44
- EOS
45
- opt :drop_deleted, "Drop deleted messages.", :default => false, :short => "d"
46
- opt :move_deleted, "Move deleted messages to a local mbox file.", :type => String, :short => :none
47
- opt :drop_spam, "Drop spam messages.", :default => false, :short => "s"
48
- opt :move_spam, "Move spam messages to a local mbox file.", :type => String, :short => :none
49
-
50
- opt :with_dotlockfile, "Specific dotlockfile location (mbox files only).", :default => "/usr/bin/dotlockfile", :short => :none
51
- opt :dont_use_dotlockfile, "Don't use dotlockfile to lock mbox files. Dangerous if other processes modify them concurrently.", :default => false, :short => :none
52
-
53
- opt :verbose, "Print message ids as they're processed."
54
- opt :dry_run, "Don't actually modify the index. Probably only useful with --verbose.", :short => "-n"
55
- opt :version, "Show version information", :short => :none
56
-
57
- conflicts :drop_deleted, :move_deleted
58
- conflicts :drop_spam, :move_spam
59
- end
60
-
61
- unless opts[:drop_deleted] || opts[:move_deleted] || opts[:drop_spam] || opts[:move_spam]
62
- puts <<EOS
63
- Nothing to do. Please specify at least one of --drop-deleted, --move-deleted,
64
- --drop-spam, or --move-spam.
65
- EOS
66
-
67
- exit
68
- end
69
-
70
- Redwood::start
71
- index = Redwood::Index.init
72
- index.lock_interactively or exit
73
-
74
- deleted_fp, spam_fp = nil
75
- unless opts[:dry_run]
76
- deleted_fp = File.open(opts[:move_deleted], "a") if opts[:move_deleted]
77
- spam_fp = File.open(opts[:move_spam], "a") if opts[:move_spam]
78
- end
79
-
80
- dotlockfile = opts[:with_dotlockfile] || "/usr/bin/dotlockfile"
81
-
82
- begin
83
- index.load
84
-
85
- sources = ARGV.map do |uri|
86
- s = Redwood::SourceManager.source_for(uri) or die "unknown source: #{uri}. Did you add it with sup-add first?"
87
- s.is_a?(Redwood::MBox) or die "#{uri} is not an mbox source."
88
- s
89
- end
90
-
91
- if sources.empty?
92
- sources = Redwood::SourceManager.usual_sources.select { |s| s.is_a? Redwood::MBox }
93
- end
94
-
95
- unless sources.all? { |s| s.file_path.nil? } || File.executable?(dotlockfile) || opts[:dont_use_dotlockfile]
96
- die <<EOS
97
- can't execute dotlockfile binary: #{dotlockfile}. Specify --with-dotlockfile
98
- if it's in a nonstandard location, or, if you want to live dangerously, try
99
- --dont-use-dotlockfile
100
- EOS
101
- end
102
-
103
- modified_sources = []
104
- sources.each do |source|
105
- $stderr.puts "Scanning #{source}..."
106
-
107
- unless ((opts[:drop_deleted] || opts[:move_deleted]) && has_any_from_source_with_label?(index, source, :deleted)) || ((opts[:drop_spam] || opts[:move_spam]) && has_any_from_source_with_label?(index, source, :spam))
108
- $stderr.puts "Nothing to do from this source; skipping"
109
- next
110
- end
111
-
112
- source.reset!
113
- num_dropped = num_moved = num_scanned = 0
114
-
115
- out_fp = Tempfile.new "sup-sync-back-mbox-#{source.id}"
116
- Redwood::PollManager.each_message_from source do |m|
117
- num_scanned += 1
118
-
119
- if(m_old = index.build_message(m.id))
120
- labels = m_old.labels
121
-
122
- if labels.member? :deleted
123
- if opts[:drop_deleted]
124
- puts "Dropping deleted message #{source}##{m.source_info}" if opts[:verbose]
125
- num_dropped += 1
126
- elsif opts[:move_deleted] && labels.member?(:deleted)
127
- puts "Moving deleted message #{source}##{m.source_info}" if opts[:verbose]
128
- save m, deleted_fp unless opts[:dry_run]
129
- num_moved += 1
130
- end
131
-
132
- elsif labels.member? :spam
133
- if opts[:drop_spam]
134
- puts "Dropping spam message #{source}##{m.source_info}" if opts[:verbose]
135
- num_dropped += 1
136
- elsif opts[:move_spam] && labels.member?(:spam)
137
- puts "Moving spam message #{source}##{m.source_info}" if opts[:verbose]
138
- save m, spam_fp unless opts[:dry_run]
139
- num_moved += 1
140
- end
141
- else
142
- save m, out_fp unless opts[:dry_run]
143
- end
144
- else
145
- save m, out_fp unless opts[:dry_run]
146
- end
147
- end
148
- $stderr.puts "Scanned #{num_scanned}, dropped #{num_dropped}, moved #{num_moved} messages from #{source}."
149
- modified_sources << source if num_dropped > 0 || num_moved > 0
150
- out_fp.close unless opts[:dry_run]
151
-
152
- unless opts[:dry_run] || (num_dropped == 0 && num_moved == 0)
153
- deleted_fp.flush if deleted_fp
154
- spam_fp.flush if spam_fp
155
- unless opts[:dont_use_dotlockfile]
156
- puts "Locking #{source.file_path}..."
157
- system "#{opts[:dotlockfile]} -l #{source.file_path}"
158
- puts "Writing #{source.file_path}..."
159
- FileUtils.cp out_fp.path, source.file_path
160
- puts "Unlocking #{source.file_path}..."
161
- system "#{opts[:dotlockfile]} -u #{source.file_path}"
162
- end
163
- end
164
- end
165
-
166
- unless opts[:dry_run]
167
- deleted_fp.close if deleted_fp
168
- spam_fp.close if spam_fp
169
- end
170
-
171
- $stderr.puts "Done."
172
- unless modified_sources.empty?
173
- $stderr.puts "You should now run: sup-sync --changed #{modified_sources.join(' ')}"
174
- end
175
- rescue Exception => e
176
- File.open("sup-exception-log.txt", "w") { |f| f.puts e.backtrace }
177
- raise
178
- ensure
179
- Redwood::finish
180
- index.unlock
181
- end