From 6abd0f5862140273c6c1a23c33c288f13529f924 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 1 Sep 2023 23:13:17 +0530 Subject: [PATCH 01/12] added peewee to requirements.d/dev.txt --- requirements.d/dev.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.d/dev.txt b/requirements.d/dev.txt index 5391c54a0..9cc3cc9c8 100644 --- a/requirements.d/dev.txt +++ b/requirements.d/dev.txt @@ -3,6 +3,7 @@ coverage flake8 macholib nox +peewee pkgconfig pre-commit pyinstaller From 7b800661c2e6822c4c259afefe3fd27fb6bf26ed Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 6 Sep 2023 11:57:06 +0530 Subject: [PATCH 02/12] removed peewee from requirements: not necessary --- requirements.d/dev.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.d/dev.txt b/requirements.d/dev.txt index 9cc3cc9c8..5391c54a0 100644 --- a/requirements.d/dev.txt +++ b/requirements.d/dev.txt @@ -3,7 +3,6 @@ coverage flake8 macholib nox -peewee pkgconfig pre-commit pyinstaller From 55ede38e5d7a088f7d38f8f30d3ab2ee2d437280 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 9 Sep 2023 17:01:11 +0530 Subject: [PATCH 03/12] some enhancements to ExistingRepoWindow: to allow creation of a new repo in case the addition of an existing one fails/its not initialized --- src/vorta/views/repo_add_dialog.py | 42 +++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/src/vorta/views/repo_add_dialog.py b/src/vorta/views/repo_add_dialog.py index cd265a333..b5ea0db4f 100644 --- a/src/vorta/views/repo_add_dialog.py +++ b/src/vorta/views/repo_add_dialog.py @@ -13,7 +13,7 @@ from vorta.borg.info_repo import BorgInfoRepoJob from vorta.borg.init import BorgInitJob from vorta.keyring.abc import VortaKeyring -from vorta.store.models import RepoModel +from vorta.store.models import BackupProfileMixin, RepoModel from vorta.utils import borg_compat, choose_file_dialog, get_asset, get_private_keys from vorta.views.partials.password_input import PasswordInput, PasswordLineEdit from vorta.views.utils import get_colored_icon @@ -223,7 +223,7 @@ def run(self): self._set_status(params['message']) -class ExistingRepoWindow(RepoWindow): +class ExistingRepoWindow(RepoWindow, BackupProfileMixin): def __init__(self): super().__init__() self.title.setText(self.tr('Connect to existing Repository')) @@ -233,12 +233,46 @@ def __init__(self): self.passwordInput = PasswordLineEdit() self.repoDataFormLayout.addRow(self.passwordLabel, self.passwordInput) + def run_result(self, result): + self.saveButton.setEnabled(True) + if result['returncode'] == 0: + self.added_repo.emit(result) + self.accept() + else: + self._set_status(self.tr('Unable to add your repository.\nYou need to initialize a new repository.')) + self.initialize_new_repo_window() + + def initialize_new_repo_window(self): + new_window = AddRepoWindow() + new_window.setParent(self, QtCore.Qt.WindowType.Sheet) + new_window.added_repo.connect(self.process_new_repo) + + # Autofilling of fields from this previous window + new_window.repoURL.setText(self.values['repo_url']) + new_window.repoName.setText(self.values['repo_name']) + new_window.set_password(new_window.values['repo_url']) + new_window.passwordInput.passwordLineEdit.setText(self.passwordInput.get_password()) + new_window.passwordInput.confirmLineEdit.setText(self.passwordInput.get_password()) + new_window._set_status(self.tr("Autofilled from previous window")) + new_window.open() + + def process_new_repo(self, result): + if result['returncode'] == 0: + new_repo = RepoModel.get(url=result['params']['repo_url']) + profile = self.profile() + profile.repo = new_repo.id + profile.save() + + self.set_repos() + self.repoSelector.setCurrentIndex(self.repoSelector.count() - 1) + self.repo_added.emit() + self.init_repo_stats() + def set_password(self, URL): '''Autofill password from keyring only if current entry is empty''' password = VortaKeyring.get_keyring().get_password('vorta-repo', URL) if password and self.passwordInput.get_password() == "": - self._set_status(self.tr("Autofilled password from password manager.")) - self.passwordInput.setText(password) + self.passwordInput.set_error_label(self.tr("Autofilled password from password manager.")) def run(self): if self.validate(): From 690d837dee90195d730e61cdb9979d89e72f0ea8 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 12 Sep 2023 23:26:41 +0530 Subject: [PATCH 04/12] added qmessagebox for an extra alert --- src/vorta/views/repo_add_dialog.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/vorta/views/repo_add_dialog.py b/src/vorta/views/repo_add_dialog.py index b5ea0db4f..343591cf5 100644 --- a/src/vorta/views/repo_add_dialog.py +++ b/src/vorta/views/repo_add_dialog.py @@ -7,6 +7,7 @@ QDialogButtonBox, QFormLayout, QLabel, + QMessageBox, QSizePolicy, ) @@ -240,7 +241,19 @@ def run_result(self, result): self.accept() else: self._set_status(self.tr('Unable to add your repository.\nYou need to initialize a new repository.')) + self.exception_handler() + + def exception_handler(self): + exception_window = QMessageBox.question( + self, + 'Add new Repository instead', + self.tr('This reposiotory does not seem to be initiated. Initialize a new repository?'), + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, + ) + if exception_window == QMessageBox.StandardButton.Yes: self.initialize_new_repo_window() + else: + self.close() def initialize_new_repo_window(self): new_window = AddRepoWindow() From e8afe1546677a7b61ec5342bf94855270c1fffc9 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 12 Sep 2023 23:52:46 +0530 Subject: [PATCH 05/12] added qmessagebox --- src/vorta/views/repo_add_dialog.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vorta/views/repo_add_dialog.py b/src/vorta/views/repo_add_dialog.py index 343591cf5..ac70e01fa 100644 --- a/src/vorta/views/repo_add_dialog.py +++ b/src/vorta/views/repo_add_dialog.py @@ -263,6 +263,8 @@ def initialize_new_repo_window(self): # Autofilling of fields from this previous window new_window.repoURL.setText(self.values['repo_url']) new_window.repoName.setText(self.values['repo_name']) + new_window.values['repo_url'] = self.values['repo_url'] + new_window.values['repo_name'] = self.values['repo_name'] new_window.set_password(new_window.values['repo_url']) new_window.passwordInput.passwordLineEdit.setText(self.passwordInput.get_password()) new_window.passwordInput.confirmLineEdit.setText(self.passwordInput.get_password()) From 44639daafe840caab2dc3aeb1813812ef8564a70 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 15 Sep 2023 18:17:57 +0530 Subject: [PATCH 06/12] added differentiation for adding repo via folder and remote, implementing setting of values from the values method --- src/vorta/views/repo_add_dialog.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/vorta/views/repo_add_dialog.py b/src/vorta/views/repo_add_dialog.py index ac70e01fa..7f3f220ea 100644 --- a/src/vorta/views/repo_add_dialog.py +++ b/src/vorta/views/repo_add_dialog.py @@ -244,13 +244,13 @@ def run_result(self, result): self.exception_handler() def exception_handler(self): - exception_window = QMessageBox.question( + answer = QMessageBox.question( self, 'Add new Repository instead', self.tr('This reposiotory does not seem to be initiated. Initialize a new repository?'), QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, ) - if exception_window == QMessageBox.StandardButton.Yes: + if answer == QMessageBox.StandardButton.Yes: self.initialize_new_repo_window() else: self.close() @@ -260,11 +260,24 @@ def initialize_new_repo_window(self): new_window.setParent(self, QtCore.Qt.WindowType.Sheet) new_window.added_repo.connect(self.process_new_repo) - # Autofilling of fields from this previous window + # setting the type of repo - remote or local + if self.repoURL.isEnabled(): + new_window.reURL.setEnabled(True) + else: + new_window.repoURL.setEnabled(False) + new_window.sshComboBox.setEnabled(False) + new_window.repoLabel.setText(self.tr('Repository Path:')) + new_window.is_remote_repo = False + + # autofilling fields from this previous window (self) to new_window new_window.repoURL.setText(self.values['repo_url']) new_window.repoName.setText(self.values['repo_name']) + + # setting values from this previous window (self) to new_window new_window.values['repo_url'] = self.values['repo_url'] new_window.values['repo_name'] = self.values['repo_name'] + + # setting password new_window.set_password(new_window.values['repo_url']) new_window.passwordInput.passwordLineEdit.setText(self.passwordInput.get_password()) new_window.passwordInput.confirmLineEdit.setText(self.passwordInput.get_password()) From 7023ab69590e5a696804a4277ccdbb61159f5d46 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 15 Sep 2023 19:14:30 +0530 Subject: [PATCH 07/12] added differentiation for adding repo via folder and remote, implementing setting of values from the values method --- src/vorta/views/repo_add_dialog.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vorta/views/repo_add_dialog.py b/src/vorta/views/repo_add_dialog.py index 7f3f220ea..c0bc4da35 100644 --- a/src/vorta/views/repo_add_dialog.py +++ b/src/vorta/views/repo_add_dialog.py @@ -274,11 +274,14 @@ def initialize_new_repo_window(self): new_window.repoName.setText(self.values['repo_name']) # setting values from this previous window (self) to new_window + new_window.values['ssh_key'] = self.values['ssh_key'] new_window.values['repo_url'] = self.values['repo_url'] new_window.values['repo_name'] = self.values['repo_name'] + new_window.values['extra_borg_arguments'] = self.values['extra_borg_arguments'] # setting password new_window.set_password(new_window.values['repo_url']) + new_window.values['password'] = self.values['password'] new_window.passwordInput.passwordLineEdit.setText(self.passwordInput.get_password()) new_window.passwordInput.confirmLineEdit.setText(self.passwordInput.get_password()) new_window._set_status(self.tr("Autofilled from previous window")) From 780082e3b8aa84aab22aa55a15fc45b644ec1043 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 19 Sep 2023 18:14:35 +0530 Subject: [PATCH 08/12] shortened --- src/vorta/views/repo_add_dialog.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/vorta/views/repo_add_dialog.py b/src/vorta/views/repo_add_dialog.py index c0bc4da35..33f53345f 100644 --- a/src/vorta/views/repo_add_dialog.py +++ b/src/vorta/views/repo_add_dialog.py @@ -262,7 +262,7 @@ def initialize_new_repo_window(self): # setting the type of repo - remote or local if self.repoURL.isEnabled(): - new_window.reURL.setEnabled(True) + new_window.repoURL.setEnabled(True) else: new_window.repoURL.setEnabled(False) new_window.sshComboBox.setEnabled(False) @@ -282,8 +282,6 @@ def initialize_new_repo_window(self): # setting password new_window.set_password(new_window.values['repo_url']) new_window.values['password'] = self.values['password'] - new_window.passwordInput.passwordLineEdit.setText(self.passwordInput.get_password()) - new_window.passwordInput.confirmLineEdit.setText(self.passwordInput.get_password()) new_window._set_status(self.tr("Autofilled from previous window")) new_window.open() @@ -299,12 +297,6 @@ def process_new_repo(self, result): self.repo_added.emit() self.init_repo_stats() - def set_password(self, URL): - '''Autofill password from keyring only if current entry is empty''' - password = VortaKeyring.get_keyring().get_password('vorta-repo', URL) - if password and self.passwordInput.get_password() == "": - self.passwordInput.set_error_label(self.tr("Autofilled password from password manager.")) - def run(self): if self.validate(): params = BorgInfoRepoJob.prepare(self.values) From 45176f8b4a3e82878d5ba0bc29b3eeb78bbdb495 Mon Sep 17 00:00:00 2001 From: real-yfprojects Date: Fri, 6 Oct 2023 18:32:06 +0200 Subject: [PATCH 09/12] Simplify code, make it more modular. This improves the code that open the `AddRepoWindow` when one tries to add an existing repo although it doesn't exist. * src/vorta/views/repo_add_dialog.py --- src/vorta/views/repo_add_dialog.py | 87 +++++++++++++----------------- 1 file changed, 37 insertions(+), 50 deletions(-) diff --git a/src/vorta/views/repo_add_dialog.py b/src/vorta/views/repo_add_dialog.py index 33f53345f..ba30e8c78 100644 --- a/src/vorta/views/repo_add_dialog.py +++ b/src/vorta/views/repo_add_dialog.py @@ -14,7 +14,7 @@ from vorta.borg.info_repo import BorgInfoRepoJob from vorta.borg.init import BorgInitJob from vorta.keyring.abc import VortaKeyring -from vorta.store.models import BackupProfileMixin, RepoModel +from vorta.store.models import RepoModel from vorta.utils import borg_compat, choose_file_dialog, get_asset, get_private_keys from vorta.views.partials.password_input import PasswordInput, PasswordLineEdit from vorta.views.utils import get_colored_icon @@ -128,6 +128,19 @@ def values(self): ) return out + @classmethod + def from_values(cls, values: dict): + """Instantiate window from a values dict as returned by values property.""" + window = cls() + window.sshComboBox.setCurrentData(values['ssh_key']) + window.repoURL.setText(values['repo_url']) + window.repoName.setText(values['repo_name']) + window.passwordInput.passwordLineEdit.setText(values['password']) + # do not set confirmLineEdit, let user confirm password + window._set_status("Autofill password from previous window.") + window.extraBorgArgumentsLineEdit.setText(values['extra_borg_arguments']) + return window + class AddRepoWindow(RepoWindow): def __init__(self, parent=None): @@ -164,6 +177,13 @@ def values(self): out['encryption'] = self.encryptionComboBox.currentData() return out + @classmethod + def from_values(cls, values: dict): + """Instantiate window from a values dict as returned by values property.""" + window = super().from_values(values) + window.encryptionComboBox.setCurrentData(values['encryption']) + return window + def init_encryption(self): if borg_compat.check('V2'): encryption_algos = [ @@ -224,7 +244,7 @@ def run(self): self._set_status(params['message']) -class ExistingRepoWindow(RepoWindow, BackupProfileMixin): +class ExistingRepoWindow(RepoWindow): def __init__(self): super().__init__() self.title.setText(self.tr('Connect to existing Repository')) @@ -234,68 +254,35 @@ def __init__(self): self.passwordInput = PasswordLineEdit() self.repoDataFormLayout.addRow(self.passwordLabel, self.passwordInput) + def set_password(self, URL): + '''Autofill password from keyring only if current entry is empty''' + password = VortaKeyring.get_keyring().get_password('vorta-repo', URL) + if password and self.passwordInput.get_password() == "": + self._set_status(self.tr("Autofilled password from password manager.")) + self.passwordInput.setText(password) + def run_result(self, result): self.saveButton.setEnabled(True) if result['returncode'] == 0: self.added_repo.emit(result) self.accept() else: - self._set_status(self.tr('Unable to add your repository.\nYou need to initialize a new repository.')) - self.exception_handler() + self._set_status(self.tr('Unable to add your repository.')) + if 'msgid' in result and result['msgid'] == 'Repository.DoesNotExist': + self.init_new_repo() - def exception_handler(self): + def init_new_repo(self): answer = QMessageBox.question( self, 'Add new Repository instead', - self.tr('This reposiotory does not seem to be initiated. Initialize a new repository?'), + self.tr("This repository doesn't seem to exist. Do you want to initialize a new repository?"), QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, ) if answer == QMessageBox.StandardButton.Yes: - self.initialize_new_repo_window() - else: + init_dialog = AddRepoWindow.from_values(self.values) + init_dialog.setParent(self.parent()) self.close() - - def initialize_new_repo_window(self): - new_window = AddRepoWindow() - new_window.setParent(self, QtCore.Qt.WindowType.Sheet) - new_window.added_repo.connect(self.process_new_repo) - - # setting the type of repo - remote or local - if self.repoURL.isEnabled(): - new_window.repoURL.setEnabled(True) - else: - new_window.repoURL.setEnabled(False) - new_window.sshComboBox.setEnabled(False) - new_window.repoLabel.setText(self.tr('Repository Path:')) - new_window.is_remote_repo = False - - # autofilling fields from this previous window (self) to new_window - new_window.repoURL.setText(self.values['repo_url']) - new_window.repoName.setText(self.values['repo_name']) - - # setting values from this previous window (self) to new_window - new_window.values['ssh_key'] = self.values['ssh_key'] - new_window.values['repo_url'] = self.values['repo_url'] - new_window.values['repo_name'] = self.values['repo_name'] - new_window.values['extra_borg_arguments'] = self.values['extra_borg_arguments'] - - # setting password - new_window.set_password(new_window.values['repo_url']) - new_window.values['password'] = self.values['password'] - new_window._set_status(self.tr("Autofilled from previous window")) - new_window.open() - - def process_new_repo(self, result): - if result['returncode'] == 0: - new_repo = RepoModel.get(url=result['params']['repo_url']) - profile = self.profile() - profile.repo = new_repo.id - profile.save() - - self.set_repos() - self.repoSelector.setCurrentIndex(self.repoSelector.count() - 1) - self.repo_added.emit() - self.init_repo_stats() + init_dialog.open() def run(self): if self.validate(): From f71c8f86758479437b90c54edcfdd084cd3c6eed Mon Sep 17 00:00:00 2001 From: real-yfprojects Date: Fri, 6 Oct 2023 19:08:42 +0200 Subject: [PATCH 10/12] Store full error (log) messages for borg jobs and fix new feature. This allows accessing `msgid` from `ExistingRepoWindow`. * src/vorta/application.py * src/vorta/borg/borg_job.py * src/vorta/views/repo_add_dialog.py * tests/unit/test_repo.py --- src/vorta/application.py | 4 ++-- src/vorta/borg/borg_job.py | 5 +++-- src/vorta/views/repo_add_dialog.py | 27 +++++++++++++++++++-------- tests/unit/test_repo.py | 2 +- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/vorta/application.py b/src/vorta/application.py index 357eb2dfa..d271c0986 100644 --- a/src/vorta/application.py +++ b/src/vorta/application.py @@ -317,8 +317,8 @@ def check_failed_response(self, result: Dict[str, Any]): # extract data from the params for the borg job repo_url = result['params']['repo_url'] returncode = result['returncode'] - errors: List[Tuple[int, str]] = result['errors'] - error_message = errors[0][1] if errors else '' + errors: List[Tuple[int, dict]] = result['errors'] + error_message = errors[0]['message'] if errors else '' # Switch over returncodes if returncode == 0: diff --git a/src/vorta/borg/borg_job.py b/src/vorta/borg/borg_job.py index 9cf6a1551..5db70bf20 100644 --- a/src/vorta/borg/borg_job.py +++ b/src/vorta/borg/borg_job.py @@ -264,7 +264,7 @@ def read_async(fd): if stderr: for line in stderr.split('\n'): try: - parsed = json.loads(line) + parsed: dict = json.loads(line) if parsed['type'] == 'log_message': context = { @@ -281,7 +281,8 @@ def read_async(fd): if level_int >= logging.WARNING: # Append log to list of error messages - error_messages.append((level_int, parsed["message"])) + parsed['level'] = level_int + error_messages.append(parsed) elif parsed['type'] == 'file_status': self.app.backup_log_event.emit( diff --git a/src/vorta/views/repo_add_dialog.py b/src/vorta/views/repo_add_dialog.py index ba30e8c78..88df2b2de 100644 --- a/src/vorta/views/repo_add_dialog.py +++ b/src/vorta/views/repo_add_dialog.py @@ -132,17 +132,19 @@ def values(self): def from_values(cls, values: dict): """Instantiate window from a values dict as returned by values property.""" window = cls() - window.sshComboBox.setCurrentData(values['ssh_key']) + window.sshComboBox.setCurrentIndex(window.sshComboBox.findData(values['ssh_key'])) window.repoURL.setText(values['repo_url']) window.repoName.setText(values['repo_name']) window.passwordInput.passwordLineEdit.setText(values['password']) # do not set confirmLineEdit, let user confirm password - window._set_status("Autofill password from previous window.") + window._set_status("Autofilled password from previous window.") window.extraBorgArgumentsLineEdit.setText(values['extra_borg_arguments']) return window class AddRepoWindow(RepoWindow): + """Dialog for initializing a new repository and adding it.""" + def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("Add New Repository") @@ -181,7 +183,8 @@ def values(self): def from_values(cls, values: dict): """Instantiate window from a values dict as returned by values property.""" window = super().from_values(values) - window.encryptionComboBox.setCurrentData(values['encryption']) + if 'encryption' in values: + window.encryptionComboBox.setCurrentIndex(window.encryptionComboBox.findData(values['encryption'])) return window def init_encryption(self): @@ -245,6 +248,8 @@ def run(self): class ExistingRepoWindow(RepoWindow): + """Dialog for adding an existing repository.""" + def __init__(self): super().__init__() self.title.setText(self.tr('Connect to existing Repository')) @@ -255,23 +260,27 @@ def __init__(self): self.repoDataFormLayout.addRow(self.passwordLabel, self.passwordInput) def set_password(self, URL): - '''Autofill password from keyring only if current entry is empty''' + """Autofill password from keyring only if current entry is empty""" password = VortaKeyring.get_keyring().get_password('vorta-repo', URL) if password and self.passwordInput.get_password() == "": self._set_status(self.tr("Autofilled password from password manager.")) self.passwordInput.setText(password) def run_result(self, result): + """Handle result of BorgInfoRepoJob.""" self.saveButton.setEnabled(True) if result['returncode'] == 0: self.added_repo.emit(result) self.accept() else: self._set_status(self.tr('Unable to add your repository.')) - if 'msgid' in result and result['msgid'] == 'Repository.DoesNotExist': - self.init_new_repo() + for error in result['errors']: + if 'msgid' in error and error['msgid'] in ['Repository.DoesNotExist', 'Repository.InvalidRepository']: + self.init_new_repo() + break def init_new_repo(self): + """Ask user if they want to initialize a new repository instead.""" answer = QMessageBox.question( self, 'Add new Repository instead', @@ -280,9 +289,11 @@ def init_new_repo(self): ) if answer == QMessageBox.StandardButton.Yes: init_dialog = AddRepoWindow.from_values(self.values) - init_dialog.setParent(self.parent()) - self.close() + repo_tab = self.parent() + init_dialog.setParent(repo_tab, QtCore.Qt.WindowType.Sheet) + init_dialog.added_repo.connect(repo_tab.process_new_repo) init_dialog.open() + self.close() def run(self): if self.validate(): diff --git a/tests/unit/test_repo.py b/tests/unit/test_repo.py index e072119d1..a540df293 100644 --- a/tests/unit/test_repo.py +++ b/tests/unit/test_repo.py @@ -289,7 +289,7 @@ def test_repo_check_failed_response(qapp, qtbot, mocker, response): mock_result: Dict[str, Any] = { 'params': {'repo_url': 'test_repo_url'}, 'returncode': response["return_code"], - 'errors': [(0, 'test_error_message')] if response["return_code"] not in [0, 130] else None, + 'errors': [{'level': 0, 'message': 'test_error_message'}] if response["return_code"] not in [0, 130] else None, } mock_exec = mocker.patch.object(QMessageBox, "exec") From cff9e3a26d25b26167841fb227f5c040c430d1b3 Mon Sep 17 00:00:00 2001 From: real-yfprojects Date: Fri, 20 Oct 2023 19:40:31 +0200 Subject: [PATCH 11/12] Pass is_remote_repo attribute between the dialog. Now when the `AddRepoWindow` with the values from `ExistingRepoWindow` the `is_remote_repo` attribute will be restored, preventing an error message when trying to add the repository. * src/vorta/views/repo_add_dialog.py --- src/vorta/views/repo_add_dialog.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vorta/views/repo_add_dialog.py b/src/vorta/views/repo_add_dialog.py index 88df2b2de..7fa6c3a31 100644 --- a/src/vorta/views/repo_add_dialog.py +++ b/src/vorta/views/repo_add_dialog.py @@ -125,6 +125,7 @@ def values(self): repo_name=self.repoName.text(), password=self.passwordInput.get_password(), extra_borg_arguments=self.extraBorgArgumentsLineEdit.text(), + is_remote_repo=self.is_remote_repo, ) return out @@ -139,6 +140,7 @@ def from_values(cls, values: dict): # do not set confirmLineEdit, let user confirm password window._set_status("Autofilled password from previous window.") window.extraBorgArgumentsLineEdit.setText(values['extra_borg_arguments']) + window.is_remote_repo = values['is_remote_repo'] return window From 41ea359caba8626dce5c666587233ab80a12103e Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 25 Feb 2024 12:40:37 +0530 Subject: [PATCH 12/12] fix for remote repos --- src/vorta/views/repo_add_dialog.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vorta/views/repo_add_dialog.py b/src/vorta/views/repo_add_dialog.py index 7fa6c3a31..ab2805e88 100644 --- a/src/vorta/views/repo_add_dialog.py +++ b/src/vorta/views/repo_add_dialog.py @@ -277,7 +277,11 @@ def run_result(self, result): else: self._set_status(self.tr('Unable to add your repository.')) for error in result['errors']: - if 'msgid' in error and error['msgid'] in ['Repository.DoesNotExist', 'Repository.InvalidRepository']: + if 'msgid' in error and error['msgid'] in [ + 'Repository.DoesNotExist', + 'Repository.InvalidRepository', + 'InvalidRepository', + ]: self.init_new_repo() break