René's URL Explorer Experiment


Title: Replace all wildcard imports with explicit imports by EliahKagan · Pull Request #1880 · gitpython-developers/GitPython · GitHub

Open Graph Title: Replace all wildcard imports with explicit imports by EliahKagan · Pull Request #1880 · gitpython-developers/GitPython

X Title: Replace all wildcard imports with explicit imports by EliahKagan · Pull Request #1880 · gitpython-developers/GitPython

Description: Fixes #1349 This actually makes a number of related changes, several of which the reduction in mypy errors in #1859 helped in validating: All wildcard imports (from blah import *) are replaced with imports of specific names. This is the key change, with everything else done to support it, or directly facilitated by it, or conceptually related to it, or practically easy to do alongside it. Wildcard imports are inherently brittle, discouraged in PEP-8, and have already led to some difficulties for GitPython (see fc86a23 and the "Another ambiguity, possibly relevant" section of #1802). Even more importantly, this makes things easier for type checkers, especially for code that uses GitPython from the outside where common and useful configurations otherwise report errors due to the wildcards' lack of explicitness about what names they introduce. Furthermore, the combination of the mypy error reduction in #1859 with the elimination of wildcard imports makes it feasible to verify that newly introduced dynamic behavior is done in a way that avoids breaking static type checking for users of GitPython. This allows deprecation warnings on access to specific module attributes, as may be useful in git.compat, as well as a dynamically generated git.__version__ attribute, to be safely approachable. (But such now-doable enhancements are not part of this pull request.) I wrote a short script (1e5a944, f705fd6) to verify that changes to module contents were minimal and as expected, including verifying what object attributes reference, not just what the attributes' names were. Top-level names that are imported only to match what was imported before, but that are nonpublic and inadvisable to use, are commented as such where they are imported. Most of these could possibly be removed very soon. The test suite has a few new tests, to test a particularly tricky aspect of the observable behavior of imports that is easy to change accidentally but should only ever be changed intentionally (the git.util vs. git.objects.util issue). __all__ is added where absent but clearly useful, which is everywhere under git where it was absent except git.types. This was only a handful of places. git.objects.__all__, which was dynamically generated as a list comprehension--as git.__all__ was prior to #1659--is likewise replaced with a literal __all__. As detailed in the f89d065 commit message, I used deltall (see also #1875) to verify that this was the right course. The __init__ for git.objects.submodule no longer patches IndexObject and Object into git.objects.submodule.util. This had been done to avoid a circular import error, but at some point ceased to be needed. Because git.objects.submodule.util has defined __all__ for a long time, which omits them (and seems always to have omitted them), and because it also does not use them, I didn't replace that patching with any other way of getting them in there. However, it looks like it would be feasible to import them in a way that would not cause problems, if that is called for. Also related to that situation, git.objects.submodule had been the only subpackage whose __init__ didn't make names from its own submodules available directly in it. Because neither the circular import error nor the dynamic patching workaround are being done, there is no impediment to this, which improves consistency across the project and seemed to me to be what users would expect, so I included that. __all__ is now placed at the PEP-8 recommended location near the top of each module, above imports except in rare cases where that is infeasible. A number of linter suppressions are removed, most of which are no longer needed due to wildcard imports no longer being used. Some others are made more specific, including by splitting them into suppressions that apply to specific names in a from import. Some of what facilitates this is actually the switch from flake8 to Ruff in #1862. Imports across the project are fully sorted and grouped, in a consistent style that I think reflects the sensibility of the style that has been in place for an extended time. This is something that I had done bits of as part of other pull requests, and it was convenient to "complete" it here. I use scare quotes because it is likely I have missed some things. Ideally this should eventually be checked--or, better, applied--by an automated tool. Ruff can sort imports but I don't think it supports anything like this style, while isort is more configurable but might still be difficult to get to do it. However, the goal here is not this specific style, but instead to have something as consistent and helpful as possible if the style is not changed or before it is changed, while also making it easier to identify the advantages and disadvantages of an automatically applicable style over the best the current style has to offer. Minor cleanup alongside these changes, including removal of old commented-out code (done in its own commits so it's easy to find in case that code is wanted again) and rewording the git.objects.util module docstring to distinguish that module from git.util. The latter is the reason for that __doc__ attribute change. A few special considerations: It was suggested that #1349 could be fixed by writing git.__all__ literally rather than dynamically generating it. But that improvement was since made in #1659, and while #1656 was fixed, #1349 remained. I've re-verified that this is the case by creating a repository that uses GitPython in a way that more closely approximates installing it from PyPI than is common during development, and ensures that the non-default mypy configuration in pyproject.toml is not used, while still allowing arbitrary files to be tested, by doing a non-editable installation into a different directory with a separate virtual environment. More details are in this gist. This confirmed that, as of the main branch at 0a609b9, #1349 was reproducible, while at the tip of this feature branch, d524c76, it was resolved. I am not sure what the best choice is for whether intermediate subpackages--Python modules like git.objects and git.refs that are under the top-level git package but contain their own Python submodules--should include their Python submodules' names in __all__. In GitPython (though not all projects), everything is imported as a consequence of importing the top-level git module, so these are already available, and they are also already public, in the sense that they are available due to having been imported, with the fully qualified names they are guaranteed to have as a consequence of being imported. In most but not all cases--git.objects being a major counterexample due to its previously dynamically built __all__ that omitted modules--these were already importable in wildcard imports due to the absence of __all__. However, that this was the case had caused some problems, including several modules that are not direct children of the top-level git module ending up as attributes of it (most of which are simply private attributes that should not be used, but one of which, being git.index.util, is the cause of the git.util/git.index.util ambiguity). Something different could be done in git.objects than elsewhere for maximum similarity to the previous state of affairs, but I decided instead to omit them everywhere, based on the top-level git module not listing its own direct Python submodules in its __all__, and the possibility that omitting them would help mitigate the risks of wildcard imports outside of GitPython. Some modules have unused imports not listed in __all__, present intentionally for use in other GitPython modules but not public outside the project. As commented on #1854, I'm unsure whether or how that should ultimately be improved, but I definitely consider it beyond the scope of this pull request. As such, implicit_reexport = true remains set for mypy in pyproject.toml (mypy otherwise warns about this situation wherever other modules use such imports).

Open Graph Description: Fixes #1349 This actually makes a number of related changes, several of which the reduction in mypy errors in #1859 helped in validating: All wildcard imports (from blah import *) are replaced wi...

X Description: Fixes #1349 This actually makes a number of related changes, several of which the reduction in mypy errors in #1859 helped in validating: All wildcard imports (from blah import *) are replaced wi...

Opengraph URL: https://github.com/gitpython-developers/GitPython/pull/1880

X: @github

direct link

Domain: togithub.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:132066f5-d49e-263c-25a2-d3a3d85d3569
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idC2D2:1F441:223E5:2E5C4:696963E9
html-safe-nonce7449e9fed2f23151e1cb724c87e85947b1babc96520e3861448a0a9fcc6282bb
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDMkQyOjFGNDQxOjIyM0U1OjJFNUM0OjY5Njk2M0U5IiwidmlzaXRvcl9pZCI6IjkzOTQzMDM2ODY5NzIxMzkyOSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmacd48e9b542856d8c453350aa5e4d7d5f903f88ac874cc7f0a7ca8e544ed8055e1
hovercard-subject-tagpull_request:1779253515
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/gitpython-developers/GitPython/pull/1880/files
twitter:imagehttps://avatars.githubusercontent.com/u/1771172?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/1771172?s=400&v=4
og:image:altFixes #1349 This actually makes a number of related changes, several of which the reduction in mypy errors in #1859 helped in validating: All wildcard imports (from blah import *) are replaced wi...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
None48487c1ad776a7975b7132d95f4240ff3ae37cd5b8e3cb597102a4edb76738f1
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/gitpython-developers/GitPython git https://github.com/gitpython-developers/GitPython.git
octolytics-dimension-user_id503709
octolytics-dimension-user_logingitpython-developers
octolytics-dimension-repository_id1126087
octolytics-dimension-repository_nwogitpython-developers/GitPython
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id1126087
octolytics-dimension-repository_network_root_nwogitpython-developers/GitPython
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release669463fcc54773a88c1f5a44eef6b99a5504b9c7
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://togithub.com/gitpython-developers/GitPython/pull/1880/files#start-of-content
https://togithub.com/
Sign in https://togithub.com/login?return_to=https%3A%2F%2Fgithub.com%2Fgitpython-developers%2FGitPython%2Fpull%2F1880%2Ffiles
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub SparkBuild and deploy intelligent appshttps://github.com/features/spark
GitHub ModelsManage and compare promptshttps://github.com/features/models
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
GitHub SponsorsFund open source developershttps://github.com/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/accelerator
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://togithub.com/login?return_to=https%3A%2F%2Fgithub.com%2Fgitpython-developers%2FGitPython%2Fpull%2F1880%2Ffiles
Sign up https://togithub.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=gitpython-developers%2FGitPython
Reloadhttps://togithub.com/gitpython-developers/GitPython/pull/1880/files
Reloadhttps://togithub.com/gitpython-developers/GitPython/pull/1880/files
Reloadhttps://togithub.com/gitpython-developers/GitPython/pull/1880/files
gitpython-developers https://togithub.com/gitpython-developers
GitPythonhttps://togithub.com/gitpython-developers/GitPython
Please reload this pagehttps://togithub.com/gitpython-developers/GitPython/pull/1880/files
Notifications https://togithub.com/login?return_to=%2Fgitpython-developers%2FGitPython
Fork 964 https://togithub.com/login?return_to=%2Fgitpython-developers%2FGitPython
Star 5k https://togithub.com/login?return_to=%2Fgitpython-developers%2FGitPython
Code https://togithub.com/gitpython-developers/GitPython
Issues 169 https://togithub.com/gitpython-developers/GitPython/issues
Pull requests 8 https://togithub.com/gitpython-developers/GitPython/pulls
Discussions https://togithub.com/gitpython-developers/GitPython/discussions
Actions https://togithub.com/gitpython-developers/GitPython/actions
Security Uh oh! There was an error while loading. Please reload this page. https://togithub.com/gitpython-developers/GitPython/security
Please reload this pagehttps://togithub.com/gitpython-developers/GitPython/pull/1880/files
Insights https://togithub.com/gitpython-developers/GitPython/pulse
Code https://togithub.com/gitpython-developers/GitPython
Issues https://togithub.com/gitpython-developers/GitPython/issues
Pull requests https://togithub.com/gitpython-developers/GitPython/pulls
Discussions https://togithub.com/gitpython-developers/GitPython/discussions
Actions https://togithub.com/gitpython-developers/GitPython/actions
Security https://togithub.com/gitpython-developers/GitPython/security
Insights https://togithub.com/gitpython-developers/GitPython/pulse
Sign up for GitHub https://togithub.com/signup?return_to=%2Fgitpython-developers%2FGitPython%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://togithub.com/login?return_to=%2Fgitpython-developers%2FGitPython%2Fissues%2Fnew%2Fchoose
Byronhttps://togithub.com/Byron
gitpython-developers:mainhttps://togithub.com/gitpython-developers/GitPython/tree/main
EliahKagan:importshttps://togithub.com/EliahKagan/GitPython/tree/imports
Conversation 3 https://togithub.com/gitpython-developers/GitPython/pull/1880
Commits 34 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits
Checks 0 https://togithub.com/gitpython-developers/GitPython/pull/1880/checks
Files changed https://togithub.com/gitpython-developers/GitPython/pull/1880/files
Please reload this pagehttps://togithub.com/gitpython-developers/GitPython/pull/1880/files
Replace all wildcard imports with explicit imports https://togithub.com/gitpython-developers/GitPython/pull/1880/files#top
Show all changes 34 commits https://togithub.com/gitpython-developers/GitPython/pull/1880/files
1e5a944 Add a script to validate refactored imports EliahKagan Mar 17, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/1e5a9449573bfe70987dcaf44e120895131e9c66
5b2771d Add regression tests of the git.util aliasing situation EliahKagan Mar 18, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/5b2771d23af2156fb7e12ee6406bffbabcb9e95d
fc86a23 Incompletely change git.index imports to test modattrs.py EliahKagan Feb 24, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/fc86a238f99a6406ed949a7d690ec0f6be2f31e0
4badc19 Fix git.index imports EliahKagan Mar 18, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/4badc19f489c177a976d99da85d3c632797f7aeb
1c9bda2 Improve relative order of import groups, and __all__, in git.index EliahKagan Mar 18, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/1c9bda222077a6227beed2e06df6f26e2e864807
8b51af3 Improve order of imports and __all__ in git.refs submodules EliahKagan Mar 18, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/8b51af36a4943f75fb66d553d55e381859fe3a34
b25dd7e Replace wildcard imports in git.refs EliahKagan Mar 18, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/b25dd7e6c1b5453fce111a470832e8942430c934
b32ef65 Improve order of imports and __all__ in git.repo submodules EliahKagan Mar 18, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/b32ef6528c0da39b91b6399c5593d10ca41c5865
0ba06e9 Add git.repo.__all__ and make submodules explicit EliahKagan Mar 18, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/0ba06e9425e90f7f787ac39f48562af54ff41038
c946906 Improve order of imports and __all__ in git.objects.* EliahKagan Mar 18, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/c946906c4e92512e4294f587eaccaf0029a425df
4e9a2f2 Improve order of imports and __all__ in git.object.submodule.* EliahKagan Mar 18, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/4e9a2f2facb0da3adb9c6fe5165dcfb5c6627cb7
c58be4c Remove a bit of old commented-out code in git.objects.* EliahKagan Mar 18, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/c58be4c0b6e82dc1c0445f9e41e53263f5d2ec4e
01c95eb Don't patch IndexObject and Object into git.objects.submodule.util EliahKagan Mar 18, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/01c95ebcc7d41bc68e1f64f9b1ec01c30f29d591
f89d065 Fix git.objects.__all__ and make submodules explicit EliahKagan Mar 18, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/f89d065742ba5b62056f1aa679e1197124bf7bcf
3786307 Make git.objects.util module docstring more specific EliahKagan Mar 18, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/3786307f965d38cde9e251d191f71ff26903935d
de540b7 Add __all__ and imports in git.objects.submodule EliahKagan Mar 18, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/de540b78caa71c9f1a0f098c0d1608287c8927ac
a05597a Improve how imports and __all__ are written in git.util EliahKagan Mar 18, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/a05597a1aeacec0c18772944208ab2757b0db34b
2053a3d Remove old commented-out change_type assertions in git.diff EliahKagan Mar 18, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/2053a3d66c1667f3b130347e9984779f94875719
b8bab43 Remove old commented-out flagKeyLiteral assertions in git.remote EliahKagan Mar 19, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/b8bab43db59c8a110d11dd16e24d61adf65c18fd
3d4e476 Improve how second-level imports and __all__ are written EliahKagan Mar 19, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/3d4e47623ef7dc76883abfd5d44fcaef92e7bd1c
6318eea Make F401 "unused import" suppressions more specific EliahKagan Mar 19, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/6318eea9743efec557bd7dbfdea46ddc21f654f2
31bc8a4 Remove unneeded F401 "Unused import" suppressions EliahKagan Mar 19, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/31bc8a4e062841e041e9fff664bb08366d8fce48
abbe74d Fix a tiny import sorting nit EliahKagan Mar 19, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/abbe74d030a647664f646a8d43e071608593b6a3
7745250 Replace wildcard imports in top-level git module EliahKagan Mar 19, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/774525087bcc0389bf585b88ee38eabf69933183
64c9efd Restore relative order to fix circular import error EliahKagan Mar 19, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/64c9efdad216954b19cb91a4c04ea2de9d598159
31f89a1 Add the nonpublic indirect submodule aliases back for now EliahKagan Mar 19, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/31f89a1fa9f7fea7a13ba7aa9079364c22fb0e68
9bbbcb5 Further improve git.objects.util module docstring EliahKagan Mar 19, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/9bbbcb5e847c9f0e4c91cb75d1c93be2b9cb1f57
00f4cbc Add missing submodule imports in git.objects EliahKagan Mar 19, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/00f4cbcf46426311f3cb6748912a1ea675639cf2
fcc7418 Don't explicitly list direct submodules in __all__ EliahKagan Mar 19, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/fcc741838dbffa45648f3f224c01b9cb8941adc2
78055a8 Pick a consistent type for __all__ (for now, list) EliahKagan Mar 19, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/78055a8b8473a25e8f36a3846b920a698e8ba66b
ecdb6aa Save diff of non-__all__ attributes across import changes EliahKagan Mar 19, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/ecdb6aa25a95e2cb3a650a26f3ffd9c45e127ed1
f705fd6 Remove modattrs.py and related EliahKagan Mar 19, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/f705fd6dde6047c7787809aeb691988fa4af80d8
4a4d880 Improve test suite import grouping/sorting, __all__ placement EliahKagan Mar 19, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/4a4d880fec4364c7d49e7708238a962942ae69f3
d524c76 Fix slightly unsorted imports in setup.py EliahKagan Mar 19, 2024 https://togithub.com/gitpython-developers/GitPython/pull/1880/commits/d524c76a460b339b224c59b6753607eb2e546b2a
Clear filters https://togithub.com/gitpython-developers/GitPython/pull/1880/files
Please reload this pagehttps://togithub.com/gitpython-developers/GitPython/pull/1880/files
Please reload this pagehttps://togithub.com/gitpython-developers/GitPython/pull/1880/files
__init__.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-6789dd4ae9fe98745671baf3f0e86d8ead5505232e6ecb26a3760ca10c636c63
cmd.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
compat.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-2f2b548c14a71e5bbf15502f6d7fd98a50842119152c451ae2ec5e1cc42f02d2
config.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-dd51b67c435dfba6f72cc0d08f99456393556623a0f098ac2808d1a7cb78d53a
db.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-2c464f9c2a67eaec11758bfe4d275393bd7478c9315028ee3f158cf8587e5fb2
diff.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-300633890a1b325dfed86bb5120d89465f0687f4f6b8d5701c44c02f0eee723a
exc.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-1eee00ab107f6bfb1dedb97cf16cbd369028c3382cd80deb8e0c902fff9536b0
__init__.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-3252ba40454a195504978f4ddeaf9641d70a2889853301e14d321a4d426487d8
base.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-56d167dc0ca4d51682e56b5e602c096f3f264fd1ebb61cc03bbb6c409c866eeb
fun.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-1d155f283cbf575ea2d0cce3e16d9c60d5fab54c83626603f47eabd2334084b6
typ.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-fd9e9d3e4c47089d82e46f7fb5f3fa4d4de8ae19c022d2a67cb75827a5249e3b
util.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-0167928a56cc19b530606854225ed0dde03f5936371b024d0da20040d3d708c6
__init__.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-962d186ce19cc235f1693c7574d37235f6d4c005fc44a981d404cbd8fc980f0d
base.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-4fcf911ecd03484eb6c89186dde3ebaa272e9925d4c0da8a5dd358770aa9d21e
blob.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-96eacc88b5c5d8052653c692fa5c7694e27ded26c4f954e95ef9b9ccb83b8e09
commit.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-88141770c3f374c9bacdef629c161e7bc75e7a1585827f5a35671b89df14291f
fun.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-01edb0c8454cae675aff301bcd04f8a711166f34754645816938a57351a95f7d
__init__.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-af76164d52c8a3536fc63ca582d043c49a08badc0cf6b768ae2b157b948187a8
base.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-44dc32942e129beb7f738ff7d487bfbddb0a7802a91d43c9b8b8952a4d0806bc
root.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-7df742abf80356d1e22c392ee26cd2d87f89158b9f70bff6fb936eaf4c7e7faf
util.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-367e208359050dc30b27c910ac04d326217fcedb92adc5242a2456aceb1d5b77
tag.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-2526bf3fc6f6f4689c5b99b122e3954143bbf5997e3b81a6e7a0a7409fb61ac1
tree.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-5ca1e907ced91070e5b2b7136778f5a609b66f5bdbca65498662e99f86b23b3b
util.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-c91a265ba9028bfac459e1cfb58e2b609d346437e45de5c6c458732b6e1716e4
__init__.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-e3c489144efb72a639b4dece833b67f8e0e377ef94fac44a6f0369241d709117
head.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-79302e4aa7752927c17b41ff1d8f51292daf92f3798b95d3c37264bf09b7955e
log.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-06a8205a3aebe461db012c34e9753d67272695696206fa0ab0c0e0a5ec1170bf
reference.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-d487c8c0e0bc8b6d15753074e1ce753b11b61961c3ce23b378261d897e3cf5ac
remote.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-b8020d2185188d5a8e5ab969bb80d2e710c0160c3a80c4346f99ad01e29ae3d6
symbolic.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-72d42177f0e8535634711b5de0390d5bc81dbedab1fbac6547e5b9ab3b03eb9a
tag.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-4bf30866264cf0b3fcbe77304ef647e0b3035659184354ed480f5093f1ef6a71
remote.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-498082829601479324d7f95e72bd35bafafe74be1b0d8e1b7a42e181b08f3639
__init__.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-f191cbe7c35d3f2b7544770f5da522ced01d8b8a4dc559350908261aea357a6c
base.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-3cc1aaf2f1e2bc1341d3f71ceec44b2762b981280b4d162e26327bd558721fe1
fun.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-f2cffc685a5db38b89ee1f237fba0d00f9d4d9a575f55d2edd374f3f31422b89
types.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-7b61e3545630e0a388178487cb7018546b39eb3f92e6553c18c3c3e11300cfda
util.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-cb13395ac36dd593e722ec548880a091f39732af5c934880144d1a95de67944e
setup.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-60f61ab7a8d1910d86d9fda2261620314edcae5894d5aaa236b821c7256badd7
helper.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-40ae45f85a8b0daaafdc002d6bd2f4c6701b6b248332c67f15d3c15a425de3ba
__init__.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-c22485fb49f875c71c7f84bdfb5fb37bd06079a4476de4d2e7aa433d2aa57ea2
lib.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-62c270efb9dfef7e53af835281290afdaa632d19f3585c9a1229fa5caf12acd9
test_commit.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-988836a17d05309570a573a30540ead5fe2d921bade7c278aa0595303a70a509
test_odb.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-62bc146f8d3b3bba2ad7ff4a612c91e49f2206285422c3f93e78bb0c2998cd3a
test_streams.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-ed7679c852f68d031e34346141b0786458e6fb6ef930a7aa1a43b3a3b4761043
test_actor.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-a7ac66e9d5123327116e7876b1ab0e226722290cdce9b129ba1568e237f8c97e
test_base.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-1a293b58d544ac5f9d384afd0652dc7e9e17ae7564df252dd5a8fc39543ee0e6
test_blob.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-2bc1b90d8337d179db607ff3880654625fd7bbee29a86ca8ec8f4254b96548d7
test_clone.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-55c336bc9212ba346c26cda95a6fb0702302ec3969e205ba85ac76db08447194
test_commit.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-3c31ae447cf005d000406f21d8ba228d2313390175fbac5be1e21736aaa7fcb0
test_config.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-45fa5f8530eb815c0cf606032e587adedb04dc70e59b203535d51c44654cfc4d
test_db.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-98e1a3bf9da516572de393e53b0fa04b60042708bca70f034eded93043ace822
test_diff.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-a4c794e0849bb401148549f5efcaa756477ae6f7c2976d2ebf7cb56ff7850139
test_docs.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-e8640c3e0d2b1139c3e2ac635af5416e976b99fb1e2c5b4745830991dc492723
test_exc.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-a7073032529740bf2d5234cbf7f4b712f5de8e5855f8d2a1f192fc65d8b670bb
test_fun.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-5cb2634f8f8900d1066de2a2bcb417aa8acb26f269168a362b2d4e986a216763
test_git.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-84c4b72d5c62026240fad69041a453efc37f7336a89035b69672cce0e8beaca1
test_imports.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-431cbaef7bb0dc1b942fa8baf0a57464af55774d3c19893a65f6ace658d17743
test_index.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-21c27b991511d3d0e3a14b4dfb56017689de2fa114c3edf11c577bd1ce744b72
test_reflog.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-4c7bdbcdb981cb742df7609238f1bec1632aaa356289b82b960674edc52c5ad9
test_refs.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-0d8f1dff061a372fdf4946776e8277a271774b10c1684d1c28c1abd030340d0c
test_remote.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-8f71eea0871a97cc5c7757598e3ffaeacb8cd38f6f5f1742e21fd07364d3a698
test_repo.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-f50d635cf31b095a03b42fc1a73681a9c4025bbeb58b81e72588ba37e00cff87
test_stats.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-4722e7c0f5b4c6be6f9e2f35cea9841e63b839754ab07accac9dd9468af02d23
test_submodule.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-78179a32c1d54a6b78b018ee57328d6ea9424fbfbdbb36caf15e290331621024
test_tree.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-7cdd6fb66d4a6f7b0d0dd20479ff5bc7a21988663cf8c80d5d87e26ec2c6c4f2
test_util.py https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-62b93f19eeb2c5ff6e26eaccf3f63ee6641e87f3a6ccfc2ffb0dec86925ae245
git/__init__.pyhttps://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-6789dd4ae9fe98745671baf3f0e86d8ead5505232e6ecb26a3760ca10c636c63
View file https://togithub.com/EliahKagan/GitPython/blob/d524c76a460b339b224c59b6753607eb2e546b2a/git/__init__.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://togithub.com/gitpython-developers/GitPython/pull/1880/{{ revealButtonHref }}
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-6789dd4ae9fe98745671baf3f0e86d8ead5505232e6ecb26a3760ca10c636c63
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-6789dd4ae9fe98745671baf3f0e86d8ead5505232e6ecb26a3760ca10c636c63
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-6789dd4ae9fe98745671baf3f0e86d8ead5505232e6ecb26a3760ca10c636c63
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-6789dd4ae9fe98745671baf3f0e86d8ead5505232e6ecb26a3760ca10c636c63
git/cmd.pyhttps://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
View file https://togithub.com/EliahKagan/GitPython/blob/d524c76a460b339b224c59b6753607eb2e546b2a/git/cmd.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://togithub.com/gitpython-developers/GitPython/pull/1880/{{ revealButtonHref }}
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
git/compat.pyhttps://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-2f2b548c14a71e5bbf15502f6d7fd98a50842119152c451ae2ec5e1cc42f02d2
View file https://togithub.com/EliahKagan/GitPython/blob/d524c76a460b339b224c59b6753607eb2e546b2a/git/compat.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://togithub.com/gitpython-developers/GitPython/pull/1880/{{ revealButtonHref }}
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-2f2b548c14a71e5bbf15502f6d7fd98a50842119152c451ae2ec5e1cc42f02d2
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-2f2b548c14a71e5bbf15502f6d7fd98a50842119152c451ae2ec5e1cc42f02d2
git/config.pyhttps://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-dd51b67c435dfba6f72cc0d08f99456393556623a0f098ac2808d1a7cb78d53a
View file https://togithub.com/EliahKagan/GitPython/blob/d524c76a460b339b224c59b6753607eb2e546b2a/git/config.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://togithub.com/gitpython-developers/GitPython/pull/1880/{{ revealButtonHref }}
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-dd51b67c435dfba6f72cc0d08f99456393556623a0f098ac2808d1a7cb78d53a
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-dd51b67c435dfba6f72cc0d08f99456393556623a0f098ac2808d1a7cb78d53a
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-dd51b67c435dfba6f72cc0d08f99456393556623a0f098ac2808d1a7cb78d53a
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-dd51b67c435dfba6f72cc0d08f99456393556623a0f098ac2808d1a7cb78d53a
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-dd51b67c435dfba6f72cc0d08f99456393556623a0f098ac2808d1a7cb78d53a
git/db.pyhttps://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-2c464f9c2a67eaec11758bfe4d275393bd7478c9315028ee3f158cf8587e5fb2
View file https://togithub.com/EliahKagan/GitPython/blob/d524c76a460b339b224c59b6753607eb2e546b2a/git/db.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://togithub.com/gitpython-developers/GitPython/pull/1880/{{ revealButtonHref }}
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-2c464f9c2a67eaec11758bfe4d275393bd7478c9315028ee3f158cf8587e5fb2
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-2c464f9c2a67eaec11758bfe4d275393bd7478c9315028ee3f158cf8587e5fb2
git/diff.pyhttps://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-300633890a1b325dfed86bb5120d89465f0687f4f6b8d5701c44c02f0eee723a
View file https://togithub.com/EliahKagan/GitPython/blob/d524c76a460b339b224c59b6753607eb2e546b2a/git/diff.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://togithub.com/gitpython-developers/GitPython/pull/1880/{{ revealButtonHref }}
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-300633890a1b325dfed86bb5120d89465f0687f4f6b8d5701c44c02f0eee723a
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-300633890a1b325dfed86bb5120d89465f0687f4f6b8d5701c44c02f0eee723a
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-300633890a1b325dfed86bb5120d89465f0687f4f6b8d5701c44c02f0eee723a
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-300633890a1b325dfed86bb5120d89465f0687f4f6b8d5701c44c02f0eee723a
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-300633890a1b325dfed86bb5120d89465f0687f4f6b8d5701c44c02f0eee723a
git/exc.pyhttps://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-1eee00ab107f6bfb1dedb97cf16cbd369028c3382cd80deb8e0c902fff9536b0
View file https://togithub.com/EliahKagan/GitPython/blob/d524c76a460b339b224c59b6753607eb2e546b2a/git/exc.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://togithub.com/gitpython-developers/GitPython/pull/1880/{{ revealButtonHref }}
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-1eee00ab107f6bfb1dedb97cf16cbd369028c3382cd80deb8e0c902fff9536b0
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-1eee00ab107f6bfb1dedb97cf16cbd369028c3382cd80deb8e0c902fff9536b0
git/index/__init__.pyhttps://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-3252ba40454a195504978f4ddeaf9641d70a2889853301e14d321a4d426487d8
View file https://togithub.com/EliahKagan/GitPython/blob/d524c76a460b339b224c59b6753607eb2e546b2a/git/index/__init__.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://togithub.com/gitpython-developers/GitPython/pull/1880/{{ revealButtonHref }}
https://togithub.com/gitpython-developers/GitPython/pull/1880/files#diff-3252ba40454a195504978f4ddeaf9641d70a2889853301e14d321a4d426487d8
Please reload this pagehttps://togithub.com/gitpython-developers/GitPython/pull/1880/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.