Hi,
since updating to Fedora 41 I have been seeing ignored python exceptions
like the following when using 'git gcc-verify' =
contrib/gcc_changelog/git_check_commit.py.
Checking 90fcc1f4f1a5537e8d30628895a07cbb2e7e16ff: OK
Exception ignored in: <function Git.AutoInterrupt.__del__ at 0x7ff88dd01440>
Traceback (most recent call last):
File "/usr/lib/python3.13/site-packages/git/cmd.py", line 563, in __del__
File "/usr/lib/python3.13/site-packages/git/cmd.py", line 544, in _terminate
File "/usr/lib64/python3.13/subprocess.py", line 2227, in terminate
ImportError: sys.meta_path is None, Python is likely shutting down
This patch uses a simple fix found on the kernel mailing list [1]. All it does
is wrap the repository access in a with clause and indent the remaining code.
With that the output is as expected again:
Checking 90fcc1f4f1a5537e8d30628895a07cbb2e7e16ff: OK
git_update_version.py also uses an unwrapped "Repo" but as I'm not using that
regularly I refrained from touching it.
Regards
Robin
[1] https://lkml.org/lkml/2025/2/25/1062
contrib/ChangeLog:
* gcc-changelog/git_repository.py: Use with Repo(repo_path).
---
contrib/gcc-changelog/git_repository.py | 86 +++++++++++++------------
1 file changed, 44 insertions(+), 42 deletions(-)
diff --git a/contrib/gcc-changelog/git_repository.py
b/contrib/gcc-changelog/git_repository.py
index d7650c65e21..c3c47236b32 100755
--- a/contrib/gcc-changelog/git_repository.py
+++ b/contrib/gcc-changelog/git_repository.py
@@ -32,50 +32,52 @@ from git_commit import GitCommit, GitInfo, decode_path
def parse_git_revisions(repo_path, revisions, ref_name=None):
- repo = Repo(repo_path)
- def commit_to_info(commit):
- try:
- c = repo.commit(commit)
- diff = repo.commit(commit + '~').diff(commit)
+ with Repo(repo_path) as repo:
+ assert not repo.bare
- modified_files = []
- for file in diff:
- if hasattr(file, 'renamed_file'):
- is_renamed = file.renamed_file
- else:
- is_renamed = file.renamed
- if file.new_file:
- t = 'A'
- elif file.deleted_file:
- t = 'D'
- elif is_renamed:
- # Consider that renamed files are two operations:
- # the deletion of the original name
- # and the addition of the new one.
- modified_files.append((decode_path(file.a_path), 'D'))
- t = 'A'
- else:
- t = 'M'
- modified_files.append((decode_path(file.b_path), t))
+ def commit_to_info(commit):
+ try:
+ c = repo.commit(commit)
+ diff = repo.commit(commit + '~').diff(commit)
- date = datetime.utcfromtimestamp(c.committed_date)
- author = '%s <%s>' % (c.author.name, c.author.email)
- git_info = GitInfo(c.hexsha, date, author,
- c.message.split('\n'), modified_files)
- return git_info
- except ValueError:
- return None
+ modified_files = []
+ for file in diff:
+ if hasattr(file, 'renamed_file'):
+ is_renamed = file.renamed_file
+ else:
+ is_renamed = file.renamed
+ if file.new_file:
+ t = 'A'
+ elif file.deleted_file:
+ t = 'D'
+ elif is_renamed:
+ # Consider that renamed files are two operations:
+ # the deletion of the original name
+ # and the addition of the new one.
+ modified_files.append((decode_path(file.a_path), 'D'))
+ t = 'A'
+ else:
+ t = 'M'
+ modified_files.append((decode_path(file.b_path), t))
- parsed_commits = []
- if '..' in revisions:
- commits = list(repo.iter_commits(revisions))
- else:
- commits = [repo.commit(revisions)]
+ date = datetime.utcfromtimestamp(c.committed_date)
+ author = '%s <%s>' % (c.author.name, c.author.email)
+ git_info = GitInfo(c.hexsha, date, author,
+ c.message.split('\n'), modified_files)
+ return git_info
+ except ValueError:
+ return None
- for commit in commits:
- git_commit = GitCommit(commit_to_info(commit.hexsha),
- commit_to_info_hook=commit_to_info,
- ref_name=ref_name)
- parsed_commits.append(git_commit)
- return parsed_commits
+ parsed_commits = []
+ if '..' in revisions:
+ commits = list(repo.iter_commits(revisions))
+ else:
+ commits = [repo.commit(revisions)]
+
+ for commit in commits:
+ git_commit = GitCommit(commit_to_info(commit.hexsha),
+ commit_to_info_hook=commit_to_info,
+ ref_name=ref_name)
+ parsed_commits.append(git_commit)
+ return parsed_commits
--
2.48.1