René's URL Explorer Experiment


Title: Test native Windows on CI by EliahKagan · Pull Request #1745 · gitpython-developers/GitPython · GitHub

Open Graph Title: Test native Windows on CI by EliahKagan · Pull Request #1745 · gitpython-developers/GitPython

X Title: Test native Windows on CI by EliahKagan · Pull Request #1745 · gitpython-developers/GitPython

Description: This expands the CI test matrix in the main test workflow, pythonpackage.yml, so that it is parameterized not only by Python version but also by operating system. Now it tests on both Ubuntu and Windows. It also adds conditional xfail markings with precise conditions and brief descriptions of the expected failures. Most of the detailed information about specific changes in this pull request is in the commit messages. I give general information here, as well as covering, in some detail, a few areas where I think it is not readily apparent (and maybe I am wrong) what the best approach is, or what changes should be included. Approach to adding xfail markings A number of tests were known always to fail on Windows, with some others known to fail on Windows on particular versions or other conditions. As discussed in #1654 (comment), I have not attempted to actually fix the failures. Instead, I have marked each failing test case with a conditional xfail marking with a description of the failure and the exception with which the test fails. I have sought to make the conditions precise. Most of them are simply that a test fails on native Windows, so the condition is os.name == "nt", but some of the conditions are more specific. In some cases there are really multiple independent expected causes of failure, so some have multiple xfail markings. (pytest supports stacking them in this way.) I have tried to document what is currently known about the failures, including known or suspected information about their causes, in the descriptions, and sometimes in more detail in the commit messages that added them. Sometimes this takes the form of a reference to an existing issue, and for some others there may be an existing issue I did not manage to identify, but it is likely that a few bugs are currently only "reported" in commit messages in this PR. In some cases I anticipate I can fix a bug soon; others might benefit from having an issue opened for them. (An exception is #1630, for which I added xfail marks in 6e477e3, which I did not document as thoroughly as I could have. I hope to open a PR to remedy #1630 as soon as Windows has CI test jobs--which if this PR is approved would be at that point--so I figured the commit message didn't need much information.) The WinBashStatus class in test_index Some more detailed information about this appears in commit messages. The original motivation for more precise detection of when bash.exe is the WSL wrapper was to fix CI. On the Windows CI runners, running bash.exe in a shell (any kind of shell) runs Git Bash, which is not related to WSL. But Popen finds the WSL-wrapper bash.exe in System32 instead, because the way searching for executables works on Windows differs significantly between the shell and non-shell case. This is an intentional design choice in Windows, not GitPython nor even Python itself. But I think it's accurate to say GitPython must contend with it and, more importantly, some users of GitPython may be relying on it, perhaps even without knowing they are. When a program is run without using a shell and a search must be performed because just the name of the executable is given, a few directories, including System32, are expected to be (and typically are) searched first, before the PATH environment variable is even used. This keeps a shutil.which-based technique from working. There are other important differences in search behavior of shutil.which and Popen, but that's the difference that's relevant here. There are three related issues: One of the tests currently fails on WSL bash, while passing on native bash (like Git Bash). When bash.exe is found in System32, and it is the WSL wrapper, that does not imply the existence of any installed distributions (i.e., GNU/Linux systems to run in WSL). This is a common situation. Even when some Windows components needed for WSL to work are not yet installed, bash.exe can exist there, yet it does not always. (This is also the situation on CI when WSL is not set up.) Because the tests are xfail when bash.exe is altogether absent, I think it makes sense also to xfail them in the common situation that bash.exe can't run bash in a WSL-hosted distribution because no such distribution is present. Distinguishing expected and unexpected WSL failures, and failures not related to WSL, is complicated by how, while determining the status of WSL on a machine is usually fairly easy interactively, it seems there is no trivial way to do so programmatically in way that covers all cases, or even all common cases. But the advantage of doing it seems significant to me: not only does this make it more efficient to interpret and document test failures, it also should be helpful in investigating and debugging possible future design changes that seek to build on #1399, in a sufficiently backward-compatible way, to retain its benefits (see #703, #971), while avoiding unexpected behavior. (If it can be done in a way that is non-breaking for current users of hooks on Windows, perhaps in the future Git Bash can be used as the default way to run hooks, with other approaches, including WSL, available as backup strategies or if specified.) I wrote WinBashStatus with the intention that, if necessary, it could be retained for an extended time. However, my hope for it is that it will actually disappear (perhaps with some insights from the process making their way into other code). If, in the future, hooks are run on Windows in a way that works on more systems, and has fewer strange edge cases, then there may be no more need for it or anything like it. I have tried to make it work properly locally as well as on CI. To work locally, it needs to avoid language and locale related limitations other than those those already present. Because some aspects of the approach I used are not obvious, I've included comments about it. They were originally longer, with parenthesized examples of locale-related situations, but that seemed more detailed than necessary, so I removed them in e00fffc. (But I can bring those back if desired.) Which versions should we test? This PR currently deviates from the preferences expressed in #1654 (comment) in one significant way, which can be changed if you wish. At the time of that discussion, we both held the view that it would be good to test only the lower and upper bounds of the supported version range for Windows. The process of adding these tests has led me to the view that it may be better, at least for now, to test all six versions on Windows (as is done on Ubuntu). Initially I had them all enabled for the purpose of developing the changes here and planned to remove some at the end, but the reason I now advocate keeping them all for the time being, are, from most to least significant: The native Windows tests are much faster than I had feared, running much closer to the speed of the Ubuntu jobs than of the Cygwin job. (This is especially remarkable considering that it holds up even with them installing Debian via WSL in the Windows test runner to run the hook tests in test_index.py. I think there is value in running those tests, but their xfail marks do consider bash.exe being the WSL wrapper, yet no WSL systems being installed, as an expected failure condition. So if necessary, the setup-wsl step can be dropped to gain that minute. As detailed below, I don't know if caching works for the runs in an open PR, so you may observe further delay here.) The conditions under which tests fail on Windows are weirder than I had expected, in at least one way that specifically benefits from testing more versions: TestSubmodule.test_rename newly fails in 3.12 with a "being used by another process" PermissionError, possibly due to GC changes. Because of the role of such errors in #790 and #1333, it seems to me that easily distinguishing what versions have a failure, before and after code changes that potentially affect the test, might be helpful in the near future. To do this would at least require a 3.11 job. The lower bound GitPython currently supports is 3.7. There are a number of important changes in 3.8, which so far seem not to have been an issue; most special-casing of 3.7 seems to have been in test suite only. To ensure that changes (including security fixes) are effective on 3.7, it should be tested on Windows. To decide what to do about it when that breaks, 3.8 should be tested as well. The latest Python build the Cygwin project currently packages is 3.9; for this reason, it is probably the most used on Cygwin, and it makes sense that it is the version tested in the Cygwin job. I had not until recently considered the benefits of being able to compare 3.9 results between native Windows and Cygwin. I think this would avoid situations where one might worry the problem is with 3.9, though that may only be a small boon. However, the stark difference in performance between native Windows and Cygwin makes me think the Cygwin job could be sped up. (For example, it may be possible to use the GitHub Actions caching feature to do I/O in a faster way for installing Cygwin and/or GitPython's dependencies in the Cygwin system.) This is another area where the ability to compare could be helpful. Most of the benefit could be gotten by testing 3.7, 3.8, 3.11, and 3.12 (the last point above is less compelling than the others, I think). However, this is still much more than the original idea of testing just a couple versions. It seems to me that the additional resource usage of testing two more versions is worthwhile for the benefit of comprehensively testing all the versions GitPython officially supports. I also think other approaches for decreasing undesired load might be preferable, such as removing fail-fast: false (the Ubuntu jobs, if desired, could still be set to continue even if another job has failed), skipping the documentation-building step on some or all Windows jobs, and/or either not installing WSL for the hook tests or switching the distribution to Alpine Linux. With many pushes over a short time--as for example in this pull request, where I pushed the commits separately with ten second delays in between, to make it easy to inspect intermediate CI results--there can be more jobs queued than immediately available runners. (I believe the number of runners is limited per organization.) It is in that case that the number of tests can be most of an issue. Even if you decide to accept this PR without the number of Windows jobs being decreased, it might turn out later that this is annoying. I accept that you may know now that you want fewer Windows test jobs, but also, I understand that if you accept this as it is now, that doesn't mean all the jobs will be kept forever. setup-wsl and caching On my fork, the setup-wsl step seems usually to take between 30 and 90 seconds, and most often near the low end. I did not disable GitHub Actions caching on setup-wsl. Based on how it works in my fork, I expect it to take up 82 MB. I think this is probably fine, and it can be turned off if desired, but I wanted to mention it just in case. I believe GitHub Actions caching quotas are per-organization. I expect that turning off caching (while still installing WSL) would make things somewhat slower. I am unsure if caching will actually work on it in the CI jobs run on this repository due to the pull-request trigger. My vague recollection is that caching does not happen for open PRs that introduce it. If that is the case, then the amount by which installing WSL slows down each Windows job, as observed here, may be more than I have observed. What is not done here It seemed to me that the bash.exe status classification logic in test_index (described above) was easier to do in this PR than separately, because it facilitates precise xfail markings. However, other substantial changes that could in principle be part of this PR but can be omitted are omitted. Specifically: I have not merged cygwin-test.yml into pythonpackage.yml. I had hoped to do that while adding native Windows tests, but I now think it is best deferred to a later PR. One reason is for more effective reviewing: if merging them produces conditional logic whose complexity is undesirable, it will be easier to notice the problem after the native Windows tests already exist for comparison. Another reason, though, is that I don't know what it will look like after changes have been made to it to speed it up (see above). If this involves adding caching, including for installing GitPython's dependencies, then that might cause it to diverge sufficiently from pythonpackage.yml that they should no longer be merged. I have not changed the distribution used for WSL in the tests from Debian to Alpine Linux, even though I suspect this would speed things up (perhaps especially if caching is going to be turned off in the setup-wsl step). This requires either a fix for setup-wsl#50 or a workaround. I have not added macOS jobs. I think this may be worth doing. I don't currently have the ability to test on Apple hardware. I can virtualize systems I don't regularly use in development, such as OpenIndiana or the Simplified Chinese localized build of Windows Server, on Ubuntu or Windows hosts. But virtualizing macOS is not similarly straightforward. Furthermore, some subtleties of Unix can be revealed by testing regularly on systems that are not GNU/Linux, of which macOS has GitHub Actions runners. (For #1738, the way I tested on macOS was to run a GitHub Actions job on a macOS runner with a tmate debugging step and SSH into it.) However, omitting that here limits scope and allows it to be evaluated separately. Limited testing indicates that, as on Windows, some different expected timings may have to be given in at least one of the performance tests in order to make macOS jobs pass. I have not reduced the complexity of rmtree and HIDE_WINDOWS_KNOWN_ERRORS tests in test_util. With native Windows CI jobs, some of the behavior that is specific to Windows (especially since #1739) can probably be tested only on Windows, and skipped otherwise. I think there should be a way to make this change in a way that simplifies the tests. (As one example, every os.name == "nt" in a @pytest.mark.parametrize parameter set would just become True.) But it's not at all necessary to do that to achieve the aims here, and it would delay this PR. I have not converted tests that skip due to unittest.SkipTest being raised in git.util.rmtree into xfail tests, made HIDE_WINDOWS_KNOWN_ERRORS default to False, or decreased its use (though I have made sure not to increase its use). It seems to me that such steps would be good progress toward a solution for #790, but I think they will be easier to do, as well as to review, if done after, and separately from, the addition of native Windows CI jobs.

Open Graph Description: This expands the CI test matrix in the main test workflow, pythonpackage.yml, so that it is parameterized not only by Python version but also by operating system. Now it tests on both Ubuntu and Wi...

X Description: This expands the CI test matrix in the main test workflow, pythonpackage.yml, so that it is parameterized not only by Python version but also by operating system. Now it tests on both Ubuntu and Wi...

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

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:d1fe357c-ba83-774b-8260-2dabb0b49666
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-id908C:24A0FE:1071B3:160987:6969C839
html-safe-nonce36ae429224b72205ba1d10e4489d34bbff34a6558f61a283f374c8b2ae728b1b
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5MDhDOjI0QTBGRToxMDcxQjM6MTYwOTg3OjY5NjlDODM5IiwidmlzaXRvcl9pZCI6IjU2NzA1Nzg1NzQ1OTA1OTMwODIiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ==
visitor-hmacb58a5f9d7b25ff72aaba1022912f5e4ae802c09c3a1a4ec0a05d2531507e005a
hovercard-subject-tagpull_request:1619320536
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/1745/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:altThis expands the CI test matrix in the main test workflow, pythonpackage.yml, so that it is parameterized not only by Python version but also by operating system. Now it tests on both Ubuntu and Wi...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
Noneacedec8b5f975d9e3d494ddd8f949b0b8a0de59d393901e26f73df9dcba80056
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
release83c08c21cdda978090dc44364b71aa5bc6dcea79
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/gitpython-developers/GitPython/pull/1745/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fgitpython-developers%2FGitPython%2Fpull%2F1745%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%2F1745%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/1745/files
Reloadhttps://github.com/gitpython-developers/GitPython/pull/1745/files
Reloadhttps://github.com/gitpython-developers/GitPython/pull/1745/files
gitpython-developers https://github.com/gitpython-developers
GitPythonhttps://github.com/gitpython-developers/GitPython
Please reload this pagehttps://github.com/gitpython-developers/GitPython/pull/1745/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/1745/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:ci-windowshttps://github.com/EliahKagan/GitPython/tree/ci-windows
Conversation 5 https://github.com/gitpython-developers/GitPython/pull/1745
Commits 29 https://github.com/gitpython-developers/GitPython/pull/1745/commits
Checks 0 https://github.com/gitpython-developers/GitPython/pull/1745/checks
Files changed https://github.com/gitpython-developers/GitPython/pull/1745/files
Please reload this pagehttps://github.com/gitpython-developers/GitPython/pull/1745/files
Test native Windows on CI https://github.com/gitpython-developers/GitPython/pull/1745/files#top
Show all changes 29 commits https://github.com/gitpython-developers/GitPython/pull/1745/files
2fd79f4 Add native Windows test jobs to CI matrix EliahKagan Oct 15, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/2fd79f41fe1304be7bcaebec84394ab9e45961c5
6e477e3 Add xfail marks for IndexFile.from_tree failures EliahKagan Nov 14, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/6e477e3a06e4b11d43ea118a9f18cae03fa211fd
cd9d7a9 Mark test_clone_command_injection xfail on Windows EliahKagan Nov 15, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/cd9d7a9d558273a1f82527890a1d69529a3ef1d5
f72e282 Mark test_diff_submodule xfail on Windows EliahKagan Nov 15, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/f72e2821a3073c4e87915fe7e721512e16e4fa74
42a3d74 Mark TestSubmodule.test_rename xfail on Windows EliahKagan Nov 15, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/42a3d74f529f34382b205c0ada46fb18df80c034
4abab92 Mark test_conditional_includes_from_git_dir xfail on Windows EliahKagan Nov 15, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/4abab92cb0f4caf569cc4bd9a8084994a80733ce
799c853 Improve ordering/grouping of a few imports EliahKagan Nov 16, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/799c8536800e75d7ddaef2b588754234db363245
b284ad7 Mark test_create_remote_unsafe_url_allowed xfail on Windows EliahKagan Nov 16, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/b284ad70291d24024b840fa659f54276cf9ceaa5
61d1fba Mark unsafe-options "allowed" tests xfail on Windows EliahKagan Nov 16, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/61d1fba6dd318e7f68b93b0e8b46050db0d03fa8
ad07ecb Show PATH on CI EliahKagan Nov 22, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/ad07ecb0151e64f3fa774099d8c69232df6bda23
2784e40 Show bash and other WSL-relevant info but not PATH EliahKagan Nov 22, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/2784e403d6fd812650f29f1842db1e67344170a3
9717b8d Install WSL system on CI for hook tests EliahKagan Nov 17, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/9717b8d847b514f761ecaa423226054c73f2a325
5d11394 Fix and expand bash.exe xfail marks on hook tests EliahKagan Nov 23, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/5d113942786b2cc86f5fd7bb228f9f75c8c78beb
b215357 Simplify/clarify bash.exe check for hook tests; do it only once EliahKagan Nov 24, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/b21535729ca695e47c52086abe390ca4e6792ae3
cabb572 Temporarily don't install WSL system to test xfail EliahKagan Nov 24, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/cabb5728e75aab3ed73376702e219bd1514ee615
2875ffa Put back WSL on Windows CI; pare down debug info EliahKagan Nov 24, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/2875ffa083b1e136cd647e6d087a4747aa85a4bc
0f8cd4c Treat XPASS status as a test failure EliahKagan Nov 24, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/0f8cd4ce4a7f942d793a8670257f8738ab18b757
82c361e Correct TestSubmodule.test_rename xfail condition EliahKagan Nov 24, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/82c361e7e1a20df96cc9e5c443b2c18fc20b18c9
0ae5dd1 Revert "Treat XPASS status as a test failure" EliahKagan Nov 24, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/0ae5dd19d5e7256b0876987948774b48e207f231
0b7ee17 Refine TestSubmodule.test_rename xfail condition EliahKagan Nov 25, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/0b7ee17849a48ca691eaa3cc5d3eb81a4e6592b7
8621e89 Reword comment in _WinBashStatus.check for clarity EliahKagan Nov 25, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/8621e892ed5ed05b1a304c9ea25a460f376677bb
7ff3cee Make _WinBashStatus instances carry all their info EliahKagan Nov 25, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/7ff3cee63c53520650db14bdf6e55551b8848567
d5ed266 Use bytes in bash.exe check; retest no-distro case EliahKagan Nov 25, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/d5ed266f2208367e4300c29fa4cbda9cd2db0fb9
496acaa Handle multiple encodings for WSL error messages EliahKagan Nov 26, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/496acaac5d2cfcbe4edf8ace1bfae452f281ff15
d779a75 Don't assume WSL-related bash.exe error is English EliahKagan Nov 27, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/d779a7546f4bf69783cf38be4679a0a229578ef9
9ac2438 Handle encodings better; make the sum type "public" EliahKagan Nov 27, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/9ac243884ebe2d614f03302104064ef22b2aee0f
b07e5c7 Put back WSL on Windows CI EliahKagan Nov 28, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/b07e5c7d997b49d980bf3d2d749839726663b274
3303c74 Improve readability of WinBashStatus class EliahKagan Nov 28, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/3303c740bd9aae3ec2fa6b0f1a750bba9ad2b60e
e00fffc Shorten comments on _decode steps EliahKagan Nov 28, 2023 https://github.com/gitpython-developers/GitPython/pull/1745/commits/e00fffc918da5cd6c3c749d1d2e59d8ae6835189
Clear filters https://github.com/gitpython-developers/GitPython/pull/1745/files
Please reload this pagehttps://github.com/gitpython-developers/GitPython/pull/1745/files
Please reload this pagehttps://github.com/gitpython-developers/GitPython/pull/1745/files
cygwin-test.yml https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-cf2326c301e0abbc3891bf5c0f476cf05faa2c2ddf165185fe6bffb10bd5aea5
pythonpackage.yml https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-ee68bef8369ed7bc5460a288e72d62152784762ef66851e07bf134c4075a08f0
test-requirements.txt https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-fac4c6890301d4de5c3f4266837803d5240c84a3d8b6c735bbc6a64c39d2f94e
test_config.py https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-45fa5f8530eb815c0cf606032e587adedb04dc70e59b203535d51c44654cfc4d
test_diff.py https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-a4c794e0849bb401148549f5efcaa756477ae6f7c2976d2ebf7cb56ff7850139
test_docs.py https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-e8640c3e0d2b1139c3e2ac635af5416e976b99fb1e2c5b4745830991dc492723
test_fun.py https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-5cb2634f8f8900d1066de2a2bcb417aa8acb26f269168a362b2d4e986a216763
test_index.py https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-21c27b991511d3d0e3a14b4dfb56017689de2fa114c3edf11c577bd1ce744b72
test_refs.py https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-0d8f1dff061a372fdf4946776e8277a271774b10c1684d1c28c1abd030340d0c
test_remote.py https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-8f71eea0871a97cc5c7757598e3ffaeacb8cd38f6f5f1742e21fd07364d3a698
test_repo.py https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-f50d635cf31b095a03b42fc1a73681a9c4025bbeb58b81e72588ba37e00cff87
test_submodule.py https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-78179a32c1d54a6b78b018ee57328d6ea9424fbfbdbb36caf15e290331621024
.github/workflows/cygwin-test.ymlhttps://github.com/gitpython-developers/GitPython/pull/1745/files#diff-cf2326c301e0abbc3891bf5c0f476cf05faa2c2ddf165185fe6bffb10bd5aea5
View file https://github.com/EliahKagan/GitPython/blob/e00fffc918da5cd6c3c749d1d2e59d8ae6835189/.github/workflows/cygwin-test.yml
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/gitpython-developers/GitPython/pull/1745/{{ revealButtonHref }}
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-cf2326c301e0abbc3891bf5c0f476cf05faa2c2ddf165185fe6bffb10bd5aea5
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-cf2326c301e0abbc3891bf5c0f476cf05faa2c2ddf165185fe6bffb10bd5aea5
.github/workflows/pythonpackage.ymlhttps://github.com/gitpython-developers/GitPython/pull/1745/files#diff-ee68bef8369ed7bc5460a288e72d62152784762ef66851e07bf134c4075a08f0
View file https://github.com/EliahKagan/GitPython/blob/e00fffc918da5cd6c3c749d1d2e59d8ae6835189/.github/workflows/pythonpackage.yml
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/gitpython-developers/GitPython/pull/1745/{{ revealButtonHref }}
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-ee68bef8369ed7bc5460a288e72d62152784762ef66851e07bf134c4075a08f0
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-ee68bef8369ed7bc5460a288e72d62152784762ef66851e07bf134c4075a08f0
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-ee68bef8369ed7bc5460a288e72d62152784762ef66851e07bf134c4075a08f0
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-ee68bef8369ed7bc5460a288e72d62152784762ef66851e07bf134c4075a08f0
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-ee68bef8369ed7bc5460a288e72d62152784762ef66851e07bf134c4075a08f0
test-requirements.txthttps://github.com/gitpython-developers/GitPython/pull/1745/files#diff-fac4c6890301d4de5c3f4266837803d5240c84a3d8b6c735bbc6a64c39d2f94e
View file https://github.com/EliahKagan/GitPython/blob/e00fffc918da5cd6c3c749d1d2e59d8ae6835189/test-requirements.txt
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/gitpython-developers/GitPython/pull/1745/{{ revealButtonHref }}
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-fac4c6890301d4de5c3f4266837803d5240c84a3d8b6c735bbc6a64c39d2f94e
test/test_config.pyhttps://github.com/gitpython-developers/GitPython/pull/1745/files#diff-45fa5f8530eb815c0cf606032e587adedb04dc70e59b203535d51c44654cfc4d
View file https://github.com/EliahKagan/GitPython/blob/e00fffc918da5cd6c3c749d1d2e59d8ae6835189/test/test_config.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/gitpython-developers/GitPython/pull/1745/{{ revealButtonHref }}
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-45fa5f8530eb815c0cf606032e587adedb04dc70e59b203535d51c44654cfc4d
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-45fa5f8530eb815c0cf606032e587adedb04dc70e59b203535d51c44654cfc4d
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-45fa5f8530eb815c0cf606032e587adedb04dc70e59b203535d51c44654cfc4d
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-45fa5f8530eb815c0cf606032e587adedb04dc70e59b203535d51c44654cfc4d
test/test_diff.pyhttps://github.com/gitpython-developers/GitPython/pull/1745/files#diff-a4c794e0849bb401148549f5efcaa756477ae6f7c2976d2ebf7cb56ff7850139
View file https://github.com/EliahKagan/GitPython/blob/e00fffc918da5cd6c3c749d1d2e59d8ae6835189/test/test_diff.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/gitpython-developers/GitPython/pull/1745/{{ revealButtonHref }}
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-a4c794e0849bb401148549f5efcaa756477ae6f7c2976d2ebf7cb56ff7850139
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-a4c794e0849bb401148549f5efcaa756477ae6f7c2976d2ebf7cb56ff7850139
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-a4c794e0849bb401148549f5efcaa756477ae6f7c2976d2ebf7cb56ff7850139
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-a4c794e0849bb401148549f5efcaa756477ae6f7c2976d2ebf7cb56ff7850139
test/test_docs.pyhttps://github.com/gitpython-developers/GitPython/pull/1745/files#diff-e8640c3e0d2b1139c3e2ac635af5416e976b99fb1e2c5b4745830991dc492723
View file https://github.com/EliahKagan/GitPython/blob/e00fffc918da5cd6c3c749d1d2e59d8ae6835189/test/test_docs.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/gitpython-developers/GitPython/pull/1745/{{ revealButtonHref }}
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-e8640c3e0d2b1139c3e2ac635af5416e976b99fb1e2c5b4745830991dc492723
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-e8640c3e0d2b1139c3e2ac635af5416e976b99fb1e2c5b4745830991dc492723
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-e8640c3e0d2b1139c3e2ac635af5416e976b99fb1e2c5b4745830991dc492723
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-e8640c3e0d2b1139c3e2ac635af5416e976b99fb1e2c5b4745830991dc492723
test/test_fun.pyhttps://github.com/gitpython-developers/GitPython/pull/1745/files#diff-5cb2634f8f8900d1066de2a2bcb417aa8acb26f269168a362b2d4e986a216763
View file https://github.com/EliahKagan/GitPython/blob/e00fffc918da5cd6c3c749d1d2e59d8ae6835189/test/test_fun.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/gitpython-developers/GitPython/pull/1745/{{ revealButtonHref }}
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-5cb2634f8f8900d1066de2a2bcb417aa8acb26f269168a362b2d4e986a216763
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-5cb2634f8f8900d1066de2a2bcb417aa8acb26f269168a362b2d4e986a216763
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-5cb2634f8f8900d1066de2a2bcb417aa8acb26f269168a362b2d4e986a216763
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-5cb2634f8f8900d1066de2a2bcb417aa8acb26f269168a362b2d4e986a216763
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-5cb2634f8f8900d1066de2a2bcb417aa8acb26f269168a362b2d4e986a216763
https://github.com/gitpython-developers/GitPython/pull/1745/files#diff-5cb2634f8f8900d1066de2a2bcb417aa8acb26f269168a362b2d4e986a216763
Please reload this pagehttps://github.com/gitpython-developers/GitPython/pull/1745/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.