jmcarbo-imapstore 0.0.3 → 0.1.0

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.
@@ -6,7 +6,7 @@ require 'imapstore'
6
6
  require 'getoptions'
7
7
 
8
8
  COMMAND_LIST = ['ls', 'rm', 'put', 'get', 'rmdir', 'mkdir', 'quota', 'setup' ]
9
- opt = GetOptions.new(%w(help subject=s command=s dir=s files=@s recursive! versioned! ))
9
+ opt = GetOptions.new(%w(help subject=s command=s dir=s files=@s recursive! versioned! all! ))
10
10
 
11
11
  if opt['help']
12
12
  puts "Usage: imapstore -c <#{COMMAND_LIST.join(', ')}> -s <subject> -d <folder> -f <file list or glob> "
@@ -20,8 +20,10 @@ dir = opt['dir'] || "INBOX"
20
20
  files = opt['files'] || "*"
21
21
  subject = opt['subject'] || ""
22
22
  recursive = opt['recursive'] || false
23
+ all = opt['all'] || false
23
24
  versioned = opt['versioned']
24
25
 
26
+
25
27
  begin
26
28
  if COMMAND_LIST.include? command
27
29
  if command == 'setup'
@@ -36,16 +38,23 @@ if COMMAND_LIST.include? command
36
38
  files.each do |f|
37
39
  f = /.+/ if f == '*'
38
40
 
39
- i.ls(dir, Regexp.new(f)).each do |a|
41
+ i.ls(dir, Regexp.new(f), recursive, all).each do |a|
40
42
  puts a
41
43
  end
42
44
  end
43
45
  when 'put':
46
+
44
47
  files.each do |f|
45
- Dir.glob(f) do |f2|
48
+ local_dir = File.dirname(f)
49
+ f = local_dir + "/**/" + File.basename(f) if recursive
50
+
51
+ Dir.glob(f, all==true ? File::FNM_DOTMATCH : 0) do |f2|
46
52
  if(!File.directory? f2)
47
- puts "Storing file #{f2}"
48
- i.store_file(f2,dir,subject)
53
+ remote_dir = dir
54
+ append_dir = File.dirname(f2).sub(/^#{local_dir}\/*/,"")
55
+ remote_dir = remote_dir + "/" + append_dir if append_dir != ""
56
+ puts "Storing file #{f2} in remote dir \"#{remote_dir}\""
57
+ i.store_file(f2,remote_dir,subject)
49
58
  end
50
59
  end
51
60
  end
@@ -53,7 +62,7 @@ if COMMAND_LIST.include? command
53
62
  files.each do |f|
54
63
  f = /.+/ if f == '*'
55
64
  puts "Getting files"
56
- i.get_file(dir, Regexp.new(f)).each do |a|
65
+ i.get_file(dir, Regexp.new(f), recursive, all).each do |a|
57
66
  puts a
58
67
  end
59
68
  end
@@ -61,14 +70,14 @@ if COMMAND_LIST.include? command
61
70
  files.each do |f|
62
71
  f = /.+/ if f == '*'
63
72
  puts "Deleting files"
64
- i.rm_file(dir, Regexp.new(f)).each do |a|
73
+ i.rm_file(dir, Regexp.new(f), recursive, all).each do |a|
65
74
  puts a
66
75
  end
67
76
  end
68
77
  when 'mkdir':
69
78
  i.mkdir(dir)
70
79
  when 'rmdir':
71
- i.rmdir(dir)
80
+ i.rmdir(dir, recursive, all)
72
81
  when 'quota':
73
82
  q = i.quota("INBOX")
74
83
  puts "Used #{q[1]['usage'].to_s} of #{q[1]['quota'].to_s}"
@@ -4,6 +4,6 @@ $:.unshift(File.dirname(__FILE__)) unless
4
4
  require 'imapstore/imapstore.rb'
5
5
 
6
6
  module IMAPSTORE
7
- VERSION = '0.0.1'
7
+ VERSION = '0.1.0'
8
8
 
9
9
  end
@@ -180,60 +180,63 @@ END
180
180
  store_file_chunk( file, folder, subject, content)
181
181
  end
182
182
  end
183
+
184
+ def transverse(target_folder = "INBOX", glob = /.+/, recursive = false, dot_files = false, folder_only=false)
185
+ file_list=[]
186
+
187
+ @imap.list(target_folder, "*").each do |folder|
188
+ if ((recursive == true) && (folder.name.match(/^#{target_folder}(\/.+)*$/))) || (folder.name == target_folder)
189
+ file_list << folder.name
190
+ yield(folder.name, nil, nil, nil, nil) if block_given?
191
+
192
+ if((!folder.attr.include? :Noselect) && (folder_only==false))
183
193
 
184
- def ls(folder = "INBOX", glob = /.+/)
185
- if folder == "/"
186
- return @imap.list("","*").map { |d| d.name }.sort
194
+ @imap.select(folder.name)
195
+
196
+ @imap.search(["NOT", "DELETED"]).each do |message_id|
197
+ a = @imap.fetch(message_id, "RFC822")
198
+ mail = TMail::Mail.parse(a[0].attr["RFC822"])
199
+ file_name = mail.subject.match(/^[^\[]+\[([^\]]+)\]/)[1]
200
+ file_list << folder.name + "/" + file_name if file_name.match(glob)
201
+ yield(folder.name, file_name, message_id, mail, file_name) if block_given? && file_name.match(glob)
202
+ end
203
+ end
204
+ end
187
205
  end
188
-
189
- file_list = []
190
- @imap.select(folder)
191
- @imap.search(["NOT", "DELETED"]).each do |message_id|
192
- a = @imap.fetch(message_id, "RFC822")
193
- mail = TMail::Mail.parse(a[0].attr["RFC822"])
194
- file_name = mail.subject.match(/^[^\[]+\[([^\]]+)\]/)[1]
195
- file_list << file_name if file_name.match(glob)
196
- end
197
- file_list
206
+
207
+ file_list.sort
208
+ end
209
+
210
+ def ls(target_folder = "INBOX", glob = /.+/, recursive = false, dot_files = false)
211
+ transverse(target_folder, glob, recursive, dot_files, false)
198
212
  end
199
213
 
200
- def get_file(folder = "INBOX", glob = /.+/)
201
- file_list = []
202
- @imap.select(folder)
203
- @imap.search(["NOT", "DELETED"]).each do |message_id|
204
- a = @imap.fetch(message_id, "RFC822")
205
- mail = TMail::Mail.parse(a[0].attr["RFC822"])
206
- file_name = mail.subject.match(/^[^\[]+\[([^\]]+)\]/)[1]
207
- if file_name.match(glob)
208
- if mail.multipart? then
209
- mail.parts.each do |m|
210
- if !m.main_type
211
- File.open(file_name,"w").write(m.body)
214
+ def get_file(target_folder = "INBOX", glob = /.+/, recursive = false, dot_files = false)
215
+ file_list = transverse(target_folder, glob, recursive, dot_files, false) do |folder, file, message_id, mail, file_name|
216
+
217
+ if mail && mail.multipart? then
218
+ mail.parts.each do |m|
219
+ if !m.main_type
220
+ append_dir = folder.sub(/^#{target_folder}\/*/,"")
221
+ if append_dir != ""
222
+ Dir.mkdir(append_dir) if !File.exists? append_dir
223
+
224
+ file_name = append_dir + "/" + file_name
212
225
  end
213
- end
214
- end
215
-
216
- file_list << file_name
226
+ File.open(file_name,"w").write(m.body)
227
+ end
228
+ end
217
229
  end
218
- end
219
- file_list
230
+ end
220
231
  end
221
232
 
222
233
 
223
234
 
224
- def rm_file(folder = "INBOX", glob = /.+/)
225
- file_list = []
226
-
227
- @imap.select(folder)
228
- @imap.search(["NOT", "DELETED"]).each do |message_id|
229
- a = @imap.fetch(message_id, "RFC822")
230
- mail = TMail::Mail.parse(a[0].attr["RFC822"])
231
- file_name = mail.subject.match(/^[^\[]+\[([^\]]+)\]/)[1]
232
- if glob && file_name.match(glob)
233
- @imap.store(message_id, "+FLAGS", [:Deleted])
234
- file_list << file_name
235
- end
236
- end
235
+ def rm_file(folder = "INBOX", glob = /.+/, recursive = false, dot_files = false)
236
+ file_list = transverse(target_folder, glob, recursive, dot_files, false) do |folder, file, message_id, mail, file_name|
237
+ @imap.store(message_id, "+FLAGS", [:Deleted]) if file && message_id
238
+ end
239
+
237
240
  @imap.expunge
238
241
 
239
242
  file_list
@@ -243,9 +246,11 @@ END
243
246
  @imap.create(folder)
244
247
  end
245
248
 
246
- def rmdir(folder)
247
- rm_file(folder)
248
- @imap.delete(folder)
249
+ def rmdir(folder, recursive = false, dot_files = false)
250
+ transverse(target_folder, glob, false, dot_files, true) do |folder, file, message_id, mail, file_name|
251
+ rm_file(folder)
252
+ @imap.delete(folder)
253
+ end
249
254
  end
250
255
 
251
256
  def quota(folder)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jmcarbo-imapstore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joan Marc Carbo Arnau
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-08 00:00:00 -08:00
12
+ date: 2009-01-10 00:00:00 -08:00
13
13
  default_executable: imapstore
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -37,7 +37,7 @@ dependencies:
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 1.1.0
40
+ version: 1.2.3
41
41
  version:
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: hoe