Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion dvc/command/pkg.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@ class CmdPkgInstall(CmdBase):
def run(self):
try:
self.repo.pkg.install(
self.args.url, version=self.args.version, name=self.args.name
self.args.url,
version=self.args.version,
name=self.args.name,
force=self.args.force,
)
return 0
except DvcException:
Expand Down Expand Up @@ -113,6 +116,13 @@ def add_parser(subparsers, parent_parser):
"from URL."
),
)
pkg_install_parser.add_argument(
"-f",
"--force",
action="store_true",
default=False,
help="Reinstall package if it is already installed.",
)
pkg_install_parser.set_defaults(func=CmdPkgInstall)

PKG_UNINSTALL_HELP = "Uninstall package(s)."
Expand Down
18 changes: 10 additions & 8 deletions dvc/pkg.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,17 @@ def repo(self):
def installed(self):
return os.path.exists(self.path)

def install(self, cache_dir=None):
def install(self, cache_dir=None, force=False):
import git

if self.installed:
logger.info(
"Skipping installing '{}'('{}') as it is already "
"installed.".format(self.name, self.url)
)
return
if not force:
logger.info(
"Skipping installing '{}'('{}') as it is already "
"installed.".format(self.name, self.url)
)
return
self.uninstall()

git.Repo.clone_from(
self.url, self.path, depth=1, no_single_branch=True
Expand Down Expand Up @@ -113,9 +115,9 @@ def __init__(self, repo):
self.pkg_dir = os.path.join(repo.dvc_dir, self.PKG_DIR)
self.cache_dir = repo.cache.local.cache_dir

def install(self, url, **kwargs):
def install(self, url, force=False, **kwargs):
pkg = Pkg(self.pkg_dir, url=url, **kwargs)
pkg.install(cache_dir=self.cache_dir)
pkg.install(cache_dir=self.cache_dir, force=force)

def uninstall(self, name):
pkg = Pkg(self.pkg_dir, name=name)
Expand Down
18 changes: 18 additions & 0 deletions tests/func/test_pkg.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,24 @@ def test_uninstall_corrupted(repo_dir, dvc_repo):
assert not os.path.exists(mypkg_dir)


def test_force_install(repo_dir, dvc_repo, pkg):
name = os.path.basename(pkg.root_dir)
pkg_dir = os.path.join(repo_dir.root_dir, ".dvc", "pkg")
mypkg_dir = os.path.join(pkg_dir, name)

os.makedirs(mypkg_dir)

dvc_repo.pkg.install(pkg.root_dir)
assert not os.listdir(mypkg_dir)

dvc_repo.pkg.install(pkg.root_dir, force=True)
assert os.path.exists(pkg_dir)
assert os.path.isdir(pkg_dir)
assert os.path.exists(mypkg_dir)
assert os.path.isdir(mypkg_dir)
assert os.path.isdir(os.path.join(mypkg_dir, ".git"))


def test_install_version(repo_dir, dvc_repo, pkg):
name = os.path.basename(pkg.root_dir)
pkg_dir = os.path.join(repo_dir.root_dir, ".dvc", "pkg")
Expand Down
15 changes: 13 additions & 2 deletions tests/unit/command/test_pkg.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,16 @@

def test_pkg_install(mocker, dvc_repo):
args = parse_args(
["pkg", "install", "url", "--version", "version", "--name", "name"]
[
"pkg",
"install",
"url",
"--version",
"version",
"--name",
"name",
"--force",
]
)
assert args.func == CmdPkgInstall

Expand All @@ -14,7 +23,9 @@ def test_pkg_install(mocker, dvc_repo):

assert cmd.run() == 0

m.assert_called_once_with("url", version="version", name="name")
m.assert_called_once_with(
"url", version="version", name="name", force=True
)


def test_pkg_uninstall(mocker, dvc_repo):
Expand Down