Skip to content

Commit 37fc186

Browse files
committed
move: fix error message when dst stage file exists.
Closes #7240.
1 parent 61d5de5 commit 37fc186

2 files changed

Lines changed: 31 additions & 11 deletions

File tree

dvc/repo/move.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import os
22
from typing import TYPE_CHECKING
33

4-
from dvc.exceptions import MoveNotDataSourceError
54
from dvc.repo.scm_context import scm_context
65

76
from . import locked
@@ -38,7 +37,9 @@ def move(self: "Repo", from_path, to_path):
3837
"""
3938
from dvc import dependency, output
4039
from dvc.dvcfile import DVC_FILE_SUFFIX
40+
from dvc.exceptions import MoveNotDataSourceError
4141
from dvc.stage import Stage
42+
from dvc.stage.exceptions import StageFileAlreadyExistsError
4243
from dvc_objects.fs.local import LocalFileSystem
4344

4445
from_out = output.loads_from(Stage(self), [from_path])[0]
@@ -64,16 +65,20 @@ def move(self: "Repo", from_path, to_path):
6465
)
6566
new_wdir = os.path.abspath(os.path.join(os.curdir, os.path.dirname(to_path)))
6667
to_path = os.path.relpath(to_path, new_wdir)
67-
new_stage = self.stage.create(
68-
single_stage=True,
69-
fname=new_fname,
70-
wdir=new_wdir,
71-
outs=[to_path],
72-
meta=stage.meta,
73-
frozen=stage.frozen,
74-
always_changed=stage.always_changed,
75-
desc=stage.desc,
76-
)
68+
try:
69+
new_stage = self.stage.create(
70+
single_stage=True,
71+
fname=new_fname,
72+
wdir=new_wdir,
73+
outs=[to_path],
74+
meta=stage.meta,
75+
frozen=stage.frozen,
76+
always_changed=stage.always_changed,
77+
desc=stage.desc,
78+
)
79+
except StageFileAlreadyExistsError:
80+
# reraise to remove `--force` hint
81+
raise StageFileAlreadyExistsError(f"{new_fname!r} already exists") from None
7782
else:
7883
new_stage = stage
7984
to_path = os.path.relpath(to_path, stage.wdir)

tests/func/test_move.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from dvc.cli import main
88
from dvc.exceptions import MoveNotDataSourceError, OutputNotFoundError
9+
from dvc.stage.exceptions import StageFileAlreadyExistsError
910

1011

1112
def test_move(tmp_dir, dvc, scm):
@@ -382,3 +383,17 @@ def test_all_metadata_are_preserved(tmp_dir, dvc, make_tmp_dir, path_func):
382383
contents["deps"][0] |= {"path": expected_path}
383384
contents |= {"md5": stage.md5}
384385
assert new_dvcfile.parse() == contents
386+
387+
388+
def test_move_dst_stage_file_already_exists(tmp_dir, dvc):
389+
tmp_dir.dvc_gen({"foo": "foo", "bar": "bar"})
390+
391+
with pytest.raises(StageFileAlreadyExistsError) as exc_info:
392+
dvc.move("foo", "bar")
393+
assert str(exc_info.value) == "'bar.dvc' already exists"
394+
assert exc_info.value.__cause__ is None
395+
396+
assert (tmp_dir / "foo").exists()
397+
assert (tmp_dir / "foo.dvc").exists()
398+
assert (tmp_dir / "bar").exists()
399+
assert (tmp_dir / "bar.dvc").exists()

0 commit comments

Comments
 (0)