Skip to content

Commit 531c29d

Browse files
committed
FIX: Error during version check trying to access read-only file systems
Adds a bugfix and a test-case. Close #1777.
1 parent 8353080 commit 531c29d

File tree

2 files changed

+31
-13
lines changed

2 files changed

+31
-13
lines changed

fmriprep/cli/tests/test_version.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,17 @@ def mock_get(*args, **kwargs):
161161
assert reason == test_reason
162162
else:
163163
assert reason is None
164+
165+
166+
def test_readonly(tmp_path, monkeypatch):
167+
"""Test behavior when $HOME/.cache/fmriprep/latest can't be written out."""
168+
monkeypatch.setenv('HOME', str(tmp_path))
169+
cachedir = tmp_path / '.cache'
170+
cachedir.mkdir(mode=0o555, exist_ok=True)
171+
172+
# Make sure creating the folder will raise the exception.
173+
with pytest.raises(OSError):
174+
(cachedir / 'fmriprep').mkdir()
175+
176+
# Should not raise
177+
check_latest()

fmriprep/cli/version.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,25 @@ def check_latest():
1919
date = None
2020
outdated = None
2121
cachefile = Path.home() / '.cache' / 'fmriprep' / 'latest'
22-
cachefile.parent.mkdir(parents=True, exist_ok=True)
23-
2422
try:
25-
latest, date = cachefile.read_text().split('|')
26-
except Exception:
27-
pass
28-
else:
23+
cachefile.parent.mkdir(parents=True, exist_ok=True)
24+
except OSError:
25+
cachefile = None
26+
27+
if cachefile and cachefile.exists():
2928
try:
30-
latest = Version(latest)
31-
date = datetime.strptime(date, DATE_FMT)
32-
except (InvalidVersion, ValueError):
33-
latest = None
29+
latest, date = cachefile.read_text().split('|')
30+
except Exception:
31+
pass
3432
else:
35-
if abs((datetime.now() - date).days) > RELEASE_EXPIRY_DAYS:
36-
outdated = True
33+
try:
34+
latest = Version(latest)
35+
date = datetime.strptime(date, DATE_FMT)
36+
except (InvalidVersion, ValueError):
37+
latest = None
38+
else:
39+
if abs((datetime.now() - date).days) > RELEASE_EXPIRY_DAYS:
40+
outdated = True
3741

3842
if latest is None or outdated is True:
3943
try:
@@ -49,7 +53,7 @@ def check_latest():
4953
else:
5054
latest = None
5155

52-
if latest is not None:
56+
if cachefile is not None and latest is not None:
5357
try:
5458
cachefile.write_text('|'.join(('%s' % latest, datetime.now().strftime(DATE_FMT))))
5559
except Exception:

0 commit comments

Comments
 (0)