René's URL Explorer Experiment


Title: Issue and test deprecation warnings by EliahKagan · Pull Request #1886 · gitpython-developers/GitPython · GitHub

Open Graph Title: Issue and test deprecation warnings by EliahKagan · Pull Request #1886 · gitpython-developers/GitPython

X Title: Issue and test deprecation warnings by EliahKagan · Pull Request #1886 · gitpython-developers/GitPython

Description: Scope Some deprecations in GitPython had no associated DeprecationWarning, and none had unit tests to verify that the warnings were issued under the intended circumstances. This adds... warnings, tests of the warnings, and where applicable, tests for subtle problems that can arise from adding the warnings as new runtime behavior on attribute access (see below for details) ...for everything in GitPython that is documented as deprecated in comments and/or docstrings, except where a DeprecationWarning is intentionally not issued either because some other kind of warning is emitted or because there is a specific reason not to do so: Deprecated attributes of the top-level git module that are listed in __all__ for compatibility intentionally do not warn because it would lead to developers silencing warnings if they don't want to see them when exploring in a REPL and using a wildcard import. (Deprecated attributes of git that are not listed in __all__ do warn.) Setting the HIDE_WINDOWS_KNOWN_ERRORS and HIDE_WINDOWS_FREEZE_ERRORS environment variables is deprecated, as noted in git/util.py, but this is expected to be entirely a user behavior rather than a behavior of code calling GitPython, and as such it already emits a warning with the logging framework. It may be worthwhile to test for this warning, but hopefully that code can simply be removed soon (and its existing tests thinned out further) by making the test suite entirely responsible for any special test-related rmtree behavior (#790). Passing $var, ${var}, and or Windows %var% notation in paths to expand environment variables is deprecated since #662. The current behavior is to try to issue UserWarning (which is seen in more situations than DeprecationWarning) except when expand_vars is available and False has been passed for it (suppressing the expansion). Besides that these are not DeprecationWarnings, I consider this to be its own issue, as there are design decisions to be made about multiple aspects of it, which should probably be made together. This also intentionally causes three previously accepted usages to be treated as static type errors: The way the deprecation warning is added for git.types.Lit_commit_ish is selected to also make it always a type error to appear in any annotation. Due to #1858 and #1859, it is implausible that any annotation with Lit_commit_ish has been, or is currently, correct. (It is nonetheless not removed, since doing so could cause new exceptions at runtime, including in working code.) Note that this does not affect anything else in git.types; other types there, including Commit_ish, can be used correctly, are not deprecated, and continue to work, including in annotations. Although mypy does not consider nonpublic attribute access a type error or attempt to detect it, pyright does, and the util attribute of the top-level git module is now identified as nonpublic. The git.util module (from git.util import X) is of course public, but due to the effect of a past wildcard import and the continued need to avoid breaking code outside GitPython that my have ended up depending on it, the util attribute of git actually aliases the git.index.util module. Because util has never been listed in git.__all__ (including when it had been dynamically generated), it is effectively nonpublic, but pyright treated it as public based on being temporarily set as the git.util module before being set to git.index.util. It is retained in dir() and its deprecation warning notes how it is a special case, but it is now seen as nonpublic. Some other aliases to modules that are not direct Python submodules of the top-level git module had in the past been created by wildcard imports. These are still accessible, for now, but since there has never been a reason for anyone to consider those aliases part of GitPython's public interface, they are now regarded as absent (and an error to access) by static type checkers. They are also now omitted from dir(), though this is to avoid confusion with actual direct Python submodules of git much more than to discourage their use. Other typing-related efforts here are of the opposite kind: making sure things don't break or change significantly. Two other notable aspects of the scope: The changes made to provide the runtime behavior of issuing DeprecationWarning when deprecated module-level attributes are accessed is, by its nature, immediately ready to also cover the case of a dynamically computed git.__version__ attribute, as discussed in #1716 (comment). See also this exploration of approaches to that. But to avoid bloating the scope, that change is not included in this PR; instead, a comment notes where that logic would go. Building further on #1782 and #1787, I expanded the Git.USE_SHELL docstring to better explain the deprecation and to be more helpful in presenting the issues and what to do instead of setting it to True. However, I suspect it may benefit from some further expansion soon to clarify the risks (though maybe I can figure out a way to remove or abridge some parts so it doesn't keep growing). I regard the USE_SHELL deprecation to be core to this whole PR, because I think of everything deprecated in GitPython that it is where the greatest risk of usage that is unaware of the disadvantages may be. It is also a class attribute, which is naturally capable of being read and written on the Git class as well as read (but not written) through Git instances. Making class attribute accesses issue warnings without breaking anything else is nontrivial, and while the approach I have taken avoids most possible pitfalls, some potentially remain. But I believe the value of surfacing this deprecation and its rationale is sufficient to justify it, both in and of itself, and when considering the effect that issuing other deprecation warnings but not this one would have in creating the false appearance that this deprecation is less important (when really it is more). Further details on this are below, and also in the tests. Avoiding subtle problems In many places, issuing a warning if it was not already issued, and testing it, were straightforward, because the warning should occur exactly when code in the body of some function runs, so the code to issue the warning can simply be added there, usually at the top of the function. The case of git.util.Iterable is less basic, involving a metaclass for the deprecated class, but that was already implemented, so all it needed were unit tests where derived classes were locally defined while capturing and verifying the expected DeprecationWarning. Furthermore, some deprecated attribute accesses were basic cases, because they were already properties, so where warnings were absent it was sufficient to warn in the already existing property accessor. In contrast, on attribute accesses that are not already properties or otherwise dynamically customized, adding new runtime behavior, even just to issue a warning, should be done carefully--if at all, but see below on rationale--because there are three kinds of things it can break, that can easily go undetected unless tested for explicitly: Access to the attribute in less common ways that ought to work for the sake of correctness or practicality. Access that should not work, such as writing a read-only attribute, should fail with the same exception as before and the same or a similar message, and with no state change. Runtime metadata. For example, some ways of customizing attribute access cause the attribute not to appear in dir(), which is often unintentional, and some ways of attempting to fix that cause other conceptually unrelated attributes not to appear in dir(). Another example is generated documentation, which is sometimes okay to change but should remain useful: Sphinx must find and use docstrings, and generated help from the help builtin (or pydoc) should at minimum not stop indicating that an attribute is deprecated as a consequence of changes made to issue a warning. When possible, attributes with an important default value that is shown by help() should continue to show it. Static typing. Static type checkers such as mypy and pyright treat __getattr__ and __getattribute__ methods to mean that arbitrary attributes are permitted. This is often good, since for example it makes it so code accessing dynamic callable attributes of Git instances is not analyzed as having type errors. But when such a method is added where fully dynamic attribute lookup is not conceptually correct, if done in view of the type checker (i.e., not hidden behind if not TYPE_CHECKING), it causes attempts to use misspelled or otherwise bogus attributes to be analyzed as correct and returning the Any type, on which subsequent operations also are treated as Any and not warned about, and so on. The other subtlety about static typing is the distinction between analyzing GitPython and analyzing another codebase that uses GitPython. For example, #1656 was not observed by GitPython's own static analysis because the project only uses mypy internally but both mypy and pyright are popular static type checkers; and #1349, which happens with mypy, nonetheless was not internally observed because of differences between running mypy on GitPython and running it on another project that uses GitPython (which partly have to do with configuration). The first and second of those points are covered in detail by substantial regression tests that engage with a number of their ramifications. The tests have docstrings and I believe they present the considerations, as well as why those considerations led to the specific implementation approaches used, clearly. But there are three exceptions to this: The effect on Sphinx-generated documentation and documentation displayed by help() I checked manually instead. Likewise, I manually checked exception messages, but this was based on a judgment that these were low risk in the design approach I took, where either the messages where written explicitly (in module-level __getattr__) or were delegated to Python through super() in overridden special methods. Because the implementation approach might change in the future, which is something the new tests usually try to accommodate, I do not consider the omission of exception-message assertions to be ideal. But the messages are not guaranteed to be the same in every version of Python and do change in some Python releases. The changes required to issue warnings on all accesses to Git.USE_SHELL are significant, and probably only justified because of the special value of issuing those particular warnings. (Their rationale is examined below.) In view of the importance of maintaining robust and accurate static type checking at the boundary of GitPython and code that uses it, I took the somewhat unusual approach of developing many of the tests in a separate project first while experimenting with and implementing some changes on my feature branch of GitPython. Then I used git-filter-repo and a couple of rebases to include those commits in my GitPython feature branch, broken up into a few chunks, and interleaved with the changes they test, in what seemed like the most honest order. Although CI results seem to be interesting on each commit and could be viewed in my fork in case interest arises, for those parts I'm pushing only the tips of each chunk, because there are many commits. Doing it that way also seems like it should make it easier to see where the chunks are. The new tests should be type-checked within the GitPython project in the same way the code of the git module is type-checked (whatever that is, i.e., I am not advocating that continue-on-error be removed from the mypy step of pythonpackage.yml at this time). To facilitate this, I have put them in their own directory within test/, fully type-annotated them, configured mypy to be runnable with no arguments and scan both git/ and test/deprecation/, and and modified the pythonpackage.yml CI workflow, tox.ini, and README.md with that simpler yet now slightly broader command. This has the potential eventual disadvantage that splitting up tests of the same units of code into multiple test modules could be unwieldy, if many more new test subpackages alongside test.performance and test.deprecation end up popping up for separate unrelated reasons in the future. However, it has the advantage that all deprecations except those for which no DeprecationWarning is issued for some special reason (see above) can now be efficiently discerned by examining those tests. For this reason I think this is justified at the moment and potentially even permanently. Running mypy in GitPython shows the same five errors as it did as of the reduction in #1859, none of which are in areas sufficiently related to anything touched here that they would stand to obscure problems introduced here. Rationale and design considerations of USE_SHELL warnings I believe that what I have done for Git.USE_SHELL requires a specific rationale. The reason is that, to issue the deprecation warnings, I have caused the Git class to have a custom metaclass. On the one hand, this should probably not break anything. As noted in the test_git_cmd.py module docstring, this could potentially break existing code by causing a metaclass conflict, if code that uses GitPython is not only inheriting from the Git class, and not only using it in multiple inheritance, but using it in multiple inheritance with at least one sibling class that has its own unrelated custom metaclass. The narrow considerations are: This is arguably plausible, since abc.ABC uses the custom metaclass abc.ABCMeta and therefore all classes derived from abstract base classes have it, including concrete leaves in such a hierarchy. Also, explicitly naming a protocol as a base class also entails having a custom metaclass. (Satisfying a protocol in the usual way by having all the appropriate members of course does not entail gaining a custom metaclass.) However, this seems like a fairly low risk, especially considering the propensity for interference between the effectively unlimited number of dynamic "methods" of Git instances, and the functionality of other classes in multiple inheritance. I would question what successful applications there are of multiple inheritance with a custom metaclass and Git as a sibling. To be clear, the issue is not strictly that it breaks multiple inheritance with other unrelated custom metaclasses, but rather that it would be a breaking change to other such code that already exists, because that code would have to be modified to define and use a new metaclass that inherits from both metaclasses. It seems to me that it may be justified based on the idea you have expressed there which, if I understand it correctly, entails at least that it is not of paramount importance to support unusual and inherently brittle forms of inheritance from Git that are not known or believed to be in current use. But the broader consideration is... how can this possibly be? How can it be necessary to use a metaclass just to add a side effect to class attribute access? Intuitively it feels like a descriptor, in the Git class, could do it. But a descriptor can only customize: All forms of access (getting, setting, and deleting) on an instance of the class it is placed in. Only reading on the class itself that it is placed in. This is to say that: __get__ (not to be confused with __getattr__ or __getattribute__) is called for both instance and class getattr operations (its instance parameter may be None). __set__ (not to be confused with __setattr__) is called only for instance setattr operations; getting the attribute from the class does not call __set__ but simply replaces the descriptor object. __delete__ (not to be confused with __delattr__ or __del__) is analogous to __set__, being called only for instance delattr operations; deleting the attribute from the class does not call __delete__ but simply removes the attribute (dropping the reference to the descriptor object). Therefore, neither custom descriptors, nor properties (due to property objects being descriptors) will do this for us in the Git class itself. Likewise, __getattr__, __getattribute__, and __setattr__ won't do it, because they only ever customize attribute access on instances of the class they are defined in. (This differs from __getattr__'s use in a module, where it customizes access in that module.) More precisely, none of these things will do it by themselves. They can warn on access to the USE_SHELL class attribute through instances (which I have done, with __getattribute__ in Git). They could even warn on accesses by reading it from the class; but not about the most dangerous operation most meriting a warning, which is setting it on the class. While the unit tests provide protection against technical pitfalls, as well as regression protection if the implementation strategy is changed in the future without accounting for all subtleties, they fundamentally cannot answer the underlying design question of whether the importance of warning about USE_SHELL is sufficient to justify the implementation. As I note in the test_cmd_git.py docstring: GitPython/test/deprecation/test_cmd_git.py Lines 54 to 56 in 10e0fc2 The tests in this module do not establish whether the danger of setting Git.USE_SHELL to True is high enough, and applications of deriving from Git and using an unrelated custom metaclass marginal enough, to justify introducing a metaclass to issue the warnings. As mentioned above and elsewhere, I believe it is justified. However, I am willing to make changes, including if necessary removing _GitMeta altogether. Assuming it is to be kept, a remaining question is whether it is better or worse to provide a public alias to the metaclass. It can of course be gotten with type(Git), but static type checkers consider such an expression anywhere in any type annotation to be an error. An alias does not commit Git to continue to have a custom metaclass, because it can be documented as aliasing its metaclass whether that metaclass is type or a custom metaclass. I've done that. I've made the tests for that alias, and the code of the alias and its docstring itself (which cautions against writing code that would need it as well as against using it in a type annotation when Type[Git] is meant), be the last two commits here. That is so they can easily be dropped or reverted if you think having that public alias is not an improvement.

Open Graph Description: Scope Some deprecations in GitPython had no associated DeprecationWarning, and none had unit tests to verify that the warnings were issued under the intended circumstances. This adds... warnings, ...

X Description: Scope Some deprecations in GitPython had no associated DeprecationWarning, and none had unit tests to verify that the warnings were issued under the intended circumstances. This adds... warnings, ...

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

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:b0d09454-a22b-958a-1ea0-d04b9a3df049
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idA44E:34EAA:10895CE:16DE306:6968A91E
html-safe-nonce04d9b36ef6d9bc1a5db4b24b2896e819a48ed2795931f13ee96fd0d507e17575
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBNDRFOjM0RUFBOjEwODk1Q0U6MTZERTMwNjo2OTY4QTkxRSIsInZpc2l0b3JfaWQiOiIzOTMyMDg3MjU4OTgxMTE2MTkwIiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0=
visitor-hmac8bae5e34e9655325667100a02f677a96f14d9ee514968b80b374aae2d29f3d0e
hovercard-subject-tagpull_request:1798818369
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/1886/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:altScope Some deprecations in GitPython had no associated DeprecationWarning, and none had unit tests to verify that the warnings were issued under the intended circumstances. This adds... warnings, ...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
Nonefdc7c66bd36a6c12eb8e771e806db863266e573fc299e77f27505a768d4f8a98
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
release3223a6503d318917691422cdadfbe16cd8fb21e5
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/gitpython-developers/GitPython/pull/1886/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fgitpython-developers%2FGitPython%2Fpull%2F1886%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://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fgitpython-developers%2FGitPython%2Fpull%2F1886%2Ffiles
Sign up https://github.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://github.com/gitpython-developers/GitPython/pull/1886/files
Reloadhttps://github.com/gitpython-developers/GitPython/pull/1886/files
Reloadhttps://github.com/gitpython-developers/GitPython/pull/1886/files
gitpython-developers https://github.com/gitpython-developers
GitPythonhttps://github.com/gitpython-developers/GitPython
Please reload this pagehttps://github.com/gitpython-developers/GitPython/pull/1886/files
Notifications https://github.com/login?return_to=%2Fgitpython-developers%2FGitPython
Fork 964 https://github.com/login?return_to=%2Fgitpython-developers%2FGitPython
Star 5k https://github.com/login?return_to=%2Fgitpython-developers%2FGitPython
Code https://github.com/gitpython-developers/GitPython
Issues 169 https://github.com/gitpython-developers/GitPython/issues
Pull requests 8 https://github.com/gitpython-developers/GitPython/pulls
Discussions https://github.com/gitpython-developers/GitPython/discussions
Actions https://github.com/gitpython-developers/GitPython/actions
Security Uh oh! There was an error while loading. Please reload this page. https://github.com/gitpython-developers/GitPython/security
Please reload this pagehttps://github.com/gitpython-developers/GitPython/pull/1886/files
Insights https://github.com/gitpython-developers/GitPython/pulse
Code https://github.com/gitpython-developers/GitPython
Issues https://github.com/gitpython-developers/GitPython/issues
Pull requests https://github.com/gitpython-developers/GitPython/pulls
Discussions https://github.com/gitpython-developers/GitPython/discussions
Actions https://github.com/gitpython-developers/GitPython/actions
Security https://github.com/gitpython-developers/GitPython/security
Insights https://github.com/gitpython-developers/GitPython/pulse
Sign up for GitHub https://github.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://github.com/login?return_to=%2Fgitpython-developers%2FGitPython%2Fissues%2Fnew%2Fchoose
Byronhttps://github.com/Byron
gitpython-developers:mainhttps://github.com/gitpython-developers/GitPython/tree/main
EliahKagan:deprecation-warningshttps://github.com/EliahKagan/GitPython/tree/deprecation-warnings
Conversation 5 https://github.com/gitpython-developers/GitPython/pull/1886
Commits 89 https://github.com/gitpython-developers/GitPython/pull/1886/commits
Checks 0 https://github.com/gitpython-developers/GitPython/pull/1886/checks
Files changed https://github.com/gitpython-developers/GitPython/pull/1886/files
Please reload this pagehttps://github.com/gitpython-developers/GitPython/pull/1886/files
Issue and test deprecation warnings https://github.com/gitpython-developers/GitPython/pull/1886/files#top
Show all changes 89 commits https://github.com/gitpython-developers/GitPython/pull/1886/files
2382891 Test that deprecated Diff.renamed property warns EliahKagan Mar 27, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/2382891377f60c1467c1965b25e3ecf293f39b80
e7dec7d Have the deprecated Diff.renamed property issue a warning EliahKagan Mar 27, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/e7dec7d0eecc362f02418820a146735a68430fbd
a8f109c Fix exception in Popen.__del__ in test on Windows EliahKagan Mar 28, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/a8f109ca1704827b017349d6d97f8a0a3229d9a8
fffa6ce Test that the preferred renamed_file property does not warn EliahKagan Mar 28, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/fffa6cea663b179c0e5d53cf5eb93159e2bbc3b0
bc111b7 Add a TODO for simplifying the single_diff fixture EliahKagan Mar 28, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/bc111b799b06990fd7dde6385265d0e6d3a6289d
e3728c3 Decompose new fixture logic better EliahKagan Mar 28, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/e3728c3dca9cac2b49f827dbf5d1a100602f33d9
ff4b58d Extract no-deprecation-warning asserter as a context manager EliahKagan Mar 28, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/ff4b58dd56d382b26d83f2f41f7d11d15e9db8dc
2c52696 Test that the deprecated Commit.trailers property warns EliahKagan Mar 28, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/2c526962ebf0a5d4d31a725577db112f2ce60447
03464d9 Have the deprecated Commit.trailers property issue a warning EliahKagan Mar 28, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/03464d90a66caf6a5d8dbbd37318758331c85168
9d096e0 Test that Traversable.{list_,}traverse, but not overrides, warn EliahKagan Mar 28, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/9d096e08d7645bc5206c4728b45efcf26486b635
21c2b72 Use the :exc: Sphinx role for DeprecationWarning EliahKagan Mar 28, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/21c2b72b019627dba81b35085117b79660567abd
ca385a5 Test that subclassing deprecated git.util.Iterable warns EliahKagan Mar 28, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/ca385a59439006355de02ddab9012031e8577e41
8bbcb26 Call repo.close() instead of manually collecting EliahKagan Mar 28, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/8bbcb26ea6e798a10969570d24cd5e9c401feed7
b8ce990 Better name and document the basic deprecation test module EliahKagan Mar 28, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/b8ce99031d3183a895f15e49fb7149a56a653065
61273aa Annotate basic deprecation tests; have mypy scan it EliahKagan Mar 29, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/61273aa2084ada8c48d0f9e511556d3d72eec32c
b7a3d8c Start on top-level module attribute access regression tests EliahKagan Mar 19, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/b7a3d8c08537d00aac065b7dcbe1a4896919ee07
105f500 Test attribute access and importing separately EliahKagan Mar 19, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/105f50056126a73e8cbfeb0d1157695fe6b296b1
859e38c Expand to test top-level deprecated names EliahKagan Mar 21, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/859e38cfb395e6a937c30fedd36a9b3896747188
46a739d Hoist `import git` to module level in test module EliahKagan Mar 21, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/46a739da24331849323a7c583ffd61a51583d3c1
a2df3a8 Test static typing of private module aliases EliahKagan Mar 21, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/a2df3a8283274dda9236d0d41cf44a38317560cb
a15a830 Improve a couple test case docstrings EliahKagan Mar 21, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/a15a830d47089ba625374fa3fd65e8568b7e0372
dbaa535 Add a couple missing assert keywords EliahKagan Mar 21, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/dbaa535e47b61db0f9ce29c65b2a6616f6454196
d00c843 Clarify how test_private_module_aliases is statically checkable EliahKagan Mar 21, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/d00c843434806389bfb0bf7992505f358e97513f
983fda7 Move mark-sharing tests into a class EliahKagan Mar 21, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/983fda774a6eedda3b62ac2fa94ce54675a5f662
19acd4c Add FIXME for what to do next EliahKagan Mar 22, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/19acd4cf551dfd6c7774e1ca7794ef83b321c8b6
f39bbb5 Fix a test docstring EliahKagan Mar 22, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/f39bbb5172987b0462b5d1845c0cb0cf3824b3d5
aee7078 Test resolution into git.index.util using git.util EliahKagan Mar 22, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/aee7078e28b5de9bb5cd605ff23f37d7328dccc9
7f4a191 Fix brittle way of checking warning messages EliahKagan Mar 22, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/7f4a19135c755065538d13ed4faeb9c10cc203c8
d08a576 Clarify todo EliahKagan Mar 22, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/d08a5768f6e8aa78de5f10c7e7a0777d2e4dfec3
9d58e6d Start reorganizing new tests more in the GitPython style EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/9d58e6d367dc4651213e674b9f586e0a18d787bc
45c128b Finish reorganizing; fix assertion for duplicated messages EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/45c128bcd82cd278d7926425179503c22ce1271c
247dc15 Add imports so pyright recognizes refs and index EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/247dc15fd81ecc806be732d7f1ef0c12e26920d8
b05963c Expand and clarify test module docstring EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/b05963c3749494f633117316a493ab2b179e0069
074bbc7 Tiny import tweak EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/074bbc72a84db7605f3136dc9f4b4ad822a3b481
18608e4 Pick a better name for _MODULE_ALIAS_TARGETS EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/18608e472535149e542cc30ff95755ed962c9156
1f290f1 Use typing_extensions only if needed EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/1f290f17943be338bb79a54ce1bef21e90da4402
7a4f7eb Fix zip calls EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/7a4f7eb092fbf68b058de38ee2df193c86d4e34e
5977a6e Fix (and improve wording) of docstrings EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/5977a6ec9e1646ac94514428a0ad2363be8da2f9
5b1fa58 Remove extra import "from typing_extensions" EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/5b1fa580400c386932eb9f66c568e4e0090e2779
a07be0e Start on test_compat EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/a07be0e35118874f682fa2e2be3b793170bf4853
d4917d0 Expand to test all three is_ aliases EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/d4917d0a326d935ee0d6728af3268e9ece8b09df
f4e5f42 Slightly improve docstrings EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/f4e5f423f019c7d04798c896118f7fd48b8c3155
d54f851 Add test of dir() on git.compat EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/d54f851d52f4217e904cbd163032aabbf33ec394
aaf046a Add static type assertions to is_platform test EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/aaf046aba4b46fbe0dddf8c10d31f42b6c4d7c57
84d734d Refactor test_compat.test_dir for clarity EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/84d734d5b88cb8a03ab723f92bf83593d53d030f
3a621b3 Add top-level dir() tests EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/3a621b38ee98a1d1413a12fcb68aae17d102f396
05e0878 Remove old comment meant as todo (that was done) EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/05e0878aef38a5fb1cb3d5860b3649cf7c1d4fda
3fe2f15 Test that top-level aliases point to modules with normal __name__ EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/3fe2f15d218744496e4af77b6a7926791480adfe
246cc17 Use names directly on other tests EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/246cc1703f69e8eba791915bb025945b03abc86b
d7b6b31 Fix a small docstring typo EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/d7b6b31f632593bf9e280fbb2be87dd4e16ef7c5
96089c8 Improve description in test module docstrings EliahKagan Mar 23, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/96089c82c0d8982935bbd3326ccfea36ce72e43b
a0ef537 Start on test_types EliahKagan Mar 24, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/a0ef53778d4ae665474ebd96bd25ebbb340a8a16
52e7360 Explain substring assertions in test_toplevel EliahKagan Mar 24, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/52e7360cad2ebde77a1302b205eb7cf9182a75c2
e3675a0 Expand Lit_commit_ish test name and write docstring EliahKagan Mar 24, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/e3675a086fe6ddfb6f8e4050497d47a74e851ed7
4857ff0 Clarify test_compat.test_dir EliahKagan Mar 24, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/4857ff08fc9ae0183b65a4b94bd0813bd08a74b4
488cc13 Add test of dir() on git.types EliahKagan Mar 24, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/488cc13a5b125be886bb361342b8e4709c7944ba
19b3c08 Clarify comment about is_ value assertions EliahKagan Mar 24, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/19b3c0820b607558b3bc52d3d9f3841295f04ac5
28bd4a3 Issue warnings for some deprecated attributes of modules EliahKagan Mar 20, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/28bd4a3f6e562eadc1018ee7c4d561a3c4352fb5
dffa930 Refine deprecated module attributes and their warnings EliahKagan Mar 24, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/dffa930a426747d9b30496fceb6efd621ab8795b
7ab27c5 Start on test module about Git.USE_SHELL and Git attributes EliahKagan Mar 24, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/7ab27c5bb1891af9eec7a99e33ea35e234e322d5
af723d5 Make test_use_shell_on_class more robust EliahKagan Mar 25, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/af723d5eb04dc919f76369c0b44a087638217352
bf13888 Write most remaining Git attribute/deprecation tests EliahKagan Mar 25, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/bf1388896ac2d052cf956123513f0c8b33f34dd6
602de0c Begin multiprocessing misadventure EliahKagan Mar 25, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/602de0c93572972d29d33c4ecacfd9c6e192484a
d4b50c9 Somewhat clarify multiprocessing misadventure EliahKagan Mar 25, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/d4b50c94ff3694e3285a1ea8ed9b42c685726baf
02c2f00 Discuss multiprocessing in test module docstring; remove bad test EliahKagan Mar 26, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/02c2f0008082e710ddb73f1c4ff784b74eed4f8f
46df79f Discuss metaclass conflicts in test module docstring EliahKagan Mar 26, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/46df79f75e6ee4db9852c398ec99a5788fd966b2
40ed842 Revise test module docstring for clarity EliahKagan Mar 26, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/40ed842cf35b0c280dc408d77c764988a2d2746a
6a35261 Test that USE_SHELL is unittest.mock.patch patchable EliahKagan Mar 27, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/6a35261ab6a58bfd8fbb2b008aacfb2decf27053
e725c82 Make the restore_use_shell_state fixture more robust EliahKagan Mar 27, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/e725c8254cccd88d02b38b414bac875212a7074b
436bcaa Add `type: ignore` in test that we can't set USE_SHELL on instances EliahKagan Mar 27, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/436bcaa85712f73640ac719679d6d1366c376483
febda6f Clarify unittest.mock.patch patchability test docstring EliahKagan Mar 27, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/febda6f6e9aa56f4b525020153ed88459906641f
4037108 Test that Git.execute's own read of USE_SHELL does not warn EliahKagan Mar 27, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/40371087ac83497f307d2239f36646a321028829
0e311bf Suppress type errors in restore_use_shell_state _USE_SHELL branches EliahKagan Mar 27, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/0e311bf5da4332acd314aa6927138b36bbd9e527
df4c5c0 Fix wrong/unclear grammar in test_instance_dir docstring EliahKagan Mar 28, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/df4c5c03d14a53448a232a78eeab94017ac7e7ba
d38e721 Issue warnings whenever Git.USE_SHELL is accessed EliahKagan Mar 27, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/d38e721c1f35695ecdaf6e88b721881fb7b3ed6f
05de5c0 Implement instance USE_SHELL lookup in __getattr__ EliahKagan Mar 27, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/05de5c0d3bc81f4d56283399417db2f6927fe233
04eb09c Have USE_SHELL warn but work like normal via super() EliahKagan Mar 27, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/04eb09c728fbdc4501fbbba1d6f58a0bb7050470
c6f518b Keep mypy from thinking Git has arbitrary class attributes EliahKagan Mar 27, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/c6f518b40e42d394dfbcf338aacf101cad58b700
c5d5b16 Clarify that the private name mangling is intentional EliahKagan Mar 27, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/c5d5b16bfb4829dd510e3ff258b3daca4cd3b57d
84bf2ca Read USE_SHELL in Git.execute without DeprecationWarning EliahKagan Mar 27, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/84bf2ca034721cd54e792f57585083a1dbffc6ea
5bef7ed Add GitPython project top comments to new test modules EliahKagan Mar 29, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/5bef7ed7369e1d6f93161607e01dc02bcd1720ab
3da47c2 Hide `del util` from type checkers EliahKagan Mar 29, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/3da47c26db44f287fa2b10e95995689de1f578bc
bdabb21 Expand USE_SHELL docstring; clarify a test usage EliahKagan Mar 29, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/bdabb21fe62063ce51fcae6b5f499f10f55525c5
b51b080 Explain the approach in test.deprecation to static checking EliahKagan Mar 29, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/b51b08052821f91a61a40808328aed0ac35935a8
7cd3aa9 Make test.performance.lib docstring more specific EliahKagan Mar 30, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/7cd3aa913077d55bbdb7ca01e6b7df593121f643
cf2576e Make/use test.deprecation.lib; abandon idea to filter by module EliahKagan Mar 30, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/cf2576e406006ec28bcc85565a7ef85864cbd39e
f92f4c3 Clarify security risk in USE_SHELL doc and warnings EliahKagan Mar 31, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/f92f4c3bf902c7fc3887cfd969b3e54f581f18f8
8327b45 Test GitMeta alias EliahKagan Mar 27, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/8327b458bdcf73895aa3b0a9a990a61ce2e54ee9
f6060df Add GitMeta alias EliahKagan Mar 27, 2024 https://github.com/gitpython-developers/GitPython/pull/1886/commits/f6060df576acda613227a57f03c01d235eceaeae
Clear filters https://github.com/gitpython-developers/GitPython/pull/1886/files
Please reload this pagehttps://github.com/gitpython-developers/GitPython/pull/1886/files
Please reload this pagehttps://github.com/gitpython-developers/GitPython/pull/1886/files
pythonpackage.yml https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-ee68bef8369ed7bc5460a288e72d62152784762ef66851e07bf134c4075a08f0
README.md https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5
__init__.py https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-6789dd4ae9fe98745671baf3f0e86d8ead5505232e6ecb26a3760ca10c636c63
cmd.py https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
compat.py https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-2f2b548c14a71e5bbf15502f6d7fd98a50842119152c451ae2ec5e1cc42f02d2
diff.py https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-300633890a1b325dfed86bb5120d89465f0687f4f6b8d5701c44c02f0eee723a
commit.py https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-88141770c3f374c9bacdef629c161e7bc75e7a1585827f5a35671b89df14291f
types.py https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-7b61e3545630e0a388178487cb7018546b39eb3f92e6553c18c3c3e11300cfda
util.py https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-cb13395ac36dd593e722ec548880a091f39732af5c934880144d1a95de67944e
pyproject.toml https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-50c86b7ed8ac2cf95bd48334961bf0530cdc77b5a56f852c5c61b89d735fd711
test-requirements.txt https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-fac4c6890301d4de5c3f4266837803d5240c84a3d8b6c735bbc6a64c39d2f94e
__init__.py https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-e38e6a3c1cc9fc8f003b95dcaf6c1aadcad7cc9ccd635b658d8c3c4d2694c046
lib.py https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-45dc45079c855adc45e723706c95ce9737f47f11893e99a54dbd1253c5aca77d
test_basic.py https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-61d213dc836f4f24dd667f7b8b24d50e77b239b23a672d3f12efcf3f1dc6db79
test_cmd_git.py https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-110d36a464ef6e2a045f21076675159a176c6e13c34066c2e81434e8daf8c21c
test_compat.py https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-063643f43d5252447227f9c4562bcfdc1b553b4c77c9c4bfa2cd88fdae367f5f
test_toplevel.py https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-f2d08113cc192653769b30fecd7eb25e82c5816e66e4e4f24cf2e61751e83e23
test_types.py https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-508b87a9ff4b5805f3ed73479c3e7346f4b396aedb56856614ac5d3a54561cac
lib.py https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-62c270efb9dfef7e53af835281290afdaa632d19f3585c9a1229fa5caf12acd9
test_git.py https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-84c4b72d5c62026240fad69041a453efc37f7336a89035b69672cce0e8beaca1
tox.ini https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-ef2cef9f88b4fe09ca3082140e67f5ad34fb65fb6e228f119d3812261ae51449
.github/workflows/pythonpackage.ymlhttps://github.com/gitpython-developers/GitPython/pull/1886/files#diff-ee68bef8369ed7bc5460a288e72d62152784762ef66851e07bf134c4075a08f0
View file https://github.com/EliahKagan/GitPython/blob/f6060df576acda613227a57f03c01d235eceaeae/.github/workflows/pythonpackage.yml
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/gitpython-developers/GitPython/pull/1886/{{ revealButtonHref }}
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-ee68bef8369ed7bc5460a288e72d62152784762ef66851e07bf134c4075a08f0
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-ee68bef8369ed7bc5460a288e72d62152784762ef66851e07bf134c4075a08f0
README.mdhttps://github.com/gitpython-developers/GitPython/pull/1886/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5
View file https://github.com/EliahKagan/GitPython/blob/f6060df576acda613227a57f03c01d235eceaeae/README.md
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/gitpython-developers/GitPython/pull/1886/{{ revealButtonHref }}
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5
git/__init__.pyhttps://github.com/gitpython-developers/GitPython/pull/1886/files#diff-6789dd4ae9fe98745671baf3f0e86d8ead5505232e6ecb26a3760ca10c636c63
View file https://github.com/EliahKagan/GitPython/blob/f6060df576acda613227a57f03c01d235eceaeae/git/__init__.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/gitpython-developers/GitPython/pull/1886/{{ revealButtonHref }}
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-6789dd4ae9fe98745671baf3f0e86d8ead5505232e6ecb26a3760ca10c636c63
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-6789dd4ae9fe98745671baf3f0e86d8ead5505232e6ecb26a3760ca10c636c63
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-6789dd4ae9fe98745671baf3f0e86d8ead5505232e6ecb26a3760ca10c636c63
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-6789dd4ae9fe98745671baf3f0e86d8ead5505232e6ecb26a3760ca10c636c63
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-6789dd4ae9fe98745671baf3f0e86d8ead5505232e6ecb26a3760ca10c636c63
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-6789dd4ae9fe98745671baf3f0e86d8ead5505232e6ecb26a3760ca10c636c63
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-6789dd4ae9fe98745671baf3f0e86d8ead5505232e6ecb26a3760ca10c636c63
git/cmd.pyhttps://github.com/gitpython-developers/GitPython/pull/1886/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
View file https://github.com/EliahKagan/GitPython/blob/f6060df576acda613227a57f03c01d235eceaeae/git/cmd.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/gitpython-developers/GitPython/pull/1886/{{ revealButtonHref }}
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
https://github.com/gitpython-developers/GitPython/pull/1886/files#diff-35a18a749eb4d6efad45e56e78a9554926be5526e2ba2159b44311e718450e88
Please reload this pagehttps://github.com/gitpython-developers/GitPython/pull/1886/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.