diff --git a/dvc/command/add.py b/dvc/command/add.py index f6f9ab2799..43a1d2b516 100644 --- a/dvc/command/add.py +++ b/dvc/command/add.py @@ -54,14 +54,7 @@ def add_parser(subparsers, parent_parser): help="Don't put files/directories into cache.", ) add_parser.add_argument( - "-f", - "--file", - help="Specify name of the stage file. It should be " - "either 'Dvcfile' or have a '.dvc' suffix (e.g. " - "'prepare.dvc', 'clean.dvc', etc) in order for " - "dvc to be able to find it later. By default " - "the output basename + .dvc is used as a stage filename. " - "(NOTE: It can't be used when specifying multiple targets)", + "-f", "--file", help="Specify name of the DVC file it generates." ) add_parser.add_argument( "targets", nargs="+", help="Input files/directories." diff --git a/dvc/command/imp.py b/dvc/command/imp.py index 726bb193c2..b549bac4e7 100644 --- a/dvc/command/imp.py +++ b/dvc/command/imp.py @@ -19,7 +19,9 @@ def run(self): out = self.args.out or default_out - self.repo.imp(self.args.url, out, self.args.resume) + self.repo.imp( + self.args.url, out, self.args.resume, fname=self.args.file + ) except DvcException: logger.exception( "failed to import {}. You could also try downloading " @@ -62,4 +64,7 @@ def add_parser(subparsers, parent_parser): import_parser.add_argument( "out", nargs="?", help="Destination path to put files to." ) + import_parser.add_argument( + "-f", "--file", help="Specify name of the DVC file it generates." + ) import_parser.set_defaults(func=CmdImport) diff --git a/dvc/command/run.py b/dvc/command/run.py index 3a69a88527..e711744eec 100644 --- a/dvc/command/run.py +++ b/dvc/command/run.py @@ -127,14 +127,7 @@ def add_parser(subparsers, parent_parser): "(do not put into DVC cache).", ) run_parser.add_argument( - "-f", - "--file", - help="Specify name of the stage file. It should be " - "either 'Dvcfile' or have a '.dvc' suffix (e.g. " - "'prepare.dvc', 'clean.dvc', etc) in order for " - "dvc to be able to find it later. By default " - "the first output basename + .dvc is used as " - "a stage filename.", + "-f", "--file", help="Specify name of the DVC file it generates." ) run_parser.add_argument( "-c", "--cwd", default=None, help="Deprecated, use -w and -f instead." diff --git a/dvc/repo/imp.py b/dvc/repo/imp.py index e317eb008f..acbbc4afd6 100644 --- a/dvc/repo/imp.py +++ b/dvc/repo/imp.py @@ -2,11 +2,13 @@ @scm_context -def imp(self, url, out, resume=False): +def imp(self, url, out, resume=False, fname=None): from dvc.stage import Stage with self.state: - stage = Stage.create(repo=self, cmd=None, deps=[url], outs=[out]) + stage = Stage.create( + repo=self, cmd=None, deps=[url], outs=[out], fname=fname + ) if stage is None: return None diff --git a/tests/func/test_import.py b/tests/func/test_import.py index 8d770cacd5..db908cf5ab 100644 --- a/tests/func/test_import.py +++ b/tests/func/test_import.py @@ -156,3 +156,31 @@ def test(self): self.assertEqual(0, ret) self.assertEqual(1, remove_outs_call_counter.mock.call_count) + + +class TestImportFilename(TestDvc): + def setUp(self): + super(TestImportFilename, self).setUp() + tmp_dir = self.mkdtemp() + self.external_source = os.path.join(tmp_dir, "file") + with open(self.external_source, "w") as fobj: + fobj.write("content") + + def test(self): + ret = main(["import", "-f", "bar.dvc", self.external_source]) + self.assertEqual(0, ret) + self.assertTrue(os.path.exists("bar.dvc")) + + os.remove("bar.dvc") + + ret = main(["import", "--file", "bar.dvc", self.external_source]) + self.assertEqual(0, ret) + self.assertTrue(os.path.exists("bar.dvc")) + + os.remove("bar.dvc") + os.mkdir("sub") + + path = os.path.join("sub", "bar.dvc") + ret = main(["import", "--file", path, self.external_source]) + self.assertEqual(0, ret) + self.assertTrue(os.path.exists(path))