repackage 1.0.30 → 1.1.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +118 -0
- data/bin/{repackager → repackage} +0 -0
- data/doc/README.gen +75 -0
- data/lib/repackage/class/constants.rb +93 -0
- data/lib/repackage/class/misc.rb +934 -0
- data/lib/repackage/class/repackage.rb +44 -723
- data/lib/repackage/colours/colours.rb +102 -0
- data/lib/repackage/requires/require_the_sinatra_interface.rb +1 -1
- data/lib/repackage/version/version.rb +3 -3
- data/lib/repackage/www/embeddable_interface.rb +5 -4
- data/lib/repackage.rb +1 -1
- data/repackage.gemspec +15 -24
- metadata +19 -53
@@ -0,0 +1,934 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# Encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
# =========================================================================== #
|
5
|
+
# require 'repackage/class/misc.rb'
|
6
|
+
# =========================================================================== #
|
7
|
+
module Repackage
|
8
|
+
|
9
|
+
class Repackage # === Repackage::Repackage
|
10
|
+
|
11
|
+
# ========================================================================= #
|
12
|
+
# === return_pwd
|
13
|
+
# ========================================================================= #
|
14
|
+
def return_pwd
|
15
|
+
"#{Dir.pwd}/".squeeze('/')
|
16
|
+
end
|
17
|
+
|
18
|
+
# ========================================================================= #
|
19
|
+
# === register_sigint
|
20
|
+
# ========================================================================= #
|
21
|
+
def register_sigint
|
22
|
+
Signal.trap('SIGINT') { exit }
|
23
|
+
end
|
24
|
+
|
25
|
+
# ========================================================================= #
|
26
|
+
# === remove
|
27
|
+
#
|
28
|
+
# Remove a file or a directory with this method.
|
29
|
+
# ========================================================================= #
|
30
|
+
def remove(i)
|
31
|
+
if File.directory?(i)
|
32
|
+
FileUtils.rm_rf(i) unless i.strip == '/' # A tiny safeguard.
|
33
|
+
elsif File.file?(i)
|
34
|
+
delete_file(i)
|
35
|
+
end
|
36
|
+
end; alias delete remove # === delete
|
37
|
+
|
38
|
+
# ========================================================================= #
|
39
|
+
# === delete_file
|
40
|
+
# ========================================================================= #
|
41
|
+
def delete_file(i)
|
42
|
+
File.delete(i)
|
43
|
+
end
|
44
|
+
|
45
|
+
# ========================================================================= #
|
46
|
+
# === rds
|
47
|
+
# ========================================================================= #
|
48
|
+
def rds(i)
|
49
|
+
i.squeeze '/'
|
50
|
+
end
|
51
|
+
|
52
|
+
# ========================================================================= #
|
53
|
+
# === cliner
|
54
|
+
# ========================================================================= #
|
55
|
+
def cliner
|
56
|
+
e rev+('=' * 80)
|
57
|
+
end
|
58
|
+
|
59
|
+
# ========================================================================= #
|
60
|
+
# === try_glob
|
61
|
+
#
|
62
|
+
# Try a glob with this method.
|
63
|
+
# ========================================================================= #
|
64
|
+
def try_glob(i)
|
65
|
+
return Dir[i+'*']
|
66
|
+
end
|
67
|
+
|
68
|
+
# ========================================================================= #
|
69
|
+
# === initialize
|
70
|
+
#
|
71
|
+
# The first argument given to this class should be the name, or the path,
|
72
|
+
# to a locally existing file, such as "foobar-1.0.tar.gz".
|
73
|
+
# ========================================================================= #
|
74
|
+
def initialize(
|
75
|
+
commandline_arguments = nil,
|
76
|
+
run_already = true
|
77
|
+
)
|
78
|
+
register_sigint
|
79
|
+
reset
|
80
|
+
set_commandline_arguments(
|
81
|
+
commandline_arguments
|
82
|
+
)
|
83
|
+
# ======================================================================= #
|
84
|
+
# === Handle given blocks next
|
85
|
+
# ======================================================================= #
|
86
|
+
if block_given?
|
87
|
+
yielded = yield
|
88
|
+
case yielded
|
89
|
+
# ===================================================================== #
|
90
|
+
# === :do_not_delete_the_old_source
|
91
|
+
# ===================================================================== #
|
92
|
+
when :do_not_delete_the_old_source
|
93
|
+
set_shall_we_delete_old_source(false)
|
94
|
+
# ===================================================================== #
|
95
|
+
# === :run_already
|
96
|
+
# ===================================================================== #
|
97
|
+
when :run_already
|
98
|
+
run_already = true
|
99
|
+
else
|
100
|
+
if yielded.is_a? Hash
|
101
|
+
# ================================================================= #
|
102
|
+
# === :run
|
103
|
+
# ================================================================= #
|
104
|
+
if yielded.has_key? :run
|
105
|
+
run_already = yielded[:run]
|
106
|
+
end
|
107
|
+
# ================================================================= #
|
108
|
+
# === :delete_code_of_conduct
|
109
|
+
# ================================================================= #
|
110
|
+
if yielded.has_key? :delete_code_of_conduct
|
111
|
+
set_delete_code_of_conduct(
|
112
|
+
yielded[:delete_code_of_conduct]
|
113
|
+
)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
run if run_already
|
119
|
+
end
|
120
|
+
|
121
|
+
# ========================================================================= #
|
122
|
+
# === reset (reset tag)
|
123
|
+
# ========================================================================= #
|
124
|
+
def reset
|
125
|
+
# ======================================================================= #
|
126
|
+
# === @namespace
|
127
|
+
# ======================================================================= #
|
128
|
+
@namespace = NAMESPACE
|
129
|
+
# ======================================================================= #
|
130
|
+
# === @internal_hash
|
131
|
+
# ======================================================================= #
|
132
|
+
@internal_hash = {}
|
133
|
+
# ======================================================================= #
|
134
|
+
# === :delete_code_of_conduct_file_if_it_exists
|
135
|
+
# ======================================================================= #
|
136
|
+
@internal_hash[:delete_code_of_conduct_file_if_it_exists] = DELETE_CODE_OF_CONDUCT_FILE_IF_IT_EXISTS
|
137
|
+
# ======================================================================= #
|
138
|
+
# === :file_size
|
139
|
+
# ======================================================================= #
|
140
|
+
@internal_hash[:file_size] = 0
|
141
|
+
set_extract_to_this_directory(:default)
|
142
|
+
set_start_dir
|
143
|
+
# ======================================================================= #
|
144
|
+
# === :repackage_into_this_format
|
145
|
+
#
|
146
|
+
# .tar.xz is the default target format.
|
147
|
+
# ======================================================================= #
|
148
|
+
set_repackage_to_this_format(:to_the_default_format)
|
149
|
+
# ======================================================================= #
|
150
|
+
# === :the_new_file_is_at
|
151
|
+
#
|
152
|
+
# This entry will keep track at which new location the file can be
|
153
|
+
# found.
|
154
|
+
# ======================================================================= #
|
155
|
+
@internal_hash[:the_new_file_is_at] = nil
|
156
|
+
set_shall_we_delete_the_old_archive(:default)
|
157
|
+
end
|
158
|
+
|
159
|
+
# ========================================================================= #
|
160
|
+
# === set_shall_we_delete_the_old_archive
|
161
|
+
# ========================================================================= #
|
162
|
+
def set_shall_we_delete_the_old_archive(
|
163
|
+
i = :default
|
164
|
+
)
|
165
|
+
case i
|
166
|
+
# ======================================================================= #
|
167
|
+
# === :default
|
168
|
+
# ======================================================================= #
|
169
|
+
when :default,
|
170
|
+
nil
|
171
|
+
i = SHALL_WE_DELETE_THE_OLD_ARCHIVE
|
172
|
+
if is_on_roebe?
|
173
|
+
i = true
|
174
|
+
end
|
175
|
+
end
|
176
|
+
@internal_hash[:shall_we_delete_the_old_archive] = i
|
177
|
+
end; alias set_shall_we_delete_old_source set_shall_we_delete_the_old_archive # === set_shall_we_delete_old_source
|
178
|
+
|
179
|
+
# ========================================================================= #
|
180
|
+
# === do_delete_code_of_conduct_file
|
181
|
+
# ========================================================================= #
|
182
|
+
def do_delete_code_of_conduct_file
|
183
|
+
@internal_hash[:delete_code_of_conduct_file_if_it_exists] = true
|
184
|
+
end
|
185
|
+
|
186
|
+
# ========================================================================= #
|
187
|
+
# === set_delete_code_of_conduct
|
188
|
+
# ========================================================================= #
|
189
|
+
def set_delete_code_of_conduct(i)
|
190
|
+
@internal_hash[:delete_code_of_conduct_file_if_it_exists] = i
|
191
|
+
end
|
192
|
+
|
193
|
+
# ========================================================================= #
|
194
|
+
# === repackage_into_which_format?
|
195
|
+
# ========================================================================= #
|
196
|
+
def repackage_into_which_format?
|
197
|
+
@internal_hash[:repackage_into_this_format]
|
198
|
+
end; alias repackage_to_which_format? repackage_into_which_format? # === repackage_to_which_format?
|
199
|
+
alias format? repackage_into_which_format? # === format?
|
200
|
+
alias target_format? repackage_into_which_format? # === target_format?
|
201
|
+
alias target_format_type? repackage_into_which_format? # === target_format_type?
|
202
|
+
|
203
|
+
# ========================================================================= #
|
204
|
+
# === set_commandline_arguments
|
205
|
+
# ========================================================================= #
|
206
|
+
def set_commandline_arguments(i = '')
|
207
|
+
i = [i].flatten.compact
|
208
|
+
@commandline_arguments = i
|
209
|
+
end
|
210
|
+
|
211
|
+
# ========================================================================= #
|
212
|
+
# === commandline_arguments?
|
213
|
+
# ========================================================================= #
|
214
|
+
def commandline_arguments?
|
215
|
+
@commandline_arguments
|
216
|
+
end
|
217
|
+
|
218
|
+
# ========================================================================= #
|
219
|
+
# === first_argument?
|
220
|
+
# ========================================================================= #
|
221
|
+
def first_argument?
|
222
|
+
@commandline_arguments.first
|
223
|
+
end; alias first? first_argument? # === first?
|
224
|
+
|
225
|
+
# ========================================================================= #
|
226
|
+
# === internal_hash?
|
227
|
+
# ========================================================================= #
|
228
|
+
def internal_hash?
|
229
|
+
@internal_hash
|
230
|
+
end; alias hash? internal_hash? # === hash?
|
231
|
+
|
232
|
+
# ========================================================================= #
|
233
|
+
# === is_on_roebe?
|
234
|
+
# ========================================================================= #
|
235
|
+
def is_on_roebe?
|
236
|
+
ENV['IS_ROEBE'].to_s == '1'
|
237
|
+
end
|
238
|
+
|
239
|
+
# ========================================================================= #
|
240
|
+
# === set_work_on_these_files
|
241
|
+
# ========================================================================= #
|
242
|
+
def set_work_on_these_files(
|
243
|
+
i = @commandline_arguments
|
244
|
+
)
|
245
|
+
i = [i].flatten.compact
|
246
|
+
i.reject! {|entry| entry.start_with?('--') }
|
247
|
+
@work_on_these_files = i
|
248
|
+
end
|
249
|
+
|
250
|
+
# ========================================================================= #
|
251
|
+
# === cd (cd tag)
|
252
|
+
# ========================================================================= #
|
253
|
+
def cd(
|
254
|
+
where_to = extract_to?
|
255
|
+
)
|
256
|
+
case where_to
|
257
|
+
# ======================================================================= #
|
258
|
+
# === :to_the_start_dir
|
259
|
+
# ======================================================================= #
|
260
|
+
when :to_the_start_dir,
|
261
|
+
:start_dir
|
262
|
+
where_to = start_dir?
|
263
|
+
# ======================================================================= #
|
264
|
+
# === :to_the_original_dir
|
265
|
+
# ======================================================================= #
|
266
|
+
when :to_the_original_dir
|
267
|
+
where_to = the_original_dir?
|
268
|
+
end
|
269
|
+
Dir.chdir(where_to) if File.directory?(where_to)
|
270
|
+
end; alias chdir cd # === chdir
|
271
|
+
alias change_dir cd # === change_dir
|
272
|
+
alias change_dir_to cd # === change_dir_to
|
273
|
+
|
274
|
+
# ========================================================================= #
|
275
|
+
# === consider_creating_the_working_directory
|
276
|
+
# ========================================================================= #
|
277
|
+
def consider_creating_the_working_directory(
|
278
|
+
i = working_directory?
|
279
|
+
)
|
280
|
+
unless File.directory? i
|
281
|
+
FileUtils.mkdir_p(i)
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
# ========================================================================= #
|
286
|
+
# === copy_this_file_to_the_working_directory
|
287
|
+
# ========================================================================= #
|
288
|
+
def copy_this_file_to_the_working_directory(
|
289
|
+
this_file
|
290
|
+
)
|
291
|
+
target = "#{working_directory?}#{File.basename(this_file)}"
|
292
|
+
File.delete(target) if File.exist?(target)
|
293
|
+
FileUtils.cp(
|
294
|
+
this_file, target
|
295
|
+
)
|
296
|
+
end
|
297
|
+
|
298
|
+
# ========================================================================= #
|
299
|
+
# === rev
|
300
|
+
# ========================================================================= #
|
301
|
+
def rev
|
302
|
+
::Repackage.rev
|
303
|
+
end
|
304
|
+
|
305
|
+
# ========================================================================= #
|
306
|
+
# === extract_to_this_directory?
|
307
|
+
# ========================================================================= #
|
308
|
+
def extract_to_this_directory?
|
309
|
+
@internal_hash[:extract_to_this_directory]
|
310
|
+
end; alias working_directory? extract_to_this_directory? # === working_directory?
|
311
|
+
|
312
|
+
# ========================================================================= #
|
313
|
+
# === simp
|
314
|
+
# ========================================================================= #
|
315
|
+
def simp(i)
|
316
|
+
::Repackage.simp(i)
|
317
|
+
end
|
318
|
+
|
319
|
+
# ========================================================================= #
|
320
|
+
# === sdir
|
321
|
+
# ========================================================================= #
|
322
|
+
def sdir(i)
|
323
|
+
::Repackage.sdir(i)
|
324
|
+
end
|
325
|
+
|
326
|
+
# ========================================================================= #
|
327
|
+
# === sfile
|
328
|
+
# ========================================================================= #
|
329
|
+
def sfile(i)
|
330
|
+
::Repackage.sfile(i)
|
331
|
+
end
|
332
|
+
|
333
|
+
# ========================================================================= #
|
334
|
+
# === swarn
|
335
|
+
# ========================================================================= #
|
336
|
+
def swarn(i)
|
337
|
+
::Repackage.swarn(i)
|
338
|
+
end
|
339
|
+
|
340
|
+
# ========================================================================= #
|
341
|
+
# === consider_loading_the_colours_gem
|
342
|
+
# ========================================================================= #
|
343
|
+
def consider_loading_the_colours_gem
|
344
|
+
::Repackage.consider_requiring_the_colours_gem
|
345
|
+
end
|
346
|
+
|
347
|
+
# ========================================================================= #
|
348
|
+
# === esystem
|
349
|
+
# ========================================================================= #
|
350
|
+
def esystem(i)
|
351
|
+
e i
|
352
|
+
system i
|
353
|
+
end
|
354
|
+
|
355
|
+
# ========================================================================= #
|
356
|
+
# === repackage_which_file?
|
357
|
+
# ========================================================================= #
|
358
|
+
def repackage_which_file?
|
359
|
+
@internal_hash[:repackage_this_file]
|
360
|
+
end; alias filename? repackage_which_file? # === filename?
|
361
|
+
|
362
|
+
# ========================================================================= #
|
363
|
+
# === remove_old_extracted_directory_should_it_exist
|
364
|
+
#
|
365
|
+
# This method will remove any extracted archive that exits
|
366
|
+
# at the target location. This will avoid "unclean"
|
367
|
+
# directories.
|
368
|
+
# ========================================================================= #
|
369
|
+
def remove_old_extracted_directory_should_it_exist(
|
370
|
+
i = rds("#{extract_to?}/#{remove_extension(filename?)}")
|
371
|
+
)
|
372
|
+
if File.directory?(i) # We remove a possibly-existing, extracted directory first.
|
373
|
+
e 'Removing the existing directory '\
|
374
|
+
'at `'+sdir(i)+'` next.'
|
375
|
+
remove(i)
|
376
|
+
end
|
377
|
+
end; alias remove_extracted_data remove_old_extracted_directory_should_it_exist # === remove_extracted_data
|
378
|
+
|
379
|
+
# ========================================================================= #
|
380
|
+
# === set_extract_to
|
381
|
+
#
|
382
|
+
# Set the @extract_to variable here.
|
383
|
+
# ========================================================================= #
|
384
|
+
def set_extract_to(
|
385
|
+
i = DEFAULT_EXTRACT_TO_THIS_DIRECTORY # Must be the initial constant as default.
|
386
|
+
)
|
387
|
+
case i
|
388
|
+
# ======================================================================= #
|
389
|
+
# === :default
|
390
|
+
# ======================================================================= #
|
391
|
+
when :default,
|
392
|
+
nil
|
393
|
+
i = DEFAULT_EXTRACT_TO_THIS_DIRECTORY
|
394
|
+
end
|
395
|
+
i = i.to_s.dup
|
396
|
+
# ======================================================================= #
|
397
|
+
# The next clause is an override, in particular for my home system.
|
398
|
+
# ======================================================================= #
|
399
|
+
if File.directory? '/home/Temp/'
|
400
|
+
i = '/home/Temp/repackage/'
|
401
|
+
end
|
402
|
+
i = '/tmp/' if i.empty? # Hardcoded rescue-step in this case.
|
403
|
+
i << '/' unless i.end_with? '/' # A directory has a trailing /.
|
404
|
+
@internal_hash[:extract_to_this_directory] = i
|
405
|
+
end; alias set_extract_to_this_directory set_extract_to # === set_extract_to_this_directory
|
406
|
+
|
407
|
+
# ========================================================================= #
|
408
|
+
# === extract_to?
|
409
|
+
#
|
410
|
+
# Defaults to /home/Temp/ on my home system.
|
411
|
+
# ========================================================================= #
|
412
|
+
def extract_to?
|
413
|
+
@internal_hash[:extract_to_this_directory]
|
414
|
+
end; alias extract_to extract_to? # === extract_to
|
415
|
+
alias extract_to_this_directory? extract_to? # === extract_to_this_directory?
|
416
|
+
alias extracted_to? extract_to? # === extracted_to?
|
417
|
+
|
418
|
+
# ========================================================================= #
|
419
|
+
# === orange
|
420
|
+
# ========================================================================= #
|
421
|
+
def orange(i)
|
422
|
+
::Repackage.orange(i)
|
423
|
+
end
|
424
|
+
|
425
|
+
# ========================================================================= #
|
426
|
+
# === shall_we_delete_the_old_archive?
|
427
|
+
# ========================================================================= #
|
428
|
+
def shall_we_delete_the_old_archive?
|
429
|
+
@internal_hash[:shall_we_delete_the_old_archive]
|
430
|
+
end
|
431
|
+
|
432
|
+
# ========================================================================= #
|
433
|
+
# === consider_copying_the_new_archive_into_the_current_working_directory
|
434
|
+
# ========================================================================= #
|
435
|
+
def consider_copying_the_new_archive_into_the_current_working_directory
|
436
|
+
_ = away_with_the_archive_type(
|
437
|
+
extracted_to?+ # This part is like "/home/Temp/repackage/".
|
438
|
+
repackage_which_file?
|
439
|
+
)+
|
440
|
+
repackage_to_which_format?
|
441
|
+
if File.exist?(_)
|
442
|
+
cd(:to_the_original_dir)
|
443
|
+
new_target = return_pwd+File.basename(_)
|
444
|
+
opn; e 'Now copying '+sfile(_)+' to the current directory.'
|
445
|
+
opn; e 'It will then reside at '+sfile(new_target)+'.'
|
446
|
+
copy_file(_, new_target)
|
447
|
+
if File.exist? new_target
|
448
|
+
opn; e 'Done! The file can be found '\
|
449
|
+
'at '+sfile(new_target)+' now.'
|
450
|
+
set_the_final_location_is_at(File.absolute_path(new_target))
|
451
|
+
if shall_we_delete_the_old_archive?
|
452
|
+
remove_the_old_archive
|
453
|
+
end
|
454
|
+
else
|
455
|
+
opn; e 'No file at '+sfile(new_target)+' exists, '\
|
456
|
+
'thus we can not move anything.'
|
457
|
+
end
|
458
|
+
end
|
459
|
+
end
|
460
|
+
|
461
|
+
# ========================================================================= #
|
462
|
+
# === start_dir?
|
463
|
+
# ========================================================================= #
|
464
|
+
def start_dir?
|
465
|
+
@internal_hash[:start_dir]
|
466
|
+
end
|
467
|
+
|
468
|
+
# ========================================================================= #
|
469
|
+
# === set_start_dir
|
470
|
+
# ========================================================================= #
|
471
|
+
def set_start_dir(
|
472
|
+
i = return_pwd
|
473
|
+
)
|
474
|
+
@internal_hash[:start_dir] = i
|
475
|
+
end
|
476
|
+
|
477
|
+
# ========================================================================= #
|
478
|
+
# === copy_file
|
479
|
+
# ========================================================================= #
|
480
|
+
def copy_file(this_file, to_that_location)
|
481
|
+
FileUtils.cp(this_file, to_that_location)
|
482
|
+
end
|
483
|
+
|
484
|
+
# ========================================================================= #
|
485
|
+
# === create_archive_from_this_directory (create tag)
|
486
|
+
# ========================================================================= #
|
487
|
+
def create_archive_from_this_directory(
|
488
|
+
this_directory,
|
489
|
+
repackage_to_this_format = repackage_to_which_format?
|
490
|
+
)
|
491
|
+
esystem "#{COMMAND_TO_CREATE_A_TAR_XZ_ARCHIVE} #{this_directory}#{repackage_to_this_format} #{File.basename(this_directory)}"
|
492
|
+
end; alias package_this_directory create_archive_from_this_directory # === package_this_directory
|
493
|
+
|
494
|
+
# ========================================================================= #
|
495
|
+
# === set_repackage_to_this_format
|
496
|
+
#
|
497
|
+
# We will repackage to this format here.
|
498
|
+
# ========================================================================= #
|
499
|
+
def set_repackage_to_this_format(
|
500
|
+
i = :default_format
|
501
|
+
)
|
502
|
+
i = i.downcase if i and i.is_a?(String) # Only want it downcased.
|
503
|
+
case i # case tag
|
504
|
+
# ======================================================================= #
|
505
|
+
# === nil
|
506
|
+
# ======================================================================= #
|
507
|
+
when nil, # Assume a default here.
|
508
|
+
:default,
|
509
|
+
:default_format,
|
510
|
+
:to_the_default_format
|
511
|
+
i = DEFAULT_TARGET_FORMAT_TYPE
|
512
|
+
# ======================================================================= #
|
513
|
+
# === .tar.xz
|
514
|
+
# ======================================================================= #
|
515
|
+
when 'xz',
|
516
|
+
'tar.xz'
|
517
|
+
i = '.tar.xz'
|
518
|
+
# ======================================================================= #
|
519
|
+
# === .tar.bz2
|
520
|
+
# ======================================================================= #
|
521
|
+
when 'bz2',
|
522
|
+
'.tar.bz2'
|
523
|
+
i = '.tar.bz2'
|
524
|
+
# ======================================================================= #
|
525
|
+
# === .tar.gz
|
526
|
+
# ======================================================================= #
|
527
|
+
when 'targz',
|
528
|
+
'gz',
|
529
|
+
'tar.gz'
|
530
|
+
i = '.tar.gz'
|
531
|
+
else # else tag
|
532
|
+
# warn 'Did not find registered format type.'
|
533
|
+
end
|
534
|
+
@internal_hash[:repackage_to_this_format] = i
|
535
|
+
end; alias set_target_format_type set_repackage_to_this_format # === set_target_format_type
|
536
|
+
alias format= set_repackage_to_this_format # === format=
|
537
|
+
|
538
|
+
# ========================================================================= #
|
539
|
+
# === is_it_already_in_the_correct_archive_format?
|
540
|
+
# ========================================================================= #
|
541
|
+
def is_it_already_in_the_correct_archive_format?(this_file)
|
542
|
+
this_file.include? target_format?
|
543
|
+
end
|
544
|
+
|
545
|
+
# ========================================================================= #
|
546
|
+
# === repackage_to_this_format?
|
547
|
+
# ========================================================================= #
|
548
|
+
def repackage_to_this_format?
|
549
|
+
@internal_hash[:repackage_to_this_format]
|
550
|
+
end; alias repackage_to_which_format? repackage_to_this_format? # === repackage_to_which_format?
|
551
|
+
alias target_format? repackage_to_this_format? # === target_format?
|
552
|
+
alias target_format_type? repackage_to_this_format? # === target_format_type?
|
553
|
+
|
554
|
+
# ========================================================================= #
|
555
|
+
# === determine_file_size
|
556
|
+
# ========================================================================= #
|
557
|
+
def determine_file_size(
|
558
|
+
i = repackage_which_file?
|
559
|
+
)
|
560
|
+
if i and File.exist?(i)
|
561
|
+
@internal_hash[:file_size] = File.stat(i).size? # Obtain some information.
|
562
|
+
end
|
563
|
+
end
|
564
|
+
|
565
|
+
# ========================================================================= #
|
566
|
+
# === set_repackage_this_file
|
567
|
+
# ========================================================================= #
|
568
|
+
def set_repackage_this_file(this_file)
|
569
|
+
this_file = this_file.first if this_file.is_a? Array
|
570
|
+
case this_file
|
571
|
+
# ======================================================================= #
|
572
|
+
# === :default
|
573
|
+
# ======================================================================= #
|
574
|
+
when :default,
|
575
|
+
nil
|
576
|
+
# ===================================================================== #
|
577
|
+
# Since as of May 2013 we try to fetch a random file from a list.
|
578
|
+
# ===================================================================== #
|
579
|
+
_ = Dir['*'].reject {|entry| File.directory? entry}
|
580
|
+
this_file = _.first if _.size == 1 # if we only have one entry, continue here.
|
581
|
+
# ======================================================================= #
|
582
|
+
# === --last
|
583
|
+
# ======================================================================= #
|
584
|
+
when /^-?-?last(-|_)?downloaded$/i,
|
585
|
+
/^-?-?last$/i,
|
586
|
+
'-l'
|
587
|
+
this_file = File.readlines(LAST_DOWNLOADED_FILE).first
|
588
|
+
# ===================================================================== #
|
589
|
+
# The format of the file has changed a bit. We have to check
|
590
|
+
# whether it includes a '#' character. If so then we discard
|
591
|
+
# all that comes after said '#' token.
|
592
|
+
# ===================================================================== #
|
593
|
+
if this_file.include? '#'
|
594
|
+
this_file = this_file[0 .. (this_file.index('#')-1)].strip
|
595
|
+
end
|
596
|
+
end
|
597
|
+
this_file = this_file.to_s.dup # Keep a copy.
|
598
|
+
if File.directory?(this_file) and !this_file.end_with?('/')
|
599
|
+
this_file << '/'
|
600
|
+
end
|
601
|
+
if this_file.nil? or this_file.empty?
|
602
|
+
raise 'Please provide a valid archive to repackage.'
|
603
|
+
end
|
604
|
+
@internal_hash[:repackage_this_file] = this_file
|
605
|
+
if this_file and File.exist?(this_file)
|
606
|
+
# ===================================================================== #
|
607
|
+
# === :original_directory_where_the_archive_was_kept
|
608
|
+
#
|
609
|
+
# This entry point will always refer to the directory where the
|
610
|
+
# archive was originally situated in.
|
611
|
+
# ===================================================================== #
|
612
|
+
@internal_hash[:original_directory_where_the_archive_was_kept] = rds(
|
613
|
+
File.absolute_path(
|
614
|
+
File.dirname(this_file)
|
615
|
+
)+'/'
|
616
|
+
)
|
617
|
+
end
|
618
|
+
end; alias set_package set_repackage_this_file # === set_package
|
619
|
+
|
620
|
+
# ========================================================================= #
|
621
|
+
# === opn
|
622
|
+
# ========================================================================= #
|
623
|
+
def opn
|
624
|
+
if Object.const_defined? :Opn
|
625
|
+
Opn.opn(namespace: NAMESPACE)
|
626
|
+
else
|
627
|
+
# else do nothing.
|
628
|
+
end
|
629
|
+
end
|
630
|
+
|
631
|
+
# ========================================================================= #
|
632
|
+
# === the_final_location_is_at?
|
633
|
+
# ========================================================================= #
|
634
|
+
def the_final_location_is_at?
|
635
|
+
@internal_hash[:the_new_file_is_at]
|
636
|
+
end; alias the_new_file_is_at? the_final_location_is_at? # === the_new_file_is_at?
|
637
|
+
alias the_file_is_where? the_final_location_is_at? # === the_file_is_where?
|
638
|
+
|
639
|
+
# ========================================================================= #
|
640
|
+
# === set_the_new_file_is_at
|
641
|
+
# ========================================================================= #
|
642
|
+
def set_the_new_file_is_at(i = nil)
|
643
|
+
@internal_hash[:the_new_file_is_at] = i
|
644
|
+
end; alias set_final_location set_the_new_file_is_at # === set_final_location
|
645
|
+
alias set_the_final_location_is_at set_the_new_file_is_at # === set_the_final_location_is_at
|
646
|
+
|
647
|
+
# ========================================================================= #
|
648
|
+
# === dir_where_the_archive_resides?
|
649
|
+
# ========================================================================= #
|
650
|
+
def dir_where_the_archive_resides?
|
651
|
+
@internal_hash[:original_directory_where_the_archive_was_kept]
|
652
|
+
end; alias the_original_dir? dir_where_the_archive_resides? # === the_original_dir?
|
653
|
+
|
654
|
+
# ========================================================================= #
|
655
|
+
# === menu
|
656
|
+
# ========================================================================= #
|
657
|
+
def menu(
|
658
|
+
i = commandline_arguments?
|
659
|
+
)
|
660
|
+
if i.is_a? Array
|
661
|
+
i.select {|inner_entry|
|
662
|
+
inner_entry.start_with?('--')
|
663
|
+
}.each {|entry| menu(entry) }
|
664
|
+
else
|
665
|
+
case i
|
666
|
+
# ===================================================================== #
|
667
|
+
# Let the user determine the format type here.
|
668
|
+
# ===================================================================== #
|
669
|
+
when /-?-?format(-|_)?type=(.+)$/i
|
670
|
+
set_target_format_type(
|
671
|
+
$2.to_s.dup
|
672
|
+
)
|
673
|
+
end
|
674
|
+
end
|
675
|
+
end
|
676
|
+
|
677
|
+
# ========================================================================= #
|
678
|
+
# === warn_about_missing_file_then_exit
|
679
|
+
# ========================================================================= #
|
680
|
+
def warn_about_missing_file_then_exit(
|
681
|
+
i = target_file?
|
682
|
+
)
|
683
|
+
opn;e swarn('The file `')+sfile(i)+
|
684
|
+
swarn('` does not exist. Must provide a valid path here.')
|
685
|
+
raise "The argument given must be the path to an existing "\
|
686
|
+
"(local) file.\nAs the path given does not appear "\
|
687
|
+
"to exist, this class can not continue."
|
688
|
+
end
|
689
|
+
|
690
|
+
# ========================================================================= #
|
691
|
+
# === run_the_proper_to_archive_command
|
692
|
+
#
|
693
|
+
# The argument to this method should be a String representing a
|
694
|
+
# directory.
|
695
|
+
# ========================================================================= #
|
696
|
+
def run_the_proper_to_archive_command(
|
697
|
+
on_this_directory
|
698
|
+
)
|
699
|
+
on_this_directory = on_this_directory.dup if on_this_directory.frozen?
|
700
|
+
target_format = repackage_to_which_format?
|
701
|
+
case target_format # case tag
|
702
|
+
# ======================================================================= #
|
703
|
+
# === .tar.xz
|
704
|
+
# ======================================================================= #
|
705
|
+
when /\.tar\.xz/i
|
706
|
+
esystem "#{COMMAND_TO_CREATE_A_TAR_XZ_ARCHIVE} "\
|
707
|
+
"#{on_this_directory}#{repackage_to_which_format?} "\
|
708
|
+
"#{File.basename(on_this_directory)}"
|
709
|
+
# ======================================================================= #
|
710
|
+
# === .tar.gz
|
711
|
+
# ======================================================================= #
|
712
|
+
when /\.tar\.gz/i
|
713
|
+
esystem "#{COMMAND_TO_CREATE_A_TAR_GZ_ARCHIVE} "\
|
714
|
+
"#{on_this_directory}#{repackage_to_which_format?} "\
|
715
|
+
"#{File.basename(on_this_directory)}"
|
716
|
+
# ======================================================================= #
|
717
|
+
# === .tar.bz2
|
718
|
+
# ======================================================================= #
|
719
|
+
when /\.tar\.bz2/i
|
720
|
+
esystem "#{COMMAND_TO_CREATE_A_TAR_BZ2_ARCHIVE} "\
|
721
|
+
"#{on_this_directory}#{repackage_to_which_format?} "\
|
722
|
+
"#{File.basename(on_this_directory)}"
|
723
|
+
# ======================================================================= #
|
724
|
+
# === .zip
|
725
|
+
# ======================================================================= #
|
726
|
+
when /\.zip/i
|
727
|
+
esystem "#{COMMAND_TO_CREATE_A_ZIP_ARCHIVE} "\
|
728
|
+
"#{on_this_directory}#{repackage_to_which_format?} "\
|
729
|
+
"#{File.basename(on_this_directory)}"
|
730
|
+
else
|
731
|
+
e 'Unknown target format: '+format.to_s
|
732
|
+
end
|
733
|
+
end
|
734
|
+
|
735
|
+
# ========================================================================= #
|
736
|
+
# === remove_the_old_archive
|
737
|
+
#
|
738
|
+
# Only call this when we are sure to remove the old source. I recommend
|
739
|
+
# to delete the old source. Of course we must make sure to delete the
|
740
|
+
# right package.
|
741
|
+
# ========================================================================= #
|
742
|
+
def remove_the_old_archive(
|
743
|
+
i = dir_where_the_archive_resides?+filename?
|
744
|
+
)
|
745
|
+
opn; e "Removing the old archive at #{sfile(i)}"
|
746
|
+
opn; e "next, as requested via the "\
|
747
|
+
"#{::Repackage.steelblue('SHALL_WE_DELETE_THE_OLD_ARCHIVE')} "\
|
748
|
+
"constant."
|
749
|
+
remove(i)
|
750
|
+
end
|
751
|
+
|
752
|
+
# ========================================================================= #
|
753
|
+
# === extract (extract tag)
|
754
|
+
#
|
755
|
+
# Extract it here. Before we do so, though, we must check if the target
|
756
|
+
# does not exist yet.
|
757
|
+
# ========================================================================= #
|
758
|
+
def extract(
|
759
|
+
what = filename?,
|
760
|
+
extract_to = extract_to?
|
761
|
+
)
|
762
|
+
what = what.dup if what.frozen?
|
763
|
+
unless what.include? '/'
|
764
|
+
what = dir_where_the_archive_resides?+File.basename(what)
|
765
|
+
end
|
766
|
+
remove_extracted_data
|
767
|
+
Extracter.extract_what_to(what, extract_to)
|
768
|
+
end
|
769
|
+
|
770
|
+
# ========================================================================= #
|
771
|
+
# === do_repackage_the_assigned_files
|
772
|
+
# ========================================================================= #
|
773
|
+
def do_repackage_the_assigned_files(
|
774
|
+
i = @work_on_these_files
|
775
|
+
)
|
776
|
+
# ======================================================================= #
|
777
|
+
# The input may look like this:
|
778
|
+
#
|
779
|
+
# ["Python-3.10.7.tar.gz"]
|
780
|
+
#
|
781
|
+
# ======================================================================= #
|
782
|
+
i.flatten.compact.each {|this_file|
|
783
|
+
# ===================================================================== #
|
784
|
+
# Clean up :the_new_file_is_at first:
|
785
|
+
# ===================================================================== #
|
786
|
+
@internal_hash[:the_new_file_is_at] = nil
|
787
|
+
set_the_final_location_is_at(nil) # This is also cleanup.
|
788
|
+
cliner
|
789
|
+
set_repackage_this_file(this_file)
|
790
|
+
determine_file_size if File.exist? this_file
|
791
|
+
if File.exist? this_file
|
792
|
+
# =================================================================== #
|
793
|
+
# === Consider refusing the repackage-action
|
794
|
+
#
|
795
|
+
# Check whether the file is already in the correct target archive
|
796
|
+
# format.
|
797
|
+
# =================================================================== #
|
798
|
+
if is_it_already_in_the_correct_archive_format?(this_file)
|
799
|
+
opn; e rev+'The file at '+sfile(this_file)+' is already in '\
|
800
|
+
'the desired target format ('+target_format?+').'
|
801
|
+
opn; e "Repackaging into the same target format makes no sense, "\
|
802
|
+
"thus aborting now."
|
803
|
+
else
|
804
|
+
opn; e 'We will try to repackage this archive into the `'+
|
805
|
+
simp(target_format_type?)+'`'
|
806
|
+
opn; e 'format type.'
|
807
|
+
opn; e 'It will be extracted into the directory '+
|
808
|
+
sdir(extract_to?)+'.'
|
809
|
+
# ================================================================= #
|
810
|
+
# Here we know that the file exists and that it can be repackaged
|
811
|
+
# into another target format. Thus, we can repackage it. We
|
812
|
+
# will delegate towards a method for this.
|
813
|
+
# ================================================================= #
|
814
|
+
repackage_this_particular_file(this_file)
|
815
|
+
end
|
816
|
+
else
|
817
|
+
# =================================================================== #
|
818
|
+
# Ok - in this case the file does not exist. We will first try
|
819
|
+
# to check if we have a number as input; if so we then we may
|
820
|
+
# try a glob-action. And if not, we will raise an error.
|
821
|
+
#
|
822
|
+
# This can be invoked like so:
|
823
|
+
#
|
824
|
+
# repackagerb 1
|
825
|
+
#
|
826
|
+
# =================================================================== #
|
827
|
+
if this_file and (this_file =~ /^\d$/) # If input is a (positional) number like "3"
|
828
|
+
_ = Dir['*'].select {|entry| File.file?(entry) }.
|
829
|
+
sort[this_file.to_i - 1]
|
830
|
+
do_repackage_these_files([_])
|
831
|
+
else
|
832
|
+
# ================================================================= #
|
833
|
+
# Else we can still try a glob, before giving up.
|
834
|
+
# ================================================================= #
|
835
|
+
_ = try_glob(this_file) if this_file
|
836
|
+
if _.empty?
|
837
|
+
warn_about_missing_file_then_exit
|
838
|
+
else
|
839
|
+
first = _.first
|
840
|
+
if first and File.file?(first)
|
841
|
+
do_repackage_these_files([first])
|
842
|
+
end
|
843
|
+
end
|
844
|
+
end
|
845
|
+
end
|
846
|
+
cliner
|
847
|
+
}
|
848
|
+
end; alias do_repackage_these_files do_repackage_the_assigned_files # === do_repackage_these_files
|
849
|
+
|
850
|
+
# ========================================================================= #
|
851
|
+
# === remove_archive_from
|
852
|
+
#
|
853
|
+
# The proper order does matter in this method.
|
854
|
+
# ========================================================================= #
|
855
|
+
def remove_archive_from(i)
|
856
|
+
i.delete_suffix('.xz').
|
857
|
+
delete_suffix('.gz').
|
858
|
+
delete_suffix('.bz2').
|
859
|
+
delete_suffix('.zip').
|
860
|
+
delete_suffix('.tgz').
|
861
|
+
delete_suffix('.tar')
|
862
|
+
end; alias remove_extension remove_archive_from # === remove_extensions
|
863
|
+
alias remove_file_extension_from remove_archive_from # === remove_file_extension_from
|
864
|
+
alias away_with_the_archive_type remove_archive_from # === away_with_the_archive_type
|
865
|
+
|
866
|
+
# ========================================================================= #
|
867
|
+
# === repackage_this_particular_file
|
868
|
+
# ========================================================================= #
|
869
|
+
def repackage_this_particular_file(this_file)
|
870
|
+
opn; e rev+'The file '+sfile(this_file)+' will be repackaged '\
|
871
|
+
'into the '+orange(repackage_to_which_format?)+' format.'
|
872
|
+
copy_this_file_to_the_working_directory(this_file)
|
873
|
+
working_directory = working_directory?
|
874
|
+
cd(working_directory) # Go to the working directory.
|
875
|
+
set_start_dir(working_directory)
|
876
|
+
opn; e 'Working from the directory `'+sdir(working_directory)+'` next.'
|
877
|
+
absolute_path = File.absolute_path(this_file)
|
878
|
+
opn; e 'The actual file that will be used for the '\
|
879
|
+
'repackaging'
|
880
|
+
opn; e 'step now resides at: '
|
881
|
+
e
|
882
|
+
e " #{sdir(absolute_path)}"
|
883
|
+
e
|
884
|
+
# ======================================================================= #
|
885
|
+
# Ok, now we have to extract it.
|
886
|
+
# ======================================================================= #
|
887
|
+
if File.exist? absolute_path
|
888
|
+
extract(absolute_path)
|
889
|
+
if DELETE_CODE_OF_CONDUCT_FILE_IF_IT_EXISTS
|
890
|
+
target = return_pwd+
|
891
|
+
remove_archive_from(
|
892
|
+
File.basename(repackage_which_file?)
|
893
|
+
)
|
894
|
+
all_files = Dir[target+'/*']
|
895
|
+
if all_files.any? {|file_path| file_path.include?('CODE_OF_CONDUCT') }
|
896
|
+
# In this case we found at the least one code-of-conduct files.
|
897
|
+
# Delete it now.
|
898
|
+
selection = all_files.select {|file_path|
|
899
|
+
file_path.include?('CODE_OF_CONDUCT') and File.file?(file_path)
|
900
|
+
}
|
901
|
+
selection.each {|this_file|
|
902
|
+
opn; e 'Now deleting the file '+sfile(this_file)
|
903
|
+
opn; e 'as requested by the user.'
|
904
|
+
delete_file(this_file)
|
905
|
+
}
|
906
|
+
end
|
907
|
+
end
|
908
|
+
# ===================================================================== #
|
909
|
+
# If all went well then we can now create the new desired target
|
910
|
+
# format. So if that format is '.tar.xz' then we will have to
|
911
|
+
# run the proper command that will create such a tarball for
|
912
|
+
# us next.
|
913
|
+
# ===================================================================== #
|
914
|
+
run_the_proper_to_archive_command(
|
915
|
+
remove_file_extension_from(
|
916
|
+
absolute_path # This here is e. g. "/home/Temp/repackage/htop-3.1.2.tar.gz".
|
917
|
+
)
|
918
|
+
)
|
919
|
+
consider_copying_the_new_archive_into_the_current_working_directory
|
920
|
+
end
|
921
|
+
end
|
922
|
+
|
923
|
+
# ========================================================================= #
|
924
|
+
# === run (run tag)
|
925
|
+
# ========================================================================= #
|
926
|
+
def run
|
927
|
+
menu
|
928
|
+
consider_loading_the_colours_gem
|
929
|
+
consider_creating_the_working_directory
|
930
|
+
set_work_on_these_files(@commandline_arguments)
|
931
|
+
do_repackage_the_assigned_files
|
932
|
+
end
|
933
|
+
|
934
|
+
end; end
|