larch 1.1.0.dev.20100209 → 1.1.0.dev.20100807

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/HISTORY CHANGED
@@ -15,7 +15,8 @@ Version 1.1.0 (git)
15
15
  * Added experimental support for Yahoo! Mail IMAP when connecting to
16
16
  imap.mail.yahoo.com or imap-ssl.mail.yahoo.com. See the README for caveats
17
17
  and known issues.
18
- * Folders are now copied recursively by default.
18
+ * Folders are now copied recursively by default. Use the --no-recurse option
19
+ for the old behavior.
19
20
  * Progress information is now displayed regularly while scanning large
20
21
  mailboxes.
21
22
  * Added --delete option to delete messages from the source after copying them
@@ -39,6 +40,8 @@ Version 1.1.0 (git)
39
40
  * Fixed an issue when trying to copy a folder with leading or trailing
40
41
  whitespace in the name to Gmail, since Gmail doesn't allow whitespace around
41
42
  folder names.
43
+ * Fixed an issue with bogus Exchange STATUS responses containing trailing
44
+ spaces.
42
45
 
43
46
  Version 1.0.2 (2009-08-05)
44
47
  * Fixed a bug that caused Larch to try to set the read-only \Recent flag on
data/README.rdoc CHANGED
@@ -324,6 +324,13 @@ http://groups.google.com/group/larch
324
324
  First-time senders to the list are moderated to prevent spam, so there may be a
325
325
  delay before your first message shows up.
326
326
 
327
+ == Contributors
328
+
329
+ The following lovely people have contributed code to Larch:
330
+
331
+ * Ryan Grove <ryan@wonko.com>
332
+ * Andrew Hobson <ahobson@damballa.com>
333
+
327
334
  == Credit
328
335
 
329
336
  The Larch::IMAP class borrows heavily from Sup[http://sup.rubyforge.org] by
data/bin/larch CHANGED
@@ -36,6 +36,7 @@ EOS
36
36
  opt :exclude, "List of mailbox names/patterns that shouldn't be copied", :short => :none, :type => :strings, :multi => true
37
37
  opt :exclude_file, "Filename containing mailbox names/patterns that shouldn't be copied", :short => :none, :type => :string
38
38
  opt :expunge, "Expunge deleted messages from the source", :short => '-x'
39
+ opt :no_recurse, "Don't copy subfolders recursively (cannot be used with --all or --all_subscribed)", :short => :none
39
40
  opt :sync_flags, "Sync message flags from the source to the destination for messages that already exist at the destination", :short => '-S'
40
41
 
41
42
  text "\nGeneral Options:"
data/lib/larch/config.rb CHANGED
@@ -19,6 +19,7 @@ class Config
19
19
  'from-user' => nil,
20
20
  'max-retries' => 3,
21
21
  'no-create-folder' => false,
22
+ 'no-recurse' => false,
22
23
  'ssl-certs' => nil,
23
24
  'ssl-verify' => false,
24
25
  'sync-flags' => false,
@@ -94,6 +95,10 @@ class Config
94
95
  # 'all' wins over 'all-subscribed'
95
96
  @cached['all-subscribed'] = false
96
97
  end
98
+
99
+ # 'no-recurse' is not compatible with 'all' and 'all-subscribed'
100
+ raise Error, "'no-recurse' option cannot be used with 'all' or 'all-subscribed'" if @cached['no-recurse']
101
+
97
102
  else
98
103
  @cached['from-folder'] ||= 'INBOX'
99
104
  @cached['to-folder'] ||= 'INBOX'
@@ -246,6 +246,8 @@ class Mailbox
246
246
  need_flag_scan = flag_range && flag_range.max && flag_range.min && flag_range.max - flag_range.min > 0
247
247
  need_full_scan = full_range && full_range.max && full_range.min && full_range.max - full_range.min > 0
248
248
 
249
+ return unless need_flag_scan || need_full_scan
250
+
249
251
  fetch_flags(flag_range) if need_flag_scan
250
252
 
251
253
  if need_full_scan
@@ -592,10 +594,10 @@ class Mailbox
592
594
  end
593
595
 
594
596
  elsif set.is_a?(Range)
595
- pos = set.first - 1
597
+ pos = set.min - 1
596
598
 
597
- while pos < set.last
598
- blocks << ((pos + 1)..[set.last, pos += block_size].min)
599
+ while pos < set.max
600
+ blocks << ((pos + 1)..[set.max, pos += block_size].min)
599
601
  end
600
602
  end
601
603
 
@@ -1,16 +1,54 @@
1
- # Monkeypatch Net::IMAP in Ruby <= 1.9.1 to fix broken response handling,
2
- # particularly when changing mailboxes on a Dovecot 1.2+ server.
3
- #
4
- # This monkeypatch shouldn't be necessary in Ruby 1.9.2 and higher.
5
-
6
- if RUBY_VERSION <= '1.9.1'
7
- module Net # :nodoc:
8
- class IMAP # :nodoc:
9
- class ResponseParser # :nodoc:
10
- private
11
-
12
- # This monkeypatched method is the one included in Ruby 1.9 SVN trunk as
13
- # of 2010-02-08.
1
+ # Monkeypatches for Net::IMAP.
2
+
3
+ module Net # :nodoc:
4
+ class IMAP # :nodoc:
5
+ class ResponseParser # :nodoc:
6
+ private
7
+
8
+ # Fixes an issue with bogus STATUS responses from Exchange that contain
9
+ # trailing whitespace. This monkeypatch works cleanly against Ruby 1.8.x
10
+ # and 1.9.x.
11
+ def status_response
12
+ token = match(T_ATOM)
13
+ name = token.value.upcase
14
+ match(T_SPACE)
15
+ mailbox = astring
16
+ match(T_SPACE)
17
+ match(T_LPAR)
18
+ attr = {}
19
+ while true
20
+ token = lookahead
21
+ case token.symbol
22
+ when T_RPAR
23
+ shift_token
24
+ break
25
+ when T_SPACE
26
+ shift_token
27
+ end
28
+ token = match(T_ATOM)
29
+ key = token.value.upcase
30
+ match(T_SPACE)
31
+ val = number
32
+ attr[key] = val
33
+ end
34
+
35
+ # Monkeypatch starts here...
36
+ token = lookahead
37
+ shift_token if token.symbol == T_SPACE
38
+ # ...and ends here.
39
+
40
+ data = StatusData.new(mailbox, attr)
41
+ return UntaggedResponse.new(name, data, @str)
42
+ end
43
+
44
+ if RUBY_VERSION <= '1.9.1'
45
+
46
+ # Monkeypatches Net::IMAP in Ruby <= 1.9.1 to fix broken response
47
+ # handling, particularly when changing mailboxes on a Dovecot 1.2+
48
+ # server.
49
+ #
50
+ # This monkeypatch shouldn't be necessary in Ruby 1.9.2 and higher.
51
+ # It's included in Ruby 1.9 SVN trunk as of 2010-02-08.
14
52
  def resp_text_code
15
53
  @lex_state = EXPR_BEG
16
54
  match(T_LBRA)
@@ -44,5 +82,6 @@ if RUBY_VERSION <= '1.9.1'
44
82
  end
45
83
 
46
84
  end
85
+
47
86
  end
48
87
  end
data/lib/larch/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Larch
2
2
  APP_NAME = 'Larch'
3
- APP_VERSION = '1.1.0.dev.20100209'
3
+ APP_VERSION = '1.1.0.dev.20100807'
4
4
  APP_AUTHOR = 'Ryan Grove'
5
5
  APP_EMAIL = 'ryan@wonko.com'
6
6
  APP_URL = 'http://github.com/rgrove/larch/'
data/lib/larch.rb CHANGED
@@ -131,14 +131,11 @@ module Larch
131
131
  # Ensure that the database schema is up to date.
132
132
  migration_dir = File.join(LIB_DIR, 'db', 'migrate')
133
133
 
134
- unless Sequel::Migrator.get_current_migration_version(db) ==
135
- Sequel::Migrator.latest_migration_version(migration_dir)
136
- begin
137
- Sequel::Migrator.apply(db, migration_dir)
138
- rescue => e
139
- @log.fatal "unable to migrate message database: #{e}"
140
- abort
141
- end
134
+ begin
135
+ Sequel::Migrator.apply(db, migration_dir)
136
+ rescue => e
137
+ @log.fatal "unable to migrate message database: #{e}"
138
+ abort
142
139
  end
143
140
 
144
141
  require 'larch/db/message'
@@ -165,10 +162,12 @@ module Larch
165
162
  mailbox_to.subscribe if mailbox_from.subscribed?
166
163
  copy_messages(mailbox_from, mailbox_to)
167
164
 
168
- mailbox_from.each_mailbox do |child_from|
169
- next if excluded?(child_from.name)
170
- child_to = mailbox_to.imap.mailbox(child_from.name, child_from.delim)
171
- copy_mailbox(child_from, child_to)
165
+ unless @config['no-recurse']
166
+ mailbox_from.each_mailbox do |child_from|
167
+ next if excluded?(child_from.name)
168
+ child_to = mailbox_to.imap.mailbox(child_from.name, child_from.delim)
169
+ copy_mailbox(child_from, child_to)
170
+ end
172
171
  end
173
172
  end
174
173
 
metadata CHANGED
@@ -1,7 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: larch
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0.dev.20100209
4
+ hash: 1678109927
5
+ prerelease: true
6
+ segments:
7
+ - 1
8
+ - 1
9
+ - 0
10
+ - dev
11
+ - 20100807
12
+ version: 1.1.0.dev.20100807
5
13
  platform: ruby
6
14
  authors:
7
15
  - Ryan Grove
@@ -9,49 +17,71 @@ autorequire:
9
17
  bindir: bin
10
18
  cert_chain: []
11
19
 
12
- date: 2010-02-09 00:00:00 -08:00
20
+ date: 2010-08-07 00:00:00 -07:00
13
21
  default_executable:
14
22
  dependencies:
15
23
  - !ruby/object:Gem::Dependency
16
24
  name: highline
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
25
+ prerelease: false
26
+ requirement: &id001 !ruby/object:Gem::Requirement
27
+ none: false
20
28
  requirements:
21
29
  - - ~>
22
30
  - !ruby/object:Gem::Version
31
+ hash: 3
32
+ segments:
33
+ - 1
34
+ - 5
35
+ - 0
23
36
  version: 1.5.0
24
- version:
37
+ type: :runtime
38
+ version_requirements: *id001
25
39
  - !ruby/object:Gem::Dependency
26
40
  name: sequel
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
41
+ prerelease: false
42
+ requirement: &id002 !ruby/object:Gem::Requirement
43
+ none: false
30
44
  requirements:
31
45
  - - ~>
32
46
  - !ruby/object:Gem::Version
33
- version: "3.8"
34
- version:
47
+ hash: 27
48
+ segments:
49
+ - 3
50
+ - 14
51
+ version: "3.14"
52
+ type: :runtime
53
+ version_requirements: *id002
35
54
  - !ruby/object:Gem::Dependency
36
55
  name: sqlite3-ruby
37
- type: :runtime
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
56
+ prerelease: false
57
+ requirement: &id003 !ruby/object:Gem::Requirement
58
+ none: false
40
59
  requirements:
41
60
  - - ~>
42
61
  - !ruby/object:Gem::Version
62
+ hash: 21
63
+ segments:
64
+ - 1
65
+ - 2
66
+ - 5
43
67
  version: 1.2.5
44
- version:
68
+ type: :runtime
69
+ version_requirements: *id003
45
70
  - !ruby/object:Gem::Dependency
46
71
  name: trollop
47
- type: :runtime
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
72
+ prerelease: false
73
+ requirement: &id004 !ruby/object:Gem::Requirement
74
+ none: false
50
75
  requirements:
51
76
  - - ~>
52
77
  - !ruby/object:Gem::Version
78
+ hash: 21
79
+ segments:
80
+ - 1
81
+ - 13
53
82
  version: "1.13"
54
- version:
83
+ type: :runtime
84
+ version_requirements: *id004
55
85
  description:
56
86
  email: ryan@wonko.com
57
87
  executables:
@@ -88,21 +118,31 @@ rdoc_options: []
88
118
  require_paths:
89
119
  - lib
90
120
  required_ruby_version: !ruby/object:Gem::Requirement
121
+ none: false
91
122
  requirements:
92
123
  - - ">="
93
124
  - !ruby/object:Gem::Version
125
+ hash: 59
126
+ segments:
127
+ - 1
128
+ - 8
129
+ - 6
94
130
  version: 1.8.6
95
- version:
96
131
  required_rubygems_version: !ruby/object:Gem::Requirement
132
+ none: false
97
133
  requirements:
98
134
  - - ">"
99
135
  - !ruby/object:Gem::Version
136
+ hash: 25
137
+ segments:
138
+ - 1
139
+ - 3
140
+ - 1
100
141
  version: 1.3.1
101
- version:
102
142
  requirements: []
103
143
 
104
144
  rubyforge_project:
105
- rubygems_version: 1.3.5
145
+ rubygems_version: 1.3.7
106
146
  signing_key:
107
147
  specification_version: 3
108
148
  summary: Larch copies messages from one IMAP server to another. Awesomely.