backup_paradise 1.3.1
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.
Potentially problematic release.
This version of backup_paradise might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/README.md +408 -0
- data/backup_paradise.gemspec +50 -0
- data/bin/backup_for_ingrid +10 -0
- data/bin/backup_paradise +7 -0
- data/bin/windows_backup_paradise +9 -0
- data/doc/README.gen +368 -0
- data/doc/TODO.md +130 -0
- data/lib/backup_paradise/actions/README.md +2 -0
- data/lib/backup_paradise/actions/backup.rb +62 -0
- data/lib/backup_paradise/base/base.rb +502 -0
- data/lib/backup_paradise/base/colours.rb +137 -0
- data/lib/backup_paradise/base/namespace.rb +16 -0
- data/lib/backup_paradise/base/tab.rb +47 -0
- data/lib/backup_paradise/colours/colours.rb +88 -0
- data/lib/backup_paradise/constants/constants.rb +162 -0
- data/lib/backup_paradise/gui/glimmer/libui/backup_for_ingrid/backup_for_ingrid.rb +87 -0
- data/lib/backup_paradise/gui/gtk2/OLD_backup.rb +220 -0
- data/lib/backup_paradise/gui/gtk3/simple_backup_widget/create.rb +70 -0
- data/lib/backup_paradise/gui/gtk3/simple_backup_widget/misc.rb +33 -0
- data/lib/backup_paradise/gui/gtk3/simple_backup_widget/simple_backup_widget.rb +160 -0
- data/lib/backup_paradise/gui/libui/backup_for_ingrid/backup_for_ingrid.rb +99 -0
- data/lib/backup_paradise/gui/libui/simple_backup_widget/simple_backup_widget.rb +119 -0
- data/lib/backup_paradise/gui/shared_code/simple_backup_widget/simple_backup_widget_module.rb +587 -0
- data/lib/backup_paradise/gui/tk/backup.rb +108 -0
- data/lib/backup_paradise/images/BACKUP_IMAGE.png +0 -0
- data/lib/backup_paradise/images/right_arrow.png +0 -0
- data/lib/backup_paradise/project/project.rb +40 -0
- data/lib/backup_paradise/requires/require_the_backup_paradise_project.rb +18 -0
- data/lib/backup_paradise/requires/require_yaml.rb +7 -0
- data/lib/backup_paradise/tab/tab.rb +87 -0
- data/lib/backup_paradise/toplevel_methods/cliner.rb +16 -0
- data/lib/backup_paradise/toplevel_methods/config.rb +86 -0
- data/lib/backup_paradise/toplevel_methods/create_and_remove.rb +63 -0
- data/lib/backup_paradise/toplevel_methods/e.rb +16 -0
- data/lib/backup_paradise/toplevel_methods/esystem.rb +19 -0
- data/lib/backup_paradise/toplevel_methods/files_and_directories.rb +181 -0
- data/lib/backup_paradise/toplevel_methods/help.rb +93 -0
- data/lib/backup_paradise/toplevel_methods/misc.rb +153 -0
- data/lib/backup_paradise/toplevel_methods/mountpoint.rb +188 -0
- data/lib/backup_paradise/toplevel_methods/opnn.rb +27 -0
- data/lib/backup_paradise/utility_scripts/backup/backup.rb +1901 -0
- data/lib/backup_paradise/version/version.rb +19 -0
- data/lib/backup_paradise/windows/README.md +1 -0
- data/lib/backup_paradise/windows/windows.rb +101 -0
- data/lib/backup_paradise/www/backup.cgi +63 -0
- data/lib/backup_paradise/yaml/config.yml +82 -0
- data/lib/backup_paradise.rb +5 -0
- data/test/testing_toplevel_functionality.rb +11 -0
- metadata +194 -0
@@ -0,0 +1,587 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# Encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
# =========================================================================== #
|
5
|
+
# === BackupParadise::GUI::SimpleBackupWidgetModule
|
6
|
+
# =========================================================================== #
|
7
|
+
# require 'backup_paradise/gui/shared_code/simple_backup_widget/simple_backup_widget_module.rb'
|
8
|
+
# include BackupParadise::GUI::SimpleBackupWidgetModule
|
9
|
+
# =========================================================================== #
|
10
|
+
module BackupParadise
|
11
|
+
|
12
|
+
module GUI
|
13
|
+
|
14
|
+
module SimpleBackupWidgetModule # === BackupParadise::GUI::SimpleBackupWidgetModule
|
15
|
+
|
16
|
+
# ========================================================================= #
|
17
|
+
# Add backup-paradise related .rb files next:
|
18
|
+
# ========================================================================= #
|
19
|
+
require 'backup_paradise/project/project.rb'
|
20
|
+
require 'backup_paradise/utility_scripts/backup/backup.rb'
|
21
|
+
require 'backup_paradise/actions/backup.rb'
|
22
|
+
require 'backup_paradise/windows/windows.rb'
|
23
|
+
|
24
|
+
begin
|
25
|
+
require 'open'
|
26
|
+
rescue LoadError; end
|
27
|
+
|
28
|
+
begin
|
29
|
+
require 'mountpoints'
|
30
|
+
rescue LoadError; end
|
31
|
+
|
32
|
+
# ========================================================================= #
|
33
|
+
# === TITLE
|
34
|
+
# ========================================================================= #
|
35
|
+
TITLE = 'Simple Backup Widget'
|
36
|
+
|
37
|
+
# ========================================================================= #
|
38
|
+
# === WIDTH
|
39
|
+
# ========================================================================= #
|
40
|
+
WIDTH = '50%'
|
41
|
+
|
42
|
+
# ========================================================================= #
|
43
|
+
# === HEIGHT
|
44
|
+
# ========================================================================= #
|
45
|
+
HEIGHT = '40%'
|
46
|
+
|
47
|
+
# ========================================================================= #
|
48
|
+
# === USE_THIS_FONT
|
49
|
+
# ========================================================================= #
|
50
|
+
USE_THIS_FONT = :dejavu_condensed_19
|
51
|
+
|
52
|
+
# ========================================================================= #
|
53
|
+
# === LARGER_FONT
|
54
|
+
# ========================================================================= #
|
55
|
+
LARGER_FONT = :dejavu_condensed_21
|
56
|
+
|
57
|
+
# ========================================================================= #
|
58
|
+
# === reset_shared_module
|
59
|
+
# ========================================================================= #
|
60
|
+
def reset_shared_module
|
61
|
+
# ======================================================================= #
|
62
|
+
# === @title
|
63
|
+
# ======================================================================= #
|
64
|
+
title_width_height(TITLE, WIDTH, HEIGHT)
|
65
|
+
# ======================================================================= #
|
66
|
+
# === @file_chooser_dialog
|
67
|
+
# ======================================================================= #
|
68
|
+
@file_chooser_dialog = nil
|
69
|
+
# ======================================================================= #
|
70
|
+
# === @dataset_from_the_config_file
|
71
|
+
# ======================================================================= #
|
72
|
+
@dataset_from_the_config_file = nil
|
73
|
+
if File.exist? BackupParadise.file_config?
|
74
|
+
@dataset_from_the_config_file = YAML.load_file(BackupParadise.file_config?)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# ========================================================================= #
|
79
|
+
# === padding?
|
80
|
+
# ========================================================================= #
|
81
|
+
def padding?
|
82
|
+
0
|
83
|
+
end
|
84
|
+
|
85
|
+
# ========================================================================= #
|
86
|
+
# === border_size?
|
87
|
+
# ========================================================================= #
|
88
|
+
def border_size?
|
89
|
+
0
|
90
|
+
end
|
91
|
+
|
92
|
+
# ========================================================================= #
|
93
|
+
# === return_backup_complete_message
|
94
|
+
# ========================================================================= #
|
95
|
+
def return_backup_complete_message
|
96
|
+
'Backup complete! Time finish at: '+time_now?
|
97
|
+
end
|
98
|
+
|
99
|
+
# ========================================================================= #
|
100
|
+
# === copy_this_file
|
101
|
+
# ========================================================================= #
|
102
|
+
def copy_this_file(from, b)
|
103
|
+
::BackupParadise.copy_this_file(from, b)
|
104
|
+
end
|
105
|
+
|
106
|
+
# ========================================================================= #
|
107
|
+
# === larger_font?
|
108
|
+
# ========================================================================= #
|
109
|
+
def larger_font?
|
110
|
+
LARGER_FONT
|
111
|
+
end
|
112
|
+
|
113
|
+
# ========================================================================= #
|
114
|
+
# === do_transfer_a_single_file
|
115
|
+
# ========================================================================= #
|
116
|
+
def do_transfer_a_single_file(
|
117
|
+
_ = entry_left?.text?.strip,
|
118
|
+
target = onto?
|
119
|
+
)
|
120
|
+
target = target.dup if target.frozen?
|
121
|
+
target << File.basename(_)
|
122
|
+
|
123
|
+
if _.empty?
|
124
|
+
e 'Please supply a file to transfer.'
|
125
|
+
else
|
126
|
+
e "Now trying to copy #{_} to #{target}."
|
127
|
+
Thread.new {
|
128
|
+
copy_this_file(_, target)
|
129
|
+
pop_up_this_text_over_that_widget(return_backup_complete_message, @button_backup)
|
130
|
+
}
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# ========================================================================= #
|
135
|
+
# === main_target?
|
136
|
+
#
|
137
|
+
# This method will "return" our main target.
|
138
|
+
# ========================================================================= #
|
139
|
+
def main_target?
|
140
|
+
@backup_to_this_target.text?
|
141
|
+
end
|
142
|
+
|
143
|
+
# ========================================================================= #
|
144
|
+
# === do_backup_my_songs
|
145
|
+
# ========================================================================= #
|
146
|
+
def do_backup_my_songs(
|
147
|
+
to =
|
148
|
+
("#{onto?}#{File.basename(entry_left?.text?)}/").squeeze('/')
|
149
|
+
)
|
150
|
+
to.squeeze!('/')
|
151
|
+
Thread.new {
|
152
|
+
BackupParadise.simple_backup(
|
153
|
+
entry_left?.text?, to
|
154
|
+
)
|
155
|
+
pop_up_this_text_over_that_widget(
|
156
|
+
return_backup_complete_message,
|
157
|
+
@button_backup_audio
|
158
|
+
)
|
159
|
+
}
|
160
|
+
end
|
161
|
+
|
162
|
+
# ========================================================================= #
|
163
|
+
# === time_now?
|
164
|
+
# ========================================================================= #
|
165
|
+
def time_now?
|
166
|
+
return ::Time.now.strftime('%d.%m.%Y, %H:%M:%S')
|
167
|
+
end
|
168
|
+
|
169
|
+
# ========================================================================= #
|
170
|
+
# === entry1?
|
171
|
+
# ========================================================================= #
|
172
|
+
def entry1?
|
173
|
+
@entry1_for_the_backup_from_value
|
174
|
+
end; alias entry_left? entry1? # === entry_left?
|
175
|
+
|
176
|
+
# ========================================================================= #
|
177
|
+
# === create_the_entries (entries tag)
|
178
|
+
# ========================================================================= #
|
179
|
+
def create_the_entries
|
180
|
+
# ======================================================================= #
|
181
|
+
# === @entry1_for_the_backup_from_value
|
182
|
+
# ======================================================================= #
|
183
|
+
@entry1_for_the_backup_from_value = entry
|
184
|
+
@entry1_for_the_backup_from_value.pad4px
|
185
|
+
@entry1_for_the_backup_from_value.bblack1
|
186
|
+
@entry1_for_the_backup_from_value.very_light_yellow_background
|
187
|
+
# ======================================================================= #
|
188
|
+
# === @entry2_for_the_backup_onto_value
|
189
|
+
# ======================================================================= #
|
190
|
+
@entry2_for_the_backup_onto_value = entry
|
191
|
+
@entry2_for_the_backup_onto_value.pad4px
|
192
|
+
@entry2_for_the_backup_onto_value.bblack1
|
193
|
+
@entry2_for_the_backup_onto_value.very_light_yellow_background
|
194
|
+
@entry2_for_the_backup_onto_value.width_height(250, 50)
|
195
|
+
end
|
196
|
+
|
197
|
+
# ========================================================================= #
|
198
|
+
# === from?
|
199
|
+
#
|
200
|
+
# This method has to keep in mind that Strings such as ":ingrid" are
|
201
|
+
# used. This indicates a symbol which has to be treated in a special
|
202
|
+
# manner.
|
203
|
+
#
|
204
|
+
# Furthermore, only directories will have a '/' appended; files must
|
205
|
+
# not have a '/' appended.
|
206
|
+
# ========================================================================= #
|
207
|
+
def from?(
|
208
|
+
i = @entry1_for_the_backup_from_value.text?
|
209
|
+
)
|
210
|
+
if i.is_a?(String) and i.start_with?(':')
|
211
|
+
case i.delete(':').to_sym
|
212
|
+
# ===================================================================== #
|
213
|
+
# === :ingrid
|
214
|
+
# ===================================================================== #
|
215
|
+
when :ingrid
|
216
|
+
i = 'C/ingrid/'
|
217
|
+
end
|
218
|
+
end
|
219
|
+
if i.is_a?(String) and i.frozen?
|
220
|
+
i = i.dup
|
221
|
+
end
|
222
|
+
i.squeeze!('/')
|
223
|
+
if File.directory?(i) and !i.end_with?('/')
|
224
|
+
i << '/'
|
225
|
+
end
|
226
|
+
return i
|
227
|
+
end
|
228
|
+
|
229
|
+
# ========================================================================= #
|
230
|
+
# === copy_from_to
|
231
|
+
#
|
232
|
+
# This is the method that can be used for backing up the data.
|
233
|
+
# ========================================================================= #
|
234
|
+
def copy_from_to(
|
235
|
+
from = from?,
|
236
|
+
to = onto?
|
237
|
+
)
|
238
|
+
unless File.directory? from
|
239
|
+
e "#{sfile(from)} should be a directory."
|
240
|
+
end
|
241
|
+
if from == 'C/ingrid/'
|
242
|
+
# ====================================================================== #
|
243
|
+
# The first entry is a special case, applying to only one particular
|
244
|
+
# situation on Windows. It is retained here on an ad-hoc basis,
|
245
|
+
# but it may be better to move this into another location.
|
246
|
+
# ====================================================================== #
|
247
|
+
BackupParadise::Windows.backup_ingrid_directory
|
248
|
+
elsif File.file?(from)
|
249
|
+
# ====================================================================== #
|
250
|
+
# Backup files here.
|
251
|
+
# ====================================================================== #
|
252
|
+
do_transfer_a_single_file
|
253
|
+
else
|
254
|
+
# ====================================================================== #
|
255
|
+
# Backup directories here.
|
256
|
+
# ====================================================================== #
|
257
|
+
if from.is_a?(String) and from.start_with?(':')
|
258
|
+
case from.delete(':').to_sym
|
259
|
+
# ===================================================================== #
|
260
|
+
# === :everything
|
261
|
+
#
|
262
|
+
# This will default to the registered action stored in the
|
263
|
+
# config.yml file.
|
264
|
+
# ===================================================================== #
|
265
|
+
when :everything
|
266
|
+
if @dataset_from_the_config_file
|
267
|
+
i = @dataset_from_the_config_file['backup_these_directories']
|
268
|
+
BackupParadise::Actions.backup {{
|
269
|
+
backup_these_directories: i,
|
270
|
+
where_to: to
|
271
|
+
}}
|
272
|
+
else
|
273
|
+
e 'No file called config.yml was found. Defaulting to the'
|
274
|
+
e 'current working directory thus.'
|
275
|
+
i = File.absolute_path("#{Dir.pwd}/")
|
276
|
+
end
|
277
|
+
end
|
278
|
+
else
|
279
|
+
begin
|
280
|
+
Thread.new {
|
281
|
+
@spinner.is_active # go_and_spin_now
|
282
|
+
FileUtils.cp_r(from, to)
|
283
|
+
pop_up_this_text_over_that_widget(
|
284
|
+
return_backup_complete_message, @button_backup
|
285
|
+
)
|
286
|
+
@spinner.stop_spinning
|
287
|
+
}
|
288
|
+
rescue Exception => error
|
289
|
+
pp error
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
# ========================================================================= #
|
296
|
+
# === backup_audio_button?
|
297
|
+
# ========================================================================= #
|
298
|
+
def backup_audio_button?
|
299
|
+
@button_backup_audio
|
300
|
+
end
|
301
|
+
|
302
|
+
# ========================================================================= #
|
303
|
+
# === backup_ingrid_button?
|
304
|
+
# ========================================================================= #
|
305
|
+
def backup_ingrid_button?
|
306
|
+
@button_ingrid
|
307
|
+
end
|
308
|
+
|
309
|
+
# ========================================================================= #
|
310
|
+
# === backup_button?
|
311
|
+
# ========================================================================= #
|
312
|
+
def backup_button?
|
313
|
+
@button_backup
|
314
|
+
end
|
315
|
+
|
316
|
+
# ========================================================================= #
|
317
|
+
# === create_the_file_chooser_button
|
318
|
+
# ========================================================================= #
|
319
|
+
def create_the_file_chooser_button
|
320
|
+
# ======================================================================= #
|
321
|
+
# === @button_choose_file
|
322
|
+
# ======================================================================= #
|
323
|
+
@button_choose_file = button('Choose file')
|
324
|
+
@button_choose_file.on_clicked {
|
325
|
+
create_file_chooser_dialog_widget
|
326
|
+
run_file_chooser_dialog
|
327
|
+
}
|
328
|
+
end
|
329
|
+
|
330
|
+
# ========================================================================= #
|
331
|
+
# === choose_file_button?
|
332
|
+
# ========================================================================= #
|
333
|
+
def choose_file_button?
|
334
|
+
@button_choose_file
|
335
|
+
end
|
336
|
+
|
337
|
+
# ========================================================================= #
|
338
|
+
# === create_the_label_showing_results
|
339
|
+
# ========================================================================= #
|
340
|
+
def create_the_label_showing_results
|
341
|
+
@label_showing_results = label
|
342
|
+
end
|
343
|
+
|
344
|
+
# ========================================================================= #
|
345
|
+
# === create_the_buttons (buttons tag, button tag)
|
346
|
+
# ========================================================================= #
|
347
|
+
def create_the_buttons
|
348
|
+
create_the_file_chooser_button
|
349
|
+
create_the_backup_button
|
350
|
+
create_the_backup_audio_button
|
351
|
+
create_the_ingrid_button if is_on_roebe?
|
352
|
+
end
|
353
|
+
|
354
|
+
# ========================================================================= #
|
355
|
+
# === onto
|
356
|
+
# ========================================================================= #
|
357
|
+
def onto?
|
358
|
+
return "#{@entry2_for_the_backup_onto_value.text?}/".squeeze('/')
|
359
|
+
end; alias to? onto? # === to?
|
360
|
+
|
361
|
+
# ========================================================================= #
|
362
|
+
# === create_the_grid (grid tag)
|
363
|
+
# ========================================================================= #
|
364
|
+
def create_the_grid
|
365
|
+
# ======================================================================= #
|
366
|
+
# === @grid
|
367
|
+
# ======================================================================= #
|
368
|
+
@grid = default_grid
|
369
|
+
@grid.pad10px
|
370
|
+
@grid.css_class('dotted_steelblue_border')
|
371
|
+
@grid.set_size_request(100, 50)
|
372
|
+
@grid.row_spacing = 5
|
373
|
+
@grid.line_spacing = 5
|
374
|
+
label_backup_from = text('Backup from:')
|
375
|
+
label_backup_from.make_bold
|
376
|
+
label_backup_from.hint = 'Input which directory '\
|
377
|
+
'you wish to back up. Use the combo-box entry '\
|
378
|
+
'below this widget, or the entry below '\
|
379
|
+
'that combo-box.'
|
380
|
+
@grid.left(label_backup_from)
|
381
|
+
|
382
|
+
label_backup_onto = text('Backup onto:')
|
383
|
+
label_backup_onto.make_bold
|
384
|
+
label_backup_onto.hint = 'Input the target device onto which we will '\
|
385
|
+
'copy the data onto.'
|
386
|
+
@grid.right(label_backup_onto)
|
387
|
+
|
388
|
+
# ======================================================================= #
|
389
|
+
# Next we will add the two main combo-boxes.
|
390
|
+
# ======================================================================= #
|
391
|
+
@grid.left(@combo_box_backup_from)
|
392
|
+
@grid.right(@combo_box_backup_onto)
|
393
|
+
@grid.left(@entry1_for_the_backup_from_value)
|
394
|
+
@grid.right(@entry2_for_the_backup_onto_value)
|
395
|
+
end
|
396
|
+
|
397
|
+
# ========================================================================= #
|
398
|
+
# === create_the_combo_boxes (combo tag)
|
399
|
+
# ========================================================================= #
|
400
|
+
def create_the_combo_boxes
|
401
|
+
# ======================================================================= #
|
402
|
+
# === @combo_box_backup_from
|
403
|
+
#
|
404
|
+
# This is the combo-box that keeps the core entries, such as
|
405
|
+
# "/home/x/songs" and so forth.
|
406
|
+
# ======================================================================= #
|
407
|
+
@combo_box_backup_from = combo_box
|
408
|
+
@combo_box_backup_from.bblack1
|
409
|
+
@combo_box_backup_from.set_border_width(2)
|
410
|
+
# ======================================================================= #
|
411
|
+
# Next we will populate the combo-box with proper entries:
|
412
|
+
# ======================================================================= #
|
413
|
+
_ = BackupParadise.backup_these_directories?.map {|entry| "#{entry}/".squeeze('/') }
|
414
|
+
_.prepend(':everything')
|
415
|
+
_.prepend(':ingrid') if is_on_roebe?
|
416
|
+
@combo_box_backup_from.populate(_)
|
417
|
+
@combo_box_backup_from.the_first_entry_is_active
|
418
|
+
@combo_box_backup_from.hint =
|
419
|
+
':everything means to backup the default action, as-is. If you '\
|
420
|
+
'need a more fine-tuned level of control then simply backup only '\
|
421
|
+
'some directories, or use the entry to the right side of this '\
|
422
|
+
'combo box to backup only individual directories or files.'
|
423
|
+
# ======================================================================= #
|
424
|
+
# === @combo_box_backup_onto
|
425
|
+
# ======================================================================= #
|
426
|
+
@combo_box_backup_onto = combo_box
|
427
|
+
@combo_box_backup_onto.bblack1
|
428
|
+
@combo_box_backup_onto.set_border_width(2)
|
429
|
+
scan_for_mountpoints_then_update_the_appropriate_combo_box
|
430
|
+
end
|
431
|
+
|
432
|
+
# ========================================================================= #
|
433
|
+
# === sync_the_combo_box_values_onto_the_entries_below
|
434
|
+
# ========================================================================= #
|
435
|
+
def sync_the_combo_box_values_onto_the_entries_below
|
436
|
+
_ = @combo_box_backup_from.text?.to_s
|
437
|
+
entry1?.set_text(_)
|
438
|
+
sync_the_second_entry
|
439
|
+
end
|
440
|
+
|
441
|
+
# ========================================================================= #
|
442
|
+
# === sync_the_second_entry
|
443
|
+
# ========================================================================= #
|
444
|
+
def sync_the_second_entry
|
445
|
+
entry2?.set_text(
|
446
|
+
@combo_box_backup_onto.text?.to_s
|
447
|
+
)
|
448
|
+
end
|
449
|
+
|
450
|
+
# ========================================================================= #
|
451
|
+
# === entry2?
|
452
|
+
# ========================================================================= #
|
453
|
+
def entry2?
|
454
|
+
@entry2_for_the_backup_onto_value
|
455
|
+
end
|
456
|
+
|
457
|
+
# ========================================================================= #
|
458
|
+
# === do_handle_the_proper_syncing_when_the_combo_box_entries_are_changed
|
459
|
+
# ========================================================================= #
|
460
|
+
def do_handle_the_proper_syncing_when_the_combo_box_entries_are_changed
|
461
|
+
# ======================================================================= #
|
462
|
+
# Sync any change made in the combo box onto the associated entry.
|
463
|
+
# ======================================================================= #
|
464
|
+
sync_connect(@combo_box_backup_from, entry1?)
|
465
|
+
sync_connect(@combo_box_backup_onto, entry2?)
|
466
|
+
end
|
467
|
+
|
468
|
+
# ========================================================================= #
|
469
|
+
# === create_the_ingrid_button
|
470
|
+
# ========================================================================= #
|
471
|
+
def create_the_ingrid_button
|
472
|
+
# ======================================================================= #
|
473
|
+
# === @button_ingrid
|
474
|
+
# ======================================================================= #
|
475
|
+
@button_ingrid = button('Backup ingrid')
|
476
|
+
@button_ingrid.clear_background
|
477
|
+
@button_ingrid.pad8px
|
478
|
+
@button_ingrid.css_class('the_backup_button_for_ingrid')
|
479
|
+
@button_ingrid.set_size_request(16, 25)
|
480
|
+
@button_ingrid.on_clicked {
|
481
|
+
do_backup_for_ingrid
|
482
|
+
}
|
483
|
+
@button_ingrid.set_border_width(2)
|
484
|
+
@button_ingrid.hint = 'This will backup c:\ingrid to '\
|
485
|
+
'the appropriate external USB device.'
|
486
|
+
end
|
487
|
+
|
488
|
+
# ========================================================================= #
|
489
|
+
# === scan_for_mountpoints_then_update_the_appropriate_combo_box
|
490
|
+
# ========================================================================= #
|
491
|
+
def scan_for_mountpoints_then_update_the_appropriate_combo_box
|
492
|
+
if Object.const_defined? :Mountpoints
|
493
|
+
@combo_box_backup_onto.clear_old_datapoints
|
494
|
+
@combo_box_backup_onto.populate(Mountpoints[])
|
495
|
+
@combo_box_backup_onto.the_first_entry_is_active
|
496
|
+
sync_the_second_entry
|
497
|
+
end
|
498
|
+
end
|
499
|
+
|
500
|
+
# ========================================================================= #
|
501
|
+
# === create_the_backup_audio_button
|
502
|
+
# ========================================================================= #
|
503
|
+
def create_the_backup_audio_button
|
504
|
+
# ======================================================================= #
|
505
|
+
# === @button_backup_audio
|
506
|
+
# ======================================================================= #
|
507
|
+
@button_backup_audio = button('Backup Audio')
|
508
|
+
@button_backup_audio.hint = 'This button is ad-hoc code to quickly '\
|
509
|
+
'copy all local songs on my home layout. You can modify this '\
|
510
|
+
'by modifying the config.yml file and changing the entry called '\
|
511
|
+
'<b>local_audio_directory</b>.'
|
512
|
+
@button_backup_audio.on_clicked {
|
513
|
+
# ===================================================================== #
|
514
|
+
# First, if the config-dataset exists, sync the combo-box entry.
|
515
|
+
# ===================================================================== #
|
516
|
+
if @dataset_from_the_config_file
|
517
|
+
local_audio_directory = @dataset_from_the_config_file['local_audio_directory'].to_s
|
518
|
+
entry_left?.set_text(
|
519
|
+
local_audio_directory
|
520
|
+
)
|
521
|
+
end
|
522
|
+
do_backup_my_songs
|
523
|
+
}
|
524
|
+
end
|
525
|
+
|
526
|
+
# ========================================================================= #
|
527
|
+
# === create_the_backup_button
|
528
|
+
# ========================================================================= #
|
529
|
+
def create_the_backup_button
|
530
|
+
# ======================================================================= #
|
531
|
+
# === @button_backup
|
532
|
+
# ======================================================================= #
|
533
|
+
@button_backup = button('Backup the data')
|
534
|
+
@button_backup.clear_background
|
535
|
+
@button_backup.pad8px
|
536
|
+
@button_backup.css_class('the_backup_button')
|
537
|
+
@button_backup.set_size_request(16, 25)
|
538
|
+
@button_backup.on_clicked {
|
539
|
+
do_backup_the_data
|
540
|
+
}
|
541
|
+
@button_backup.set_border_width(2)
|
542
|
+
@button_backup.hint =
|
543
|
+
"Click this button to <b>backup your data</b>. This works for both "\
|
544
|
+
"directories, as well as individual files and special instructions. "\
|
545
|
+
"Special instructions are indicated via a leading : character on "\
|
546
|
+
"the top-left hand side.\n\n"\
|
547
|
+
"Make sure that the USB device(s) are properly connected before "\
|
548
|
+
"clicking any button, though."
|
549
|
+
end
|
550
|
+
|
551
|
+
# ========================================================================= #
|
552
|
+
# === do_backup_the_data
|
553
|
+
# ========================================================================= #
|
554
|
+
def do_backup_the_data(
|
555
|
+
from = from?,
|
556
|
+
to = to?
|
557
|
+
)
|
558
|
+
@label_showing_results.set_text(
|
559
|
+
'Command that will be run: '+"\n\n"+
|
560
|
+
' <b>cp -rv '+from+' '+to+"</b>\n"
|
561
|
+
)
|
562
|
+
@label_showing_results.do_markify
|
563
|
+
Thread.new {
|
564
|
+
e 'Backing up the data next, from `'+
|
565
|
+
sfile(from)+'` to `'+sfile(to)+'`.'
|
566
|
+
copy_from_to(from, to)
|
567
|
+
}
|
568
|
+
end
|
569
|
+
|
570
|
+
# ========================================================================= #
|
571
|
+
# === backup_ingrid_directory
|
572
|
+
#
|
573
|
+
# This is a method for a custom-backup. Other users won't need to use
|
574
|
+
# this method.
|
575
|
+
# ========================================================================= #
|
576
|
+
def backup_ingrid_directory
|
577
|
+
BackupParadise::Windows.backup_ingrid_directory
|
578
|
+
end; alias do_backup_for_ingrid backup_ingrid_directory # === do_backup_for_ingrid
|
579
|
+
|
580
|
+
# ========================================================================= #
|
581
|
+
# === run (run tag)
|
582
|
+
# ========================================================================= #
|
583
|
+
def run
|
584
|
+
create_skeleton_then_connect_skeleton
|
585
|
+
end
|
586
|
+
|
587
|
+
end; end; end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# Encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
# =========================================================================== #
|
5
|
+
# This file shall provide simple bindings for backup-related activity
|
6
|
+
# on windows. On windows paths such as "E:/songs" will work.
|
7
|
+
# =========================================================================== #
|
8
|
+
# require 'backup_paradise/gui/tk/backup.rb'
|
9
|
+
# =========================================================================== #
|
10
|
+
require 'backup_paradise'
|
11
|
+
|
12
|
+
@object_backup = BackupParadise::Backup.new { :do_not_run_yet }
|
13
|
+
|
14
|
+
require 'tk_paradise/tk_paradise.rb'
|
15
|
+
include Tk
|
16
|
+
|
17
|
+
alias e puts
|
18
|
+
require 'colours'
|
19
|
+
|
20
|
+
# =========================================================================== #
|
21
|
+
# === TITLE
|
22
|
+
# =========================================================================== #
|
23
|
+
TITLE = 'Backup data'
|
24
|
+
|
25
|
+
# =========================================================================== #
|
26
|
+
# === rev
|
27
|
+
# =========================================================================== #
|
28
|
+
def rev
|
29
|
+
::Colours.rev
|
30
|
+
end
|
31
|
+
|
32
|
+
# =========================================================================== #
|
33
|
+
# === do_start_to_backup
|
34
|
+
# =========================================================================== #
|
35
|
+
def do_start_to_backup(i = :usb1)
|
36
|
+
if i and i.is_a? String
|
37
|
+
i = i.dup
|
38
|
+
if i.include? 'onto '
|
39
|
+
i.sub!(/onto /) # 'onto F:'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
unless i.end_with? '/'
|
43
|
+
i << '/'
|
44
|
+
end
|
45
|
+
e rev+'Starting to backup data.'
|
46
|
+
@object_backup = BackupParadise::Backup.new { :do_not_run_yet }
|
47
|
+
#pp @object_backup.mountpoint?
|
48
|
+
# @object_backup.set_mountpoint(i)
|
49
|
+
#pp @object_backup.mountpoint?
|
50
|
+
end
|
51
|
+
|
52
|
+
# =========================================================================== #
|
53
|
+
# === Fonts
|
54
|
+
# =========================================================================== #
|
55
|
+
USE_THIS_FONT_FAMILY = 'DejaVu Sans'
|
56
|
+
larger_font = Font.new(family: USE_THIS_FONT_FAMILY, size: 28, weight: 'bold')
|
57
|
+
font = Font.new(family: USE_THIS_FONT_FAMILY, size: 20, weight: 'bold')
|
58
|
+
|
59
|
+
root = Tk.root {{ geometry: '820x450+0+0', title: TITLE }}
|
60
|
+
|
61
|
+
button_start_to_backup_onto_drive_letter_e = Button.new(
|
62
|
+
root,
|
63
|
+
text: 'Start to backup onto label E:',
|
64
|
+
bg: '#0052cc',
|
65
|
+
fg: '#ffffff'
|
66
|
+
) {
|
67
|
+
command proc {
|
68
|
+
do_start_to_backup('onto E:')
|
69
|
+
}
|
70
|
+
}.grid(row: 1, column: 3, columnspan: 3, padx: 2, pady: 2)
|
71
|
+
|
72
|
+
button_start_to_backup_onto_drive_letter_e.set_font(larger_font)
|
73
|
+
Grid.grid(button_start_to_backup_onto_drive_letter_e, columnspan: 2)
|
74
|
+
|
75
|
+
button_start_to_backup_onto_drive_letter_f = Button.new(
|
76
|
+
root,
|
77
|
+
text: 'Start to backup onto label F:',
|
78
|
+
bg: '#0052cc',
|
79
|
+
fg: '#ffffff'
|
80
|
+
) {
|
81
|
+
command proc {
|
82
|
+
do_start_to_backup('onto F:')
|
83
|
+
}
|
84
|
+
}.grid(row: 2, column: 3, columnspan: 3, padx: 2, pady: 2)
|
85
|
+
|
86
|
+
button_start_to_backup_onto_drive_letter_f.set_font(larger_font)
|
87
|
+
Grid.grid(button_start_to_backup_onto_drive_letter_f, columnspan: 2)
|
88
|
+
|
89
|
+
button_ad_hoc = Button.new(
|
90
|
+
root,
|
91
|
+
text: 'Auto-backup (easy debug mode for now onto E:)',
|
92
|
+
bg: '#0052cc',
|
93
|
+
fg: '#ffffff'
|
94
|
+
) {
|
95
|
+
command proc {
|
96
|
+
@object_backup = BackupParadise::Backup.new { :do_not_run_yet }
|
97
|
+
@object_backup.set_mountpoint('E:/')
|
98
|
+
@object_backup.do_backup
|
99
|
+
}
|
100
|
+
}.grid(row: 3, column: 3, columnspan: 3, padx: 2, pady: 2)
|
101
|
+
|
102
|
+
button_ad_hoc.set_font(larger_font)
|
103
|
+
Grid.grid(button_ad_hoc, columnspan: 2)
|
104
|
+
|
105
|
+
|
106
|
+
Tk.run
|
107
|
+
|
108
|
+
#TkLabel.new(root) { text 'Attention!'; font TkCaptionFont }
|
Binary file
|
Binary file
|