mirror of
https://github.com/Stone-Red-Code/dvc.git
synced 2026-11-02 07:18:25 +01:00
Update duplicate output error msg (#9138)
* update dup output error msg * update dup output error msg * stage add: add test for duplicated output error msg * cleanup OutputDuplicationError code
This commit is contained in:
+9
-4
@@ -31,14 +31,19 @@ class OutputDuplicationError(DvcException):
|
||||
|
||||
assert isinstance(output, str)
|
||||
assert all(hasattr(stage, "relpath") for stage in stages)
|
||||
msg = ""
|
||||
stage_names = [s.addressing for s in stages]
|
||||
stages_str = " ".join(stage_names)
|
||||
if len(stages) == 1:
|
||||
msg = "output '{}' is already specified in {}.".format(
|
||||
output, first(stages)
|
||||
)
|
||||
stage_name = first(stages)
|
||||
msg = f"output '{output}' is already specified in {stage_name}."
|
||||
else:
|
||||
msg = "output '{}' is already specified in stages:\n{}".format(
|
||||
output, "\n".join(f"\t- {s.addressing}" for s in stages)
|
||||
output, "\n".join(f"\t- {s}" for s in stage_names)
|
||||
)
|
||||
msg += (
|
||||
f"\nUse `dvc remove {stages_str}` to stop tracking the overlapping output."
|
||||
)
|
||||
super().__init__(msg)
|
||||
self.stages = stages
|
||||
self.output = output
|
||||
|
||||
+11
-2
@@ -5,7 +5,11 @@ from contextlib import suppress
|
||||
from functools import wraps
|
||||
from typing import Iterable, List, NamedTuple, Optional, Set, Tuple, Union
|
||||
|
||||
from dvc.exceptions import NoOutputOrStageError, OutputNotFoundError
|
||||
from dvc.exceptions import (
|
||||
NoOutputOrStageError,
|
||||
OutputDuplicationError,
|
||||
OutputNotFoundError,
|
||||
)
|
||||
from dvc.repo import lock_repo
|
||||
from dvc.ui import ui
|
||||
from dvc.utils import as_posix, parse_target
|
||||
@@ -176,7 +180,12 @@ class StageLoad:
|
||||
|
||||
check_stage_exists(self.repo, stage, stage.path)
|
||||
|
||||
self.repo.check_graph(stages={stage})
|
||||
try:
|
||||
self.repo.check_graph(stages={stage})
|
||||
except OutputDuplicationError as exc:
|
||||
# Don't include the stage currently being added.
|
||||
exc.stages.remove(stage)
|
||||
raise OutputDuplicationError(exc.output, exc.stages) from None
|
||||
|
||||
restore_fields(stage)
|
||||
return stage
|
||||
|
||||
@@ -4,6 +4,7 @@ import pytest
|
||||
|
||||
from dvc.annotations import Annotation
|
||||
from dvc.dvcfile import SingleStageFile
|
||||
from dvc.exceptions import OutputDuplicationError
|
||||
from dvc.fs import LocalFileSystem
|
||||
from dvc.output import Output
|
||||
from dvc.repo import Repo, lock_repo
|
||||
@@ -333,3 +334,14 @@ def test_stage_run_checkpoint(tmp_dir, dvc, mocker, checkpoint):
|
||||
mock_cmd_run.assert_called_with(
|
||||
stage, checkpoint_func=callback, dry=False, run_env=None
|
||||
)
|
||||
|
||||
|
||||
def test_stage_add_duplicated_output(tmp_dir, dvc):
|
||||
tmp_dir.dvc_gen("foo", "foo")
|
||||
dvc.add("foo")
|
||||
|
||||
with pytest.raises(
|
||||
OutputDuplicationError,
|
||||
match="Use `dvc remove foo.dvc` to stop tracking the overlapping output.",
|
||||
):
|
||||
dvc.stage.add(name="duplicated", cmd="echo bar > foo", outs=["foo"])
|
||||
|
||||
Reference in New Issue
Block a user