From bbd5096de7ae486683e18a2645cc8cb255b80663 Mon Sep 17 00:00:00 2001 From: Jeep Kiddee Date: Fri, 21 Sep 2018 01:41:00 +0700 Subject: [PATCH] scm: support git submodule Fixes #1093 --- dvc/scm.py | 17 ++++++++++++++--- tests/basic_env.py | 9 +++++++++ tests/test_scm.py | 16 +++++++++++++++- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/dvc/scm.py b/dvc/scm.py index cb7bf107b..63333c716 100644 --- a/dvc/scm.py +++ b/dvc/scm.py @@ -22,6 +22,10 @@ class Base(object): def is_repo(root_dir): return True + @staticmethod + def is_submodule(root_dir): + return True + def ignore(self, path): pass @@ -98,8 +102,15 @@ class Git(Base): @staticmethod def is_repo(root_dir): - git_dir = os.path.join(root_dir, Git.GIT_DIR) - return os.path.isdir(git_dir) + return os.path.isdir(Git._get_git_dir(root_dir)) + + @staticmethod + def is_submodule(root_dir): + return os.path.isfile(Git._get_git_dir(root_dir)) + + @staticmethod + def _get_git_dir(root_dir): + return os.path.join(root_dir, Git.GIT_DIR) @property def dir(self): @@ -211,7 +222,7 @@ class Git(Base): def SCM(root_dir, no_scm=False, project=None): - if Git.is_repo(root_dir): + if Git.is_repo(root_dir) or Git.is_submodule(root_dir): return Git(root_dir, project=project) return Base(root_dir, project=project) diff --git a/tests/basic_env.py b/tests/basic_env.py index 2445f5afd..8c865a25d 100644 --- a/tests/basic_env.py +++ b/tests/basic_env.py @@ -61,6 +61,15 @@ class TestGit(TestDir): self.git.index.commit('add code') +class TestGitSubmodule(TestGit): + def setUp(self): + super(TestGitSubmodule, self).setUp() + subrepo = Repo.init() + subrepo_path = 'subrepo' + self.git.create_submodule(subrepo_path, subrepo_path, subrepo.git_dir) + self._pushd(subrepo_path) + + class TestDvc(TestGit): def setUp(self): super(TestDvc, self).setUp() diff --git a/tests/test_scm.py b/tests/test_scm.py index 9f7a4b51c..2e134c24c 100644 --- a/tests/test_scm.py +++ b/tests/test_scm.py @@ -4,7 +4,7 @@ from git import Repo from dvc.scm import SCM, Base, Git -from tests.basic_env import TestDir, TestGit +from tests.basic_env import TestDir, TestGit, TestGitSubmodule class TestSCM(TestDir): @@ -27,6 +27,20 @@ class TestSCMGit(TestGit): self.assertTrue('foo' in self.git.git.ls_files()) +class TestSCMGitSubmodule(TestGitSubmodule): + def test_git_submodule(self): + self.assertIsInstance(SCM(os.curdir), Git) + + def test_is_submodule(self): + self.assertTrue(Git.is_submodule(os.curdir)) + + def test_commit_in_submodule(self): + G = Git(self._root_dir) + G.add(['foo']) + G.commit('add') + self.assertTrue('foo' in self.git.git.ls_files()) + + class TestIgnore(TestGit): def _count_gitignore(self): with open(Git.GITIGNORE, 'r') as fd: