Title: git.util.rmtree's callback wraps too many exceptions · Issue #1699 · gitpython-developers/GitPython · GitHub
Open Graph Title: git.util.rmtree's callback wraps too many exceptions · Issue #1699 · gitpython-developers/GitPython
X Title: git.util.rmtree's callback wraps too many exceptions · Issue #1699 · gitpython-developers/GitPython
Description: As noted in #790, really no exceptions should be wrapped in unittest.SkipTest in production, but there is a more specific problem with what exceptions are wrapped, which this issue is about. This issue could be fixed together with #1698 ...
Open Graph Description: As noted in #790, really no exceptions should be wrapped in unittest.SkipTest in production, but there is a more specific problem with what exceptions are wrapped, which this issue is about. This i...
X Description: As noted in #790, really no exceptions should be wrapped in unittest.SkipTest in production, but there is a more specific problem with what exceptions are wrapped, which this issue is about. This i...
Opengraph URL: https://github.com/gitpython-developers/GitPython/issues/1699
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"git.util.rmtree's callback wraps too many exceptions","articleBody":"As noted in #790, really *no* exceptions should be wrapped in `unittest.SkipTest` in production, but there is a more specific problem with what exceptions are wrapped, which this issue is about. This issue could be fixed together with #1698 or separately, but the two are independent.\r\n\r\n`git.util.rmtree` handles errors with this callback, which wraps them in `unittest.SkipTest`, and which explicitly reports them *as `PermissionError`*:\r\n\r\nhttps://github.com/gitpython-developers/GitPython/blob/8107cbfeb1d56b2587d347c7f3d509ebef079950/git/util.py#L185-L196\r\n\r\nThe original logic for that was introduced in be44602. It occurs multiple times, but this is actually redundant because they all call `rmtree` from `git.util`, so the code in the callback defined and used in `git.util.rmtree` is sufficient. The goal--considering the context in which it was introduced, the code comments, and the explicit message--is to convert `PermissionError` to `SkipTest`.\r\n\r\n**But it catches the much more general exception type `Exception`.** Besides `PermissionError`, there are some other subclasses of `OSError` whose instances can be raised by `shutil.rmtree`, such as `FileNotFoundError`. More surprisingly, I have found that `TypeError` can be raised if directory traversal is itself what fails, due to a function used in opening the directory not supporting being called with just a path.\r\n\r\nEven if this logic were only operational when the project's tests are running, which is not the case, I would take the view that extra exceptions should not be caught and wrapped. However, there is a more confusing effect: **no matter what exception is wrapped, the message claims it is a `PermissionError`**, since that name is hard-coded.\r\n\r\nI think this should be fixed by having the callback catch `PermissionError` instead of `Exception`, which I think is what anyone who is relying on the existing of wrapping exceptions in `SkipTest` is assuming. (I have found that this change does not cause any fewer tests in the test suite to fail on native Windows systems, at least when running them in Python 3.12 on my WIndows 10 system.) The duplication of that logic can be eliminated at the same time. With the same rationale as in #1698, I think it makes sense to fix this now, rather than deferring it to when a full fix for #790 can be implemented. In addition, and unlike in #1698, a fix for this would somewhat decrease the impact of #790.\r\n\r\nI've included proposed such a fix for this in #1700 (which also would fix #1698).","author":{"url":"https://github.com/EliahKagan","@type":"Person","name":"EliahKagan"},"datePublished":"2023-10-09T11:14:25.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/1699/GitPython/issues/1699"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:9f09b786-5139-4c90-6584-6ad86c6cd6f5 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | E5F2:2F3A46:1134B83:180EBC7:6968EC8A |
| html-safe-nonce | 75c5c6cce3c822c0a8abb146dec4f19e43a948d5625c950f8af98a0041c9fd54 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFNUYyOjJGM0E0NjoxMTM0QjgzOjE4MEVCQzc6Njk2OEVDOEEiLCJ2aXNpdG9yX2lkIjoiMTU0OTAxMzMyODk2Njc3Mzg5OCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | d9a7092f1eddc0394f60f743dea114a6c388e0931d4c7dd79bc7d11cd5361da4 |
| hovercard-subject-tag | issue:1932834509 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/gitpython-developers/GitPython/1699/issue_layout |
| twitter:image | https://opengraph.githubassets.com/ede02d36bd8f3b52c7e38581033310a57a250eef9ec0e1997f00cce7e93d2d51/gitpython-developers/GitPython/issues/1699 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/ede02d36bd8f3b52c7e38581033310a57a250eef9ec0e1997f00cce7e93d2d51/gitpython-developers/GitPython/issues/1699 |
| og:image:alt | As noted in #790, really no exceptions should be wrapped in unittest.SkipTest in production, but there is a more specific problem with what exceptions are wrapped, which this issue is about. This i... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | EliahKagan |
| hostname | github.com |
| expected-hostname | github.com |
| None | 51dad138a86b7be4249ddf653c758a9e2621d74f432542c93532a31064797ca5 |
| turbo-cache-control | no-preview |
| go-import | github.com/gitpython-developers/GitPython git https://github.com/gitpython-developers/GitPython.git |
| octolytics-dimension-user_id | 503709 |
| octolytics-dimension-user_login | gitpython-developers |
| octolytics-dimension-repository_id | 1126087 |
| octolytics-dimension-repository_nwo | gitpython-developers/GitPython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1126087 |
| octolytics-dimension-repository_network_root_nwo | gitpython-developers/GitPython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | aba32f111c4c7d50bd0c1ac012cd08cdc17512e0 |
| ui-target | canary-2 |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width