Skip to content

Commit a636fb7

Browse files
committed
Accept non-existing files on the command line
1 parent a383022 commit a636fb7

4 files changed

Lines changed: 34 additions & 16 deletions

File tree

ReText/__main__.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,12 @@
2121
import multiprocessing
2222
import signal
2323
import sys
24-
from os.path import exists, isdir, join
24+
from os.path import abspath, isdir, join
2525

2626
import markups
2727
from PyQt6.QtCore import (
2828
QCommandLineOption,
2929
QCommandLineParser,
30-
QFileInfo,
3130
QLibraryInfo,
3231
Qt,
3332
QTranslator,
@@ -43,7 +42,7 @@
4342
def canonicalize(option):
4443
if option == '-':
4544
return option
46-
return QFileInfo(option).canonicalFilePath()
45+
return abspath(option)
4746

4847
def main():
4948
multiprocessing.set_start_method('spawn')
@@ -131,13 +130,13 @@ def main():
131130
window.treeView.setRootIndex(window.fileSystemModel.index(fileName))
132131
window.actionShowDirectoryTree.setChecked(True)
133132
window.treeView.setVisible(True)
134-
elif exists(fileName):
133+
elif fileName == '-':
134+
readStdIn = True
135+
else:
135136
window.openFileWrapper(fileName)
136137
if parser.isSet(previewOption):
137138
window.actionPreview.setChecked(True)
138139
window.preview(True)
139-
elif fileName == '-':
140-
readStdIn = True
141140

142141
inputData = ''
143142
if readStdIn and sys.stdin is not None:

ReText/tab.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717
# along with this program. If not, see <http://www.gnu.org/licenses/>.
1818

1919
import locale
20+
import os
2021
import time
21-
from os.path import exists, splitext
22+
from os.path import dirname, exists, isdir, isfile, splitext
2223

2324
from markups import find_markup_class_by_name, get_markup_for_file_name
2425
from markups.common import MODULE_HOME_PAGE
@@ -52,6 +53,11 @@ class ReTextTab(QSplitter):
5253
def fileName(self):
5354
return self._fileName
5455

56+
@fileName.setter
57+
def fileName(self, newFileName):
58+
self._fileName = newFileName
59+
self.fileNameChanged.emit()
60+
5561
def __init__(self, parent, fileName, previewState=PreviewDisabled):
5662
super().__init__(Qt.Orientation.Horizontal, parent=parent)
5763
self.p = parent
@@ -527,7 +533,15 @@ def createFile(self, fileToCreate):
527533
return False
528534

529535
def autoSaveActive(self) -> bool:
530-
return (globalSettings.autoSave
531-
and not self.forceDisableAutoSave
532-
and self.fileName is not None
533-
and QFileInfo(self.fileName).isWritable())
536+
if not globalSettings.autoSave:
537+
return False
538+
if self.forceDisableAutoSave:
539+
return False
540+
if self.fileName is None:
541+
return False
542+
543+
if isfile(self.fileName):
544+
return os.access(self.fileName, os.W_OK)
545+
else:
546+
dirName = dirname(self.fileName)
547+
return isdir(dirName) and os.access(dirName, os.W_OK)

ReText/window.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -942,15 +942,15 @@ def openFile(self):
942942
def openFileWrapper(self, fileName):
943943
if not fileName:
944944
return
945-
fileName = QFileInfo(fileName).canonicalFilePath()
945+
fileName = os.path.abspath(fileName)
946946
exists = False
947947
for i, tab in enumerate(self.iterateTabs()):
948948
if tab.fileName == fileName:
949949
exists = True
950950
ex = i
951951
if exists:
952952
self.tabWidget.setCurrentIndex(ex)
953-
elif QFile.exists(fileName):
953+
else:
954954
noEmptyTab = (
955955
(self.ind is None) or
956956
self.currentTab.fileName or
@@ -966,7 +966,10 @@ def openFileWrapper(self, fileName):
966966
self.preview(True)
967967
if fileName:
968968
self.fileSystemWatcher.addPath(fileName)
969-
self.currentTab.readTextFromFile(fileName)
969+
if QFile.exists(fileName):
970+
self.currentTab.readTextFromFile(fileName)
971+
else:
972+
self.currentTab.fileName = fileName
970973
self.moveToTopOfRecentFileList(self.currentTab.fileName)
971974

972975
def showEncodingDialog(self):

tests/test_window.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,8 @@ def test_windowTitleAndTabs_afterLoadingFile(self, getOpenFileNamesMock):
166166
# Check that file is opened in the existing empty tab
167167
self.assertEqual(1, self.window.tabWidget.count())
168168
self.assertEqual('existing_file.md[*]', self.window.windowTitle())
169-
self.assertTrue(self.window.currentTab.fileName.endswith('tests/testdata/existing_file.md'))
169+
fileName = os.path.join('tests', 'testdata', 'existing_file.md')
170+
self.assertTrue(self.window.currentTab.fileName.endswith(fileName))
170171
self.assertEqual(self.window.tabWidget.tabText(0), 'existing_file')
171172
self.assertFalse(self.window.isWindowModified())
172173

@@ -224,7 +225,8 @@ def test_activeTab_afterLoadingFileThatIsAlreadyOpenInOtherTab(self, getOpenFile
224225

225226
# Check that we have indeed been switched back to the previous tab
226227
self.assertIs(self.window.currentTab, tab_with_file)
227-
self.assertTrue(self.window.currentTab.fileName.endswith('tests/testdata/existing_file.md'))
228+
fileName = os.path.join('tests', 'testdata', 'existing_file.md')
229+
self.assertTrue(self.window.currentTab.fileName.endswith(fileName))
228230

229231
def test_markupDependentWidgetStates_afterStartWithEmptyTabAndMarkdownAsDefaultMarkup(self):
230232
self.window = ReTextWindow()

0 commit comments

Comments
 (0)