supporting flatpak 1.4

This commit is contained in:
Vinicius Moreira
2019-06-12 18:13:37 -03:00
parent fe46fad5c2
commit 7b03ccba2e
3 changed files with 65 additions and 26 deletions

View File

@@ -1,3 +1,4 @@
import re
import subprocess
from typing import List
@@ -7,9 +8,10 @@ def _package_str_to_json(line: str, version: str) -> dict:
app_array = line.split('\t')
if version >= '1.4.0':
app = {'name': app_array[0], 'id': app_array[1], 'version': app_array[2], 'branch': app_array[3], 'runtime': 'runtime' in app_array[4]}
# TODO not working yet
app = {'name': app_array[0],
'id': app_array[1],
'version': app_array[2],
'branch': app_array[3]}
elif '1.0' <= version < '1.1':
app = {'ref': app_array[0], 'options': app_array[1]}
@@ -18,16 +20,29 @@ def _package_str_to_json(line: str, version: str) -> dict:
app['arch'] = ref_data[1]
app['branch'] = ref_data[2]
app['name'] = ref_data[0].split('.')[-1]
app['runtime'] = 'runtime' in app['options']
app['version'] = None
else:
raise Exception('Unsupported version')
info = re.findall('\w+:\s.+', get_info(app['id']))
fields_to_get = ['origin', 'arch', 'ref']
for field in info:
field_val = field.split(':')
field_name = field_val[0].lower()
if field_name in fields_to_get:
app[field_name] = field_val[1].strip()
if field_name == 'ref':
app['runtime'] = app['ref'].startswith('runtime/')
return app
def _run_cmd(cmd: str) -> str:
def _run_cmd(cmd: str, expected_code: int = 0) -> str:
res = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE)
return res.stdout.decode() if res.returncode == 0 else None
return res.stdout.decode() if res.returncode == expected_code else None
def get_version():
@@ -35,6 +50,10 @@ def get_version():
return res.split(' ')[1].strip() if res else None
def get_info(app_id: str):
return _run_cmd('flatpak info ' + app_id)
def list_installed() -> List[str]:
apps_str = _run_cmd('flatpak list')
@@ -46,10 +65,14 @@ def list_installed() -> List[str]:
return None
def check_update(ref: dict) -> bool:
res = _run_cmd('flatpak update ' + ref)
def check_update(pak_id: dict) -> bool:
res = _run_cmd('flatpak update ' + pak_id)
return 'Updating in system' in res
def update(ref: str):
return bool(_run_cmd('flatpak update -y ' + ref))
def list_updates():
return _run_cmd('flatpak update', expected_code=1)

View File

@@ -37,21 +37,26 @@ class FlatpakManager:
if packages:
packages.sort(key=lambda p: p['name'].lower())
available_updates = flatpak.list_updates()
for pak in packages:
if self.packages_db:
package_data = self.packages_db.get(pak['id'], None)
pak_data = self.packages_db.get(pak['id'], None)
else:
package_data = None
pak_data = None
if not package_data:
if not pak_data:
pak['latest_release'] = None
pak['icon'] = None
else:
pak['latest_release'] = package_data['currentReleaseVersion']
pak['icon'] = __FLATHUB_URL__ + package_data['iconDesktopUrl']
pak['latest_release'] = pak_data['currentReleaseVersion']
pak['icon'] = pak_data['iconDesktopUrl']
pak['update'] = flatpak.check_update(pak['ref'])
if pak['icon'].startswith('/'):
pak['icon'] = __FLATHUB_URL__ + pak['icon']
pak['update'] = pak['id'] in available_updates
self.packages = packages
return [*self.packages]

View File

@@ -40,7 +40,7 @@ class UpdateToggleButton(QToolButton):
class MainWindow(QWidget):
__COLUMNS__ = ['Package', 'Branch', 'Arch', 'Ref', 'Latest Release', 'Update ?']
__COLUMNS__ = ['Package', 'Version', 'Branch', 'Arch', 'Ref', 'Latest Release', 'Origin', 'Update ?']
__BASE_HEIGHT__ = 400
def __init__(self, controller: FlatpakController):
@@ -170,6 +170,8 @@ class MainWindow(QWidget):
self.table_apps.setRowHidden(idx, hidden)
app['visible'] = not hidden
self.change_update_button_state()
def change_update_button_state(self):
enable_bt_update = False
@@ -217,35 +219,44 @@ class MainWindow(QWidget):
self.table_apps.setItem(idx, 0, col_name)
col_version = QTableWidgetItem()
col_version.setText(app['branch'])
col_version.setText(app['version'])
col_version.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
self.table_apps.setItem(idx, 1, col_version)
col_branch = QTableWidgetItem()
col_branch.setText(app['branch'])
col_branch.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
self.table_apps.setItem(idx, 2, col_branch)
col_arch = QTableWidgetItem()
col_arch.setText(app['arch'])
col_arch.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
self.table_apps.setItem(idx, 2, col_arch)
self.table_apps.setItem(idx, 3, col_arch)
col_package = QTableWidgetItem()
col_package.setText(app['ref'])
col_package.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
self.table_apps.setItem(idx, 3, col_package)
self.table_apps.setItem(idx, 4, col_package)
col_release = QTableWidgetItem()
col_release.setText(app['latest_release'])
col_release.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
self.table_apps.setItem(idx, 4, col_release)
self.table_apps.setItem(idx, 5, col_release)
if app['update']:
col_release.setForeground(QColor('yellow'))
app_model = {'model': app, 'update_checked': app['update'], 'visible': True}
col_origin = QTableWidgetItem()
col_origin.setText(app['origin'])
col_origin.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
self.table_apps.setItem(idx, 6, col_origin)
if app['update']:
col_update = UpdateToggleButton(app_model, self, app['update'])
self.table_apps.setCellWidget(idx, 5, col_update)
else:
self.table_apps.setCellWidget(idx, 5, None)
app_model = {'model': app,
'update_checked': app['update'],
'visible': not app['runtime'] or not self.checkbox_only_apps.isChecked()}
col_update = UpdateToggleButton(app_model, self, app['update']) if app['update'] else None
self.table_apps.setCellWidget(idx, 7, col_update)
self.apps.append(app_model)
@@ -254,7 +265,7 @@ class MainWindow(QWidget):
self.resize_and_center()
def resize_and_center(self):
new_width = reduce(operator.add, [self.table_apps.columnWidth(i) for i in range(len(MainWindow.__COLUMNS__))]) * 1.03
new_width = reduce(operator.add, [self.table_apps.columnWidth(i) for i in range(len(MainWindow.__COLUMNS__))]) * 1.05
self.resize(new_width, self.height())
self.centralize()