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 +4 -4
- data/lib/filedepot/cli.rb +83 -5
- data/lib/filedepot/storage/base.rb +4 -0
- data/lib/filedepot/storage/ssh.rb +20 -5
- data/lib/filedepot/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d84fd048af39b7cbced3b75e2c30f07c41d4cfd0bc99a7700f1a005874cf1fab
|
|
4
|
+
data.tar.gz: 8bf8c29dd71e3ecd92a03ab1d41efb9bfc617c959de53e191ce9f65afb97b4f9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
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
|
-
|
|
281
|
-
if
|
|
285
|
+
handles_list = storage.handles_data
|
|
286
|
+
if handles_list.empty?
|
|
282
287
|
puts "No handles found."
|
|
283
288
|
else
|
|
284
|
-
|
|
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
|
|
@@ -15,14 +15,22 @@ module Filedepot
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def ls
|
|
18
|
-
|
|
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
|
-
|
|
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)
|
data/lib/filedepot/version.rb
CHANGED