Commit deeb156b authored by Roman Alifanov's avatar Roman Alifanov

very large speed up of getting a list of packages

parent 60cc02a0
...@@ -10,7 +10,7 @@ class ApplicationManager: ...@@ -10,7 +10,7 @@ class ApplicationManager:
@staticmethod @staticmethod
def _get_available_applications(callback): def _get_available_applications(callback):
process = subprocess.Popen(["epm", "play", "--list-all"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) process = subprocess.Popen(["epm", "play", "--full-list-all"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
def read_output(): def read_output():
stdout, stderr = process.communicate() stdout, stderr = process.communicate()
...@@ -23,6 +23,55 @@ class ApplicationManager: ...@@ -23,6 +23,55 @@ class ApplicationManager:
threading.Thread(target=read_output, daemon=True).start() threading.Thread(target=read_output, daemon=True).start()
@staticmethod @staticmethod
def parse_applications_output(output):
apps_dict = {}
for line in output.splitlines()[1:]:
line = line.strip()
if not line:
continue
parts = line.split(' - ', 1)
if len(parts) != 2:
continue
name_part, dscr = parts
name_part = name_part.strip()
dscr = dscr.strip()
if '=' in name_part:
base, alternative = name_part.split('=', 1)
else:
base = name_part
alternative = None
if base not in apps_dict:
apps_dict[base] = {
'dscr': dscr if alternative is None else '',
'alt': []
}
if alternative is not None:
apps_dict[base]['alt'].append(alternative)
else:
if alternative is None:
apps_dict[base]['dscr'] = dscr
elif alternative not in apps_dict[base]['alt']:
apps_dict[base]['alt'].append(alternative)
applications = []
for base, data in apps_dict.items():
applications.append({
'name': base.replace('&', '&'),
'dscr': data['dscr'].replace('&', '&'),
'alt': data['alt']
})
return applications
@staticmethod
def get_installed_applications(callback): def get_installed_applications(callback):
threading.Thread(target=ApplicationManager._get_installed_applications, daemon=True, args=(callback,)).start() threading.Thread(target=ApplicationManager._get_installed_applications, daemon=True, args=(callback,)).start()
...@@ -41,36 +90,7 @@ class ApplicationManager: ...@@ -41,36 +90,7 @@ class ApplicationManager:
threading.Thread(target=read_output, daemon=True).start() threading.Thread(target=read_output, daemon=True).start()
@staticmethod @staticmethod
def parse_applications_output(output):
applications = []
for line in output.splitlines()[1:]: # Пропустить заголовок
parts = line.split(' - ', 1) # Ограничить сплит до 2 частей
if len(parts) == 2:
name, dscr = map(str.strip, parts)
alternatives = ApplicationManager.get_alternatives(name)
applications.append({
'name': name.replace('&', '&'),
'dscr': dscr.replace('&', '&'),
"alt": alternatives.split()
})
else:
# Логгирование некорректной строки для диагностики
print(f"Неправильный формат строки: {line}")
return applications
@staticmethod
def get_alternatives(name):
alternatives, stderr = subprocess.Popen([
"epm", "play", "--product-alternatives", name
], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, text=True, bufsize=1
).communicate()
return alternatives
@staticmethod
def parse_installed_applications_output(output): def parse_installed_applications_output(output):
lines = output.splitlines()[1:] lines = output.splitlines()[1:]
return [line.split(' - ')[0].strip().split()[0] for line in lines] return [line.split(' - ')[0].strip().split()[0] for line in lines]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment