filedepot 0.3.6 → 0.3.7

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d866a8ce331e6543f75dbaa24fbff8dec3e0f43e4ca8258c690fe941b4e9b44f
4
- data.tar.gz: 3eedd2a3c00cbbdde9ea7f9228a235cd315fa43fc06e0e0d80e00d7c62f5a63e
3
+ metadata.gz: d84fd048af39b7cbced3b75e2c30f07c41d4cfd0bc99a7700f1a005874cf1fab
4
+ data.tar.gz: 8bf8c29dd71e3ecd92a03ab1d41efb9bfc617c959de53e191ce9f65afb97b4f9
5
5
  SHA512:
6
- metadata.gz: 133acaa4f512a7aa70fac1397254a6c1b8ee6a867039c8c7a99296de4d93f34abb89bdb8ad342c276c7b9cfca26ad4cc85b57ae91e695e54634ecd63efeff406
7
- data.tar.gz: 436857de7be727cb75eb3aa8113d670e8595b4160bf23a9f814562fdf6c53b37cb17bc88a0239a6883bf6c012502d9f8d2baf969af4d61fbd08c120a78a69763
6
+ metadata.gz: 9c2b89ca51dfd6f6f449aeeeeefa0dcceb063e649b109b8577f5eedbdbb0e52faf5ae6c783921edb0a5b863ced8523f49ae1dfb5f9972c8326b02cfbe414b385
7
+ data.tar.gz: e8682611f3c2b160a5c9077f378e321c2693e94e9ad0fc8c344fc828cef07399f9de2be7b8145aa95e61d9b16b8993434847d58a6dedc1ee1bbcf5c02b30be40
data/lib/filedepot/cli.rb CHANGED
@@ -45,7 +45,8 @@ module Filedepot
45
45
  delete: "Usage: filedepot delete HANDLE [--version N]\n\nAfter confirmation, deletes all versions of a file.\nIf --version N is specified, deletes only that specific version.",
46
46
  info: "Usage: filedepot info HANDLE\n\nShow info for a handle: remote base path and current version.",
47
47
  handles: "Usage: filedepot handles\n\nList all handles in storage.",
48
- test: "Usage: filedepot test\n\nRun end-to-end test: push, pull, delete a temporary file."
48
+ test: "Usage: filedepot test\n\nRun end-to-end test: push, pull, delete a temporary file.",
49
+ purge: "Usage: filedepot purge HANDLE\n\nShow versions, then prompt how many to keep. Deletes older versions, keeping the newest N."
49
50
  }.freeze
50
51
 
51
52
  desc "test", "Run end-to-end test (push, pull, delete)"
@@ -235,9 +236,13 @@ module Filedepot
235
236
  if versions_list.empty?
236
237
  puts "Error: Handle '#{handle}' not found."
237
238
  else
239
+ puts "version, datetime, size"
238
240
  max_display = 10
239
241
  to_show = versions_list.first(max_display)
240
- to_show.each { |v, date_str| puts date_str.empty? ? v.to_s : "#{v} - #{date_str}" }
242
+ to_show.each do |v, date_str, size_str|
243
+ parts = [v.to_s, date_str, size_str].reject(&:empty?)
244
+ puts parts.join(", ")
245
+ end
241
246
  if versions_list.size > max_display
242
247
  remaining = versions_list.size - max_display
243
248
  puts "... and #{remaining} other ones for a total of #{versions_list.size} versions"
@@ -277,12 +282,84 @@ module Filedepot
277
282
  return unless store
278
283
 
279
284
  storage = Storage::Base.for(store)
280
- handles = storage.ls
281
- if handles.empty?
285
+ handles_list = storage.handles_data
286
+ if handles_list.empty?
282
287
  puts "No handles found."
283
288
  else
284
- handles.each { |h| puts h }
289
+ puts "name, versions, size"
290
+ handles_list.each do |h|
291
+ puts [h[:handle], h[:versions_count], h[:size]].join(", ")
292
+ end
293
+ end
294
+ end
295
+
296
+ desc "purge HANDLE", "Keep only the newest N versions; delete older ones after confirmation"
297
+ def purge(handle = nil)
298
+ if handle.nil?
299
+ puts COMMAND_HELP[:purge]
300
+ return
301
+ end
302
+
303
+ store = check_config
304
+ return unless store
305
+
306
+ storage = Storage::Base.for(store)
307
+ versions_list = storage.versions(handle)
308
+ if versions_list.empty?
309
+ puts "Error: Handle '#{handle}' not found."
310
+ return
311
+ end
312
+
313
+ puts "version, datetime, size"
314
+ versions_list.each do |v, date_str, size_str|
315
+ parts = [v.to_s, date_str, size_str].reject(&:empty?)
316
+ puts parts.join(", ")
285
317
  end
318
+
319
+ total = versions_list.size
320
+ begin
321
+ print "How many versions to keep? [1]: "
322
+ response = $stdin.gets&.strip
323
+ rescue Interrupt
324
+ puts
325
+ return
326
+ end
327
+
328
+ keep_str = response.empty? ? "1" : response
329
+ keep_num = keep_str.to_i
330
+ if keep_num < 1 || keep_str != keep_num.to_s
331
+ puts "invalid number of versions"
332
+ return
333
+ end
334
+
335
+ versions_to_delete = total - keep_num
336
+ if versions_to_delete <= 0
337
+ puts "Nothing to delete."
338
+ return
339
+ end
340
+
341
+ begin
342
+ print "Delete #{versions_to_delete} versions of #{total} total? Type handle name to confirm: "
343
+ input = $stdin.gets&.strip
344
+ rescue Interrupt
345
+ puts
346
+ return
347
+ end
348
+
349
+ unless input == handle
350
+ puts "Aborted (handle name did not match)."
351
+ return
352
+ end
353
+
354
+ version_nums = versions_list.map(&:first)
355
+ to_delete = version_nums.sort.first(versions_to_delete)
356
+ to_delete.each do |v|
357
+ storage.delete(handle, v)
358
+ puts "Deleted version #{v}"
359
+ end
360
+ puts "Purged #{versions_to_delete} versions of #{handle}"
361
+ rescue RuntimeError => e
362
+ puts "Error: #{e.message}"
286
363
  end
287
364
 
288
365
  desc "delete HANDLE", "After confirmation, delete all versions of a file; or only a specific version with --version N"
@@ -362,6 +439,7 @@ module Filedepot
362
439
  puts "filedepot push HANDLE FILE Send file to current storage"
363
440
  puts "filedepot pull HANDLE [--path PATH] [--version N] Get file from storage"
364
441
  puts "filedepot delete HANDLE [--version N] Delete file(s) after confirmation"
442
+ puts "filedepot purge HANDLE Keep newest N versions, delete older"
365
443
  puts ""
366
444
  puts "Use 'filedepot help COMMAND' for more information on a command."
367
445
  end
@@ -57,6 +57,10 @@ module Filedepot
57
57
  raise "not implemented"
58
58
  end
59
59
 
60
+ def handles_data
61
+ raise "not implemented"
62
+ end
63
+
60
64
  def push(handle, local_path)
61
65
  raise "not implemented"
62
66
  end
@@ -15,14 +15,22 @@ module Filedepot
15
15
  end
16
16
 
17
17
  def ls
18
- handles = []
18
+ handles_data.map { |h| h[:handle] }
19
+ end
20
+
21
+ def handles_data
19
22
  ssh_session do |ssh|
20
23
  result = ssh.exec!("ls -1 #{shell_escape(remote_base_path)} 2>/dev/null || true")
21
24
  return [] if result.nil? || result.strip.empty?
22
25
 
23
- handles = result.strip.split("\n").select { |line| !line.empty? }
26
+ handle_names = result.strip.split("\n").select { |line| !line.empty? }
27
+ handle_names.map do |name|
28
+ handle_dir = File.join(remote_base_path, name)
29
+ versions_list = versions_for(ssh, name)
30
+ size_str = du_size(ssh, handle_dir)
31
+ { handle: name, versions_count: versions_list.size, size: size_str }
32
+ end
24
33
  end
25
- handles
26
34
  end
27
35
 
28
36
  def push(handle, local_path)
@@ -102,20 +110,22 @@ module Filedepot
102
110
  remote_file = first_file_in_dir(ssh, version_dir)
103
111
  path = remote_file || version_dir
104
112
  filename = remote_file ? File.basename(remote_file) : nil
113
+ size_str = du_size(ssh, version_dir)
105
114
  {
106
115
  version: v,
107
116
  datetime: epoch ? Time.at(epoch) : nil,
108
117
  path: path,
109
118
  handle: handle,
110
119
  filename: filename,
111
- url: url(handle, v, filename)
120
+ url: url(handle, v, filename),
121
+ size: size_str
112
122
  }
113
123
  end
114
124
  end
115
125
  end
116
126
 
117
127
  def versions(handle)
118
- versions_data(handle).map { |d| [d[:version], d[:datetime] ? d[:datetime].to_s : ""] }
128
+ versions_data(handle).map { |d| [d[:version], d[:datetime] ? d[:datetime].to_s : "", d[:size] || ""] }
119
129
  end
120
130
 
121
131
  def delete(handle, version = nil)
@@ -175,6 +185,11 @@ module Filedepot
175
185
  result&.strip&.to_i
176
186
  end
177
187
 
188
+ def du_size(ssh, path)
189
+ result = ssh.exec!("du -sh #{shell_escape(path)} 2>/dev/null | cut -f1")
190
+ result&.strip || ""
191
+ end
192
+
178
193
  def resolve_local_path(local_path_param, remote_filename)
179
194
  if local_path_param.nil? || local_path_param.empty?
180
195
  File.join(Dir.pwd, remote_filename)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Filedepot
4
- VERSION = "0.3.6"
4
+ VERSION = "0.3.7"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: filedepot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Filedepot