Example #1
0
    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
Example #2
0
 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, [])
Example #3
0
 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())
Example #4
0
 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, [])
Example #5
0
    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
Example #6
0
    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())
Example #7
0
 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())
Example #8
0
    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)
Example #9
0
    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, [])
Example #10
0
    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())
Example #11
0
    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)
Example #12
0
 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())
Example #13
0
 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())
Example #14
0
    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, [])
Example #15
0
 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")))
Example #16
0
    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))
Example #18
0
 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())
Example #19
0
 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())
Example #20
0
 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())
Example #21
0
 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_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")
Example #24
0
 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")))
Example #25
0
    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
Example #26
0
    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))
Example #28
0
    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)
    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)