-
-
Notifications
You must be signed in to change notification settings - Fork 954
Test project on Windows with MINGW git (conda2.7&3.4/cpy-3.5) #519
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@ankostis Totally awesome ! Even though I won't be of much help, I do hope that fixing the windows issues work out in the end. That would restore windows platform support and keep it, after all these years of supporting it just on a best-effort basis, which meant not to obviously use non-windows APIs.
1774f98
to
d773d40
Compare
+ Del extra spaces, import os.path as osp
d773d40
to
8fe4fee
Compare
Yes, that's a start.
I wish that today this PR become "ready", but currently, it keeps on failing,
and adding gc.collect()
in various places...
5899c59
to
d12fdca
Compare
@Byron the git.testtest_git:TestGit.test_handle_process_output()
TC hangs almost on every combination under Windows.
Can you help unstuck it?
+ Pump once, so when input larger than `mmap.PAGESIZE`, stream is not emptied.
64fc749
to
4b1249e
Compare
+ Pump once, so when input larger than `mmap.PAGESIZE`, stream is not emptied.
4b1249e
to
040f549
Compare
+ Pump once, so when input larger than `mmap.PAGESIZE`, stream is not emptied.
040f549
to
022ce82
Compare
+ Pump code reads only once streams per `_read_lines_from_fno()` invocation, so when input larger than `mmap.PAGESIZE`, bytes are forgotten in the stream.
022ce82
to
148959c
Compare
+ The code in `_read_lines_from_fno()` was reading the stream only once per invocation, so when input was larger than `mmap.PAGESIZE`, bytes were forgotten in the stream. + Also set deamon-threads.
148959c
to
747a0ff
Compare
+ The code in `_read_lines_from_fno()` was reading the stream only once per invocation, so when input was larger than `mmap.PAGESIZE`, bytes were forgotten in the stream. + Replaced buffer-banging code with iterate-on-file-descriptors. + Also set deamon-threads.
747a0ff
to
b3aaf7b
Compare
+ The code in `_read_lines_from_fno()` was reading the stream only once per invocation, so when input was larger than `mmap.PAGESIZE`, bytes were forgotten in the stream. + Replaced buffer-building code with iterate-on-file-descriptors. + Also set deamon-threads.
@Byron that was a tough one!
The pump code in cmd:handle_process_output()
was crafted for the select/poll and was reading the stream only once per _read_lines_from_fno()
invocation; so when input was larger than mmap.PAGESIZE
, bytes were forgotten in the stream, and the child-process hang.
I replaced the buffer-assembly code with iterate-on-file-descriptors. Actually the code is so simple that it maybe worth to replace the select-poll with the 2-pumps code, for all OSs?
Many (削除) more (削除ここまで) bugs remain in Windows, but no hangs.
[edit]Actually with this bug fixed, the failed TCs on Windows dropped from ~90-->20!!
A side question:
In cmd.handle_process_output()
you write:
NOTE: Just joining threads can possibly fail as there is a gap between .start() and when it's
actually started, which could make the wait() call to just return because the thread is not yet
active
Is that possible? I would expect any language allowing such "gap" to be considered outright broken.
But I couldnt google anything relevant?
...`assertRaisesRegexp`
7810405
to
c785a03
Compare
...`assertRaisesRegexp`
c785a03
to
de320f3
Compare
Just pushed one last commit with those 3 TCs appropriately skipped.
-- ALL GREEN now --
Especially the one with the incompatible type appears like something that is relatively easy reproduce and fix via smmap.
Actually quite the contrary: I can only reproduce it when i run the full harness; if i launch these 2 TCs alone, they pass! So practically, I cannot enter debug-mode - I have to wait 2' just to reach this point.
PS: You have been invited to become a contributor/maintainer.
Have not received an invitation yet.
This is odd:
screen shot 2016年10月01日 at 20 54 24
I have just re-invited you, maybe it comes through. Otherwise you would just have to visit https://github.com/gitpython-developers to see the invitation.
Your last commit was not part of my merge, I will fetch it separately.
@ankostis I think it worked ! The last commit has been cherry-picked and AppVeyor is on its way to all-green ! Even though it's not the real thing just yet, I call it an impressive piece of work! Thanks so much !
Right now I wouldn't know how to tackle the smmap issue, just as it's hard to fix anything in a project that is installed as a dependency. Probably it would be easiest if it would be reproducible locally, which I can't even do.
Just so you know, I will probably go to read-only mode for the next days due to my travels, but should be back with replies by the coming weekend.
@Byron many of the fixes in this PR can be applied also on gitdb, and as you said (haven't checked) on smmp. Is there a chance to tackle these issues in these projects? Or are they "frozen" somehow?
I mean, a lot of problems just go away if resource classes are retrofitted as with ....
context resources - but this means API forward compatibility is broken for future clients (existing code should work with the modified libs though).
What do you think, is it worth the effort (but cna't promise anything)?
For reference, reporting the CORRECT Appveyor results after #521 fixes by yarikoptic & ankostis restored skipped TCs:
PY27: 5 errors:
PY34: 4 errors:
PY35: 7 errors:
conda35: 7 errors:
...preferredencoding()` + On Windows, this is the default encoding (usually, the mate-encoding `mcbs' which points to the current code-page (i.e. `cp1252` for Europe).
@ankostis With the latest upgrade of gitdb and smmap to 2.0, it's finally possible again to make new releases. This would allow the changes you talk about to be retro-fitted indeed, and given all the subtle problems GitPython has, it would certainly be worth doing that.
In the git.diff.Diff class, the _index_from_patch_format and _index_from_raw_format methods' docstrings had still described them as reading from streams, even though they have instead read from processes (and taken "proc", not "stream", arguments) since gitpython-developers#519 when the change was made in a5db3d3 to fix a freezing bug. This updates the docstrings to reflect that they read from processes.
In the git.diff.Diff class, the _index_from_patch_format and _index_from_raw_format methods' docstrings had still described them as reading from streams, even though they have instead read from processes (and taken "proc", not "stream", arguments) since gitpython-developers#519 when the change was made in a5db3d3 to fix a freezing bug. This updates the docstrings to reflect that they read from processes.
In the git.diff.Diff class, the _index_from_patch_format and _index_from_raw_format methods' docstrings had still described them as reading from streams, even though they have instead read from processes (and taken "proc", not "stream", arguments) since gitpython-developers#519 when the change was made in a5db3d3 to fix a freezing bug. This updates the docstrings to reflect that they read from processes.
In the git.diff.Diff class, the _index_from_patch_format and _index_from_raw_format methods' docstrings had still described them as reading from streams, even though they have instead read from processes (and taken "proc", not "stream", arguments) since gitpython-developers#519 when the change was made in a5db3d3 to fix a freezing bug. This updates the docstrings to reflect that they read from processes.
Uh oh!
There was an error while loading. Please reload this page.
poll/select
buffer-assembly code with pump-threads (Win TCs faling 90-->20!) and rework unicode handling in many places.Popen()
procs it withsubprocess.CREATE_NEW_PROCESS_GROUP
so that they can be killed.git-daemon
(instead ofgit daemon
); otherwise it detaches (unix-ism here) from parent git cmd, and then CANNOT DIE!Popen().proc.stdout/stderr
from the launching-thread, it freezes due to GIL/buffering.+Rework GitCommandError.str() and add TCs on unicode handling.
with GitConfigarser()
more systematically in TCs..git
file prior overwrite; Windows denied otherwise!git add <file>
case, PY2 fails when args are unicode.Must encode them with
locale.getpreferredencoding()
AND use SHELL.shell
intoexecute()
kwds, for overriding USE_SHELL percommand.
communicate()
in_clone()
with thread-pumps (UNNECESSARY, see this later discussion).with...
construct (not complete).Popen()
calls, to collect cmd usage.Apveyor results