72
75
count = len(model.selected_uris)
73
76
count_text = constructor.number_as_text(count)
74
77
files_text = constructor.get_plural('file', 'files', count)
75
# label = 'Copy %s %s to <span font_family="monospace">%s</span>...' % (count_text, files_text, model.current_directory)
76
label = 'Copy %s %s to %s...' % (count_text, files_text, model.current_directory)
78
message = f'Copy {count_text} {files_text} to {model.current_directory}...'
78
80
# Create a file details list of files to be copied.
79
81
file_details_list = create_file_details_list(model.selected_uris)
81
displayer.update_label('preseed_copy_page__progress_label', label)
83
displayer.update_label('preseed_copy_page__progress_message', message)
82
84
displayer.update_progress_bar_text('preseed_copy_page__copy_files_progress_bar', None)
83
85
displayer.update_progress_bar_percent('preseed_copy_page__copy_files_progress_bar', 0)
86
displayer.update_status('preseed_copy_page__progress', displayer.BULLET)
84
87
displayer.update_list_store('preseed_copy_page__file_details__list_store', file_details_list)
91
elif action == 'error':
93
# Handle the error from the leave() function.
90
logger.log_value('Error', BOLD_RED + 'Unknown action for setup' + NORMAL)
99
logger.log_value('Error', f'{BOLD_RED}Unknown action for setup{NORMAL}')
189
211
global total_files
190
212
total_files = len(uris)
192
# It is necessary to strip the leading '/' from the current directory,
193
# otherwise os.path.join() considers the current directory to be an absolute
194
# path and discards the custom disk directory prefix: "If a component
195
# is an absolute path, all previous components are thrown away and
196
# os.path.joining continues from the absolute path component."
214
# It is necessary to strip the leading '/' from the current
215
# directory, otherwise os.path.join() considers the current
216
# directory to be an absolute path and discards the custom root
217
# directory prefix: "If a component is an absolute path, all
218
# previous components are thrown away and os.path.joining continues
219
# from the absolute path component."
197
220
# (See https://docs.python.org/3/library/os.path.html).
198
221
target_directory = os.path.abspath(os.path.join(model.project.custom_disk_directory, current_directory.strip(os.path.sep)))
201
224
logger.log_value('The custom disk directory is', model.project.custom_disk_directory)
202
225
logger.log_value('The target directory is', target_directory)
227
displayer.update_status('preseed_copy_page__progress', displayer.PROCESSING)
204
229
global file_number
205
for file_number, uri in enumerate(uris):
207
file_path = urllib.parse.unquote(urllib.parse.urlparse(uri).path)
210
# label = 'Copying one file to <span font_family="monospace">%s</span>' % current_directory
211
label = 'Copying one file to %s...' % current_directory
213
# label = 'Copying file %s of %s to <span font_family="monospace">%s</span>' % (file_number + 1, total_files, current_directory)
214
label = 'Copying file %s of %s to %s...' % (file_number + 1, total_files, current_directory)
216
displayer.update_label('preseed_copy_page__progress_label', label)
217
displayer.scroll_to_tree_view_row('preseed_copy_page__tree_view', file_number)
218
displayer.select_tree_view_row('preseed_copy_page__tree_view', file_number)
220
copy_file(file_path, file_number, target_directory, total_files)
232
for file_number, uri in enumerate(uris):
233
file_path = urllib.parse.unquote(urllib.parse.urlparse(uri).path)
235
message = f'Copying one file to {current_directory}...'
237
message = f'Copying file {(file_number+1):n} of {total_files:n} to {current_directory}...'
238
displayer.update_label('preseed_copy_page__progress_message', message)
239
displayer.scroll_to_tree_view_row('preseed_copy_page__tree_view', file_number)
240
displayer.select_tree_view_row('preseed_copy_page__tree_view', file_number)
241
copy_file(file_path, file_number, target_directory, total_files)
242
except InterruptException as exception:
243
displayer.update_status('preseed_copy_page__progress', displayer.ERROR)
244
file_name = os.path.basename(file_path)
245
if 'No space left on device' in str(exception):
246
message = f'<span foreground="red">Error. Unable to copy files to {current_directory}. Not enough space on the disk.</span>'
248
message = f'<span foreground="red">Error. Unable to copy files to {current_directory}.</span>'
249
displayer.update_label('preseed_copy_page__progress_message', message)
250
logger.log_value('Propagate exception', exception)
252
except Exception as exception:
253
displayer.update_status('preseed_copy_page__progress', displayer.ERROR)
254
file_name = os.path.basename(file_path)
255
if 'No space left on device' in str(exception):
256
message = f'<span foreground="red">Error. Unable to copy files to {current_directory}. Not enough space on the disk.</span>'
258
message = f'<span foreground="red">Error. Unable to copy files to {current_directory}.</span>'
259
displayer.update_label('preseed_copy_page__progress_message', message)
260
logger.log_value('Do not propagate exception', exception)
261
return True # (Error)
263
displayer.update_status('preseed_copy_page__progress', displayer.OK)
264
number_text = constructor.number_as_text(total_files)
265
plural_text = constructor.get_plural('file', 'files', total_files)
266
message = f'Copied {number_text} {plural_text} to {current_directory}.'
267
displayer.update_label('preseed_copy_page__progress_message', message)
268
return False # (No error)
223
271
def copy_file(file_path, file_number, directory, total_files):
225
logger.log_label('Copy file number %s of %s' % (file_number + 1, total_files))
273
logger.log_label(f'Copy file number {file_number+1} of {total_files}')
227
275
logger.log_value('The file is', file_path)
228
276
logger.log_value('The target directory is', directory)
230
278
program = os.path.join(model.application.directory, 'commands', 'copy-path')
231
command = 'pkexec "%s" "%s" "%s"' % (program, file_path, directory)
279
command = f'pkexec "{program}" "{file_path}" "{directory}"'
233
281
# The progress callback function.
234
282
def progress_callback(percent):
238
286
displayer.update_progress_bar_percent('preseed_copy_page__copy_files_progress_bar', total_percent)
239
287
displayer.update_list_store_progress_bar_percent('preseed_copy_page__file_details__list_store', file_number, percent)
240
288
if total_percent % 10 == 0:
241
logger.log_value('Completed', '%i%%' % total_percent)
243
exception, message = show_progress(command, progress_callback)
246
########################################################################
247
# Validation Functions
248
########################################################################
289
logger.log_value('Completed', f'{total_percent:n}%')
291
message = show_progress(command, progress_callback)