From 1d1d4e7b3a9740fea2ff278016a1d026bbfa3479 Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Wed, 1 Jun 2016 10:07:18 -0700 Subject: [PATCH] crash in git_attrs.git_attribute function A recent change in this function sometimes causes a crash when pushing a commit. This happens in a situation such as the following: The user has a repository that looks like this: / subdir/ .gitattributes sub_sub_dir/ .gitattributes some_file If the user creates a commit which modifies some_file, the git_attribute function will be passed a list of files which includes: subdir/sub_sub_dir/some_file It will process that file by first looking at subdir/sub_sub_dir, check if there is a .gitattributes in it (yes), so create that directory, add it to the dirs_with_changes "list" so we know we've already processed that directory. So far, so good. Loop again, this time with os.path.dirname('subdir/sub_sub_dir'), thus with 'subdir'. Is that directory in dirs_with_changes? No. Does it have a .gitattribute in it? Yes. So, rince-repeat, which means first creating the subdir. That leads to the crash, since we already just created it as a side-effect of creating its subdir. This patch fixes the issue by simply remembering when a directory has been created for a given file in filename_list. Once that's done, we know that the next iterations on the dir_path loop are necessarily for parent directories, which have therefore been created, even if they are not listed in the dirs_with_changes "list" yet. Another possible fix, which would be safer, would be to just check the filesystem directly. But this code can be a hot-spot in terms of performance, so we'll try really hard to avoid it. Fixes P601-011. Related to P531-036. --- hooks/git_attrs.py | 5 +- .../bare_repo_config | 4 ++ .../git-repos.tar.bz2 | Bin 0 -> 16005 bytes .../hooks_config | 3 + .../P601-011__gitattributes_handling/test.py | 65 ++++++++++++++++++ 5 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 testsuite/tests/P601-011__gitattributes_handling/bare_repo_config create mode 100644 testsuite/tests/P601-011__gitattributes_handling/git-repos.tar.bz2 create mode 100644 testsuite/tests/P601-011__gitattributes_handling/hooks_config create mode 100644 testsuite/tests/P601-011__gitattributes_handling/test.py diff --git a/hooks/git_attrs.py b/hooks/git_attrs.py index 1f16a15..430ae7f 100644 --- a/hooks/git_attrs.py +++ b/hooks/git_attrs.py @@ -129,13 +129,16 @@ def git_attribute(commit_rev, filename_list, attr_name): for filename in filename_list: assert not os.path.isabs(filename) dir_path = filename + dir_created = False while dir_path: dir_path = os.path.dirname(dir_path) if dir_path in dirs_with_changes: continue gitattributes_rel_file = os.path.join(dir_path, '.gitattributes') if cached_file_exists(commit_rev, gitattributes_rel_file): - os.makedirs(os.path.join(tmp_checkout_dir, dir_path)) + if not dir_created: + os.makedirs(os.path.join(tmp_checkout_dir, dir_path)) + dir_created = True git.show("%s:%s" % (commit_rev, gitattributes_rel_file), _outfile=os.path.join(tmp_checkout_dir, gitattributes_rel_file)) diff --git a/testsuite/tests/P601-011__gitattributes_handling/bare_repo_config b/testsuite/tests/P601-011__gitattributes_handling/bare_repo_config new file mode 100644 index 0000000..07d359d --- /dev/null +++ b/testsuite/tests/P601-011__gitattributes_handling/bare_repo_config @@ -0,0 +1,4 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true diff --git a/testsuite/tests/P601-011__gitattributes_handling/git-repos.tar.bz2 b/testsuite/tests/P601-011__gitattributes_handling/git-repos.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..8214f51448c1d4a35b8ebd8ba5b31c93cf401367 GIT binary patch literal 16005 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 P-l;T4!$aeS(liDD(?w~h literal 0 HcmV?d00001 diff --git a/testsuite/tests/P601-011__gitattributes_handling/hooks_config b/testsuite/tests/P601-011__gitattributes_handling/hooks_config new file mode 100644 index 0000000..93a508c --- /dev/null +++ b/testsuite/tests/P601-011__gitattributes_handling/hooks_config @@ -0,0 +1,3 @@ +[hooks] + from-domain = adacore.com + mailinglist = git-hooks-ci@example.com diff --git a/testsuite/tests/P601-011__gitattributes_handling/test.py b/testsuite/tests/P601-011__gitattributes_handling/test.py new file mode 100644 index 0000000..fb0b1b6 --- /dev/null +++ b/testsuite/tests/P601-011__gitattributes_handling/test.py @@ -0,0 +1,65 @@ +from support import * + +class TestRun(TestCase): + def test_push_commit_on_master(self): + """Try pushing one single-file commit on master. + """ + cd ('%s/repo' % TEST_DIR) + + # Push master to the `origin' remote. The delta should be one + # commit with one file being modified. + p = Run('git push origin master'.split()) + expected_out = """\ +remote: DEBUG: Content-Type: text/plain; charset="us-ascii" +remote: MIME-Version: 1.0 +remote: Content-Transfer-Encoding: 7bit +remote: From: Test Suite +remote: To: git-hooks-ci@example.com +remote: Bcc: file-ci@gnat.com +remote: Subject: [repo] Minor reformatting. +remote: X-Act-Checkin: repo +remote: X-Git-Author: Joel Brobecker +remote: X-Git-Refname: refs/heads/master +remote: X-Git-Oldrev: 937ea8ac48994bdef9928dc6e246bb1d3efb8acd +remote: X-Git-Newrev: 4b27b37bcd68460e2ec2ccd97a4e93660ed4cd16 +remote: +remote: commit 4b27b37bcd68460e2ec2ccd97a4e93660ed4cd16 +remote: Author: Joel Brobecker +remote: Date: Wed Jun 1 09:38:20 2016 -0700 +remote: +remote: Minor reformatting. +remote: +remote: Diff: +remote: --- +remote: gms/hello.adb | 1 + +remote: sec/README | 3 +++ +remote: 2 files changed, 4 insertions(+) +remote: +remote: diff --git a/gms/hello.adb b/gms/hello.adb +remote: index 9a6ff61..93db53d 100644 +remote: --- a/gms/hello.adb +remote: +++ b/gms/hello.adb +remote: @@ -1,4 +1,5 @@ +remote: with Ada.Text_IO; use Ada.Text_IO; +remote: + +remote: procedure Hello is +remote: begin +remote: Put_Line ("Hello World."); +remote: diff --git a/sec/README b/sec/README +remote: index a7e57ad..93f282d 100644 +remote: --- a/sec/README +remote: +++ b/sec/README +remote: @@ -1 +1,4 @@ +remote: +REPO's sec/ README: +remote: +------------------- +remote: + +remote: This directory contains interesting stuff. +To ../bare/repo.git + 937ea8a..4b27b37 master -> master +""" + + self.assertEqual(p.status, 0, p.image) + self.assertRunOutputEqual(p, expected_out) + +if __name__ == '__main__': + runtests()