GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — gh-132983: Add `compression.zstd` and Python tests by emmatyping · Pull Request #133365 · python/cpython

Conversation

@emmatyping

@emmatyping emmatyping commented May 4, 2025 •
edited by bedevere-app Bot
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

The next step to merging the PEP 784 implementation, this PR introduces compression.zstd and tests for the code (which I have been using to test the C code so far).

Since test can be modified post-beta1, I'd like to focus on reviewing the API and Python implementation code. Obviously if there are important tests to add or change, that review would be valuable as well.

  • Issue: Implement PEP 784 - Adding Zstandard to the Python standard library #132983

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@emmatyping emmatyping added the skip news label May 4, 2025
@emmatyping
emmatyping requested a review from gpshead May 4, 2025 02:18
@emmatyping
emmatyping marked this pull request as ready for review May 4, 2025 02:18
@emmatyping
emmatyping requested review from erlend-aasland and ethanfurman as code owners May 4, 2025 02:18
@bedevere-app bedevere-app Bot mentioned this pull request May 4, 2025
Implement PEP 784 - Adding Zstandard to the Python standard library #132983
Closed
13 tasks done
@bedevere-app bedevere-app Bot added the awaiting review label May 4, 2025
@emmatyping

emmatyping commented May 4, 2025

Copy link
Copy Markdown
Member Author

Also as requested, pinging @Rogdham to review the Python code.

Rogdham reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@emmatyping emmatyping mentioned this pull request May 4, 2025
gh-132983: Introduce _zstd bindings module #133027
Merged
4 tasks done
AA-Turner
AA-Turner requested changes May 4, 2025
View reviewed changes

@AA-Turner AA-Turner left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review of Lib/compression/zstd/__init__.py

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

@bedevere-app bedevere-app Bot added awaiting changes and removed awaiting review labels May 4, 2025
@bedevere-app

bedevere-app Bot commented May 4, 2025

Copy link
Copy Markdown

A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated.

Once you have made the requested changes, please leave a comment on this pull request containing the phrase I have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Rogdham
Rogdham reviewed May 4, 2025
View reviewed changes

@Rogdham Rogdham left a comment

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This review is focused on changes from pyzstd.

My main issue is decompress(compress(b"xxx") + b"yyy") not raising an exception.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/tarfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/tarfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_zstd/test_core.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_zstd/test_core.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_zstd/test_core.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_zstd/test_core.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Rogdham
Rogdham reviewed May 4, 2025
View reviewed changes

@Rogdham Rogdham left a comment •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These extra comments are due to options being passed as positional arguments, but they are passed to level parameter instead of options.

I hope I did not miss any 😅

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread Lib/test/test_zstd/test_core.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_zstd/test_core.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_zstd/test_core.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_zstd/test_core.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_zstd/test_core.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_zstd/test_core.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_zstd/test_core.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

@emmatyping

emmatyping commented May 4, 2025

Copy link
Copy Markdown
Member Author

I am working on addressing some of the issues which will include the test failures

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

AA-Turner
AA-Turner reviewed May 4, 2025
View reviewed changes
Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

tomasr8
tomasr8 reviewed May 4, 2025
View reviewed changes

@tomasr8 tomasr8 left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some nits, nothing major

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread Lib/compression/zstd/zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/tarfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/tarfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/tarfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

gpshead
gpshead reviewed May 4, 2025
View reviewed changes
Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

tomasr8
tomasr8 reviewed May 4, 2025
View reviewed changes
Comment thread Lib/test/test_zstd/test_core.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_zstd/test_core.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_zstd/test_core.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_zstd/test_core.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

gpshead
gpshead reviewed May 4, 2025
View reviewed changes
Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/tarfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

AA-Turner
AA-Turner reviewed May 4, 2025
View reviewed changes
Comment thread Lib/test/test_zstd/test_core.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

AA-Turner
AA-Turner reviewed May 4, 2025
View reviewed changes

ghost left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comments on Lib/compression/zstd/_zstdfile.py

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread Lib/compression/zstd/_zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/_zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/_zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/_zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/_zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/_zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/_zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/_zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/_zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/compression/zstd/_zstdfile.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

AA-Turner
AA-Turner reviewed May 4, 2025
View reviewed changes
Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

AA-Turner
AA-Turner reviewed May 5, 2025
View reviewed changes
Comment thread Lib/compression/zstd/__init__.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Emma Harper Smith and others added 5 commits May 5, 2025 15:59
Emma Harper Smith
Add Python files
f4cd026
Emma Harper Smith
Fix byteswarning in test
4168895
Emma Harper Smith
Remove shape tests
a22fa9b
Emma Harper Smith
Make namedtuples dataclasses
e70e03b
Emma Smith Adam Turner
Apply suggestions from AA-Turner
cbf0ef8
Co-authored-by: Adam Turner <[email protected]>
@bedevere-app

ghost commented May 5, 2025

Copy link
Copy Markdown

Thanks for making the requested changes!

@AA-Turner: please review the changes made to this pull request.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bedevere-app
bedevere-app Bot requested a review from AA-Turner May 5, 2025 23:50
@emmatyping

ghost commented May 5, 2025 •
edited by emmatyping
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member Author

FWIW I believe I responded to all reviews, so I will add the buildbots to test this.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@emmatyping emmatyping added the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label May 5, 2025
@bedevere-bot

ghost commented May 5, 2025

Copy link
Copy Markdown

🤖 New build scheduled with the buildbot fleet by @emmatyping for commit a12a031 🤖

Results will be shown at:

https://buildbot.python.org/all/#/grid?branch=refs%2Fpull%2F133365%2Fmerge

If you want to schedule another build, you need to add the 🔨 test-with-buildbots label again.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bedevere-bot bedevere-bot removed the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label May 5, 2025
Adam Turner added 7 commits May 6, 2025 00:53
Adam Turner
Sort imports
bf94aad
Adam Turner
Improve docstrings
5b45ec7
Adam Turner
Remove comments
b0eca5a
Adam Turner
Remove unused private variables
c0d0e10
Adam Turner
Misc changes (positional-only, style, error messages)
10f0cff
Adam Turner
whitespace
7f8c350
Adam Turner
Remove _set_parameter_types
bf4b07d
Python, in general, works on protocols rather than nominal or specific types. I think this check is overly restrictive, with only minor benefit. Users wanting validation can use static type checkers.
@AA-Turner

ghost commented May 5, 2025

Copy link
Copy Markdown
Member

I've pushed a series of commits. Most are explanatory and fairly minor (docstring wording, etc). The one of most note is removing the exact type checks on {C,Dec}ompressionParamater. I think it is overly restrictivie to check the exact type of the enum, and I can't think of a similar example where we do this. Users who want the validation of not conflating compression and decompression can use a staic type checker.

I've pushed this for speed, given time, but if you feel strongly I'm happy for you to revert.

A

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@emmatyping

ghost commented May 6, 2025

Copy link
Copy Markdown
Member Author

@AA-Turner The commits look fine other than the last one. It is very important to check the type of a CompressionParameter vs DecompressionParameter because the C enum variants have overlapping values (compression_level == window_log_max)

You can see in the tests this could lead to confusing errors:

Traceback (most recent call last):
  File "/home/runner/work/cpython/cpython-ro-srcdir/Lib/test/test_zstd.py", line 1424, in test_init_bad_mode
    ZstdFile(io.BytesIO(), 'rb',
    ~~~~~~~~^^^^^^^^^^^^^^^^^^^^
             options={CompressionParameter.compression_level:5})
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/cpython/cpython-ro-srcdir/Lib/compression/zstd/_zstdfile.py", line 91, in __init__
    raw = _streams.DecompressReader(
        self._fp,
    ...<3 lines>...
        options=options,
    )
  File "/home/runner/work/cpython/cpython-ro-srcdir/Lib/compression/_common/_streams.py", line 53, in __init__
    self._decompressor = self._decomp_factory(**self._decomp_args)
                         ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
_zstd.ZstdError: Error when setting zstd decompression parameter "window_log_max", it should 10 <= value <= 31, provided value is 5. (zstd v1.5.5, 64-bit build)

I think I will revert the last commit but keep the others.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Emma Harper Smith
Revert "Remove _set_parameter_types"
eaf46a8
This reverts commit bf4b07d.

Checking the type of parameters is important to avoid confusing error
messages.
@AA-Turner

ghost commented May 6, 2025

Copy link
Copy Markdown
Member

It is very important to check the type of a CompressionParameter vs DecompressionParameter because the C enum variants have overlapping values

Yes, but I think the risk of this actually hitting users is low? For example, the examplar test failure you provided is very clear: CompressionParameter.compression_level is provided as a key, and the error message says 'Error when setting zstd decompression parameter "window_log_max"' (emph. added). typeshed could annotate the options dict as Mapping[CompressionParameter, int] which would solve the problem for users of static type checkers. Users who pass nonsense or invalid values will always get undefined behaviour or an error. I think it's better to apply the consenting adults principle here that we see elsewhere in the language. For example, the current code doesn't let me pass an int as the key directly.

I think it's fine to keep for now as we can discuss further and change this during the betas -- this particular item isn't impacted by feature freeze as it's entirely private.

A

emmatyping reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@emmatyping

ghost commented May 6, 2025

Copy link
Copy Markdown
Member Author

For example, the examplar test failure you provided is very clear: CompressionParameter.compression_level is provided as a key, and the error message says 'Error when setting zstd decompression parameter "window_log_max"' (emph. added).

I think we view the clarify of the error differently! To me I would expect users to not understand why they are getting an error about a decompression parameter when passing a compression parameter. I think perhaps a compromise would be to check the type if it is a (De)CompressionParameter, but otherwise just allow ints without checking. If you're passing an int, you're on your own!

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@emmatyping

ghost commented May 6, 2025 •
edited by emmatyping
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member Author

@AA-Turner

For example, the current code doesn't let me pass an int as the key directly.

After writing this:

I think perhaps a compromise would be to check the type if it is a (De)CompressionParameter, but otherwise just allow ints without checking. If you're passing an int, you're on your own!

I just checked and we only check if it is CompressionParameter for decompression, or DecompressionParameter for compression. So the compromise is actually the current behavior. So you can pass an int if you'd like:

>>> from compression.zstd import *
>>> compress(b'testtesttest', options={100:5})
b'(\xb5/\xfd \x0ca\x00\x00testtesttest'
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

AA-Turner
AA-Turner approved these changes May 6, 2025
View reviewed changes

ghost left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is mergeable, we can tweak the few remaining items (eg. tarfile, parameter type checks, perhaps tests) after 3.14 beta 1.

Thanks everyone, and especially thank you @Rogdham for the valuable feedback & context from pyzstd.

A

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

emmatyping, hugovk, and Rogdham reacted with hooray emoji Rogdham reacted with heart emoji
All reactions
  • 🎉 3 reactions
  • ❤️ 1 reaction
@bedevere-app bedevere-app Bot added awaiting merge and removed awaiting change review labels May 6, 2025
@AA-Turner
AA-Turner merged commit c273f59 into python:main May 6, 2025
@bedevere-app bedevere-app Bot removed the awaiting merge label May 6, 2025
@emmatyping
emmatyping deleted the 3.14-zstd-python-code branch May 6, 2025 00:38
@emmatyping

ghost commented May 6, 2025 •
edited by emmatyping
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member Author

Thanks everyone, and especially thank you @Rogdham for the valuable feedback & context from pyzstd.

Hear, hear! And thank you @AA-Turner for your suggestions and contributions! Thank you to all of the reviewers!

hugovk, chris-eibl, and Rogdham reacted with hooray emoji
All reactions
  • 🎉 3 reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@pR0Ps pR0Ps mentioned this pull request May 9, 2025
gh-132983: Fix small issues with zstd support in zipfile #133723
Merged
merwok
merwok reviewed May 13, 2025
View reviewed changes
Comment thread Lib/tarfile.py
"bz2": "bz2open", # bzip2 compressed tar
"xz": "xzopen" # lzma compressed tar
"xz": "xzopen", # lzma compressed tar
"zst": "zstopen" # zstd compressed tar

ghost May 13, 2025

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Trailing comma would have been nice here 🙂
(noting this in case someone does another cleanup PR, but not to request one just for this)

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

AA-Turner reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

ghost May 13, 2025

Copy link
Copy Markdown
Member Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

will add this to #133547, thanks!

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@jameslamb jameslamb mentioned this pull request Oct 15, 2025
[feature request] use compression.zstd for zstd-compressed packages jameslamb/pydistcheck#331
Closed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@gpshead gpshead gpshead left review comments
@merwok merwok merwok left review comments
@tomasr8 tomasr8 tomasr8 left review comments
@AA-Turner AA-Turner AA-Turner approved these changes
@ethanfurman ethanfurman Awaiting requested review from ethanfurman ethanfurman is a code owner
@erlend-aasland erlend-aasland Awaiting requested review from erlend-aasland erlend-aasland is a code owner
+1 more reviewer
@Rogdham Rogdham Rogdham left review comments
Reviewers whose approvals may not affect merge requirements

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

skip news

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

7 participants

@emmatyping @AA-Turner @bedevere-bot @gpshead @merwok @Rogdham @tomasr8
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.