def _get_file(self, _repo_type, repo_url, version, filename): """ Fetch the file specificed by filename relative to the root of the repository""" name = simplify_repo_name(repo_url) repo_path = os.path.join(self._cache_location, name) client = GitClient(repo_path) # using git only updated = False if client.path_exists(): if client.get_url() == repo_url: if not self._skip_update: logging.disable(logging.WARNING) updated = client.update(version, force_fetch=True) logging.disable(logging.NOTSET) else: try: # catch exception which can be caused by calling internal API logging.disable(logging.WARNING) updated = client._do_update(version) logging.disable(logging.NOTSET) except GitError: updated = False if not updated: shutil.rmtree(repo_path) if not updated: logging.disable(logging.WARNING) updated = client.checkout(repo_url, version) logging.disable(logging.NOTSET) if not updated: raise VcsError("Impossible to update/checkout repo '%s' with version '%s'." % (repo_url, version)) full_filename = os.path.join(repo_path, filename) if not os.path.exists(full_filename): raise VcsError("Requested file '%s' missing from repo '%s' version '%s' (viewed at version '%s'). It was expected at: %s" % (filename, repo_url, version, client.get_version(), full_filename)) return full_filename
def test_export_master(self): url = self.remote_path client = GitClient(self.local_path) subclient = GitClient(self.sublocal_path) subsubclient = GitClient(self.subsublocal_path) self.assertFalse(client.path_exists()) self.assertFalse(client.detect_presence()) self.assertFalse(os.path.exists(self.export_path)) self.assertTrue(client.checkout(url)) self.assertTrue(client.path_exists()) self.assertTrue(subclient.path_exists()) self.assertTrue(subsubclient.path_exists()) tarpath = client.export_repository("master", self.export_path) self.assertEqual(tarpath, self.export_path + '.tar.gz') os.mkdir(self.export_path) with closing(tarfile.open(tarpath, "r:gz")) as tarf: tarf.extractall(self.export_path) subsubdirdiff = filecmp.dircmp(self.subsubexport_path, self.subsublocal_path, ignore=['.git', '.gitmodules']) self.assertEqual(subsubdirdiff.left_only, []) self.assertEqual(subsubdirdiff.right_only, []) self.assertEqual(subsubdirdiff.diff_files, []) subdirdiff = filecmp.dircmp(self.subexport_path, self.sublocal_path, ignore=['.git', '.gitmodules']) self.assertEqual(subdirdiff.left_only, []) self.assertEqual(subdirdiff.right_only, []) self.assertEqual(subdirdiff.diff_files, []) dirdiff = filecmp.dircmp(self.export_path, self.local_path, ignore=['.git', '.gitmodules']) self.assertEqual(dirdiff.left_only, []) self.assertEqual(dirdiff.right_only, []) self.assertEqual(dirdiff.diff_files, [])
def test_switch_branches(self): url = self.remote_path client = GitClient(self.local_path) subclient = GitClient(self.sublocal_path) subclient2 = GitClient(self.sublocal2_path) subsubclient = GitClient(self.subsublocal_path) subsubclient2 = GitClient(self.subsublocal2_path) self.assertFalse(client.path_exists()) self.assertFalse(client.detect_presence()) self.assertTrue(client.checkout(url)) self.assertTrue(client.path_exists()) self.assertTrue(subclient.path_exists()) self.assertTrue(subsubclient.path_exists()) self.assertFalse(subclient2.path_exists()) new_version = "test_branch" self.assertTrue(client.update(new_version)) # checking that update doesnt make submodule disappear (git default behavior) self.assertTrue(subclient2.path_exists()) self.assertTrue(subsubclient2.path_exists()) self.assertTrue(subclient.path_exists()) self.assertTrue(subsubclient.path_exists()) oldnew_version = "master" self.assertTrue(client.update(oldnew_version)) # checking that update doesnt make submodule2 disappear (git default behavior) self.assertTrue(subclient2.path_exists()) self.assertTrue(subsubclient2.path_exists()) self.assertTrue(subclient.path_exists()) self.assertTrue(subsubclient.path_exists())
def _get_file(self, repo_type, repo_url, version, filename): """ Fetch the file specificed by filename relative to the root of the repository""" name = simplify_repo_name(repo_url) repo_path = os.path.join(self._cache_location, name) #client = VcsClient(repo_type, repo_path) client = GitClient(repo_path) # using git only updated = False if client.path_exists(): if client.get_url() == repo_url: if not self._skip_update: updated = client.update(version, force_fetch=True) else: updated = client._do_update(version) if not updated: shutil.rmtree(repo_path) if not updated: updated = client.checkout(repo_url, version, shallow=True) if not updated: raise VcsError("Impossible to update/checkout repo '%s' with version '%s'." % (repo_url, version)) full_filename = os.path.join(repo_path, filename) if not os.path.exists(full_filename): raise VcsError("Requested file '%s' missing from repo '%s' version '%s' (viewed at version '%s'). It was expected at: %s" % (filename, repo_url, version, client.get_version(), full_filename)) return full_filename
def test_status(self): url = self.remote_path client = GitClient(self.local_path) self.assertTrue(client.checkout(url)) output = client.get_status() self.assertEqual('', output, output) with open(os.path.join(self.local_path, 'fixed.txt'), 'a') as f: f.write('0123456789abcdef') subprocess.check_call("touch new.txt", shell=True, cwd=self.local_path) with open(os.path.join(self.sublocal_path, 'subfixed.txt'), 'a') as f: f.write('abcdef0123456789') subprocess.check_call("touch subnew.txt", shell=True, cwd=self.sublocal_path) with open(os.path.join(self.subsublocal_path, 'subsubfixed.txt'), 'a') as f: f.write('012345cdef') subprocess.check_call("touch subsubnew.txt", shell=True, cwd=self.subsublocal_path) output = client.get_status() self.assertEqual(' M ./fixed.txt\n M ./submodule\n M ./subfixed.txt\n M ./subsubmodule\n M ./subsubfixed.txt', output.rstrip()) output = client.get_status(untracked = True) self.assertEqual(' M ./fixed.txt\n M ./submodule\n?? ./new.txt\n M ./subfixed.txt\n M ./subsubmodule\n?? ./subnew.txt\n M ./subsubfixed.txt\n?? ./subsubnew.txt', output.rstrip()) output = client.get_status(basepath=os.path.dirname(self.local_path), untracked = True) self.assertEqual(' M local/fixed.txt\n M local/submodule\n?? local/new.txt\n M local/subfixed.txt\n M local/subsubmodule\n?? local/subnew.txt\n M local/subsubfixed.txt\n?? local/subsubnew.txt', output.rstrip())
def test_diff(self): url = self.remote_path client = GitClient(self.local_path) self.assertTrue(client.checkout(url)) output = client.get_diff() self.assertEqual('', output, output) with open(os.path.join(self.local_path, 'fixed.txt'), 'a') as f: f.write('0123456789abcdef') subprocess.check_call("touch new.txt", shell=True, cwd=self.local_path) with open(os.path.join(self.sublocal_path, 'subfixed.txt'), 'a') as f: f.write('abcdef0123456789') subprocess.check_call("touch subnew.txt", shell=True, cwd=self.sublocal_path) with open(os.path.join(self.subsublocal_path, 'subsubfixed.txt'), 'a') as f: f.write('012345cdef') subprocess.check_call("touch subsubnew.txt", shell=True, cwd=self.subsublocal_path) output = client.get_diff() self.assertEqual(1094, len(output)) self.assertTrue('diff --git ./fixed.txt ./fixed.txt\nindex e69de29..454f6b3 100644\n--- ./fixed.txt\n+++ ./fixed.txt\n@@ -0,0 +1 @@\n+0123456789abcdef\n\\ No newline at end of file' in output) self.assertTrue('diff --git ./submodule/subsubmodule/subsubfixed.txt ./submodule/subsubmodule/subsubfixed.txt\nindex e69de29..1a332dc 100644\n--- ./submodule/subsubmodule/subsubfixed.txt\n+++ ./submodule/subsubmodule/subsubfixed.txt\n@@ -0,0 +1 @@\n+012345cdef\n\\ No newline at end of file' in output) output = client.get_diff(basepath=os.path.dirname(self.local_path)) self.assertEqual(1174, len(output)) self.assertTrue('diff --git local/fixed.txt local/fixed.txt\nindex e69de29..454f6b3 100644\n--- local/fixed.txt\n+++ local/fixed.txt\n@@ -0,0 +1 @@\n+0123456789abcdef\n\ No newline at end of file' in output, output) self.assertTrue('diff --git local/submodule/subsubmodule/subsubfixed.txt local/submodule/subsubmodule/subsubfixed.txt\nindex e69de29..1a332dc 100644\n--- local/submodule/subsubmodule/subsubfixed.txt\n+++ local/submodule/subsubmodule/subsubfixed.txt\n@@ -0,0 +1 @@\n+012345cdef\n\ No newline at end of file' in output, output)
def test_export_hash(self): url = self.remote_path client = GitClient(self.local_path) subclient = GitClient(self.sublocal_path) subclient2 = GitClient(self.sublocal2_path) subsubclient = GitClient(self.subsublocal_path) subsubclient2 = GitClient(self.subsublocal2_path) self.assertFalse(client.path_exists()) self.assertFalse(client.detect_presence()) self.assertFalse(os.path.exists(self.export_path)) self.assertTrue(client.checkout(url, version='master')) self.assertTrue(client.path_exists()) self.assertTrue(subclient.path_exists()) self.assertTrue(subsubclient.path_exists()) self.assertFalse(subclient2.path_exists()) self.assertFalse(subsubclient2.path_exists()) # we need first to retrieve locally the hash we want to export self.assertTrue(client.update(version=self.version_test)) self.assertTrue(client.path_exists()) # git leaves old submodule around by default self.assertTrue(subclient.path_exists()) self.assertTrue(subsubclient.path_exists()) # new submodule should be there self.assertTrue(subclient2.path_exists()) self.assertTrue(subsubclient2.path_exists()) tarpath = client.export_repository(self.version_test, self.export_path) self.assertEqual(tarpath, self.export_path + '.tar.gz') os.mkdir(self.export_path) with closing(tarfile.open(tarpath, "r:gz")) as tarf: tarf.extractall(self.export_path) # Checking that we have only submodule2 in our export self.assertFalse(os.path.exists(self.subexport_path)) self.assertFalse(os.path.exists(self.subsubexport_path)) self.assertTrue(os.path.exists(self.subexport2_path)) self.assertTrue(os.path.exists(self.subsubexport2_path)) # comparing with version_test ( currently checked-out ) subsubdirdiff = filecmp.dircmp(self.subsubexport2_path, self.subsublocal_path, ignore=['.git', '.gitmodules']) self.assertEqual(subsubdirdiff.left_only, []) # same subsubfixed.txt in both subsubmodule/ self.assertEqual(subsubdirdiff.right_only, []) self.assertEqual(subsubdirdiff.diff_files, []) subdirdiff = filecmp.dircmp(self.subexport2_path, self.sublocal_path, ignore=['.git', '.gitmodules']) self.assertEqual(subdirdiff.left_only, []) self.assertEqual(subdirdiff.right_only, []) self.assertEqual(subdirdiff.diff_files, []) dirdiff = filecmp.dircmp(self.export_path, self.local_path, ignore=['.git', '.gitmodules']) self.assertEqual(dirdiff.left_only, []) # submodule is still there on local_path (git default behavior) self.assertEqual(dirdiff.right_only, ['submodule']) self.assertEqual(dirdiff.diff_files, [])
def test_status(self): url = self.repo_path client = GitClient(self.local_path) self.assertTrue(client.checkout(url)) output = client.get_status( porcelain=True) # porcelain=True ensures stable format self.assertEqual('', output, "Expected empty string, got `{0}`".format(output)) with open(os.path.join(self.local_path, 'fixed.txt'), 'a') as f: f.write('0123456789abcdef') subprocess.check_call("touch new.txt", shell=True, cwd=self.local_path) with open(os.path.join(self.sublocal_path, 'subfixed.txt'), 'a') as f: f.write('abcdef0123456789') subprocess.check_call("touch subnew.txt", shell=True, cwd=self.sublocal_path) with open(os.path.join(self.subsublocal_path, 'subsubfixed.txt'), 'a') as f: f.write('012345cdef') subprocess.check_call("touch subsubnew.txt", shell=True, cwd=self.subsublocal_path) output = client.get_status( porcelain=True) # porcelain=True ensures stable format self.assertEqual( '''\ M ./fixed.txt M ./submodule M ./subfixed.txt M ./subsubmodule M ./subsubfixed.txt''', output.rstrip()) output = client.get_status(untracked=True, porcelain=True) self.assertEqual( '''\ M ./fixed.txt M ./submodule ?? ./new.txt M ./subfixed.txt M ./subsubmodule ?? ./subnew.txt M ./subsubfixed.txt ?? ./subsubnew.txt''', output.rstrip()) output = client.get_status(basepath=os.path.dirname(self.local_path), untracked=True, porcelain=True) self.assertEqual( '''\ M local/fixed.txt M local/submodule ?? local/new.txt M local/subfixed.txt M local/subsubmodule ?? local/subnew.txt M local/subsubfixed.txt ?? local/subsubnew.txt''', output.rstrip())
def test_diff(self): url = self.repo_path client = GitClient(self.local_path) self.assertTrue(client.checkout(url)) output = client.get_diff() self.assertEqual('', output, output) with open(os.path.join(self.local_path, 'fixed.txt'), 'a') as f: f.write('0123456789abcdef') _touch(os.path.join(self.local_path, "new.txt")) with open(os.path.join(self.sublocal_path, 'subfixed.txt'), 'a') as f: f.write('abcdef0123456789') _touch(os.path.join(self.sublocal_path, "subnew.txt")) with open(os.path.join(self.subsublocal_path, 'subsubfixed.txt'), 'a') as f: f.write('012345cdef') _touch(os.path.join(self.subsublocal_path, "subsubnew.txt")) output = client.get_diff() self.assertEqual(1094, len(output)) self.assertTrue('''\ diff --git ./fixed.txt ./fixed.txt index e69de29..454f6b3 100644 --- ./fixed.txt +++ ./fixed.txt @@ -0,0 +1 @@ +0123456789abcdef \\ No newline at end of file''' in output) self.assertTrue('''\ diff --git ./submodule/subsubmodule/subsubfixed.txt ./submodule/subsubmodule/subsubfixed.txt index e69de29..1a332dc 100644 --- ./submodule/subsubmodule/subsubfixed.txt +++ ./submodule/subsubmodule/subsubfixed.txt @@ -0,0 +1 @@ +012345cdef \\ No newline at end of file''' in output) output = client.get_diff(basepath=os.path.dirname(self.local_path)) self.assertEqual(1174, len(output)) self.assertTrue('''\ diff --git local/fixed.txt local/fixed.txt index e69de29..454f6b3 100644 --- local/fixed.txt +++ local/fixed.txt @@ -0,0 +1 @@ +0123456789abcdef \ No newline at end of file''' in output, output) self.assertTrue(''' diff --git local/submodule/subsubmodule/subsubfixed.txt local/submodule/subsubmodule/subsubfixed.txt index e69de29..1a332dc 100644 --- local/submodule/subsubmodule/subsubfixed.txt +++ local/submodule/subsubmodule/subsubfixed.txt @@ -0,0 +1 @@ +012345cdef \ No newline at end of file''' in output, output)
def test_checkout_branch_with_subs(self): url = self.remote_path client = GitClient(self.local_path) subclient = GitClient(self.sublocal_path) subsubclient = GitClient(self.subsublocal_path) self.assertFalse(client.path_exists()) self.assertFalse(client.detect_presence()) self.assertTrue(client.checkout(url, version='test_branch')) self.assertTrue(client.path_exists()) self.assertTrue(client.detect_presence()) self.assertEqual(self.version_init, client.get_version()) self.assertFalse(subclient.path_exists())
def test_checkout_branch_with_subs(self): url = self.remote_path client = GitClient(self.local_path) subclient = GitClient(self.sublocal_path) subsubclient = GitClient(self.subsublocal_path) self.assertFalse(client.path_exists()) self.assertFalse(client.detect_presence()) self.assertTrue(client.checkout(url, refname='test_branch')) self.assertTrue(client.path_exists()) self.assertTrue(client.detect_presence()) self.assertEqual(self.version_init, client.get_version()) self.assertFalse(subclient.path_exists())
def test_switch_branches_retrieve_local_subcommit(self): url = self.remote_path client = GitClient(self.local_path) subclient = GitClient(self.sublocal_path) subclient2 = GitClient(self.sublocal2_path) subsubclient = GitClient(self.subsublocal_path) subsubclient2 = GitClient(self.subsublocal2_path) self.assertFalse(client.path_exists()) self.assertFalse(client.detect_presence()) self.assertTrue(client.checkout(url)) self.assertTrue(client.path_exists()) self.assertTrue(subclient.path_exists()) self.assertTrue(subsubclient.path_exists()) self.assertFalse(subclient2.path_exists()) new_version = "test_branch" self.assertTrue(client.update(new_version)) # checking that update doesnt make submodule disappear (git default behavior) self.assertTrue(subclient2.path_exists()) self.assertTrue(subsubclient2.path_exists()) self.assertTrue(subclient.path_exists()) self.assertTrue(subsubclient.path_exists()) subprocess.check_call("touch submodif.txt", shell=True, cwd=self.sublocal2_path) subprocess.check_call("git add submodif.txt", shell=True, cwd=self.sublocal2_path) subprocess.check_call("git commit -m submodif", shell=True, cwd=self.sublocal2_path) subprocess.check_call("git add submodule2", shell=True, cwd=self.local_path) subprocess.check_call("git commit -m submodule2_modif", shell=True, cwd=self.local_path) oldnew_version = "master" self.assertTrue(client.update(oldnew_version)) # checking that update doesnt make submodule2 disappear (git default behavior) self.assertTrue(subclient2.path_exists()) self.assertTrue(subsubclient2.path_exists()) self.assertTrue(subclient.path_exists()) self.assertTrue(subsubclient.path_exists()) self.assertTrue(client.update(new_version)) # checking that update still has submodule with submodif self.assertTrue(subclient2.path_exists()) self.assertTrue(subsubclient2.path_exists()) self.assertTrue(subclient.path_exists()) self.assertTrue(subsubclient.path_exists()) self.assertTrue( os.path.exists(os.path.join(self.sublocal2_path, "submodif.txt")))
def test_status(self): url = self.repo_path client = GitClient(self.local_path) self.assertTrue(client.checkout(url)) output = client.get_status(porcelain=True) # porcelain=True ensures stable format self.assertEqual('', output, "Expected empty string, got `{0}`".format(output)) with open(os.path.join(self.local_path, 'fixed.txt'), 'a') as f: f.write('0123456789abcdef') subprocess.check_call("touch new.txt", shell=True, cwd=self.local_path) with open(os.path.join(self.sublocal_path, 'subfixed.txt'), 'a') as f: f.write('abcdef0123456789') subprocess.check_call("touch subnew.txt", shell=True, cwd=self.sublocal_path) with open(os.path.join(self.subsublocal_path, 'subsubfixed.txt'), 'a') as f: f.write('012345cdef') subprocess.check_call("touch subsubnew.txt", shell=True, cwd=self.subsublocal_path) output = client.get_status(porcelain=True) # porcelain=True ensures stable format self.assertEqual('''\ M ./fixed.txt M ./submodule M ./subfixed.txt M ./subsubmodule M ./subsubfixed.txt''', output.rstrip()) output = client.get_status(untracked=True, porcelain=True) self.assertEqual('''\ M ./fixed.txt M ./submodule ?? ./new.txt M ./subfixed.txt M ./subsubmodule ?? ./subnew.txt M ./subsubfixed.txt ?? ./subsubnew.txt''', output.rstrip()) output = client.get_status( basepath=os.path.dirname(self.local_path), untracked=True, porcelain=True) self.assertEqual('''\ M local/fixed.txt M local/submodule ?? local/new.txt M local/subfixed.txt M local/subsubmodule ?? local/subnew.txt M local/subsubfixed.txt ?? local/subsubnew.txt''', output.rstrip())
def setUp(self): from vcstools.git import GitClient directory = tempfile.mkdtemp() self.directories = dict(setUp=directory) remote_path = os.path.join(directory, "remote") os.makedirs(remote_path) # create a "remote" repo subprocess.check_call(["git", "init"], cwd=remote_path) subprocess.check_call(["touch", "fixed.txt"], cwd=remote_path) subprocess.check_call(["git", "add", "*"], cwd=remote_path) subprocess.check_call(["git", "commit", "-m", "initial"], cwd=remote_path) subprocess.check_call(["git", "tag", "test_tag"], cwd=remote_path) po = subprocess.Popen( ["git", "log", "-n", "1", "--pretty=format:\"%H\""], cwd=remote_path, stdout=subprocess.PIPE) self.readonly_version_init = po.stdout.read().rstrip('"').lstrip('"') # files to be modified in "local" repo subprocess.check_call(["touch", "modified.txt"], cwd=remote_path) subprocess.check_call(["touch", "modified-fs.txt"], cwd=remote_path) subprocess.check_call(["git", "add", "*"], cwd=remote_path) subprocess.check_call(["git", "commit", "-m", "initial"], cwd=remote_path) po = subprocess.Popen( ["git", "log", "-n", "1", "--pretty=format:\"%H\""], cwd=remote_path, stdout=subprocess.PIPE) self.readonly_version_second = po.stdout.read().rstrip('"').lstrip('"') subprocess.check_call(["touch", "deleted.txt"], cwd=remote_path) subprocess.check_call(["touch", "deleted-fs.txt"], cwd=remote_path) subprocess.check_call(["git", "add", "*"], cwd=remote_path) subprocess.check_call(["git", "commit", "-m", "modified"], cwd=remote_path) po = subprocess.Popen( ["git", "log", "-n", "1", "--pretty=format:\"%H\""], cwd=remote_path, stdout=subprocess.PIPE) self.readonly_version = po.stdout.read().rstrip('"').lstrip('"') self.readonly_path = os.path.join(directory, "readonly") self.readonly_url = remote_path client = GitClient(self.readonly_path) self.assertTrue(client.checkout(remote_path, self.readonly_version))
def test_switch_branches(self): url = self.remote_path client = GitClient(self.local_path) subclient = GitClient(self.sublocal_path) subclient2 = GitClient(self.sublocal2_path) subsubclient = GitClient(self.subsublocal_path) self.assertFalse(client.path_exists()) self.assertFalse(client.detect_presence()) self.assertTrue(client.checkout(url)) self.assertTrue(client.path_exists()) self.assertTrue(subclient.path_exists()) self.assertTrue(subsubclient.path_exists()) self.assertFalse(subclient2.path_exists()) new_version = "test_branch2" self.assertTrue(client.update(new_version)) self.assertTrue(subclient2.path_exists())
def test_checkout_master_with_subs(self): url = self.remote_path client = GitClient(self.local_path) subclient = GitClient(self.sublocal_path) subsubclient = GitClient(self.subsublocal_path) self.assertFalse(client.path_exists()) self.assertFalse(client.detect_presence()) self.assertTrue(client.checkout(url)) self.assertTrue(client.path_exists()) self.assertTrue(client.detect_presence()) self.assertEqual(self.version_final, client.get_version()) self.assertTrue(subclient.path_exists()) self.assertTrue(subclient.detect_presence()) self.assertEqual(self.subversion_final, subclient.get_version()) self.assertTrue(subsubclient.path_exists()) self.assertTrue(subsubclient.detect_presence()) self.assertEqual(self.subsubversion_final, subsubclient.get_version())
def test_checkout_master_with_subs(self): url = self.remote_path client = GitClient(self.local_path) subclient = GitClient(self.sublocal_path) subsubclient = GitClient(self.subsublocal_path) subclient2 = GitClient(self.sublocal2_path) subsubclient2 = GitClient(self.subsublocal2_path) self.assertFalse(client.path_exists()) self.assertFalse(client.detect_presence()) self.assertTrue(client.checkout(url, version='master')) self.assertTrue(client.path_exists()) self.assertTrue(client.detect_presence()) self.assertEqual(self.version_final, client.get_version()) self.assertTrue(subclient.path_exists()) self.assertTrue(subsubclient.path_exists()) self.assertFalse(subclient2.path_exists()) self.assertFalse(subsubclient2.path_exists())
def test_checkout(self): from vcstools.git import GitClient directory = tempfile.mkdtemp() self.directories["checkout_test"] = directory local_path = os.path.join(directory, "ros") url = self.readonly_url client = GitClient(local_path) self.assertFalse(client.path_exists()) self.assertFalse(client.detect_presence()) self.assertFalse(client.detect_presence()) self.assertTrue(client.checkout(url)) self.assertTrue(client.path_exists()) self.assertTrue(client.detect_presence()) self.assertEqual(client.get_path(), local_path) self.assertEqual(client.get_url(), url) self.assertEqual(client.get_branch(), "master") self.assertEqual(client.get_branch_parent(), "master") #self.assertEqual(client.get_version(), '-r*') shutil.rmtree(directory) self.directories.pop("checkout_test")
def test_switch_branches_retrieve_local_subcommit(self): url = self.remote_path client = GitClient(self.local_path) subclient = GitClient(self.sublocal_path) subclient2 = GitClient(self.sublocal2_path) subsubclient = GitClient(self.subsublocal_path) subsubclient2 = GitClient(self.subsublocal2_path) self.assertFalse(client.path_exists()) self.assertFalse(client.detect_presence()) self.assertTrue(client.checkout(url)) self.assertTrue(client.path_exists()) self.assertTrue(subclient.path_exists()) self.assertTrue(subsubclient.path_exists()) self.assertFalse(subclient2.path_exists()) new_version = "test_branch" self.assertTrue(client.update(new_version)) # checking that update doesnt make submodule disappear (git default behavior) self.assertTrue(subclient2.path_exists()) self.assertTrue(subsubclient2.path_exists()) self.assertTrue(subclient.path_exists()) self.assertTrue(subsubclient.path_exists()) subprocess.check_call("touch submodif.txt", shell=True, cwd=self.sublocal2_path) subprocess.check_call("git add submodif.txt", shell=True, cwd=self.sublocal2_path) subprocess.check_call("git commit -m submodif", shell=True, cwd=self.sublocal2_path) subprocess.check_call("git add submodule2", shell=True, cwd=self.local_path) subprocess.check_call("git commit -m submodule2_modif", shell=True, cwd=self.local_path) oldnew_version = "master" self.assertTrue(client.update(oldnew_version)) # checking that update doesnt make submodule2 disappear (git default behavior) self.assertTrue(subclient2.path_exists()) self.assertTrue(subsubclient2.path_exists()) self.assertTrue(subclient.path_exists()) self.assertTrue(subsubclient.path_exists()) self.assertTrue(client.update(new_version)) # checking that update still has submodule with submodif self.assertTrue(subclient2.path_exists()) self.assertTrue(subsubclient2.path_exists()) self.assertTrue(subclient.path_exists()) self.assertTrue(subsubclient.path_exists()) self.assertTrue(os.path.exists(os.path.join(self.sublocal2_path, "submodif.txt")))
def _get_file(self, _repo_type, repo_url, version, filename): """ Fetch the file specificed by filename relative to the root of the repository""" name = simplify_repo_name(repo_url) repo_path = os.path.join(self._cache_location, name) client = GitClient(repo_path) # using git only updated = False if client.path_exists(): if client.get_url() == repo_url: if not self._skip_update: logging.disable(logging.WARNING) updated = client.update(version, force_fetch=True) logging.disable(logging.NOTSET) else: try: # catch exception which can be caused by calling internal API logging.disable(logging.WARNING) updated = client._do_update(version) logging.disable(logging.NOTSET) except GitError: updated = False if not updated: shutil.rmtree(repo_path) if not updated: logging.disable(logging.WARNING) updated = client.checkout(repo_url, version) logging.disable(logging.NOTSET) if not updated: raise VcsError( "Impossible to update/checkout repo '%s' with version '%s'." % (repo_url, version)) full_filename = os.path.join(repo_path, filename) if not os.path.exists(full_filename): raise VcsError( "Requested file '%s' missing from repo '%s' version '%s' (viewed at version '%s'). It was expected at: %s" % (filename, repo_url, version, client.get_version(), full_filename)) return full_filename
def test_diff(self): url = self.remote_path client = GitClient(self.local_path) self.assertTrue(client.checkout(url)) output = client.get_diff() self.assertEqual('', output, output) with open(os.path.join(self.local_path, 'fixed.txt'), 'a') as f: f.write('0123456789abcdef') subprocess.check_call("touch new.txt", shell=True, cwd=self.local_path) with open(os.path.join(self.sublocal_path, 'subfixed.txt'), 'a') as f: f.write('abcdef0123456789') subprocess.check_call("touch subnew.txt", shell=True, cwd=self.sublocal_path) with open(os.path.join(self.subsublocal_path, 'subsubfixed.txt'), 'a') as f: f.write('012345cdef') subprocess.check_call("touch subsubnew.txt", shell=True, cwd=self.subsublocal_path) output = client.get_diff() self.assertEqual(1094, len(output)) self.assertTrue( 'diff --git ./fixed.txt ./fixed.txt\nindex e69de29..454f6b3 100644\n--- ./fixed.txt\n+++ ./fixed.txt\n@@ -0,0 +1 @@\n+0123456789abcdef\n\\ No newline at end of file' in output) self.assertTrue( 'diff --git ./submodule/subsubmodule/subsubfixed.txt ./submodule/subsubmodule/subsubfixed.txt\nindex e69de29..1a332dc 100644\n--- ./submodule/subsubmodule/subsubfixed.txt\n+++ ./submodule/subsubmodule/subsubfixed.txt\n@@ -0,0 +1 @@\n+012345cdef\n\\ No newline at end of file' in output) output = client.get_diff(basepath=os.path.dirname(self.local_path)) self.assertEqual(1174, len(output)) self.assertTrue( 'diff --git local/fixed.txt local/fixed.txt\nindex e69de29..454f6b3 100644\n--- local/fixed.txt\n+++ local/fixed.txt\n@@ -0,0 +1 @@\n+0123456789abcdef\n\ No newline at end of file' in output, output) self.assertTrue( 'diff --git local/submodule/subsubmodule/subsubfixed.txt local/submodule/subsubmodule/subsubfixed.txt\nindex e69de29..1a332dc 100644\n--- local/submodule/subsubmodule/subsubfixed.txt\n+++ local/submodule/subsubmodule/subsubfixed.txt\n@@ -0,0 +1 @@\n+012345cdef\n\ No newline at end of file' in output, output)
def setUp(self): from vcstools.git import GitClient directory = tempfile.mkdtemp() self.directories = dict(setUp=directory) remote_path = os.path.join(directory, "remote") os.makedirs(remote_path) # create a "remote" repo subprocess.check_call(["git", "init"], cwd=remote_path) subprocess.check_call(["touch", "fixed.txt"], cwd=remote_path) subprocess.check_call(["git", "add", "*"], cwd=remote_path) subprocess.check_call(["git", "commit", "-m", "initial"], cwd=remote_path) subprocess.check_call(["git", "tag", "test_tag"], cwd=remote_path) po = subprocess.Popen(["git", "log", "-n", "1", "--pretty=format:\"%H\""], cwd=remote_path, stdout=subprocess.PIPE) self.readonly_version_init = po.stdout.read().rstrip('"').lstrip('"') # files to be modified in "local" repo subprocess.check_call(["touch", "modified.txt"], cwd=remote_path) subprocess.check_call(["touch", "modified-fs.txt"], cwd=remote_path) subprocess.check_call(["git", "add", "*"], cwd=remote_path) subprocess.check_call(["git", "commit", "-m", "initial"], cwd=remote_path) po = subprocess.Popen(["git", "log", "-n", "1", "--pretty=format:\"%H\""], cwd=remote_path, stdout=subprocess.PIPE) self.readonly_version_second = po.stdout.read().rstrip('"').lstrip('"') subprocess.check_call(["touch", "deleted.txt"], cwd=remote_path) subprocess.check_call(["touch", "deleted-fs.txt"], cwd=remote_path) subprocess.check_call(["git", "add", "*"], cwd=remote_path) subprocess.check_call(["git", "commit", "-m", "modified"], cwd=remote_path) po = subprocess.Popen(["git", "log", "-n", "1", "--pretty=format:\"%H\""], cwd=remote_path, stdout=subprocess.PIPE) self.readonly_version = po.stdout.read().rstrip('"').lstrip('"') self.readonly_path = os.path.join(directory, "readonly") self.readonly_url = remote_path client = GitClient(self.readonly_path) self.assertTrue(client.checkout(remote_path, self.readonly_version))
def test_status(self): url = self.remote_path client = GitClient(self.local_path) self.assertTrue(client.checkout(url)) output = client.get_status() self.assertEqual('', output, output) with open(os.path.join(self.local_path, 'fixed.txt'), 'a') as f: f.write('0123456789abcdef') subprocess.check_call("touch new.txt", shell=True, cwd=self.local_path) with open(os.path.join(self.sublocal_path, 'subfixed.txt'), 'a') as f: f.write('abcdef0123456789') subprocess.check_call("touch subnew.txt", shell=True, cwd=self.sublocal_path) with open(os.path.join(self.subsublocal_path, 'subsubfixed.txt'), 'a') as f: f.write('012345cdef') subprocess.check_call("touch subsubnew.txt", shell=True, cwd=self.subsublocal_path) output = client.get_status() self.assertEqual( ' M ./fixed.txt\n M ./submodule\n M ./subfixed.txt\n M ./subsubmodule\n M ./subsubfixed.txt', output.rstrip()) output = client.get_status(untracked=True) self.assertEqual( ' M ./fixed.txt\n M ./submodule\n?? ./new.txt\n M ./subfixed.txt\n M ./subsubmodule\n?? ./subnew.txt\n M ./subsubfixed.txt\n?? ./subsubnew.txt', output.rstrip()) output = client.get_status(basepath=os.path.dirname(self.local_path), untracked=True) self.assertEqual( ' M local/fixed.txt\n M local/submodule\n?? local/new.txt\n M local/subfixed.txt\n M local/subsubmodule\n?? local/subnew.txt\n M local/subsubfixed.txt\n?? local/subsubnew.txt', output.rstrip())
def test_checkout_specific_branch_and_update(self): from vcstools.git import GitClient directory = tempfile.mkdtemp() subdir = "checkout_specific_version_test" self.directories[subdir] = directory local_path = os.path.join(directory, "ros") url = self.readonly_url branch = "master" client = GitClient(local_path) self.assertFalse(client.path_exists()) self.assertFalse(client.detect_presence()) self.assertTrue(client.checkout(url, branch)) self.assertTrue(client.path_exists()) self.assertTrue(client.detect_presence()) self.assertEqual(client.get_path(), local_path) self.assertEqual(client.get_url(), url) self.assertEqual(client.get_branch_parent(), branch) new_branch = 'master' self.assertTrue(client.update(new_branch)) self.assertEqual(client.get_branch_parent(), new_branch) shutil.rmtree(directory) self.directories.pop(subdir)