Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/vorta/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class VortaApp(QtSingleApplication):
backup_finished_event = QtCore.pyqtSignal(dict)
backup_cancelled_event = QtCore.pyqtSignal()
backup_log_event = QtCore.pyqtSignal(str, dict)
backup_progress_event = QtCore.pyqtSignal(str)
backup_progress_event = QtCore.pyqtSignal(int, str)
check_failed_event = QtCore.pyqtSignal(dict)

def __init__(self, args_raw, single_app=False):
Expand Down Expand Up @@ -121,7 +121,7 @@ def create_backup_action(self, profile_id=None):
translate('messages', msg['message']),
level='error',
)
self.backup_progress_event.emit(f"[{profile.name}] {translate('messages', msg['message'])}")
self.backup_progress_event.emit(profile.id, f"[{profile.name}] {translate('messages', msg['message'])}")
return None

def open_main_window_action(self):
Expand Down Expand Up @@ -257,7 +257,7 @@ def react_to_log(self, mgs, context):
def break_lock(self, profile):
params = BorgBreakJob.prepare(profile)
if not params['ok']:
self.backup_progress_event.emit(f"[{profile.name}] {params['message']}")
self.backup_progress_event.emit(profile.id, f"[{profile.name}] {params['message']}")
return
job = BorgBreakJob(params['cmd'], params)
self.jobs_manager.add_job(job)
Expand Down
4 changes: 3 additions & 1 deletion src/vorta/borg/borg_job.py
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,9 @@ def read_async(fd):
# f"{translate('BorgJob','Compressed')}: {pretty_bytes(parsed['compressed_size'])}, "
f"{translate('BorgJob','Deduplicated')}: {pretty_bytes(parsed['deduplicated_size'])}" # noqa: E501
)
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {msg}")
self.app.backup_progress_event.emit(
self.params['profile_id'], f"[{self.params['profile_name']}] {msg}"
)
except json.decoder.JSONDecodeError:
msg = line.strip()
if msg: # Log only if there is something to log.
Expand Down
7 changes: 5 additions & 2 deletions src/vorta/borg/break_lock.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@
class BorgBreakJob(BorgJob):
def started_event(self):
self.app.backup_started_event.emit()
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Breaking repository lock…')}")
self.app.backup_progress_event.emit(
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Breaking repository lock…')}"
)

def finished_event(self, result):
self.app.backup_finished_event.emit(result)
self.app.backup_progress_event.emit(
f"[{self.params['profile_name']}] {self.tr('Repository lock broken. Please redo your last action.')}"
self.params['profile_id'],
f"[{self.params['profile_name']}] {self.tr('Repository lock broken. Please redo your last action.')}",
)
self.result.emit(result)

Expand Down
11 changes: 8 additions & 3 deletions src/vorta/borg/check.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
class BorgCheckJob(BorgJob):
def started_event(self):
self.app.backup_started_event.emit()
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Starting consistency check…')}")
self.app.backup_progress_event.emit(
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Starting consistency check…')}"
)

def finished_event(self, result: Dict[str, Any]):
"""
Expand All @@ -25,14 +27,17 @@ def finished_event(self, result: Dict[str, Any]):
self.result.emit(result)
if result['returncode'] != 0:
self.app.backup_progress_event.emit(
self.params['profile_id'],
f"[{self.params['profile_name']}] "
+ translate('RepoCheckJob', 'Repo check failed. See the <a href="{0}">logs</a> for details.').format(
config.LOG_DIR.as_uri()
)
),
)
self.app.check_failed_event.emit(result)
else:
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Check completed.')}")
self.app.backup_progress_event.emit(
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Check completed.')}"
)

@classmethod
def prepare(cls, profile):
Expand Down
9 changes: 6 additions & 3 deletions src/vorta/borg/compact.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class BorgCompactJob(BorgJob):
def started_event(self):
self.app.backup_started_event.emit()
self.app.backup_progress_event.emit(
f"[{self.params['profile_name']} {self.tr('Starting repository compaction...')}]"
self.params['profile_id'], f"[{self.params['profile_name']} {self.tr('Starting repository compaction...')}]"
)

def finished_event(self, result: Dict[str, Any]):
Expand All @@ -27,13 +27,16 @@ def finished_event(self, result: Dict[str, Any]):
self.result.emit(result)
if result['returncode'] != 0:
self.app.backup_progress_event.emit(
self.params['profile_id'],
f"[{self.params['profile_name']}] "
+ translate(
'BorgCompactJob', 'Errors during compaction. See the <a href="{0}">logs</a> for details.'
).format(config.LOG_DIR.as_uri())
).format(config.LOG_DIR.as_uri()),
)
else:
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Compaction completed.')}")
self.app.backup_progress_event.emit(
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Compaction completed.')}"
)

@classmethod
def prepare(cls, profile):
Expand Down
14 changes: 9 additions & 5 deletions src/vorta/borg/create.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,22 +43,26 @@ def process_result(self, result):

if result['returncode'] == 1:
self.app.backup_progress_event.emit(
self.params['profile_id'],
f"[{self.params['profile_name']}] "
+ translate(
'BorgCreateJob',
'Backup finished with warnings. See the <a href="{0}">logs</a> for details.',
).format(config.LOG_DIR.as_uri())
).format(config.LOG_DIR.as_uri()),
)
else:
self.app.backup_log_event.emit('', {})
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Backup finished.')}")
self.app.backup_progress_event.emit(
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Backup finished.')}"
)

def progress_event(self, fmt):
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {fmt}")
self.app.backup_progress_event.emit(self.params['profile_id'], f"[{self.params['profile_name']}] {fmt}")

def started_event(self):
self.app.backup_started_event.emit()
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Backup started.')}")
self.app.backup_progress_event.emit(
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Backup started.')}"
)

def finished_event(self, result):
self.app.backup_finished_event.emit(result)
Expand Down
8 changes: 6 additions & 2 deletions src/vorta/borg/delete.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
class BorgDeleteJob(BorgJob):
def started_event(self):
self.app.backup_started_event.emit()
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Deleting archive…')}")
self.app.backup_progress_event.emit(
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Deleting archive…')}"
)

def finished_event(self, result):
# set repo stats to N/A
Expand All @@ -22,7 +24,9 @@ def finished_event(self, result):

self.app.backup_finished_event.emit(result)
self.result.emit(result)
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Archive deleted.')}")
self.app.backup_progress_event.emit(
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Archive deleted.')}"
)

@classmethod
def prepare(cls, profile, archives: List[str]):
Expand Down
6 changes: 4 additions & 2 deletions src/vorta/borg/diff.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@ class BorgDiffJob(BorgJob):
def started_event(self):
self.app.backup_started_event.emit()
self.app.backup_progress_event.emit(
f"[{self.params['profile_name']}] {self.tr('Requesting differences between archives…')}"
self.params['profile_id'],
f"[{self.params['profile_name']}] {self.tr('Requesting differences between archives…')}",
)

def finished_event(self, result):
self.app.backup_finished_event.emit(result)
self.app.backup_progress_event.emit(
f"[{self.params['profile_name']}] {self.tr('Obtained differences between archives.')}"
self.params['profile_id'],
f"[{self.params['profile_name']}] {self.tr('Obtained differences between archives.')}",
)
self.result.emit(result)

Expand Down
4 changes: 2 additions & 2 deletions src/vorta/borg/extract.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ class BorgExtractJob(BorgJob):
def started_event(self):
self.app.backup_started_event.emit()
self.app.backup_progress_event.emit(
f"[{self.params['profile_name']}] {self.tr('Downloading files from archive…')}"
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Downloading files from archive…')}"
)

def finished_event(self, result):
self.app.backup_finished_event.emit(result)
self.result.emit(result)
self.app.backup_progress_event.emit(
f"[{self.params['profile_name']}] {self.tr('Restored files from archive.')}"
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Restored files from archive.')}"
)

@classmethod
Expand Down
8 changes: 6 additions & 2 deletions src/vorta/borg/info_archive.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,16 @@
class BorgInfoArchiveJob(BorgJob):
def started_event(self):
self.app.backup_started_event.emit()
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Refreshing archive…')}")
self.app.backup_progress_event.emit(
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Refreshing archive…')}"
)

def finished_event(self, result):
self.app.backup_finished_event.emit(result)
self.result.emit(result)
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Refreshing archive done.')}")
self.app.backup_progress_event.emit(
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Refreshing archive done.')}"
)

@classmethod
def prepare(cls, profile, archive_name):
Expand Down
6 changes: 4 additions & 2 deletions src/vorta/borg/list_archive.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@
class BorgListArchiveJob(BorgJob):
def started_event(self):
self.app.backup_started_event.emit()
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Getting archive content…')}")
self.app.backup_progress_event.emit(
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Getting archive content…')}"
)

def finished_event(self, result):
self.app.backup_finished_event.emit(result)
self.app.backup_progress_event.emit(
f"[{self.params['profile_name']}] {self.tr('Done getting archive content.')}"
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Done getting archive content.')}"
)
self.result.emit(result)

Expand Down
8 changes: 6 additions & 2 deletions src/vorta/borg/list_repo.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,16 @@
class BorgListRepoJob(BorgJob):
def started_event(self):
self.app.backup_started_event.emit()
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Refreshing archives…')}")
self.app.backup_progress_event.emit(
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Refreshing archives…')}"
)

def finished_event(self, result):
self.app.backup_finished_event.emit(result)
self.result.emit(result)
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Refreshing archives done.')}")
self.app.backup_progress_event.emit(
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Refreshing archives done.')}"
)

@classmethod
def prepare(cls, profile):
Expand Down
8 changes: 6 additions & 2 deletions src/vorta/borg/prune.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
class BorgPruneJob(BorgJob):
def started_event(self):
self.app.backup_started_event.emit()
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Pruning old archives…')}")
self.app.backup_progress_event.emit(
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Pruning old archives…')}"
)

def finished_event(self, result):
# set repo stats to N/A
Expand All @@ -20,7 +22,9 @@ def finished_event(self, result):

self.app.backup_finished_event.emit(result)
self.result.emit(result)
self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Pruning done.')}")
self.app.backup_progress_event.emit(
self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Pruning done.')}"
)

@classmethod
def prepare(cls, profile):
Expand Down
1 change: 1 addition & 0 deletions src/vorta/store/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ class BackupProfileModel(BaseModel):
pre_backup_cmd = pw.CharField(default='')
post_backup_cmd = pw.CharField(default='')
dont_run_on_metered_networks = pw.BooleanField(default=True)
last_status = pw.CharField(default='', null=True)

def refresh(self):
return type(self).get(self._pk_expr())
Expand Down
23 changes: 17 additions & 6 deletions src/vorta/views/main_window.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
is_system_tray_available,
)
from vorta.views.partials.loading_button import LoadingButton
from vorta.views.utils import get_colored_icon
from vorta.views.utils import extract_profile_name, get_colored_icon

from .about_tab import AboutTab
from .archive_tab import ArchiveTab
Expand Down Expand Up @@ -135,13 +135,22 @@ def set_icons(self):
self.profileDeleteButton.setIcon(get_colored_icon('minus'))
self.miscButton.setIcon(get_colored_icon('settings_wheel'))

def set_progress(self, text=''):
self.progressText.setText(text)
self.progressText.repaint()
def set_progress(self, profile_id, text=''):
profile = BackupProfileModel.get_by_id(profile_id)
profile.last_status = text
profile.save()
if profile.name == self.current_profile.name:
self.progressText.setText(text)
self.progressText.repaint()

def set_log(self, text=''):
self.logText.setText(text)
self.logText.repaint()
profile = extract_profile_name(text)
if profile == self.current_profile.name:
self.logText.setText(text)
self.logText.repaint()
else:
self.logText.setText('')
self.logText.repaint()

def _toggle_buttons(self, create_enabled=True):
if create_enabled:
Expand Down Expand Up @@ -188,6 +197,8 @@ def profile_selection_changed_action(self, index):
SettingsModel.key == 'previous_profile_id'
).execute()
self.archiveTab.toggle_compact_button_visibility()
self.app.backup_progress_event.emit(self.current_profile.id, self.current_profile.last_status)
self.app.backup_log_event.emit("", {})

def profile_clicked_action(self):
if self.miscWidget.isVisible():
Expand Down
12 changes: 12 additions & 0 deletions src/vorta/views/utils.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import json
import os
import re
import sys

from PyQt6.QtGui import QIcon, QImage, QPixmap
Expand Down Expand Up @@ -49,3 +50,14 @@ def get_exclusion_presets():
'tags': preset['tags'],
}
return allPresets


def extract_profile_name(text):
pattern = r'\[([^]]+)\]'

match = re.search(pattern, text)

if match:
return match.group(1)
else:
return None