diff --git a/core/gui/result_table.py b/core/gui/result_table.py index b2f4e3a1..7391e01f 100644 --- a/core/gui/result_table.py +++ b/core/gui/result_table.py @@ -102,6 +102,10 @@ class ResultTable(GUIObject, GUITable): def rename_selected(self, newname): row = self.selected_row + if row is None: + # There's all kinds of way the current row can be swept off during rename. When it + # happens, selected_row will be None. + return False row._data = None row._data_delta = None return self.app.rename_selected(newname) diff --git a/core/tests/app_test.py b/core/tests/app_test.py index 01213e64..3df67143 100644 --- a/core/tests/app_test.py +++ b/core/tests/app_test.py @@ -136,6 +136,13 @@ class TestCaseDupeGuru: app.start_scanning() eq_(len(app.results.groups), 0) + def test_rename_when_nothing_is_selected(self): + # It's possible that rename operation has its selected row swept off from under it, thus + # making the selected row None. Don't crash when it happens. + dgapp = DupeGuru() + rtable = ResultTable(CallLogger(), dgapp) + # selected_row is None because there's no result. + assert not rtable.rename_selected('foo') # no crash class TestCaseDupeGuru_clean_empty_dirs: def pytest_funcarg__do_setup(self, request):