Prevent duplicate repos from being added. Fixes #473

The change to repo_add_dialog.py adds a check in the database
to see if the repo already exists, and blocks the ui with an
error message if so.
The change to repo_tab.py refactors the selector population logic
so that the selector stays in sync with the database and doesn't
leave the entry in the UI that triggers the crash.
This commit is contained in:
vapaavetehinen 2020-05-31 19:51:28 +08:00 committed by Manu
parent 79ef4717d7
commit eedd1184a5
2 changed files with 14 additions and 4 deletions

View File

@ -5,6 +5,7 @@ from vorta.utils import get_private_keys, get_asset, choose_file_dialog, borg_co
from vorta.borg.init import BorgInitThread
from vorta.borg.info import BorgInfoThread
from vorta.views.utils import get_colored_icon
from vorta.models import RepoModel
uifile = get_asset('UI/repoadd.ui')
AddRepoUI, AddRepoBase = uic.loadUiType(uifile)
@ -117,6 +118,10 @@ class AddRepoWindow(AddRepoBase, AddRepoUI):
self._set_status(self.tr('Please enter a valid repo URL or select a local path.'))
return False
if RepoModel.get_or_none(RepoModel.url == self.values['repo_url']) is not None:
self._set_status(self.tr('This repo has already been added.'))
return False
if self.__class__ == AddRepoWindow:
if self.values['encryption'] != 'none':
if len(self.values['password']) < 8:

View File

@ -25,9 +25,7 @@ class RepoTab(RepoBase, RepoUI, BackupProfileMixin):
self.repoSelector.addItem(self.tr('+ Initialize New Repository'), 'new')
self.repoSelector.addItem(self.tr('+ Add Existing Repository'), 'existing')
self.repoSelector.insertSeparator(3)
for repo in RepoModel.select():
self.repoSelector.addItem(repo.url, repo.id)
self.set_repos()
self.repoSelector.currentIndexChanged.connect(self.repo_select_action)
self.repoRemoveToolbutton.clicked.connect(self.repo_unlink_action)
@ -64,6 +62,13 @@ class RepoTab(RepoBase, RepoUI, BackupProfileMixin):
self.repoRemoveToolbutton.setIcon(get_colored_icon('unlink'))
self.sshKeyToClipboardButton.setIcon(get_colored_icon('copy'))
def set_repos(self):
count = self.repoSelector.count()
for x in range(4, count): # Repositories are listed after 4th entry in repoSelector
self.repoSelector.removeItem(4)
for repo in RepoModel.select():
self.repoSelector.addItem(repo.url, repo.id)
def populate_from_profile(self):
profile = self.profile()
if profile.repo:
@ -175,7 +180,7 @@ class RepoTab(RepoBase, RepoUI, BackupProfileMixin):
profile.repo = new_repo.id
profile.save()
self.repoSelector.addItem(new_repo.url, new_repo.id)
self.set_repos()
self.repoSelector.setCurrentIndex(self.repoSelector.count() - 1)
self.repo_added.emit()
self.init_repo_stats()