changes(())

This commit is contained in:
Abhiraj Roy (iconized)
2024-04-25 16:18:31 +05:30
committed by GitHub
parent 4dca72f959
commit 672454b534

View File

@@ -1940,3 +1940,211 @@ def close_in_app_notification(self):
self.notification_revealer.set_reveal_child(False) self.notification_revealer.set_reveal_child(False)
GLib.source_remove(self.timeout_id) GLib.source_remove(self.timeout_id)
self.timeout_id = None self.timeout_id = None
def update_package_import_textview(self, line):
try:
if len(line) > 0:
self.msg_buffer.insert(
self.msg_buffer.get_end_iter(),
" %s" % line,
len(" %s" % line),
)
except Exception as e:
logger.error("[Exception] update_progress_textview(): %s" % e)
finally:
self.pkg_import_queue.task_done()
text_mark_end = self.msg_buffer.create_mark(
"end", self.msg_buffer.get_end_iter(), False
)
# scroll to the end of the textview
self.textview.scroll_mark_onscreen(text_mark_end)
def monitor_package_import(self):
while True:
if self.stop_thread is True:
break
message = self.pkg_import_queue.get()
GLib.idle_add(
update_package_import_textview,
self,
message,
priority=GLib.PRIORITY_DEFAULT,
)
def update_package_status_label(label, text):
label.set_markup(text)
def import_packages(self):
try:
packages_status_list = []
package_failed = False
package_err = {}
count = 0
if os.path.exists(pacman_cache_dir):
query_pacman_clean_cache_str = [
"pacman",
"-Sc",
"--noconfirm",
]
logger.info(
"Cleaning Pacman cache directory = %s" % pacman_cache_dir
)
event = "%s [INFO]: Cleaning pacman cache\n" % datetime.now().strftime(
"%Y-%m-%d-%H-%M-%S"
)
self.pkg_import_queue.put(event)
GLib.idle_add(
update_package_status_label,
self.label_package_status,
"Status: <b>Cleaning pacman cache</b>",
)
process_pacman_cc = subprocess.Popen(
query_pacman_clean_cache_str,
shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
)
out, err = process_pacman_cc.communicate(timeout=process_timeout)
self.pkg_import_queue.put(out)
if process_pacman_cc.returncode == 0:
logger.info("Pacman cache directory cleaned")
else:
logger.error("Failed to clean Pacman cache directory")
logger.info("Running full system upgrade")
# run full system upgrade, Arch does not allow partial package updates
query_str = ["pacman", "-Syu", "--noconfirm"]
# query_str = ["pacman", "-Qqen"]
logger.info("Running %s" % " ".join(query_str))
event = "%s [INFO]:Running full system upgrade\n" % datetime.now().strftime(
"%Y-%m-%d-%H-%M-%S"
)
self.pkg_import_queue.put(event)
GLib.idle_add(
update_package_status_label,
self.label_package_status,
"Status: <b>Performing full system upgrade - do not power off your system</b>",
)
output = []
with subprocess.Popen(
query_str,
shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
bufsize=1,
universal_newlines=True,
) as process:
while True:
if process.poll() is not None:
break
for line in process.stdout:
# print(line.strip())
self.pkg_import_queue.put(line)
output.append(line)
# time.sleep(0.2)
if process.returncode == 0:
logger.info("Pacman system upgrade completed")
GLib.idle_add(
update_package_status_label,
self.label_package_status,
"Status: <b> Full system upgrade - completed</b>",
)
else:
if len(output) > 0:
if "there is nothing to do" not in output:
logger.error("Pacman system upgrade failed")
GLib.idle_add(
update_package_status_label,
self.label_package_status,
"Status: <b> Full system upgrade - failed</b>",
)
print("%s" % " ".join(output))
event = "%s [ERROR]: Installation of packages aborted due to errors\n" % datetime.now().strftime(
"%Y-%m-%d-%H-%M-%S"
)
self.pkg_import_queue.put(event)
logger.error("Installation of packages aborted due to errors")
return
# do not proceed with package installs if system upgrade fails
else:
return
# iterate through list of packages, calling pacman -S on each one
for package in self.packages_list:
process_output = []
package = package.strip()
if len(package) > 0:
if "#" not in package:
query_str = ["pacman", "-S", package, "--needed", "--noconfirm"]
count += 1
logger.info("Running %s" % " ".join(query_str))
event = "%s [INFO]: Running %s\n" % (
datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
" ".join(query_str),
)
self.pkg_import_queue.put(event)
with subprocess.Popen(
query_str,
shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
bufsize=1,
universal_newlines=True,
) as process:
while True:
if process.poll() is not None:
break
for line in process.stdout:
process_output.append(line.strip())
self.pkg_import_queue.put(line)
# time.sleep(0.2)
if process.returncode == 0:
# since this is being run in another thread outside of main, use GLib to update UI component
GLib.idle_add(
update_package_status_label,
self.label_package_status,
"Status: <b>%s</b> -> <b>Installed</b>" % package,
)
GLib.idle_add(
update_package_status_label,
self.label_package_count,
"Progress: <b>%s/%s</b>"
% (count, len(self.packages_list)),
)
packages_status_list.append("%s -> Installed" % package)
else:
logger.error("%s --> Install failed" % package)
GLib.idle_add(
update_package_status_label,
self.label_package_status,
"Status: <b>%s</b> -> <b>Install failed</b>" % package,
)
GLib.idle_add(
update_package_status_label,
self.label_package_count,
"Progress: <b>%s/%s</b>"
% (count, len(self.packages_list)),
)
if len(process_output) > 0:
if "there is nothing to do" not in process_output:
logger.error("%s" % " ".join(process_output))
# store package error in dict
package_err[package] = " ".join(process_output)
package_failed = True
packages_status_list.append("%s -> Failed" % package)
if len(packages_status_list) > 0:
self.pkg_status_queue.put(packages_status_list)
if package_failed is True:
GLib.idle_add(
update_package_status_label,
self.label_package_status,
"<b>Some packages have failed to install see %s</b>" % self.logfile,
)
# end
event = "%s [INFO]: Completed, check the logfile for any errors\n" % (
datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
)
self.pkg_import_queue.put(event)
except Exception as e:
logger.error("Exception in import_packages(): %s" % e)
finally:
self.pkg_err_queue.put(package_err)