extracter 1.2.32 → 1.3.6

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.
@@ -4,14 +4,21 @@
4
4
  # =========================================================================== #
5
5
  # === Extracter::Extracter
6
6
  #
7
- # The primary purpose of this class is to abstract extracting source files
8
- # to a target location. You just pass the argument of the file that has
9
- # to be extracted to this class, and it should handle the rest.
7
+ # The primary purpose of this class is to abstract-away the extraction-step
8
+ # of source archives to a target location.
9
+ #
10
+ # The user should simply just pass the argument of the file that has
11
+ # to be extracted to this class, and the class will handle the rest.
10
12
  #
11
13
  # The class can be used to "extract" audio files as well, by calling the
12
14
  # module ExtractAudio, which is part of MultimediaParadise. You can try
13
15
  # this - just pass a .mp4 file as first argument to this class. Make sure
14
- # to have installed that gem before, via: gem install multimedia_paradise
16
+ # to have installed the multimedia gem before, via:
17
+ #
18
+ # gem install multimedia_paradise
19
+ #
20
+ # If no input was provided to this class, but a .zip file exists in
21
+ # the current working directory, then that .zip file will be used.
15
22
  #
16
23
  # Usage examples:
17
24
  #
@@ -28,11 +35,7 @@ module Extracter
28
35
 
29
36
  class Extracter < ::Extracter::Base # === Extracter::Extracter
30
37
 
31
- require 'fileutils'
32
- require 'extracter/toplevel_methods/is_this_a_valid_archive.rb'
33
- require 'extracter/toplevel_methods/misc.rb'
34
38
  require 'extracter/version/version.rb'
35
- require 'extracter/class/extract_this_archive.rb'
36
39
 
37
40
  begin
38
41
  require 'opn'
@@ -81,8 +84,8 @@ class Extracter < ::Extracter::Base # === Extracter::Extracter
81
84
  commandline_arguments
82
85
  )
83
86
  if debug? # Some debug-information in this case.
84
- e "The first argument what is: `#{commandline_arguments}`"
85
- e "The second argument where_to is: `#{extract_to}`"
87
+ opne "The first argument what is: `#{commandline_arguments}`"
88
+ opne "The second argument where_to is: `#{extract_to}`"
86
89
  end
87
90
  case run_already
88
91
  # ======================================================================= #
@@ -129,25 +132,20 @@ class Extracter < ::Extracter::Base # === Extracter::Extracter
129
132
  def reset
130
133
  super()
131
134
  # ======================================================================= #
132
- # === :try_to_use_colours
133
- # ======================================================================= #
134
- @internal_hash[:try_to_use_colours] = true
135
- # ======================================================================= #
136
- # === :colour_to_use_for_directories
137
- # ======================================================================= #
138
- @internal_hash[:colour_to_use_for_directories] = 'cyan'
139
- # ======================================================================= #
140
- # === :use_opn
135
+ # === :namespace
136
+ #
137
+ # Specify the main namespace to be used. This setting can be modified
138
+ # at "runtime".
141
139
  # ======================================================================= #
142
- @internal_hash[:use_opn] = true # ← Whether to use make use of Opn by default or not.
140
+ @internal_hash[:namespace] = NAMESPACE
143
141
  # ======================================================================= #
144
- # === :show_the_full_name_of_the_archive
142
+ # === :array_work_on_these_files
145
143
  # ======================================================================= #
146
- @internal_hash[:show_the_full_name_of_the_archive] = false
144
+ @internal_hash[:array_work_on_these_files] = []
147
145
  # ======================================================================= #
148
- # === :debug
146
+ # === :try_to_use_colours
149
147
  # ======================================================================= #
150
- @internal_hash[:debug] = false
148
+ @internal_hash[:try_to_use_colours] = true
151
149
  # ======================================================================= #
152
150
  # === :append_this_to_the_commandline
153
151
  #
@@ -156,16 +154,9 @@ class Extracter < ::Extracter::Base # === Extracter::Extracter
156
154
  # ======================================================================= #
157
155
  @internal_hash[:append_this_to_the_commandline] = ''.dup
158
156
  # ======================================================================= #
159
- # === :namespace
160
- #
161
- # Specify the main namespace to be used. This setting can be modified
162
- # at "runtime".
163
- # ======================================================================= #
164
- @internal_hash[:namespace] = NAMESPACE
165
- # ======================================================================= #
166
- # === :be_verbose
157
+ # === :show_the_full_name_of_the_archive
167
158
  # ======================================================================= #
168
- @internal_hash[:be_verbose] = true
159
+ @internal_hash[:show_the_full_name_of_the_archive] = false
169
160
  # ======================================================================= #
170
161
  # === :show_the_name
171
162
  #
@@ -195,181 +186,93 @@ class Extracter < ::Extracter::Base # === Extracter::Extracter
195
186
  end
196
187
 
197
188
  # ========================================================================= #
198
- # === do_not_show_name
199
- #
200
- # Tells us whether to use opn() or not.
201
- # ========================================================================= #
202
- def do_not_show_name
203
- @internal_hash[:show_the_name] = false
204
- end
205
-
206
- # ========================================================================= #
207
- # === show_the_name?
208
- # ========================================================================= #
209
- def show_the_name?
210
- @internal_hash[:show_the_name]
211
- end
212
-
213
- # ========================================================================= #
214
- # === check_whether_rar_is_available
215
- #
216
- # We try to find out whether unrar is available.
217
- # ========================================================================= #
218
- def check_whether_rar_is_available
219
- is_available = false
220
- ENV['PATH'].split(':').each {|entry|
221
- is_available = true if File.exist? "#{entry}/unrar"
222
- }
223
- unless is_available
224
- copn; e 'Sorry, unrar is not available. Please install it first.'
225
- end
226
- end
227
-
228
- # ========================================================================= #
229
- # === debug?
230
- # ========================================================================= #
231
- def debug?
232
- @internal_hash[:debug]
233
- end
234
-
235
- # ========================================================================= #
236
- # === run_already?
237
- # ========================================================================= #
238
- def run_already?
239
- @internal_hash[:run_already]
240
- end
241
-
242
- # ========================================================================= #
243
- # === enable_debug
244
- # ========================================================================= #
245
- def enable_debug
246
- @internal_hash[:debug] = true
247
- end
248
-
249
- # ========================================================================= #
250
- # === return_pwd
251
- # ========================================================================= #
252
- def return_pwd
253
- "#{Dir.pwd}/".squeeze('/')
254
- end
255
-
256
- # ========================================================================= #
257
- # === set_use_opn
258
- # ========================================================================= #
259
- def set_use_opn(i = true)
260
- @internal_hash[:use_opn] = i
261
- end
262
-
263
- # ========================================================================= #
264
- # === use_opn?
265
- # ========================================================================= #
266
- def use_opn?
267
- @internal_hash[:use_opn]
268
- end
269
-
270
- # ========================================================================= #
271
- # === set_commandline_arguments
272
- # ========================================================================= #
273
- def set_commandline_arguments(i = '')
274
- i = [i].flatten.compact
275
- @commandline_arguments = i
276
- end
277
-
278
- # ========================================================================= #
279
- # === commandline_arguments?
280
- # ========================================================================= #
281
- def commandline_arguments?
282
- @commandline_arguments
283
- end
284
-
285
- # ========================================================================= #
286
- # === first_argument?
287
- # ========================================================================= #
288
- def first_argument?
289
- @commandline_arguments.first
290
- end; alias first? first_argument? # === first?
291
-
292
- # ========================================================================= #
293
- # === padded_extract_to?
294
- # ========================================================================= #
295
- def padded_extract_to?
296
- " -C #{extract_to?} "
297
- end
298
-
299
- # ========================================================================= #
300
- # === set_colour_for_directories
301
- #
302
- # Set the colour for directories to use.
189
+ # === notify_the_user_that_no_input_was_given_but_this_file_was_found
303
190
  # ========================================================================= #
304
- def set_colour_for_directories(i)
305
- @internal_hash[:colour_to_use_for_directories] = ::Colours.beautify(i)
191
+ def notify_the_user_that_no_input_was_given_but_this_file_was_found(
192
+ this_file
193
+ )
194
+ opne "No input was given to #{sfancy(NAMESPACE)} but a "\
195
+ ".zip file was"
196
+ opne 'found in this directory ('+sdir(return_pwd)+rev+
197
+ '): '+sfancy(this_file)
198
+ opne 'We will use this zip file.'
306
199
  end
307
200
 
308
201
  # ========================================================================= #
309
- # === extract_to?
310
- #
311
- # Note that this method is guaranteed to return a String.
312
- # ========================================================================= #
313
- def extract_to?
314
- @internal_hash[:extract_to].to_s
315
- end; alias source_package_location extract_to? # === source_package
316
- alias extract_to_this_location? extract_to? # === extract_to_this_location?
317
- alias extracted_to? extract_to? # === extracted_to?
318
- alias extracted_path? extract_to? # === extracted_path?
319
-
320
- # ========================================================================= #
321
- # === opnn
322
- #
323
- # This variant will also check whether we should show the name or not.
202
+ # === work_on_the_given_input
324
203
  # ========================================================================= #
325
- def opnn(
326
- use_this_hash = use_this_opn_hash?
204
+ def work_on_the_given_input(
205
+ array = @internal_hash[:array_work_on_these_files],
206
+ extract_to = extract_to?
327
207
  )
328
- if use_opn? and Object.const_defined?(:Opn) and show_the_name?
329
- Opn.opn(use_this_hash)
208
+ pp array if debug?
209
+ case extract_to
210
+ # ======================================================================= #
211
+ # === :default
212
+ # ======================================================================= #
213
+ when :default,
214
+ nil
215
+ extract_to = extract_to?
330
216
  end
331
- end; alias opn opnn # === opn
332
- alias copn opnn # === copn
333
-
334
- # ========================================================================= #
335
- # === use_this_opn_hash?
336
- # ========================================================================= #
337
- def use_this_opn_hash?
338
- @internal_hash[:use_this_opn_hash]
339
- end; alias main_hash? use_this_opn_hash? # === main_hash?
340
-
341
- # ========================================================================= #
342
- # === show_help (help tag)
343
- #
344
- # This method will show the available - and documented - help options
345
- # for class Extracter.
346
- #
347
- # To call this method via the commandline try:
348
- #
349
- # extract --help
350
- #
351
- # ========================================================================= #
352
- def show_help
353
- e
354
- opnn; e 'How to extract archives, without helper scripts?'
355
- e
356
- e ' tar -zxvf foobar.tar.gz # for .tar.gz'
357
- e ' tar xvzf foobar.tgz # for .tgz'
358
- e ' tar xvfJ foobar.tar.xz # for .tar.xz'
359
- e ' tar jxf foobar.tar.bz2 # for .tar.bz2'
360
- e ' tar -xf foobar.tar.bz2 # for .tbz'
361
- e ' tar --lzip -xvf zutils-1.5.tar.lz # for .tar.lz'
362
- e ' unsquashfs foobar-1.2.3.sxz # for .sxz'
363
- e ' 7z x -so C:\home\x\src\htop\htop-3.0.5.tar.xz | 6z x -si -ttar # on windows'
364
- e
365
- opnn; e 'Furthermore, there are some commandline options '\
366
- 'that can'
367
- opnn; e 'be used for this class (class Extracter).'
368
- e
369
- e ' --to=/home/Temp # extract into the '\
370
- 'directory /home/Temp/'
371
- e
372
- end
217
+ # ======================================================================= #
218
+ # If the user supplied a directory then a random entry will be grabbed
219
+ # from said directory.
220
+ # ======================================================================= #
221
+ if array.is_a?(String) and File.directory?(array)
222
+ array = Dir[rds("#{array}/")+'*'].sample
223
+ end
224
+ if array.empty?
225
+ opne 'No archive (input) was provided. Please provide the file'
226
+ opne 'that is to be extracted.'
227
+ else
228
+ array.each {|this_file|
229
+ # =================================================================== #
230
+ # The next if-clause is for my home setup, for pseudo Symbols:
231
+ # =================================================================== #
232
+ if this_file.is_a?(String) and this_file.start_with?(':')
233
+ _ = '/home/x/src/'
234
+ if File.directory?(_+this_file.delete(':'))
235
+ target = _+this_file.delete(':')+'/*'
236
+ possible_files = Dir[target].select {|entry|
237
+ File.file?(entry)
238
+ }
239
+ unless possible_files.empty?
240
+ this_file = possible_files.first
241
+ end
242
+ end
243
+ end
244
+ # =================================================================== #
245
+ # Create the directory if it does not yet exist.
246
+ # =================================================================== #
247
+ create_directory(extract_to) unless File.directory?(extract_to)
248
+ # =================================================================== #
249
+ # Handle the case when the user did input a number.
250
+ # =================================================================== #
251
+ begin
252
+ if this_file =~ /^\d$/
253
+ this_file = Dir['*'][( this_file.to_i - 1 )] unless File.exist?(this_file)
254
+ end
255
+ rescue ArgumentError => error
256
+ opne 'An error occurred for '+sfancy(this_file)+':'
257
+ pp error
258
+ end
259
+ # =================================================================== #
260
+ # If the user supplied a directory then a random entry will be
261
+ # grabbed from said directory.
262
+ #
263
+ # Usage example:
264
+ #
265
+ # rubyextracter /home/x/src/htop/
266
+ #
267
+ # =================================================================== #
268
+ if File.directory? this_file
269
+ this_file = Dir[rds("#{this_file}/")+'*'].sample
270
+ end
271
+ extract_this_archive(this_file, extract_to)
272
+ report_to_the_user(this_file, extract_to)
273
+ }
274
+ end
275
+ end; alias extract_input work_on_the_given_input # === extract_input
373
276
 
374
277
  # ========================================================================= #
375
278
  # === pad (pad tag)
@@ -380,7 +283,8 @@ class Extracter < ::Extracter::Base # === Extracter::Extracter
380
283
  # padding.
381
284
  # ========================================================================= #
382
285
  def pad(
383
- i, with_this_character = "'"
286
+ i,
287
+ with_this_character = "'"
384
288
  )
385
289
  if i.include?('(') or i.include?(')')
386
290
  i.tr!('(','\(')
@@ -394,215 +298,16 @@ class Extracter < ::Extracter::Base # === Extracter::Extracter
394
298
  end
395
299
 
396
300
  # ========================================================================= #
397
- # === namespace?
398
- # ========================================================================= #
399
- def namespace?
400
- @internal_hash[:namespace]
401
- end
402
-
403
- # ========================================================================= #
404
- # === set_be_verbose
301
+ # === set_extract_to
405
302
  #
406
- # This sets the verbosity level of the class. Use only this method
407
- # when you wish to modify the @be_verbose instance variable.
408
- # ========================================================================= #
409
- def set_be_verbose(i = false)
410
- @internal_hash[:be_verbose] = i
411
- end; alias set_verbosity set_be_verbose # === set_verbosity
412
-
413
- # ========================================================================= #
414
- # === be_verbose?
303
+ # This is the method that should be used to determine into which
304
+ # directory this class will extract archives into.
415
305
  #
416
- # Getter method for whether we will be verbose or not.
417
- # ========================================================================= #
418
- def be_verbose?
419
- @internal_hash[:be_verbose]
420
- end
421
-
422
- # ========================================================================= #
423
- # === register_sigint
424
- # ========================================================================= #
425
- def register_sigint
426
- Signal.trap('SIGINT') {
427
- e sfancy('Requesting a graceful exit from ')+
428
- colour_to_use_for_directories?+
429
- 'class Extracter'+
430
- sfancy('. Exiting now.')
431
- exit
432
- }
433
- end
434
-
435
- # ========================================================================= #
436
- # === colour_to_use_for_directories?
437
- # ========================================================================= #
438
- def colour_to_use_for_directories?
439
- if use_colours?
440
- return @internal_hash[:colour_to_use_for_directories]
441
- else
442
- return ''
443
- end
444
- end
445
-
446
- # ========================================================================= #
447
- # === do_show_the_full_name_of_the_archive
448
- # ========================================================================= #
449
- def do_show_the_full_name_of_the_archive
450
- @internal_hash[:show_the_full_name_of_the_archive] = true
451
- end
452
-
453
- # ========================================================================= #
454
- # === prefix_namespace_with
455
- # ========================================================================= #
456
- def prefix_namespace_with(i)
457
- @internal_hash[:namespace] = "#{i}#{@internal_hash[:namespace].dup}"
458
- update_the_main_hash # Also update the opn-hash here.
459
- end
460
-
461
- # ========================================================================= #
462
- # === pad_opn_with_n_tokens
463
- # ========================================================================= #
464
- def pad_opn_with_n_tokens(n_tokens = nil)
465
- if n_tokens
466
- determine_default_opn_hash # Update this, just in case.
467
- main_hash?.update(padding: n_tokens)
468
- end
469
- end; alias set_pad_opn_with_n_tokens pad_opn_with_n_tokens # === set_pad_opn_with_n_tokens
470
-
306
+ # Note that this target can be modified from the commandline, if
307
+ # the user wants to do so.
471
308
  # ========================================================================= #
472
- # === prepare_the_hash_for_opn
473
- # ========================================================================= #
474
- def prepare_the_hash_for_opn(
475
- use_this_hash = {
476
- namespace: namespace?,
477
- use_colours: use_colours?
478
- }
479
- )
480
- # ======================================================================= #
481
- # === :use_this_opn_hash
482
- # ======================================================================= #
483
- @internal_hash[:use_this_opn_hash] = use_this_hash
484
- return @internal_hash[:use_this_opn_hash]
485
- end; alias update_the_opn_hash prepare_the_hash_for_opn # === update_the_opn_hash
486
- alias determine_default_opn_hash prepare_the_hash_for_opn # === determine_default_opn_hash
487
- alias determine_the_default_opn_hash prepare_the_hash_for_opn # === determine_the_default_opn_hash
488
- alias update_the_main_hash prepare_the_hash_for_opn # === update_the_main_hash
489
-
490
- # ========================================================================= #
491
- # === show_only_the_short_name_of_the_archive?
492
- # ========================================================================= #
493
- def show_only_the_short_name_of_the_archive?
494
- @internal_hash[:show_only_the_short_name_of_the_archive]
495
- end
496
-
497
- # ========================================================================= #
498
- # === set_run_simulation
499
- # ========================================================================= #
500
- def set_run_simulation(i = false) # false is the default here.
501
- @internal_hash[:run_simulation] = i
502
- end
503
-
504
- # ========================================================================= #
505
- # === run_simulation=
506
- # ========================================================================= #
507
- def run_simulation=(i)
508
- @internal_hash[:run_simulation] = i
509
- end
510
-
511
- # ========================================================================= #
512
- # === run_simulation?
513
- # ========================================================================= #
514
- def run_simulation?
515
- @internal_hash[:run_simulation]
516
- end
517
-
518
- # ========================================================================= #
519
- # === strip_components
520
- #
521
- # The first argument to this method will determine how far "down" tar
522
- # will strip the components.
523
- # ========================================================================= #
524
- def strip_components(
525
- by_n = 1
526
- )
527
- @internal_hash[:append_this_to_the_commandline] <<
528
- " --strip-components=#{by_n}"
529
- end
530
-
531
- # ========================================================================= #
532
- # === do_show_name
533
- #
534
- # If this method is called then the class here will show the name of
535
- # the file on the commandline, via opn().
536
- # ========================================================================= #
537
- def do_show_name
538
- @internal_hash[:show_the_name] = true
539
- end
540
-
541
- # ========================================================================= #
542
- # === enable_colours
543
- # ========================================================================= #
544
- def enable_colours
545
- set_use_colours(true)
546
- @internal_hash[:colour_to_use_for_directories] = cyan?
547
- end
548
-
549
- # ========================================================================= #
550
- # === disable_colours
551
- #
552
- # Use this method if you want to disable colour-support of this class.
553
- # ========================================================================= #
554
- def disable_colours
555
- set_use_colours(false)
556
- @internal_hash[:colour_to_use_for_directories] = ''.dup
557
- end
558
-
559
- # ========================================================================= #
560
- # === set_use_colours
561
- # ========================================================================= #
562
- def set_use_colours(i)
563
- # ======================================================================= #
564
- # We must also sync this towards our main Hash, for opn(). The next
565
- # line of code achieves precisely that.
566
- # ======================================================================= #
567
- main_hash?.update(use_colours: i)
568
- @internal_hash[:try_to_use_colours] = i
569
- end
570
-
571
- # ========================================================================= #
572
- # === try_to_use_colours?
573
- # ========================================================================= #
574
- def try_to_use_colours?
575
- @internal_hash[:try_to_use_colours]
576
- end
577
-
578
- # ========================================================================= #
579
- # === remove_file_extension
580
- # ========================================================================= #
581
- def remove_file_extension(i)
582
- _ = File.basename(i)
583
- return ::Extracter.remove_archive_type(_)
584
- end; alias remove_extension remove_file_extension # === remove_extensions
585
- alias remove_ext remove_file_extension # === remove_ext
586
-
587
- # ========================================================================= #
588
- # === rds
589
- # ========================================================================= #
590
- def rds(i)
591
- return i.squeeze('/') if i.respond_to? :squeeze
592
- return i
593
- end
594
-
595
- # ========================================================================= #
596
- # === set_extract_to
597
- #
598
- # This is the method that should be used to determine into which
599
- # directory this class will extract archives into.
600
- #
601
- # Note that this target can be modified from the commandline, if
602
- # the user wants to do so.
603
- # ========================================================================= #
604
- def set_extract_to(
605
- i = :temp_dir
309
+ def set_extract_to(
310
+ i = :temp_dir
606
311
  )
607
312
  if i.is_a?(Hash) and i.empty?
608
313
  i = :temp_dir
@@ -714,133 +419,83 @@ class Extracter < ::Extracter::Base # === Extracter::Extracter
714
419
  alias extract_to set_extract_to # === extract_to
715
420
 
716
421
  # ========================================================================= #
717
- # === try_to_extract_this_iso_file
422
+ # === run_simulation=
718
423
  # ========================================================================= #
719
- def try_to_extract_this_iso_file(i)
720
- opnn; e 'Extracting an .iso file is a bit more complicated '\
721
- 'than extracting a .tar.gz tarball'
722
- opnn; e 'archive. This class will first create a helper '\
723
- 'directory; then mount the .iso there,'
724
- opnn; e 'then copy the content to the main directory.'
725
- helper_directory = File.dirname(i)+
726
- '/READ_ONLY_DIRECTORY_'+
727
- File.basename(
728
- i.delete_suffix(File.extname(i))
729
- )+
730
- '/'
731
- mkdir(helper_directory) unless File.directory? helper_directory
732
- esystem 'mount -o loop '+i+' '+helper_directory
733
- e 'The helper directory in use is '\
734
- '`'+sdir(File.absolute_path(helper_directory))+'`.'
735
- main_directory = File.dirname(i)+
736
- '/'+
737
- File.basename(
738
- i.delete_suffix(File.extname(i))
739
- )+
740
- '/'
741
- e 'Next creating the main directory at `'+sdir(main_directory)+'`.'
742
- mkdir(main_directory) unless File.directory? main_directory
743
- e 'Next copying the content of the helper directory recursively '
744
- e 'from `'+sdir(helper_directory)+'`'
745
- e 'onto `'+sdir(
746
- main_directory+File.basename(helper_directory)+'/'
747
- )+'`.'
748
- cpr(
749
- helper_directory,
750
- main_directory+File.basename(helper_directory)+'/'
751
- )
752
- a = main_directory+File.basename(helper_directory)+'/'
753
- e 'Relocating the files next from:'
754
- e
755
- e " #{sdir(a)}"
756
- e
757
- Dir[a+'*'].each {|entry|
758
- mv(
759
- entry,
760
- main_directory
761
- )
762
- }
763
- # ======================================================================= #
764
- # And remove the directory:
765
- # ======================================================================= #
766
- remove_this_directory(a)
767
- e 'The content of the extracted (or rather, mounted) archive is:'
768
- e
769
- pp Dir["#{main_directory}*"]
770
- e
424
+ def run_simulation=(i)
425
+ @internal_hash[:run_simulation] = i
771
426
  end
772
427
 
773
428
  # ========================================================================= #
774
- # === work_on_the_given_input
429
+ # === run_simulation?
775
430
  # ========================================================================= #
776
- def work_on_the_given_input(
777
- array = commandline_arguments?,
778
- extract_to = extract_to?
779
- )
431
+ def run_simulation?
432
+ @internal_hash[:run_simulation]
433
+ end
434
+ # ========================================================================= #
435
+ # === consider_verbosity_for
436
+ # ========================================================================= #
437
+ def consider_verbosity_for(i)
438
+ i = i.dup
439
+ unless be_verbose?
440
+ case i
441
+ # "tar -xvf" must become "tar -xvf" here.
442
+ when COMMAND_TO_EXTRACT_TAR_XZ_FILES
443
+ i.delete!('v')
444
+ end
445
+ end
446
+ return i
447
+ end
448
+
449
+ # ========================================================================= #
450
+ # === try_to_glob_on
451
+ # ========================================================================= #
452
+ def try_to_glob_on(i)
453
+ result = Dir["#{i}*"]
780
454
  # ======================================================================= #
781
- # If the user supplied a directory then a random entry will be grabbed
782
- # from said directory.
455
+ # Next, sort this result to put archives on the beginning of the Array.
783
456
  # ======================================================================= #
784
- if array.is_a?(String) and File.directory?(array)
785
- array = Dir[rds("#{array}/")+'*'].sample
786
- end
787
- case extract_to
788
- when nil
789
- extract_to = extract_to?
790
- end
791
- if array.empty?
792
- opnn; e 'No archive (input) was provided. Please provide the file'
793
- opnn; e 'that is to be extracted.'
794
- else
795
- array.each {|this_file|
796
- # =================================================================== #
797
- # Create the directory if it does not yet exist.
798
- # =================================================================== #
799
- create_directory(extract_to) unless File.directory?(extract_to)
800
- # =================================================================== #
801
- # Handle the case when the user did input a number.
802
- # =================================================================== #
803
- begin
804
- if this_file =~ /^\d$/
805
- this_file = Dir['*'][( this_file.to_i - 1 )] unless File.exist?(this_file)
806
- end
807
- rescue ArgumentError => error
808
- e 'Error for '+sfancy(this_file)+':'
809
- pp error
810
- end
811
- # =================================================================== #
812
- # If the user supplied a directory then a random entry will be
813
- # grabbed from said directory.
814
- #
815
- # Usage example:
816
- #
817
- # rubyextracter /home/x/src/htop/
818
- #
819
- # =================================================================== #
820
- if File.directory? this_file
821
- this_file = Dir[rds("#{this_file}/")+'*'].sample
822
- end
823
- extract_this_archive(this_file, extract_to)
824
- report_to_the_user(this_file, extract_to)
825
- }
457
+ result = result.partition {|entry| is_archive?(entry) }
458
+ result.flatten!
459
+ unless result.empty?
460
+ # ===================================================================== #
461
+ # Ok, we grab the first entry next.
462
+ # ===================================================================== #
463
+ i = result.first
464
+ opne "#{rev}No result could be found for the given input, "\
465
+ "thus using #{sfancy(i)} #{rev}instead."
826
466
  end
467
+ return i
468
+ end
469
+
470
+ # ========================================================================= #
471
+ # === strip_components
472
+ #
473
+ # The first argument to this method will determine how far "down" tar
474
+ # will strip the components.
475
+ # ========================================================================= #
476
+ def strip_components(
477
+ by_n = 1
478
+ )
479
+ @internal_hash[:append_this_to_the_commandline] <<
480
+ " --strip-components=#{by_n}"
827
481
  end
828
482
 
829
483
  # ========================================================================= #
830
- # === create_directory (mkdir tag)
484
+ # === do_show_name
831
485
  #
832
- # Use this to create directories.
486
+ # If this method is called then the class here will show the name of
487
+ # the file on the commandline, via opn().
833
488
  # ========================================================================= #
834
- def create_directory(i)
835
- FileUtils.mkdir_p(i) unless File.directory?(i)
836
- end; alias mkdir create_directory # === mkdir
489
+ def do_show_name
490
+ @internal_hash[:show_the_name] = true
491
+ end
837
492
 
838
493
  # ========================================================================= #
839
494
  # === notify_the_user_that_this_extension_has_not_been_registered_yet
840
495
  # ========================================================================= #
841
496
  def notify_the_user_that_this_extension_has_not_been_registered_yet(i)
842
- opnn; e "The archive at `#{i}` is #{tomato('not')}"
843
- opnn; e "registered as a permissive extension."
497
+ opne "The archive at `#{i}` is #{tomato('not')}"
498
+ opne "registered as a permissive extension."
844
499
  fail_message_not_registered(i)
845
500
  end
846
501
 
@@ -850,20 +505,8 @@ class Extracter < ::Extracter::Base # === Extracter::Extracter
850
505
  # Output a fail message when the archive format is not registered.
851
506
  # ========================================================================= #
852
507
  def fail_message_not_registered(i)
853
- copn; e "#{rev}Can not extract `#{sfancy(i)}#{rev}` - it is "\
854
- "not registered."
855
- end
856
-
857
- # ========================================================================= #
858
- # === try_to_extract_this_img_file
859
- # ========================================================================= #
860
- def try_to_extract_this_img_file(i)
861
- opnn; e 'Handling a squashfs .img file format next:'
862
- name_without_extension = i.delete_suffix(File.extname(i))
863
- mkdir(name_without_extension) unless File.directory? name_without_extension
864
- esystem "mount -o loop -t squashfs #{i} #{name_without_extension}"
865
- e 'The content of the extracted (or rather, mounted) archive is:'
866
- pp Dir["#{name_without_extension}*"]
508
+ opne "#{rev}Can not extract `#{sfancy(i)}#{rev}` - it is "\
509
+ "not registered."
867
510
  end
868
511
 
869
512
  # ========================================================================= #
@@ -872,12 +515,17 @@ class Extracter < ::Extracter::Base # === Extracter::Extracter
872
515
  def menu(
873
516
  i = commandline_arguments?
874
517
  )
518
+ if debug?
519
+ opne 'The input given to this method was: `'+sfile(i)+'`'
520
+ end
875
521
  if i.is_a? Array
876
522
  i.each {|entry| menu(entry) }
877
523
  else
878
524
  case i
879
525
  # ===================================================================== #
880
- # === --help
526
+ # === extracter --help
527
+ #
528
+ # Entry point for showing help.
881
529
  # ===================================================================== #
882
530
  when /^-?-?help$/i
883
531
  show_help
@@ -890,7 +538,8 @@ class Extracter < ::Extracter::Base # === Extracter::Extracter
890
538
  # === esystem (system tag, esystem tag)
891
539
  # ========================================================================= #
892
540
  def esystem(
893
- i, try_to_use_colours = try_to_use_colours?
541
+ i,
542
+ try_to_use_colours = try_to_use_colours?
894
543
  )
895
544
  i = i.dup if i.frozen?
896
545
  # ======================================================================= #
@@ -907,9 +556,9 @@ class Extracter < ::Extracter::Base # === Extracter::Extracter
907
556
  end
908
557
  end
909
558
  if run_simulation?
910
- copn; e 'As we are running in simulation mode, the following command '
911
- copn; e 'is the one that we would have been used if we were to not run '
912
- copn; e 'in simulation mode:'
559
+ opne 'As we are running in simulation mode, the following command '
560
+ opne 'is the one that we would have been used if we were to not run '
561
+ opne 'in simulation mode:'
913
562
  if be_verbose?
914
563
  if try_to_use_colours
915
564
  e steelblue(i)
@@ -959,35 +608,545 @@ class Extracter < ::Extracter::Base # === Extracter::Extracter
959
608
  )
960
609
  if be_verbose?
961
610
  target = extract_to+
962
- remove_file_extension(
963
- File.basename(i)
964
- )+
611
+ remove_file_extension(File.basename(i))+
965
612
  '/'
966
- opnn; e "#{rev}Finished extracting to `"\
967
- "#{sdir(target)}#{rev}`." # This is an Array.
613
+ opne "#{rev}Finished extracting to `"\
614
+ "#{sdir(target)}#{rev}`." # This is an Array.
968
615
  end
969
616
  end
970
617
 
971
618
  # ========================================================================= #
972
- # === be_verbose
619
+ # === try_to_extract_this_iso_file
973
620
  # ========================================================================= #
974
- def be_verbose
975
- set_be_verbose(true)
621
+ def try_to_extract_this_iso_file(i)
622
+ opne 'Extracting an .iso file is a bit more complicated '\
623
+ 'than extracting a .tar.gz tarball'
624
+ opne 'archive. This class will first create a helper '\
625
+ 'directory; then mount the .iso there,'
626
+ opne 'then copy the content to the main directory.'
627
+ helper_directory = File.dirname(i)+
628
+ '/READ_ONLY_DIRECTORY_'+
629
+ File.basename(
630
+ i.delete_suffix(File.extname(i))
631
+ )+
632
+ '/'
633
+ mkdir(helper_directory) unless File.directory? helper_directory
634
+ esystem 'mount -o loop '+i+' '+helper_directory
635
+ opne 'The helper directory in use is '\
636
+ '`'+sdir(File.absolute_path(helper_directory))+'`.'
637
+ main_directory = File.dirname(i)+
638
+ '/'+
639
+ File.basename(
640
+ i.delete_suffix(File.extname(i))
641
+ )+
642
+ '/'
643
+ opne 'Next creating the main directory at `'+sdir(main_directory)+'`.'
644
+ mkdir(main_directory) unless File.directory? main_directory
645
+ opne 'Next copying the content of the helper directory recursively '
646
+ opne 'from `'+sdir(helper_directory)+'`'
647
+ opne 'onto `'+sdir(
648
+ main_directory+File.basename(helper_directory)+'/'
649
+ )+'`.'
650
+ cpr(
651
+ helper_directory,
652
+ main_directory+File.basename(helper_directory)+'/'
653
+ )
654
+ a = main_directory+File.basename(helper_directory)+'/'
655
+ opne 'Relocating the files next from:'
656
+ e
657
+ e " #{sdir(a)}"
658
+ e
659
+ Dir[a+'*'].each {|entry|
660
+ mv(
661
+ entry,
662
+ main_directory
663
+ )
664
+ }
665
+ # ======================================================================= #
666
+ # And remove the directory:
667
+ # ======================================================================= #
668
+ remove_this_directory(a)
669
+ opne 'The content of the extracted (or rather, mounted) archive is:'
670
+ e
671
+ pp Dir["#{main_directory}*"]
672
+ e
673
+ end
674
+
675
+ # ========================================================================= #
676
+ # === try_to_extract_this_img_file
677
+ # ========================================================================= #
678
+ def try_to_extract_this_img_file(i)
679
+ opne 'Handling a squashfs .img file format next:'
680
+ name_without_extension = i.delete_suffix(File.extname(i))
681
+ mkdir(name_without_extension) unless File.directory? name_without_extension
682
+ esystem "mount -o loop -t squashfs #{i} #{name_without_extension}"
683
+ opne 'The content of the extracted (or rather, mounted) archive is:'
684
+ pp Dir["#{name_without_extension}*"]
685
+ end
686
+
687
+ # ========================================================================= #
688
+ # === do_show_the_full_name_of_the_archive
689
+ # ========================================================================= #
690
+ def do_show_the_full_name_of_the_archive
691
+ @internal_hash[:show_the_full_name_of_the_archive] = true
692
+ end
693
+
694
+ # ========================================================================= #
695
+ # === show_help (help tag)
696
+ #
697
+ # This method will show the available - and documented - help options
698
+ # for class Extracter.
699
+ #
700
+ # To call this method via the commandline try:
701
+ #
702
+ # extract --help
703
+ #
704
+ # ========================================================================= #
705
+ def show_help
706
+ e
707
+ opne 'How to extract archives, without helper scripts?'
708
+ e
709
+ e ' tar -zxvf foobar.tar.gz # → for .tar.gz'
710
+ e ' tar xvzf foobar.tgz # → for .tgz'
711
+ e ' tar xvfJ foobar.tar.xz # → for .tar.xz'
712
+ e ' tar jxf foobar.tar.bz2 # → for .tar.bz2'
713
+ e ' tar -xf foobar.tar.bz2 # → for .tbz'
714
+ e ' tar --lzip -xvf zutils-1.5.tar.lz # → for .tar.lz'
715
+ e ' unsquashfs foobar-1.2.3.sxz # → for .sxz'
716
+ e ' 7z x -so C:\home\x\src\htop\htop-3.0.5.tar.xz | 7z x -si -ttar # → on windows'
717
+ e
718
+ opne 'Furthermore, there are some commandline options that can'
719
+ opne 'be used for this class (class Extracter).'
720
+ e
721
+ e ' --to=/home/Temp # extract into the '\
722
+ 'directory /home/Temp/'
723
+ e
724
+ end
725
+
726
+ # ========================================================================= #
727
+ # === prefix_namespace_with
728
+ # ========================================================================= #
729
+ def prefix_namespace_with(i)
730
+ @internal_hash[:namespace] = "#{i}#{@internal_hash[:namespace].dup}"
731
+ update_the_main_hash # Also update the opn-hash here.
732
+ end
733
+
734
+ # ========================================================================= #
735
+ # === prepare_the_hash_for_opn
736
+ # ========================================================================= #
737
+ def prepare_the_hash_for_opn(
738
+ use_this_hash = {
739
+ namespace: namespace?,
740
+ use_colours: use_colours?,
741
+ show_the_name: show_the_name?
742
+ }
743
+ )
744
+ # ======================================================================= #
745
+ # === :use_this_opn_hash
746
+ # ======================================================================= #
747
+ @internal_hash[:use_this_opn_hash] = use_this_hash
748
+ return @internal_hash[:use_this_opn_hash]
749
+ end; alias update_the_opn_hash prepare_the_hash_for_opn # === update_the_opn_hash
750
+ alias determine_default_opn_hash prepare_the_hash_for_opn # === determine_default_opn_hash
751
+ alias determine_the_default_opn_hash prepare_the_hash_for_opn # === determine_the_default_opn_hash
752
+ alias update_the_main_hash prepare_the_hash_for_opn # === update_the_main_hash
753
+
754
+ # ========================================================================= #
755
+ # === show_only_the_short_name_of_the_archive?
756
+ # ========================================================================= #
757
+ def show_only_the_short_name_of_the_archive?
758
+ @internal_hash[:show_only_the_short_name_of_the_archive]
759
+ end
760
+
761
+ # ========================================================================= #
762
+ # === set_run_simulation
763
+ #
764
+ # This should always default to false, if no other argument has been
765
+ # supplied.
766
+ # ========================================================================= #
767
+ def set_run_simulation(i = false)
768
+ @internal_hash[:run_simulation] = i
976
769
  end
977
770
 
978
771
  # ========================================================================= #
979
- # === do_be_quiet
772
+ # === padded_extract_to?
980
773
  # ========================================================================= #
981
- def do_be_quiet
982
- set_be_verbose(false)
983
- end; alias be_silent do_be_quiet # === be_silent
984
- alias be_quiet do_be_quiet # === be_quiet
774
+ def padded_extract_to?
775
+ " -C #{extract_to?} "
776
+ end
777
+
778
+ # ========================================================================= #
779
+ # === set_colour_for_directories
780
+ #
781
+ # Set the colour for directories to use.
782
+ # ========================================================================= #
783
+ def set_colour_for_directories(i)
784
+ @internal_hash[:colour_to_use_for_directories] = ::Colours.beautify(i)
785
+ end
786
+
787
+ # ========================================================================= #
788
+ # === do_not_show_name
789
+ #
790
+ # Tells us whether to use opn() or not.
791
+ # ========================================================================= #
792
+ def do_not_show_name
793
+ @internal_hash[:show_the_name] = false
794
+ end
795
+
796
+ # ========================================================================= #
797
+ # === check_whether_rar_is_available
798
+ #
799
+ # We try to find out whether unrar is available.
800
+ # ========================================================================= #
801
+ def check_whether_rar_is_available
802
+ is_available = false
803
+ ENV['PATH'].split(':').each {|entry|
804
+ is_available = true if File.exist? "#{entry}/unrar"
805
+ }
806
+ unless is_available
807
+ opne 'unrar appears to be unavailable. Please install it first.'
808
+ end
809
+ end
810
+
811
+ # ========================================================================= #
812
+ # === show_the_name?
813
+ # ========================================================================= #
814
+ def show_the_name?
815
+ @internal_hash[:show_the_name]
816
+ end
817
+
818
+ # ========================================================================= #
819
+ # === run_already?
820
+ # ========================================================================= #
821
+ def run_already?
822
+ @internal_hash[:run_already]
823
+ end
824
+
825
+ # ========================================================================= #
826
+ # === extract_to?
827
+ #
828
+ # Note that this method is guaranteed to return a String.
829
+ # ========================================================================= #
830
+ def extract_to?
831
+ @internal_hash[:extract_to].to_s
832
+ end; alias extract_to_this_location? extract_to? # === extract_to_this_location?
833
+ alias extracted_to? extract_to? # === extracted_to?
834
+ alias extracted_path? extract_to? # === extracted_path?
835
+ alias source_package_location extract_to? # === source_package
836
+
837
+ # ========================================================================= #
838
+ # === pad_opn_with_n_tokens
839
+ # ========================================================================= #
840
+ def pad_opn_with_n_tokens(n_tokens = nil)
841
+ if n_tokens
842
+ determine_default_opn_hash # Update this, just in case.
843
+ main_hash?.update(padding: n_tokens)
844
+ end
845
+ end; alias set_pad_opn_with_n_tokens pad_opn_with_n_tokens # === set_pad_opn_with_n_tokens
846
+
847
+ # ========================================================================= #
848
+ # === set_work_on_these_files
849
+ # ========================================================================= #
850
+ def set_work_on_these_files(
851
+ i = []
852
+ )
853
+ if i.is_a?(Array) and i.empty?
854
+ # ===================================================================== #
855
+ # === Check for .zip files
856
+ #
857
+ # In this case, try to see if the current directory has a .zip
858
+ # file. We will use this in that case.
859
+ # ===================================================================== #
860
+ is_there_a_zip_file = Dir['*.zip']
861
+ unless is_there_a_zip_file.empty?
862
+ use_this_zip_file = is_there_a_zip_file.first
863
+ notify_the_user_that_no_input_was_given_but_this_file_was_found(use_this_zip_file)
864
+ i << use_this_zip_file
865
+ end
866
+ is_there_at_the_least_one_tar_xz_file = Dir['*.tar.xz']
867
+ unless is_there_at_the_least_one_tar_xz_file.empty?
868
+ i << is_there_at_the_least_one_tar_xz_file.first
869
+ end
870
+ end
871
+ i = [i].compact.flatten.map {|entry|
872
+ unless File.exist? entry
873
+ entry = try_to_glob_on(entry)
874
+ end
875
+ entry
876
+ }
877
+ @internal_hash[:array_work_on_these_files] = i
878
+ end; alias set_input set_work_on_these_files # === set_input
879
+
880
+ # ========================================================================= #
881
+ # === extract_this_archive (extract tag)
882
+ # ========================================================================= #
883
+ def extract_this_archive(
884
+ i,
885
+ extract_to = extract_to?
886
+ )
887
+ i = File.absolute_path(i)
888
+ # ======================================================================= #
889
+ # First determine whether we can extract the archive or whether we can
890
+ # not:
891
+ # ======================================================================= #
892
+ unless ::Extracter.is_this_a_valid_archive?(i) or i.end_with?('.pdf')
893
+ opne 'The given input, '+i+', is not a valid archive format.'
894
+ return
895
+ end
896
+ # ======================================================================= #
897
+ # Next handle the situation when we are on Windows:
898
+ # ======================================================================= #
899
+ if ::Extracter.are_we_on_windows?
900
+ # ===================================================================== #
901
+ # On windows we will overrule this completely, for now.
902
+ # ===================================================================== #
903
+ Extract.this_on_windows(i)
904
+ return
905
+ end
906
+ if be_verbose?
907
+ if show_only_the_short_name_of_the_archive?
908
+ name_of_the_archive = File.basename(i)
909
+ opne "#{rev}Extracting `#{sfancy(name_of_the_archive)}#{rev}` "\
910
+ "to `#{sdir(extract_to)}#{rev}`."
911
+ else
912
+ opne "#{rev}Extracting `#{sfancy(i)}` to "\
913
+ "`#{sdir(extract_to)}#{rev}`."
914
+ end
915
+ end
916
+ unless File.writable? extract_to
917
+ copn; ewarn 'You do not have sufficient permissions to'
918
+ copn; ewarn "modify #{sdir(extract_to)}#{swarn('.')}"
919
+ return
920
+ end
921
+ # ===================================================================== #
922
+ # Next, pad it if it includes a ' ' character or (). This was
923
+ # disabled as of July 2022.
924
+ # ===================================================================== #
925
+ # i = pad(i) if i.include?(' ') or i.include?(')')
926
+ case i # case tag; those listed on top are more important.
927
+ # ===================================================================== #
928
+ # === 7z
929
+ # ===================================================================== #
930
+ when '.7z' # 7z does not accept the -C commandline.
931
+ # _ << '7za e' # <- Deprecated this variant as of 05.06.2020.
932
+ esystem "7z x #{i}"
933
+ # ===================================================================== #
934
+ # === .tar.xz
935
+ #
936
+ # Note that .txz is just .tar.xz. Support for .txz was added here
937
+ # in January of 2012.
938
+ # ===================================================================== #
939
+ when /\.tar\.xz$/i,
940
+ /\.txz$/i,
941
+ /\.xz$/i
942
+ esystem consider_verbosity_for(COMMAND_TO_EXTRACT_TAR_XZ_FILES)+
943
+ ' '+i+padded_extract_to?
944
+ # ===================================================================== #
945
+ # === .rpm
946
+ #
947
+ # This entry point will handle .rpm files.
948
+ # ===================================================================== #
949
+ when /\.rpm$/i
950
+ name_of_the_directory = i.delete_suffix('.rpm')
951
+ mkdir(name_of_the_directory)
952
+ set_extract_to(File.absolute_path(name_of_the_directory))
953
+ cd(name_of_the_directory)
954
+ esystem 'rpm2cpio ../'+File.basename(i)+' | cpio -idmv'
955
+ return # Early return.
956
+ # ===================================================================== #
957
+ # === .tar
958
+ #
959
+ # This entry point is for simple .tar files.
960
+ # ===================================================================== #
961
+ when /\.tar$/i
962
+ esystem COMMAND_TO_EXTRACT_TAR_FILES+' '+i+padded_extract_to?
963
+ # ===================================================================== #
964
+ # === zip
965
+ # ===================================================================== #
966
+ when /.zip$/i,
967
+ /.xpi$/i,
968
+ /.docx$/i,
969
+ /.odt$/i, # .docx and .odt format types can be unpacked with zip too.
970
+ /.apkg$/
971
+ # =================================================================== #
972
+ # 'ar -jxf' # unzip #{what} <-- this should work as well.
973
+ # =================================================================== #
974
+ i = pad(i) if i.include?(' ') or i.include?(')')
975
+ esystem "unzip #{i}"
976
+ # ===================================================================== #
977
+ # === tgz
978
+ #
979
+ # This entry point will also handle ".tar.Z" files.
980
+ # ===================================================================== #
981
+ when /\.?tgz$/i,
982
+ /\.?tar.Z$/i,
983
+ /\.?taz$/i
984
+ esystem COMMAND_TO_EXTRACT_TGZ_FILES+' '+i+padded_extract_to?
985
+ # ===================================================================== #
986
+ # === .tar.bz2
987
+ # ===================================================================== #
988
+ when /\.tar\.bz2$/i,
989
+ /\.tbz$/i
990
+ esystem COMMAND_TO_EXTRACT_TAR_BZ2_FILES+' '+i+padded_extract_to?
991
+ # ===================================================================== #
992
+ # === gz
993
+ # ===================================================================== #
994
+ when /\.?gz$/i,
995
+ /\.?apk$/i
996
+ if i.include? '.tar' # Handle .tar.gz here.
997
+ esystem 'tar -zxvf '+i+padded_extract_to?
998
+ else
999
+ esystem "gunzip #{i}"
1000
+ end
1001
+ # ===================================================================== #
1002
+ # === .bz2
1003
+ # ===================================================================== #
1004
+ when /\.?bz2$/,
1005
+ /\.?tbz2$/
1006
+ if i.include? '.tar' # Treat it as a .tar file.
1007
+ esystem 'tar -vjxf '+i
1008
+ else
1009
+ esystem "bunzip2 #{i}"
1010
+ end
1011
+ # ===================================================================== #
1012
+ # === rar
1013
+ # ===================================================================== #
1014
+ when '.rar'
1015
+ check_whether_rar_is_available
1016
+ esystem "unrar e #{i}"
1017
+ # ===================================================================== #
1018
+ # === .zst
1019
+ #
1020
+ # This entry point is for e. g. "pymol-2.3.0-3-x86_64.pkg.tar.zst".
1021
+ # ===================================================================== #
1022
+ when '.zst',
1023
+ '.tar.zst'
1024
+ esystem COMMAND_TO_EXTRACT_ZST_ARCHIVES+' '+i
1025
+ # ===================================================================== #
1026
+ # === deb
1027
+ #
1028
+ # We could use dpkg-deb too, such as via "dpkg-deb". But using "ar"
1029
+ # seems to be the better choice.
1030
+ # ===================================================================== #
1031
+ when /\.?deb$/i
1032
+ esystem COMMAND_TO_EXTRACT_DEB_FILES+' '+i
1033
+ # ===================================================================== #
1034
+ # === gem
1035
+ #
1036
+ # The gem commands needs a specific --target=DIRECTORY option.
1037
+ # ===================================================================== #
1038
+ when /\.?gem$/i
1039
+ esystem GEM_UNPACK_COMMAND+' '+i+" --target=#{extract_to}"
1040
+ # ===================================================================== #
1041
+ # === lzma
1042
+ # ===================================================================== #
1043
+ when '.lzma'
1044
+ esystem "#{COMMAND_TO_EXTRACT_LZMA_FILES} #{i}"
1045
+ # ===================================================================== #
1046
+ # === bin
1047
+ #
1048
+ # This entry point allows the user to handle .bin files. In this
1049
+ # context, "handling" means to simply run that file as-is.
1050
+ # ===================================================================== #
1051
+ when /\.?bin$/i
1052
+ esystem("./#{i}")
1053
+ # ===================================================================== #
1054
+ # === iso
1055
+ # ===================================================================== #
1056
+ when /\.?iso$/i
1057
+ try_to_extract_this_iso_file(i)
1058
+ return
1059
+ # ===================================================================== #
1060
+ # === img
1061
+ #
1062
+ # Note that .img in this context refers to squafhs .img files.
1063
+ # ===================================================================== #
1064
+ when /\.?img$/i,
1065
+ /\.?squashfs$/i
1066
+ try_to_extract_this_img_file(i)
1067
+ return # Must return early in this case.
1068
+ # ===================================================================== #
1069
+ # === lz
1070
+ #
1071
+ # This entry point requires lzip to be installed.
1072
+ # ===================================================================== #
1073
+ when /\.?lz$/i,
1074
+ /\.?tar\.?lz$/i
1075
+ esystem("#{COMMAND_TO_EXTRACT_LZ_FILES} #{i}#{padded_extract_to?}")
1076
+ # ===================================================================== #
1077
+ # === mp4
1078
+ #
1079
+ # If it is a .mp4 file, we delegate to MultimediaParadise.extract_audio.
1080
+ #
1081
+ # Usage example:
1082
+ #
1083
+ # rubyextract foobar.mp4
1084
+ #
1085
+ # ===================================================================== #
1086
+ when /\.?mp4$/i
1087
+ begin
1088
+ require 'multimedia_paradise/audio/extract_audio/extract_audio.rb'
1089
+ rescue LoadError; end
1090
+ if Object.const_defined? :MultimediaParadise
1091
+ MultimediaParadise.extract_audio(i)
1092
+ end
1093
+ # ===================================================================== #
1094
+ # === ps
1095
+ # ===================================================================== #
1096
+ when/\.?ps$/i
1097
+ esystem 'ps2ascii '+i+padded_extract_to?
1098
+ # ===================================================================== #
1099
+ # === .jar
1100
+ # ===================================================================== #
1101
+ when /\.?jar$/i
1102
+ esystem COMMAND_TO_EXTRACT_JAR_ARCHIVES+' '+i
1103
+ # ===================================================================== #
1104
+ # === rpm
1105
+ # ===================================================================== #
1106
+ when '.rpm'
1107
+ esystem "#{COMMAND_TO_EXTRACT_BSDTAR_ARCHIVES} #{i}"
1108
+ # ===================================================================== #
1109
+ # === sxz
1110
+ # ===================================================================== #
1111
+ when '.sxz'
1112
+ esystem "unsquashfs #{i}"
1113
+ # ===================================================================== #
1114
+ # === pdf
1115
+ #
1116
+ # For pdf-files we will tap into the pdf_paradise project, if it
1117
+ # is available.
1118
+ # ===================================================================== #
1119
+ when /\.?pdf$/
1120
+ begin
1121
+ require 'pdf_paradise/utility_scripts/convert_pdf_to_text.rb'
1122
+ _ = PdfParadise::ConvertPdfToText.new(i)
1123
+ e _.output_file?
1124
+ rescue LoadError => error
1125
+ e 'No, not there.'
1126
+ pp error # Show the error to the user here.
1127
+ end
1128
+ return # Must return early in this case.
1129
+ else # else tag. We did not find the extension type.
1130
+ if File.exist? i
1131
+ notify_the_user_that_this_extension_has_not_been_registered_yet(i)
1132
+ else
1133
+ opne "#{rev}No file exists at `#{sfile(i)}#{rev}`."
1134
+ end
1135
+ end
1136
+ end; alias do_extract_to extract_this_archive # === do_extract_to
1137
+ alias do_extract_what_to extract_this_archive # === do_extract_what_to
1138
+ alias start extract_this_archive # === start
985
1139
 
986
1140
  # ========================================================================= #
987
1141
  # === run (run tag, def tag)
988
1142
  # ========================================================================= #
989
1143
  def run
990
1144
  menu
1145
+ _ = commandline_arguments?
1146
+ _.flatten.select {|entry|
1147
+ File.file?(entry) or File.directory?(entry)
1148
+ }
1149
+ set_work_on_these_files(_)
991
1150
  work_on_the_given_input
992
1151
  end
993
1152
 
@@ -1013,13 +1172,16 @@ class Extracter < ::Extracter::Base # === Extracter::Extracter
1013
1172
  # ========================================================================= #
1014
1173
  # === Extracter::Extracter[]
1015
1174
  # ========================================================================= #
1016
- def self.[](i = ARGV, extract_where_to = Dir.pwd)
1175
+ def self.[](
1176
+ i = ARGV,
1177
+ extract_where_to = Extracter.return_pwd
1178
+ )
1017
1179
  new(i, extract_where_to)
1018
1180
  end
1019
1181
 
1020
1182
  end
1021
1183
 
1022
- # ========================================================================= #
1184
+ # ============================================================================ #
1023
1185
  # === Extracter.extract_what_to
1024
1186
  #
1025
1187
  # Useage example goes like this:
@@ -1027,7 +1189,7 @@ end
1027
1189
  # Extracter.extract_what_to('foo-1.0.tar.xz', '/tmp')
1028
1190
  # Extracter.extract_what_to('/Depot/jjjj/tesseract-5.1.0.tar.xz', Dir.pwd+'/')
1029
1191
  #
1030
- # ========================================================================= #
1192
+ # ============================================================================ #
1031
1193
  def self.extract_what_to(
1032
1194
  what = ARGV,
1033
1195
  extract_to = :default, # ← This can also be a Hash. It denotes where we want to extract to.
@@ -1041,16 +1203,17 @@ def self.extract_what_to(
1041
1203
  &block
1042
1204
  )
1043
1205
  return _ # We must return the class, as other projects may depend on this.
1044
- end; self.instance_eval { alias extract_this extract_what_to } # === Extracter.extract_this
1045
- self.instance_eval { alias extract extract_what_to } # === Extracter.extract
1046
- self.instance_eval { alias what_to extract_what_to } # === Extracter.what_to
1047
- self.instance_eval { alias new extract_what_to } # === Extracter.new
1048
- self.instance_eval { alias [] extract_what_to } # === Extracter[]
1206
+ end; self.instance_eval { alias extract_this extract_what_to } # === Extracter.extract_this
1207
+ self.instance_eval { alias extract extract_what_to } # === Extracter.extract
1208
+ self.instance_eval { alias what_to extract_what_to } # === Extracter.what_to
1209
+ self.instance_eval { alias new extract_what_to } # === Extracter.new
1210
+ self.instance_eval { alias extract_what_to_on_windows extract_what_to } # === Extracter.extract_what_to_on_windows
1211
+ self.instance_eval { alias extract_it extract_what_to } # === Extracter.extract_it
1212
+ self.instance_eval { alias [] extract_what_to } # === Extracter[]
1049
1213
 
1050
1214
  end
1051
1215
 
1052
1216
  if __FILE__ == $PROGRAM_NAME
1053
- _ = Extracter::Extracter.new(ARGV) { :do_not_run_yet }
1054
1217
  if ARGV.size > 2
1055
1218
  _ = Extracter::Extracter.new(ARGV, :default) { :do_not_run_yet }
1056
1219
  else
@@ -1066,4 +1229,4 @@ end # rubyextracter
1066
1229
  # extracter xfig-3.2.5.tar.bz2
1067
1230
  # extract htop* /Depot/
1068
1231
  # extract recode-3.7.tar.xz /Depot/
1069
- # extract qt-4.8.6.tar.xz --to=/home/Temp
1232
+ # extract qt-4.8.6.tar.xz --to=/home/Temp