From 1a04c15b1f77f908b1dd3983a27ee49c41b3a3e5 Mon Sep 17 00:00:00 2001 From: Todd Zullinger Date: Mon, 24 May 2021 17:34:42 -0400 Subject: improve index mode for files with executable bit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The fix for #430 in bebc4f56 (Use correct mode for executable files, 2016-05-19) is incomplete. It fails (in most cases) when files have modes which are not exactly 0644 or 0755. Git only cares whether the executable bit is set (or not). Ensure the mode we set for the index is either 100644 or 100755 based on whether the executable bit is set for the file owner. Do this similarly to how upstream git does it in cache.h¹. Add a test covering various file modes to help catch regressions. Fixes #1253 ¹ https://github.com/git/git/blob/v2.31.1/cache.h#L247 --- test/test_fun.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'test') diff --git a/test/test_fun.py b/test/test_fun.py index a7fb8f8b..e3d07194 100644 --- a/test/test_fun.py +++ b/test/test_fun.py @@ -1,5 +1,5 @@ from io import BytesIO -from stat import S_IFDIR, S_IFREG, S_IFLNK +from stat import S_IFDIR, S_IFREG, S_IFLNK, S_IXUSR from os import stat import os.path as osp from unittest import SkipTest @@ -7,7 +7,8 @@ from unittest import SkipTest from git import Git from git.index import IndexFile from git.index.fun import ( - aggressive_tree_merge + aggressive_tree_merge, + stat_mode_to_index_mode, ) from git.objects.fun import ( traverse_tree_recursive, @@ -206,6 +207,16 @@ class TestFun(TestBase): assert_entries(aggressive_tree_merge(odb, trees), 2, True) # END handle ours, theirs + def test_stat_mode_to_index_mode(self): + modes = ( + 0o600, 0o611, 0o640, 0o641, 0o644, 0o650, 0o651, + 0o700, 0o711, 0o740, 0o744, 0o750, 0o751, 0o755, + ) + for mode in modes: + expected_mode = S_IFREG | (mode & S_IXUSR and 0o755 or 0o644) + assert stat_mode_to_index_mode(mode) == expected_mode + # END for each mode + def _assert_tree_entries(self, entries, num_trees): for entry in entries: assert len(entry) == num_trees -- cgit v1.2.1 From 2dbc2be846d1d00e907efbf8171c35b889ab0155 Mon Sep 17 00:00:00 2001 From: Robert Westman Date: Thu, 3 Jun 2021 09:45:09 +0200 Subject: Adds failing test for repo.tag() method --- test/test_repo.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'test') diff --git a/test/test_repo.py b/test/test_repo.py index 8dc17833..9261f1cf 100644 --- a/test/test_repo.py +++ b/test/test_repo.py @@ -414,6 +414,16 @@ class TestRepo(TestBase): def test_tag(self): assert self.rorepo.tag('refs/tags/0.1.5').commit + def test_tag_to_full_tag_path(self): + tags = ['0.1.5', 'tags/0.1.5', 'refs/tags/0.1.5'] + value_errors = [] + for tag in tags: + try: + self.rorepo.tag(tag) + except ValueError as valueError: + value_errors.append(valueError.args[0]) + raise ValueError('. '.join(value_errors)) + def test_archive(self): tmpfile = tempfile.mktemp(suffix='archive-test') with open(tmpfile, 'wb') as stream: @@ -445,7 +455,7 @@ class TestRepo(TestBase): tlist = b[0][1] self.assertTrue(tlist) self.assertTrue(isinstance(tlist[0], str)) - self.assertTrue(len(tlist) < sum(len(t) for t in tlist)) # test for single-char bug + self.assertTrue(len(tlist) < sum(len(t) for t in tlist)) # test for single-char bug # BINARY BLAME git.return_value = fixture('blame_binary') @@ -454,7 +464,7 @@ class TestRepo(TestBase): def test_blame_real(self): c = 0 - nml = 0 # amount of multi-lines per blame + nml = 0 # amount of multi-lines per blame for item in self.rorepo.head.commit.tree.traverse( predicate=lambda i, d: i.type == 'blob' and i.path.endswith('.py')): c += 1 @@ -486,7 +496,8 @@ class TestRepo(TestBase): # Original line numbers orig_ranges = flatten([entry.orig_linenos for entry in blame_output]) - self.assertEqual(orig_ranges, flatten([range(2, 3), range(14, 15), range(1, 2), range(2, 13), range(13, 15)])) # noqa E501 + self.assertEqual(orig_ranges, flatten( + [range(2, 3), range(14, 15), range(1, 2), range(2, 13), range(13, 15)])) # noqa E501 @mock.patch.object(Git, '_call_process') def test_blame_complex_revision(self, git): @@ -530,9 +541,9 @@ class TestRepo(TestBase): # end for each run def test_config_reader(self): - reader = self.rorepo.config_reader() # all config files + reader = self.rorepo.config_reader() # all config files assert reader.read_only - reader = self.rorepo.config_reader("repository") # single config file + reader = self.rorepo.config_reader("repository") # single config file assert reader.read_only def test_config_writer(self): @@ -729,7 +740,7 @@ class TestRepo(TestBase): def test_rw_rev_parse(self, rwrepo): # verify it does not confuse branches with hexsha ids ahead = rwrepo.create_head('aaaaaaaa') - assert(rwrepo.rev_parse(str(ahead)) == ahead.commit) + assert (rwrepo.rev_parse(str(ahead)) == ahead.commit) def test_rev_parse(self): rev_parse = self.rorepo.rev_parse @@ -1041,7 +1052,7 @@ class TestRepo(TestBase): def test_rebasing(self, rw_dir): r = Repo.init(rw_dir) fp = osp.join(rw_dir, 'hello.txt') - r.git.commit("--allow-empty", message="init",) + r.git.commit("--allow-empty", message="init", ) with open(fp, 'w') as fs: fs.write("hello world") r.git.add(Git.polish_url(fp)) -- cgit v1.2.1 From 057514e85bc99754e08d45385bf316920963adf9 Mon Sep 17 00:00:00 2001 From: Robert Westman Date: Thu, 3 Jun 2021 10:18:46 +0200 Subject: Fixes test to not throw false negative results --- test/test_repo.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'test') diff --git a/test/test_repo.py b/test/test_repo.py index 9261f1cf..453ec5c3 100644 --- a/test/test_repo.py +++ b/test/test_repo.py @@ -422,7 +422,8 @@ class TestRepo(TestBase): self.rorepo.tag(tag) except ValueError as valueError: value_errors.append(valueError.args[0]) - raise ValueError('. '.join(value_errors)) + if value_errors: + raise ValueError('. '.join(value_errors)) def test_archive(self): tmpfile = tempfile.mktemp(suffix='archive-test') -- cgit v1.2.1 From 79e24f78fa35136216130a10d163c91f9a6d4970 Mon Sep 17 00:00:00 2001 From: Robert Westman Date: Thu, 3 Jun 2021 10:52:59 +0200 Subject: Reverts auto format introduced with 2dbc2be8 --- test/test_repo.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'test') diff --git a/test/test_repo.py b/test/test_repo.py index 453ec5c3..0311653a 100644 --- a/test/test_repo.py +++ b/test/test_repo.py @@ -422,8 +422,7 @@ class TestRepo(TestBase): self.rorepo.tag(tag) except ValueError as valueError: value_errors.append(valueError.args[0]) - if value_errors: - raise ValueError('. '.join(value_errors)) + raise ValueError('. '.join(value_errors)) def test_archive(self): tmpfile = tempfile.mktemp(suffix='archive-test') @@ -456,7 +455,7 @@ class TestRepo(TestBase): tlist = b[0][1] self.assertTrue(tlist) self.assertTrue(isinstance(tlist[0], str)) - self.assertTrue(len(tlist) < sum(len(t) for t in tlist)) # test for single-char bug + self.assertTrue(len(tlist) < sum(len(t) for t in tlist)) # test for single-char bug # BINARY BLAME git.return_value = fixture('blame_binary') @@ -465,7 +464,7 @@ class TestRepo(TestBase): def test_blame_real(self): c = 0 - nml = 0 # amount of multi-lines per blame + nml = 0 # amount of multi-lines per blame for item in self.rorepo.head.commit.tree.traverse( predicate=lambda i, d: i.type == 'blob' and i.path.endswith('.py')): c += 1 @@ -497,8 +496,7 @@ class TestRepo(TestBase): # Original line numbers orig_ranges = flatten([entry.orig_linenos for entry in blame_output]) - self.assertEqual(orig_ranges, flatten( - [range(2, 3), range(14, 15), range(1, 2), range(2, 13), range(13, 15)])) # noqa E501 + self.assertEqual(orig_ranges, flatten([range(2, 3), range(14, 15), range(1, 2), range(2, 13), range(13, 15)])) # noqa E501 @mock.patch.object(Git, '_call_process') def test_blame_complex_revision(self, git): @@ -542,9 +540,9 @@ class TestRepo(TestBase): # end for each run def test_config_reader(self): - reader = self.rorepo.config_reader() # all config files + reader = self.rorepo.config_reader() # all config files assert reader.read_only - reader = self.rorepo.config_reader("repository") # single config file + reader = self.rorepo.config_reader("repository") # single config file assert reader.read_only def test_config_writer(self): @@ -741,7 +739,7 @@ class TestRepo(TestBase): def test_rw_rev_parse(self, rwrepo): # verify it does not confuse branches with hexsha ids ahead = rwrepo.create_head('aaaaaaaa') - assert (rwrepo.rev_parse(str(ahead)) == ahead.commit) + assert(rwrepo.rev_parse(str(ahead)) == ahead.commit) def test_rev_parse(self): rev_parse = self.rorepo.rev_parse @@ -1053,7 +1051,7 @@ class TestRepo(TestBase): def test_rebasing(self, rw_dir): r = Repo.init(rw_dir) fp = osp.join(rw_dir, 'hello.txt') - r.git.commit("--allow-empty", message="init", ) + r.git.commit("--allow-empty", message="init",) with open(fp, 'w') as fs: fs.write("hello world") r.git.add(Git.polish_url(fp)) -- cgit v1.2.1 From 01a96b92f7d873cbd531d142813c2be7ab88d5a5 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 4 Jun 2021 10:35:22 +0800 Subject: Conditionally throw an error --- test/test_repo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test') diff --git a/test/test_repo.py b/test/test_repo.py index 0311653a..04102b01 100644 --- a/test/test_repo.py +++ b/test/test_repo.py @@ -422,7 +422,7 @@ class TestRepo(TestBase): self.rorepo.tag(tag) except ValueError as valueError: value_errors.append(valueError.args[0]) - raise ValueError('. '.join(value_errors)) + self.assertEqual(value_errors, []) def test_archive(self): tmpfile = tempfile.mktemp(suffix='archive-test') -- cgit v1.2.1 From 385a8c6c1a72dc34f69c5273c1b4c1285cc1d3c5 Mon Sep 17 00:00:00 2001 From: Robert Westman Date: Sat, 5 Jun 2021 12:15:38 +0200 Subject: Adds repo.is_valid_object check --- test/test_repo.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'test') diff --git a/test/test_repo.py b/test/test_repo.py index 04102b01..8aced94d 100644 --- a/test/test_repo.py +++ b/test/test_repo.py @@ -989,6 +989,34 @@ class TestRepo(TestBase): for i, j in itertools.permutations([c1, 'ffffff', ''], r=2): self.assertRaises(GitCommandError, repo.is_ancestor, i, j) + def test_is_valid_object(self): + repo = self.rorepo + commit_sha = 'f6aa8d1' + blob_sha = '1fbe3e4375' + tree_sha = '960b40fe36' + tag_sha = '42c2f60c43' + + # Check for valid objects + self.assertTrue(repo.is_valid_object(commit_sha)) + self.assertTrue(repo.is_valid_object(blob_sha)) + self.assertTrue(repo.is_valid_object(tree_sha)) + self.assertTrue(repo.is_valid_object(tag_sha)) + + # Check for valid objects of specific type + self.assertTrue(repo.is_valid_object(commit_sha, 'commit')) + self.assertTrue(repo.is_valid_object(blob_sha, 'blob')) + self.assertTrue(repo.is_valid_object(tree_sha, 'tree')) + self.assertTrue(repo.is_valid_object(tag_sha, 'tag')) + + # Check for invalid objects + self.assertFalse(repo.is_valid_object(b'1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a', 'blob')) + + # Check for invalid objects of specific type + self.assertFalse(repo.is_valid_object(commit_sha, 'blob')) + self.assertFalse(repo.is_valid_object(blob_sha, 'commit')) + self.assertFalse(repo.is_valid_object(tree_sha, 'commit')) + self.assertFalse(repo.is_valid_object(tag_sha, 'commit')) + @with_rw_directory def test_git_work_tree_dotgit(self, rw_dir): """Check that we find .git as a worktree file and find the worktree -- cgit v1.2.1